From b1a375fb0642cbc161a8da3a85c76c04d83fb4d1 Mon Sep 17 00:00:00 2001 From: Charlie Svitlik Date: Sun, 21 Jan 2024 02:35:35 -0500 Subject: [PATCH] Initial commit of cl-deck-builder2. --- .gitignore | 11 + Dockerfile | 61 + Makefile | 134 + README.md | 172 ++ app.lisp | 76 + cl-deck-builder2-test.asd | 11 + cl-deck-builder2.asd | 250 ++ cl-deck-builder2.service | 15 + cl-deck-builder2.workers.asd | 68 + contrib.sh | 123 + db/file.csv | 393 +++ db/schema.sql | 421 +++ doc/about.md | 315 ++ doc/flowcharts/card-doc.dot | 40 + doc/flowcharts/card-doc.png | Bin 0 -> 68508 bytes doc/flowcharts/cluster.dot | 32 + doc/flowcharts/constructed-deck-doc.dot | 71 + doc/flowcharts/constructed-deck-doc.png | Bin 0 -> 119301 bytes doc/label-maker.md | 6 + doc/release-checklist.org | 8 + doc/routes.org | 190 ++ doc/store/LabelMaker.csv | 33 + doc/store/S-20247.pdf | 227 ++ doc/store/S-20247.tpl.tex | 43 + doc/store/avery-5160.tex | 59 + doc/todo.md | 69 + doc/web/nginx/deck-builder | 27 + doc/web/nginx/deck-builder-tls | 122 + doc/web/nginx/default | 91 + doc/wiki.org | 55 + doc/workflow.md | 50 + doc/ygoprodeck-import.md | 149 + locale/en_US/LC_MESSAGES/cl-deck-builder2.mo | Bin 0 -> 1590 bytes locale/en_US/LC_MESSAGES/cl-deck-builder2.po | 242 ++ locale/templates/LC_MESSAGES/.gitignore | 0 locale/templates/LC_MESSAGES/cl-deck-builder2.pot | 241 ++ locale/templates/LC_MESSAGES/djula.pot | 105 + locale/templates/LC_MESSAGES/lisp.pot | 135 + old/api/api-v0.lisp | 3 + old/api/api-v1.lisp | 14 + old/api/package.lisp | 6 + old/hermetic.lisp | 43 + old/lack-middleware-secure.lisp | 168 + old/readme.md | 1 + old/web-route-test.lisp | 34 + old/ygoprodeck-json.lisp | 137 + preamble.lisp | 17 + print-deps.lisp | 24 + ruby/config.ru | 21 + src/.gitignore | 1 + src/config.lisp | 121 + src/db.lisp | 295 ++ src/documentation.lisp | 40 + src/draw.lisp | 277 ++ src/i18n.lisp | 146 + src/main.lisp | 112 + src/models/attachment.lisp | 46 + src/models/category-2.lisp | 198 ++ src/models/category.lisp | 877 ++++++ src/models/constructed-decks.lisp | 335 ++ src/models/crystal-commerce-csv.lisp | 208 ++ src/models/crystal-commerce.lisp | 235 ++ src/models/feedback.lisp | 27 + src/models/generics.lisp | 40 + src/models/label-maker.lisp | 136 + src/models/mtg.lisp | 65 + src/models/packages.lisp | 502 +++ src/models/qr-code.lisp | 100 + src/models/registered-table-mixin.lisp | 99 + src/models/search.lisp | 76 + src/models/sqlite-schema.lisp | 40 + src/models/user.lisp | 127 + src/models/ydk.lisp | 591 ++++ src/models/ygoprodeck-cardinfo.lisp | 158 + src/models/ygoprodeck-classes.lisp | 472 +++ src/models/ygoprodeck-fields.lisp | 62 + src/models/ygoprodeck-json.lisp | 477 +++ src/models/ygoprodeck-methods.lisp | 258 ++ src/models/ygoprodeck.lisp | 38 + src/toolkit/git.lisp | 70 + src/toolkit/money.lisp | 62 + src/toolkit/packages.lisp | 62 + src/toolkit/paths.lisp | 149 + src/toolkit/time.lisp | 89 + src/toolkit/utils.lisp | 141 + src/view.lisp | 75 + src/web/builder.lisp | 351 +++ src/web/cards.lisp | 92 + src/web/category.lisp | 138 + src/web/constructed-decks.lisp | 239 ++ src/web/contact.lisp | 76 + src/web/decks.lisp | 376 +++ src/web/exception.lisp | 15 + src/web/flash-message.lisp | 49 + src/web/index.lisp | 81 + src/web/inventory.lisp | 244 ++ src/web/label-maker.lisp | 171 ++ src/web/packages.lisp | 64 + src/web/params.lisp | 146 + src/web/qr.lisp | 41 + src/web/query.lisp | 156 + src/web/search.lisp | 138 + src/web/setup.lisp | 35 + src/web/sse.lisp | 88 + src/web/test.lisp | 56 + src/web/tinymce.lisp | 61 + src/web/toolkit.lisp | 78 + src/web/upload.lisp | 107 + src/web/user.lisp | 184 ++ src/web/widget.lisp | 71 + src/web/ydk.lisp | 101 + src/workers/main.lisp | 13 + static/css/site.css | 133 + static/css/w3.css | 235 ++ static/favicon.png | Bin 0 -> 12319 bytes static/img/attribute/Continuous.svg | 376 +++ static/img/attribute/Counter.svg | 366 +++ static/img/attribute/DARK.svg | 451 +++ static/img/attribute/DIVINE.svg | 378 +++ static/img/attribute/EARTH.svg | 607 ++++ static/img/attribute/Equip.svg | 455 +++ static/img/attribute/FIRE.svg | 418 +++ static/img/attribute/Field.svg | 456 +++ static/img/attribute/LIGHT.svg | 387 +++ static/img/attribute/Normal-N.svg | 353 +++ static/img/attribute/Normal.svg | 348 +++ static/img/attribute/Quick-Play.svg | 454 +++ static/img/attribute/Ritual.svg | 360 +++ static/img/attribute/SPELL.svg | 785 +++++ static/img/attribute/TRAP.svg | 701 +++++ static/img/attribute/WATER.svg | 816 +++++ static/img/attribute/WIND.svg | 280 ++ static/img/file-icons-classic/3g2.svg | 1 + static/img/file-icons-classic/3ga.svg | 1 + static/img/file-icons-classic/3gp.svg | 1 + static/img/file-icons-classic/7z.svg | 1 + static/img/file-icons-classic/aa.svg | 1 + static/img/file-icons-classic/aac.svg | 1 + static/img/file-icons-classic/ac.svg | 1 + static/img/file-icons-classic/accdb.svg | 1 + static/img/file-icons-classic/accdt.svg | 1 + static/img/file-icons-classic/ace.svg | 1 + static/img/file-icons-classic/adn.svg | 1 + static/img/file-icons-classic/ai.svg | 1 + static/img/file-icons-classic/aif.svg | 1 + static/img/file-icons-classic/aifc.svg | 1 + static/img/file-icons-classic/aiff.svg | 1 + static/img/file-icons-classic/ait.svg | 1 + static/img/file-icons-classic/amr.svg | 1 + static/img/file-icons-classic/ani.svg | 1 + static/img/file-icons-classic/apk.svg | 1 + static/img/file-icons-classic/app.svg | 1 + static/img/file-icons-classic/applescript.svg | 1 + static/img/file-icons-classic/asax.svg | 1 + static/img/file-icons-classic/asc.svg | 1 + static/img/file-icons-classic/ascx.svg | 1 + static/img/file-icons-classic/asf.svg | 1 + static/img/file-icons-classic/ash.svg | 1 + static/img/file-icons-classic/ashx.svg | 1 + static/img/file-icons-classic/asm.svg | 1 + static/img/file-icons-classic/asmx.svg | 1 + static/img/file-icons-classic/asp.svg | 1 + static/img/file-icons-classic/aspx.svg | 1 + static/img/file-icons-classic/asx.svg | 1 + static/img/file-icons-classic/au.svg | 1 + static/img/file-icons-classic/aup.svg | 1 + static/img/file-icons-classic/avi.svg | 1 + static/img/file-icons-classic/axd.svg | 1 + static/img/file-icons-classic/aze.svg | 1 + static/img/file-icons-classic/bak.svg | 1 + static/img/file-icons-classic/bash.svg | 1 + static/img/file-icons-classic/bat.svg | 1 + static/img/file-icons-classic/bin.svg | 1 + static/img/file-icons-classic/blank.svg | 1 + static/img/file-icons-classic/bmp.svg | 1 + static/img/file-icons-classic/bowerrc.svg | 1 + static/img/file-icons-classic/bpg.svg | 1 + static/img/file-icons-classic/browser.svg | 1 + static/img/file-icons-classic/bz2.svg | 1 + static/img/file-icons-classic/bzempty.svg | 1 + static/img/file-icons-classic/c.svg | 1 + static/img/file-icons-classic/cab.svg | 1 + static/img/file-icons-classic/cad.svg | 1 + static/img/file-icons-classic/caf.svg | 1 + static/img/file-icons-classic/cal.svg | 1 + static/img/file-icons-classic/catalog.json | 1 + static/img/file-icons-classic/cd.svg | 1 + static/img/file-icons-classic/cdda.svg | 1 + static/img/file-icons-classic/cer.svg | 1 + static/img/file-icons-classic/cfg.svg | 1 + static/img/file-icons-classic/cfm.svg | 1 + static/img/file-icons-classic/cfml.svg | 1 + static/img/file-icons-classic/cgi.svg | 1 + static/img/file-icons-classic/chm.svg | 1 + static/img/file-icons-classic/class.svg | 1 + static/img/file-icons-classic/cmd.svg | 1 + static/img/file-icons-classic/code-workspace.svg | 1 + static/img/file-icons-classic/codekit.svg | 1 + static/img/file-icons-classic/coffee.svg | 1 + static/img/file-icons-classic/coffeelintignore.svg | 1 + static/img/file-icons-classic/com.svg | 1 + static/img/file-icons-classic/compile.svg | 1 + static/img/file-icons-classic/conf.svg | 1 + static/img/file-icons-classic/config.svg | 1 + static/img/file-icons-classic/cpp.svg | 1 + static/img/file-icons-classic/cptx.svg | 1 + static/img/file-icons-classic/cr2.svg | 1 + static/img/file-icons-classic/crdownload.svg | 1 + static/img/file-icons-classic/crt.svg | 1 + static/img/file-icons-classic/crypt.svg | 1 + static/img/file-icons-classic/cs.svg | 1 + static/img/file-icons-classic/csh.svg | 1 + static/img/file-icons-classic/cson.svg | 1 + static/img/file-icons-classic/csproj.svg | 1 + static/img/file-icons-classic/css.svg | 1 + static/img/file-icons-classic/csv.svg | 1 + static/img/file-icons-classic/cue.svg | 1 + static/img/file-icons-classic/cur.svg | 1 + static/img/file-icons-classic/dart.svg | 1 + static/img/file-icons-classic/dat.svg | 1 + static/img/file-icons-classic/data.svg | 1 + static/img/file-icons-classic/db.svg | 1 + static/img/file-icons-classic/dbf.svg | 1 + static/img/file-icons-classic/deb.svg | 1 + static/img/file-icons-classic/default.svg | 1 + static/img/file-icons-classic/dgn.svg | 1 + static/img/file-icons-classic/dist.svg | 1 + static/img/file-icons-classic/diz.svg | 1 + static/img/file-icons-classic/dll.svg | 1 + static/img/file-icons-classic/dmg.svg | 1 + static/img/file-icons-classic/dng.svg | 1 + static/img/file-icons-classic/doc.svg | 1 + static/img/file-icons-classic/docb.svg | 1 + static/img/file-icons-classic/docm.svg | 1 + static/img/file-icons-classic/docx.svg | 1 + static/img/file-icons-classic/dot.svg | 1 + static/img/file-icons-classic/dotm.svg | 1 + static/img/file-icons-classic/dotx.svg | 1 + static/img/file-icons-classic/download.svg | 1 + static/img/file-icons-classic/dpj.svg | 1 + static/img/file-icons-classic/ds_store.svg | 1 + static/img/file-icons-classic/dsn.svg | 1 + static/img/file-icons-classic/dtd.svg | 1 + static/img/file-icons-classic/dwg.svg | 1 + static/img/file-icons-classic/dxf.svg | 1 + static/img/file-icons-classic/editorconfig.svg | 1 + static/img/file-icons-classic/el.svg | 1 + static/img/file-icons-classic/elf.svg | 1 + static/img/file-icons-classic/eml.svg | 1 + static/img/file-icons-classic/enc.svg | 1 + static/img/file-icons-classic/eot.svg | 1 + static/img/file-icons-classic/eps.svg | 1 + static/img/file-icons-classic/epub.svg | 1 + static/img/file-icons-classic/eslintignore.svg | 1 + static/img/file-icons-classic/exe.svg | 1 + static/img/file-icons-classic/f4v.svg | 1 + static/img/file-icons-classic/fax.svg | 1 + static/img/file-icons-classic/fb2.svg | 1 + static/img/file-icons-classic/fla.svg | 1 + static/img/file-icons-classic/flac.svg | 1 + static/img/file-icons-classic/flv.svg | 1 + static/img/file-icons-classic/fnt.svg | 1 + static/img/file-icons-classic/folder.svg | 1 + static/img/file-icons-classic/fon.svg | 1 + static/img/file-icons-classic/gadget.svg | 1 + static/img/file-icons-classic/gdp.svg | 1 + static/img/file-icons-classic/gem.svg | 1 + static/img/file-icons-classic/gif.svg | 1 + static/img/file-icons-classic/gitattributes.svg | 1 + static/img/file-icons-classic/gitignore.svg | 1 + static/img/file-icons-classic/go.svg | 1 + static/img/file-icons-classic/gpg.svg | 1 + static/img/file-icons-classic/gpl.svg | 1 + static/img/file-icons-classic/gradle.svg | 1 + static/img/file-icons-classic/gz.svg | 1 + static/img/file-icons-classic/h.svg | 1 + static/img/file-icons-classic/handlebars.svg | 1 + static/img/file-icons-classic/hbs.svg | 1 + static/img/file-icons-classic/heic.svg | 1 + static/img/file-icons-classic/hlp.svg | 1 + static/img/file-icons-classic/hs.svg | 1 + static/img/file-icons-classic/hsl.svg | 1 + static/img/file-icons-classic/htm.svg | 1 + static/img/file-icons-classic/html.svg | 1 + static/img/file-icons-classic/ibooks.svg | 1 + static/img/file-icons-classic/icns.svg | 1 + static/img/file-icons-classic/ico.svg | 1 + static/img/file-icons-classic/ics.svg | 1 + static/img/file-icons-classic/idx.svg | 1 + static/img/file-icons-classic/iff.svg | 1 + static/img/file-icons-classic/ifo.svg | 1 + static/img/file-icons-classic/image.svg | 1 + static/img/file-icons-classic/img.svg | 1 + static/img/file-icons-classic/iml.svg | 1 + static/img/file-icons-classic/in.svg | 1 + static/img/file-icons-classic/inc.svg | 1 + static/img/file-icons-classic/indd.svg | 1 + static/img/file-icons-classic/inf.svg | 1 + static/img/file-icons-classic/info.svg | 1 + static/img/file-icons-classic/ini.svg | 1 + static/img/file-icons-classic/inv.svg | 1 + static/img/file-icons-classic/iso.svg | 1 + static/img/file-icons-classic/j2.svg | 1 + static/img/file-icons-classic/jar.svg | 1 + static/img/file-icons-classic/java.svg | 1 + static/img/file-icons-classic/jpe.svg | 1 + static/img/file-icons-classic/jpeg.svg | 1 + static/img/file-icons-classic/jpg.svg | 1 + static/img/file-icons-classic/js.svg | 1 + static/img/file-icons-classic/json.svg | 1 + static/img/file-icons-classic/jsp.svg | 1 + static/img/file-icons-classic/jsx.svg | 1 + static/img/file-icons-classic/key.svg | 1 + static/img/file-icons-classic/kf8.svg | 1 + static/img/file-icons-classic/kmk.svg | 1 + static/img/file-icons-classic/ksh.svg | 1 + static/img/file-icons-classic/kt.svg | 1 + static/img/file-icons-classic/kts.svg | 1 + static/img/file-icons-classic/kup.svg | 1 + static/img/file-icons-classic/less.svg | 1 + static/img/file-icons-classic/lex.svg | 1 + static/img/file-icons-classic/licx.svg | 1 + static/img/file-icons-classic/lisp.svg | 1 + static/img/file-icons-classic/lit.svg | 1 + static/img/file-icons-classic/lnk.svg | 1 + static/img/file-icons-classic/lock.svg | 1 + static/img/file-icons-classic/log.svg | 1 + static/img/file-icons-classic/lua.svg | 1 + static/img/file-icons-classic/m.svg | 1 + static/img/file-icons-classic/m2v.svg | 1 + static/img/file-icons-classic/m3u.svg | 1 + static/img/file-icons-classic/m3u8.svg | 1 + static/img/file-icons-classic/m4.svg | 1 + static/img/file-icons-classic/m4a.svg | 1 + static/img/file-icons-classic/m4r.svg | 1 + static/img/file-icons-classic/m4v.svg | 1 + static/img/file-icons-classic/map.svg | 1 + static/img/file-icons-classic/master.svg | 1 + static/img/file-icons-classic/mc.svg | 1 + static/img/file-icons-classic/md.svg | 1 + static/img/file-icons-classic/mdb.svg | 1 + static/img/file-icons-classic/mdf.svg | 1 + static/img/file-icons-classic/me.svg | 1 + static/img/file-icons-classic/mi.svg | 1 + static/img/file-icons-classic/mid.svg | 1 + static/img/file-icons-classic/midi.svg | 1 + static/img/file-icons-classic/mk.svg | 1 + static/img/file-icons-classic/mkv.svg | 1 + static/img/file-icons-classic/mm.svg | 1 + static/img/file-icons-classic/mng.svg | 1 + static/img/file-icons-classic/mo.svg | 1 + static/img/file-icons-classic/mobi.svg | 1 + static/img/file-icons-classic/mod.svg | 1 + static/img/file-icons-classic/mov.svg | 1 + static/img/file-icons-classic/mp2.svg | 1 + static/img/file-icons-classic/mp3.svg | 1 + static/img/file-icons-classic/mp4.svg | 1 + static/img/file-icons-classic/mpa.svg | 1 + static/img/file-icons-classic/mpd.svg | 1 + static/img/file-icons-classic/mpe.svg | 1 + static/img/file-icons-classic/mpeg.svg | 1 + static/img/file-icons-classic/mpg.svg | 1 + static/img/file-icons-classic/mpga.svg | 1 + static/img/file-icons-classic/mpp.svg | 1 + static/img/file-icons-classic/mpt.svg | 1 + static/img/file-icons-classic/msg.svg | 1 + static/img/file-icons-classic/msi.svg | 1 + static/img/file-icons-classic/msu.svg | 1 + static/img/file-icons-classic/nef.svg | 1 + static/img/file-icons-classic/nes.svg | 1 + static/img/file-icons-classic/nfo.svg | 1 + static/img/file-icons-classic/nix.svg | 1 + static/img/file-icons-classic/npmignore.svg | 1 + static/img/file-icons-classic/ocx.svg | 1 + static/img/file-icons-classic/odb.svg | 1 + static/img/file-icons-classic/ods.svg | 1 + static/img/file-icons-classic/odt.svg | 1 + static/img/file-icons-classic/ogg.svg | 1 + static/img/file-icons-classic/ogv.svg | 1 + static/img/file-icons-classic/ost.svg | 1 + static/img/file-icons-classic/otf.svg | 1 + static/img/file-icons-classic/ott.svg | 1 + static/img/file-icons-classic/ova.svg | 1 + static/img/file-icons-classic/ovf.svg | 1 + static/img/file-icons-classic/p12.svg | 1 + static/img/file-icons-classic/p7b.svg | 1 + static/img/file-icons-classic/pages.svg | 1 + static/img/file-icons-classic/part.svg | 1 + static/img/file-icons-classic/pcd.svg | 1 + static/img/file-icons-classic/pdb.svg | 1 + static/img/file-icons-classic/pdf.svg | 1 + static/img/file-icons-classic/pem.svg | 1 + static/img/file-icons-classic/pfx.svg | 1 + static/img/file-icons-classic/pgp.svg | 1 + static/img/file-icons-classic/ph.svg | 1 + static/img/file-icons-classic/phar.svg | 1 + static/img/file-icons-classic/php.svg | 1 + static/img/file-icons-classic/pid.svg | 1 + static/img/file-icons-classic/pkg.svg | 1 + static/img/file-icons-classic/pl.svg | 1 + static/img/file-icons-classic/plist.svg | 1 + static/img/file-icons-classic/pm.svg | 1 + static/img/file-icons-classic/png.svg | 1 + static/img/file-icons-classic/po.svg | 1 + static/img/file-icons-classic/pom.svg | 1 + static/img/file-icons-classic/pot.svg | 1 + static/img/file-icons-classic/potx.svg | 1 + static/img/file-icons-classic/pps.svg | 1 + static/img/file-icons-classic/ppsx.svg | 1 + static/img/file-icons-classic/ppt.svg | 1 + static/img/file-icons-classic/pptm.svg | 1 + static/img/file-icons-classic/pptx.svg | 1 + static/img/file-icons-classic/prop.svg | 1 + static/img/file-icons-classic/ps.svg | 1 + static/img/file-icons-classic/ps1.svg | 1 + static/img/file-icons-classic/psd.svg | 1 + static/img/file-icons-classic/psp.svg | 1 + static/img/file-icons-classic/pst.svg | 1 + static/img/file-icons-classic/pub.svg | 1 + static/img/file-icons-classic/py.svg | 1 + static/img/file-icons-classic/pyc.svg | 1 + static/img/file-icons-classic/qt.svg | 1 + static/img/file-icons-classic/ra.svg | 1 + static/img/file-icons-classic/ram.svg | 1 + static/img/file-icons-classic/rar.svg | 1 + static/img/file-icons-classic/raw.svg | 1 + static/img/file-icons-classic/rb.svg | 1 + static/img/file-icons-classic/rdf.svg | 1 + static/img/file-icons-classic/rdl.svg | 1 + static/img/file-icons-classic/reg.svg | 1 + static/img/file-icons-classic/resx.svg | 1 + static/img/file-icons-classic/retry.svg | 1 + static/img/file-icons-classic/rm.svg | 1 + static/img/file-icons-classic/rom.svg | 1 + static/img/file-icons-classic/rpm.svg | 1 + static/img/file-icons-classic/rpt.svg | 1 + static/img/file-icons-classic/rsa.svg | 1 + static/img/file-icons-classic/rss.svg | 1 + static/img/file-icons-classic/rst.svg | 1 + static/img/file-icons-classic/rtf.svg | 1 + static/img/file-icons-classic/ru.svg | 1 + static/img/file-icons-classic/rub.svg | 1 + static/img/file-icons-classic/sass.svg | 1 + static/img/file-icons-classic/scss.svg | 1 + static/img/file-icons-classic/sdf.svg | 1 + static/img/file-icons-classic/sed.svg | 1 + static/img/file-icons-classic/sh.svg | 1 + static/img/file-icons-classic/sit.svg | 1 + static/img/file-icons-classic/sitemap.svg | 1 + static/img/file-icons-classic/skin.svg | 1 + static/img/file-icons-classic/sldm.svg | 1 + static/img/file-icons-classic/sldx.svg | 1 + static/img/file-icons-classic/sln.svg | 1 + static/img/file-icons-classic/sol.svg | 1 + static/img/file-icons-classic/sphinx.svg | 1 + static/img/file-icons-classic/sql.svg | 1 + static/img/file-icons-classic/sqlite.svg | 1 + static/img/file-icons-classic/step.svg | 1 + static/img/file-icons-classic/stl.svg | 1 + static/img/file-icons-classic/svg.svg | 1 + static/img/file-icons-classic/swd.svg | 1 + static/img/file-icons-classic/swf.svg | 1 + static/img/file-icons-classic/swift.svg | 1 + static/img/file-icons-classic/swp.svg | 1 + static/img/file-icons-classic/sys.svg | 1 + static/img/file-icons-classic/tar.svg | 1 + static/img/file-icons-classic/tax.svg | 1 + static/img/file-icons-classic/tcsh.svg | 1 + static/img/file-icons-classic/tex.svg | 1 + static/img/file-icons-classic/tfignore.svg | 1 + static/img/file-icons-classic/tga.svg | 1 + static/img/file-icons-classic/tgz.svg | 1 + static/img/file-icons-classic/tif.svg | 1 + static/img/file-icons-classic/tiff.svg | 1 + static/img/file-icons-classic/tmp.svg | 1 + static/img/file-icons-classic/tmx.svg | 1 + static/img/file-icons-classic/torrent.svg | 1 + static/img/file-icons-classic/tpl.svg | 1 + static/img/file-icons-classic/ts.svg | 1 + static/img/file-icons-classic/tsv.svg | 1 + static/img/file-icons-classic/ttf.svg | 1 + static/img/file-icons-classic/twig.svg | 1 + static/img/file-icons-classic/txt.svg | 1 + static/img/file-icons-classic/udf.svg | 1 + static/img/file-icons-classic/vb.svg | 1 + static/img/file-icons-classic/vbproj.svg | 1 + static/img/file-icons-classic/vbs.svg | 1 + static/img/file-icons-classic/vcd.svg | 1 + static/img/file-icons-classic/vcf.svg | 1 + static/img/file-icons-classic/vcs.svg | 1 + static/img/file-icons-classic/vdi.svg | 1 + static/img/file-icons-classic/vdx.svg | 1 + static/img/file-icons-classic/vmdk.svg | 1 + static/img/file-icons-classic/vob.svg | 1 + static/img/file-icons-classic/vox.svg | 1 + static/img/file-icons-classic/vscodeignore.svg | 1 + static/img/file-icons-classic/vsd.svg | 1 + static/img/file-icons-classic/vss.svg | 1 + static/img/file-icons-classic/vst.svg | 1 + static/img/file-icons-classic/vsx.svg | 1 + static/img/file-icons-classic/vtx.svg | 1 + static/img/file-icons-classic/war.svg | 1 + static/img/file-icons-classic/wav.svg | 1 + static/img/file-icons-classic/wbk.svg | 1 + static/img/file-icons-classic/webinfo.svg | 1 + static/img/file-icons-classic/webm.svg | 1 + static/img/file-icons-classic/webp.svg | 1 + static/img/file-icons-classic/wma.svg | 1 + static/img/file-icons-classic/wmf.svg | 1 + static/img/file-icons-classic/wmv.svg | 1 + static/img/file-icons-classic/woff.svg | 1 + static/img/file-icons-classic/woff2.svg | 1 + static/img/file-icons-classic/wps.svg | 1 + static/img/file-icons-classic/wsf.svg | 1 + static/img/file-icons-classic/xaml.svg | 1 + static/img/file-icons-classic/xcf.svg | 1 + static/img/file-icons-classic/xfl.svg | 1 + static/img/file-icons-classic/xlm.svg | 1 + static/img/file-icons-classic/xls.svg | 1 + static/img/file-icons-classic/xlsm.svg | 1 + static/img/file-icons-classic/xlsx.svg | 1 + static/img/file-icons-classic/xlt.svg | 1 + static/img/file-icons-classic/xltm.svg | 1 + static/img/file-icons-classic/xltx.svg | 1 + static/img/file-icons-classic/xml.svg | 1 + static/img/file-icons-classic/xpi.svg | 1 + static/img/file-icons-classic/xps.svg | 1 + static/img/file-icons-classic/xrb.svg | 1 + static/img/file-icons-classic/xsd.svg | 1 + static/img/file-icons-classic/xsl.svg | 1 + static/img/file-icons-classic/xspf.svg | 1 + static/img/file-icons-classic/xz.svg | 1 + static/img/file-icons-classic/yaml.svg | 1 + static/img/file-icons-classic/yml.svg | 1 + static/img/file-icons-classic/z.svg | 1 + static/img/file-icons-classic/zip.svg | 1 + static/img/file-icons-classic/zsh.svg | 1 + static/img/icon-256x256.png | Bin 0 -> 47263 bytes static/img/icon-512x512.png | Bin 0 -> 144078 bytes static/img/noise.png | Bin 0 -> 975607 bytes static/js/chat.js | 20 + static/js/driver.js | 14 + static/js/mittens.js | 41 + static/js/register-sw.js | 18 + static/js/service-worker.js | 54 + static/js/site.js | 54 + static/js/tinymce/icons/default/icons.min.js | 1 + static/js/tinymce/langs/README.md | 3 + static/js/tinymce/license.txt | 21 + static/js/tinymce/models/dom/model.min.js | 4 + static/js/tinymce/plugins/accordion/plugin.min.js | 4 + static/js/tinymce/plugins/advlist/plugin.min.js | 4 + static/js/tinymce/plugins/anchor/plugin.min.js | 4 + static/js/tinymce/plugins/autolink/plugin.min.js | 4 + static/js/tinymce/plugins/autoresize/plugin.min.js | 4 + static/js/tinymce/plugins/autosave/plugin.min.js | 4 + static/js/tinymce/plugins/charmap/plugin.min.js | 4 + static/js/tinymce/plugins/code/plugin.min.js | 4 + static/js/tinymce/plugins/codesample/plugin.min.js | 4 + .../tinymce/plugins/directionality/plugin.min.js | 4 + .../js/tinymce/plugins/emoticons/js/emojiimages.js | 1 + .../plugins/emoticons/js/emojiimages.min.js | 3 + static/js/tinymce/plugins/emoticons/js/emojis.js | 1 + .../js/tinymce/plugins/emoticons/js/emojis.min.js | 2 + static/js/tinymce/plugins/emoticons/plugin.min.js | 4 + static/js/tinymce/plugins/fullscreen/plugin.min.js | 4 + .../js/tinymce/plugins/help/js/i18n/keynav/ar.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/bg_BG.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/ca.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/cs.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/da.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/de.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/el.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/en.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/es.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/eu.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/fa.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/fi.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/fr_FR.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/he_IL.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/hi.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/hr.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/hu_HU.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/id.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/it.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/ja.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/kk.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/ko_KR.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/ms.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/nb_NO.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/nl.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/pl.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/pt_BR.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/pt_PT.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/ro.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/ru.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/sk.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/sl_SI.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/sv_SE.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/th_TH.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/tr.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/uk.js | 90 + .../js/tinymce/plugins/help/js/i18n/keynav/vi.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/zh_CN.js | 84 + .../tinymce/plugins/help/js/i18n/keynav/zh_TW.js | 90 + static/js/tinymce/plugins/help/plugin.min.js | 4 + static/js/tinymce/plugins/image/plugin.min.js | 4 + static/js/tinymce/plugins/importcss/plugin.min.js | 4 + .../tinymce/plugins/insertdatetime/plugin.min.js | 4 + static/js/tinymce/plugins/link/plugin.min.js | 4 + static/js/tinymce/plugins/lists/plugin.min.js | 4 + static/js/tinymce/plugins/media/plugin.min.js | 4 + .../js/tinymce/plugins/nonbreaking/plugin.min.js | 4 + static/js/tinymce/plugins/pagebreak/plugin.min.js | 4 + static/js/tinymce/plugins/preview/plugin.min.js | 4 + static/js/tinymce/plugins/quickbars/plugin.min.js | 4 + static/js/tinymce/plugins/save/plugin.min.js | 4 + .../js/tinymce/plugins/searchreplace/plugin.min.js | 4 + static/js/tinymce/plugins/table/plugin.min.js | 4 + static/js/tinymce/plugins/template/plugin.min.js | 4 + .../js/tinymce/plugins/visualblocks/plugin.min.js | 4 + .../js/tinymce/plugins/visualchars/plugin.min.js | 4 + static/js/tinymce/plugins/wordcount/plugin.min.js | 4 + .../js/tinymce/skins/content/dark/content.min.css | 1 + .../tinymce/skins/content/default/content.min.css | 1 + .../tinymce/skins/content/document/content.min.css | 1 + .../skins/content/tinymce-5-dark/content.min.css | 1 + .../skins/content/tinymce-5/content.min.css | 1 + .../tinymce/skins/content/writer/content.min.css | 1 + .../skins/ui/oxide-dark/content.inline.min.css | 1 + .../js/tinymce/skins/ui/oxide-dark/content.min.css | 1 + static/js/tinymce/skins/ui/oxide-dark/skin.min.css | 1 + .../skins/ui/oxide-dark/skin.shadowdom.min.css | 1 + .../tinymce/skins/ui/oxide/content.inline.min.css | 1 + static/js/tinymce/skins/ui/oxide/content.min.css | 1 + static/js/tinymce/skins/ui/oxide/skin.min.css | 1 + .../tinymce/skins/ui/oxide/skin.shadowdom.min.css | 1 + .../skins/ui/tinymce-5-dark/content.inline.min.css | 1 + .../skins/ui/tinymce-5-dark/content.min.css | 1 + .../tinymce/skins/ui/tinymce-5-dark/skin.min.css | 1 + .../skins/ui/tinymce-5-dark/skin.shadowdom.min.css | 1 + .../skins/ui/tinymce-5/content.inline.min.css | 1 + .../js/tinymce/skins/ui/tinymce-5/content.min.css | 1 + static/js/tinymce/skins/ui/tinymce-5/skin.min.css | 1 + .../skins/ui/tinymce-5/skin.shadowdom.min.css | 1 + static/js/tinymce/themes/silver/theme.min.js | 4 + static/js/tinymce/tinymce.d.ts | 3212 ++++++++++++++++++++ static/js/tinymce/tinymce.min.js | 4 + static/manifest.json | 37 + templates/_errors/404.html | 26 + templates/builder/_advanced_search_attrs.html | 113 + .../builder/_advanced_search_input_numeric.html | 12 + templates/builder/_advanced_search_numeric.html | 23 + templates/builder/_advanced_search_select.html | 19 + .../builder/_advanced_search_select_kind.html | 16 + templates/builder/_current_deck_list-1.html | 33 + templates/builder/_jquery_droppable.html | 51 + templates/builder/_search_results_th.html | 9 + templates/builder/base-menu.html | 67 + templates/builder/current-deck-list.html | 27 + templates/builder/deck-controls.html | 99 + templates/builder/index.html | 48 + templates/builder/saved-category-list.html | 12 + templates/builder/saved-deck-list.html | 12 + templates/builder/search-results.html | 121 + templates/cards/_advanced_search_attrs.html | 113 + .../cards/_advanced_search_input_numeric.html | 12 + templates/cards/_advanced_search_numeric.html | 23 + templates/cards/_advanced_search_select.html | 15 + templates/cards/_advanced_search_select_kind.html | 16 + templates/cards/_advanced_search_top.html | 57 + templates/cards/_search_result_th.html | 9 + templates/cards/index.html | 35 + templates/cards/search-results.html | 78 + templates/cards/variant-results.html | 61 + templates/cards/view.html | 57 + templates/cards/ygo-price.html | 46 + templates/category/category-menu-bar.html | 4 + templates/category/child-form.html | 44 + templates/category/child-list.html | 10 + templates/category/explain.html | 58 + templates/category/index.html | 49 + templates/chat.html | 21 + templates/construct/constructed-deck-list.html | 12 + templates/construct/index.html | 99 + templates/construct/select-sets.html | 95 + templates/contact/admin.html | 38 + templates/contact/index.html | 43 + templates/contact/list.html | 37 + templates/decks/_field_control_select.html | 21 + templates/decks/cards-in-decks.html | 33 + templates/decks/category-select.html | 12 + templates/decks/deck-controls.html | 41 + templates/decks/deck-html-results-1.html | 24 + templates/decks/deck-html-results.html | 11 + templates/decks/deck-image-listing.html | 18 + templates/decks/deck-menu-bar.html | 8 + templates/decks/deck-select.html | 13 + templates/decks/deck-text-list-original.html | 32 + templates/decks/deck-text-list.html | 3 + templates/decks/deck-text-textarea-with-brs.html | 16 + templates/decks/deck-text-textarea.html | 16 + templates/decks/deck-text-three-column.html | 26 + templates/decks/decks-by-category.html | 3 + templates/decks/index.html | 107 + templates/decks/saved-category-list.html | 19 + templates/decks/search.html | 41 + templates/docs.html | 44 + templates/docs.md | 41 + templates/dropdown-js.html | 9 + templates/file-js.html | 11 + templates/footer.html | 14 + templates/index.html | 12 + templates/inventory/_advanced_search_input.html | 10 + templates/inventory/_advanced_search_select.html | 15 + templates/inventory/_edit_result.html | 12 + templates/inventory/_edit_row.html | 10 + templates/inventory/_inventory_variants.html | 10 + templates/inventory/_new_row.html | 10 + templates/inventory/_search_result_th.html | 13 + templates/inventory/_view_result.html | 3 + templates/inventory/advanced-search.html | 164 + templates/inventory/base-menu.html | 56 + templates/inventory/edit.html | 59 + templates/inventory/import.html | 34 + templates/inventory/index.html | 28 + templates/inventory/new.html | 48 + templates/inventory/old.html | 58 + templates/inventory/search-results.html | 86 + templates/inventory/variant-results.html | 89 + templates/kde-team.html | 302 ++ templates/label-maker.html | 71 + templates/latex/Avery-5160.tex | 15 + templates/latex/Avery-5160.tpl.tex | 26 + templates/latex/ULINE-S-20247.tex | 15 + templates/latex/ULINE-S-20247.tpl.tex | 26 + templates/latex/default.tpl.tex | 24 + templates/layouts/default.html | 19 + templates/layouts/html-head.html | 46 + templates/layouts/minimal.html | 10 + templates/markdown.html | 13 + templates/messages.html | 13 + templates/navbar-js.html | 10 + templates/navbar.html | 85 + templates/news.html | 32 + templates/offline.html | 1 + templates/pages.html | 27 + templates/qr.html | 154 + templates/tabs-js.html | 15 + templates/tinymce-js.html | 40 + templates/tinymce/index.html | 69 + templates/upload.html | 88 + templates/user/admin.html | 48 + templates/user/index.html | 23 + templates/user/login.html | 78 + templates/user/register.html | 85 + templates/user/user-menu-bar.html | 14 + templates/workbench/docs.html | 44 + templates/workbench/dropdown.html | 36 + templates/workbench/pure.html | 44 + templates/workbench/table.html | 6 + templates/workbench/tabs.html | 46 + templates/workbench/template.Dockerfile | 19 + templates/workbench/test-1.html | 16 + templates/workbench/test.html | 5 + templates/ydk/index.html | 85 + tests/cl-deck-builder2.lisp | 25 + tests/crystal-commerce.lisp | 32 + tests/import.lisp | 11 + tests/models/labels.lisp | 4 + tests/models/ygo-import.lisp | 20 + tests/packages.lisp | 20 + tests/toolkit.lisp | 107 + tests/user.lisp | 63 + tests/ydk.lisp | 22 + tests/ygoprodeck.lisp | 3 + 776 files changed, 35352 insertions(+) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 Makefile create mode 100644 README.md create mode 100644 app.lisp create mode 100644 cl-deck-builder2-test.asd create mode 100644 cl-deck-builder2.asd create mode 100644 cl-deck-builder2.service create mode 100644 cl-deck-builder2.workers.asd create mode 100644 contrib.sh create mode 100644 db/file.csv create mode 100644 db/schema.sql create mode 100644 doc/about.md create mode 100644 doc/flowcharts/card-doc.dot create mode 100644 doc/flowcharts/card-doc.png create mode 100644 doc/flowcharts/cluster.dot create mode 100644 doc/flowcharts/constructed-deck-doc.dot create mode 100644 doc/flowcharts/constructed-deck-doc.png create mode 100644 doc/label-maker.md create mode 100644 doc/release-checklist.org create mode 100644 doc/routes.org create mode 100644 doc/store/LabelMaker.csv create mode 100644 doc/store/S-20247.pdf create mode 100644 doc/store/S-20247.tpl.tex create mode 100644 doc/store/avery-5160.tex create mode 100644 doc/todo.md create mode 100644 doc/web/nginx/deck-builder create mode 100644 doc/web/nginx/deck-builder-tls create mode 100644 doc/web/nginx/default create mode 100644 doc/wiki.org create mode 100644 doc/workflow.md create mode 100644 doc/ygoprodeck-import.md create mode 100644 locale/en_US/LC_MESSAGES/cl-deck-builder2.mo create mode 100644 locale/en_US/LC_MESSAGES/cl-deck-builder2.po create mode 100644 locale/templates/LC_MESSAGES/.gitignore create mode 100644 locale/templates/LC_MESSAGES/cl-deck-builder2.pot create mode 100644 locale/templates/LC_MESSAGES/djula.pot create mode 100644 locale/templates/LC_MESSAGES/lisp.pot create mode 100644 old/api/api-v0.lisp create mode 100644 old/api/api-v1.lisp create mode 100644 old/api/package.lisp create mode 100644 old/hermetic.lisp create mode 100644 old/lack-middleware-secure.lisp create mode 100644 old/readme.md create mode 100644 old/web-route-test.lisp create mode 100644 old/ygoprodeck-json.lisp create mode 100644 preamble.lisp create mode 100644 print-deps.lisp create mode 100644 ruby/config.ru create mode 100644 src/.gitignore create mode 100644 src/config.lisp create mode 100644 src/db.lisp create mode 100644 src/documentation.lisp create mode 100644 src/draw.lisp create mode 100644 src/i18n.lisp create mode 100644 src/main.lisp create mode 100644 src/models/attachment.lisp create mode 100644 src/models/category-2.lisp create mode 100644 src/models/category.lisp create mode 100644 src/models/constructed-decks.lisp create mode 100644 src/models/crystal-commerce-csv.lisp create mode 100644 src/models/crystal-commerce.lisp create mode 100644 src/models/feedback.lisp create mode 100644 src/models/generics.lisp create mode 100644 src/models/label-maker.lisp create mode 100644 src/models/mtg.lisp create mode 100644 src/models/packages.lisp create mode 100644 src/models/qr-code.lisp create mode 100644 src/models/registered-table-mixin.lisp create mode 100644 src/models/search.lisp create mode 100644 src/models/sqlite-schema.lisp create mode 100644 src/models/user.lisp create mode 100644 src/models/ydk.lisp create mode 100644 src/models/ygoprodeck-cardinfo.lisp create mode 100644 src/models/ygoprodeck-classes.lisp create mode 100644 src/models/ygoprodeck-fields.lisp create mode 100644 src/models/ygoprodeck-json.lisp create mode 100644 src/models/ygoprodeck-methods.lisp create mode 100644 src/models/ygoprodeck.lisp create mode 100644 src/toolkit/git.lisp create mode 100644 src/toolkit/money.lisp create mode 100644 src/toolkit/packages.lisp create mode 100644 src/toolkit/paths.lisp create mode 100644 src/toolkit/time.lisp create mode 100644 src/toolkit/utils.lisp create mode 100644 src/view.lisp create mode 100644 src/web/builder.lisp create mode 100644 src/web/cards.lisp create mode 100644 src/web/category.lisp create mode 100644 src/web/constructed-decks.lisp create mode 100644 src/web/contact.lisp create mode 100644 src/web/decks.lisp create mode 100644 src/web/exception.lisp create mode 100644 src/web/flash-message.lisp create mode 100644 src/web/index.lisp create mode 100644 src/web/inventory.lisp create mode 100644 src/web/label-maker.lisp create mode 100644 src/web/packages.lisp create mode 100644 src/web/params.lisp create mode 100644 src/web/qr.lisp create mode 100644 src/web/query.lisp create mode 100644 src/web/search.lisp create mode 100644 src/web/setup.lisp create mode 100644 src/web/sse.lisp create mode 100644 src/web/test.lisp create mode 100644 src/web/tinymce.lisp create mode 100644 src/web/toolkit.lisp create mode 100644 src/web/upload.lisp create mode 100644 src/web/user.lisp create mode 100644 src/web/widget.lisp create mode 100644 src/web/ydk.lisp create mode 100644 src/workers/main.lisp create mode 100644 static/css/site.css create mode 100644 static/css/w3.css create mode 100644 static/favicon.png create mode 100644 static/img/attribute/Continuous.svg create mode 100644 static/img/attribute/Counter.svg create mode 100644 static/img/attribute/DARK.svg create mode 100644 static/img/attribute/DIVINE.svg create mode 100644 static/img/attribute/EARTH.svg create mode 100644 static/img/attribute/Equip.svg create mode 100644 static/img/attribute/FIRE.svg create mode 100644 static/img/attribute/Field.svg create mode 100644 static/img/attribute/LIGHT.svg create mode 100644 static/img/attribute/Normal-N.svg create mode 100644 static/img/attribute/Normal.svg create mode 100644 static/img/attribute/Quick-Play.svg create mode 100644 static/img/attribute/Ritual.svg create mode 100644 static/img/attribute/SPELL.svg create mode 100644 static/img/attribute/TRAP.svg create mode 100644 static/img/attribute/WATER.svg create mode 100644 static/img/attribute/WIND.svg create mode 100644 static/img/file-icons-classic/3g2.svg create mode 100644 static/img/file-icons-classic/3ga.svg create mode 100644 static/img/file-icons-classic/3gp.svg create mode 100644 static/img/file-icons-classic/7z.svg create mode 100644 static/img/file-icons-classic/aa.svg create mode 100644 static/img/file-icons-classic/aac.svg create mode 100644 static/img/file-icons-classic/ac.svg create mode 100644 static/img/file-icons-classic/accdb.svg create mode 100644 static/img/file-icons-classic/accdt.svg create mode 100644 static/img/file-icons-classic/ace.svg create mode 100644 static/img/file-icons-classic/adn.svg create mode 100644 static/img/file-icons-classic/ai.svg create mode 100644 static/img/file-icons-classic/aif.svg create mode 100644 static/img/file-icons-classic/aifc.svg create mode 100644 static/img/file-icons-classic/aiff.svg create mode 100644 static/img/file-icons-classic/ait.svg create mode 100644 static/img/file-icons-classic/amr.svg create mode 100644 static/img/file-icons-classic/ani.svg create mode 100644 static/img/file-icons-classic/apk.svg create mode 100644 static/img/file-icons-classic/app.svg create mode 100644 static/img/file-icons-classic/applescript.svg create mode 100644 static/img/file-icons-classic/asax.svg create mode 100644 static/img/file-icons-classic/asc.svg create mode 100644 static/img/file-icons-classic/ascx.svg create mode 100644 static/img/file-icons-classic/asf.svg create mode 100644 static/img/file-icons-classic/ash.svg create mode 100644 static/img/file-icons-classic/ashx.svg create mode 100644 static/img/file-icons-classic/asm.svg create mode 100644 static/img/file-icons-classic/asmx.svg create mode 100644 static/img/file-icons-classic/asp.svg create mode 100644 static/img/file-icons-classic/aspx.svg create mode 100644 static/img/file-icons-classic/asx.svg create mode 100644 static/img/file-icons-classic/au.svg create mode 100644 static/img/file-icons-classic/aup.svg create mode 100644 static/img/file-icons-classic/avi.svg create mode 100644 static/img/file-icons-classic/axd.svg create mode 100644 static/img/file-icons-classic/aze.svg create mode 100644 static/img/file-icons-classic/bak.svg create mode 100644 static/img/file-icons-classic/bash.svg create mode 100644 static/img/file-icons-classic/bat.svg create mode 100644 static/img/file-icons-classic/bin.svg create mode 100644 static/img/file-icons-classic/blank.svg create mode 100644 static/img/file-icons-classic/bmp.svg create mode 100644 static/img/file-icons-classic/bowerrc.svg create mode 100644 static/img/file-icons-classic/bpg.svg create mode 100644 static/img/file-icons-classic/browser.svg create mode 100644 static/img/file-icons-classic/bz2.svg create mode 100644 static/img/file-icons-classic/bzempty.svg create mode 100644 static/img/file-icons-classic/c.svg create mode 100644 static/img/file-icons-classic/cab.svg create mode 100644 static/img/file-icons-classic/cad.svg create mode 100644 static/img/file-icons-classic/caf.svg create mode 100644 static/img/file-icons-classic/cal.svg create mode 100644 static/img/file-icons-classic/catalog.json create mode 100644 static/img/file-icons-classic/cd.svg create mode 100644 static/img/file-icons-classic/cdda.svg create mode 100644 static/img/file-icons-classic/cer.svg create mode 100644 static/img/file-icons-classic/cfg.svg create mode 100644 static/img/file-icons-classic/cfm.svg create mode 100644 static/img/file-icons-classic/cfml.svg create mode 100644 static/img/file-icons-classic/cgi.svg create mode 100644 static/img/file-icons-classic/chm.svg create mode 100644 static/img/file-icons-classic/class.svg create mode 100644 static/img/file-icons-classic/cmd.svg create mode 100644 static/img/file-icons-classic/code-workspace.svg create mode 100644 static/img/file-icons-classic/codekit.svg create mode 100644 static/img/file-icons-classic/coffee.svg create mode 100644 static/img/file-icons-classic/coffeelintignore.svg create mode 100644 static/img/file-icons-classic/com.svg create mode 100644 static/img/file-icons-classic/compile.svg create mode 100644 static/img/file-icons-classic/conf.svg create mode 100644 static/img/file-icons-classic/config.svg create mode 100644 static/img/file-icons-classic/cpp.svg create mode 100644 static/img/file-icons-classic/cptx.svg create mode 100644 static/img/file-icons-classic/cr2.svg create mode 100644 static/img/file-icons-classic/crdownload.svg create mode 100644 static/img/file-icons-classic/crt.svg create mode 100644 static/img/file-icons-classic/crypt.svg create mode 100644 static/img/file-icons-classic/cs.svg create mode 100644 static/img/file-icons-classic/csh.svg create mode 100644 static/img/file-icons-classic/cson.svg create mode 100644 static/img/file-icons-classic/csproj.svg create mode 100644 static/img/file-icons-classic/css.svg create mode 100644 static/img/file-icons-classic/csv.svg create mode 100644 static/img/file-icons-classic/cue.svg create mode 100644 static/img/file-icons-classic/cur.svg create mode 100644 static/img/file-icons-classic/dart.svg create mode 100644 static/img/file-icons-classic/dat.svg create mode 100644 static/img/file-icons-classic/data.svg create mode 100644 static/img/file-icons-classic/db.svg create mode 100644 static/img/file-icons-classic/dbf.svg create mode 100644 static/img/file-icons-classic/deb.svg create mode 100644 static/img/file-icons-classic/default.svg create mode 100644 static/img/file-icons-classic/dgn.svg create mode 100644 static/img/file-icons-classic/dist.svg create mode 100644 static/img/file-icons-classic/diz.svg create mode 100644 static/img/file-icons-classic/dll.svg create mode 100644 static/img/file-icons-classic/dmg.svg create mode 100644 static/img/file-icons-classic/dng.svg create mode 100644 static/img/file-icons-classic/doc.svg create mode 100644 static/img/file-icons-classic/docb.svg create mode 100644 static/img/file-icons-classic/docm.svg create mode 100644 static/img/file-icons-classic/docx.svg create mode 100644 static/img/file-icons-classic/dot.svg create mode 100644 static/img/file-icons-classic/dotm.svg create mode 100644 static/img/file-icons-classic/dotx.svg create mode 100644 static/img/file-icons-classic/download.svg create mode 100644 static/img/file-icons-classic/dpj.svg create mode 100644 static/img/file-icons-classic/ds_store.svg create mode 100644 static/img/file-icons-classic/dsn.svg create mode 100644 static/img/file-icons-classic/dtd.svg create mode 100644 static/img/file-icons-classic/dwg.svg create mode 100644 static/img/file-icons-classic/dxf.svg create mode 100644 static/img/file-icons-classic/editorconfig.svg create mode 100644 static/img/file-icons-classic/el.svg create mode 100644 static/img/file-icons-classic/elf.svg create mode 100644 static/img/file-icons-classic/eml.svg create mode 100644 static/img/file-icons-classic/enc.svg create mode 100644 static/img/file-icons-classic/eot.svg create mode 100644 static/img/file-icons-classic/eps.svg create mode 100644 static/img/file-icons-classic/epub.svg create mode 100644 static/img/file-icons-classic/eslintignore.svg create mode 100644 static/img/file-icons-classic/exe.svg create mode 100644 static/img/file-icons-classic/f4v.svg create mode 100644 static/img/file-icons-classic/fax.svg create mode 100644 static/img/file-icons-classic/fb2.svg create mode 100644 static/img/file-icons-classic/fla.svg create mode 100644 static/img/file-icons-classic/flac.svg create mode 100644 static/img/file-icons-classic/flv.svg create mode 100644 static/img/file-icons-classic/fnt.svg create mode 100644 static/img/file-icons-classic/folder.svg create mode 100644 static/img/file-icons-classic/fon.svg create mode 100644 static/img/file-icons-classic/gadget.svg create mode 100644 static/img/file-icons-classic/gdp.svg create mode 100644 static/img/file-icons-classic/gem.svg create mode 100644 static/img/file-icons-classic/gif.svg create mode 100644 static/img/file-icons-classic/gitattributes.svg create mode 100644 static/img/file-icons-classic/gitignore.svg create mode 100644 static/img/file-icons-classic/go.svg create mode 100644 static/img/file-icons-classic/gpg.svg create mode 100644 static/img/file-icons-classic/gpl.svg create mode 100644 static/img/file-icons-classic/gradle.svg create mode 100644 static/img/file-icons-classic/gz.svg create mode 100644 static/img/file-icons-classic/h.svg create mode 100644 static/img/file-icons-classic/handlebars.svg create mode 100644 static/img/file-icons-classic/hbs.svg create mode 100644 static/img/file-icons-classic/heic.svg create mode 100644 static/img/file-icons-classic/hlp.svg create mode 100644 static/img/file-icons-classic/hs.svg create mode 100644 static/img/file-icons-classic/hsl.svg create mode 100644 static/img/file-icons-classic/htm.svg create mode 100644 static/img/file-icons-classic/html.svg create mode 100644 static/img/file-icons-classic/ibooks.svg create mode 100644 static/img/file-icons-classic/icns.svg create mode 100644 static/img/file-icons-classic/ico.svg create mode 100644 static/img/file-icons-classic/ics.svg create mode 100644 static/img/file-icons-classic/idx.svg create mode 100644 static/img/file-icons-classic/iff.svg create mode 100644 static/img/file-icons-classic/ifo.svg create mode 100644 static/img/file-icons-classic/image.svg create mode 100644 static/img/file-icons-classic/img.svg create mode 100644 static/img/file-icons-classic/iml.svg create mode 100644 static/img/file-icons-classic/in.svg create mode 100644 static/img/file-icons-classic/inc.svg create mode 100644 static/img/file-icons-classic/indd.svg create mode 100644 static/img/file-icons-classic/inf.svg create mode 100644 static/img/file-icons-classic/info.svg create mode 100644 static/img/file-icons-classic/ini.svg create mode 100644 static/img/file-icons-classic/inv.svg create mode 100644 static/img/file-icons-classic/iso.svg create mode 100644 static/img/file-icons-classic/j2.svg create mode 100644 static/img/file-icons-classic/jar.svg create mode 100644 static/img/file-icons-classic/java.svg create mode 100644 static/img/file-icons-classic/jpe.svg create mode 100644 static/img/file-icons-classic/jpeg.svg create mode 100644 static/img/file-icons-classic/jpg.svg create mode 100644 static/img/file-icons-classic/js.svg create mode 100644 static/img/file-icons-classic/json.svg create mode 100644 static/img/file-icons-classic/jsp.svg create mode 100644 static/img/file-icons-classic/jsx.svg create mode 100644 static/img/file-icons-classic/key.svg create mode 100644 static/img/file-icons-classic/kf8.svg create mode 100644 static/img/file-icons-classic/kmk.svg create mode 100644 static/img/file-icons-classic/ksh.svg create mode 100644 static/img/file-icons-classic/kt.svg create mode 100644 static/img/file-icons-classic/kts.svg create mode 100644 static/img/file-icons-classic/kup.svg create mode 100644 static/img/file-icons-classic/less.svg create mode 100644 static/img/file-icons-classic/lex.svg create mode 100644 static/img/file-icons-classic/licx.svg create mode 100644 static/img/file-icons-classic/lisp.svg create mode 100644 static/img/file-icons-classic/lit.svg create mode 100644 static/img/file-icons-classic/lnk.svg create mode 100644 static/img/file-icons-classic/lock.svg create mode 100644 static/img/file-icons-classic/log.svg create mode 100644 static/img/file-icons-classic/lua.svg create mode 100644 static/img/file-icons-classic/m.svg create mode 100644 static/img/file-icons-classic/m2v.svg create mode 100644 static/img/file-icons-classic/m3u.svg create mode 100644 static/img/file-icons-classic/m3u8.svg create mode 100644 static/img/file-icons-classic/m4.svg create mode 100644 static/img/file-icons-classic/m4a.svg create mode 100644 static/img/file-icons-classic/m4r.svg create mode 100644 static/img/file-icons-classic/m4v.svg create mode 100644 static/img/file-icons-classic/map.svg create mode 100644 static/img/file-icons-classic/master.svg create mode 100644 static/img/file-icons-classic/mc.svg create mode 100644 static/img/file-icons-classic/md.svg create mode 100644 static/img/file-icons-classic/mdb.svg create mode 100644 static/img/file-icons-classic/mdf.svg create mode 100644 static/img/file-icons-classic/me.svg create mode 100644 static/img/file-icons-classic/mi.svg create mode 100644 static/img/file-icons-classic/mid.svg create mode 100644 static/img/file-icons-classic/midi.svg create mode 100644 static/img/file-icons-classic/mk.svg create mode 100644 static/img/file-icons-classic/mkv.svg create mode 100644 static/img/file-icons-classic/mm.svg create mode 100644 static/img/file-icons-classic/mng.svg create mode 100644 static/img/file-icons-classic/mo.svg create mode 100644 static/img/file-icons-classic/mobi.svg create mode 100644 static/img/file-icons-classic/mod.svg create mode 100644 static/img/file-icons-classic/mov.svg create mode 100644 static/img/file-icons-classic/mp2.svg create mode 100644 static/img/file-icons-classic/mp3.svg create mode 100644 static/img/file-icons-classic/mp4.svg create mode 100644 static/img/file-icons-classic/mpa.svg create mode 100644 static/img/file-icons-classic/mpd.svg create mode 100644 static/img/file-icons-classic/mpe.svg create mode 100644 static/img/file-icons-classic/mpeg.svg create mode 100644 static/img/file-icons-classic/mpg.svg create mode 100644 static/img/file-icons-classic/mpga.svg create mode 100644 static/img/file-icons-classic/mpp.svg create mode 100644 static/img/file-icons-classic/mpt.svg create mode 100644 static/img/file-icons-classic/msg.svg create mode 100644 static/img/file-icons-classic/msi.svg create mode 100644 static/img/file-icons-classic/msu.svg create mode 100644 static/img/file-icons-classic/nef.svg create mode 100644 static/img/file-icons-classic/nes.svg create mode 100644 static/img/file-icons-classic/nfo.svg create mode 100644 static/img/file-icons-classic/nix.svg create mode 100644 static/img/file-icons-classic/npmignore.svg create mode 100644 static/img/file-icons-classic/ocx.svg create mode 100644 static/img/file-icons-classic/odb.svg create mode 100644 static/img/file-icons-classic/ods.svg create mode 100644 static/img/file-icons-classic/odt.svg create mode 100644 static/img/file-icons-classic/ogg.svg create mode 100644 static/img/file-icons-classic/ogv.svg create mode 100644 static/img/file-icons-classic/ost.svg create mode 100644 static/img/file-icons-classic/otf.svg create mode 100644 static/img/file-icons-classic/ott.svg create mode 100644 static/img/file-icons-classic/ova.svg create mode 100644 static/img/file-icons-classic/ovf.svg create mode 100644 static/img/file-icons-classic/p12.svg create mode 100644 static/img/file-icons-classic/p7b.svg create mode 100644 static/img/file-icons-classic/pages.svg create mode 100644 static/img/file-icons-classic/part.svg create mode 100644 static/img/file-icons-classic/pcd.svg create mode 100644 static/img/file-icons-classic/pdb.svg create mode 100644 static/img/file-icons-classic/pdf.svg create mode 100644 static/img/file-icons-classic/pem.svg create mode 100644 static/img/file-icons-classic/pfx.svg create mode 100644 static/img/file-icons-classic/pgp.svg create mode 100644 static/img/file-icons-classic/ph.svg create mode 100644 static/img/file-icons-classic/phar.svg create mode 100644 static/img/file-icons-classic/php.svg create mode 100644 static/img/file-icons-classic/pid.svg create mode 100644 static/img/file-icons-classic/pkg.svg create mode 100644 static/img/file-icons-classic/pl.svg create mode 100644 static/img/file-icons-classic/plist.svg create mode 100644 static/img/file-icons-classic/pm.svg create mode 100644 static/img/file-icons-classic/png.svg create mode 100644 static/img/file-icons-classic/po.svg create mode 100644 static/img/file-icons-classic/pom.svg create mode 100644 static/img/file-icons-classic/pot.svg create mode 100644 static/img/file-icons-classic/potx.svg create mode 100644 static/img/file-icons-classic/pps.svg create mode 100644 static/img/file-icons-classic/ppsx.svg create mode 100644 static/img/file-icons-classic/ppt.svg create mode 100644 static/img/file-icons-classic/pptm.svg create mode 100644 static/img/file-icons-classic/pptx.svg create mode 100644 static/img/file-icons-classic/prop.svg create mode 100644 static/img/file-icons-classic/ps.svg create mode 100644 static/img/file-icons-classic/ps1.svg create mode 100644 static/img/file-icons-classic/psd.svg create mode 100644 static/img/file-icons-classic/psp.svg create mode 100644 static/img/file-icons-classic/pst.svg create mode 100644 static/img/file-icons-classic/pub.svg create mode 100644 static/img/file-icons-classic/py.svg create mode 100644 static/img/file-icons-classic/pyc.svg create mode 100644 static/img/file-icons-classic/qt.svg create mode 100644 static/img/file-icons-classic/ra.svg create mode 100644 static/img/file-icons-classic/ram.svg create mode 100644 static/img/file-icons-classic/rar.svg create mode 100644 static/img/file-icons-classic/raw.svg create mode 100644 static/img/file-icons-classic/rb.svg create mode 100644 static/img/file-icons-classic/rdf.svg create mode 100644 static/img/file-icons-classic/rdl.svg create mode 100644 static/img/file-icons-classic/reg.svg create mode 100644 static/img/file-icons-classic/resx.svg create mode 100644 static/img/file-icons-classic/retry.svg create mode 100644 static/img/file-icons-classic/rm.svg create mode 100644 static/img/file-icons-classic/rom.svg create mode 100644 static/img/file-icons-classic/rpm.svg create mode 100644 static/img/file-icons-classic/rpt.svg create mode 100644 static/img/file-icons-classic/rsa.svg create mode 100644 static/img/file-icons-classic/rss.svg create mode 100644 static/img/file-icons-classic/rst.svg create mode 100644 static/img/file-icons-classic/rtf.svg create mode 100644 static/img/file-icons-classic/ru.svg create mode 100644 static/img/file-icons-classic/rub.svg create mode 100644 static/img/file-icons-classic/sass.svg create mode 100644 static/img/file-icons-classic/scss.svg create mode 100644 static/img/file-icons-classic/sdf.svg create mode 100644 static/img/file-icons-classic/sed.svg create mode 100644 static/img/file-icons-classic/sh.svg create mode 100644 static/img/file-icons-classic/sit.svg create mode 100644 static/img/file-icons-classic/sitemap.svg create mode 100644 static/img/file-icons-classic/skin.svg create mode 100644 static/img/file-icons-classic/sldm.svg create mode 100644 static/img/file-icons-classic/sldx.svg create mode 100644 static/img/file-icons-classic/sln.svg create mode 100644 static/img/file-icons-classic/sol.svg create mode 100644 static/img/file-icons-classic/sphinx.svg create mode 100644 static/img/file-icons-classic/sql.svg create mode 100644 static/img/file-icons-classic/sqlite.svg create mode 100644 static/img/file-icons-classic/step.svg create mode 100644 static/img/file-icons-classic/stl.svg create mode 100644 static/img/file-icons-classic/svg.svg create mode 100644 static/img/file-icons-classic/swd.svg create mode 100644 static/img/file-icons-classic/swf.svg create mode 100644 static/img/file-icons-classic/swift.svg create mode 100644 static/img/file-icons-classic/swp.svg create mode 100644 static/img/file-icons-classic/sys.svg create mode 100644 static/img/file-icons-classic/tar.svg create mode 100644 static/img/file-icons-classic/tax.svg create mode 100644 static/img/file-icons-classic/tcsh.svg create mode 100644 static/img/file-icons-classic/tex.svg create mode 100644 static/img/file-icons-classic/tfignore.svg create mode 100644 static/img/file-icons-classic/tga.svg create mode 100644 static/img/file-icons-classic/tgz.svg create mode 100644 static/img/file-icons-classic/tif.svg create mode 100644 static/img/file-icons-classic/tiff.svg create mode 100644 static/img/file-icons-classic/tmp.svg create mode 100644 static/img/file-icons-classic/tmx.svg create mode 100644 static/img/file-icons-classic/torrent.svg create mode 100644 static/img/file-icons-classic/tpl.svg create mode 100644 static/img/file-icons-classic/ts.svg create mode 100644 static/img/file-icons-classic/tsv.svg create mode 100644 static/img/file-icons-classic/ttf.svg create mode 100644 static/img/file-icons-classic/twig.svg create mode 100644 static/img/file-icons-classic/txt.svg create mode 100644 static/img/file-icons-classic/udf.svg create mode 100644 static/img/file-icons-classic/vb.svg create mode 100644 static/img/file-icons-classic/vbproj.svg create mode 100644 static/img/file-icons-classic/vbs.svg create mode 100644 static/img/file-icons-classic/vcd.svg create mode 100644 static/img/file-icons-classic/vcf.svg create mode 100644 static/img/file-icons-classic/vcs.svg create mode 100644 static/img/file-icons-classic/vdi.svg create mode 100644 static/img/file-icons-classic/vdx.svg create mode 100644 static/img/file-icons-classic/vmdk.svg create mode 100644 static/img/file-icons-classic/vob.svg create mode 100644 static/img/file-icons-classic/vox.svg create mode 100644 static/img/file-icons-classic/vscodeignore.svg create mode 100644 static/img/file-icons-classic/vsd.svg create mode 100644 static/img/file-icons-classic/vss.svg create mode 100644 static/img/file-icons-classic/vst.svg create mode 100644 static/img/file-icons-classic/vsx.svg create mode 100644 static/img/file-icons-classic/vtx.svg create mode 100644 static/img/file-icons-classic/war.svg create mode 100644 static/img/file-icons-classic/wav.svg create mode 100644 static/img/file-icons-classic/wbk.svg create mode 100644 static/img/file-icons-classic/webinfo.svg create mode 100644 static/img/file-icons-classic/webm.svg create mode 100644 static/img/file-icons-classic/webp.svg create mode 100644 static/img/file-icons-classic/wma.svg create mode 100644 static/img/file-icons-classic/wmf.svg create mode 100644 static/img/file-icons-classic/wmv.svg create mode 100644 static/img/file-icons-classic/woff.svg create mode 100644 static/img/file-icons-classic/woff2.svg create mode 100644 static/img/file-icons-classic/wps.svg create mode 100644 static/img/file-icons-classic/wsf.svg create mode 100644 static/img/file-icons-classic/xaml.svg create mode 100644 static/img/file-icons-classic/xcf.svg create mode 100644 static/img/file-icons-classic/xfl.svg create mode 100644 static/img/file-icons-classic/xlm.svg create mode 100644 static/img/file-icons-classic/xls.svg create mode 100644 static/img/file-icons-classic/xlsm.svg create mode 100644 static/img/file-icons-classic/xlsx.svg create mode 100644 static/img/file-icons-classic/xlt.svg create mode 100644 static/img/file-icons-classic/xltm.svg create mode 100644 static/img/file-icons-classic/xltx.svg create mode 100644 static/img/file-icons-classic/xml.svg create mode 100644 static/img/file-icons-classic/xpi.svg create mode 100644 static/img/file-icons-classic/xps.svg create mode 100644 static/img/file-icons-classic/xrb.svg create mode 100644 static/img/file-icons-classic/xsd.svg create mode 100644 static/img/file-icons-classic/xsl.svg create mode 100644 static/img/file-icons-classic/xspf.svg create mode 100644 static/img/file-icons-classic/xz.svg create mode 100644 static/img/file-icons-classic/yaml.svg create mode 100644 static/img/file-icons-classic/yml.svg create mode 100644 static/img/file-icons-classic/z.svg create mode 100644 static/img/file-icons-classic/zip.svg create mode 100644 static/img/file-icons-classic/zsh.svg create mode 100644 static/img/icon-256x256.png create mode 100644 static/img/icon-512x512.png create mode 100644 static/img/noise.png create mode 100644 static/js/chat.js create mode 100644 static/js/driver.js create mode 100644 static/js/mittens.js create mode 100644 static/js/register-sw.js create mode 100644 static/js/service-worker.js create mode 100644 static/js/site.js create mode 100644 static/js/tinymce/icons/default/icons.min.js create mode 100644 static/js/tinymce/langs/README.md create mode 100644 static/js/tinymce/license.txt create mode 100644 static/js/tinymce/models/dom/model.min.js create mode 100644 static/js/tinymce/plugins/accordion/plugin.min.js create mode 100644 static/js/tinymce/plugins/advlist/plugin.min.js create mode 100644 static/js/tinymce/plugins/anchor/plugin.min.js create mode 100644 static/js/tinymce/plugins/autolink/plugin.min.js create mode 100644 static/js/tinymce/plugins/autoresize/plugin.min.js create mode 100644 static/js/tinymce/plugins/autosave/plugin.min.js create mode 100644 static/js/tinymce/plugins/charmap/plugin.min.js create mode 100644 static/js/tinymce/plugins/code/plugin.min.js create mode 100644 static/js/tinymce/plugins/codesample/plugin.min.js create mode 100644 static/js/tinymce/plugins/directionality/plugin.min.js create mode 100644 static/js/tinymce/plugins/emoticons/js/emojiimages.js create mode 100644 static/js/tinymce/plugins/emoticons/js/emojiimages.min.js create mode 100644 static/js/tinymce/plugins/emoticons/js/emojis.js create mode 100644 static/js/tinymce/plugins/emoticons/js/emojis.min.js create mode 100644 static/js/tinymce/plugins/emoticons/plugin.min.js create mode 100644 static/js/tinymce/plugins/fullscreen/plugin.min.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/ar.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/bg_BG.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/ca.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/cs.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/da.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/de.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/el.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/en.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/es.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/eu.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/fa.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/fi.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/fr_FR.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/he_IL.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/hi.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/hr.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/hu_HU.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/id.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/it.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/ja.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/kk.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/ko_KR.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/ms.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/nb_NO.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/nl.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/pl.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/pt_BR.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/pt_PT.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/ro.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/ru.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/sk.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/sl_SI.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/sv_SE.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/th_TH.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/tr.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/uk.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/vi.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/zh_CN.js create mode 100644 static/js/tinymce/plugins/help/js/i18n/keynav/zh_TW.js create mode 100644 static/js/tinymce/plugins/help/plugin.min.js create mode 100644 static/js/tinymce/plugins/image/plugin.min.js create mode 100644 static/js/tinymce/plugins/importcss/plugin.min.js create mode 100644 static/js/tinymce/plugins/insertdatetime/plugin.min.js create mode 100644 static/js/tinymce/plugins/link/plugin.min.js create mode 100644 static/js/tinymce/plugins/lists/plugin.min.js create mode 100644 static/js/tinymce/plugins/media/plugin.min.js create mode 100644 static/js/tinymce/plugins/nonbreaking/plugin.min.js create mode 100644 static/js/tinymce/plugins/pagebreak/plugin.min.js create mode 100644 static/js/tinymce/plugins/preview/plugin.min.js create mode 100644 static/js/tinymce/plugins/quickbars/plugin.min.js create mode 100644 static/js/tinymce/plugins/save/plugin.min.js create mode 100644 static/js/tinymce/plugins/searchreplace/plugin.min.js create mode 100644 static/js/tinymce/plugins/table/plugin.min.js create mode 100644 static/js/tinymce/plugins/template/plugin.min.js create mode 100644 static/js/tinymce/plugins/visualblocks/plugin.min.js create mode 100644 static/js/tinymce/plugins/visualchars/plugin.min.js create mode 100644 static/js/tinymce/plugins/wordcount/plugin.min.js create mode 100644 static/js/tinymce/skins/content/dark/content.min.css create mode 100644 static/js/tinymce/skins/content/default/content.min.css create mode 100644 static/js/tinymce/skins/content/document/content.min.css create mode 100644 static/js/tinymce/skins/content/tinymce-5-dark/content.min.css create mode 100644 static/js/tinymce/skins/content/tinymce-5/content.min.css create mode 100644 static/js/tinymce/skins/content/writer/content.min.css create mode 100644 static/js/tinymce/skins/ui/oxide-dark/content.inline.min.css create mode 100644 static/js/tinymce/skins/ui/oxide-dark/content.min.css create mode 100644 static/js/tinymce/skins/ui/oxide-dark/skin.min.css create mode 100644 static/js/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css create mode 100644 static/js/tinymce/skins/ui/oxide/content.inline.min.css create mode 100644 static/js/tinymce/skins/ui/oxide/content.min.css create mode 100644 static/js/tinymce/skins/ui/oxide/skin.min.css create mode 100644 static/js/tinymce/skins/ui/oxide/skin.shadowdom.min.css create mode 100644 static/js/tinymce/skins/ui/tinymce-5-dark/content.inline.min.css create mode 100644 static/js/tinymce/skins/ui/tinymce-5-dark/content.min.css create mode 100644 static/js/tinymce/skins/ui/tinymce-5-dark/skin.min.css create mode 100644 static/js/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css create mode 100644 static/js/tinymce/skins/ui/tinymce-5/content.inline.min.css create mode 100644 static/js/tinymce/skins/ui/tinymce-5/content.min.css create mode 100644 static/js/tinymce/skins/ui/tinymce-5/skin.min.css create mode 100644 static/js/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css create mode 100644 static/js/tinymce/themes/silver/theme.min.js create mode 100644 static/js/tinymce/tinymce.d.ts create mode 100644 static/js/tinymce/tinymce.min.js create mode 100644 static/manifest.json create mode 100644 templates/_errors/404.html create mode 100644 templates/builder/_advanced_search_attrs.html create mode 100644 templates/builder/_advanced_search_input_numeric.html create mode 100644 templates/builder/_advanced_search_numeric.html create mode 100644 templates/builder/_advanced_search_select.html create mode 100644 templates/builder/_advanced_search_select_kind.html create mode 100644 templates/builder/_current_deck_list-1.html create mode 100644 templates/builder/_jquery_droppable.html create mode 100644 templates/builder/_search_results_th.html create mode 100644 templates/builder/base-menu.html create mode 100644 templates/builder/current-deck-list.html create mode 100644 templates/builder/deck-controls.html create mode 100644 templates/builder/index.html create mode 100644 templates/builder/saved-category-list.html create mode 100644 templates/builder/saved-deck-list.html create mode 100644 templates/builder/search-results.html create mode 100644 templates/cards/_advanced_search_attrs.html create mode 100644 templates/cards/_advanced_search_input_numeric.html create mode 100644 templates/cards/_advanced_search_numeric.html create mode 100644 templates/cards/_advanced_search_select.html create mode 100644 templates/cards/_advanced_search_select_kind.html create mode 100644 templates/cards/_advanced_search_top.html create mode 100644 templates/cards/_search_result_th.html create mode 100644 templates/cards/index.html create mode 100644 templates/cards/search-results.html create mode 100644 templates/cards/variant-results.html create mode 100644 templates/cards/view.html create mode 100644 templates/cards/ygo-price.html create mode 100644 templates/category/category-menu-bar.html create mode 100644 templates/category/child-form.html create mode 100644 templates/category/child-list.html create mode 100644 templates/category/explain.html create mode 100644 templates/category/index.html create mode 100644 templates/chat.html create mode 100644 templates/construct/constructed-deck-list.html create mode 100644 templates/construct/index.html create mode 100644 templates/construct/select-sets.html create mode 100644 templates/contact/admin.html create mode 100644 templates/contact/index.html create mode 100644 templates/contact/list.html create mode 100644 templates/decks/_field_control_select.html create mode 100644 templates/decks/cards-in-decks.html create mode 100644 templates/decks/category-select.html create mode 100644 templates/decks/deck-controls.html create mode 100644 templates/decks/deck-html-results-1.html create mode 100644 templates/decks/deck-html-results.html create mode 100644 templates/decks/deck-image-listing.html create mode 100644 templates/decks/deck-menu-bar.html create mode 100644 templates/decks/deck-select.html create mode 100644 templates/decks/deck-text-list-original.html create mode 100644 templates/decks/deck-text-list.html create mode 100644 templates/decks/deck-text-textarea-with-brs.html create mode 100644 templates/decks/deck-text-textarea.html create mode 100644 templates/decks/deck-text-three-column.html create mode 100644 templates/decks/decks-by-category.html create mode 100644 templates/decks/index.html create mode 100644 templates/decks/saved-category-list.html create mode 100644 templates/decks/search.html create mode 100644 templates/docs.html create mode 100644 templates/docs.md create mode 100644 templates/dropdown-js.html create mode 100644 templates/file-js.html create mode 100644 templates/footer.html create mode 100644 templates/index.html create mode 100644 templates/inventory/_advanced_search_input.html create mode 100644 templates/inventory/_advanced_search_select.html create mode 100644 templates/inventory/_edit_result.html create mode 100644 templates/inventory/_edit_row.html create mode 100644 templates/inventory/_inventory_variants.html create mode 100644 templates/inventory/_new_row.html create mode 100644 templates/inventory/_search_result_th.html create mode 100644 templates/inventory/_view_result.html create mode 100644 templates/inventory/advanced-search.html create mode 100644 templates/inventory/base-menu.html create mode 100644 templates/inventory/edit.html create mode 100644 templates/inventory/import.html create mode 100644 templates/inventory/index.html create mode 100644 templates/inventory/new.html create mode 100644 templates/inventory/old.html create mode 100644 templates/inventory/search-results.html create mode 100644 templates/inventory/variant-results.html create mode 100644 templates/kde-team.html create mode 100644 templates/label-maker.html create mode 100644 templates/latex/Avery-5160.tex create mode 100644 templates/latex/Avery-5160.tpl.tex create mode 100644 templates/latex/ULINE-S-20247.tex create mode 100644 templates/latex/ULINE-S-20247.tpl.tex create mode 100644 templates/latex/default.tpl.tex create mode 100644 templates/layouts/default.html create mode 100644 templates/layouts/html-head.html create mode 100644 templates/layouts/minimal.html create mode 100644 templates/markdown.html create mode 100644 templates/messages.html create mode 100644 templates/navbar-js.html create mode 100644 templates/navbar.html create mode 100644 templates/news.html create mode 100644 templates/offline.html create mode 100644 templates/pages.html create mode 100644 templates/qr.html create mode 100644 templates/tabs-js.html create mode 100644 templates/tinymce-js.html create mode 100644 templates/tinymce/index.html create mode 100644 templates/upload.html create mode 100644 templates/user/admin.html create mode 100644 templates/user/index.html create mode 100644 templates/user/login.html create mode 100644 templates/user/register.html create mode 100644 templates/user/user-menu-bar.html create mode 100644 templates/workbench/docs.html create mode 100644 templates/workbench/dropdown.html create mode 100644 templates/workbench/pure.html create mode 100644 templates/workbench/table.html create mode 100644 templates/workbench/tabs.html create mode 100644 templates/workbench/template.Dockerfile create mode 100644 templates/workbench/test-1.html create mode 100644 templates/workbench/test.html create mode 100644 templates/ydk/index.html create mode 100644 tests/cl-deck-builder2.lisp create mode 100644 tests/crystal-commerce.lisp create mode 100644 tests/import.lisp create mode 100644 tests/models/labels.lisp create mode 100644 tests/models/ygo-import.lisp create mode 100644 tests/packages.lisp create mode 100644 tests/toolkit.lisp create mode 100644 tests/user.lisp create mode 100644 tests/ydk.lisp create mode 100644 tests/ygoprodeck.lisp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..08b60af --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.fasl +*.dx32fsl +*.dx64fsl +*.lx32fsl +*.lx64fsl +*.x86f +*~ +.#* +*.sqlite +*.sqlite3 +system-index.txt \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..00672a6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,61 @@ +ARG TARGETARCH TARGETPLATFORM TARGETVARIANT +FROM --platform=$TARGETPLATFORM docker.io/$TARGETARCH${TARGETVARIANT}/alpine:3.18.2 + +RUN addgroup -g 1000 quicklisp && adduser -D -G quicklisp -u 1000 quicklisp + +RUN set -eux; \ + apk add --no-cache \ + cgit \ + curl \ + gcc \ + git \ + imagemagick \ + libev \ + make \ + musl-dev \ + py3-markdown \ + py3-pygments \ + python3 \ + sbcl \ + sqlite \ + sqlite-libs \ + texlive \ + texlive-xetex \ + texmf-dist-latexextra \ + zxing && \ + rm -rf /var/cache/apk/* + +WORKDIR /home/quicklisp/ + +USER quicklisp + +RUN curl -O https://beta.quicklisp.org/quicklisp.lisp +RUN sbcl --noinform --no-userinit --no-sysinit --non-interactive \ + --load quicklisp.lisp --eval "(quicklisp-quickstart:install)" \ + --eval "(ql-util:without-prompting (ql:add-to-init-file))" + +RUN sbcl --non-interactive \ + --eval "(ql:quickload '(:slynk :slynk/arglists :slynk/fancy-inspector :slynk/indentation :slynk/mrepl :slynk/profiler :slynk/trace-dialog))" + +RUN sbcl --non-interactive \ + --eval "(ql:quickload '(:assoc-utils \ + :caveman2 :clack :clack-errors :datafly :djula :envy :hunchentoot :woo \ + :can :mito-auth :lack :lack-middleware-clack-errors :lack-middleware-csrf \ + :cl-csv :cl-json :cl-org-mode :cl-pass :dbd-sqlite3 :documentation-utils \ + :documentation-utils-extensions :lispqr :mito :mito-attachment :ratify \ + :sxql :trivial-download :verbose :websocket-driver :cl-markup :hermetic \ + :inferior-shell :psychiq :djula-gettext :gettext))" + +RUN mkdir -p /home/quicklisp/public + +COPY --chown=quicklisp:quicklisp . /home/quicklisp/quicklisp/local-projects/cl-deck-builder2/ + +RUN sbcl --non-interactive \ + --eval "(ql:register-local-projects)" \ + --eval "(ql:quickload :cl-deck-builder2)" + +EXPOSE 4005 5005 + +VOLUME ["/home/quicklisp/public/"] + +CMD ["sbcl", "--load", "/home/quicklisp/quicklisp/local-projects/cl-deck-builder2/preamble.lisp", "--eval", "(cl-deck-builder2:main)"] diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e0ec3e2 --- /dev/null +++ b/Makefile @@ -0,0 +1,134 @@ +################################################################################ +# Target Host Architecture +ARCH ?= x86_64 + +# docker / podman +DOCKER ?= podman +DOCKER_COMPOSE ?= podman-compose +# Other programs +LISP ?= sbcl +RM ?= rm -f + +################################################################################ +# Git Revision Info +GIT_REV ?= $(shell git rev-parse master) +# Influences the Docker Image Name +IMAGE_NAME ?= cl-deck-builder2-$(GIT_REV) + +# For bind to this external address for docker-run +EXTERNAL_ADDR ?= 5005 +EXTERNAL_SLYNK_ADDR ?= 4005 + +# Platform passed to Dockerfile +PLATFORM.x86_64 ?= linux/amd64 +PLATFORM.aarch64 ?= linux/arm64/v8 +PLATFORM ?= $(PLATFORM.$(ARCH)) + +################################################################################ +# Code Borrwed from openbookstore +# List lisp files, unless they contains a # +SRC += $(shell find src/ -name '*.lisp' -a ! -name '*#*') +HTML += $(shell find templates/ -name '*.html' -a ! -name '*#*') +DEPS += $(SRC) $(HTML) $(wildcard *.asd) + +# list of supported locales +LOCALES := en_US +# Example of how the variable should look after adding a new locale: +# LOCALES := en_US en_GB fr_FR es_ES + +# list of .po files (computed from the LOCALES variable) +PO_FILES := $(foreach locale,$(LOCALES),locale/$(locale)/LC_MESSAGES/cl-deck-builder2.po) +# list of .mo files (computed from the LOCALES variable) +MO_FILES := $(foreach locale,$(LOCALES),locale/$(locale)/LC_MESSAGES/cl-deck-builder2.mo) + +################################################################################ +all: + +docker-build: Dockerfile test + $(DOCKER) buildx build --platform $(PLATFORM) -t $(IMAGE_NAME) . + +docker-run: + $(DOCKER) run --platform $(PLATFORM) \ + --rm -it -P -p $(EXTERNAL_SLYNK_ADDR):4005 -p $(EXTERNAL_ADDR):5005 \ + --userns=keep-id -v $(HOME)/public:/home/quicklisp/public:z $(IMAGE_NAME) + +docker-clean: + -$(DOCKER) image rm -f $(IMAGE_NAME) + +clean-fasl: + -find -name '*.fasl' | xargs $(RM) -fv + +clean: clean-fasl + -find -name '*~' | xargs $(RM) -fv + $(RM) -rf bin/ + +# I use a feature flag, bc using djula:*recompile-templates-on-change* +# requires to load Djula before our app, and it isn't exactly the same meaning. +build-lisp-image: ${MO_FILES} + $(LISP) --non-interactive \ + --eval '(ql:quickload "deploy")' \ + --load cl-deck-builder2.asd \ + --eval '(push :djula-binary *features*)' \ + --eval '(ql:quickload :cl-deck-builder2)' \ + --eval '(asdf:make :cl-deck-builder2)' + +# This must use a custom-built SBCL with a special parameter, +# see linux-packaging README. +# I have it under ~/.local/bin/bin/sbcl +build-package: + $(LISP) --non-interactive \ + --load cl-deck-builder2.asd \ + --eval '(ql:quickload :cl-deck-builder2)' \ + --eval '(setf *debugger-hook* (lambda (c h) (declare (ignore h)) (format t "~A~%" c) (sb-ext:quit :unix-status -1)))' \ + --eval '(asdf:make :cl-deck-builder2)' + +# build-gui: +# $(LISP) --non-interactive \ +# --load cl-deck-builder2.asd \ +# --eval '(ql:quickload :bookshops/gui)' \ +# --eval '(asdf:make :bookshops/gui)' + +test: + $(LISP) --non-interactive \ + --load cl-deck-builder2.asd \ + --load cl-deck-builder2-test.asd \ + --eval "(ql:quickload '(:cl-deck-builder2 :cl-deck-builder2-test))" \ + --eval "(asdf:test-system :cl-deck-builder2)" + +.PHONY: tr +tr: ${MO_FILES} + +PO_TEMPLATE_DIR := locale/templates/LC_MESSAGES +PO_TEMPLATE := ${PO_TEMPLATE_DIR}/cl-deck-builder2.pot + +# Rule to extract translatable strings from SRC +${PO_TEMPLATE_DIR}/lisp.pot: $(SRC) + mkdir -p $(@D) + xgettext -k_ -kN_ --language=lisp -o $@ $^ + +# Rule to extract translatable strings from djula templates +${PO_TEMPLATE_DIR}/djula.pot: $(HTML) src/i18n.lisp + $(LISP) --non-interactive \ + --eval '(ql:quickload "deploy")' \ + --eval '(asdf:load-asd (truename "cl-deck-builder2.asd"))' \ + --eval '(push :djula-binary *features*)' \ + --eval '(ql:quickload :cl-deck-builder2)' \ + --eval '(cl-deck-builder2.i18n:update-djula.pot)' + +# Rule to combine djula.pot and lisp.pot into cl-deck-builder2.pot +${PO_TEMPLATE}: ${PO_TEMPLATE_DIR}/djula.pot ${PO_TEMPLATE_DIR}/lisp.pot + msgcat --use-first $^ > $@ + +# Rule to generate or update the .po files from the .pot file +locale/%/LC_MESSAGES/cl-deck-builder2.po: ${PO_TEMPLATE} + mkdir -p $(@D) + [ -f $@ ] || msginit --locale=$* \ + --no-translator \ + -i $< \ + -o $@ \ + && msgmerge --update $@ $< + +# Rule to create the .mo files from the .po files +locale/%/LC_MESSAGES/cl-deck-builder2.mo: locale/%/LC_MESSAGES/cl-deck-builder2.po + mkdir -p $(@D) + msgfmt -o $@ $< diff --git a/README.md b/README.md new file mode 100644 index 0000000..b38fd64 --- /dev/null +++ b/README.md @@ -0,0 +1,172 @@ +# cl-deck-builder2 + +## About + +This is a project to... + +- Build TCG decks: "The Deck Builder" +- Keep track of TCG inventory: "The Inventory Manager" +- Support sale of TCG Inventory via "The Deck Builder" + +It's a [Caveman2](https://github.com/fukamachi/caveman) web app, written in [Common Lisp](https://lisp-lang.org/). + +The entire application may be built and run inside a [Docker](https://www.docker.com/) container. + +You may access a live instance at [https://phntsm.ddns.net/](https://phntsm.ddns.net/). + +## Usage + +There are three components to this project. "The Inventory Manager", +"The Deck Builder," and "The User Interface". The Deck Builder sources +in-stock products from the Inventory Manager. When the Deck Builder +constructs a Deck, it keeps a record of which cards are located in +which decks. When a Deck is purchased, this information can be updated +via a web interface. The User Interface is a convenient front-end. + +The project may be used by loading a Docker image, loading the code +directly into a Lisp sytem like [SBCL](http://sbcl.org/), or using a +development environment like [Portacle](https://portacle.github.io/). + +Once loaded, follow the code below to start the development +environment, or, if you're using the Docker image, simply type: + +```bash +% make docker-build +% make docker-run +``` + +## Installation + +First, set up [SBCL](http://sbcl.org/) and [Quicklisp](https://www.quicklisp.org/beta/). + +If you're using [Portacle](https://portacle.github.io/), you should be all set already, just clone the repository. + +Clone the master repository from +[http://phntsm.ddns.net/git/cl-deck-builder.git/](http://phntsm.ddns.net/git/cl-deck-builder.git/): + +```bash +% cd ~/quicklisp/local-projects/ +git clone http://phntsm.ddns.net/git/cl-deck-builder.git/ +``` + +```lisp +;; You may have to push whatever directory you're in to *LOCAL-PROJECT-DIRECTORIES* +(push #P"~/code/cl-deck-builder2/" ql:*local-project-directories*) + +;; Load cl-deck-builder2 and tests +(ql:quickload '(:cl-deck-builder2 :cl-deck-builder2-test)) + +;; cl-deck-builder2.asd finds src/package.lisp which contains package +;; definition - switch to this package for development. +(in-package :cl-deck-builder2) + +;; Start the server: +;; in src/main.lisp we define a custom function, MY/START, that will +;; INVOKE-RESTART if the server is already running. +;; +;; IPv4 +(my/start :address "0.0.0.0" :port 5001 :server :woo) +;; IPv6 +(my/start :address "::" :port 5001 :server :woo) + +;; For development session: +(use-package '(:cl-deck-builder2.db + :cl-deck-builder2.draw + :cl-deck-builder2.models + :cl-deck-builder2.toolkit + :cl-deck-builder2-test)) +``` + +### Requirements + +You'll need Quicklisp, and the dependencies listed in the ASDF System +Definition file, as well as the following system libraries installed. + +```bash + # Install Software + % apt install build-essential git jq sbcl + % apt install nginx fcgiwrap libev-dev sqlite3 libsqlite3-dev collectd imagemagick ruby ruby-sidekiq + + # For source code hosting + % apt install cgit python3-pygments python3-markdown +``` + +- [What is build-essential Ubuntu, how to install and use it?](https://linuxhint.com/install-build-essential-ubuntu/) +- [git](https://git-scm.com/): Version Control +- [jq](https://jqlang.github.io/jq/): Parsin JSON files on the command line +- [SBCL](http://sbcl.org/): Lisp Implementation +- [NGINX](https://www.nginx.com/): Web Server for HTTP, HTTPS, IPv4, IPv6, other services can be forwarded behind NGINX as well +- [fcgiwrap](https://www.nginx.com/resources/wiki/start/topics/examples/fcgiwrap/): Simple FastCGI wrapper for CGI scripts (The project runs as a CGI script) +- [libev](http://software.schmorp.de/pkg/libev.html): Event loop used by [woo](https://github.com/fukamachi/woo) +- [sqlite3](https://www.sqlite.org/index.html): In-memory database store +- [collectd](https://collectd.org/): collectd is a daemon which collects system and application performance metrics periodically and provides mechanisms to store the values in a variety of ways, for example in RRD files. This also nets us [RRDtool](https://oss.oetiker.ch/rrdtool/) which we can use for charts and graphs. +- [ImageMagick](https://www.imagemagick.org/): We use this to generate deck images and other various image manipulations. +- [Ruby](https://www.ruby-lang.org/en/): We use the [Sidekiq](https://sidekiq.org/) job scheduler, which is written in Ruby. + +You may want to set up [cgit](https://git.zx2c4.com/cgit/) git web. + +There is also a `Dockerfile` with a `Makefile`. + +## Author + +_Bubblegumdrop _ + +## Copyright + +Copyright (c) 2024 Bubblegumdrop + +## License + +GPLv3+ + +## Localization Workflow + +`lisp.pot` contains the string to translate that were extracted from +the `.lisp` files. + +`djula.pot` contains the strings to transtlate that were extracted +from the djula templates. + +gettext is the default translation engine. + +### Update Translations + +To build the translations: + + # Extract all {_ ... _} sequences from Djula templates + make locale/templates/LC_MESSAGES/djula.pot + + # Extract all (_ ... _) sequences from LISP code + make locale/templates/LC_MESSAGES/lisp.pot + + # Produce combined project template for translation + make locale/templates/LC_MESSAGES/cl-deck-builder2.pot + + ... make your translation edits to cl-deck-builder2.pot ... + +### Compile Translations + +To Produce the `.mo` files, add your language to `LOCALES` in the +`Makefile` then update the translations with the `tr` target: + + LOCALES := en_US ja_JP + + # Produce the translations + make tr + +The default `LANG` is currently `en_US` in `view.lisp`: + + (defun render (template-path &optional env (lang "en_US")) + "Use Djula to render a template." + (let ((template (gethash template-path *template-registry*))) + (unless template + (setf template (djula:compile-template* (princ-to-string template-path))) + (setf (gethash template-path *template-registry*) template)) + (with-locale (lang) + (apply #'djula:render-template* + template nil + env)))) + +## TODO + +See [todo.md](doc/todo.md) diff --git a/app.lisp b/app.lisp new file mode 100644 index 0000000..cd946f2 --- /dev/null +++ b/app.lisp @@ -0,0 +1,76 @@ +(in-package #:cl-user) + +(defpackage #:cl-deck-builder2.app + (:use #:cl) + (:import-from #:mito-attachment + #:*storage* + #:s3-storage + #:disk-storage + #:disk-storage-mount-path) + (:import-from #:lack.builder + #:builder) + (:import-from #:ppcre + #:scan) + (:import-from #:cl-deck-builder2.web + #:*web* + #:make-chat-server) + (:import-from #:cl-deck-builder2.config + #:config + #:productionp + #:*public-directory* + #:*static-directory*) + (:import-from #:cl-deck-builder2.toolkit + #:git-revision) + (:documentation "The package the app file executes in. Passed to ~CLACK:CLACKUP~ function.")) + +(in-package #:cl-deck-builder2.app) + +(defparameter *git-revision* (git-revision)) + +(setf *storage* + (if (productionp) + ;; Store files in AWS S3 for production environment + (make-instance 's3-storage + :bucket "mito-attachment-example" + :endpoint "s3-ap-northeast-1.amazonaws.com" + :access-key (uiop:getenv "AWS_ACCESS_KEY") + :secret-key (uiop:getenv "AWS_SECRET_KEY")) + ;; Store files in local filesystem for development environment + (make-instance 'disk-storage + :bucket "mito-attachment-example" + :directory (merge-pathnames "attachment" *public-directory*)))) + +(builder + (:static + :path (lambda (path) + (if (ppcre:scan "^(?:/img/|/css/|/js/|/webfonts/|/robot\\.txt$|/favicon\\.(ico|png)|/manifest\\.json$)" path) + path + nil)) + :root *static-directory*) + (:static + :path "/public/" + :root *public-directory*) + (if (productionp) + nil + :accesslog) + (if (getf (config) :error-log) + `(:backtrace + :output ,(getf (config) :error-log)) + nil) + :session + :csrf + (when (typep *storage* 'disk-storage) + `(:mount ,(disk-storage-mount-path *storage*) ,*storage*)) + (:clack-errors :debug t) + (if (productionp) + nil + (lambda (app) + (lambda (env) + (let ((datafly:*trace-sql* t)) + (setf (getf djula:*default-template-arguments* :git-revision) *git-revision* + (getf djula:*default-template-arguments* :server-name) "phntsm.ddns.net") + (funcall app env))))) + (:mount "/label-maker" cl-deck-builder2.web.label-maker:*web*) + (:mount "/tinymce" cl-deck-builder2.web.tinymce:*web*) + (:mount "/chat-server" #'cl-deck-builder2.web.sse:make-chat-server) + *web*) diff --git a/cl-deck-builder2-test.asd b/cl-deck-builder2-test.asd new file mode 100644 index 0000000..a821044 --- /dev/null +++ b/cl-deck-builder2-test.asd @@ -0,0 +1,11 @@ +(asdf:defsystem "cl-deck-builder2-test" + :author "Bubblegumdrop" + :license "Do Not Redistribute" + :depends-on ("cl-deck-builder2" + "rove") + :components ((:module "tests" + :components + ((:file "packages") + (:file "cl-deck-builder2")))) + :description "Test system for cl-deck-builder2" + :perform (asdf:test-op (op c) (uiop:symbol-call :rove :run c))) diff --git a/cl-deck-builder2.asd b/cl-deck-builder2.asd new file mode 100644 index 0000000..6e0a4fc --- /dev/null +++ b/cl-deck-builder2.asd @@ -0,0 +1,250 @@ +;;;; cl-deck-builder2.asd +;;;; +;;;; ASDF System Definition File for "The Deck Builder" Common Lisp Project. +;;;; +;;;; You can read more about ASDF here: +;;;; +;;;; + +;; (require "asdf") ;; for CI + +(pushnew :verbose-no-init *features*) + +(asdf:defsystem "cl-deck-builder2" + :version "0.4.0" + :author "Bubblegumdrop" + :license "Do Not Redistribute" + :depends-on ("clack" + "lack" + "caveman2" + "envy" + "cl-ppcre" + "uiop" + + ;; for @route annotation + ;; "cl-syntax-annot" + + ;; HTML Template + "djula" + "djula-gettext" + "gettext" + + ;; for DB + "mito" + "mito-auth" + "mito-attachment" + "datafly" + "sxql" + "dbd-sqlite3" + + ;; for Models + "assoc-utils" ; AGET is very handy + "cl-csv" ; CSV import + "cl-json" ; JSON import + "local-time" + "split-sequence" + "can" + + ;; Documentation! + ;; "documentation-utils" + ;; "documentation-utils-extensions" + "cl-org-mode" + + ;; More of Shinmeraa's code + "ratify" + "deploy" + + ;; QR Code Generator + "lispqr" + + ;; Download stuff + "trivial-download" + + ;; Error Handling + "clack-errors" + "lack-middleware-clack-errors" + + ;; Better logging + "verbose" + + ;; WebSocket chat server backend + "websocket-driver" + "lack-middleware-csrf" + + "cl-markup" + "hermetic" + + "inferior-shell" + + ;; Background job processing + "psychiq" + + "cl-fad" + "slynk") + :components ((:module "src" + :components + ((:file "main" :depends-on ("config" "view" "db" "draw" "web")) + (:file "config") + (:file "db" :depends-on ("config" "toolkit")) + (:file "view" :depends-on ("config" "i18n")) + (:file "draw" :depends-on ("models")) + (:file "i18n") + (:module "toolkit" + :components + ((:file "packages") + (:file "paths") + (:file "git") + (:file "time") + (:file "money") + (:file "utils"))) + (:module "models" + :components + (;; (:file "toolkit") + (:file "packages") + ;; (:file "model") + (:file "registered-table-mixin") + (:file "attachment") + (:file "category") + (:file "constructed-decks" :depends-on ("ydk" "ygoprodeck-classes" "ygoprodeck-methods" "ygoprodeck-fields")) + (:file "crystal-commerce" :depends-on ("attachment" "ygoprodeck")) + (:file "feedback" :depends-on ("user")) + (:file "label-maker") + (:file "qr-code") + (:file "sqlite-schema") + (:file "user") + (:file "ydk" :depends-on ("ygoprodeck")) + (:file "ygoprodeck") + (:file "ygoprodeck-fields") + (:file "ygoprodeck-classes" :depends-on ("ygoprodeck-fields")) + (:file "ygoprodeck-methods") + (:file "ygoprodeck-cardinfo") + (:file "ygoprodeck-json")) + :depends-on ("db" "toolkit")) + (:module "web" + :components + ((:file "packages") + (:file "setup") + (:file "flash-message") + (:file "params") + (:file "query") + (:file "toolkit") + (:file "index") + (:file "builder" :depends-on ("search")) + (:file "cards") + (:file "constructed-decks") + (:file "category") + (:file "contact") + (:file "decks") + (:file "inventory" :depends-on ("search")) + (:file "qr") + (:file "search") + (:file "sse") + (:file "upload") + (:file "user") + (:file "ydk") + (:file "label-maker" :depends-on ("query")) + (:file "tinymce")) + :depends-on ("db" "i18n" "view" "models" "draw" "toolkit")))) + ;; TODO seeing this all here makes me want to really compress this. + (:module "templates" + :components + ;; Order is important: the ones that extend default.html + ;; must be declared after it, because we compile all of them + ;; at build time. + ((:STATIC-FILE "ydk/index.html") (:STATIC-FILE "user/user-menu-bar.html") + (:STATIC-FILE "user/user-list.html") (:STATIC-FILE "user/register.html") + (:STATIC-FILE "user/login.html") (:STATIC-FILE "user/index.html") + (:STATIC-FILE "user/admin.html") (:STATIC-FILE "upload.html") + (:STATIC-FILE "template.Dockerfile") (:STATIC-FILE "tabs.html") + (:STATIC-FILE "qr.html") (:STATIC-FILE "pages.html") + (:STATIC-FILE "news.html") (:STATIC-FILE "navbar.html") + (:STATIC-FILE "navbar-js.html") (:STATIC-FILE "messages.html") + (:STATIC-FILE "markdown.html") (:STATIC-FILE "layouts/minimal.html") + (:STATIC-FILE "layouts/html-head.html") (:STATIC-FILE "layouts/default.html") + (:STATIC-FILE "latex/default.tpl.tex") + (:STATIC-FILE "latex/ULINE-S-20247.tpl.tex") + (:STATIC-FILE "latex/ULINE-S-20247.tex") + (:STATIC-FILE "latex/Avery-5160.tpl.tex") + (:STATIC-FILE "latex/Avery-5160.tex") (:STATIC-FILE "label-maker.html") + (:STATIC-FILE "kde-team.html") (:STATIC-FILE "inventory/variant-results.html") + (:STATIC-FILE "inventory/search-results.html") + (:STATIC-FILE "inventory/old.html") (:STATIC-FILE "inventory/new.html") + (:STATIC-FILE "inventory/index.html") (:STATIC-FILE "inventory/import.html") + (:STATIC-FILE "inventory/edit.html") (:STATIC-FILE "inventory/base-menu.html") + (:STATIC-FILE "inventory/advanced-search.html") + (:STATIC-FILE "inventory/_view_result.html") + (:STATIC-FILE "inventory/_search_result_th.html") + (:STATIC-FILE "inventory/_new_row.html") + (:STATIC-FILE "inventory/_inventory_variants.html") + (:STATIC-FILE "inventory/_edit_row.html") + (:STATIC-FILE "inventory/_edit_result.html") + (:STATIC-FILE "inventory/_advanced_search_select.html") + (:STATIC-FILE "inventory/_advanced_search_input.html") + (:STATIC-FILE "index.html") (:STATIC-FILE "footer.html") + (:STATIC-FILE "file-js.html") (:STATIC-FILE "docs.md") + (:STATIC-FILE "docs.html") (:STATIC-FILE "decks/search.html") + (:STATIC-FILE "decks/saved-category-list.html") + (:STATIC-FILE "decks/index.html") + (:STATIC-FILE "decks/decks-by-category.html") + (:STATIC-FILE "decks/deck-text-three-column.html") + (:STATIC-FILE "decks/deck-text-textarea.html") + (:STATIC-FILE "decks/deck-text-list.html") + (:STATIC-FILE "decks/deck-text-list-original.html") + (:STATIC-FILE "decks/deck-select.html") + (:STATIC-FILE "decks/deck-menu-bar.html") + (:STATIC-FILE "decks/deck-image-listing.html") + (:STATIC-FILE "decks/deck-html-results.html") + (:STATIC-FILE "decks/deck-html-results-1.html") + (:STATIC-FILE "decks/deck-controls.html") + (:STATIC-FILE "decks/category-select.html") + (:STATIC-FILE "decks/cards-in-decks.html") + (:STATIC-FILE "decks/_field_control_select.html") + (:STATIC-FILE "contact/list.html") (:STATIC-FILE "contact/index.html") + (:STATIC-FILE "contact/admin.html") + (:STATIC-FILE "construct/select-sets.html") + (:STATIC-FILE "construct/pull-menu-bar.html") + (:STATIC-FILE "construct/index.html") (:STATIC-FILE "chat.html") + (:STATIC-FILE "category/index.html") (:STATIC-FILE "category/explain.html") + (:STATIC-FILE "category/child-list.html") + (:STATIC-FILE "category/child-form.html") + (:STATIC-FILE "category/category-menu-bar.html") + (:STATIC-FILE "cards/view.html") (:STATIC-FILE "cards/search-results.html") + (:STATIC-FILE "cards/info.html") (:STATIC-FILE "cards/index.html") + (:STATIC-FILE "cards/cc-item-view.html") + (:STATIC-FILE "cards/cc-item-row.html") + (:STATIC-FILE "cards/_search_result_th.html") + (:STATIC-FILE "cards/_advanced_search_top.html") + (:STATIC-FILE "cards/_advanced_search_select_kind.html") + (:STATIC-FILE "cards/_advanced_search_select.html") + (:STATIC-FILE "cards/_advanced_search_numeric.html") + (:STATIC-FILE "cards/_advanced_search_input_numeric.html") + (:STATIC-FILE "cards/_advanced_search_attrs.html") + (:STATIC-FILE "builder/search-results.html") + (:STATIC-FILE "builder/saved-deck-list.html") + (:STATIC-FILE "builder/saved-category-list.html") + (:STATIC-FILE "builder/index.html") + (:STATIC-FILE "builder/deck-controls.html") + (:STATIC-FILE "builder/current-deck-list.html") + (:STATIC-FILE "builder/base-menu.html") + (:STATIC-FILE "builder/_search_results_th.html") + (:STATIC-FILE "builder/_jquery_droppable.html") + (:STATIC-FILE "builder/_current_deck_list-1.html") + (:STATIC-FILE "builder/_advanced_search_select_kind.html") + (:STATIC-FILE "builder/_advanced_search_select.html") + (:STATIC-FILE "builder/_advanced_search_numeric.html") + (:STATIC-FILE "builder/_advanced_search_input_numeric.html") + (:STATIC-FILE "builder/_advanced_search_attrs.html") + (:STATIC-FILE "_errors/404.html")))) + :description "Deck Builder Project" + + :defsystem-depends-on (:deploy) ;; (ql:quickload "deploy") before + :build-operation "deploy-op" ;; instead of "program-op" + :build-pathname "cl-deck-builder2" + :entry-point "cl-deck-builder2:my/start" + + :in-order-to ((test-op (test-op "cl-deck-builder2-test")))) + +;; Use compression: from 108M, 0.04s startup time to 24M, 0.37s. +#+sb-core-compression +(defmethod asdf:perform ((o asdf:image-op) (c asdf:system)) + (uiop:dump-image (asdf:output-file o c) :executable t :compression t)) diff --git a/cl-deck-builder2.service b/cl-deck-builder2.service new file mode 100644 index 0000000..b2ae006 --- /dev/null +++ b/cl-deck-builder2.service @@ -0,0 +1,15 @@ +[Unit] +Description=Deck Builder Service +After=podman.service +Requires=podman.service + +[Service] +TimeoutStartSec=0 +Restart=always +#ExecStartPre=-/usr/bin/podman stop %n +#ExecStartPre=-/usr/bin/podman rm %n +#ExecStartPre=/usr/bin/podman pull redis +ExecStart=make -C /home/deck/ docker-run + +[Install] +WantedBy=multi-user.target diff --git a/cl-deck-builder2.workers.asd b/cl-deck-builder2.workers.asd new file mode 100644 index 0000000..bb78958 --- /dev/null +++ b/cl-deck-builder2.workers.asd @@ -0,0 +1,68 @@ +(asdf:defsystem "cl-deck-builder2.workers" + :version "0.0.1" + :author "Bubblegumdrop" + :license "Do Not Redistribute" + :depends-on ( + ;; "clack" + ;; "lack" + ;; "caveman2" + ;; "envy" + ;; "cl-ppcre" + ;; "uiop" + + ;; for @route annotation + ;; "cl-syntax-annot" + + ;; HTML Template + ;; "djula" + + ;; for DB + "mito" + "mito-attachment" + "datafly" + "sxql" + + ;; for Models + "assoc-utils" ; AGET is very handy + "cl-csv" ; CSV import + "cl-json" ; JSON import + "cl-pass" ; Password hashing + "local-time" + "split-sequence" + + ;; Documentation! + ;; "documentation-utils" + ;; "documentation-utils-extensions" + ;; "cl-org-mode" + + ;; More of Shinmeraa's code + ;; "ratify" + + ;; QR Code Generator + ;; "lispqr" + + ;; Download stuff + ;; "trivial-download" + + ;; Error Handling + ;; "lack-middleware-clack-errors" + + ;; Better logging + ;; "verbose" + + ;; WebSocket chat server backend + ;; "websocket-driver" + ;; "lack-middleware-csrf" + + ;; "cl-markup" + "hermetic" + + "inferior-shell" + + ;; Background job processing + "psychiq") + :components ((:module "src/workers" + :components + ((:file "main")))) + :description "Deck Builder Project - Background Job Workers" + :in-order-to ((test-op (test-op "cl-deck-builder2.workers-test")))) diff --git a/contrib.sh b/contrib.sh new file mode 100644 index 0000000..836cd02 --- /dev/null +++ b/contrib.sh @@ -0,0 +1,123 @@ +#!/bin/bash + +# Start some stuff: Sidekiq Web UI, collectd web UI, MariaDB container, Redis container. +# +# Looks like shell scripts are also going into here. You may additionally backup_database. +# +# Hey it's starting to turn into a real deploy script! + +set -euox + +DOCKER=podman +MARIADB_IMAGE=localhost/alpine-mariadb +REDIS_IMAGE=localhost/redis-7.2-rc-alpine +SCHEMACRAWLER_DIR=$HOME/schemacrawler-16.20.4-bin + +function message(){ + plus="+" + [[ $1 -ne 0 ]] && plus=- + shift + echo "[${plus}] $@" +} + +# This will probably either go away or be moved to mariadb database as we migrate (eventually) +function backup_database() { + shift + running_container= + if [ $# -eq 0 ] + then + running_container=$(${DOCKER} ps --format '{{.Image}} {{.Names}}' | grep cl-deck-builder2 | awk '{print $2}') + else + running_container="$1" + fi + if [ "x$running_container" = "x" ] + then + message 1 "deck builder container not running?" + else + message 0 "found $running_container" + message 0 "copying database $running_container:/home/quicklisp/quicklisp/local-projects/cl-deck-builder2/deck_builder.sqlite3" + $DOCKER cp "$running_container:/home/quicklisp/quicklisp/local-projects/cl-deck-builder2/deck_builder.sqlite3" \ + ~/sqlite3/$(date '+%Y-%m-%d')-deck_builder.sqlite3 + ls -l ~/sqlite3/$(date '+%Y-%m-%d')-deck_builder.sqlite3 + fi +} + +function psychiq_up(){ + ps -C rackup >/dev/null + if [ $? -ne 0 ] + then + message 0 "Starting Psychiq Web UI" + rackup /home/user/code/cl-deck-builder2/ruby/config.ru & + else + message 1 "Psychiq Web UI already running." + fi +} + +function collectd_up() { + ps -C python3 >/dev/null + if [ $? -ne 0 ] + then + message 0 "Starting collectd Web UI" + pushd /home/user/code/alpine-collectd-web/ + python3 runserver.py & + popd + else + message 1 "collectd Web UI already running." + fi +} + +function mariadb_up (){ + mkdir -p ~/mariadb + $DOCKER ps 2>&1| grep 3306 2>&1>/dev/null + if [ $? -ne 0 ] + then + $DOCKER run --restart always -d -P -p 3306:3306 -v $HOME/mariadb:/var/lib/mysql $MARIADB_IMAGE + else + message 1 "mariadb already running." + fi +} + +function redis_up(){ + mkdir -p ~/redis + $DOCKER ps 2>&1| grep 6379 2>&1>/dev/null + if [ $? -ne 0 ] + then + $DOCKER run --restart always -d -P -p 6379:6379 -v $HOME/redis:/data $REDIS_IMAGE + else + message 1 "redis already running." + fi +} + +function schemacrawler(){ + ORIG_DIR="$(pwd)" + cd $SCHEMACRAWLER_DIR + # Gentoo Strikes Again! + # https://github.com/schemacrawler/SchemaCrawler/issues/394 + _JAVA_OPTIONS=-Djava.io.tmpdir=. \ + bash bin/schemacrawler.sh \ + --user= \ + --password= \ + --database "$ORIG_DIR/deck_builder.sqlite3" \ + --server sqlite \ + --weak-associations=true \ + -i standard \ + -c schema \ + -o ~/www/db.png + + chown :www-data ~/www/db.png +} + +function main(){ + # backup_database + psychiq_up + collectd_up + mariadb_up + redis_up +} + +if [ $# -lt 1 ] +then + message 1 "Usage: $0 [main | backup_database | psychiq_up | collectd_up | mariadb_up | redis_up | schemacrawler]" +else + "$1" "$@" +fi diff --git a/db/file.csv b/db/file.csv new file mode 100644 index 0000000..209b12f --- /dev/null +++ b/db/file.csv @@ -0,0 +1,393 @@ +type,name,tbl_name,rootpage,sql +table,deck_item,deck_item,2,"CREATE TABLE ""deck_item"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""deck_id"" INTEGER NOT NULL, + ""kind"" INTEGER NOT NULL, + ""passcode"" INTEGER NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP +)" +table,sqlite_sequence,sqlite_sequence,3,"CREATE TABLE sqlite_sequence(name,seq)" +table,ygo_info,ygo_info,8,"CREATE TABLE ""ygo_info"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""desc"" STRING NOT NULL, + ""frame_type"" STRING NOT NULL, + ""type"" STRING NOT NULL, + ""passcode"" INTEGER NOT NULL, + ""name"" STRING NOT NULL, + ""race"" STRING NOT NULL, + ""archetype"" STRING, + ""attribute"" STRING, + ""linkmarkers"" STRING, + ""atk"" INTEGER, + ""def"" INTEGER, + ""level"" INTEGER, + ""linkval"" INTEGER, + ""scale"" INTEGER, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP +)" +table,users-feedback,users-feedback,12,"CREATE TABLE ""users-feedback"" ( + ""rowid"" INTEGER PRIMARY KEY, + ""userid"" INTEGER, + ""text"" STRING, + ""created-at"" STRING, + ""updated-at"" STRING +)" +table,ygoprodeck-card-data,ygoprodeck-card-data,13,"CREATE TABLE ""ygoprodeck-card-data"" ( + ""rowid"" INTEGER PRIMARY KEY, + ""passcode"" INTEGER, + ""name"" STRING, + ""type"" STRING, + ""frame-type"" STRING, + ""desc"" STRING, + ""race"" STRING, + ""archetype"" STRING, + ""created-at"" STRING, + ""updated-at"" STRING +)" +table,ygoprodeck-card-sets,ygoprodeck-card-sets,14,"CREATE TABLE ""ygoprodeck-card-sets"" ( + ""rowid"" INTEGER PRIMARY KEY, + ""passcode"" INTEGER, + ""name"" STRING, + ""code"" STRING, + ""rarity"" STRING, + ""rarity-code"" STRING, + ""price"" STRING, + ""created-at"" STRING, + ""updated-at"" STRING +)" +table,attachment,attachment,21,"CREATE TABLE ""attachment"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""file_key"" VARCHAR(255) NOT NULL, + ""content_type"" VARCHAR(255) NOT NULL, + ""file_size"" INTEGER NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP, + UNIQUE (""file_key"") +)" +index,sqlite_autoindex_attachment_1,attachment,22, +table,ydk_deck,ydk_deck,23,"CREATE TABLE ""ydk_deck"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""category_id"" INTEGER, + ""created_by"" STRING NOT NULL, + ""name"" STRING NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP, + UNIQUE (""name"") +)" +index,sqlite_autoindex_ydk_deck_1,ydk_deck,24, +table,category,category,27,"CREATE TABLE ""category"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""name"" STRING NOT NULL, + ""left"" INTEGER NOT NULL, + ""right"" INTEGER NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP +)" +table,cc_item,cc_item,2939,"CREATE TABLE ""cc_item"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""product_name"" STRING NOT NULL, + ""category"" STRING NOT NULL, + ""wishlists"" INTEGER NOT NULL, + ""buy_price"" REAL NOT NULL, + ""sell_price"" REAL NOT NULL, + ""url"" STRING, + ""barcode"" STRING, + ""manufacturer_sku"" STRING, + ""amazon_asin"" STRING, + ""msrp"" REAL, + ""brand"" STRING, + ""weight"" REAL NOT NULL, + ""description"" STRING, + ""max_qty"" INTEGER, + ""total_qty"" INTEGER NOT NULL, + ""domestic_only"" INTEGER NOT NULL, + ""tax_exempt"" INTEGER NOT NULL, + ""name"" STRING, + ""code"" STRING, + ""rarity"" STRING, + ""edition"" STRING, + ""passcode"" INTEGER, + ""condition"" STRING NOT NULL, + ""language"" STRING NOT NULL, + ""opt_qty"" INTEGER NOT NULL, + ""reserved_qty"" INTEGER NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP +)" +table,ygo_misc,ygo_misc,31807,"CREATE TABLE ""ygo_misc"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""passcode"" INTEGER NOT NULL, + ""beta_name"" INTEGER NOT NULL, + ""views"" INTEGER NOT NULL, + ""viewsweek"" INTEGER NOT NULL, + ""upvotes"" INTEGER NOT NULL, + ""downvotes"" INTEGER NOT NULL, + ""tcg_date"" STRING NOT NULL, + ""ocg_date"" STRING NOT NULL, + ""konami_id"" INTEGER NOT NULL, + ""has_effect"" INTEGER NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP +)" +table,feedback,feedback,7,"CREATE TABLE ""feedback"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""body"" STRING NOT NULL, + ""user_id"" INTEGER NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP +)" +table,constructed_deck_item,constructed_deck_item,30965,"CREATE TABLE ""constructed_deck_item"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""passcode_id"" INTEGER NOT NULL, + ""name_id"" INTEGER NOT NULL, + ""code_id"" INTEGER NOT NULL, + ""rarity_id"" INTEGER NOT NULL, + ""edition_id"" INTEGER NOT NULL, + ""price"" INTEGER NOT NULL, + ""origin_id_id"" INTEGER NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP +)" +table,constructed_decks,constructed_decks,30966,"CREATE TABLE ""constructed_decks"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""name"" STRING NOT NULL, + ""passcode_id"" INTEGER NOT NULL, + ""sell_price"" INTEGER NOT NULL, + ""origin_id_id"" INTEGER NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP +)" +table,ygo_cards_misc_info,ygo_cards_misc_info,2601,"CREATE TABLE ""ygo_cards_misc_info"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""passcode_id"" INTEGER NOT NULL, + ""views"" INTEGER NOT NULL, + ""viewsweek"" INTEGER NOT NULL, + ""upvotes"" INTEGER NOT NULL, + ""downvotes"" INTEGER NOT NULL, + ""beta_id"" INTEGER, + ""beta_name_id"" INTEGER, + ""staple"" INTEGER, + ""konami_id"" INTEGER NOT NULL, + ""treated_as"" INTEGER, + ""has_effect"" INTEGER, + ""question_atk"" INTEGER, + ""question_def"" INTEGER, + ""tcg_date"" TIMESTAMP, + ""ocg_date"" TIMESTAMP, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP +)" +table,ygo_set_rarity_code_abbr,ygo_set_rarity_code_abbr,1758,"CREATE TABLE ""ygo_set_rarity_code_abbr"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""code"" STRING NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP, + UNIQUE (""code"") +)" +index,sqlite_autoindex_ygo_set_rarity_code_abbr_1,ygo_set_rarity_code_abbr,1759, +table,get_column_real_type,get_column_real_type,4,"CREATE TABLE get_column_real_type ( + test TIMESTAMP +)" +table,ygo_card_name,ygo_card_name,17,"CREATE TABLE ""ygo_card_name"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""name"" STRING NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP, + UNIQUE (""name"") +)" +index,sqlite_autoindex_ygo_card_name_1,ygo_card_name,1501, +table,ygo_card_type,ygo_card_type,1512,"CREATE TABLE ""ygo_card_type"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""card_type"" STRING NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP, + UNIQUE (""card_type"") +)" +index,sqlite_autoindex_ygo_card_type_1,ygo_card_type,1515, +table,ygo_card_frame_type,ygo_card_frame_type,1517,"CREATE TABLE ""ygo_card_frame_type"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""frame_type"" STRING NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP, + UNIQUE (""frame_type"") +)" +index,sqlite_autoindex_ygo_card_frame_type_1,ygo_card_frame_type,1539, +table,ygo_card_race,ygo_card_race,1541,"CREATE TABLE ""ygo_card_race"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""race"" STRING NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP, + UNIQUE (""race"") +)" +index,sqlite_autoindex_ygo_card_race_1,ygo_card_race,1544, +table,ygo_card_archetype,ygo_card_archetype,1554,"CREATE TABLE ""ygo_card_archetype"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""archetype"" STRING NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP, + UNIQUE (""archetype"") +)" +index,sqlite_autoindex_ygo_card_archetype_1,ygo_card_archetype,1562, +table,ygo_card_attribute,ygo_card_attribute,1566,"CREATE TABLE ""ygo_card_attribute"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""attribute"" STRING NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP, + UNIQUE (""attribute"") +)" +index,sqlite_autoindex_ygo_card_attribute_1,ygo_card_attribute,1567, +table,ygo_card,ygo_card,1571,"CREATE TABLE ""ygo_card"" ( + ""id"" INTEGER NOT NULL PRIMARY KEY, + ""name_id"" INTEGER NOT NULL, + ""desc"" STRING NOT NULL, + ""archetype_id"" INTEGER, + ""attribute_id"" INTEGER, + ""atk"" INTEGER, + ""def"" INTEGER, + ""scale"" INTEGER, + ""level"" INTEGER, + ""frame_type_id"" INTEGER NOT NULL, + ""race_id"" INTEGER NOT NULL, + ""card_type_id"" INTEGER NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP +)" +table,ygo_card_misc_info,ygo_card_misc_info,1576,"CREATE TABLE ""ygo_card_misc_info"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""passcode_id"" INTEGER NOT NULL, + ""views"" INTEGER NOT NULL, + ""viewsweek"" INTEGER NOT NULL, + ""upvotes"" INTEGER NOT NULL, + ""downvotes"" INTEGER NOT NULL, + ""beta_id"" INTEGER, + ""beta_name_id"" INTEGER, + ""staple"" INTEGER, + ""konami_id"" INTEGER NOT NULL, + ""treated_as_id"" INTEGER, + ""has_effect"" INTEGER, + ""question_atk"" INTEGER, + ""question_def"" INTEGER, + ""tcg_date"" TIMESTAMP, + ""ocg_date"" TIMESTAMP, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP +)" +table,ygo_set_name,ygo_set_name,1583,"CREATE TABLE ""ygo_set_name"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""set_name"" STRING NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP, + UNIQUE (""set_name"") +)" +index,sqlite_autoindex_ygo_set_name_1,ygo_set_name,1585, +table,ygo_set_code,ygo_set_code,1590,"CREATE TABLE ""ygo_set_code"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""set_code"" STRING NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP, + UNIQUE (""set_code"") +)" +index,sqlite_autoindex_ygo_set_code_1,ygo_set_code,1591, +table,ygo_set_rarity,ygo_set_rarity,1592,"CREATE TABLE ""ygo_set_rarity"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""rarity"" STRING NOT NULL, + ""code"" STRING NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP +)" +table,ygo_set_edition,ygo_set_edition,1594,"CREATE TABLE ""ygo_set_edition"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""set_edition"" STRING NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP, + UNIQUE (""set_edition"") +)" +index,sqlite_autoindex_ygo_set_edition_1,ygo_set_edition,1596, +table,ygo_linkmarker_name,ygo_linkmarker_name,1600,"CREATE TABLE ""ygo_linkmarker_name"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""name"" STRING NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP +)" +table,ygo_linkmarker,ygo_linkmarker,1601,"CREATE TABLE ""ygo_linkmarker"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""passcode_id"" INTEGER NOT NULL, + ""bottom_id"" INTEGER, + ""bottom_left_id"" INTEGER, + ""bottom_right_id"" INTEGER, + ""left_id"" INTEGER, + ""right_id"" INTEGER, + ""top_id"" INTEGER, + ""top_left_id"" INTEGER, + ""top_right_id"" INTEGER, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP +)" +table,ygo_format_name,ygo_format_name,1603,"CREATE TABLE ""ygo_format_name"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""name"" STRING NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP +)" +table,ygo_format,ygo_format,1613,"CREATE TABLE ""ygo_format"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""passcode_id"" INTEGER, + ""common_charity_id"" INTEGER, + ""duel_links_id"" INTEGER, + ""edison_id"" INTEGER, + ""goat_id"" INTEGER, + ""ocg_id"" INTEGER, + ""ocg_goat_id"" INTEGER, + ""speed_duel_id"" INTEGER, + ""tcg_id"" INTEGER, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP +)" +table,ygo_banlist_name,ygo_banlist_name,1620,"CREATE TABLE ""ygo_banlist_name"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""name"" STRING NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP +)" +table,ygo_banlist,ygo_banlist,1624,"CREATE TABLE ""ygo_banlist"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""passcode_id"" INTEGER NOT NULL, + ""ban_goat_id"" INTEGER, + ""ban_ocg_id"" INTEGER, + ""ban_tcg_id"" INTEGER, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP, + UNIQUE (""passcode_id"") +)" +index,sqlite_autoindex_ygo_banlist_1,ygo_banlist,1625, +table,ygo_alternative_artwork,ygo_alternative_artwork,1629,"CREATE TABLE ""ygo_alternative_artwork"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""passcode_id"" INTEGER NOT NULL, + ""alternate_id"" INTEGER NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP +)" +table,ygo_price,ygo_price,1632,"CREATE TABLE ""ygo_price"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""passcode_id"" INTEGER NOT NULL, + ""cardmarket_price"" INTEGER NOT NULL, + ""tcgplayer_price"" INTEGER NOT NULL, + ""ebay_price"" INTEGER NOT NULL, + ""amazon_price"" INTEGER NOT NULL, + ""coolstuffinc_price"" INTEGER NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP +)" +table,ygo_set,ygo_set,1597,"CREATE TABLE ""ygo_set"" ( + ""id"" INTEGER PRIMARY KEY AUTOINCREMENT, + ""passcode_id"" INTEGER NOT NULL, + ""name_id"" INTEGER NOT NULL, + ""code_id"" INTEGER NOT NULL, + ""rarity_id"" INTEGER NOT NULL, + ""edition_id"" INTEGER NOT NULL, + ""price"" INTEGER NOT NULL, + ""created_at"" TIMESTAMP, + ""updated_at"" TIMESTAMP +)" diff --git a/db/schema.sql b/db/schema.sql new file mode 100644 index 0000000..dd04ba5 --- /dev/null +++ b/db/schema.sql @@ -0,0 +1,421 @@ +CREATE TABLE feedback ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id INTEGER NOT NULL, + body TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE user_role ( + user_id INTEGER NOT NULL, + role_name VARCHAR(64) NOT NULL, + PRIMARY KEY (user_id, role_name) +); +CREATE TABLE role ( + name VARCHAR(64) NOT NULL, + PRIMARY KEY (name) +); +CREATE TABLE user ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + email TEXT NOT NULL, + password_hash CHAR(64) NOT NULL, + password_salt BINARY(20) NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP, + UNIQUE (email) +); +CREATE TABLE ygo_cc_item ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + item_id INTEGER NOT NULL, + variant_id INTEGER NOT NULL, + qty INTEGER NOT NULL, + opt_qty INTEGER NOT NULL, + buy_price INTEGER NOT NULL, + sell_price INTEGER NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE cc_item ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + category TEXT NOT NULL, + total_qty INTEGER NOT NULL, + wishlists INTEGER NOT NULL, + buy_price INTEGER NOT NULL, + sell_price INTEGER NOT NULL, + url TEXT, + barcode TEXT, + manufacturer_sku TEXT, + amazon_asin TEXT, + msrp INTEGER, + brand TEXT, + weight TEXT NOT NULL, + description TEXT, + max_qty INTEGER, + domestic_only INTEGER NOT NULL, + tax_exempt INTEGER NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE sold_decks ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + category_id INTEGER, + created_by TEXT NOT NULL, + sell_price INTEGER, + ydk_deck_id INTEGER NOT NULL, + deck_sold INTEGER NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE constructed_deck ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + category_id INTEGER, + created_by TEXT NOT NULL, + sell_price INTEGER, + ydk_deck_id INTEGER NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE constructed_deck_item ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + ygo_card_id INTEGER NOT NULL, + deck_id INTEGER NOT NULL, + sell_price INTEGER, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE ygo_set_item ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + item_id INTEGER NOT NULL, + variant_id INTEGER NOT NULL, + qty INTEGER NOT NULL, + opt_qty INTEGER NOT NULL, + buy_price INTEGER NOT NULL, + sell_price INTEGER NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE ygo_price ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + passcode_id INTEGER NOT NULL, + cardmarket_price INTEGER NOT NULL, + tcgplayer_price INTEGER NOT NULL, + ebay_price INTEGER NOT NULL, + amazon_price INTEGER NOT NULL, + coolstuffinc_price INTEGER NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE ygo_alternative_artwork ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + passcode_id INTEGER NOT NULL, + alternate_id INTEGER NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE ygo_banlist ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + passcode_id INTEGER NOT NULL, + ban_goat_id INTEGER, + ban_ocg_id INTEGER, + ban_tcg_id INTEGER, + created_at TIMESTAMP, + updated_at TIMESTAMP, + UNIQUE (passcode_id) +); +CREATE TABLE ygo_format ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + passcode_id INTEGER, + common_charity_id INTEGER, + duel_links_id INTEGER, + edison_id INTEGER, + goat_id INTEGER, + ocg_id INTEGER, + ocg_goat_id INTEGER, + speed_duel_id INTEGER, + tcg_id INTEGER, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE ygo_linkmarker ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + passcode_id INTEGER NOT NULL, + bottom_id INTEGER, + bottom_left_id INTEGER, + bottom_right_id INTEGER, + left_id INTEGER, + right_id INTEGER, + top_id INTEGER, + top_left_id INTEGER, + top_right_id INTEGER, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE ygo_set ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + passcode_id INTEGER NOT NULL, + name_id INTEGER NOT NULL, + code_id INTEGER NOT NULL, + rarity_id INTEGER NOT NULL, + rarity_code_id INTEGER NOT NULL, + edition_id INTEGER NOT NULL, + url TEXT NOT NULL, + price INTEGER NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE ygo_set_edition ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP, + UNIQUE (name) +); +CREATE TABLE ygo_set_rarity ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP, + UNIQUE (name) +); +CREATE TABLE ygo_set_code ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP, + UNIQUE (name) +); +CREATE TABLE ygo_set_name ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP, + UNIQUE (name) +); +CREATE TABLE ygo_card_misc_info ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + passcode_id INTEGER NOT NULL, + views INTEGER NOT NULL, + viewsweek INTEGER NOT NULL, + upvotes INTEGER NOT NULL, + downvotes INTEGER NOT NULL, + beta_id INTEGER, + beta_name_id INTEGER, + staple INTEGER, + konami_id INTEGER NOT NULL, + treated_as_id INTEGER, + has_effect INTEGER, + question_atk INTEGER, + question_def INTEGER, + tcg_date TIMESTAMP, + ocg_date TIMESTAMP, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE ygo_card ( + id INTEGER NOT NULL PRIMARY KEY, + name TEXT NOT NULL, + desc TEXT NOT NULL, + archetype_id INTEGER, + attribute_id INTEGER, + atk INTEGER, + def INTEGER, + scale INTEGER, + level INTEGER, + frame_type_id INTEGER NOT NULL, + race_id INTEGER NOT NULL, + card_type_id INTEGER NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE ygo_card_attribute ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP, + UNIQUE (name) +); +CREATE TABLE ygo_card_archetype ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP, + UNIQUE (name) +); +CREATE TABLE ygo_card_race ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP, + UNIQUE (name) +); +CREATE TABLE ygo_card_frame_type ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP, + UNIQUE (name) +); +CREATE TABLE ygo_card_type ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP, + UNIQUE (name) +); +CREATE TABLE ygo_card_name ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP, + UNIQUE (name) +); +CREATE TABLE ygo_name_mixin ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP, + UNIQUE (name) +); +CREATE TABLE ygo_set_rarity_code ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP, + UNIQUE (name) +); +CREATE TABLE ygo_linkmarker_name ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE ygo_format_name ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE ygo_banlist_name ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE variant_language ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE variant_condition ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE variant ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE ydk_deck ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + category_id INTEGER, + created_by TEXT NOT NULL, + name TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP, + UNIQUE (name) +); +CREATE TABLE deck_item ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + deck_id INTEGER NOT NULL, + kind INTEGER NOT NULL, + passcode INTEGER NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE ygo_format ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + passcode INTEGER NOT NULL, + format TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE ygo_misc ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + passcode INTEGER NOT NULL, + beta_name INTEGER NOT NULL, + views INTEGER NOT NULL, + viewsweek INTEGER NOT NULL, + upvotes INTEGER NOT NULL, + downvotes INTEGER NOT NULL, + tcg_date TEXT NOT NULL, + ocg_date TEXT NOT NULL, + konami_id INTEGER NOT NULL, + has_effect INTEGER NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE ygo_price ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + passcode INTEGER NOT NULL, + cardmarket REAL NOT NULL, + tcgplayer REAL NOT NULL, + ebay REAL NOT NULL, + amazon REAL NOT NULL, + coolstuffinc REAL NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE ygo_set ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + code TEXT NOT NULL, + name TEXT NOT NULL, + passcode INTEGER NOT NULL, + price REAL NOT NULL, + rarity TEXT NOT NULL, + rarity_code TEXT NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE ygo_info ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + desc TEXT NOT NULL, + frame_type TEXT NOT NULL, + type TEXT NOT NULL, + passcode INTEGER NOT NULL, + name TEXT NOT NULL, + race TEXT NOT NULL, + archetype TEXT, + attribute TEXT, + linkmarkers TEXT, + atk INTEGER, + def INTEGER, + level INTEGER, + linkval INTEGER, + scale INTEGER, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE category ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + left INTEGER NOT NULL, + right INTEGER NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP +); +CREATE TABLE attachment ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + file_key VARCHAR(255) NOT NULL, + content_type VARCHAR(255) NOT NULL, + file_size INTEGER NOT NULL, + created_at TIMESTAMP, + updated_at TIMESTAMP, + UNIQUE (file_key) +); \ No newline at end of file diff --git a/doc/about.md b/doc/about.md new file mode 100644 index 0000000..8ff27ed --- /dev/null +++ b/doc/about.md @@ -0,0 +1,315 @@ +# What it is + +***Note:** Since the application is still in development, it is common +for components to be unavailable, unresponsive, or outright +unusable. If you're able to, please [submit a message](/contact) with +the text of the page with Copy/Paste (Ctrl+A, Ctrl+C, Ctrl+V) and any +additional information.* + +**cl-deck-builder2** is really three things: + +- [Inventory Management](#inventory) +- [Deck Builder](#builder) +- [Unifying User Interface](#ui) + +This application merges these things into a web interface where you +can create, modify, and update decks, pricing, and inventory data. + +It is a web app written in [Common Lisp](https://lisp-lang.org/learn/first-steps) +using [Caveman2](https://github.com/fukamachi/caveman). + +## Inventory Management + +The inventory manager is located here: [/cards](/cards). + +**cl-deck-builder2** aims to suppliment Crystal Commerce Product +Manager tools. + +The original intent was to allow CSV upload of Product Names from +Crystal Commerce. This proved to be unnecessary, as YGOProDeck has all +of the information in the `card_sets` arrays for each card. + +The Inventory editor has been superseded by the YGOProDeck editor. + +The CSV components and all of the Crystal Commerce code is in +maintenance mode, and due to be removed, as there is no way to access +or update this information currently. + +### How To Use It + +Currently the following features are supported: + +- Partial List of Inventory Items: [Inventory List](/cards) + +- Clicking on the card image will take you to the Inventory for that card + +- Each Card has a `YGO-SET` associated with it, and each `YGO-SET` has + one of five `VARIANT-CONDITION` associated with that. The two + together create a `YGO-SET-ITEM` which is where the inventory and + pricing information is contained. + +- The information displayed is: `Card Name - Set Code - Set Edition - Set Rarity - Set Price` + +- Clicking the Gear displays the `YGO-SET-ITEM` for this particular card. + +- Editing of individual inventory items: [Edit #1](/cards/1/view) + +- Extraction of additional data on import: exact card name, set + Code, Rarity, and Edition. + +- Import of YGOProDeck Extra data: passcodes and linked images based + on passcodes + +## Deck Builder + +The deck builder is located here: [/builder](/builder). + +The Deck Builder component currently supports searching by full card +name name, e.g. `Magician of Faith`. Any text matching this pattern +entered into the Deck List box will return a list of matching results. + +Currently, there are approximately 12000 entries in the database. This +list came from the YGOProDeck API. + +### How To Use It + +Simply paste a list of matching cards into the list. + +YGOProDeck Decks with extension `.ydk` can be uploaded with an +incomplete public interface which can be found at [/ydk/](/ydk). + +## User Interface + +The user interface is a [Caveman2](https://github.com/fukamachi/caveman) +web app with Common Lisp back-end. All of the things that can be done on +the web front-end have supporting code in the CL back-end. You may load +the source code into your editor and mess around with card information +yourself. + +### How To Use It + +You're using it right now! + +## Source Code + +The source code is available [here](http://[2601:198:100:1261:d250:99ff:fe2e:566a]/git/). + +# Completed Feature List + +## Categories + +We're using the [Nested Set Model](https://en.wikipedia.org/wiki/Nested_set_model#Example). + +You may create Parent Nodes (Left) and Child Nodes (Right). It needs a lot of work and is pretty SQL heavy. + +## Sort By Many Fields + +When searching for results, we try to support "Not Just Alphabetical," +e.g. more than alphabetical sort. You may sort by Qty, Category, Race, +Type, Card Text... + +Some of these aren't actually implemented because it's quite a bit of +work. But the majority of the sort patterns are there. + +## Deck Constraints + +The constraints placed on a deck during construction at the `/builder` +resource are kind-of arbitrary. Here is the breakdown. + +First of all, at the database level, there are no restrictions on a +deck. See [here](https://www.formatlibrary.com/decktypes/inzektor?format=ravine_ruler) +for an example. You will notice in the "Popular Extra Deck Cards" area +there are *20* cards. You may download the `.ydk` file from the +`Download` button at the top. If you import this deck into the app, it +will accept it as is. You will end up with an Extra Deck with 20 cards +in it. This is intended. + +You may also notice, that, by design, when you create a new deck, +there will be zero cards in it. This is allowed as well. + +However, if you continue to construct a deck, you will eventually be +constrained to 60 cards in your main deck, as well as 15 cards in +extra and side decks. There is no way to prevent this limiting from +occurring. + +Ideally, I would like to have a way to switch between "free builder" +and "constrained builder." A problem thus far has been "Where does the +constraint checking happen?" And the current solution lies in the way +the app is structured. + +So if you imagine each deck you construct as a template, then the deck +builder is really a template constructor. There is a queue of Saved +Deck Configurations, which can be categorized, with the +[Categories](#categories) feature above. + +- Main deck max cards 60 +- Side Deck max cards 15 +- Extra Deck max cards 15 + +As it stands, these constraints are hard coded. I'm not sure how I would +implement this, but if I were to, it would be something like, setting +a cookie and doing constraint checking in-line with some kind of CLOS +object. + +### Card Priority + +Cards will be added in this order: + +- Drag and drop: the card goes where you dropped it, provided the above numeric constraints are met. +- Right click: the card is added at the "end" of the deck list, in + this order: main deck, extra deck, side deck, trying to meet the + above numeric constraints. + +Following this, when you save a deck, a priority number is assigned to +the card as follows: + +- "normal" 0 +- "effect" 1 +- "ritual" 2 +- "fusion" 3 +- "link" 4 +- "skill" 5 +- "synchro" 6 +- "token" 7 +- "xyz" 8 +- "spell" 9 +- "trap" 10 +- "effect_pendulum" 11 +- "fusion_pendulum" 12 +- "normal_pendulum" 13 +- "ritual_pendulum" 14 +- "synchro_pendulum" 15 +- "xyz_pendulum" 16 +- Everything Else 17 + +Lower numbers get put "earlier" in the deck listing. The next time you +load the deck it will be sorted in this order. + +## User Profiles + +You may currently register, login, logout, view the user list. This +code has hardly been touched since it was implemented. If I spent more +time working on the user code, I could also implement the "free +builder" toggle system. + +The web framework system we're using gives us access to request and +session information, and we can store cookies. There is also a +database extension for managing all of this information persistently +in a database. Our current database model is very simple. There is a +user, with a password, and some metadata. + +We currently hash passwords, as well. So your passwords are stored +securely. You currently may not change your password. + +When you register an account we ask for an email. We currently do +nothing with this. An email server would take additional time to +configure. A rudimentary setup would most likely be caught in your +spam filters. This also highlights another issue with the app. We don't +currently have a domain name. But that is another topic. + +### Trade Between Profiles + +Theoretically this is no different than assigning a `category_id` to a +`ydk_deck`. Simply add a `user_id` field to indicate the user which +created the deck. However, this is not implemented, because I have not +spent the required time looking at user management, as stated above. + +## Charts / Metrics + +We have rudimentary charts and metrics provided by +[RRDtool](https://oss.oetiker.ch/rrdtool/). These charts are just host +information. We can feed it all kinds of data. It will take time to +research the data format it ingests and how to produce a chart. + +I'm not sure if Crystal Commerce offers pricing or inventory charts or metrics. + +## Picture of Finalized Deck + +We use [ImageMagick](https://www.imagemagick.org/) to generate deck +images and other various image manipulations. We have complete control +over the process. Currently output is very rudimentary. However I have +complete control over the pipeline, and at this stage, more time could +be spent developing this pipeline. It is currently sufficient for our +purposes. + +The output is currently four static images, the main deck, extra, and +side decks, then a concatenation of the three images. Additionally, we +output the intermediate concatenation images as well. + +## Different Card Games + +This is possible, all of the application is currently hard-coded to +use Yu-Gi-Oh!. It would take a quite a bit of time to re-factor all of +the routes to handle this scenario instead of possibly just running +multiple copies of the app, or having dedicated instances of the app +connected to dedicated database back-ends. + +Regardless, currently we only support Yu-Gi-Oh!. If more work were +done on the User component, I could make it configurable as a cookie. + +## Builder Controls + +Click on a card in the search results to see its information (card text, ATK, DEF, ...). + +### Advanced Search + +In the Advanced Search menu you may search by card type, e.g. `frame_type` => `trap` will show you all trap cards. + +## Decks Overview + +There is currently a rudimentary decks overview page. + +## Constructed Deck Workflow + +The workflow for constructing decks is as follows: + +1. Create deck of cards. Currently we select from all cards. Maybe we + should just select cards from inventory. The majority of this + functionality in place and isn't expected to change. A deck will + always just be a list of cards plus metadata. + +2. The deck of cards has metadata about author, name of deck, time of + creation. The main content of the deck is three lists, comprising + the main, extra, and side decks. This information is not expected + to change in the future. Decks created by a particular user for + example. The underlying metadata representation is what's being + worked on. Currently each item in the database has all information + duplicated from the rest of the database. Changing the price for + one card changes the price for only that one card matching that row + in the database. There will be additional tables to store pricing + information in the next step. + +3. On the Deck Overview page, selecting "Pull Deck" will decrease the + inventory of the lowest priced card in inventory by one for every + card in the deck. This is like "add to cart" in an online shopping + platform, with additional inventory keeping. This is analogous to + the deck construction step, except instead of selecting cards to be + put into a deck, that information is provided prior, and we use + that list of information to construct secondary lists. + +4. On the pulled deck page, for every card in the deck, you will be + able to select cards by edition, condition, and rarity of every + card in the inventory matching that card's passcode. I can + conceive a very simple concept where you attempt to check out, and + then are returned with error messages saying which items had + errors. This is the current approach. + +5. There will be an intermediate stage. Once there is enough inventory + and the deck is "pulled" it will enter an area where each + individual card will be selected. e.g. selecting the rarity or set + of a particular card in each deck. + +6. Once all "errors" are resolved (banlists, constraints, etc), the + "pulled" deck will allow you to "construct" it, which will finalize + the state of this pulled deck in the database, moving it to another + table, the list of decks for sale. + +7. The list of decks for sale is just pulled, constructed decks with + pricing information attached and whether or not it was sold and + what price it was sold at and when. + +## Formats + +It appears that I began working on format integration from +YGOProDeck. I have not found a way to integrate this information into +the builder yet. diff --git a/doc/flowcharts/card-doc.dot b/doc/flowcharts/card-doc.dot new file mode 100644 index 0000000..8f0d444 --- /dev/null +++ b/doc/flowcharts/card-doc.dot @@ -0,0 +1,40 @@ +digraph G { + fontname="Helvetica,Arial,sans-serif" + edge [fontname="Helvetica,Arial,sans-serif"] + node [fontname="Helvetica,Arial,sans-serif"]; + + subgraph cluster_0 { + style=filled; + color=lightgrey; + node [style=filled,color=white]; + "YGO-SET-PASSCODE" -> "YGO-SET-ID"; + label = "YGO-SET"; + } + + subgraph cluster_1 { + node [style=filled]; + label = "YGO-CARD"; + "YGO-CARD-PASSCODE"; + color=blue; + } + + start -> "Mystic Tomato" -> 83011278; + + 83011278 -> "YGO-CARD-PASSCODE"; + 83011278 -> "YGO-SET-PASSCODE"; + + "YGO-CARD-PASSCODE" -> "YGO-SET-PASSCODE"; + "YGO-SET-PASSCODE" -> "YGO-CARD-PASSCODE"; + + // "YGO-CARD-PASSCODE" -> end; + // "YGO-SET-PASSCODE" -> end; + + 83011277 -> "YGO-ALTERNATE-ID" -> "YGO-CARD-PASSCODE"; + "VARIANT-CONDITION" -> "YGO-SET-ITEM"; + "YGO-SET-ID" -> "YGO-SET-ITEM"; + + "YGO-SET-ITEM" -> end; + + start [shape=Mdiamond]; + end [shape=Msquare]; +} diff --git a/doc/flowcharts/card-doc.png b/doc/flowcharts/card-doc.png new file mode 100644 index 0000000000000000000000000000000000000000..80327521c1bc6b9c1b9ac0b63c0d4373f4de4dfa GIT binary patch literal 68508 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 a1 -> a2 -> a3; + label = "process #1"; + } + + subgraph cluster_1 { + node [style=filled]; + b0 -> b1 -> b2 -> b3; + label = "process #2"; + color=blue + } + start -> a0; + start -> b0; + a1 -> b3; + b2 -> a3; + a3 -> a0; + a3 -> end; + b3 -> end; + + start [shape=Mdiamond]; + end [shape=Msquare]; +} diff --git a/doc/flowcharts/constructed-deck-doc.dot b/doc/flowcharts/constructed-deck-doc.dot new file mode 100644 index 0000000..34ba35a --- /dev/null +++ b/doc/flowcharts/constructed-deck-doc.dot @@ -0,0 +1,71 @@ +digraph G { + fontname="Helvetica,Arial,sans-serif" + node [fontname="Helvetica,Arial,sans-serif"] + edge [fontname="Helvetica,Arial,sans-serif"] + + subgraph cluster_0 { + style=filled; + color=goldenrod3; + node [style=filled,color=white]; + ydk_main [label="MAIN-DECK"]; + ydk_side [label="SIDE-DECK"]; + ydk_extra [label="EXTRA-DECK"]; + label = "YDK (Dragon Turbo)"; + labeljust=r; + } + + subgraph cluster_1 { + style=filled; + color=palegreen; + node [style=filled,color=white]; + ydk_deck_item [label="..."]; + ydk_deck_item_1 [label="YDK-DECK-ITEM"]; + ydk_deck_item_2 [label="..."]; + ydk_deck_item -> ydk_deck_item_1 -> ydk_deck_item_2; + label="YDK-DECK"; + labeljust=l; + } + + subgraph cluster_2 { + style=filled; + color=lightcoral; + node [style=filled,color=white]; + constructed_deck_item [label="..."]; + constructed_deck_item_1 [label="CONSTRUCTED-DECK-ITEM"]; + constructed_deck_item_2 [label="..."]; + constructed_deck_item -> constructed_deck_item_1 -> constructed_deck_item_2; + ydk_deck_item -> constructed_deck_item; + label="CONSTRUCTED-DECK"; + labeljust=r; + } + + ygo_alternate_id [label="YGO-ALTERNATE-ID"]; + ygo_card_passcode [label="YGO-CARD-PASSCODE"]; + variant_condition [label="VARIANT-CONDITION"]; + ygo_set [label="YGO-SET"]; + ygo_set_item [label="YGO-SET-ITEM"]; + + ydk_main -> "Mystic Tomato" -> 83011278; + ydk_extra -> "Mystic Tomato"; + + 83011278 -> ygo_card_passcode; + + ygo_card_passcode -> ygo_set; + ygo_card_passcode -> ydk_deck_item; + ygo_card_passcode -> constructed_deck_item; + ygo_set -> ygo_set_item; + ygo_set_item -> constructed_deck_item [ltail=cluster_2]; + + ydk_side -> 83011277 -> ygo_alternate_id -> ygo_card_passcode; + variant_condition -> ygo_set_item; + + // "Item 1" -> "Item 3" [ltail=cluster_0 lhead=cluster_1]; + start -> "Dragon Turbo"; + "Dragon Turbo" -> ydk_main [lhead=cluster_0]; + // ydk_main -> ydk [ltail=cluster_0]; + + constructed_deck_item_2 -> end; + + start [shape=Mdiamond]; + end [shape=Msquare]; +} diff --git a/doc/flowcharts/constructed-deck-doc.png b/doc/flowcharts/constructed-deck-doc.png new file mode 100644 index 0000000000000000000000000000000000000000..a13aad08967377f0d6a1d1291de337888dc138ea GIT binary patch literal 119301 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

K`bJ**FB#m46KD}V)E?85}gj!zt7G#JZE%% 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 literal 0 HcmV?d00001 diff --git a/doc/label-maker.md b/doc/label-maker.md new file mode 100644 index 0000000..d403091 --- /dev/null +++ b/doc/label-maker.md @@ -0,0 +1,6 @@ +1. Download the [LabelMaker.csv](/public/LabelMaker.csv) template. +2. **Import** Character Set: UTF-8; **Separator Options** Separated By: Comma. +3. Edit the **Description**, **Price** and **Bar Code** columns. + The **Label No.** column does nothing and is ignored. +4. Be sure to save as a **CSV**! +5. Upload your CSV. It will be available as labels.pdf. diff --git a/doc/release-checklist.org b/doc/release-checklist.org new file mode 100644 index 0000000..9888010 --- /dev/null +++ b/doc/release-checklist.org @@ -0,0 +1,8 @@ +* Release Checklist + +- [ ] make docker-build +- [ ] make routes.org +- [ ] make declt +- [ ] make diagrams +- [ ] make statusreport +- [ ] make invoice diff --git a/doc/routes.org b/doc/routes.org new file mode 100644 index 0000000..8501b99 --- /dev/null +++ b/doc/routes.org @@ -0,0 +1,190 @@ +* Resources + +https://github.com/fukamachi/caveman/issues/112 + +* Static Pages + +* Index +#+BEGIN_SRC +(defroute index "/" () +#+END_SRC + +* About +#+BEGIN_SRC +(defroute "/about" () +#+END_SRC + +* News +#+BEGIN_SRC +(defroute "/news" () +#+END_SRC + +* TODO List +#+BEGIN_SRC +(defroute ("/todo" :method :GET) () +#+END_SRC + +* Markdown Viewer +#+BEGIN_SRC +(defroute ("/markdown" :method :GET) (&key _parsed) +#+END_SRC + +* Documentation +#+BEGIN_SRC +(defroute doc "/doc" (&key |org|) +#+END_SRC + +* Simple Forms + +* YDKs +#+BEGIN_SRC +(defroute ("/ydk" :method :GET) () +(defroute ("/ydk" :method :POST) (&key _parsed) +#+END_SRC + +* Label Maker +#+BEGIN_SRC +GET /label-maker +/label-maker/ +(defroute ("/label-maker" :method :POST) (&key _parsed) +(defroute ("/label-maker" :method :GET) () +(defroute ("/label-maker/instructions" :method :GET) () +#+END_SRC + +* QR Code +#+BEGIN_SRC +(defroute ("/qr" :method :GET) () +(defroute ("/qr" :method :POST) (&key _parsed) +#+END_SRC + +* Register + +* Contact +#+BEGIN_SRC +(defroute ("/contact" :method :GET) () +(defroute ("/contact/admin" :method :GET) () +(defroute ("/contact" :method :DELETE) () +(defroute ("/contact/:id/delete" :method :DELETE) (&key id) +(defroute ("/contact" :method :POST) (&key _parsed) +#+END_SRC + +* Attachments +#+BEGIN_SRC +(defroute ("/upload" :method :GET) () +(defroute ("/upload" :method :POST) (&key _parsed) +(defroute ("/upload/:id" :method :DELETE) (&key id) +#+END_SRC + + +* Cards +#+BEGIN_SRC +(defroute ("/cards" :method :GET) (&key _parsed) +(defroute ("/cards/search" :method :POST) (&key _parsed) +(defroute ("/cards/:id/view" :method :GET) (&key id) +(defroute ("/cards/ygo-set-items" :method :GET) (&key |set-id| |variant-id|) +(defroute ("/cards/:id/image" :method :GET) (&key id) +#+END_SRC + + +* Categories +#+BEGIN_SRC +(defroute ("/category/new-child" :method :POST) (&key _parsed) +(defroute ("/category/explain" :method :GET) () +(defroute ("/category" :method :GET) (&key _parsed) +(defroute ("/category/search" :method :POST) (&key _parsed) +(defroute ("/category/:id/view" :method :GET) (&key id) +(defroute ("/category/list" :method :GET) (&key _parsed) +(defroute ("/category/:id/delete" :method :DELETE) (&key id) +(defroute ("/category/:id/rename" :method :POST) (&key id _parsed) +(defroute ("/category/fake-data" :method :GET) () +(defroute ("/category/new-parent" :method :POST) (&key _parsed) +#+END_SRC + +* Constructed Decks +#+BEGIN_SRC +(defroute ("/construct" :method :GET) () +(defroute ("/construct/:id/view" :method :GET) (&key id) +(defroute ("/construct/:id/view" :method :POST) (&key id _parsed) +(defroute ("/construct/:id/select-sets" :method :GET) (&key id) +#+END_SRC + +* Deck Templates +* Decks +#+BEGIN_SRC +(defroute ("/decks/:id/view" :method :GET) (&key id) +(defroute ("/decks/:id/generate-cover-images" :method :GET) (&key id) +(defroute ("/decks/:id/delete-generated-images" :method :DELETE) (&key id) +(defroute ("/decks/:id/to-category" :method :POST) (&key id _parsed) +(defroute ("/decks/:id/rename" :method :POST) (&key id _parsed) +(defroute ("/decks/:id/pull" :method :GET) (&key id) +(defroute ("/decks/cards-in-decks" :method :GET) (&key _parsed) +(defroute ("/decks/:id/name" :method :GET) (&key id) +(defroute ("/decks/by-category/:id" :method :GET) (&key id _parsed) +(defroute ("/decks/:id/html-listing" :method :GET) (&key id _parsed) +(defroute ("/decks/:id/html-text-listing" :method :GET) (&key id _parsed) +(defroute ("/decks/:id/text-listing" :method :GET) (&key id _parsed) +(defroute ("/decks/:id/image-listing" :method :GET) (&key id _parsed) +(defroute ("/decks/:id/delete" :method :DELETE) (&key id) +(defroute ("/decks/search" :method :GET) (&key _parsed) +(defroute ("/decks/search" :method :POST) (&key _parsed) +(defroute ("/decks/deck-select" :method :GET) (&key |id|) +(defroute ("/decks/category-select" :method :GET) (&key |deck-id| |category-id|) +(defroute ("/decks/kde/:id" :method :GET) (&key id) +(defroute ("/decks" :method :GET) (&key _parsed) +#+END_SRC + +* Users +* Login +#+BEGIN_SRC +(defroute ("/user/login" :method :GET) () +(defroute ("/user/login" :method :POST) (&key _parsed) +(defroute "/user/logout" () +(defroute ("/user/register" :method :GET) () +(defroute ("/user/register" :method :POST) (&key _parsed) +(defroute ("/user" :method :DELETE) (&key _parsed) +(defroute ("/user/:id/roles" :method :GET) (&key id) +(defroute ("/user/admin" :method :GET) () +(defroute ("/user" :method :GET) () +#+END_SRC + +* Deck Builder +#+BEGIN_SRC +GET /builder +POST /builder name= race= archetype= attribute= passcode= +GET /builder/current-deck +POST /builder/current-deck action=load id=N +POST /builder/current-deck action=save +POST /builder/current-deck action=clear +POST /builder/current-deck action=rename name="New Name" + +POST /builder/current-deck action=add deck=main,side,extra passcode=N +POST /builder/current-deck action=remove deck=main,side,extra index=N + +(defroute ("/builder/delete" :method :DELETE) (&key _parsed) + +GET /builder/saved-categories id=N +GET /builder/saved-decks +#+END_SRC + +* Inventory +** TODO Multi Inventory +#+BEGIN_SRC +(defroute ("/inventory/new" :method :POST) (&key _parsed) +(defroute ("/inventory/import" :method :GET) () +(defroute ("/inventory/:id/edit" :method :GET) (&key id) +(defroute ("/inventory/:id/edit" :method :POST) (&key id _parsed) +(defroute ("/inventory/patch" :method :PATCH) (&key _parsed) +(defroute ("/inventory/:id/delete" :method :DELETE) (&key id) +(defroute ("/inventory/variants/:id" :method :GET) (&key id) +(defroute ("/inventory" :method :GET) (&key _parsed) +(defroute ("/inventory" :method :POST) (&key _parsed) +(defroute ("/inventory/search" :method :POST) (&key _parsed) +(defroute ("/inventory/new" :method :GET) () +#+END_SRC + +* Workbench +#+BEGIN_SRC +(defroute ("/chat" :method :GET) () +(defroute ("/html" :method :GET) (&key |path|) +(defroute ("/test" :method :GET) (&key _parsed) +#+END_SRC diff --git a/doc/store/LabelMaker.csv b/doc/store/LabelMaker.csv new file mode 100644 index 0000000..54477fb --- /dev/null +++ b/doc/store/LabelMaker.csv @@ -0,0 +1,33 @@ +Label No.,Description,Price,Bar Code +1,Nice – Great – Good,$69.99,99988877766 +2,Nice – Great – Good,$79.99,99988877767 +3,Nice – Great – Good,$89.99,99988877768 +4,Nice – Great – Good,$99.99,99988877769 +5,Nice – Great – Good,$109.99,99988877716 +6,Nice – Great – Good,$119.99,99988877726 +7,Nice – Great – Good,$129.99,99988877736 +8,Nice – Great – Good,$139.99,99988877746 +9,Nice – Great – Good,$149.99,99988877756 +10,Nice – Great – Good,$159.99,99988876766 +11,Nice – Great – Good,$169.99,99988876766 +12,Nice – Great – Good,$179.99,99988873766 +13,Nice – Great – Good,$189.99,99988872766 +14,Nice – Great – Good,$199.99,99988871766 +15,Nice – Great – Good,$209.99,99988873766 +16,Nice – Great – Good,$219.99,99988872766 +17,Nice – Great – Good,$229.99,99988871766 +18,Nice – Great – Good,$239.99,97988877766 +19,Nice – Great – Good,$249.99,99888877766 +20,Nice – Great – Good,$259.99,99938877766 +21,Nice – Great – Good,$269.99,99982877766 +22,Nice – Great – Good,$279.99,99988277766 +23,Nice – Great – Good,$289.99,99988827766 +24,Nice – Great – Good,$299.99,99988872766 +25,Nice – Great – Good,$309.99,99988877266 +26,Nice – Great – Good,$319.99,99988877726 +27,Nice – Great – Good,$329.99,99988877766 +28,Nice – Great – Good,$339.99,19988877766 +29,Nice – Great – Good,$349.99,91988877766 +30,Nice – Great – Good,$359.99,99188877766 +31,Nice – Great – Good,$369.99,99918877766 +32,Nice – Great – Good,$379.99,99981877766 diff --git a/doc/store/S-20247.pdf b/doc/store/S-20247.pdf new file mode 100644 index 0000000..a11528c --- /dev/null +++ b/doc/store/S-20247.pdf @@ -0,0 +1,227 @@ +%PDF-1.6 %âãÏÓ +12 0 obj <>/OCGs[19 0 R 20 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 18 0 obj <>stream + + + + + + + + + + + + Microsoft Word - S-20247.doc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 2 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 26 0 R/TrimBox[0.0 0.0 612.0 792.0]/Type/Page>> endobj 22 0 obj <>stream +H‰lÒ1Â0 …á=§x7ˆÝ6Á] ˆ©0ä ˆî/QÓ ¿Œù¥÷I–’ yk‚ó¥!åÖ­CÞî)ßöçë“ÔPk.«âýL=i¨ÍR©-Exk('æbs.6çhkXŒ¹Øœ‹Í9Ú敹؜‹Í9Úîœ 8p2àâÖ0)s±9›s´5èÄ\lÎÅæm÷c·N\úŸ®›ÿÇãwêñ;é+Àfm‰ endstream endobj 26 0 obj <>stream +8;Z]^Tb.8I&-G5pDif,Z2!PD,RG#Z;FZ65K2I:6)VgeTK=Pm4!@^5c3H=X9991(72 +And(?at+",=FD_`Z<3Nk+VlT7*]@PoXT8EBAhY/~> endstream endobj 27 0 obj [/Indexed/DeviceRGB 255 28 0 R] endobj 28 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 19 0 obj <> endobj 20 0 obj <> endobj 31 0 obj [/View/Design] endobj 32 0 obj <>>> endobj 29 0 obj [/View/Design] endobj 30 0 obj <>>> endobj 25 0 obj <> endobj 24 0 obj [/Separation/All/DeviceRGB<>] endobj 23 0 obj <> endobj 33 0 obj <> endobj 34 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 24.0 %%AI8_CreatorVersion: 25.4.4 %%For: (Madeline Flaten) () %%Title: (S-20247.pdf) %%CreationDate: 3/25/22 4:55 PM %%Canvassize: 16383 %%BoundingBox: 17 34 596 757 %%HiResBoundingBox: 17.5 34.5 595.5 756.5 %%DocumentProcessColors: %AI5_FileFormat 14.0 %AI12_BuildNumber: 521 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 0 612 792 %AI3_TemplateBox: 305.5 396.5 305.5 396.5 %AI3_TileBox: 18 40 594 774 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 0 %AI24_LargeCanvasScale: 1 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI17_Begin_Content_if_version_gt:24 4 %AI10_OpenToVie: -681 992 1.00000201502252 0 0 0 2121 1295 18 0 0 61 67 0 0 0 1 1 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: -681 992 1.00000201502252 2121 1295 18 0 0 61 67 0 0 0 1 1 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 73 %AI17_Begin_Content_if_version_gt:24 4 %AI17_Alternate_Content %AI17_End_Versioned_Content %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 35 0 obj <>stream +%AI24_ZStandard_Data(µ/ýXʪȒŽ)DDš€Í#íÖ!ô“jÉ¢Ö:†@à‹–„}’Jnô£ì 2—x¹øma°ø­_×s±ÌÅ-€<Ë/Ì.Ï3ÙÅÍ/ì‚Û@ñ7g,n,»¼ˆþ¯%ïƘcóN– ö)ƒ“ ŽìŽ†é`Ô/¿á̲Ápˆœ3³å!¶~ùMÉû¢»ÚÙŒÁÞP[—eƒëÞpÅmM¿*,~ø·Ô(G"ö) ‹Qïj-õËoÊK,àýòÅìž~½<_–aËÊ}?Ë9þ}M·!N®k(‡A]·$ýÂí‡eWI·³Zžiñ]FÆÕ5Yæ’c™‡[œ¯[X¦_.–ߺ…k³—澟ۙslšsßã¸bÿÛ™ŽÛ_s ÊMÒ4-ÿaŸëÜ—aÙÕrŽF/»Y¿ðÛjëüˆó¾§ýÿpœcP€ƒ’ r!àE×/¿™Éu-· h0ÌXí¾0E wFƒ½>æ]¿&‹¼ë…¹€Íß–ý6–c×Ë\2àAÿ6@€Ý!3¹¦k®¾žÐÖ­êáyÖÒÚ×µÖûëºýwá7æ‚еy¸Õ¾¿ ÀÛºuÛÚÏæµ£·bïʱ»r Ïp ŸwåΆcÑÖt– +¸¾vyØ‹hÌÇÁ²\ ¡Ÿã}s/T ‰4r _loz³åÞ¡à FK±9/®ÞZ(\³U2^¯Ö·p0Ü¢Ñ`È~ËÐÂ3ýªWǘ‘Û~Öv>¿¿yWv½1iä@ι¿•[õG¿•·%8Çò[¿´üù¸•·…äìCuüʸõ¡‘ë·´ÿ£~Ëoízܸò¶¶nU‡¯«²—½¦ßMå³¹>ÛSëÃmno¾®=Ü~Üxåhˆ§j¸Ö¾¼J@P¾f L=¾ ÜË«#·AÆÍ5…LÜÞ\n§8·9'€ã\·¹ ··&no­‰Û_ÜÜÎ0K¾âæ ÓÑ0{¹X8Ê]6ÊrarF/ÜÁXˆ›3ŽÒQ2%ï GÉ÷æᶇçÙ+·çgmgä@ ¦ó¼h¦’€ÎÅrŒ~Ûƒ‹ȱfÜh¨EõG +…)â@?·1çÆ5yžÉ©¯ßšˆûÞßW¬n?¦ÚÇ-ü©ã·Ýü6naàÝÐnìá +£[ï&æª[¢/ׯ»rÞÚågú{×›Û{a¸MëÖÕí'öÄX–G°,¸]ûîûºn]¾¦ˆ<ìzëß~fô Ë­ÙÑ,Ã>@¼Î¾üòêÇœÿ-lç·?„ů«ý#îãÀÚå ZÎõx¿\»|éÛäWŒ™kògãVƒ?«FgƒÅo¿ÿËÕ\«½&ÃòÿxÞF×±ŸÍäÔWÏÛDqoNºê<öuÝ–^ò†É ‡£;vwp¾bƒë ÷ý슱ñ {¿ÇÃÚG2ø·dº~åÆ«_·ñ÷5ŒrÆ‚ã‹çLGçï¼s»›½o“ï¾÷Þ[ä\w88ÞX(¸‡Kò(ö³gµ9WöG [X½ÞUû:–ÓUüÂ|eÅà܃þ~@»™Õ:ºË´ÕöÛoaKýÑ• {Wæ8¸‡‡[—ÈÃ~»Y•ƒÖoLú®…ö.KQýQËî!À¿|É`p¥ÃävÉ58üšâÂAr¦hnÒ×-<Ïü¨;\ç ZöÛÙ,0Ëï ó!‚os +ò¼ms¿uíEÖÎ0+õ6îáa-MZ‘ÔÛx7¹Ç÷­Y­ãÂo­²êƒr®ng_¶xøµ¬L êmúË°œÒ´wÉÿSÇ~Vsɪçm¦¸0œ)š“3Å’äL‘ö¡÷âyÃdp ‡É•$ÇàÜ#¹‹_7®ÉÏÛȹàÜÃà¥é6@ܦž·q>œi>J®÷Ñì#É=|ݪ±ü‚/weß]!ú¸‡‡ëwäyøq`ìë¶p>~aﶜ{|Ùây[)–¢Ù¹G,¿ô÷¥Uƒz޶Ųs`èûrÝþš®Á0†ã_®[ÿSÏÛ¸-’ +ß’]T!út^ÞF·XºÅŠ©·Qj®©ÒG1Uˆ©·•$‡>G@ñ{¼þÊd2™Â¿ú¯ímŮؓ†b»bÀ_ŠÑP&“€‰ Zž*üøkÏ'o›Oì|bKiWB­ÜƒZ¹·¥"íðÚä|bç{†r‰¿J¢‡2Ú‡2:”Ñ¡ŒöÛÛä{’H$Eð4”Ñ ŒFø¿ÅnpwZ§w§ƒ»Ó/ap÷$[g¸yÛFÎ>ì)2‰L"“Ⱥìt[µ~§wV­ßšYcz¤Izhfƒ=4iB‚›g`i:ÐcR£,hŽYËðÓ€¿vfÖiŽY µd-Ã=&>!3³Cm•hø$3Ê’ŒÑ©ÎÒ©•×ê7Ñ~c +ÀÆ«S„õ›¤˜ný&éÚ±gˆ¡åŠØ¢S@L_û ;}ÖôIŸ†Ái£á“ð*ÐL•Á¤îb¦J¿ÐgýubÏõ¶X4û°qÁ! y2“ú Y™ÓY—uœ²u†lM 9tº!묎¤Úo +-WBºÅž![Zò°ŽÓÛ,-ë8=ƒfýh¹pR‚'8)Á 5Ó õ6K‹à*jå Ù’„rl¬„Ú}9Z>'Nª©½lÈ2ѯ½ª r‰=ÃÕ ~|¨¢VnаœQiBžP«â”Xäª +©>6>µrrUÇ@¥ËßãEC±›b)¨ ¸,o¤Uë7‚° D[wðÖSS©¥:fO=Á‘ú¡¶Â8d-É;zž™ÙÞ&S Ÿ„¨­.Û3°.ûCb'«8¡JË•ÐÛ<ÕÇÆ +-WÂ>KP÷6™“ðÖó Ad{p·JÀ:΂ÂÅq~sô¶ÄƒðŽ‘ÁÝ)B‘†¿f9CÐìc¡(Á+‰ÒÛb¦Ç´ªh„E<«©dêÌHÁKÃáGŠ¥#»“Do;l,Zì"1Æç„E‰•`KÚ2 S'UŸ… +„Eg;,»KXµK˜%˜hç¥A WTé4肨tO¥·¹xe@œJx& ¬GB…Ȫýu€"¸·-É;8‘׆ ƒÈÿ5“d܇¸Á>(gó $áô8ýÉ¡>ÌšgA ¤&º4¤&Ä‚X¢ÄÝÉ‘Qt©ì »BÝ¡ÌïŽÿ xX}³¡ÄPŒ‚½-Ý!—à ˆÒ1ÐHÄÌÄùik$á"æ˜g8GÀù4pB‰r¶„ ê¦G™º{G·d'§Ðý•™††n%φäAóp™<;¼,Nz‰Þ*Jåy¢®‚™ÊOåùd©ÀPcµ(| +4T-…•h(ƒTšO™ž¨¿GÖ˜Èá(‰v¬æ %gÃàŽãb¹›]bW£ÐF.\(›‹ndÝßð9CX–œ¡ã"_GïfŸpýßÛºŒÁ݈ˆj*@‘¥ÆvÕiïâºo6¤ eFƒKC¡á“ÐÛ£$¬Y î>1>èeœJÆ@F ,Î 7³íô60…|Œ@§º +ò‘…Kˆ5Q}^°0-eÇR5¯f¦ém•½I}¹4¸ä0yúظ9k¨/@CÖŠà¬Ñ9ÐÙƨ_Ø=Ze¸!Ò±QçeÙªS)\ ,(šŠe—*Ë€ãqABXþOoJ1t^* ÞÀ3‰V:Þ&ŽªßêÆ‚¾¸T`©Ä&f*Qœõ¶OTŽÛó¤þ ùŸÞ¨'ƒ»aÖ<Ã"@² zk )6`4êÇ!‰L;3æw{[áäøú(¶4èÔ¯*¡v™gHûo˜éaý’(´Ž`ÕÓ™âÂbmñZ*sÆ…á Žô“Ù£k 8tªC Hém‹M§ËB‘†é‡uÙ‡Ãç û);´\ Gî7Ÿ†Ž±$ØɧØYdgØy›¨ –è(+JÑ!:°óˆ®°ãXz¢«éþ?½©R4 Ä~ÙO >–¤Ì¤ï@ðEg¶¤<¼g±`Ï((> RÔa4ª· l8áZ«|¯‹3l°@’.½Yr†cCŠ'w•èôåëD–žèÜU¢óDWØ] +b‰Ž6š]l’„ÝÛÆ×ͬ!½Mzhf è1 ;4!ëÏc’ÉÌ2ŽémH™™ ²×*ãmµúMaê4:Õ1˜…¹2U.°•©Ò/nú¼#7}ºIí¬igͲ,ëm伪~âDò ÊÍ!‡ÏzÛEðÚløÌ ŸYÆ“­j¿“xžàqk +ƒ‚“|ðWÆ2HtÒ‚€êý›m[¥Qæ]R–½a–}:•3B€‚ˆ™$†( Æ¥Až>Ën³c*Ï¢bÙ*Ë€ö6Y¨Ðúbæ,{ü4¾."“%'Cf·¹Ò(ºôã®Ý!º‘HUJt!5ÑqˆA`t²6` ÉZEb9‡½„$š~¯Ív*2ÊeC茴o\xí4ºøx0€+˸ObúS1MO!„"ݵ•I!@C ˜Zƒ–§ƒÕ å逿¶€ d]ætTQ«¨Hi‡9ŸJ¦íðÚÚáµûAŠBFûMÊ%²ÄÊ%’IDÎ>öÔx¤ ÙšYãmi¢™¤ y=&¤f6BÍ®G23Ë”4G¡–á™YFÃ'aF|H Ÿd23±öìbè³î—~Öý£ÏI}†£ÄòÑv±¡ÅBËKÈZNΉӜ8«jU¨¨•Ï‰Ó¹§sU­?q:Ã8q:»¬ÊêEðJ¨½>?UÓCy’Œ} X»ï”¬Díº…´®%M§A{[è´(°zÅR;¥GXx›ØZ)°„ &3½íº›°‹ÀÄæàm¤KÎ(oK!FƒØVíƒ'‚ôq^ŸS‰@‡&ÆÀºìÁyè®eú°áD]„,Y2…U”ñU 3VR.SG’•Dõ×M¥)¢’e@e¼^Œ‹©‚HV/3¦ƒ+ +娈U©zj‰Ž>T°?,h3e ‡%ÝbÉQL_›n±µ©ÒÓt 3Uú‰n±´ÊT銓©Ò¦Å÷ø«¿ú+þ=¼ÍÛH’† +‰Ê±d(•L‡×>>‡×¦^óiNQ+âD­ÁS’©Ëh¿¹Œö[FË¥Šà)h¢~ðF#ÓÈ‚ 벉ñ¬ËN99û°³{ŠL!Ó#MHÍFj摬exf¶Ñµ Ÿdf_ù(™Yæ{ÈÌ ‘©%µúMjÕ°~LSÀ:ÎF§úW¿I¹2UúÊTò~_`†I}†“úû8GâmX‚ì¼$9Œ%EIrèÙvvà ˪$‡^7dgèm¬Ë&>’Cç Zn¬-¯õm3h¹Ü[«*\U«:'N«Š€B­|U±Žs]Usâ$‹ÝÛ8’C'>j§>gÿZ’w” Ÿ3)pͲA•.òÿ£‹$Ð +BÆ…Kƒ%è¬&P§áݘßF#ÙÒg¨Ú‚F ,B3H$ùÙÄL%>èïP°šu*ÿ÷¶–óz1Ç<·ÕI\™*l=hbºÑ@ +$Ýb›Å³zžçmÖÎäÍù/×´ÿ0ÎÃÚÙ×-ç´4lû~Û?Ú}õý€Î}?ÀÁà Î7}AvÞ9Ir n:Ìm–Ü,›ì‹¾à÷Î;ç|ïÍ;ï\ƒï½¤ƒÜ›äÜt˜Û,¹Y.6Ù}Ñ(¥ƒt\ƒ3L†Ù(%×à¦ÃÜfÉÍr±I˜[,‹Ãd˜\ƒo³4¦é0·Y.6ÉÍ’›åb“}±alr›õ0qàÇ96ÐFo[ n,LƆ\ðmÆ™‹×à4Ê•móèÞ˜¸½¡ßVÞ©?ºÚ+îÁ©Ò†cëåöo8ƒ}«Ý|[kÃmn›ÜæL³sÎ9ƒÛÜÞÜx]q¾ð6oKyÂÛL(‚  •ÁÓw8¼ípð6oó¶Âh&º‹ì »Ï£vÞ–9ŒŠî耂ú x:,–§ú¡Œ$ªè ²sÐ*¾Î$ÀItÞf*ˆ%ºš%…%/:€YÈï„9(ý¶²žDÖ>[>–W<‰Î8{R–§è0ÓR‚w^ì5ÇôY)ÅÑ9ÄvÆAãâkÊ1)çLqáˆR­£ "ÔùR߈PÏ-^«Á8#H ™KˆÂA½bzh6m6à‘¥vH,âý·ÈnL‚l nä ³±@€ÌÐäÂ;ær‹âR€aÇ=X Z¦,ˆè,h–kÌ3œhZæÞ›sÔ˜g(rRBJNq’ÜOÓ)MÈÌ +)á#ñŠµébúÚ©Žrè9¤^¼˜gú¸Ô+ó ů÷W~üþ'óœEˆ“dY º6x¯ü@ìš)ó Û¤AKÓ$BÑÞK…/³ «Ç-fP+QÁG‚:²™XÇy((׈…tˆaC¤UÅÀÅBš­&÷„4Pé­V6no“¤…–+PÔÊ Á9;h¹H’)¬Ë6a­qc"µT¿•žI=QJ¨¨•'¬ËC­qÏDƒ»ÛM‹EŽ^“ T!*Ý£#tÖ0b©·± š>$¤Å&¡SJpp„\ñX±ôª¼è9AxŠà!  &¤é3nÚ¥S·èTߡϸi“äÐÅÍgÜ5æ“0QÓ£n½­ž9 +dh¢¾=솷JaaU!…¬·í EUK‰–s39ôåD<ÎÇ÷¹ÛÛR_y^LQL_‰!.æ"d´ÿ.æábžŠ•©ÒO’CGÍ +­ªA©›.^Äôµ 'Ñ]DWØ (ŠnÀ‘Qt±ÄÅ<ÃÑx@!Tt¡ÔC‡Q +<¥ÀxªŒ,ŒOeK¤^ö÷‰Ÿ‡ˆeÉwÑê÷yÛÇ ÇímËÛ¼ípH`ýpâµ.ó0ÈN!’ +bê¢+ŸÎðIG?<“öû@2aòÔ !JD«‘±du¤th  Ë®«±å å¨P¡õœ*åÎ4ðžq{[Jþ˜§%D­¼UcÏ5[tª‡‚Ö‚2Ó¸7LÅòÏ{ÆͨÌÀ~ÑR6 '=;IºL0|Z5Å©-h„²5JûE@ù?õ.osW‘$ìæ¦Ó%ˆ³Nî7Ÿo[-Þ&°x#¡Å4Ù + {Óï°8Co[Þ¦* P"4Y<6.keÆLzi4ŸbÄÒÚøGt…ÇÄIt"Aá;ÉêRab׌*&…fR:£·}Ňñ¯Ü%ÊLë>‡j¿G·y[ò¶‚cCŠ“-ºÂŠÝ ¿`§R4]¢‚Iw•èVU)Ñ5^,°ó(Š2…]Gt…]ª –èß@ØeÜU¢³”pØQ¾°ëFE×Cj¢ã¼FŠgî^´´9£Rh”N>a +»>” +qÆ^¦B¨†¢~(Eêm¾ämˆ•«{a@ó,Xk7ªWŒDS¢ø’·Å*½½m‹¢+ì4²3ì6›™–è"„bõ(½hÉõ¢¤·y\)…%Û’¢!Y¡qÃc¼ŽBh,c;Zb±Pr»6´’y†ófV }“ÿC’Œ·UÔB‰t^Ìíó˜üïm Cx›ˆ×L¶×ºå—µ[;¨óÝ´¢\”HX„óÇãKðÓ +9öHð45e1$Ë@(P´õA)Æ/P¡±7\iÂøaø©ÒûÊ2no£‘ê•IXVE© n(b…·f¢ó¶4%{±;°Š‡¶]7¡ ëj"TöB¢ŠŠ²JšÎÚÛb3=R6yAQ¦Ìžñf¢z¨þšp5V‡·‰ÔL*ýyA5“z¤lDuö55R+"‘¡ÃªT"‹ JY,.(6b‰6hÈS ÓcŠªxCc—˜?”ÊÚ1ÞFÔb(®QÈÑó¥q¶6œ‰·y[g¨áÀ±!EÐc2C/¥x¨û«V8¬Zèw†QÑ¥Qøû¹¬ ï“U^¿>(¡ÍƒàmáÊ2Ë°g¸"V¤Sí>Jz[+–¼ÒÏ +‰ê*†‚P+Ww ¼ešª%Eùx*±Jo…‰"xÌQôR„ZùW.V»¶Ô”|fÃKM<.µ$ÿ«±çnõêè z©…R¡›̃.‰•åô/2…f:”(ß`ySJ=šÞ–½Ø(Z&ÊૉÐÌ‚£~z +Joc´˜"[YíJO’q‡’߆’Ì4î«Kt‰ÿÁîbâ$:—DÝI¢ +ÃvÞ:ŒŠ£*%ºG'v,=ÑUDWØQDWØ9:`·¨{b6Cá(„Ò„fÈ®Ç$UhLg +‡˜øk[d¥ ïLJ +IèmõêñÕ!ë²Öew’·¡0H ¬ËÞvÜ[ŽdÔ‘R¸ðŽy†f cyÇ,PFB., (#qX c9£PŒ¢0ƒ*hÈ‚üÝØkíõ©B[®qár…èš).I’ÓU]öCÛkqÒd¢R‘$ !Çxãb˜%™Çˆ5S ‹I¤ž:9Í\öó“h°3£³žBöL8üráÌ]b±²QN¡XÜ”lsU1à„Thb%]s‘ÃrÌFÈ,k™ˆüJ‡ töôLIÿ¼t˜ðüq¼†©ß>èŒþŽ[ùúýMPL.¿]ø¸üOþå«…g$„O%ÓåÈŽÎ3ÚŒ^œL§“7ån“vÉðžä¾ëã•ó¥E«Ž¡ €BOwM‹– `¶Bæ^ãÈFä‡P¡ÓÓgJêüs§ÅŒgÀñ2L5h³\ìòÐ|òÐŒ¹è‹àùdT%¢Š8© ®óŽàÇ«/|¿ò½èÇÙ€gqâpÁÉ,äµÛÌ7ñºìòb@ȉ„BûÈ~°%¶*¼…—ãÉxãÂgãÄSÅSwïÜ’céø¢® ®=fŒîÍ6)ZpxïZì@4Ò¼î§6»ó³{RK»ðŸ0™Ùõ@æweXvý,Σ>ÛÍð&©ûÖiK‰Kª U £ÝŽruQ{Ð.!íaN»0ÚšÒ‰@ä"ã–6ue(™4nkV@ 5¦q«sÔ !P³2îÕãæÞ0ƒþ"ðkÅßá9-~1="ÙÜ¢áLdbíŠ)Käàbºc²MFñ‚íF2c²}ÀóH1I‘ðÙÓÏ lWV®² xMÜ­|© l§¶ê‡&Ü&½Åˆ CL•ó&‰rÂöSnŠ³þ•“ÃÒ9ÖÂÄ„bx§ ¦²Ž3‘ëE¶u‡ Î(w?+\}yßoWIŒ‡‘ [we×I»CŽ0ÐÅ™“`Ûh¥È6Ææùë‡í©Êv;‘N>úETÙ&t>J©ª`;…M,0—@ªMHàÇiØž^¶E^Fäƒ(ÓÊô­åŽlËûËû÷ýð-²-7¢²ÉdRÄN7PŽW;"•¸Ã'lñgŒ»¶u‰hj£ÁRI¨¬ß‡Ë=  Ï18@²)¨ü²QÄÞXÜ£Ê($€:§ +’(R±äu_ëÛ¬&’l{˹ù Ûêd;äâåLE§‡zædûÕÊ(¼ÊÐtdÛ¡¨Ú¨Ø ªK÷_¨°¥²]ÅŠt Ûã@¶u”HÔ:?²]1l¾õò"Û¸ €YçQ½kËo¦'8ìûâ߸Ý ¼v{fpÉàÈò7§¿ñ:ÁñêC/ô›£'ª™“ Wñ¸iÙˆÁÙt';]v¢cØãÁ€‚XXúæ³Âþ?§@Î9AÜø¶/ZY"v?F:‚Ü5àä"Ù@w´º°<‚È.´"Š‘a«7¯>hÈâ ï²Éç7îbLíõs+Ø¿;v: ½¼ÝA•äž‡gÜRm»ƒE='‰Ìv}0<æ;|‚¸>ßR xœô'?¼Þÿž,ŠÀù`ÙX¾S™¥{†EÚÎt œF‚d/èé‹6ú×CÇš®/Ú.—1¶ºö¼vàB ÚËåÅPµ×”GÈIc€× +RH¤“Æ-‚ŸK÷á ‡Ó"DN¿{‰â62ýÊ)ËœZl“…Rþ7ÓFçÆb-*%Ux(—Xdu+^Œ°Áº…NM~ëRÏq…i,é”Ok–Ô!TW]¯1ÿUqTËÔΔù–+‰¶ˆgoHÁš4Î5#ÙO%‹r»J@|Ô¼ ¹ækãÎWv›ÔW>vX¨^ÕjæôÛ˜Ö„¼|BCÓf·þIíoF³“!-=|æ´~PRçÖ ïň_ýMË¡›õ°¯OšOúw“œg›øÕ5gîþ¯„y(‹~ˆka…‹x§|!=¿8Äl–"8'žqf¶³%9óÌ¢ÃJveœÑÅõ‡°~=xü‚\c s +êàÕ]Dœ ý—UŒ„ ÌÌa}˜Òƒ#žüÞ 2¹Ê÷¨Âi»ô­Κ_¦Ðz"رï9KÀí’«áõcŽj•[pŽ.Gˆk.Ôß<¬ÿMŠÔ/³æÕÒ•ü»› + 7/KSŸ¤xªUù'“)j¼8¤„ŒÊ³7´ox&¡(ð?ïaÌjb^ÿá¥zNm¨¸K\RùÀÝûCÄa6¸êg–J„ŠÜ RÓ™¤ÔÄ!¹5:~º‰öšÄÔN§5¼ {ûåypšÉ1ÝðgUÁGpÍ)h*¯‰M\2Ë<¤R±©ìJ÷gºu_Á±Ü›`¨A³bÚ™˜H§Ò&IýÁ¦"dVêVí°P¦\CNÅ‚²²ËÉ|ˆ3\·éaˆ/y81Ï™¤Ê…‡‘L:À¹IHÂØ%1±pªó›$zj 6¸Z¨…´º4•_v§9v §RˆÃÄ4*Ú±iÒ¼ì$ýoq?²#â¹f”0ÒÑ2hlšð$+;‚"™›­rÀS»T%(çG*\ÀÌé t›lwÉ.þ,AÀÅ%‘€ÝŒ€kÕDØ®Ÿ™s"%ÂÆÏê³WÙa¡uOÚ`'\x JhΪުŠ,%—‘³jZ*çľvK/ZКõ5á3AP:‡ý :tŸwÑ¥ VÑíFǧdÿÑ%á¤Z´¡y¾i+¡.êl™àUAÊHŒ!Õûqé} ‹ŽµÖ.^UâM‰ÿüÛ©–äÑO¶rãB{–¥û¡&µ#EYO‘ÀlØa,|´á¾¯:¯]Q QYÈòrQcTqHV'¥\è“™ikIqTTþˆAq@·™_eÄ76e¡qëˆ&W9ü¨ ucYk·ZûÌÔŒçtë[´ÕCHk’¿N®óä"/7ܳ0Žï˜Zڳ骉åÊÒyOŽbJ£5“CŒ~%¤0[œÞߺ¬¥‡$óÌé°œ„¥™Æ‘âï¿ÏZõöÔÒȘ崣¹DuþÞsM×¼nLX²aCVˆ˜—ïX~ïÀCFÎTŸxþŸÑ+-o{ DžZ/ú–*†æ¨X切GtK?3¶’âhŒ¹óÛdqž"ú:]S‚ ÊÅ“´#¾š ’•†ëÿ¶8Ö8ƒÁŽR,¤e¬x_· å¥Ü¶Ð§(ÃE\Æ4˜ Ü‘v´$Žýï/[lÛ–·ÿO> +MŽ’ôZàºýWœ:'×CG"!E1C¸[Í™¡kÞ'®©ÜbZ’3ŽfÎN؃ËÙŠ>õ¡oÂm{Ô#fŽø‹¥1;G z#6òßðaúVßÐodq•dÈÓVõž«ˆ«qE½¿~‘— ©Ì%+¥¹+Ùsõ}…0Pî뱋W¥ÂÛ +\Þ.þO{úu÷­/pü +Õj¢|XÓd0…àcF¿JâჼFo~_\ºªß›ÁýGË{å@Pr¨Ò@#ìZíÇÃOAúYN½ç@ºŒ;Å\ø ƒÀvÚð@•Y`õlÎËu‡îv]V#å+d¿ö +ÕŸzI¬œ¨8 Ò%µî2öÚÐ}Q³1C^Cí"š]¿‡ò:º…õ¥ê™I“on-·+:3ἹÕÿœÍ¿6tŸ¼º¸Ýf¶Ær8ñfПgÎ[¾/¬€ÍÜõ4×F1;;,Ø¿ù* ^_#ÌìÚ@t°$\—¾3R9}HÐÛò|‹þ)ÆÁ:™çÊûå¡'Ê +°¥, +“‘Í»ø'Ÿ9OT} ƒZ©Nç­]ûøL­ÅÑOu$s™¾Îßð, „\p¿­…Œ_8Ý€ˆn>‹¿ÈõÊž”OÁ~&<ÈAlä¿ÉÙî ][ˆ„/Žzç~k»ÞgIn?Ø=6é©dý²Û"Ø÷^âP¥k¶ø I¶pø3[Ïí¿Âó ØŽ~VöÇÿL•}©môoCìiw+µHs¡8;7Z°X÷F寇2ÉÝ^FrÝï™ÈÖ 7­|ÊK¢üwè‹ý?þôP©Å1úóLbå/½_=˜úL•c› +¥¤¸ž°‰6"ƒŒZäzŸn%€(¾H÷˜MŸ‘q`õ>v$`ûêJ“«­—\+‚:§éönu§nÈ¢Ú¯ +jc šÛö—»b9ïñƒ`TÀ ‡¹³)˜VÎ]ñ¬>ì3í·‹z´p7iJ°2êˆæ5ÄEidÎÍJ¹ +à¨jçÅ«Frü“â%ã‚ÜÉ®G\÷ôÅçë5ÜjæÓN>ì'ÇÐÏ´Õ›§ÝdmÆzÍV~›Çq ú“o!æ§Ø†­â•w¾_|]ÍA±‚Š€÷Wo®²IáÅÒ(¥f§.Â7§Q`L0nâ3y›) èj˯÷üA&/Ççù_íǶÁ­õ;zo5-8ÿ—'þõmÓ¿&ø9ß³^V£ú 3†ò}C8†Ì®'Ã]øUí¡H1ÇmæºÕYÝk7½ò\®U„Mó¼?Y„VÕ•V|2û‡à%¦^îìÙQ¼$€/âe[îó.Ū-ÐAlAoÆû,ãø#° ÛM‚¼ŽðÊÌÔþ1ñ»¨"š°i,çÄT2Šm€)ÿ…y1åèãˆVõE ÚÞôì›~[<–0lÉ&˜ïI÷®VHqá®I7½+èuZ +ÍÔO¾B¢Ÿê>ºØPåsy!_gÅSÕ.ÒÄÎì]Dñ´t‹GS‘_¥-/±# “Z‚5¶ÙxÖ„‰xªQVFÎ{?ÅÓ部)ÝÒÉÖ«OŽàs‚w—Õ‰xª>NüÅ’å”ä¬c¿0ÂD<].Å“£&µÄ‡ÀáÐC\ËXi¯ŠMƒç ‚P}Y;N*­¹V«ýí’Þ Nlˆ<‘b{ýxŠ‘šªñdF±ó5(}§ñùÖ7ñeÒ|þTRÿxºÌŠW(òfk¹LŒÛr—µìUÙ–Ñá¡??‡ùÆS‰@Šueìlã©WRx«OØ×+sã‰L⦪ǓKú”Î×A6žv–úš‡X㉢~ËsO?:”K{¬•øí3àÂÝ{ͼ~NRnrq¿³1Ðd5×l/Ø6`¹Û«ù>a +•êM!e/¬w±ùJô™ÁýžY˜c †ŒTKx¼Cá .=ã“#±Wwß g[a¼çoOîõÀ˜÷@ûÃ÷ð+Î4U SË›Wwcxh=fÁÌ1¿¹+Dð@µNöÊ­Ûã~ºL—]º!bŒJÿ&ë­y‡¿`Œ%¯°. ®bê’ÞkzM†¶Iä«U—./Ì[Â7@8oð%Þ.‚Ùæ±Lc!g*T»±ø|a x£·^ÛŽ†•'n™Õ5ï {˜s ™WÁ­ ¥ ®¡Æä ÊeDƬcÐE;-Ì*¯ÔUè¿>¾ÞOî¥é ¹ä†#hô$ pÎØ:¼n4ˆé]£É¿ó9®ŸÁw!Q!ðœˆ1ËÚ=†f Ž7m,œÙŠWž—`¼HNŽÀÃ3n^Œõt}tÈsT4²p±g(¥;)0¡JrÞH{ÉS,éÛÒE˜°ˆœõV|x7çzJ@ÂÀíߘB@«‹ÀJÀôKlQ€ÊÿÊΉ!«S Ê—¬BìÀ…U­0/¤|òÅ4ukËäfzÉàÎÓ¶N±­µÔ·µé..#¡昧öi'ëÛ¥iyµ‡¥JNRf’7(mÑó'£ ±ÂØFãªãÖ 'y½—¬´(µ>®í/H àíÙ¿ÂR‘{gÄ÷¤ðÕ¼4nÊG:Éi˜\+]Úp-Øø+×ùƒäöíò×pkg@,ÌGEp=¬@F™ì8ÂáÉIfK-Q-ZéX|+š¥œšå‡F„LçÌÃ86Ë[,ˇhÚ«&yeƒuêc¦Â!jíàk…Ûÿö×ÄICG~K)žHm â¤ \ÃïŒXf+š_ÿ¼±´R;B D‡§ÊwÿðoQTNJ| Í Q¸†ªöÿè_j_°,yBþ??|››*¨‘Õƒ-¯T}`bnº?Ë[Iªéu”]3KÚæ¦_ˆ )ë~‘±|’ç@úçiñPoLÈõ¯0×<5 ìCbôïÓ ™›Žø™Å!æ˜è_œç‹p¿ٙ›¨ŒÊqcyïã_åX’5-ƒ‘b>Ò¤?DÿVÅôSék¡Íùdß«ÙÄ‹Ö#þýD©!ÝχÌëß*í¯Ir³ãNlF+âß÷ìƒ+rêß §¬/àßÂõ[:ƶö¨Ë ’ø׬õoT¹‚]˜Ö´P–)tn¿z™þB¶«¸¨a1\©YN—`)Ä•Ùõ}¡EÕTìuv÷¡ˆaµôÄPFÕˆu¡`ü&TÚegÛ²—®›© h¯ôl™ÜÚ€'€ É ¯èò» qŽ­PC,‡Y6ÜHÏÄ`SZ +¥¥° 0”ŒËÚq÷0錯;ÓHs›8˜³Ñšüä‡YXø.Q3¨Ü]̯°)•ù)ƒ$áÚ?Çî¬ÃÒx –,c`³•ñQMIÙšt$í ñVJÑÑ$ÑÈò^ñËÐvìU¡èWUûÇz'|f?ûZmZØÀ&INù>‹(CÝoYmEP6þ,#´.Ÿ|]\Ú3US¯]\©š +¶z{i‚#>Ur"à™a¶¨ÐNN“¥Eð­¾¼q…†oµˆ/šnú¤¢ïïHkªcÀA'BˆEIŸŸt*8ˆ%²Â_”F™Jh™ÿ×O Áà}O +辩JmFÇ¥9žûµ“ÓE@EèÓÓ„µÃä@<å! Åñì‰J½Íòp¾[BõCAqÀXczסÞƆd´¶ÿi¡^¦/ž€è¹ ²%œÏ<¬9C½²Ê¾·ûg(¨×ˆ• ™ ê¾ùêMëÔZ\盽¢ÔÛžl^7Ôë¯kI…ñÝEJd–ùP\ªè"ö w‹$ÆÎ#b1F†Òëeæà·°E¢æŠò½n*ízm#µ'd‘ÁP­Â;ÑbhsɈš²e°v^x7,×ò‰Û€ÎZT°h ÌÂí>S)ÌÕÒY¢ G–Ù­™(µE“É*GUØ“íÈôàÂ(±Y]+¿ì‡5ßÞ@[ âî ¹sH1 *íÚ¦-œ"?B¶zˆôÃ5 -¼`:‚j¸À$n™‚<&rÔJß÷«Í3¹ëó cÂA¬Þ:+&çˆI:ÉÞBß2€¿ñ)…EqÐdq@)^üàýZx×a+xÝü+ï(Ñ7't¸à%m Pš QÒÒ*bRÏØ@bZ²Xºê[±d‰lƹŽÚÛŒTv¬_#‚ArÏmó›JH§?_ æªáKž­Ó†ß¸fˆ&T&£ƒaô˜‚Lj›Þð¯ØªNúêåîkU¯ƒ¨\½B6uhýýº½4 W¯Ûð At| ª^‹q£ÂÂp÷×)¬z¹ O¡&cJÕë +-¬¹¤í«7 * ê8¡ñ H%®-¬…j˱›ˆÚÛêZ’ç¢Whþê dIU¯Gñ E¿0¨¶ÆÈ£ù‰¼zs~Ç=f»ê= ±ùÃÜЪר}‘g=Åm>9Dь̀ KTHúÍ_¹ +4f•MO€ÐÚ¾ò¶ä¶*Þèð@óå³XÔ)€µ^Æ‘¯oï3ø‚xö¹ßŽ|vÌF§µ·N‚+úv¼o]{ûhíÿvƒRÇ—uTècÝ!$Cz@à†€OÍ-\ÌîªÜ%›ôšŒ&dÒñÇÄm¦·Dïc.FÉ@Æ>6”þž^]Æ®"mw¿hõm(R†CÁêeÛ¦2R9ýîMwêeX˜ŒÄ~JEðýÙ †žŠÖéŸ2œ?_z¹áËW½&\½»Ž•kË‹#^¡Ç7‹ø¬w—9ÿËE +¹»8#ëÐ5%ä¡Šjñ¥¥ô±i¾»ñîøëÇ|3ïvØ‘Áýî&‹)%oöäÝõ "Î+¢²à Á7KÄŸ$ø¥U×ï®Á÷À1ÁöîöÐcâáIõUbà(Y³AUfÂ])ÞóäMºLËÎDHð‘Ä`|wA"ªßN•;‚Pº«Žh@ð³€û¹…CuÓ YƵé0ßщ%è2Œ‘~%®?ݨi™æÆË›%¡µ½W‚ªï…;É1Ö +9²î˜›iM¬IV´.¡yǶ²ÂX|,OˆÂ-J˜üx¦ ÌÇÄ8³ùY3Ë(g͵Èã{êò|hÔÊÝ/ƒ:¯¤«@ÏF¹;Ÿ¢CËç®›~<íÏAåÃ"¤Íóïpk”99šˆ;baŒŠ­§ý2#ÀÜãež1¾Ø¦þ1\"B,bøéuÝk஫(¦×5}?R;[4ž ÛÉŒ5js_µ"°Å?–;—¯P-;s oµ3”oþ´3GÑõ·+;q¿Sl}¤zMò×Öòª|!Gƒq¸7YÖ·,8O}O“‚´Ûc,´0û¦fÞ¿cç/¢°™ž)í#AMfçÙÏa\\Æïß7~G´Ã_\ùaÁLœ…FôÛõ»ùšIÕºD/ž‚š¹ô¼>2.Ï”=k3—%¿–ù<…*p9ÐÔ dñ!°‹P9 õúƒˆ=Þðæ‡R({ìvK«#[b®lìÀW>E(¶=Î +ÂõÜA-ˈ‹x.È™lý'2’DIcòœ×„­ËCûóËƆs V”ú?t%æÈìÅnìNã/û +~FzvNš${å-Ð|1Å…¹êôSô$)¿Ñ")Ëb+­¡kÖ±ˆe/¹Ù•+v8ýí»ã诡#“/ì3•l+^tó9´Õôk©;‹n%ì{tw‰)3 ±px’}´ քÙ±E7¬$+8º{.0ó† “f.®Õƒ^IhRt…£ÛˆBá\‚œÙÀ®Fãï¥YàkíÑ ¯Ë+ºiUf¼þëP¼xž53@@P†LSp +¹‹Î¡Êkù+#-î‰@ñÕ³ûèMV3bŠáá`Ò7µ(Æ.ò/2xö\¨>RÜÿD.Ÿ(¾8Ú.~ùe3v¸ ,ãüì|¹®HÅJšÜˆsÆ!]±ô +’Bìà ¡Š%ª›YÏR1.L ¿E”×6ÇB—øß9"ë\®.Z6s¢Ù 1ð™ü¡ÐïìÇQOÒ:Lu߸#?¹@ÊSSñÖû‹Ër@o…J‘ö¿®‰üÅ›åIïã2õ]ñx)ëƒO·ÝÔÏjžâq;BbÈÕíPJ1¼¼Š{„à)qg^eˆyh` ÎqÉ{¯áq„÷‘­ªG‡õWßðäÚ3ÙºIúe†™FnŠ¦²„ú‘4ãîš &õ~YV?Úø̼HÐ-3 ¶] +/)3Ü%A4ëkhn~ëþ hО·%¸iKtþb@–Eã 4°?¤aÏ<•D(òž ½*ýÁæ¨ìîK¦kÈÓëyÀÌFL÷¹ ‡BX¦›‡²[æÑd¯d®¶Êtͷ›`º[ðvLßᘠì]1£ž˜.rÏícä5W¢}ÌtƒÛK•¯þ8‘•î ƒé6ÊÈ@tè¹k%|“ÿçn¶óø'˜a°ï‡›YÖbéþ央ÇyÏòþQlÞøÉ+cKÊbêixZTK¾‹Š) +Si@¯ŒFT¥Á/(VF^* ‚’Dͧ[wäŽÎ‚UFèˆrsÌEÝë|µZÀ°ôÌ;6R‰½2ø½òÌÎ]WÑ¥ƒêc[Úù+ã\†Ù#²<”÷ŠºCÇð%[xRŠó®TWnSƒÁÔÓ{_ƒÚÀûßÕeêdZHñˆ¿ö4¡ØV4uã”úk2k¢þX8ÚiÃj(¦vSôÆr˜0Ä­;¢™[¤ËÁ «ø^}I ^FeÞbŒ£ñÚ–èeº¦* \”ÀØM¤UuÙ“Ðá¤b5æI’È@£WºìTW¡œê¸Ë®xéM4ªDHê"¨‘‡÷³óhx4¦!µ¦¾²rñE÷Ëéˆ9Ÿo‰pêIøÒ¨]«²Õ˜j¦ \p,)ŸêþëûέÁ’7µh½CPMåĽŠ ]û³øÛz‚e¯‰[‡· pZùWqÌ/ ÆWdà|²àöú™~²ÆwÔ8¨â4¢HswÝ*·dc÷ι0üåëÎ +\³Jmû´ZTã"ÑË[ÈE†×¢_PV[ˆ]6qCò1uL{ +ˆ‹Ö’ k3gÍøQöµðð_ þè}WÐÌd±âËìrÉ"¢{r%“72…Îç¬y4Os¸_ÆÖ™­á Y·°™ãkt ÓT†!ûÙNe|,·ä†9ÐÚ—Çm´7¶*¾q¥ +½†qäköçùÙí§,ʼn³Ðg´7ìô~¢ëøæ•,3£Þ gD†M aÆòo½ó*Ö=¨uHe£'#/7Բƚe‹Ç Å쮇û}çt7JëçK¦‘uâx(W ¦,)•ÖìÞWXS¤fuÑ›:ï:´Îxæ| ‹ÎÚ:¿hreHHË-ÁsË#dÔút3ŒîÇÒcœ5­™ ÆU› ò²L•1Ò  ¶Mx»ŸC7*ƒàû,…æö쉈X7dˆríÈ„¸Ò üþ;æ xWß*7Sü«õ$‹ÎÖtÀ§fk:üÆæ¬V>j‚¨2ÆuÛpKN†WñïH°‹ºÀŒîú +¯{õPkv0)ãl®”ƒc×»|¶}üFH0á´×¥éð"{š–Â8g?]>_-鬘JŠ­[4`—΃¡3ê˜î§ïÆu…IO5ªÏ¡¦´8›=n옪@Ü[¬@Êôe\Äp¤1D£‹YÇäï¥$„Ho 휷Íè)÷¯€Úmƒ]is tâQµ½µµÙ$8·rŠãH‡ 1ÆŸ `•81Tª%§óלeµšRÌéhË*n‹¦zˆQ†ªp~^˜,‹Ñ +eäóã/×wzvï¯hç(²ž5¦?yY3@6µSxñ,€lƒMþÝi«¾÷߉Â/W„w°‰8ª…FL× ’¤,*y‡ ©±Ô&•# õˆgé-Î^«S=<ß>FÌtIezþ}ØoÛ;5ý©ÏuPÛ&Y†h"ñaº1b¹°ÝøÚ’¬³‹Òjrï:Gü^Y^×Ì–ãKÖT™?!¸4¾*B.L=3dgÛN´eJ}C>¿™Æ§€þp–ë0Èâ<Ï-•’€âqÏÓ'[i†÷³G^3­^U2÷Ò t¹ñÚfJ 䞈õž%Àâþe„m¦Â&y¹–Ò§ +^zŠzìhšÕ€“2l( |•½S¦l¹£•Å j©ä:rVh¶âWŸ!rg1뢻‚ÜJµX•+*röÒ¨_åa*Êdiw¶'ždÏÞrÎ[‹GôVÞLYþkk¡J7†U*?3«ò–"ö/s5·D ¬š^axìÓÙÌUs*Ö…®fÑvÓwlÝ( I¬ër¿D5RÀ‰MONØ ×¸/ lÞ÷;löÏo9ž˜ç|¿ ¹ׯãu_B·91hÅÛ\F&Œë”p7èû?ÿ±/;‘ŒgQfÛåøआ[gOÅ–©ðv0º2†É=‹¼ê-»×÷˜4Cn’Šý(¨xèeõ¶â†àˆÍ´37y\Åz¼Y˜y©]·Sóá²)LK{ ¾f®Ü«~Væ­™>ëYqŒ)Ov©†<³ÐÈ^5`;ÞíktçnJV ̯rhyk隣ÒLP®p/KK6L¬Á3g5ñÏhNá>à†íòèXœÍŒóNìtÊ}åz·¸Óœ¶A†Ò ‚š©Ü#3 N}œù}”©‚¡Ç¤¥æºVtÝÏë°€tÿ;x½Ë°÷ƒÞ„æɃônE›c0kÞP;Sæ ß9UØßÙ–E›'ÌòWÑËÒÖŒ˜KBÇéqê*¾yo‚ä½.óWÃÜöÊ·ÉˇÁÛ¼@(Õ«obpš3—wN0 +<Û~ýOSÊpÐ÷8pÌ1µWjläô½ÔxdìX8‹²cŒ: @yͱWΰäÚeZAÁcÐD’6β ^w=X ÉA²•Å1Ñ1B¢¨Ô=ò&†²ªÉüÐ&uf`ˆg|¡Á×ÕáŠ]~Ø3—5ý·~wÕ+Þ¿„£P ¼c„Ó‘E,ÊHt„šÍ{UÚ6ÔÀ·'h=o«æÕÜQC¨&sù¨cÈ%˵â¡8SHßG+¬÷æ2 F²ªF6s8Gìez¤¯ì…œƒÍv¸Ø¶¯D =ˆð8¿ñ:.7½™(ú­¦ì ®°ßNКºÛ,d护•<*—¡‹Rí£“€þ9q´Â`>Û -ŽÂý¾ÔÇzÖ0笎ÚË!ê§Eë8Û,ÌÞÅ%×éG,rÓ˜,‡ï±[­8g Íªæ|Åqœ•eÔƒaIÜ6ÔZ”B¬ÉVÈ{Ú1­•Áâ`ôLG†äež3Ä{t‘ߤª|—kbZu­ìL’h 1ªV¸Ýg> ?#Déë`œ„îýñЈ5ü˜&Êh¹Ï¸€·gþ>{éJcnkïqíY˜èo{9^®äåU„"R0\RÉ‹ÓvaYÀÃ’ñ ÊÀfx8 o«yÇŸ½å·‰¿CI16 QŒ?ß7^h $¢Â«ELf«fˆRÚŒ“êÍ—ªèÚU!îE9:¦/°Š\`똼¹¸HBÊǸ²L]!²^ÝÒ£6$ª?bÛÉ¡æá ¦ £Æž̧tš•W†¤|Ô߈~ŒÇ›r­Ð<},ž0cñ»[`Í“lTôQs¡qKÖ»óÞ89Ÿ·§?h£þF@ep;%·…wvR_—iÂàæÿ¡d9õKöö‡°{æLD.1¦¾áRû’à.TéƒsÐå_ +]Ä;ào×*ÐCú‰ÀÏTÌCÈNTí—^Y56|§Û’fö/;j»õ3Û^ýa´bPôÅ,W—=À^~®|Pþ¸Ówq.ÌÒçb·Õô™7(x£À³RáŒz}©ÔfA²¥!Ê4憘V3Óµ} +Àñ)ý﾿¿ LHö  :k(>²üfì¶2 @^áKš]šìI[p8d +W†pÆEVضô¶o5¡36ÿ>m:´á“_œcÞÆ Á"¥íKW—<ÿ×ýÝ¡Áz©¶8†ö®¢ÏpòÁÅÛ ‰ÉøÝ7u ÏÂtqªòÞ/ôçÐ1lÝëÍɯ.Ò®Ül&¶è±6¢sDLˆ'‘L:×ü!|@_[¤Éû I~‡;¨}¸ø0xfòœ;V1xdŠƒŒ“Í®L'Óû­¯ðRˆ·Õ_íÛédݾ ÌGšPàÀÍ Ý[»ùÏõõ$ÊŽ Ã§¸.”'í'6Ý+ŽìúX«²7©AFe+fÀlû7ÄàÏ9Xº½žWs>Ãf¦†ªí^Rˆ1¿6²gÍ×Ï0§.’[.cÿS]í?CúðñP¬ÜuŠµ…Ýÿ!rmÂoÒÛø +qcl¥\âüY…z>¥‰- 1áôAá$ÿ}É”g”ÔßÏ¢’#Óž9É¢Ì5>üœ…šâjÆKŽZ“ú/¯4Qw>Ø_ÜÏH², — ÎyÏXhøð©´€îòÌAñ»²Õ¼¯‹ª8q(Bópž¬qÈ#4§7Àr]l‚-‡¦W/BL3H*ý‰C*=käØôsW:›ÌUfõn UNÔf*A-ÝrŽa0¨u÷¥¬·ÇK‡¨7™z=ïI³Ûv(æ.r"o‡C$1íìf˜%¿«·ÒR[Ó&ͼn[™²ÞŒµ~ƒM¤{òMèEõ?zgñÍHÎEO/ „)UëÆù“<øêúT÷ûw8Ê»ÛäÖž`ÀÂ0`vQd[PTöœàÂÎ<í¯µ£­ëhïsMM™à*öv6´ –@×ÿø¾â 7y7Dµk@|Ç]R]Ô tìà›À “xÇ›%ÇÊh”|:s?!Z B¹+&˜n€Ie~c¶ž¹×®X-kW»Ð"W—àCY“€Úa›ÝÖ’yúSÕ…šû#ýQ™´Ç”K­‚«±»Òî¬ån—è6†ÝâüÍú—ªþý¡‰Ò:+5a8r6‘ÙŠ—¨qçÿ«•þ|k.2+«fð¹ª<€»—­íó³ô\@1W׶ÏÐÁÍš QðïUÍCéÈPg+ý!¶—Q-S$dß gK¹ ã˜©œr%]"%}†"-Iέ۞@Èz(´@ %“u»7fÒ¦d[n©NþÐ’’ X¡”ÚkØOÆ#;ôW%Aþ•–èCȸ fw Ï"¡QÀÆ• ßÍ·Í÷³^[3î)Ÿ—Þb³ ©cÌÉ¢O76¯4µ„X1<ñ*57;O2f"}nÙ¸…’TOùž°Üi(i܉ý\êç Û—³ñÛͺô¿@³ÒiéˆÞélÄw.ËW”÷ã¼yÁ«®œ½Ì~lýËï5ÅÔæ&-‹oÀ.‡p/O8=ý¦„ûÍ>êC¶"ù¼APë7ÿI­V˜Ñ9¯ˆaXAçt±éš4Á|xØU6d¬M„”PöSSƒ½"¦ z–LÀT­O˜¯Þ)ÉCÁù•ÏòñýÅß!U.BµÊüCoQ57å1ãL¢%¢?^Uèo*d€²rÊ…ß¡cè|–À¥(—‰ÜƒÞuJé„#çÙ‡y'Nõæµóÿª +¬HÞô!WC›í:2L~‡©RT¾* ô ÒnG_¡¥©–™¤ŠœÒy`½¾³àŒÓ„,V¬;Iúº¦“ÇtÊ)6gökªšf=¿¼@ïF +GšÈ·p ‘O÷œ'd•Ò.ü*ïÿn¨*õ3ßÀ7ª™a¡1žCyá» ¦.írúT2&ŽkÍ*Í¿7Ò9ZŠ¬?˜S’¶ÛMë•v b39tÛÕkIô&†`ò€&ûÞ‹ÈŠÔôMè>NiCôç—J7ªÚí}õ×eqLÑ32í;xÝ1ºõÿGò¦Û«7^úÙko3J¼³<ˆV¬/¯hšwáñÜ€ à%V„vìʶÓóq{N"4\©öZà ճÕ˜@ãZúmþ‘ø ;û» ê¨ïIäÕ(Õ’,* …dóf{*o\_Ì’"q®ET ªÿCäÐF!lÂ[L>÷Š9¬ýÁ÷ÖÀn'³KýjGº-;ì|tAõ‘œRkD'Å?k%”ÿ‡J*t‚(½#KNí]ê”$‡Öåi¬ãÃÛcf¥Š±&&ôô›=±Õ',‘I6…1BîøàB"ð¹{˜q’Ú m§'ů 'Km ¼^w“[¿BéË‘ôª(¾î_v +ïÿlV@ÍY@iÆôõ©B¡ø‘—¬öxõ\“,·ü¹‰†%‹ÒŸVŸÂ¢^dL«Zÿ"‹œ¦D’¯Å<R-ÉTc…±vÊ"ˆ} Ì##’Ÿ‚:3¦ðøü§€t=MÁ€»)‡i(t“XF9ßõØ¢²ÔÉ5ì½áîîøŸhMø°È ÏG‡Ó/K.aí(Íúf¬ÊØq á°èÚÈõ2l²Ì¤ 9Ë$Pš[õ˜î*×”O5ZlPbµù Ê1ÅÏ2ù‰…ˆ5´Ñ?­S£y]`® í^#d,Ú#‘ÔClÞjæŽ\%eIÐß<—ï`''¸Ö¿ÑzvVóÜ9Àø€ßJÂë#¶6çIàôRIÂk=Ò=¼MÈhñ’09\ ”‹r…ð4"jÃO=Yºt`½Z9X£bÜãDŸb@1qŸ˜^U}¼ž¬Œ>mTõr\žØ7 C» ÜóáÝ…µYÖ,Ú¨W;_†“ÚGŸåŽks•S†4z‹†¹Çûy>ê25íÉ^mƒWr]ËBoæ‰Ú|`A±_ œ`ïŠXa?ƒN¿ˆ +piþÎ ñ…ÈÀDŸ\.AĈH5¢“Ì9x ûÚêÆ:|øl°¿›œ5Ø6|@û£çªëÔò–`TdÝü¸Ó¢ŽçCCÀ®•À¬F 9Åm`•áHï-ó!Æ"Âï‹ß¸ÓÖVÒï`ÜäçmÃLµ¦™7=Ö;¢‘iRBúïèŸ3€ ÿnR:J5‹t XìL)ðF–:„l\|!Ì´Ç™?©Ðrù/jú aÒ›”Wå(èE1 +wd³>õÆÅå(”¸ ×z_æá ×HšëÃ×Ù¼gN7 èô‡…XœÓÞ4›_)~d˜_ÁZ‚œHÉï‘òK‘ï·ñ–3Z"Í?Lh'z÷Ý‹÷KK#´ÌþUmçz |ÝjùõÈȨYãÒv}ª,ü ™˜RÆA‰Ç}F*è|³…öv‰9Pð©ù¿xï·£y?`†‡¢9ë­°ÛÖR};ÒHb#5«Ô K>ŽQó¸i|ïXgy†4EâÄCùŽ÷"Æ8õß@<ÉÝØBÅ5-©ÞØ'ëÜì¸ß&‡Óü-¦H_Œð…ôºŸé¯|‘X!1ÙÑMbB„38M)íUîê“q®{µbÆS1GOeM#V> endobj xref +0 37 +0000000008 65535 f +0000000000 00000 f +0000016720 00000 n +0000016647 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000016 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000163 00000 n +0000018153 00000 n +0000018231 00000 n +0000043290 00000 n +0000017105 00000 n +0000018791 00000 n +0000018647 00000 n +0000018534 00000 n +0000017344 00000 n +0000017592 00000 n +0000017640 00000 n +0000018418 00000 n +0000018449 00000 n +0000018302 00000 n +0000018333 00000 n +0000018865 00000 n +0000019009 00000 n +0000020361 00000 n +0000043322 00000 n +trailer <<98702769C1B24085A272824F5FB09B4C>]>> startxref 43526 %%EOF \ No newline at end of file diff --git a/doc/store/S-20247.tpl.tex b/doc/store/S-20247.tpl.tex new file mode 100644 index 0000000..a6944c4 --- /dev/null +++ b/doc/store/S-20247.tpl.tex @@ -0,0 +1,43 @@ +\documentclass{article} +\usepackage{microtype} +\usepackage[paper=letterpaper,layoutwidth=11in,layoutheight=8.5in,portrait]{geometry} +\usepackage[newdimens]{labels}% let the package do the work... +\usepackage{graphicx} +\usepackage[scaled]{helvet} +\usepackage[T1]{fontenc} +\graphicspath{ {.} {/tmp/labels/} } +\renewcommand\familydefault{\sfdefault} +% +\LabelGridtrue +\LabelInfotrue +% +%\LabelGridfalse +%\LabelInfofalse +% +\LabelCols=4 +\LabelRows=8 +% +\LeftPageMargin=0.25in +\RightPageMargin=0.25in +\TopPageMargin=0.5in +\BottomPageMargin=0.5in +% +\InterLabelColumn=0mm% adjust as required +\InterLabelRow=0mm +% +\RightLabelBorder=1mm% adjust to taste +\LeftLabelBorder=1mm +\TopLabelBorder=6mm +\BottomLabelBorder=1mm +% +\setlength{\baselineskip}{0pt} +\setlength{\emergencystretch}{3em} +\setlength{\lineskip}{0pt} +\setlength{\parindent}{0pt} +\setlength{\parskip}{0pt} +\setlength{\tabcolsep}{0pt} +% +\numberoflabels=1% set to 1 when you fill in the individual labels - this will just repeat 1 instance 20 times to show the layout. +% +\begin{document} +% diff --git a/doc/store/avery-5160.tex b/doc/store/avery-5160.tex new file mode 100644 index 0000000..39a5285 --- /dev/null +++ b/doc/store/avery-5160.tex @@ -0,0 +1,59 @@ +\documentclass{article} +%\usepackage[default]{comicneue} +%\usepackage[sfdefault]{noto} +\usepackage[scaled]{helvet} +\usepackage[T1]{fontenc} +\usepackage[T1]{fontenc} +\usepackage[paper=letterpaper,layoutwidth=11in,layoutheight=8.5in,portrait]{geometry} +\usepackage[newdimens]{labels}% let the package do the work... +\usepackage{graphicx} +\usepackage{ragged2e} +\usepackage{microtype} +\graphicspath{ {.} {/tmp/labels/} } +\renewcommand\familydefault{\sfdefault} +% +\LabelGridtrue +\LabelInfotrue +% +%\LabelGridfalse +%\LabelInfofalse +% +\LabelCols=3 +\LabelRows=10 +% +\LeftPageMargin=0.21975in +\RightPageMargin=0.21975in +\TopPageMargin=0.5in +\BottomPageMargin=0.5in +% +\InterLabelColumn=0.14in % adjust as required +\InterLabelRow=0mm +% +\RightLabelBorder=1mm% adjust to taste +\LeftLabelBorder=1mm +\TopLabelBorder=0.3in +\BottomLabelBorder=1mm +% +\numberoflabels=30% set to 1 when you fill in the individual labels - this will just repeat 1 instance 20 times to show the layout. +% +\tolerance=9999 +\emergencystretch=10pt +\hyphenpenalty=100000 +\exhyphenpenalty=100 +\setlength{\parskip}{0pt} +\setlength{\lineskip}{0pt} +\setlength{\baselineskip}{0pt} +\fontdimen2\font=0pt +% +\begin{document} + +\genericlabel{% + \begin{minipage}{2in}% adjust as desired + %{\scriptsize \textls[-60]{REALLY VERY LONG, REALLY, REALLY, REALLY, LONG, REALLY VERY LONG, REALLY, REALLY, REALLY, LONG, LONG LONG, PRODUCT NAME}} \vspace*{1pt} \\ + {\scriptsize \textls[-60]{{Hello World}}} \vspace*{1pt} \\ + \begin{tabular}{p{0.59\linewidth} p{0.41\linewidth}} + {\Huge PRICE} & {\includegraphics[trim={0 0.5in 0 0.5in},clip,width=1in]{1}} \\ + \end{tabular} + \end{minipage}} + +\end{document} diff --git a/doc/todo.md b/doc/todo.md new file mode 100644 index 0000000..292a30e --- /dev/null +++ b/doc/todo.md @@ -0,0 +1,69 @@ +# Backend Changes +- [Done] Abritrary drag and drop (e.g. from main deck -> extra deck) +- [Done] optimum qty - cards in decks +- [Done] The "Optimum Qty" is "The number of times the card appears in + each deck (e.g. 3) times the number of decks it appears in times + 5". I think that's just SELECT COUNT(PASSCODE) ? And for + constructed decks it would be the same. + +- [In Progress] Constrcuted-Deck-Overview +- [In Progress] Storing / Saving / Updating optimum Qty +- [In Progress] Number in inventory of this card - what is this? The total SUM count from all YGO-SET-ITEMs? +- [In Progress] Created / Sold status - I think this is done already... +- [In Progress] Inverse Priority system (more cards = sell more, less cards = hold more) + +- [ ] Arbitrary inventories (Secondary Inventory, ...) + +# Categories + +- [In Progress] Better UI +- [ ] Show Decks from "subcategories" of current Category + +# Database +- [Done] Yu-Gi-Oh + - [Not Implemented] Images from CrystalCommerce + We just got API access too. + + - [Not Implemented] Attach card image to specific card + Nobody seemed to want to upload card images individiually. + + - [Done] Qty of card: number of times card appears in decks x multiplier (default x1) + This is implemented but it doesn't display on the web frontend. + +- [ ] Pokemon +- [ ] Magic + +# Constructed Deck Overview + +- [ ] TODO + +# Inventory + +We deleted the Crystal Commerce stuff. Maybe it will make a comeback. + +# UI Improvements +- [In progress] Many, many, many, subtle UI bugs... + +- [ ] Deck-Overview shows: + - [ ] constructed Decks based on this deck + - [ ] sold decks + - [ ] Use this information x a multiplier to construct "optimal qty." of cards to keep in stock. +- [ ] Deck Builder Sub children category + +# Other + +- [ ] Constructed Deck Overview Panel +- [ ] when its sold and how often it sells based on deck sells +- [ ] Remove Category removes decks from category +- [ ] Peronsalized decks via inventory qty +- [ ] CC API for DB Connect +- [ ] Output to text / CSV +- [ ] Environment variable for translation WITH-LOCALE + +# Not Implemented Yet +- [ ] Import new stuff from Crystal Commerce on the Web UI +- [ ] Export to CSV for TCGPlayer Card Sorting Machines +- [ ] Sync with our App - TCG Machines? I looked into their stuff. It + looks very proprietary. Perhaps I should take a look at it. + +Check your notepad for notes diff --git a/doc/web/nginx/deck-builder b/doc/web/nginx/deck-builder new file mode 100644 index 0000000..2763371 --- /dev/null +++ b/doc/web/nginx/deck-builder @@ -0,0 +1,27 @@ +server { + listen [::]:80; + listen 80; + + server_name phntsm.ddns.net; + + root /var/www/html; + + location / { + return 301 https://$host$request_uri; + } + + location /.well-known/acme-challenge/ { + alias /var/www/challenges/; + try_files $uri =404; + } + + location ~ /\.ht { + deny all; + } + + location /nginx_status { + stub_status; + allow 127.0.0.1; #only allow requests from localhost + deny all; #deny all other hosts + } +} diff --git a/doc/web/nginx/deck-builder-tls b/doc/web/nginx/deck-builder-tls new file mode 100644 index 0000000..9e16810 --- /dev/null +++ b/doc/web/nginx/deck-builder-tls @@ -0,0 +1,122 @@ +server { + listen [::]:443 default_server ssl; + listen 443 default_server ssl; + + server_name phntsm.ddns.net; + + ssl_certificate "/etc/ssl/nginx/phntsm.ddns.net.crt"; + ssl_certificate_key "/etc/ssl/nginx/phntsm.ddns.net.key"; + ssl_dhparam "/etc/ssl/nginx/phntsm.ddns.net.dhparam"; + + ssl_session_timeout 5m; + ssl_protocols TLSv1.2; + ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; + ssl_session_cache shared:SSL:50m; + ssl_prefer_server_ciphers on; + + root /var/www/html; + index index.html; + + location / { + # First attempt to serve request as file, then + # as directory, then fall back to displaying a 404. + # try_files $uri $uri/ =404; + + set_real_ip_from unix:; + real_ip_header X-Forwarded-For; + real_ip_recursive on; + + client_max_body_size 8m; + #auth_basic "Restricted Content"; + #auth_basic_user_file /etc/nginx/.htpasswd; + + proxy_read_timeout 300; + proxy_connect_timeout 300; + proxy_send_timeout 300; + fastcgi_read_timeout 300; + + proxy_pass http://127.0.0.1:5005; + include /etc/nginx/fastcgi_params; + include /etc/nginx/proxy_params; + } + + # /~user web directories + location ~ ^/~(.+?)(/.*)?$ { + alias /home/$1/www$2; + index index.html index.htm; + autoindex on; + } + + # location /_/static/assets/ { + # alias /home/git/public/; + # } + + location /git/ { + auth_basic "Restricted Content"; + auth_basic_user_file /etc/nginx/.htpasswd; + + proxy_read_timeout 300; + proxy_connect_timeout 300; + proxy_send_timeout 300; + fastcgi_read_timeout 300; + + client_max_body_size 512M; + # make nginx use unescaped URI, keep "%2F" as is + rewrite ^ $request_uri; + rewrite ^/git(/.*) $1 break; + proxy_pass http://127.0.0.1:3000$uri; + include /etc/nginx/fastcgi_params; + include /etc/nginx/proxy_params; + } + + location ~ /collectd/ { + gzip off; + root /home/user/code/alpine-collectd-web; + + auth_basic "Restricted Content"; + auth_basic_user_file /etc/nginx/.htpasswd; + + proxy_read_timeout 300; + proxy_connect_timeout 300; + proxy_send_timeout 300; + fastcgi_read_timeout 300; + + #proxy_http_version 1.1; + rewrite ^/collectd/(.*) /$1 break; + proxy_pass http://127.0.0.1:8888; + } + + location ~ /psy/ { + auth_basic "Restricted Content"; + auth_basic_user_file /etc/nginx/.htpasswd; + + proxy_read_timeout 300; + proxy_connect_timeout 300; + proxy_send_timeout 300; + fastcgi_read_timeout 300; + + #proxy_http_version 1.1; + # rewrite ^/psy/(.*) /$1 break; + include /etc/nginx/proxy_params; + proxy_pass http://127.0.0.1:9292; + } + + # location ~ \.php$ { + # include /etc/nginx/fastcgi_params; + # include /etc/nginx/proxy_params; + # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + # # fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; + # fastcgi_pass unix:/var/run/php/php-fpm.sock; + # } + + # location ~ /phpmyadmin/ { + # auth_basic "Restricted Content"; + # auth_basic_user_file /etc/nginx/.htpasswd; + # index index.php; + # } + + location ~ /\.ht { + deny all; + } + +} diff --git a/doc/web/nginx/default b/doc/web/nginx/default new file mode 100644 index 0000000..c5af914 --- /dev/null +++ b/doc/web/nginx/default @@ -0,0 +1,91 @@ +## +# You should look at the following URL's in order to grasp a solid understanding +# of Nginx configuration files in order to fully unleash the power of Nginx. +# https://www.nginx.com/resources/wiki/start/ +# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/ +# https://wiki.debian.org/Nginx/DirectoryStructure +# +# In most cases, administrators will remove this file from sites-enabled/ and +# leave it as reference inside of sites-available where it will continue to be +# updated by the nginx packaging team. +# +# This file will automatically load configuration files provided by other +# applications, such as Drupal or Wordpress. These applications will be made +# available underneath a path with that package name, such as /drupal8. +# +# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples. +## + +# Default server configuration +# +server { + listen 80 default_server; + listen [::]:80 default_server; + + # SSL configuration + # + # listen 443 ssl default_server; + # listen [::]:443 ssl default_server; + # + # Note: You should disable gzip for SSL traffic. + # See: https://bugs.debian.org/773332 + # + # Read up on ssl_ciphers to ensure a secure configuration. + # See: https://bugs.debian.org/765782 + # + # Self signed certs generated by the ssl-cert package + # Don't use them in a production server! + # + # include snippets/snakeoil.conf; + + root /var/www/html; + + # Add index.php to the list if you are using PHP + index index.html index.htm index.nginx-debian.html; + + server_name _; + + location / { + # First attempt to serve request as file, then + # as directory, then fall back to displaying a 404. + try_files $uri $uri/ =404; + } + + # pass PHP scripts to FastCGI server + # + #location ~ \.php$ { + # include snippets/fastcgi-php.conf; + # + # # With php-fpm (or other unix sockets): + # fastcgi_pass unix:/run/php/php7.4-fpm.sock; + # # With php-cgi (or other tcp sockets): + # fastcgi_pass 127.0.0.1:9000; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} +} + + +# Virtual Host configuration for example.com +# +# You can move that to a different file under sites-available/ and symlink that +# to sites-enabled/ to enable it. +# +#server { +# listen 80; +# listen [::]:80; +# +# server_name example.com; +# +# root /var/www/example.com; +# index index.html; +# +# location / { +# try_files $uri $uri/ =404; +# } +#} diff --git a/doc/wiki.org b/doc/wiki.org new file mode 100644 index 0000000..33fcdef --- /dev/null +++ b/doc/wiki.org @@ -0,0 +1,55 @@ +#+TITLE: Wiki KB + +* Abbreviations + +- CG :: Card Game +- TCG :: Trading Card Game +- OCG :: Official Card Game + +* Links + +** Reference +- [[http://cheat.markdunkley.com/][Liquid Cheat Sheet]] +- [[https://challonge.com/pricing][Challonge]] +- [[https://decks.tcgplayer.com/magic][TCGPlayer Deck Builder - MTG]] +- [[https://jqlang.github.io/jq/tutorial/][JQ Tutorial]] +- [[https://keyrune.andrewgioia.com][Keyrune Magic: the Gathering set symbol font]] +- [[https://lisptips.com/post/11728375873/initform-and-default-initargs][:initform and :default-initargs]] +- [[https://npm.io/package/ydke][ydke]] +- [[https://scryfall.com/docs/api][Scryfall is a powerful Magic: The Gathering card search]] +- [[https://www.db.yugioh-card.com/yugiohdb/][Konami Yu-Gi-Oh! DB]] +- [[https://www.masterduelmeta.com/][Master Duel Meta]] +- [[https://www.noip.com/integrate/request][No-IP Dynamic DNS Support]] +- [[https://www.sqlite.org/lang_analyze.html]] +- [[https://www.toptal.com/designers/htmlarrows/][HTML Arrows]] +- [[https://yugioh.fandom.com/wiki/Template:Rarities][Template:Rarities]] +- [[https://yugipedia.com/wiki/][Yugipedia]] +- [[https://www.db.yugioh-card.com/yugiohdb/forbidden_limited.action][Forbidden / Limited List]] +- [[https://www.youtube.com/watch?v=sy7dtW8CvQ4][How Do MTG Card Sorting Machines Compare?]] + +*** Might Be Useful +- [[https://dev.pokemontcg.io/][PokemonTCG API Dev Portal]] +- [[https://github.com/FelixRilling/yugioh-deck-tool][Yu-Gi-Oh! Deck Tool]] +- https://github.com/AccelerationNet/function-cache +- https://github.com/OpenBookStore/openbookstore +- https://github.com/lispnik/iup +- https://github.com/mmontone/sxql-composer + +** Fun +- [[https://ygopro.org/yugioh-card-maker/][Custom Yu-Gi-Oh Card Maker]] +- [[https://pokecardmaker.net/creator][Custom Pokémon Card Creator]] +- [[https://www.duelingbook.com/][Dueling Book]] +- [[https://gimp-tools.sourceforge.net/tools.shtml][Ofnuts' Gimp Tools]] +- [[https://www.deviantart.com/teufik2305/art/Yu-Gi-Oh-Playmat-60x35cm-with-Labeled-Zones-853628853][Yu-Gi-Oh! Playmat with Labeled Zones]] +- [[https://www.metamats.com/1-player-templates][1 Player Templates - Metamats]] + - [[https://images.squarespace-cdn.com/content/v1/58f293311b631b9852e71d4b/1591657147889-DOEJSUD8UN7KZ61YPYNQ/1Player+Zones-01.png?format=2500w]] + - [[https://images.squarespace-cdn.com/content/v1/58f293311b631b9852e71d4b/1591657047085-J5LQ9ABPX7HJQZD9DDEZ/1player+zones+Transparent-01-01.png?format=2500w]] + +** Tools + +- [[https://dnschecker.org/all-dns-records-of-domain.php][DNS Checker]] +- [[https://gitlab.com/fisxoj/sly-docker-poc/-/tree/master]] +- [[https://www.freecodecamp.org/news/rest-api-design-best-practices-build-a-rest-api/]] +- [[https://restfulapi.net/rest-api-design-tutorial-with-example/]] +- [[https://stackoverflow.com/a/34001943][multiple javascript queryselectors conditions]] +- [[https://dba.stackexchange.com/questions/89051/stored-procedure-to-update-an-adjacency-model-to-nested-sets-model]] diff --git a/doc/workflow.md b/doc/workflow.md new file mode 100644 index 0000000..6077b4f --- /dev/null +++ b/doc/workflow.md @@ -0,0 +1,50 @@ +# Workflow Design Doc + +## Overview + +The workflow for constructing decks is as follows: + +1. Create deck of cards. Currently we select from all cards. Maybe we + should just select cards from inventory. The majority of this + functionality in place and isn't expected to change. A deck will + always just be a list of cards plus metadata. + +2. The deck of cards has metadata about author, name of deck, time of + creation. The main content of the deck is three lists, comprising + the main, extra, and side decks. This information is not expected + to change in the future. Decks created by a particular user for + example. The underlying metadata representation is what's being + worked on. Currently each item in the database has all information + duplicated from the rest of the database. Changing the price for + one card changes the price for only that one card matching that row + in the database. There will be additional tables to store pricing + information in the next step. + +3. On the Deck Overview page, selecting "Pull Deck" will decrease the + inventory of the lowest priced card in inventory by one for every + card in the deck. This is like "add to cart" in an online shopping + platform, with additional inventory keeping. This is analagous to + the deck construction step, except instead of selecting cards to be + put into a deck, that information is provided a priori, and we use + that list of information to construct secondary lists. + +4. On the pulled deck page, for every card in the deck, you will be + able to select cards by edition, condition, and rarity of every + card in the inventory matching that card's passcode. I can + conceive a very simple concept where you attempt to check out, and + then are returned with error messages saying which items had + errors. This is the current approach. + +5. There will be an intermediate stage. Once there is enough inventory + and the deck is "pulled" it will enter an area where each + individual card will be selected. e.g. selecting the rarity or set + of a particular card in each deck. + +6. Once all "errors" are resolved (banlists, constraings, etc), the + "pulled" deck will allow you to "construct" it, which will finalize + the state of this pulled deck in the database, moving it to another + table, the list of decks for sale. + +7. The list of decks for sale is just pulled, constructed decks with + pricing information attached and whether or not it was sold and + what price it was sold at and when. diff --git a/doc/ygoprodeck-import.md b/doc/ygoprodeck-import.md new file mode 100644 index 0000000..1dd133e --- /dev/null +++ b/doc/ygoprodeck-import.md @@ -0,0 +1,149 @@ +# Introduction + +The [Yu-Gi-Oh! API by YGOPRODeck](https://ygoprodeck.com/api-guide/) provides the following information. + +# Data + +The base data for cards. This is always returned, without asking for `?misc=Yes`. + +JSON Node Name: `data` + +## All Cards + +Every card has these attributes. + +- `id`: Passcode on the bottom left of the card. +- `desc`: Card description / effect text. +- `frameType`: The backdrop type that this card uses (normal, effect, synchro, spell, trap, etc.). +- `name`: Name of the card. +- `type`: The type of card you are viewing (Normal Monster, Effect Monster, Synchro Monster, Spell Card, Trap Card, etc.). + +## Monster Cards + +Cards that attack or defende have ATK and DEF. E.g. Spell and Trap do +not have these attributes, except Race. The Race of a Spell card is +"Spell" and the Race of a trap card is "Trap". + +- `atk`: The ATK value of the card. +- `attribute`: The attribute of the card. +- `def`: The DEF value of the card. +- `level`: The Level/RANK of the card. +- `race`: The card race which is officially called type (Spellcaster, Warrior, Insect, etc). + +## Spell/Trap Cards + +- `race`: The card race which is officially called type for Spell/Trap Cards (Field, Equip, Counter, etc). + +## Card Archetype + +- `archetype`: The Archetype that the card belongs to. Alan takes + feedback on Archetypes + [here](https://github.com/AlanOC91/YGOPRODeck/issues/10). + +## Additional Response for Pendulum Monsters + +- `scale`: The Pendulum Scale Value. + +## Additional Response for Link Monsters + +- `linkval`: The Link Value of the card if it's of type "Link Monster". +- `linkmarkers`: The Link Markers of the card if it's of type "Link Monster". This information is returned as an array. + +# Set Info + +JSON Node Name: `data.card_sets` + +Fields: + +- `set_code` +- `set_name` +- `set_price` +- `set_rarity` +- `set_rarity_code` + +# Images + +JSON Node Name: `data.card_images` + +Fields: + +- `image_url` +- `image_url_cropped` +- `image_url_small` + +# Pricing + +JSON Node Name: `data.card_prices` + +Fields: + +- `amazon_price` +- `cardmarket_price` +- `coolstuffinc_price` +- `ebay_price` +- `tcgplayer_price` + +# `misc_info` + +JSON Node Name: `data.misc_info` + +Fields: + +- `beta_id` +- `beta_name` +- `downvotes` +- `has_effect` +- `konami_id` +- `misc_info` +- `ocg_date` +- `question_atk` +- `question_def` +- `staple` +- `tcg_date` +- `treated_as` +- `upvotes` +- `views` +- `viewsweek` + +[Using &misc=yes will now show question_atk and/or question_def to be 1 for true if a card is found to have a ? in the data.] +(https://github.com/AlanOC91/YGOPRODeck/issues/152#issuecomment-1032552854) + +## Banlist Info + +JSON Node Name: `data.misc_info.banlist_info` + +Fields: + +- `ban_goat` +- `ban_ocg` +- `ban_tcg` + +## Formats + +JSON Node Name: `data.misc_info.formats` + +Values: + +- `Common Charity` +- `Duel Links` +- `Edison` +- `GOAT` +- `OCG` +- `OCG GOAT` +- `Speed Duel` +- `TCG` + +## Link Markers + +JSON Node Name: `data.misc_info.linkmarkers` + +Values: + +- `Top` +- `Top-Right` +- `Right` +- `Bottom-Right` +- `Bottom` +- `Bottom-Left` +- `Left` +- `Top-Left` diff --git a/locale/en_US/LC_MESSAGES/cl-deck-builder2.mo b/locale/en_US/LC_MESSAGES/cl-deck-builder2.mo new file mode 100644 index 0000000000000000000000000000000000000000..5bdc195dc6eb43f0b1875178ac0ba950d559a970 GIT binary patch literal 1590 zcmeH_OKTKM6vxY}UUhswaiMs|EL60{nGqpQG7%qI2f@?eR&WyB30?)afwSNd@D6wmEWj<`Q*aOX z42=0-fCRn;w}T(S=<`1~2JYEBnzzBjn9qTeaA7d6e~zRCz5=7)zhLzH3`V~%VD#IK zOY}PkM!yqa^g9JczbO!(ie)hRm0-;O1SIeuF#5d&qu(2F4E(S@-~8vuk3i^+YJss9 zREL3A!yGYxbc_*e?#0+0C+mTf;sC~u_4zI^?k&bXjQG#K1==)<>zpjpnxd372TsXX zNy6UO#k6zQQB`WI(%fXUlxuEK->s6$RBkSd8_emV!ssfP{&rGA!aSjs)8d?cR(rxl?)0tfyUO-__*@yXqd{E)(l00 zr7*}naiMZeDoq`H8)D9uUd%(qGijSqZW=#Kb3<5{SQBznu~@JLBMG*(5{s=kYqFm< zxA3hE{ed#ezD{?UG8<^sR*ni3R2etK?O}H|dPb9q29B4yC)d=;sWmluUQLO+tP@ll zme(>xyX9h)>y%x)F7DZi&^vP~MCaI-p|-OR(K^{nE`}GB5kKL$&!id5a(Aah1HT0(Yq0Y+sPgOS0Xh_JvNXb+(D9-BdovzEj3)6|C#f zl`7amg*;JOuTsW_9hRr~&}0?1EBma94jF5B<5`E;Jh;73o9WF=e|K#)nzd_aHCikC zt0fcyKMvJq1#)SljGwTFUi*TkE6~KJ2{Qx6MuGx#uxKYo7a_7THdg( f@GvNcQ{Qb*(CD^%+EBeqtuqrf@%upkdI$O|5gC}z literal 0 HcmV?d00001 diff --git a/locale/en_US/LC_MESSAGES/cl-deck-builder2.po b/locale/en_US/LC_MESSAGES/cl-deck-builder2.po new file mode 100644 index 0000000..429471a --- /dev/null +++ b/locale/en_US/LC_MESSAGES/cl-deck-builder2.po @@ -0,0 +1,242 @@ +#: templates/builder/index.html +#, lisp-format +msgid "Deck Builder" +msgstr "" + +#: templates/construct/select-sets.html +#, lisp-format +msgid "Select Card Sets" +msgstr "" + +#: templates/contact/admin.html +#, lisp-format +msgid "Nothing to see here!" +msgstr "" + +#: templates/contact/admin.html +#, lisp-format +msgid "Oops" +msgstr "Oops" + +#: templates/contact/admin.html +#, lisp-format +msgid "Feedback Admin Panel" +msgstr "" + +#: templates/contact/index.html +#, lisp-format +msgid "Try typing it up in Notepad, then Copy/Paste." +msgstr "" + +#: templates/contact/index.html +#, lisp-format +msgid "" +"You can type up a message here and submit it for the administrator to see." +msgstr "" + +#: templates/contact/index.html +#, lisp-format +msgid "Contact Us" +msgstr "" + +#: templates/decks/_field_control_select.html +#, lisp-format +msgid "None" +msgstr "" + +#: templates/decks/index.html +#, lisp-format +msgid "Deck List" +msgstr "" + +#: templates/index.html +#, fuzzy, lisp-format +msgid "Click the links at the top to get started." +msgstr "Click the links in the sidebar to get started." + +#: templates/index.html +#, lisp-format +msgid "Welcome to cl-deck-builder2!" +msgstr "Welcome to cl-deck-builder2!" + +#: templates/index.html +#, lisp-format +msgid "Index" +msgstr "Index" + +#: templates/kde-team.html +#, lisp-format +msgid "KDE Team Deck Listing" +msgstr "" + +#: templates/label-maker.html +#, lisp-format +msgid "Label Maker" +msgstr "" + +#: templates/qr.html +#, lisp-format +msgid "QR Code Generator" +msgstr "" + +#: templates/tabs.html +#, lisp-format +msgid "Tabs" +msgstr "" + +#: templates/upload.html +#, lisp-format +msgid "File Uploader" +msgstr "" + +#: templates/user/admin.html +#, lisp-format +msgid "User Admin Panel" +msgstr "" + +#: templates/user/login.html +#, lisp-format +msgid "Login" +msgstr "" + +#: templates/user/register.html +#, lisp-format +msgid "Register" +msgstr "" + +# English translations for cl-deck-builder package. +# Copyright (C) 2023 THE cl-deck-builder'S COPYRIGHT HOLDER +# This file is distributed under the same license as the cl-deck-builder package. +# Automatically generated, 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: cl-deck-builder 2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-10 19:17+0000\n" +"PO-Revision-Date: 2023-09-20 23:11+0000\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: en_US\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/i18n.lisp:60 +msgid "Please login to continue" +msgstr "Please login to continue" + +#: src/web/upload.lisp:67 +#, lisp-format +msgid "Upload success! ~a" +msgstr "Upload success! ~a" + +#: src/web/upload.lisp:70 +msgid "Error uploading file. Try again?" +msgstr "Error uploading file. Try again?" + +#: src/web/upload.lisp:85 +#, lisp-format +msgid "No such attachment #~d" +msgstr "No such attachment #~d" + +#: src/web/contact.lisp:45 +msgid "Feedback cleared." +msgstr "Feedback cleared." + +#: src/web/contact.lisp:47 src/web/contact.lisp:72 src/web/qr.lisp:38 +#: src/web/ydk.lisp:14 src/web/ydk.lisp:25 src/web/decks.lisp:121 +#: src/web/decks.lisp:138 src/web/label-maker.lisp:125 src/web/user.lisp:79 +#: src/web/user.lisp:83 +msgid "Something went wrong. Try again?" +msgstr "Something went wrong. Try again?" + +#: src/web/contact.lisp:71 +msgid "Thanks! We got your message." +msgstr "Thanks! We got your message." + +#: src/web/category.lisp:65 src/web/decks.lisp:137 +msgid "Success!" +msgstr "Success!" + +#: src/web/builder.lisp:220 +#, lisp-format +msgid "Deck ~a already exists in database; loading..." +msgstr "" + +#: src/web/builder.lisp:224 +#, lisp-format +msgid "Creating deck ~a into database." +msgstr "" + +#: src/web/builder.lisp:279 +#, lisp-format +msgid "Found entry ~A (~d); loading...~%" +msgstr "" + +#: src/web/builder.lisp:298 +#, lisp-format +msgid "Found entry ~A (~d); renaming to ~a.~%" +msgstr "" + +#: src/web/decks.lisp:64 +msgid "Nothing to see here..." +msgstr "" + +#: src/web/decks.lisp:242 +msgid "No Name" +msgstr "No Name" + +#: src/web/decks.lisp:290 +#, lisp-format +msgid "Deck ~a deleted success!" +msgstr "Deck ~a deleted success!" + +#: src/web/toolkit.lisp:29 +msgid "Please log in." +msgstr "Please log in." + +#: src/web/label-maker.lisp:108 +msgid "No files." +msgstr "" + +#: src/web/label-maker.lisp:122 +#, lisp-format +msgid "Success! Download link: labels.pdf" +msgstr "" + +#: src/web/user.lisp:23 +#, fuzzy, lisp-format +msgid "You are already logged in as: ~a" +msgstr "You aren't logged in." + +#: src/web/user.lisp:29 +msgid "A user with that email is already registered." +msgstr "" + +#: src/web/user.lisp:43 +#, lisp-format +msgid "Hello, ~a!" +msgstr "Hello, ~a!" + +#: src/web/user.lisp:47 +msgid "Incorrect password." +msgstr "Incorrect password." + +#: src/web/user.lisp:50 +msgid "No user corresponding to this email address." +msgstr "No user corresponding to this email address." + +#: src/web/user.lisp:76 +#, fuzzy +msgid "Success! Please log in." +msgstr "Please log in." + +#: src/web/user.lisp:123 +msgid "Logged out." +msgstr "Logged out." + +#: src/web/user.lisp:124 +msgid "You aren't logged in." +msgstr "You aren't logged in." diff --git a/locale/templates/LC_MESSAGES/.gitignore b/locale/templates/LC_MESSAGES/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/locale/templates/LC_MESSAGES/cl-deck-builder2.pot b/locale/templates/LC_MESSAGES/cl-deck-builder2.pot new file mode 100644 index 0000000..caf484b --- /dev/null +++ b/locale/templates/LC_MESSAGES/cl-deck-builder2.pot @@ -0,0 +1,241 @@ +#: templates/builder/index.html +#, lisp-format +msgid "Deck Builder" +msgstr "" + +#: templates/construct/select-sets.html +#, lisp-format +msgid "Select Card Sets" +msgstr "" + +#: templates/contact/admin.html +#, lisp-format +msgid "Nothing to see here!" +msgstr "" + +#: templates/contact/admin.html +#, lisp-format +msgid "Oops" +msgstr "" + +#: templates/contact/admin.html +#, lisp-format +msgid "Feedback Admin Panel" +msgstr "" + +#: templates/contact/index.html +#, lisp-format +msgid "Try typing it up in Notepad, then Copy/Paste." +msgstr "" + +#: templates/contact/index.html +#, lisp-format +msgid "" +"You can type up a message here and submit it for the administrator to see." +msgstr "" + +#: templates/contact/index.html +#, lisp-format +msgid "Contact Us" +msgstr "" + +#: templates/decks/_field_control_select.html +#, lisp-format +msgid "None" +msgstr "" + +#: templates/decks/index.html +#, lisp-format +msgid "Deck List" +msgstr "" + +#: templates/index.html +#, lisp-format +msgid "Click the links at the top to get started." +msgstr "" + +#: templates/index.html +#, lisp-format +msgid "Welcome to cl-deck-builder2!" +msgstr "" + +#: templates/index.html +#, lisp-format +msgid "Index" +msgstr "" + +#: templates/kde-team.html +#, lisp-format +msgid "KDE Team Deck Listing" +msgstr "" + +#: templates/label-maker.html +#, lisp-format +msgid "Label Maker" +msgstr "" + +#: templates/qr.html +#, lisp-format +msgid "QR Code Generator" +msgstr "" + +#: templates/tabs.html +#, lisp-format +msgid "Tabs" +msgstr "" + +#: templates/upload.html +#, lisp-format +msgid "File Uploader" +msgstr "" + +#: templates/user/admin.html +#, lisp-format +msgid "User Admin Panel" +msgstr "" + +#: templates/user/login.html +#, lisp-format +msgid "Login" +msgstr "" + +#: templates/user/register.html +#, lisp-format +msgid "Register" +msgstr "" + +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-10 19:17+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/i18n.lisp:60 +msgid "Please login to continue" +msgstr "" + +#: src/web/upload.lisp:67 +#, lisp-format +msgid "Upload success! ~a" +msgstr "" + +#: src/web/upload.lisp:70 +msgid "Error uploading file. Try again?" +msgstr "" + +#: src/web/upload.lisp:85 +#, lisp-format +msgid "No such attachment #~d" +msgstr "" + +#: src/web/contact.lisp:45 +msgid "Feedback cleared." +msgstr "" + +#: src/web/contact.lisp:47 src/web/contact.lisp:72 src/web/qr.lisp:38 +#: src/web/ydk.lisp:14 src/web/ydk.lisp:25 src/web/decks.lisp:121 +#: src/web/decks.lisp:138 src/web/label-maker.lisp:125 src/web/user.lisp:79 +#: src/web/user.lisp:83 +msgid "Something went wrong. Try again?" +msgstr "" + +#: src/web/contact.lisp:71 +msgid "Thanks! We got your message." +msgstr "" + +#: src/web/category.lisp:65 src/web/decks.lisp:137 +msgid "Success!" +msgstr "" + +#: src/web/builder.lisp:220 +#, lisp-format +msgid "Deck ~a already exists in database; loading..." +msgstr "" + +#: src/web/builder.lisp:224 +#, lisp-format +msgid "Creating deck ~a into database." +msgstr "" + +#: src/web/builder.lisp:279 +#, lisp-format +msgid "Found entry ~A (~d); loading...~%" +msgstr "" + +#: src/web/builder.lisp:298 +#, lisp-format +msgid "Found entry ~A (~d); renaming to ~a.~%" +msgstr "" + +#: src/web/decks.lisp:64 +msgid "Nothing to see here..." +msgstr "" + +#: src/web/decks.lisp:242 +msgid "No Name" +msgstr "" + +#: src/web/decks.lisp:290 +#, lisp-format +msgid "Deck ~a deleted success!" +msgstr "" + +#: src/web/toolkit.lisp:29 +msgid "Please log in." +msgstr "" + +#: src/web/label-maker.lisp:108 +msgid "No files." +msgstr "" + +#: src/web/label-maker.lisp:122 +#, lisp-format +msgid "Success! Download link: labels.pdf" +msgstr "" + +#: src/web/user.lisp:23 +#, lisp-format +msgid "You are already logged in as: ~a" +msgstr "" + +#: src/web/user.lisp:29 +msgid "A user with that email is already registered." +msgstr "" + +#: src/web/user.lisp:43 +#, lisp-format +msgid "Hello, ~a!" +msgstr "" + +#: src/web/user.lisp:47 +msgid "Incorrect password." +msgstr "" + +#: src/web/user.lisp:50 +msgid "No user corresponding to this email address." +msgstr "" + +#: src/web/user.lisp:76 +msgid "Success! Please log in." +msgstr "" + +#: src/web/user.lisp:123 +msgid "Logged out." +msgstr "" + +#: src/web/user.lisp:124 +msgid "You aren't logged in." +msgstr "" diff --git a/locale/templates/LC_MESSAGES/djula.pot b/locale/templates/LC_MESSAGES/djula.pot new file mode 100644 index 0000000..f667e61 --- /dev/null +++ b/locale/templates/LC_MESSAGES/djula.pot @@ -0,0 +1,105 @@ + +#: templates/builder/index.html +#, lisp-format +msgid "Deck Builder" +msgstr "" + +#: templates/construct/select-sets.html +#, lisp-format +msgid "Select Card Sets" +msgstr "" + +#: templates/contact/admin.html +#, lisp-format +msgid "Nothing to see here!" +msgstr "" + +#: templates/contact/admin.html +#, lisp-format +msgid "Oops" +msgstr "" + +#: templates/contact/admin.html +#, lisp-format +msgid "Feedback Admin Panel" +msgstr "" + +#: templates/contact/index.html +#, lisp-format +msgid "Try typing it up in Notepad, then Copy/Paste." +msgstr "" + +#: templates/contact/index.html +#, lisp-format +msgid "You can type up a message here and submit it for the administrator to see." +msgstr "" + +#: templates/contact/index.html +#, lisp-format +msgid "Contact Us" +msgstr "" + +#: templates/decks/_field_control_select.html +#, lisp-format +msgid "None" +msgstr "" + +#: templates/decks/index.html +#, lisp-format +msgid "Deck List" +msgstr "" + +#: templates/index.html +#, lisp-format +msgid "Click the links at the top to get started." +msgstr "" + +#: templates/index.html +#, lisp-format +msgid "Welcome to cl-deck-builder2!" +msgstr "" + +#: templates/index.html +#, lisp-format +msgid "Index" +msgstr "" + +#: templates/kde-team.html +#, lisp-format +msgid "KDE Team Deck Listing" +msgstr "" + +#: templates/label-maker.html +#, lisp-format +msgid "Label Maker" +msgstr "" + +#: templates/qr.html +#, lisp-format +msgid "QR Code Generator" +msgstr "" + +#: templates/tabs.html +#, lisp-format +msgid "Tabs" +msgstr "" + +#: templates/upload.html +#, lisp-format +msgid "File Uploader" +msgstr "" + +#: templates/user/admin.html +#, lisp-format +msgid "User Admin Panel" +msgstr "" + +#: templates/user/login.html +#, lisp-format +msgid "Login" +msgstr "" + +#: templates/user/register.html +#, lisp-format +msgid "Register" +msgstr "" diff --git a/locale/templates/LC_MESSAGES/lisp.pot b/locale/templates/LC_MESSAGES/lisp.pot new file mode 100644 index 0000000..50c4602 --- /dev/null +++ b/locale/templates/LC_MESSAGES/lisp.pot @@ -0,0 +1,135 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-10 19:17+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/i18n.lisp:60 +msgid "Please login to continue" +msgstr "" + +#: src/web/upload.lisp:67 +#, lisp-format +msgid "Upload success! ~a" +msgstr "" + +#: src/web/upload.lisp:70 +msgid "Error uploading file. Try again?" +msgstr "" + +#: src/web/upload.lisp:85 +#, lisp-format +msgid "No such attachment #~d" +msgstr "" + +#: src/web/contact.lisp:45 +msgid "Feedback cleared." +msgstr "" + +#: src/web/contact.lisp:47 src/web/contact.lisp:72 src/web/qr.lisp:38 +#: src/web/ydk.lisp:14 src/web/ydk.lisp:25 src/web/decks.lisp:121 +#: src/web/decks.lisp:138 src/web/label-maker.lisp:125 src/web/user.lisp:79 +#: src/web/user.lisp:83 +msgid "Something went wrong. Try again?" +msgstr "" + +#: src/web/contact.lisp:71 +msgid "Thanks! We got your message." +msgstr "" + +#: src/web/category.lisp:65 src/web/decks.lisp:137 +msgid "Success!" +msgstr "" + +#: src/web/builder.lisp:220 +#, lisp-format +msgid "Deck ~a already exists in database; loading..." +msgstr "" + +#: src/web/builder.lisp:224 +#, lisp-format +msgid "Creating deck ~a into database." +msgstr "" + +#: src/web/builder.lisp:279 +#, lisp-format +msgid "Found entry ~A (~d); loading...~%" +msgstr "" + +#: src/web/builder.lisp:298 +#, lisp-format +msgid "Found entry ~A (~d); renaming to ~a.~%" +msgstr "" + +#: src/web/decks.lisp:64 +msgid "Nothing to see here..." +msgstr "" + +#: src/web/decks.lisp:242 +msgid "No Name" +msgstr "" + +#: src/web/decks.lisp:290 +#, lisp-format +msgid "Deck ~a deleted success!" +msgstr "" + +#: src/web/toolkit.lisp:29 +msgid "Please log in." +msgstr "" + +#: src/web/label-maker.lisp:108 +msgid "No files." +msgstr "" + +#: src/web/label-maker.lisp:122 +#, lisp-format +msgid "Success! Download link: labels.pdf" +msgstr "" + +#: src/web/user.lisp:23 +#, lisp-format +msgid "You are already logged in as: ~a" +msgstr "" + +#: src/web/user.lisp:29 +msgid "A user with that email is already registered." +msgstr "" + +#: src/web/user.lisp:43 +#, lisp-format +msgid "Hello, ~a!" +msgstr "" + +#: src/web/user.lisp:47 +msgid "Incorrect password." +msgstr "" + +#: src/web/user.lisp:50 +msgid "No user corresponding to this email address." +msgstr "" + +#: src/web/user.lisp:76 +msgid "Success! Please log in." +msgstr "" + +#: src/web/user.lisp:123 +msgid "Logged out." +msgstr "" + +#: src/web/user.lisp:124 +msgid "You aren't logged in." +msgstr "" diff --git a/old/api/api-v0.lisp b/old/api/api-v0.lisp new file mode 100644 index 0000000..fb4e0d4 --- /dev/null +++ b/old/api/api-v0.lisp @@ -0,0 +1,3 @@ +(in-package #:cl-deck-builder2.api) + +(defclass api-v0 ()) diff --git a/old/api/api-v1.lisp b/old/api/api-v1.lisp new file mode 100644 index 0000000..dfd8b47 --- /dev/null +++ b/old/api/api-v1.lisp @@ -0,0 +1,14 @@ +(in-package #:cl-deck-builder2.api) + +(defclass api-v1 (api-v0)) + +(defclass db-metaclass (standard-object) + ((create) + (find) + (select) + (update) + (delete))) + +(defclass deck () + () + (:metaclass db-metaclass)) diff --git a/old/api/package.lisp b/old/api/package.lisp new file mode 100644 index 0000000..3a760ef --- /dev/null +++ b/old/api/package.lisp @@ -0,0 +1,6 @@ +(in-package #:cl-user) + +(defpackage #:cl-deck-builder2.api + (:use :cl)) + +(in-package #:cl-deck-builder2.api) diff --git a/old/hermetic.lisp b/old/hermetic.lisp new file mode 100644 index 0000000..fe3535b --- /dev/null +++ b/old/hermetic.lisp @@ -0,0 +1,43 @@ +;;;; src/web/hermetic.lisp +;;;; +;;;; demo quick reference +;;;; + +(in-package #:cl-deck-builder2.web) + +(defroute ("/hermetic" :method :GET) () + (if (hermetic:logged-in-p) + (progn + (flash :messages (format nil "Welcome, ~A!" (hermetic:user-name))) + (render-with-env #P"/user/index.html")) + (render-with-env #P"/user/login.html"))) + +(defroute ("/hermetic/login" :method :POST) (&key _parsed) + (let ((username (query-param "username" _parsed)) + (password (query-param "password" _parsed))) + (handler-case + (ratify:with-parsed-forms + ((:string username) + (:string password)) + (let ((params (list :|username| username :|password| password))) + (login params + (cl-markup:html5 (:h1 "You are logged in")) + (cl-markup:html5 (:h1 "Wrong password :c")) + (cl-markup:html5 (:h1 "No such username " params))))) + (ratify:combined-error (e) + (flash :errors e) + (redirect "/hermetic"))))) + +(defroute ("/hermetic/logout" :method :GET) () + (logout + (cl-markup:html5 (:h1 "You are logged out")) + (cl-markup:html5 (:h1 "You are not logged in.")))) + +(defroute ("/hermetic/users-only" :method :GET) () + (auth (:user) + (cl-markup:html5 (:h1 "If you are seeing this, you are a user.")))) + +(defroute ("/hermetic/admins-only" :method :GET) () + (hermetic:auth (:admin) + (cl-markup:html5 (:h1 "If you are seeing this, you are an admin.")) + (cl-markup:html5 (:h1 "Custom auth denied page. You are not authorized!")))) diff --git a/old/lack-middleware-secure.lisp b/old/lack-middleware-secure.lisp new file mode 100644 index 0000000..ac9c495 --- /dev/null +++ b/old/lack-middleware-secure.lisp @@ -0,0 +1,168 @@ +;;; +;;; See http://diary.wshito.com/comp/lisp/clack/lack-middleware-session/ +;;; for explanation. +;;; + +(ql:quickload 'clack) +(ql:quickload 'lack) + +(defun starts-with (str prefix) + (when (>= (length str) (length prefix)) + (string= (subseq str 0 (length prefix)) prefix))) + +;;; Middleware to proctect the secure area +;;; :uidãŒè¨­å®šã•ã‚Œã¦ã„ãªã„å ´åˆï¼Œprotected-pathã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã¨ +;;; redirect関数を呼ã³å‡ºã—ã¦ãƒ­ã‚°ã‚¤ãƒ³ãƒšãƒ¼ã‚¸ã¸ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã™ã‚‹ï¼Ž +(defun secure-mw (redirect protected-path) + (lambda (app) + (lambda (env) + ;; preprocessing + (let* ((url (getf env :path-info)) + (session (getf env :lack.session)) + (uid (gethash :uid session))) + (if (and (null uid) + (dolist (prefix protected-path) + (when (starts-with url prefix) (return t)))) + (progn + ;;当åˆã®ã‚¢ã‚¯ã‚»ã‚¹å…ˆã‚’セッション変数ã«ä¿å­˜ + (setf (gethash :prev-url session) url) + (funcall redirect)) + (funcall app env)))))) + +;;; ログインページã¸ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã™ã‚‹ãƒ¬ã‚¹ãƒãƒ³ã‚¹ã‚’è¿”ã™ï¼Ž +(defun redirect-to-login-page () + '(303 (:location "/login") (""))) + +(defun get-uid (env) + (gethash :uid (getf env :lack.session))) + +(defun get-session-id (env) + (getf (getf env :lack.session.options) :id)) + +(defun get-change-id (env) + (format nil "~A" (getf (getf env :lack.session.options) :change-id))) + +(defun page-header (env) + `("

Lack Session Middleware Test

+

--- Login Logout Example ---

+
    +
  • Access any directories. Any directories under '/private' needs to be logged in to access.
  • +
  • Session ID: " ,(get-session-id env) "
  • +
  • :change-id = " ,(get-change-id env) "
  • +
+
")) + +(defun status (uid) + (if uid + `("

You are logged in as " ,uid ". (logout)

") + `("

Login

"))) + +(defun page-footer () + '("")) + +(defun login-form () + ;; /auth ã«uidã¨passwdã‚’POST + '("

Use 'wshito' for username, 'mypass' for password.

+
+

Username: +

+

Password: +

+

+
")) + +;;; ログインページ +(defparameter *login* + (lambda (env) + (let ((uid (get-uid env))) + `(200 (:content-type "text/html") + ,(append (page-header env) + (if uid + (list "

You are already logged in as " uid ".

") + (login-form)) + (page-footer)))))) + +;;; ログアウトページ +(defparameter *logout* + (lambda (env) + (setf (getf (getf env :lack.session.options) :expire) t) + `(200 (:content-type "text/html") + ,(append (page-header env) + (list "

You have logged out.

") + (page-footer))))) + +;;; èªè¨¼é–¢æ•° +(defun authenticate (name password) + (and (string= name "wshito") + (string= password "mypass"))) + +;;; :body-parameters内ã«ã¯POSTã§é€ã‚‰ã‚ŒãŸãƒ‘ラメータãŒï¼Œãƒ‰ãƒƒãƒˆå¯¾ +;;; ã®ãƒªã‚¹ãƒˆã¨ã—ã¦ä¿æŒã•ã‚Œã¦ã„る.ã“ã®å ´åˆã ã¨ï¼Œ +;;; (("uname" . "wshito") ("passwd" . "mypass")) +(defparameter *auth* + (lambda (env) + (let* ((params (getf env :body-parameters)) + (name (cdr (assoc "uname" params :test #'string=))) + (pass (cdr (assoc "passwd" params :test #'string=)))) + (if (and (= (length params) 2) + (authenticate name pass)) + (let* ((session (getf env :lack.session)) + (url (gethash :prev-url session "/"))) + (setf (gethash :uid session "/") name) + (setf (getf (getf env :lack.session.options) :change-id) t) + `(303 (:location ,url) (""))) + (redirect-to-login-page))))) + +;;; ログインãŒå¿…è¦ãªprivateエリア +(defparameter *private* + (lambda (env) + (let* ((session (getf env :lack.session)) + (uid (gethash :uid session nil)) + ;; /privateã«mountã—ã¦ã„ã‚‹ã®ã§pathã«ã¯/privateãŒå«ã¾ã‚Œãªã„ + (path (concatenate 'string "/private" (getf env :path-info)))) + `(200 (:content-type "text/html") + ,(append (page-header env) + (status uid) + (list "

Private Area: path = " path "

") + (page-footer)))))) + +;;; +;;; Main App +;;; +(defparameter *sample-app* + (lambda (env) + (let* ((session (getf env :lack.session)) + (uid (gethash :uid session)) + (path (getf env :path-info))) + (when (null uid) (setf (gethash :prev-url session) path)) + `(200 (:content-type "text/html") + ,(append (page-header env) + (status uid) + (list "

path = " path "

") + (page-footer)))))) + +;;; +;;; Creates Lack Application +;;; builderãƒã‚§ãƒ¼ãƒ³ã®æœ€å¾Œã ã‘ãŒ1é‡lambdaã§ï¼Œãれ以外ã¯2é‡lambda. +;;; builderã•ã‚Œ*app*ã«æ¸¡ã•ã‚Œã‚‹å†…容ã¯å¤–å´ã®lambdaå¼ãŒfuncallã§å‘¼ã³ã ã•ã‚ŒãŸ +;;; 後ã®çµæžœï¼Žå¤–å´ã®lambdaã¯builder時ã«å®Ÿè¡Œã•ã‚Œã‚‹ï¼Ž +(defparameter *app* + (lack:builder + :session + (secure-mw #'redirect-to-login-page '("/private")) + (:mount "/login" *login*) + (:mount "/auth" *auth*) + (:mount "/logout" *logout*) + (:mount "/private" *private*) + *sample-app*)) + +;;; +;;; Starts the Web server +;;; +(defparameter *handler* + (clack:clackup *app*)) + +;;; +;;; Stops the Web server +;;; +;; (clack:stop *handler*) diff --git a/old/readme.md b/old/readme.md new file mode 100644 index 0000000..99252dc --- /dev/null +++ b/old/readme.md @@ -0,0 +1 @@ +old code diff --git a/old/web-route-test.lisp b/old/web-route-test.lisp new file mode 100644 index 0000000..487e355 --- /dev/null +++ b/old/web-route-test.lisp @@ -0,0 +1,34 @@ +;;;; +;;;; src/web/web-test.lisp +;;;; +;;;; This is a test for Lack.Middleware.Mount +;;;; +;;;; Eventually I want all the web routes to be their own package, +;;;; maybe integrated better with the models. +;;;; + +(in-package #:cl-user) + +;; TODO I could probably start moving all this stuff into packages.lisp + +(defpackage #:cl-deck-builder2.web.web-test + (:use :cl + :caveman2) + (:local-nicknames + (#:v #:org.shirakumo.verbose)) + (:import-from :cl-deck-builder2.view + :render) + (:export :*web-test*)) + +(in-package #:cl-deck-builder2.web.web-test) + +;; +;; Application +;; + +(defclass () ()) +(defvar *web-test* (make-instance ')) +(clear-routing-rules *web-test*) + +(defroute "/" () + (format nil "Test!~%")) diff --git a/old/ygoprodeck-json.lisp b/old/ygoprodeck-json.lisp new file mode 100644 index 0000000..adc0bea --- /dev/null +++ b/old/ygoprodeck-json.lisp @@ -0,0 +1,137 @@ +#| + +Legacy Code + +Scheduled For Deletion + +YGOProDeck v1 JSON Importer + +|# + +(in-package #:cl-user) + +(defpackage #:cl-deck-builder2.models.ygoprodeck.json + (:use :cl + :cl-deck-builder2.db + :cl-deck-builder2.models.ygoprodeck) + (:local-nicknames + (#:v #:org.shirakumo.verbose)) + (:export :json-import-cardinfo)) + +(in-package #:cl-deck-builder2.models.ygoprodeck.json) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defvar *json* nil + "The currently loaded \"cardinfo.php\" data pulled from YGOProDeck +API. You may have to munge it into \"cardinfo.json\" with jq: + + $ jq . < cardinfo.php > cardinfo.json +") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; GET-NEW-CARDINFO got renamed to YGOPRODECK2:FETCH-CARDINFO. +;; Actually, basically everything got moved into YGOPRODECK2. This is +;; legacy code. + + +(defun json-import-cardinfo (path &optional (force nil)) + (load-cardinfo path force) + + (let ((lst ())) + ;; CARD is an ALIST + (dolist (card *json*) + (let (;; Banlist_Info: Unused + ;; (banlist-info (assoc-utils:aget card :banlist--info)) + + ;; Card Images: Variant Artwork + ;; Skip the first one with REST + (card-images (rest (assoc-utils:aget card :card--images))) + + ;; make a copy: we munge it + (card-prices (copy-alist (assoc-utils:aget card :card--prices))) + ;; make a copy: we munge it + (card-sets (copy-alist (assoc-utils:aget card :card--sets))) + ;; Link Markers: Unused + ;; (linkmarkers (assoc-utils:aget card :linkmarkers)) + + ;; make a copy: we munge it + (card-misc-info (copy-alist (assoc-utils:aget card :misc--info))) + + ;; '((:banlist--info) + ;; (:card--images) + ;; (:card--prices) + ;; (:card--sets) + ;; (:linkmarkers) + ;; (:misc--info)) + + (passcode (assoc-utils:aget card :id)) + (base-fields (assoc-utils:alist-plist + (json-cardinfo-base-fields card)))) + + ;; First import all the base data + (push (apply #'make-instance 'ygo-info base-fields) lst) + + ;; Card images, variant artwork, I'm not sure how to handle + ;; it. Here's a dirty hack! If there are any variant images + ;; with passcodes, just create a duplicate entry with the same + ;; data from the parent. I'm sure a separate table is a better + ;; way to handle this information, but I don't know how to do + ;; that right now! + (dolist (card-image card-images) + (let ((id (assoc-utils:aget card-image :id))) + (setf (getf base-fields :passcode) id) + (push (apply #'make-instance 'ygo-info base-fields) lst))) + + ;; TODO Ban List Info + ;; Append :passcode to all banlist-info for this card + ;; (dolist (banlist banlist-info) + ;; (setf banlist (acons :passcode passcode banlist)) + ;; (apply #'mito:create-dao 'banlist-info + ;; (assoc-utils:alist-plist banlist))) + + ;; Append :passcode to all card-prices for this card + (dolist (card-price card-prices) + (setf card-price (acons :passcode passcode card-price) + ;; Data Transformation + (car (assoc :cardmarket--price card-price)) :cardmarket + (car (assoc :tcgplayer--price card-price)) :tcgplayer + (car (assoc :ebay--price card-price)) :ebay + (car (assoc :amazon--price card-price)) :amazon + (car (assoc :coolstuffinc--price card-price)) :coolstuffinc) + (push (apply #'make-instance 'ygo-price (assoc-utils:alist-plist card-price)) + lst)) + + ;; Append :passcode to all card-sets for this card + (dolist (card-set card-sets) + (setf card-set (acons :passcode passcode card-set) + ;; Data Transformation + (car (assoc :set--name card-set)) :name + (car (assoc :set--code card-set)) :code + (car (assoc :set--rarity card-set)) :rarity + (car (assoc :set--rarity--code card-set)) :rarity-code + (car (assoc :set--price card-set)) :price) + (push (apply #'make-instance 'ygo-set (assoc-utils:alist-plist card-set)) + lst)) + + ;; misc_info + misc_info.formats + ;; (dolist (misc-info card-misc-info) + ;; (setf card-set (acons :passcode passcode card-set) + ;; ;; Data Transformation + ;; (car (assoc :set--name card-set)) :name + ;; (car (assoc :set--code card-set)) :code + ;; (car (assoc :set--rarity card-set)) :rarity + ;; (car (assoc :set--rarity--code card-set)) :rarity-code + ;; (car (assoc :set--price card-set)) :price) + ;; (push (apply #'make-instance 'ygo-set (assoc-utils:alist-plist card-set)) + ;; lst)) + + )) + (do-grouped-insert lst))) + +;; TODO linkmarkers +;; Append :passcode to all linkmarkers for this card +;; (dolist (linkmarker linkmarkers) +;; (setf linkmarker (acons :passcode passcode linkmarker)) +;; Data Transformation +;; (apply #'mito:create-dao 'linkmarker +;; (assoc-utils:alist-plist linkmarker))) diff --git a/preamble.lisp b/preamble.lisp new file mode 100644 index 0000000..db7877f --- /dev/null +++ b/preamble.lisp @@ -0,0 +1,17 @@ +#| + +preamble.lisp + +For whatever reason, I don't keep this project in my +~/quicklisp/local-projects directory. So I have this preamble bit +of code that will push your current directory to Quicklisp. + +|# + +;; Assume the project is in the current working directory. It's +;; harmless, probably. +(eval-when (:compile-toplevel :load-toplevel :execute) + (pushnew (uiop:getcwd) ql:*local-project-directories*) + + ;; Load em' up. We use SLY so load SLYNK instead of SWANK here. + (ql:quickload '(:cl-deck-builder2 :slynk))) diff --git a/print-deps.lisp b/print-deps.lisp new file mode 100644 index 0000000..f30b721 --- /dev/null +++ b/print-deps.lisp @@ -0,0 +1,24 @@ +#| + +print-deps.lisp + +Output dependency information extracted from the ASDF:DEFSYSTEM. + +TODO Integrate this with the Dockerfile. + +|# + +(defparameter +extra-depends-on+ + '(:hunchentoot :woo :slynk/trace-dialog :slynk/profiler :slynk/mrepl :slynk/indentation + :slynk/fancy-inspector :slynk/arglists :slynk)) + +(defun format-deps (system &optional (stream *standard-output*) extra-depends-on) + (format stream "(ql:quickload (list ~{~s~^ ~}))~%" (system-deps system extra-depends-on))) + +(defun system-deps (system &optional extra-depends-on) + (mapcar (alexandria:compose #'alexandria:make-keyword #'string-upcase) + (sort (remove-duplicates + (append extra-depends-on + (asdf:system-depends-on + (asdf:find-system system)))) + #'string<))) diff --git a/ruby/config.ru b/ruby/config.ru new file mode 100644 index 0000000..4313c76 --- /dev/null +++ b/ruby/config.ru @@ -0,0 +1,21 @@ +# Easiest way to run Sidekiq::Web. +# Run with "bundle exec rackup simple.ru" + +require 'sidekiq' + +# A Web process always runs as client, no need to configure server +Sidekiq.configure_client do |config| + config.redis = { :size => 1, url: 'redis://localhost:6379', namespace: 'psychiq' } +end + +# In a multi-process deployment, all Web UI instances should share +# this secret key so they can all decode the encrypted browser cookies +# and provide a working session. +# Rails does this in /config/initializers/secret_token.rb +secret_key = SecureRandom.hex(32) +use Rack::Session::Cookie, secret: secret_key, same_site: true, max_age: 86400 + +require "sidekiq/web" +map '/psy' do + run Sidekiq::Web +end diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 0000000..be303db --- /dev/null +++ b/src/.gitignore @@ -0,0 +1 @@ +*.fasl diff --git a/src/config.lisp b/src/config.lisp new file mode 100644 index 0000000..3cd1b22 --- /dev/null +++ b/src/config.lisp @@ -0,0 +1,121 @@ +#| + +src/config.lisp + +Configuration skeleton generated by Caveman. + +Additional changes: + +*public-directory* :: This is where YGOProDeck images and things generated *by the "public" are stored. + +Database Configuration: + +We use :MEMORY for SQLite in-memory,currently :MAINDB is the default +database which is an SQLite3 file in this directory, and :MYSQL is our +MariaDB testbed server we're planning on migrating to. + +|# + +(in-package :cl-user) + +(defpackage #:cl-deck-builder2.config + (:use #:cl) + (:import-from #:envy + #:config-env-var + #:defconfig) + (:export #:config + #:*application-root* + #:*public-directory* + #:*static-directory* + #:*template-directory* + + #:*app-log-file* + + #:appenv + #:developmentp + #:productionp) + (:documentation "Configuration package. Using Envy configuration switcher. Mostly default from Caveman2 skeleton generator. I added a bunch of documentation.")) + +(in-package :cl-deck-builder2.config) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(setf (config-env-var) "APP_ENV") + +(defparameter *application-root* + (asdf:system-source-directory :cl-deck-builder2) + "The source directory of this web application.") +(defparameter *public-directory* + (probe-file #P"~/public/") + "The absolute path to the directory where we serve public files from.") +(defparameter *static-directory* + (merge-pathnames #P"static/" *application-root*) + "The absolute path to the directory where we serve static files from.") +(defparameter *template-directory* + (merge-pathnames #P"templates/" *application-root*) + "The absolute path to the directory where we find and compile templates from.") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defparameter *app-log-file* + (merge-pathnames + (make-pathname + :name (local-time:format-timestring + nil (local-time:now) + :format local-time:+rfc3339-format/date-only+) + :type "log") + (merge-pathnames + *public-directory* + (user-homedir-pathname))) + "The log file for this instance of the app to use. We don't really care about conflicts at this point, as we :APPEND. + +Possibly in the future use the git commit id.") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Configurations +(defconfig :common + `(:databases + ((:memory :sqlite3 :database-name ":memory:") + (:maindb :sqlite3 :database-name + ,(asdf:system-relative-pathname + :cl-deck-builder2 "deck_builder" :type "sqlite3")) + (:mysql :mysql + :host "127.0.0.1" + :port 3306 + :database-name "deck_builder" + :username "deck_builder" + :password "deck_builder")) + :server (:address "0.0.0.0" :port 5005 :server :woo) + :slynk (:interface "0.0.0.0" + :port 4005 + :style :spawn + :dont-close t) + :websocket (:address "0.0.0.0" :port 5001))) + +(defconfig |development| + '()) + +(defconfig |production| + '()) + +(defconfig |test| + '()) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun config (&optional key) + "Query the configuration environment information. + +ARGUMENTS +KEY The key to query from the configuration." + (envy:config #.(package-name *package*) key)) + +(defun appenv () + "Get the current environment variable value. Default is ~APP_ENV~." + (uiop:getenv (config-env-var #.(package-name *package*)))) + +(defun developmentp () + "Return T if the application is in \"development\" mode." + (string= (appenv) "development")) + +(defun productionp () + "Return T if the application is in \"production\" mode." + (string= (appenv) "production")) diff --git a/src/db.lisp b/src/db.lisp new file mode 100644 index 0000000..81ee6b0 --- /dev/null +++ b/src/db.lisp @@ -0,0 +1,295 @@ +#| + +src/db.lisp + +Database / connection skeleton generated by Caveman. + +Additional changes: + +WITH-DATAFLY-CONNECTION :: Same as WITH-CONNECTION, but we use +DATAFLY:*CONNECTION* instead of MITO.CORE:*CONNECTION*. + +WITH-DATAFLY-TRANSACTION is the same. + +TODO: I would like to be able to specify :MITO or :DATAFLY. + +TODO Test this stuff + +DONE Caveman has a db module and dbi manager middleware - Looks +useless. We already have CONNECT-CACHED in db.lisp. + +|# + +(in-package :cl-user) + +(defpackage #:cl-deck-builder2.db + (:use #:cl) + (:import-from #:cl-deck-builder2.config + #:config) + (:import-from #:cl-deck-builder2.toolkit + #:grouped + #:relative-pathname) + (:import-from #:cl-dbi + #:connect-cached) + (:export #:connection-settings + #:db + #:with-connection + #:with-transaction + #:with-datafly-connection + #:with-datafly-transaction + #:with-includes + + #:do-grouped-insert + + #:count-dao + #:create-dao + #:delete-by-values + #:delete-from + #:delete-dao + + #:create-table + #:drop-table + #:recreate-table + + #:find-dao + #:find-or-make-instance + #:find-or-create-instance + #:insert-dao + #:max-dao + #:retrieve-by-sql + #:retrieve-dao + #:save-dao + #:select-dao + #:update-dao) + (:documentation "The database package. + +This is more than just the default generated by Caveman2 skeleton. + +It provides convenience functions for accessing database information and objects.")) + +(in-package #:cl-deck-builder2.db) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun connection-settings (&optional (db :maindb)) + "Query the Caveman configuration for these database settings. DB is the name of the configuration query, e.g. :MAINDB." + (cdr (assoc db (config :databases)))) + +(defun db (&optional (db :maindb)) + "Get a handle to an open database, possibly cached with CONNECT-CACHED." + (apply #'connect-cached (connection-settings db))) + +(defmacro with-connection (conn &body body) + "Wrap BODY using LEXICAL-LET to bind MITO.CORE:*CONNECTION* to CONN." + ;; TODO + ;; `(if (and (listp ,conn) + ;; (eq (type-of ,(car conn)) 'cl-dbi::dbi-connection)) + ;; (let ((,(car conn) ,(cdr conn))) + ;; ,@body)) + `(let ((mito.core:*connection* ,conn)) + ,@body)) + +(defmacro with-transaction (&body body) + "Wrap BODY with CL-DBI:WITH-TRANSACTION." + `(cl-dbi:with-transaction mito.core:*connection* + ,@body)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; What's a better way to do this? DEFGENERIC? +(defmacro with-datafly-connection (conn &body body) + "Wrap BODY using LEXICAL-LET to bind DATAFLY:*CONNECTION* to CONN." + `(let ((datafly:*connection* ,conn)) + ;; (datafly:*trace-sql* t)) + ,@body)) + +(defmacro with-datafly-transaction (&body body) + "Wrap BODY with CL-DBI:WITH-TRANSACTION. Datafly variant." + `(cl-dbi:with-transaction datafly:*connection* + ,@body)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; I didn't realize that this implicitly only allows SELECT-DAO. I +;; guess in the MITO documentation he only allows SELECT-DAO to have +;; MITO:INCLUDES machinery. Where is that captured? For now, I assume +;; you know this, and that WITH-INCLUDES is only compatible with +;; SELECT-DAO anyway. +(defmacro with-includes (class includes &body body) + `(mito:select-dao ,class + ,includes + ,@body)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; What happened here? It used to work now it's returning NIL. A LOOP +;; is nicer than a DOLIST+SETF but... +(defun do-grouped-insert (obj &key (n 1000) (fn #'mito:insert-dao)) + "Batch INSERT-DAO to the database. Display a progress bar." + (let ((pos 0) + (width 50) + (grouped (grouped obj n))) + (with-connection (db) + (loop for group in grouped + collect + (prog1 + (with-transaction + (mapcan fn group)) + (format t ".") + (if (>= pos (1- width)) + (progn + (setf pos 0) + (format t "~%")) + (incf pos)) + (finish-output)))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; TODO FIND-DAO-OR-MAKE-INSTANCE? +;; TODO Maybe merge FIND-OR-MAKE-INSTANCE and FIND-OR-CREATE-INSTANCE +(defun find-or-make-instance (class &rest args) + "Wrap MITO:FIND-DAO and if no result is returned, issue MAKE-INSTANCE for CLASS." + (with-connection (db) + (with-transaction + (or (apply #'mito:find-dao class args) + (apply #'make-instance class args))))) + +(defun find-or-create-instance (class &rest args) + "Wrap MITO:FIND-DAO and if no result is returned, issue CREATE-DAO for CLASS." + (with-connection (db) + (with-transaction + (or (apply #'mito:find-dao class args) + (apply #'mito:create-dao class args))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; DAOs +(defmacro select-dao (class &body body) + "Select an object of CLASS from the database by wrapping MITO:SELECT-DAO in WITH-CONNECTION etc. + +Note that SELECT-DAO is a DEFMACRO form. + +You may additionally specify BODY parameters that are SXQL statements." + `(with-connection (db) + (with-transaction + (mito:select-dao ,class ,@body)))) + +(defun delete-from (class &rest clauses) + "Delete entries for CLASS by wrapping SXQL:DELETE-FROM. + +You may additionally specify CLAUSES parameters that are SXQL statements." + (with-connection (db) + (with-transaction + (mito:execute-sql + (apply #'sxql:make-statement :delete-from + (sxql:make-sql-symbol + (mito.class:table-name (find-class class))) + clauses))))) + +(defun count-dao (class &rest fields-and-values) + "Count the number of entries matching this CLASS using FIELDS-AND-VALUES. + +Simply wrap MITO:COUNT-DAO in WITH-CONNECTION etc." + (with-connection (db) + (with-transaction + (apply #'mito:count-dao class fields-and-values)))) + +(defun create-dao (class &rest initargs) + "Create an entry for this CLASS by wrapping MITO:CREATE-DAO in WITH-CONNECTION etc." + (with-connection (db) + (with-transaction + (apply #'mito:create-dao class initargs)))) + +(defun max-dao (class &rest fields-and-values &key (field :id)) + "Select the aggregate MAX from the SQL database and return the result, if any. + +You may additionally specify the FIELD to find the MAX by." + (setf class (mito.util::ensure-class class)) + (let ((sql (sxql:select ((:as (:ifnull (:max field) 0) :max)) + (sxql:from (sxql:make-sql-symbol + (mito.class:table-name class)))))) + (when fields-and-values + (sxql:add-child sql (mito.dao::where-and fields-and-values class))) + (getf (first + (retrieve-by-sql sql)) + :max))) + +(defun delete-by-values (class &rest fields-and-values) + "Delete an entry for this CLASS by wrapping MITO:DELETE-BY-VALUES. + +You may specify additional FIELDS-AND-VALUES to narrow your search." + (with-connection (db) + (with-transaction + (apply #'mito:delete-by-values class fields-and-values)))) + +(defun delete-dao (obj) + (with-connection (db) + (with-transaction + (mito:delete-dao obj)))) + +(defun find-dao (class &rest fields-and-values) + "Find an entry for this CLASS, if it exists, by wrapping MITO:FIND-DAO. + +You may specify additional FIELDS-AND-VALUES to narrow your search." + (with-connection (db) + (with-transaction + (apply #'mito:find-dao class fields-and-values)))) + +(defun insert-dao (obj) + "Insert an existing object OBJ into the database by wrapping MITO:INSERT-DAO in WITH-CONNECTION etc." + (with-connection (db) + (with-transaction + (mito:insert-dao obj)))) + +(defun save-dao (obj) + "Save an existing object OBJ into the database by wrapping MITO:SAVE-DAO in WITH-CONNECTION etc." + (with-connection (db) + (with-transaction + (mito:save-dao obj)))) + +(defun update-dao (obj) + "Update an existing object OBJ into the database by wrapping MITO:UPDATE-DAO in WITH-CONNECTION etc." + (with-connection (db) + (with-transaction + (mito:update-dao obj)))) + +(defun retrieve-by-sql (sql &key binds) + "Retrieve a query from the database by wrapping MITO:RETRIEVE-BY-SQL in WITH-CONNECTION etc. + +I don't know what BINDS does. I think it has something to do with passing parameters to queries." + (with-connection (db) + (with-transaction + (mito:retrieve-by-sql sql :binds binds)))) + +(defun retrieve-dao (class &rest fields-and-values) + "Retrieve a row for this CLASS, if it exists, by wrapping MITO:RETRIEVE-DAO. + +You may specify additional FIELDS-AND-VALUES to narrow your search." + (with-connection (db) + (with-transaction + (apply #'mito:retrieve-dao class fields-and-values)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Tables +(defun create-table (&rest classes) + "Create tables for CLASSES by wrapping MITO:ENSURE-TABLE-EXISTS. + +CLASSES may be a list of classes to create corresponding tables for." + (with-connection (db) + (with-transaction + (mapcar (alexandria:compose #'mito:ensure-table-exists #'find-class) + classes)))) + +(defun drop-table (&rest classes) + "Drop tables for CLASSES by wrapping SXQL:DROP-TABLE. + +CLASSES may be a list of classes to drop corresponding tables for." + (with-connection (db) + (with-transaction + (mapcar (lambda (class) + (mito:execute-sql + (sxql:drop-table + (sxql:make-sql-symbol + (mito.class:table-name (find-class class))) + :if-exists t))) + classes)))) + +(defun recreate-table (&rest classes) + "DROP-TABLE then CREATE-TABLE for CLASSES." + (mapcar #'drop-table classes) + (mapcar #'create-table classes)) diff --git a/src/documentation.lisp b/src/documentation.lisp new file mode 100644 index 0000000..d6bef33 --- /dev/null +++ b/src/documentation.lisp @@ -0,0 +1,40 @@ +#| + +src/documentation.lisp + +DOCUMENTATION-UTILS helpers. + +Currently not in use. + +The intention of this file was to provide supplimental documentation. + +|# + +(in-package #:cl-deck-builder2) + +(setf docs.ext:*documentation* + (docs.ext:make-documentation-collection)) + +(defclass my-formatter (documentation-utils-extensions:rich-aggregating-formatter) + ()) + +(docs:define-docs + :formatter my-formatter) + +(defun find-undocumented-packages () + (mapcar + (lambda (pkg) + (documentation-utils:check :package (find-package pkg))) + '(cl-deck-builder2 + cl-deck-builder2-test + cl-deck-builder2.app + cl-deck-builder2.db + cl-deck-builder2.draw + cl-deck-builder2.toolkit + cl-deck-builder2.models + cl-deck-builder2.models.ygoprodeck + cl-deck-builder2.models.user + cl-deck-builder2.models.ydk + cl-deck-builder2.models.crystal-commerce + cl-deck-builder2.models.feedback + cl-deck-builder2.web))) diff --git a/src/draw.lisp b/src/draw.lisp new file mode 100644 index 0000000..8baa184 --- /dev/null +++ b/src/draw.lisp @@ -0,0 +1,277 @@ +#| + +draw.lisp + +The main drawing stuff from ImageMagick is handled here. We use +UIOP:RUN-PROGRAM. It's pretty clumsy, but it works for the types +of files we're working with. + +It could probably use some polishing up. Particularly the command +processing. Using INFERIOR-SHELL just calls UIOP:RUN-PROGRAM under the +hood anyway. Is it worth it for the extra param processing? It might +be slightly safer, certainly LISP-ier... + +|# +(in-package :cl-user) + +(defpackage #:cl-deck-builder2.draw + (:use #:cl) + (:local-nicknames (#:v #:org.shirakumo.verbose)) + (:import-from #:cl-deck-builder2.toolkit + #:make-static-filename-kind + #:relative-file-list + #:ygo-probe-file-list + #:static-probe-file-list) + (:import-from #:cl-deck-builder2.models + #:ydk-main-deck-of + #:ydk-extra-deck-of + #:ydk-side-deck-of) + (:export :draw-deck-image) + (:documentation "The Drawing package. + +We currently wrap ImageMagick on the command line using UIOP:RUN-PROGRAM. + +Cairo2 does not support JPEG. We generate a command pipeline with ~montage~ and ~convert~ binaries.")) + +(in-package #:cl-deck-builder2.draw) + +;; Rough class abstraction: +(defclass draw-pipeline () + ()) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defparameter *command* nil + "The current command line used in the drawing process. Useful for inspection/debug purposes.") + +(defparameter +convert-binary+ "convert" + "The path to ImageMagick ~convert~ binary.") + +(defparameter +montage-binary+ "montage" + "The path to ImageMagick ~montage~ binary.") + +;; This is for full deck list. I can have a few params for different +;; decks e.g. main, side, extra. +;; +;; TODO Having all these params is ugly. Maybe a hash table? +(defparameter +command-line-params-main-deck+ + ;;"-resize '421x614>' -geometry +5+5 -tile 10x") + ; "-geometry +5+5 -tile 10x -texture '/home/user/public/noise.png'" ;;'#ff8b53'" + "-geometry +5+5 -tile 10x -background '#FF8B53'" + "Parameters for making the MAIN deck. It's 10x cards wide, There's 5 px between cards. The color is from . + +This is for full main deck list. I can have a few params for different decks e.g. main, side, extra. This one is for the main deck. Parameters for making the MAIN deck: It's 10x cards wide,There's 5 px between cards.") + +(defparameter +command-line-params-extra-deck+ + ;; "-resize '421x614>' -geometry +5+5 -tile 15x") + "-geometry +5+5 -tile 15x -background '#BC5A84'" + "Parameters for making the EXTRA deck. It's 15x cards wide,There's 5 px between cards.") + +(defparameter +command-line-params-side-deck+ + ;; "-resize '421x614>' -geometry +5+5 -tile 15x") + "-geometry +5+5 -tile 15x -background '#1D9E74'" + "Parameters for making the SIDE deck. It's 15x cards wide,There's 5 px between cards.") + +(defparameter +command-line-params-main-deck-output+ + ;; "-resize '421x614>' -geometry +5+5 -tile 15x") + ;; "-geometry '4310x2496>'" + ;; "-geometry '2560x>' -background '#FF8B53' -gravity South -splice 0x10" + "-background '#FF8B53' -gravity South -splice 0x10" + "Parameters for final output of the MAIN deck. It's the width of the MAIN deck output, which will be set to 2560. + +TODO: Use identify to query this information.") + +(defparameter +command-line-params-extra-deck-output+ + ;; "-resize '421x614>' -geometry +5+5 -tile 15x") + ;; "-geometry '4310x2496>'" + "-geometry '4310>'" + "Parameters for final output of the EXTRA and SIDE decks. It's exactly the width of the MAIN deck output, which happens to be 4310x2496. + +TODO: Use identify to query this information. + +Parameters for final output of the EXTRA and SIDE decks. It's exactly the width of the MAIN deck output, which happens to be 4310x2496. Card images are almost always 421x614 px in size, and we add 5 px of padding around all sides. So that's where this number comes from (((421+10)*10) = 4310).") + +(defparameter +command-line-params-final-output+ + ;; "-resize '421x614>' -geometry +0+0 -tile 1x") + "-geometry +0+0 -tile 1x -background none" + "The options passed to convert for the final image result. Smoosh everything together into one 1x wide image!") + +(defparameter +command-line-params-watermark-lower-right+ + "-gravity southeast -geometry +10+10 -draw \"image Over 32,32 256,256 'runew.png'\"" + "Draw a watermark in the bottom right with this command.") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun command-setup (file-list pathname &key (deck-type :main) (dry-run nil)) + "Set up the *COMMAND* parameter for use in COMMAND-EXEC. + +You can kind of see the structure of the command: + + ~A ~A ~{\"~A\" ~} miff:- | ~A miff:- ~A \"~A\" + +That's \"montage [input-options] [list-of-input-filenames] miff:- | convert miff:- [output-options] [output-filename]\". + +We use the MIFF format to speed up the whole montage process. + +ARGUMENTS: + +FILE-LIST The list of files to be used in the generation of the deck image. The files must exist. +PATHNAME The pathname of the output file. +DECK-TYPE The kind of deck we'll be generating. Allowed values are :MAIN :SIDE :EXTRA and :FINAL. The default is :MAIN. +DRY-RUN If DRY-RUN is T, instead of filling in a whole file list, which can be clunky to view, we replace the list of files with ~'(FILE LIST)~. Very kludgy. + +SEE *COMMAND* +SEE COMMAND-EXEC" + (let* ((extra-params (case deck-type + (:main +command-line-params-main-deck+) + (:extra +command-line-params-extra-deck+) + (:side +command-line-params-side-deck+) + (:final +command-line-params-final-output+) + (otherwise ""))) + (output-params (case deck-type + (:main +command-line-params-main-deck-output+) + ((:side :extra) +command-line-params-extra-deck-output+) + (otherwise ""))) + (command (format nil "~A ~A ~{\"~A\" ~} miff:- | ~A miff:- ~A \"~A\"" + +montage-binary+ + extra-params + (if dry-run + '(file list) + file-list) + +convert-binary+ + output-params + pathname))) + (setf *command* command))) + +(defun command-exec (&key (command *command*) (dry-run nil)) + "Execute the command with UIOP:RUN-PROGRAM, or do a dry run. + +ARGUMENTS: +COMMAND The command line to execute. It doesn't have to be anything to do with ImageMagick. This is a generic wrapper around UIOP:RUN-PROGRAM. The default command line to pass is *COMMAND*. +DRY-RUN If DRY-RUN is T, use FORMAT to output a string instead." + (if dry-run + (v:info :draw "~a" command) + (uiop:run-program command + :output t + :error-output t))) + + +(defun identify-image (pathname &optional (dry-run nil)) + "Wrapper around ImageMagick IDENTIFY. + +PATHNAME The path to the file to identify. +DRY-RUN Inform COMMAND-EXEC that this is a DRY-RUN. " + (command-exec :command (format nil "identify \"~A\"" pathname) + :dry-run dry-run)) + +;; TODO The way we pass args around like this is ugly af. Maybe a STRUCT? +;; +;; This absolutely needs a rewrite. I should be using classes for this. +(defun make-passcode-files-list (types pathname-name ydk) + "Build TYPES -> MERGE-PATHNAMES ASSOCIATION-LIST. TYPES gets filled in +with PATHNAME-NAME and PASSCODE info: + + (:MAIN OG_bechi_21-Chaos Turbo-main.jpg ( main deck ... )) + (:SIDE OG_bechi_21-Chaos Turbo-side.jpg ( side deck ... )) + (:EXTRA OG_bechi_21-Chaos Turbo-extra.jpg ( extra deck ... )) + +Then the :FINAL image instead of a list of passcodes, is a list of +files passed to STATIC-RELATIVE-FILE-LIST: + + (:FINAL OG_bechi_21-Chaos Turbo-final.jpg (OG_bechi_21-Chaos Turbo-main.jpg + OG_bechi_21-Chaos Turbo-extra.jpg + OG_bechi_21-Chaos Turbo-side.jpg)) + +ARGUMENTS: +types A LIST of the types of images we want to generate. May be one of :MAIN, :SIDE, :EXTRA, or :FINAL. +pathname-name The PATHNAME-NAME of the file you want to create. E.g. if you had a YDK file named \"Chaos Turbo 2023.ydk\" you should pass the output of (PATHNAME-NAME #P\"Chaos Turbo 2023.ydk\" +ydk The YDK information we're generating the deck for." + (loop for type in types + collect + (list type + (make-static-filename-kind pathname-name type) + (case type + (:main (ydk-main-deck-of ydk)) + (:extra (ydk-extra-deck-of ydk)) + (:side (ydk-side-deck-of ydk)))))) + +(defun draw-deck-image (ydk pathname &key (dry-run nil)) + "Parse a YDK, setup a bunch of command lines, and generate a deck image. Very clunky and clumsy, most likely candidate for a rewrite right here. + +ARGUMENTS +DATA Raw YDK data. May be anything that INITIALIZE-WITH-CONTENT can process. +PATHNAME The path to where the output images will be stored. The PATHNAME-NAME will be munged to have ~-main~,~-side~,~-extra-~, or ~-final~ appended to it. +DRY-RUN Do a dry run. + +SEE INITIALIZE-WITH-CONTENT" + + (v:info :draw "DRAW-DECK-IMAGE: ~a" pathname) + + (let* ((pathname-name (typecase pathname + (pathname (pathname-name pathname)) + (string pathname) + (integer (princ-to-string pathname)))) + (datum (make-passcode-files-list '(:main :extra :side) + pathname-name ydk))) + + ;; Build the three images + (loop for data in datum do + (destructuring-bind (kind path lst) + data + (if (not lst) + (progn + ;; Whatever item this is, there are no cards in + ;; it. Remove it from the query. + ;; (format t "~A~%" datum) + (setf datum (delete kind datum :key #'car))) + (progn + ;; There are cards in it. + (v:info :draw "Generating ~A deck: ~A (~A cards)" kind path (length lst)) + (if (probe-file path) + (v:info :draw "File exists: ~A" path) + (progn + (command-setup (ygo-probe-file-list lst) path :deck-type kind :dry-run dry-run) + (command-exec :dry-run dry-run))))))) + + (let* (;; KEY-PAIRS is :MAIN + (:MAIN :EXTRA:) + (:MAIN :SIDE) if they exist. + ;; If we filtered out something above, it won't show up in this list... + (key-pairs (alexandria:map-product 'list + '(:main) + (remove :main (mapcar #'first datum)))) + ;; COMBINATIONS-LIST is every file name combined, + ;; e.g. Deck-Name-MAIN, Deck-Name-MAIN-EXTRA, + ;; Deck-Name-FINAL; the ones from KEY-PAIRS noted above + ;; combined with PATHNAME-NAME. It's in a similar format as + ;; the output from MAKE-PASSCODE-FILES-LIST. + (combinations-list + (loop for key-pair in key-pairs + collect + (list + ;; double loop ... ? Who cares, it works... + (loop for key-pair in key-pair + collect (make-static-filename-kind pathname-name key-pair)) + (make-static-filename-kind pathname-name key-pair)))) + (final-filenames + (append + (mapcar #'second datum) + (mapcar #'second combinations-list) + (list (make-static-filename-kind pathname-name :final))))) + + (merge-images (car (last final-filenames)) (mapcar #'second datum)) + (loop for combination in combinations-list do + (merge-images (second combination) (first combination) dry-run)) + + (relative-file-list final-filenames)))) + +(defun merge-images (final-filename image-lst &optional dry-run) + "Merge images in IMAGE-LST into FINAL-FILENAME. + +IMAGE-LST The list of images to be merged. Will be merged in order specified. +FINAL-FILENAME The output filename. +DRY-RUN Do a dry run." + (v:info :draw "Generating final image: ~A ~a" final-filename image-lst) + ;; MAPCAR #'SECOND??? Oh Well, it works. + (if (probe-file final-filename) + (v:info :draw "File exists: ~A" final-filename) + (progn + (command-setup (static-probe-file-list image-lst) + final-filename :deck-type :final :dry-run dry-run) + (command-exec :dry-run dry-run)))) diff --git a/src/i18n.lisp b/src/i18n.lisp new file mode 100644 index 0000000..7021e67 --- /dev/null +++ b/src/i18n.lisp @@ -0,0 +1,146 @@ +(in-package #:cl-user) + +(defpackage #:cl-deck-builder2.i18n + (:use :cl) + (:import-from :gettext #:*current-locale*) + (:export + #:_ + #:n_ + #:reload-translations + #:list-loaded-locales + #:*current-locale* + #:set-locale + #:with-locale + #:update-djula.pot + #:generate-templates-list) + (:documentation "Internationalization Utilities")) + +(in-package #:cl-deck-builder2.i18n) + +(defun setup-gettext () + (setf djula:*translation-backend* :gettext + (gettext:textdomain) "cl-deck-builder2") + (gettext:setup-gettext #.*package* "cl-deck-builder2")) + +(setup-gettext) + +(defun reload-translations () + (format *debug-io* "~%Reading all *.mo files...") + ;; Clear gettext's cache + (clrhash gettext::*catalog-cache*) + (setup-gettext) + (gettext:preload-catalogs + ;; Tell gettext where to find the .mo files + #.(asdf:system-relative-pathname :cl-deck-builder2 "locale/")) + ;; What about this? + (setf djula::*gettext-domain* "cl-deck-builder2")) + +;; Only preload the translations into the image if we're not deployed yet. +(unless (deploy:deployed-p) + (reload-translations)) + +;; Run this when developping to reload the translations +#+ (or) +(progn + ;; Clear gettext's cache + (clrhash gettext::*catalog-cache*) + (gettext:preload-catalogs + ;; Tell gettext where to find the .mo files + #.(asdf:system-relative-pathname :cl-deck-builder2 "locale/"))) + +;; Run this to see the list of loaded message for a specific locale +#+ (or) +(gettext::catalog-messages + (gethash '("es_ES" :LC_MESSAGES "cl-deck-builder2") + gettext::*catalog-cache*)) + +;; Test the translation of a string +#+ (or) +(with-locale ("es_ES") + (_ "Please login to continue")) + + +#+ (or) +(set-locale "es_ES") + +#+ (or) +*current-locale* + +(defun list-loaded-locales () + "Get the list of locales loaded in gettext's cache." + (remove-duplicates + (mapcar #'first + (alexandria:hash-table-keys + gettext::*catalog-cache*)) + :test #'string=)) + +(defun set-locale (locale) + "Setf gettext:*current-locale* and djula:*current-language* if LOCALE seems valid." + ;; It is valid to set the locale to nil. + (when (and locale + (not (member locale (list-loaded-locales) + :test 'string=))) + (error "Locale not valid or not available: ~s" locale)) + (setf *current-locale* locale + djula:*current-language* locale)) + +(defmacro with-locale ((locale) &body body) + "Calls BODY with gettext:*current-locale* and djula:*current-language* set to LOCALE." + `(let (*current-locale* djula:*current-language*) + (set-locale ,locale) + ,@body)) + +;; (trace _) + +;; (trace djula:translate gettext:gettext* gettext::lookup) + +;; (_ "hi") + +#| +This could technically be just +(mapcan #'djula.locale:file-template-translate-strings + (djula:list-asdf-system-templates :cl-deck-builder2 "templates")) + +But I (fstamour) made it just a bit more complex in order to keep track of the source (just the +filename) of each translatable strings. Hence why the hash-table returned is named `locations`. +|# +(defun extract-translate-strings () + "Extract all {_ ... _} string from the djula templates." + (loop + :with locations = (make-hash-table :test 'equal) + :for path :in (djula:list-asdf-system-templates :cl-deck-builder2 "templates") + :for strings = (djula.locale:file-template-translate-strings path) + :do (loop :for string :in strings + :unless (gethash string locations) + :do (setf (gethash string locations) path)) + :finally (return locations))) + +(defun update-djula.pot () + "Update djula.pot from *.html files." + (with-open-file (s (asdf:system-relative-pathname + :cl-deck-builder2 "locale/templates/LC_MESSAGES/djula.pot") + :direction :output + :if-exists :supersede + :if-does-not-exist :create) + (let* ((locations (extract-translate-strings)) + (strings (alexandria:hash-table-keys locations))) + (loop + :for string :in strings + :for location = (gethash string locations) + :do + (format s "~%#: ~a~%#, lisp-format~%msgid ~s~%msgstr \"\" ~%" + (enough-namestring + location + (asdf:system-source-directory :cl-deck-builder2)) + string))))) + +;; TODO UPDATE-STATIC-TEMPLATE-FILES +(defun generate-templates-list () + "Generate a list of all files in the \"templates/\" subdirectory, in the form of (:STATIC-FILE \"file...\"). Currently you have to copy/paste this into the ASDF file whenever you add a template." + (let* ((lst '()) + (root (asdf:system-relative-pathname :cl-deck-builder2 "templates/"))) + (cl-fad:walk-directory + root + (lambda (name) + (push (list :static-file (namestring (uiop:enough-pathname name root))) lst))) + lst)) diff --git a/src/main.lisp b/src/main.lisp new file mode 100644 index 0000000..4871053 --- /dev/null +++ b/src/main.lisp @@ -0,0 +1,112 @@ +;;;; src/main.lisp +;;;; +;;;; Main App Definition And Entry Point +;;;; + +(in-package :cl-user) + +(defpackage #:cl-deck-builder2 + (:use #:cl + #:cl-deck-builder2.db + #:cl-deck-builder2.draw + #:cl-deck-builder2.toolkit + #:cl-deck-builder2.models + ;;#:cl-deck-builder2-test + ) + (:local-nicknames + (#:v #:org.shirakumo.verbose)) + (:import-from :cl-deck-builder2.config + :config + :*app-log-file*) + (:import-from :clack + :clackup) + (:export + :start + :stop + :my/start + :main) + (:documentation "The main package for the deck builder project. + +This package exports the START and STOP functions, as well as the convenience function MY/START.")) + +(in-package :cl-deck-builder2) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defvar *appfile-path* + (asdf:system-relative-pathname :cl-deck-builder2 #P"app.lisp") + "The application path we pass to CLACK:CLACKUP.") + +(defvar *clack-handler* nil + "The CLACK handler currently running. NIL if there is no server running.") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun start (&rest args &key server port debug &allow-other-keys) + "Start the app. If the app is already running, raise an ERROR." + (declare (ignore server port debug)) + (when *clack-handler* + (restart-case (error "Server is already running.") + (restart-server () + :report "Restart the server" + (stop)))) + (v:info :main "CLACKUP") + (setf *clack-handler* (apply #'clackup *appfile-path* args))) + +(defun stop () + "Stop the app, if it is running." + (v:info :main "CLACK:STOP") + (prog1 + (clack:stop *clack-handler*) + (setf *clack-handler* nil))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun my/start (&rest args) + "Convenience function for invoking RESTART-SERVER in the case that the server is already running." + (handler-bind + ((simple-error (lambda (c) + (format t "~A~&Invoking RESTART-SERVER." c) + (invoke-restart 'restart-server)))) + ;; TODO Multiple Addresses? + ;; TODO Put it behind NGINX? + ;; TODO sslh? + (apply #'start args))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Loader Customize +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defmacro start-helper (service-name &body body) + `(progn + (v:info :app "~&Starting ~a ...~&" ,service-name) + (if ,@body + (v:info :app "~&... started.~&") + (v:info :app "~&... failed?~&")))) + +;; Initialize Logging +;; +;; (v:output-here *standard-output*) +;; +(defun main () + (v:output-here (open *app-log-file* :direction :output + :if-does-not-exist :create + :if-exists :append)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (v:start v:*global-controller*) + + (start-helper "slynk server" + (apply #'slynk:create-server (config :slynk))) + + (v:info :app "~&Constructing database...~&") + ;; (apply #'create-table *class-list*) + (ensure-tables-exist) + (v:info :app "~&...complete~%") + + (start-helper "web app" + (apply #'my/start (config :server))) + + (start-helper "WebSocket Server Side Client" + (handler-case + (apply #'cl-deck-builder2.web::make-chat-client (config :websocket)) + (usocket:connection-refused-error () nil) + (usocket:connection-reset-error () nil)))) diff --git a/src/models/attachment.lisp b/src/models/attachment.lisp new file mode 100644 index 0000000..7462135 --- /dev/null +++ b/src/models/attachment.lisp @@ -0,0 +1,46 @@ +#| + +# File Attachments + +Attachment class for saving metadata into RDBMS + +See MITO-ATTACHMENT for more information: + +TODO AWS Storage / CC API Upload? + +Here's the bit of code for the FILEs: + +;; (destructuring-bind (content filename content-type) +;; file +;; (if (and (eq (type-of content) 'flex::vector-input-stream) +;; (> (length (flex::vector-stream-vector content)) 0)) +;; ...)) + +|# + +(in-package #:cl-deck-builder2.models.attachment) + +(defclass attachment (mito-attachment:attachment) () + (:metaclass registered-table-class)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun create-attachment (content file-key content-type) + "Use CREATE-DAO to construct a new ATTACHMENT instance. Return the instance if successful, NIL otherwise." + (create-dao 'attachment + :content content + :file-key file-key + :content-type content-type)) + +(defun attachment-valid-p (file) + "Helper function. Ensure FILE data from Caveman has valid: + +- Type: 'FLEX::VECTOR-INPUT-STREAM +- Filename: Length > 0 +- File Length: Content Length > 0" + (destructuring-bind (content filename content-type) + file + ;; XXX Don't ignore content type? + (declare (ignore content-type)) + (and (eq (type-of content) 'flex::vector-input-stream) + (> (length (flex::vector-stream-vector content)) 0) + (> (length filename) 0)))) diff --git a/src/models/category-2.lisp b/src/models/category-2.lisp new file mode 100644 index 0000000..370b4b0 --- /dev/null +++ b/src/models/category-2.lisp @@ -0,0 +1,198 @@ +#| + +src/models/category-2.lisp + +Category v2 + +Based on DB_NestedSet + +It looks like keepAsArray controls whether or not it outputs a list or +something passed through MAKE-INSTANCE. + +|# + +(defpackage #:cl-deck-builder2.models.category-2 + (:use #:cl)) + +(:in-package #:cl-deck-builder2.models.category-2) + +;; CLASSES + + +#| +# The table which holds the structure +CREATE TABLE tb_nodes ( + STRID int(11) NOT NULL auto_increment, + ROOTID int(11) NOT NULL default '0', + l int(11) NOT NULL default '0', + r int(11) NOT NULL default '0', + PARENT int(11) NOT NULL default '0', + STREH int(11) NOT NULL default '0', + LEVEL int(11) NOT NULL default '0', + STRNA char(128) NOT NULL default '', + PRIMARY KEY (STRID), + KEY ROOTID (ROOTID), + KEY STREH (STREH), + KEY l (l), + KEY r (r), + KEY LEVEL (LEVEL), + KEY SRLR (ROOTID,l,r), + KEY parent (PARENT) +) TYPE=MyISAM COMMENT='NestedSet table'; +|# + +(defclass db-nested-set-node (registered-table-class) + ((root-id :col-type :integer :default 1) + (left :col-type :integer :default 1) + (right :col-type :integer :default 1) + (parent :col-type :integer :default 1)) + ;; (streh :col-type :integer :default 0) + ;; (level :col-type :integer :default 0) + ;; (strna :col-type (:varchar 128) :default "") + (:documentation "Class for DB_NestedSet Nodes.")) + +(defmethod closer-mop:validate-superclass ((class db-nested-set-node) + (superclass registered-table-class)) + t) + + + +#| +# A table which is used for a little table locking to avoid conflicts +CREATE TABLE tb_locks ( + lockID char(32) NOT NULL default '', + lockTable char(32) NOT NULL default '', + lockStamp int(11) NOT NULL default '0', + PRIMARY KEY (lockID,lockTable) +) TYPE=MyISAM COMMENT='Table locks for NestedSet'; +|# + +(defclass db-nested-set-lock () + (;; TODO Being able to switch the table name would be cool. With + ;; MITO It would be a class. I'm not sure how to code that. + (lock-table :col-type (:varchar 32)) + (lock-stamp :col-type :timestamp + :initform (local-time:now) + :inflate #'local-time:universal-to-timestamp + :deflate #'local-time:timestamp-to-universal)) + (:metaclass registered-table-class) + (:documentation "Class for DB_NestedSet Locks Table.")) + +;; Helper Class +(defclass db-nested-set () + ((db-nested-set-nodes :accessor nested-set-nodes + :initform '()) + (db-nested-set-locks :accessor nested-set-nodes + :initform '()))) + +;; GENERICS + +(defgeneric create-root-node (obj)) +(defgeneric create-left-node (obj)) +(defgeneric create-right-node (obj)) +(defgeneric create-sub-node (obj)) + +(defgeneric delete-node (obj)) + +(defgeneric get-all-nodes (obj)) +(defgeneric get-root-nodes (obj)) + +(defgeneric pick-node (obj)) + +(defgeneric update-node (obj)) + +(defgeneric get-branch (obj)) +(defgeneric get-children (obj)) +(defgeneric get-parent (obj)) +(defgeneric get-parents (obj)) +(defgeneric get-siblings (obj)) +(defgeneric get-sub-branch (obj)) + +(defgeneric is-parent (obj)) + +(defgeneric move-across (obj)) +(defgeneric move-cleanup (obj)) +(defgeneric move-root-to-root (obj)) +(defgeneric move-tree (obj)) + +;; METHODS + +(defmethod create-root-node ((obj db-nested-set))) +(defmethod create-left-node ((obj db-nested-set))) +(defmethod create-right-node ((obj db-nested-set))) +(defmethod create-sub-node ((obj db-nested-set))) + +(defmethod delete-node ((obj db-nested-set))) + +(defmethod get-all-nodes ((obj db-nested-set))) +(defmethod get-root-nodes ((obj db-nested-set))) + +(defmethod pick-node ((obj db-nested-set))) + +(defmethod update-node ((obj db-nested-set))) + +(defmethod get-branch ((obj db-nested-set))) +(defmethod get-children ((obj db-nested-set))) +(defmethod get-parent ((obj db-nested-set))) +(defmethod get-parents ((obj db-nested-set))) +(defmethod get-siblings ((obj db-nested-set))) +(defmethod get-sub-branch ((obj db-nested-set))) + +(defmethod is-parent ((obj db-nested-set))) + +(defmethod move-across ((obj db-nested-set))) +(defmethod move-cleanup ((obj db-nested-set))) +(defmethod move-root-to-root ((obj db-nested-set))) +(defmethod move-tree ((obj db-nested-set))) + +#| +@$this->cache->flush('function_cache'); +function & factory($driver, $dsn, $params = array()) { +function DB_NestedSet($params) { +function _DB_NestedSet() { +function _addSQL($addSQL, $type, $prefix = false) { +function _debugMessage($msg) { +function _getMessage($code) { +function _getSelectFields($aliasFields) { +function _lockGC() { +function _moveAcross($source, $target, $pos, $first = false) { +function _moveCleanup($copy = false) { +function _moveRoot2Root($source, $target, $pos) { +function _processResultSet($sql, $keepAsArray, $fieldsAreAliased) { +function _raiseError($code, $mode, $option, $epr = array()) { +function _releaseLock($exclusive = false) { +function _secSort($nodeSet) { +function _secSortCollect($segment, $deepArray, $reset = false) { +function _setLock($exclusive = false) { +function _testFatalAbort($errobj, $file, $line) { +function _values2InsertQuery($values, $addval = false) { +function _values2UpdateQuery($values, $addval = false) { +function _verifyUserValues($caller, & $values) { +function addListener($event, & $listener) { +function apiVersion() { +function convertTreeModel(& $orig, & $copy, $_parent = false) { +function createLeftNode($id, $values) { +function createRightNode($id, $values) { +function createRootNode($values, $id = false, $first = false, $pos = NESE_MOVE_AFTER) { +function createSubNode($id, $values) { +function deleteNode($id) { +function getAllNodes($keepAsArray = false, $aliasFields = true, $addSQL = array()) { +function getBranch($id, $keepAsArray = false, $aliasFields = true, $addSQL = array()) { +function getChildren($id, $keepAsArray = false, $aliasFields = true, $forceNorder = false, $addSQL = array()) { +function getParent($id, $keepAsArray = false, $aliasFields = true, $addSQL = array(), $useDB = true) { +function getParents($id, $keepAsArray = false, $aliasFields = true, $addSQL = array()) { +function getRootNodes($keepAsArray = false, $aliasFields = true, $addSQL = array()) { +function getSiblings($id, $keepAsArray = false, $aliasFields = true, $addSQL = array()) { +function getSubBranch($id, $keepAsArray = false, $aliasFields = true, $addSQL = array()) { +function isParent($parent, $child) { +function moveTree($id, $targetid, $pos, $copy = false) { +function pickNode($id, $keepAsArray = false, $aliasFields = true, $idfield = 'id', $addSQL = array()) { +function removeListener($event, $listenerID) { +function setAttr($attr) { +function setDbOption($option, $val) { +function setsortMode($sortMode = false) { +function testLock() { +function triggerEvent($event, & $node, $eparams = false) { +function updateNode($id, $values, $_internal = false) { +register_shutdown_function(array(& $this, '_DB_NestedSet')); +|# diff --git a/src/models/category.lisp b/src/models/category.lisp new file mode 100644 index 0000000..6620f28 --- /dev/null +++ b/src/models/category.lisp @@ -0,0 +1,877 @@ +#| + +src/models/category.lisp + +TODO All of this needs a serious rewrite. + +|# + +(in-package #:cl-deck-builder2.models.category) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defclass category () + ((name :accessor name-of + :col-type (:varchar 64) + :initarg :name) + (left :accessor category-left-of + :col-type :integer + :initarg :left) + (right :accessor category-right-of + :col-type :integer + :initarg :right)) + (:metaclass registered-table-class) + (:unique-key name) + (:documentation "Category implementation based on Joe Celko's Nested Set Hierarchy from one of his books.")) + +(defun create-category (name left right) + (create-dao 'category :name name + :left left + :right right)) + +;; (defmacro category (&body body) +;; `(select-dao 'category ,@body)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defmethod category-rename ((category category) new-name) + (setf (category-name-of category) new-name) + (update-dao category)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; Joe Celko Nested Set Hierarchy +;;;; +;;;; +;;;; +;;;; * The Nested Set Model +;;;; +;;;; #+BEGIN_SRC sql +;;;; CREATE TABLE nested_category ( +;;;; category_id INT AUTO_INCREMENT PRIMARY KEY, +;;;; name VARCHAR(20) NOT NULL, +;;;; lft INT NOT NULL, +;;;; rgt INT NOT NULL +;;;; ); +;;;; +;;;; INSERT INTO nested_category VALUES +;;;; (1,'ELECTRONICS',1,20), +;;;; (2,'TELEVISIONS',2,9), +;;;; (3,'TUBE',3,4), +;;;; (4,'LCD',5,6), +;;;; (5,'PLASMA',7,8), +;;;; (6,'PORTABLE ELECTRONICS',10,19), +;;;; (7,'MP3 PLAYERS',11,14), +;;;; (8,'FLASH',12,13), +;;;; (9,'CD PLAYERS',15,16), +;;;; (10,'2 WAY RADIOS',17,18); +;;;; +;;;; SELECT * FROM nested_category ORDER BY category_id; +;;;; #+END_SRC +;;;; +;;;; #+BEGIN_SRC lisp + +(defun category-insert-fake-data () + "Insert Fake Data. These LEFT-IDs will mess with your stuff... + +TODO Figure out how to fix that." + (with-connection (db) + (with-transaction + (mapcar (lambda (values-list) + (destructuring-bind (name left right) + values-list + (mito:create-dao 'category + :name name + :left left + :right right))) + '(("ELECTRONICS" 1 20) + ("TELEVISIONS" 2 9) + ("TUBE" 3 4) + ("LCD" 5 6) + ("PLASMA" 7 8) + ("PORTABLE ELECTRONICS" 10 19) + ("MP3 PLAYERS" 11 14) + ("FLASH" 12 13) + ("CD PLAYERS" 15 16) + ("2 WAY RADIOS" 17 18)))))) + +;;;; #+END_SRC +;;;; +;;;; +;;;; +-------------+----------------------+-----+-----+ +;;;; | category_id | name | lft | rgt | +;;;; +-------------+----------------------+-----+-----+ +;;;; | 1 | ELECTRONICS | 1 | 20 | +;;;; | 2 | TELEVISIONS | 2 | 9 | +;;;; | 3 | TUBE | 3 | 4 | +;;;; | 4 | LCD | 5 | 6 | +;;;; | 5 | PLASMA | 7 | 8 | +;;;; | 6 | PORTABLE ELECTRONICS | 10 | 19 | +;;;; | 7 | MP3 PLAYERS | 11 | 14 | +;;;; | 8 | FLASH | 12 | 13 | +;;;; | 9 | CD PLAYERS | 15 | 16 | +;;;; | 10 | 2 WAY RADIOS | 17 | 18 | +;;;; +-------------+----------------------+-----+-----+ +;;;; +;;;; * Retrieving a Full Tree +;;;; +;;;; We can retrieve the full tree through the use of a self-join that +;;;; links parents with nodes on the basis that a node’s lft value will +;;;; always appear between its parent’s lft and rgt values: +;;;; +;;;; #+BEGIN_SRC sql +;;;; SELECT node.name +;;;; FROM nested_category AS node, +;;;; nested_category AS parent +;;;; WHERE node.lft BETWEEN parent.lft AND parent.rgt +;;;; AND parent.name = 'ELECTRONICS' +;;;; ORDER BY node.lft; +;;;; #+END_SRC +;;;; +;;;; #+BEGIN_SRC lisp + +(defun category-full-tree (fields name) + (retrieve-by-sql + (sxql:select fields + (sxql:from (:as :category :node) + (:as :category :parent)) + (sxql:where (:and (sxql:make-op :raw "node.left between parent.left and parent.right") + (:= :parent.name name))) + (sxql:order-by :node.left)))) + +;;;; #+END_SRC +;;;; +;;;; +----------------------+ +;;;; | name | +;;;; +----------------------+ +;;;; | ELECTRONICS | +;;;; | TELEVISIONS | +;;;; | TUBE | +;;;; | LCD | +;;;; | PLASMA | +;;;; | PORTABLE ELECTRONICS | +;;;; | MP3 PLAYERS | +;;;; | FLASH | +;;;; | CD PLAYERS | +;;;; | 2 WAY RADIOS | +;;;; +----------------------+ +;;;; +;;;; * Finding all the Leaf Nodes +;;;; +;;;; Finding all leaf nodes in the nested set model even simpler than the +;;;; LEFT JOIN method used in the adjacency list model. If you look at the +;;;; nested_category table, you may notice that the lft and rgt values for +;;;; leaf nodes are consecutive numbers. To find the leaf nodes, we look +;;;; for nodes where rgt = lft + 1: +;;;; +;;;; #+BEGIN_SRC sql +;;;; SELECT name +;;;; FROM nested_category +;;;; WHERE rgt = lft + 1; +;;;; #+END_SRC +;;;; +;;;; #+BEGIN_SRC lisp + +(defun category-leaf-nodes () + "Finding all the Leaf Nodes" + (select-dao 'category + (sxql:where (:= :right (sxql:make-op :+ :left 1))))) + + +;;;; #+END_SRC +;;;; +;;;; +--------------+ +;;;; | name | +;;;; +--------------+ +;;;; | TUBE | +;;;; | LCD | +;;;; | PLASMA | +;;;; | FLASH | +;;;; | CD PLAYERS | +;;;; | 2 WAY RADIOS | +;;;; +--------------+ +;;;; +;;;; * Retrieving a Single Path +;;;; +;;;; With the nested set model, we can retrieve a single path without +;;;; having multiple self-joins: +;;;; +;;;; #+BEGIN_SRC sql +;;;; SELECT parent.name +;;;; FROM nested_category AS node, +;;;; nested_category AS parent +;;;; WHERE node.lft BETWEEN parent.lft AND parent.rgt +;;;; AND node.name = 'FLASH' +;;;; ORDER BY parent.lft; +;;;; #+END_SRC +;;;; +;;;; #+BEGIN_SRC lisp + +(defun category-path-of (name) + (retrieve-by-sql + (sxql:select :parent.name + (sxql:from (:as :category :node) + (:as :category :parent)) + (sxql:where (:and (sxql:make-op :raw "node.left between parent.left and parent.right") + (:= :node.name name))) + (sxql:order-by :parent.left)))) + + +;;;; #+END_SRC +;;;; +;;;; +----------------------+ +;;;; | name | +;;;; +----------------------+ +;;;; | ELECTRONICS | +;;;; | PORTABLE ELECTRONICS | +;;;; | MP3 PLAYERS | +;;;; | FLASH | +;;;; +----------------------+ +;;;; +;;;; * Finding the Depth of the Nodes +;;;; +;;;; We have already looked at how to show the entire tree, but what if we +;;;; want to also show the depth of each node in the tree, to better +;;;; identify how each node fits in the hierarchy? This can be done by +;;;; adding a COUNT function and a GROUP BY clause to our existing query +;;;; for showing the entire tree: +;;;; +;;;; #+BEGIN_SRC sql +;;;; SELECT node.name, (COUNT(parent.name) - 1) AS depth +;;;; FROM nested_category AS node, +;;;; nested_category AS parent +;;;; WHERE node.lft BETWEEN parent.lft AND parent.rgt +;;;; GROUP BY node.name +;;;; ORDER BY node.lft; +;;;; #+END_SRC +;;;; +;;;; #+BEGIN_SRC lisp + +(defun category-node-depth (name) + "Find the depth of a specific CATEGORY node named NAME." + (retrieve-by-sql + (sxql:select + (:node.name (:as (:- (:count :parent.name) 1) :depth)) + (sxql:from (:as :category :node) + (:as :category :parent)) + (sxql:where (:and (sxql:make-op :raw "node.left between parent.left and parent.right") + (:= :node.name name))) + (sxql:group-by :node.name) + (sxql:order-by :node.left)))) + +(defun category-tree-depth () + "Show the depths of all nodes in the CATEGORY tree." + (retrieve-by-sql + (sxql:select + (:node.name (:as (:- (:count :parent.name) 1) :depth)) + (sxql:from (:as :category :node) + (:as :category :parent)) + (sxql:where (sxql:make-op :raw "node.left between parent.left and parent.right")) + (sxql:group-by :node.name) + (sxql:order-by :node.left)))) + +;;;; #+END_SRC +;;;; +;;;; +----------------------+-------+ +;;;; | name | depth | +;;;; +----------------------+-------+ +;;;; | ELECTRONICS | 0 | +;;;; | TELEVISIONS | 1 | +;;;; | TUBE | 2 | +;;;; | LCD | 2 | +;;;; | PLASMA | 2 | +;;;; | PORTABLE ELECTRONICS | 1 | +;;;; | MP3 PLAYERS | 2 | +;;;; | FLASH | 3 | +;;;; | CD PLAYERS | 2 | +;;;; | 2 WAY RADIOS | 2 | +;;;; +----------------------+-------+ +;;;; +;;;; We can use the depth value to indent our category names with the +;;;; CONCAT and REPEAT string functions: +;;;; +;;;; #+BEGIN_SRC sql +;;;; SELECT CONCAT( REPEAT(' ', COUNT(parent.name) - 1), node.name) AS name +;;;; FROM nested_category AS node, +;;;; nested_category AS parent +;;;; WHERE node.lft BETWEEN parent.lft AND parent.rgt +;;;; GROUP BY node.name +;;;; ORDER BY node.lft; +;;;; #+END_SRC +;;;; +;;;; #+BEGIN_SRC lisp + +(defun category-full-tree-format (&optional (depths (category-tree-depth))) + "Output a formatted display of the CATEGORY tree. + +DEPTHS is the depth tree provided by default by CATEGORY-TREE-DEPTH." + (with-output-to-string (s) + (mapcar (lambda (node) + (format s (format nil "~~~d@a~~a~~%" + (getf node :depth)) + "" (getf node :name))) + depths))) + +;;;; #+END_SRC +;;;; +;;;; +-----------------------+ +;;;; | name | +;;;; +-----------------------+ +;;;; | ELECTRONICS | +;;;; | TELEVISIONS | +;;;; | TUBE | +;;;; | LCD | +;;;; | PLASMA | +;;;; | PORTABLE ELECTRONICS | +;;;; | MP3 PLAYERS | +;;;; | FLASH | +;;;; | CD PLAYERS | +;;;; | 2 WAY RADIOS | +;;;; +-----------------------+ +;;;; +;;;; Of course, in a client-side application you will be more likely to use +;;;; the depth value directly to display your hierarchy. Web developers +;;;; could loop through the tree, adding
  • and
      tags as +;;;; the depth number increases and decreases. +;;;; +;;;; * Depth of a Sub-Tree +;;;; +;;;; When we need depth information for a sub-tree, we cannot limit either +;;;; the node or parent tables in our self-join because it will corrupt our +;;;; results. Instead, we add a third self-join, along with a sub-query to +;;;; determine the depth that will be the new starting point for our +;;;; sub-tree: +;;;; +;;;; #+BEGIN_SRC sql +;;;; SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth +;;;; FROM nested_category AS node, +;;;; nested_category AS parent, +;;;; nested_category AS sub_parent, +;;;; ( +;;;; SELECT node.name, (COUNT(parent.name) - 1) AS depth +;;;; FROM nested_category AS node, +;;;; nested_category AS parent +;;;; WHERE node.lft BETWEEN parent.lft AND parent.rgt +;;;; AND node.name = 'PORTABLE ELECTRONICS' +;;;; GROUP BY node.name +;;;; ORDER BY node.lft +;;;; ) AS sub_tree +;;;; WHERE node.lft BETWEEN parent.lft AND parent.rgt +;;;; AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt +;;;; AND sub_parent.name = sub_tree.name +;;;; GROUP BY node.name +;;;; ORDER BY node.lft; +;;;; #+END_SRC + +(defun category-subtree-depth (name) + (retrieve-by-sql + (sxql:select + (:node.name (:as (:- (:count :parent.name) (:+ :sub_tree.depth 1)) :depth)) + (sxql:from (:as :category :node) + (:as :category :parent) + (:as :category :sub_parent) + (:as (sxql:select + (:node.name (:as (:- (:count :parent.name) 1) :depth)) + (sxql:from (:as :category :node) + (:as :category :parent)) + (sxql:where (:and (sxql:make-op :raw "node.left between parent.left and parent.right") + (:= :node.name name))) + (sxql:group-by :node.name) + (sxql:order-by :node.left)) + :sub_tree)) + (sxql:where (:and (sxql:make-op :raw "node.left between parent.left and parent.right") + (sxql:make-op :raw "node.left between sub_parent.left and sub_parent.right") + (:= :sub_parent.name :sub_tree.name))) + (sxql:group-by :node.name) + (sxql:order-by :node.left)))) + +;;;; +;;;; +----------------------+-------+ +;;;; | name | depth | +;;;; +----------------------+-------+ +;;;; | PORTABLE ELECTRONICS | 0 | +;;;; | MP3 PLAYERS | 1 | +;;;; | FLASH | 2 | +;;;; | CD PLAYERS | 1 | +;;;; | 2 WAY RADIOS | 1 | +;;;; +----------------------+-------+ +;;;; +;;;; This function can be used with any node name, including the root +;;;; node. The depth values are always relative to the named node. +;;;; +;;;; * Find the Immediate Subordinates of a Node +;;;; +;;;; Imagine you are showing a category of electronics products on a +;;;; retailer web site. When a user clicks on a category, you would want to +;;;; show the products of that category, as well as list its immediate +;;;; sub-categories, but not the entire tree of categories beneath it. For +;;;; this, we need to show the node and its immediate sub-nodes, but no +;;;; further down the tree. For example, when showing the PORTABLE +;;;; ELECTRONICS category, we will want to show MP3 PLAYERS, CD PLAYERS, +;;;; and 2 WAY RADIOS, but not FLASH. +;;;; +;;;; This can be easily accomplished by adding a HAVING clause to our previous query: +;;;; +;;;; #+BEGIN_SRC sql +;;;; SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth +;;;; FROM nested_category AS node, +;;;; nested_category AS parent, +;;;; nested_category AS sub_parent, +;;;; ( +;;;; SELECT node.name, (COUNT(parent.name) - 1) AS depth +;;;; FROM nested_category AS node, +;;;; nested_category AS parent +;;;; WHERE node.lft BETWEEN parent.lft AND parent.rgt +;;;; AND node.name = 'PORTABLE ELECTRONICS' +;;;; GROUP BY node.name +;;;; ORDER BY node.lft +;;;; ) AS sub_tree +;;;; WHERE node.lft BETWEEN parent.lft AND parent.rgt +;;;; AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt +;;;; AND sub_parent.name = sub_tree.name +;;;; GROUP BY node.name +;;;; HAVING depth <= 1 +;;;; ORDER BY node.lft; +;;;; #+END_SRC + +(defun category-subtree-max-depth (name &optional (max-depth 1)) + "TODO This doesn't seem to work. It returns FLASH with DEPTH = 2" + (retrieve-by-sql + (sxql:select + (:node.name (:as (:- (:count :parent.name) (:+ :sub_tree.depth 1)) :depth)) + (sxql:from (:as :category :node) + (:as :category :parent) + (:as :category :sub_parent) + (:as (sxql:select + (:node.name (:as (:- (:count :parent.name) 1) :depth)) + (sxql:from (:as :category :node) + (:as :category :parent)) + (sxql:where (:and (sxql:make-op :raw "node.left between parent.left and parent.right") + (:= :node.name name))) + (sxql:group-by :node.name) + (sxql:order-by :node.left)) + :sub_tree)) + (sxql:where (:and (sxql:make-op :raw "node.left between parent.left and parent.right") + (sxql:make-op :raw "node.left between sub_parent.left and sub_parent.right") + (:= :sub_parent.name :sub_tree.name))) + (sxql:group-by :node.name) + (sxql:having (:<= :depth max-depth)) + (sxql:order-by :node.left)))) + +;;;; +;;;; +----------------------+-------+ +;;;; | name | depth | +;;;; +----------------------+-------+ +;;;; | PORTABLE ELECTRONICS | 0 | +;;;; | MP3 PLAYERS | 1 | +;;;; | CD PLAYERS | 1 | +;;;; | 2 WAY RADIOS | 1 | +;;;; +----------------------+-------+ +;;;; +;;;; If you do not wish to show the parent node, change the HAVING depth <= 1 line to HAVING depth = 1. +;;;; +;;;; * Aggregate Functions in a Nested Set +;;;; +;;;; Let’s add a table of products that we can use to demonstrate aggregate +;;;; functions with: +;;;; +;;;; #+BEGIN_SRC sql +;;;; CREATE TABLE product +;;;; ( +;;;; product_id INT AUTO_INCREMENT PRIMARY KEY, +;;;; name VARCHAR(40), +;;;; category_id INT NOT NULL +;;;; ); +;;;; +;;;; INSERT INTO product(name, category_id) +;;;; VALUES +;;;; ('20" TV',3), +;;;; ('36" TV',3), +;;;; ('Super-LCD 42"',4), +;;;; ('Ultra-Plasma 62"',5), +;;;; ('Value Plasma 38"',5), +;;;; ('Power-MP3 5gb',7), +;;;; ('Super-Player 1gb',8), +;;;; ('Porta CD',9), +;;;; ('CD To go!',9), +;;;; ('Family Talk 360',10); +;;;; +;;;; SELECT * FROM product; +;;;; #+END_SRC +;;;; +;;;; +------------+-------------------+-------------+ +;;;; | product_id | name | category_id | +;;;; +------------+-------------------+-------------+ +;;;; | 1 | 20" TV | 3 | +;;;; | 2 | 36" TV | 3 | +;;;; | 3 | Super-LCD 42" | 4 | +;;;; | 4 | Ultra-Plasma 62" | 5 | +;;;; | 5 | Value Plasma 38" | 5 | +;;;; | 6 | Power-MP3 128mb | 7 | +;;;; | 7 | Super-Shuffle 1gb | 8 | +;;;; | 8 | Porta CD | 9 | +;;;; | 9 | CD To go! | 9 | +;;;; | 10 | Family Talk 360 | 10 | +;;;; +------------+-------------------+-------------+ +;;;; +;;;; Now let’s produce a query that can retrieve our category tree, along +;;;; with a product count for each category: +;;;; +;;;; #+BEGIN_SRC sql +;;;; SELECT parent.name, COUNT(product.name) +;;;; FROM nested_category AS node , +;;;; nested_category AS parent, +;;;; product +;;;; WHERE node.lft BETWEEN parent.lft AND parent.rgt +;;;; AND node.category_id = product.category_id +;;;; GROUP BY parent.name +;;;; ORDER BY node.lft; +;;;; #+END_SRC +;;;; +;;;; +----------------------+---------------------+ +;;;; | name | COUNT(product.name) | +;;;; +----------------------+---------------------+ +;;;; | ELECTRONICS | 10 | +;;;; | TELEVISIONS | 5 | +;;;; | TUBE | 2 | +;;;; | LCD | 1 | +;;;; | PLASMA | 2 | +;;;; | PORTABLE ELECTRONICS | 5 | +;;;; | MP3 PLAYERS | 2 | +;;;; | FLASH | 1 | +;;;; | CD PLAYERS | 2 | +;;;; | 2 WAY RADIOS | 1 | +;;;; +----------------------+---------------------+ +;;;; +;;;; This is our typical whole tree query with a COUNT and GROUP BY added, +;;;; along with a reference to the product table and a join between the +;;;; node and product table in the WHERE clause. As you can see, there is a +;;;; count for each category and the count of subcategories is reflected in +;;;; the parent categories. +;;;; +;;;; * Adding New Nodes +;;;; +;;;; ** category-insert-right-of +;;;; +;;;; If we wanted to add a new node between the TELEVISIONS and PORTABLE +;;;; ELECTRONICS nodes, the new node would have lft and rgt values of 10 +;;;; and 11, and all nodes to its right would have their lft and rgt values +;;;; increased by two. We would then add the new node with the appropriate +;;;; lft and rgt values. While this can be done with a stored procedure in +;;;; MySQL 5, I will assume for the moment that most readers are using 4.1, +;;;; as it is the latest stable version, and I will isolate my queries with +;;;; a LOCK TABLES statement instead: +;;;; +;;;; #+BEGIN_SRC sql +;;;; LOCK TABLE nested_category WRITE; +;;;; +;;;; SELECT @myRight := rgt FROM nested_category +;;;; WHERE name = 'TELEVISIONS'; +;;;; +;;;; UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myRight; +;;;; UPDATE nested_category SET lft = lft + 2 WHERE lft > @myRight; +;;;; +;;;; INSERT INTO nested_category(name, lft, rgt) VALUES('GAME CONSOLES', @myRight + 1, @myRight + 2); +;;;; +;;;; UNLOCK TABLES; +;;;; #+END_SRC +;;;; +;;;; #+BEGIN_SRC lisp + +(defun category-insert-right-of (name &optional left-of) + "Create a new category tree. LEFT-OF is the NAME of the node to the +left of this new node named NAME. If LEFT-OF is NIL, insert +all-the-way at the right." + (with-connection (db) + (let* ((found (ignore-errors + (mito:find-dao 'category :name left-of))) + (my-right (if (and left-of found) + (ignore-errors + (category-right-of found)) + (max-dao 'category)))) + (with-transaction + (mapcar #'mito:execute-sql + (list + (sxql:update :category + (sxql:set= :right (:+ :right 2)) + (sxql:where (:> :right my-right))) + (sxql:update :category + (sxql:set= :left (:+ :left 2)) + (sxql:where (:> :left my-right))))) + (mito:create-dao 'category :name name + :left (+ my-right 1) + :right (+ my-right 2)))))) + +;;;; #+END_SRC +;;;; +;;;; We can then check our nesting with our indented tree query: +;;;; +;;;; +-----------------------+ +;;;; | name | +;;;; +-----------------------+ +;;;; | ELECTRONICS | +;;;; | TELEVISIONS | +;;;; | TUBE | +;;;; | LCD | +;;;; | PLASMA | +;;;; | GAME CONSOLES | +;;;; | PORTABLE ELECTRONICS | +;;;; | MP3 PLAYERS | +;;;; | FLASH | +;;;; | CD PLAYERS | +;;;; | 2 WAY RADIOS | +;;;; +-----------------------+ +;;;; +;;;; ** category-insert-new-child +;;;; +;;;; If we instead want to add a node as a child of a node that has no +;;;; existing children, we need to modify our procedure slightly. Let’s add +;;;; a new FRS node below the 2 WAY RADIOS node: +;;;; +;;;; #+BEGIN_SRC sql +;;;; LOCK TABLE nested_category WRITE; +;;;; +;;;; SELECT @myLeft := lft FROM nested_category +;;;; +;;;; WHERE name = '2 WAY RADIOS'; +;;;; +;;;; UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myLeft; +;;;; UPDATE nested_category SET lft = lft + 2 WHERE lft > @myLeft; +;;;; +;;;; INSERT INTO nested_category(name, lft, rgt) VALUES('FRS', @myLeft + 1, @myLeft + 2); +;;;; +;;;; UNLOCK TABLES; +;;;; #+END_SRC +;;;; +;;;; #+BEGIN_SRC lisp + +(defun category-insert-new-child (name left-of) + "Create a new category tree. LEFT-OF is the NAME of the node to the +left of this new node named NAME." + (with-connection (db) + (let* ((my-left (category-left-of + (mito:find-dao 'category :name left-of)))) + (with-transaction + (mapcar #'mito:execute-sql + (list + (sxql:update :category + (sxql:set= :right (:+ :right 2)) + (sxql:where (:> :right my-left))) + (sxql:update :category + (sxql:set= :left (:+ :left 2)) + (sxql:where (:> :left my-left))))) + (mito:create-dao 'category :name name + :left (+ my-left 1) + :right (+ my-left 2)))))) + +;;;; #+END_SRC +;;;; +;;;; In this example we expand everything to the right of the left-hand +;;;; number of our proud new parent node, then place the node to the right +;;;; of the left-hand value. As you can see, our new node is now properly +;;;; nested: +;;;; +;;;; #+BEGIN_SRC sql +;;;; SELECT CONCAT( REPEAT( ' ', (COUNT(parent.name) - 1) ), node.name) AS name +;;;; FROM nested_category AS node, +;;;; nested_category AS parent +;;;; WHERE node.lft BETWEEN parent.lft AND parent.rgt +;;;; GROUP BY node.name +;;;; ORDER BY node.lft; +;;;; #+END_SRC +;;;; +;;;; +-----------------------+ +;;;; | name | +;;;; +-----------------------+ +;;;; | ELECTRONICS | +;;;; | TELEVISIONS | +;;;; | TUBE | +;;;; | LCD | +;;;; | PLASMA | +;;;; | GAME CONSOLES | +;;;; | PORTABLE ELECTRONICS | +;;;; | MP3 PLAYERS | +;;;; | FLASH | +;;;; | CD PLAYERS | +;;;; | 2 WAY RADIOS | +;;;; | FRS | +;;;; +-----------------------+ +;;;; +;;;; * Deleting Nodes +;;;; +;;;; ** DONE category-delete-tree +;;;; +;;;; The last basic task involved in working with nested sets is the +;;;; removal of nodes. The course of action you take when deleting a node +;;;; depends on the node’s position in the hierarchy; deleting leaf nodes +;;;; is easier than deleting nodes with children because we have to handle +;;;; the orphaned nodes. +;;;; +;;;; When deleting a leaf node, the process if just the opposite of adding +;;;; a new node, we delete the node and its width from every node to its +;;;; right: +;;;; +;;;; #+BEGIN_SRC sql +;;;; LOCK TABLE nested_category WRITE; +;;;; +;;;; SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt - lft + 1 +;;;; FROM nested_category +;;;; WHERE name = 'GAME CONSOLES'; +;;;; +;;;; DELETE FROM nested_category WHERE lft BETWEEN @myLeft AND @myRight; +;;;; +;;;; UPDATE nested_category SET rgt = rgt - @myWidth WHERE rgt > @myRight; +;;;; UPDATE nested_category SET lft = lft - @myWidth WHERE lft > @myRight; +;;;; +;;;; UNLOCK TABLES; +;;;; #+END_SRC +;;;; +;;;; #+BEGIN_SRC lisp + +(defun category-delete-tree (name) + (with-connection (db) + (with-transaction + (let ((found (mito:find-dao 'category :name name))) + (if found + (let* ((my-left (category-left-of found)) + (my-right (category-right-of found)) + (my-width (1+ (- my-right my-left)))) + (mapcar #'mito:execute-sql + (list + (sxql:delete-from :category + (sxql:where (sxql:make-op :raw + (format nil "left between ~d and ~d" + my-left my-right)))) + (sxql:update :category + (sxql:set= :right (:- :right my-width)) + (sxql:where (:> :right my-right))) + (sxql:update :category + (sxql:set= :left (:- :left my-width)) + (sxql:where (:> :left my-right))))))))))) + +;;;; #+END_SRC +;;;; +;;;; And once again, we execute our indented tree query to confirm that our +;;;; node has been deleted without corrupting the hierarchy: +;;;; +;;;; +-----------------------+ +;;;; | name | +;;;; +-----------------------+ +;;;; | ELECTRONICS | +;;;; | TELEVISIONS | +;;;; | TUBE | +;;;; | LCD | +;;;; | PLASMA | +;;;; | PORTABLE ELECTRONICS | +;;;; | MP3 PLAYERS | +;;;; | FLASH | +;;;; | CD PLAYERS | +;;;; | 2 WAY RADIOS | +;;;; | FRS | +;;;; +-----------------------+ +;;;; +;;;; This approach works equally well to delete a node and all its children: +;;;; +;;;; And once again, we query to see that we have successfully deleted an entire sub-tree: +;;;; +;;;; +-----------------------+ +;;;; | name | +;;;; +-----------------------+ +;;;; | ELECTRONICS | +;;;; | TELEVISIONS | +;;;; | TUBE | +;;;; | LCD | +;;;; | PLASMA | +;;;; | PORTABLE ELECTRONICS | +;;;; | CD PLAYERS | +;;;; | 2 WAY RADIOS | +;;;; | FRS | +;;;; +-----------------------+ +;;;; +;;;; ** category-delete-and-reparent +;;;; +;;;; The other scenario we have to deal with is the deletion of a parent +;;;; node but not the children. In some cases you may wish to just change +;;;; the name to a placeholder until a replacement is presented, such as +;;;; when a supervisor is fired. In other cases, the child nodes should all +;;;; be moved up to the level of the deleted parent: +;;;; +;;;; #+BEGIN_SRC sql +;;;; LOCK TABLE nested_category WRITE; +;;;; +;;;; SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt - lft + 1 +;;;; FROM nested_category +;;;; WHERE name = 'PORTABLE ELECTRONICS'; +;;;; +;;;; DELETE FROM nested_category WHERE lft = @myLeft; +;;;; +;;;; UPDATE nested_category SET rgt = rgt - 1, lft = lft - 1 WHERE lft BETWEEN @myLeft AND @myRight; +;;;; UPDATE nested_category SET rgt = rgt - 2 WHERE rgt > @myRight; +;;;; UPDATE nested_category SET lft = lft - 2 WHERE lft > @myRight; +;;;; +;;;; UNLOCK TABLES; +;;;; #+END_SRC +;;;; +;;;; #+BEGIN_SRC lisp + +(defun category-delete-and-reparent (name) + (with-connection (db) + (with-transaction + (let ((found (mito:find-dao 'category :name name))) + (if found + (let* ((my-left (category-left-of found)) + (my-right (category-right-of found))) + (mapcar #'mito:execute-sql + (list + (sxql:delete-from :category + (sxql:where (:= :left my-left))) + (sxql:update :category + (sxql:set= :right (:- :right 1) + :left (:- :left 1)) + (sxql:where (sxql:make-op + :raw (format nil "left between ~d and ~d" + my-left my-right)))) + (sxql:update :category + (sxql:set= :right (:- :right 2)) + (sxql:where (:> :right my-right))) + (sxql:update :category + (sxql:set= :left (:- :left 2)) + (sxql:where (:> :left my-right))))))))))) + +;;;; #+END_SRC +;;;; +;;;; In this case we subtract two from all elements to the right of the +;;;; node (since without children it would have a width of two), and one +;;;; from the nodes that are its children (to close the gap created by the +;;;; loss of the parent’s left value). Once again, we can confirm our +;;;; elements have been promoted: +;;;; +;;;; +---------------+ +;;;; | name | +;;;; +---------------+ +;;;; | ELECTRONICS | +;;;; | TELEVISIONS | +;;;; | TUBE | +;;;; | LCD | +;;;; | PLASMA | +;;;; | CD PLAYERS | +;;;; | 2 WAY RADIOS | +;;;; | FRS | +;;;; +---------------+ +;;;; +;;;; ** category-delete-and-promote +;;;; +;;;; Other scenarios when deleting nodes would include promoting one of the +;;;; children to the parent position and moving the child nodes under a +;;;; sibling of the parent node, but for the sake of space these scenarios +;;;; will not be covered in this article. + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; TODO SELECT-CATEGORY ? +(defgeneric by-category (class maybe-category-id) + (:method ((class t) (id category)) + (select-dao class (sxql:where (:= :category id)))) + (:method ((class t) (id integer)) + (select-dao class (sxql:where (:= :category-id id)))) + (:method ((class t) (id string)) + (by-category class (parse-integer id)))) + diff --git a/src/models/constructed-decks.lisp b/src/models/constructed-decks.lisp new file mode 100644 index 0000000..16760de --- /dev/null +++ b/src/models/constructed-decks.lisp @@ -0,0 +1,335 @@ +#| + +src/models/constructed-deck.lisp + +Constructed deck model: + +- CONSTRUCTED-DECK + +A CONSTRUCTED-DECK is based on a YDK-DECK. The YDK-DECK is built on +the YDK object, which keeps track of synchronizing the stuff in the +Deck Builder App with the database through YDK-SYNC. Since we don't +plan on modifying CONSTRUCTED-DECKs, there is nothing analogous to +YDK-SYNC for CONSTRUCTED-DECKs. I think that's what I'm implementing +right now, the pull logic. + +- CONSTRUCTED-DECK-ITEM + +Analogous to DECK-ITEM. Nothing fancy here. Extra columns: YGO-SET-ITEM, SELL-PRICE. + +- SOLD-DECK + +NODO Supposed to represent decks sold in the same way Deck Templates +-> Pulled Decks, Pulled Decks -> Sold Decks. + +|# + +(in-package #:cl-deck-builder2.models.constructed-decks) + +(defparameter +default-constructed-deck-sell-price+ "60.00" + "Default sell price for constructed decks. We have the price for every card set to 0.50 cents. That works out to $35 for a 70 card deck. This is about twice that.") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defclass constructed-deck () + ((;; The name of this CONSTRUCTED-DECK + name :accessor deck-name-of + :col-type :text + :initarg :name) + + (category :accessor deck-category-of :col-type (or category :null)) + (created-by :accessor deck-created-by :col-type :text :initarg :created-by) + + (;; If the CONSTRUCTED-DECK has a SELL-PRICE, we override the total price of the deck with this price. + sell-price :accessor deck-sell-price-of + :col-type :integer + :initarg :sell-price + :initform +default-constructed-deck-sell-price+ + :deflate #'currency-deflate + :inflate #'currency-inflate) + + ;; The original ID of the deck, probably from YDK-DECK + (ydk-deck :accessor ydk-deck-of + :col-type ydk-deck + :initarg :ydk-deck) + (sold :accessor deck-sold + :col-type :binary + :initarg :deck-sold + :initform 0)) + (:metaclass registered-table-class) + (:documentation "A Constructed deck is just a deck that has been \"pulled.\" That is, +somebody built a deck template, clicked the \"Pull\" button. From +what has been explained to me, we'll only pull decks we have. So +we'll only construct decks with cards we know or think we know we have +or we plan on getting more of. Then the physical cards will need to +be collected and assembled into the deck following the template. This +physical, real, action is what is recorded by the \"Pull\" action. + +It's important to note that it is impossible to constrain somebody +from pulling arbitrary decks. A physical security device would need to +be in place and a framework for authentication with it would be +necessary (i.e. it is expected that one will use this tool with +intention, respectfully, and will be trained on how to do so). + +Anyway. You don't actually have to physically pull the cards yet. This +is just a record, think an earmark on a page, that these cards from +this deck template have been pulled. YDK-DECK-PULL-FROM-INVENTORY does +all the heavy lifting, and will return a CONSTRUCTED-DECK object if +it was successful. + +Then, finally, during the deck construction phase, you will be +prompted to select the variant of card, language, condition, etc. + +Once you are happy with your selection the constructed deck will be +marked as \"FOR-SALE\".")) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defclass constructed-deck-item () + (;; The original ID of the CONSTRUCTED-DECK-ITEM, from DECK-ITEM + ;; (passcode :accessor deck-passcode-of :col-type :integer) + ;; (inventory-item :accessor deck-inventory-item-of :col-type inventory-item) + (ygo-card :accessor ygo-card-of + :col-type ygo-card + :initarg :ygo-card) + (deck-id :accessor deck-id-of + :col-type :integer) + (deck-item :accessor deck-item-of + :col-type deck-item + :initarg :deck-item) + (ygo-set-item :accessor deck-set-item-of + :col-type ygo-set-item + :initarg :ygo-set-item)) + ;; (variant :accessor deck-item-variant-of + ;; :col-type variant + ;; :initarg :variant) + ;; + ;; Shouldn't inventory items have Qty and not constructed deck items? + ;; + ;; (opt-qty :accessor opt-qty-of + ;; :col-type :integer + ;; :initarg :opt-qty + ;; :initform 0) + ;; (qty :accessor qty-of + ;; :col-type :integer + ;; :initarg :qty + ;; :initform 0) + (:metaclass registered-table-class) + (:documentation "A CONSTRUCTED-DECK-ITEM is pretty much the same as a DECK-ITEM, except it's a \"constructed\" deck. + +Same index idea and everything. The table is indexed into by CONSTRUCTED-DECK-ID. + +We subclass YGO-SETS for all the card metadata.")) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Analogous to YDK-DECK -- Do we even need this? I just loop over the SET-ITEMS anyway. +(defclass constructed-deck-intermediate () + ((deck-item :accessor cdi-deck-item + :initarg :deck-item) + (deck-set :accessor cdi-deck-set + :initarg :deck-set) + (set-item :accessor cdi-deck-set-item + :initarg :set-item) + (condition :accessor cdi-deck-condition + :initarg :condition) + (card :accessor cdi-deck-card + :initarg :card))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Just want the decks to be marked as sold. Easy. +;; +;; (defclass sold-deck (constructed-deck) +;; (;; Has the deck been sold? +;; (deck-sold :accessor constructed-deck-sold +;; :col-type :integer +;; :initarg :sold +;; :initform 0) +;; ;; 60 Doll Hairs +;; (sell-price :accessor deck-sell-price-of +;; :col-type :integer +;; :initarg :sell-price +;; :initform +default-constructed-deck-sell-price+ +;; :deflate #'currency-deflate +;; :inflate #'currency-inflate)) +;; (:metaclass registered-table-class)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; I think this got superseded by CDI-PULL-FROM-INVENTORY since we +;; aren't pulling from YDKs any more but from +;; CONSTRUCTED-DECK-INTERMEDIATE. +(defmethod ydk-deck-pull-from-inventory ((deck ydk-deck)) + "Attempt to find inventory stock for every card in this deck, and if we are able to secure it, construct and insert a new PULLED-DECK into the database." + (with-connection (db) + (let ((;; Get the OLD-DECK-ID + old-deck-id (mito:object-id deck)) + (;; Create a new DECK based on the old DECK + new (mito:create-dao 'constructed-deck + :name (ydk-name-of deck) + :category (ydk-category-of deck) + :created-by (ydk-created-by deck) + :sell-price +default-constructed-deck-sell-price+ + :ydk-deck deck))) + ;; If the new deck was created successfully, + (when new + (let ((;; Get the NEW-DECK-ID + new-deck-id (mito:object-id deck)) + (;; Get all the items from the old deck + deck-items (mito:select-dao 'deck-item + (sxql:where (:= :deck-id old-deck-id))))) + (with-transaction + (dolist (deck-item deck-items new) + ;; Create a bunch of CONSTRUCTED-DECK-ITEMs for the + ;; corresponding DECK-ITEMs. from the old DECK. + (create-dao 'constructed-deck-item + :deck-id new-deck-id + :ygo-card-id (deck-passcode-of deck-item))))))))) + +;; (defmethod mark-as-sold ((sold-deck sold-deck)) +;; "Mark a SOLD-DECK as having been sold." +;; (setf (deck-sold sold-deck) 1) +;; (update-dao sold-deck)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; This expects a list of CONSTRUCTED-DECK-INTERMEDIATE which has no documented format. +;; +(defun deck-to-pull-set-items-qty-as-alist (cdi-items) + "Construct an ALIST of PASSCODE . QTY from DECK listing. We use a list of CONSTRUCTED-DECK-INTERMEDIATE objects." + (let ((alist '())) + (dolist (row cdi-items alist) + (push (cons (cdi-deck-set-item row) + (qty-of (cdi-deck-set-item row))) + alist)))) + +(defun deck-to-pull-desired-qty-as-alist (cdi-items) + "Construct an ALIST of PASSCODE . (COUNT PASSCODE) from DECK listing. We use a list of CONSTRUCTED-DECK-INTERMEDIATE objects." + (let ((alist '())) + (dolist (row cdi-items alist) + (if (assoc (cdi-deck-set-item row) alist :test #'mito:object=) + (incf (cdr (assoc (cdi-deck-set-item row) alist :test #'mito:object=))) + (push (cons (cdi-deck-set-item row) 1) alist))))) + +(defun subtract-desired-from-set-item-qty-as-alist (set-items-qty desired-items-qty) + "Perform a DECF on the CDR of the paired elements from (DECK-TO-PULL-SET-ITEMS-QTY-AS-ALIST) using (DECK-TO-PULL-DESIRED-QTY-AS-ALIST) as the source argument." + (dolist (pair desired-items-qty set-items-qty) + (if (assoc (car pair) set-items-qty :test #'mito:object=) + (decf (cdr (assoc (car pair) set-items-qty :test #'mito:object=)) + (cdr pair)) + (v:info :construct "Invalid ID pair: ~a" (car pair))))) + +(defun find-any-invalid-qtys (set-items-qty desired-items-qty) + (with-connection (db) + (with-transaction + (loop for pair in (subtract-desired-from-set-item-qty-as-alist set-items-qty desired-items-qty) + do (when (minusp (cdr pair)) + (return (ygo-passcode-of (item-of (car pair))))))))) + +(defun valid-pull-p (set-items-qty desired-items-qty) + "Loop over the results of SUBTRACT-DESIRED-FROM-SET-ITEM-QTY-AS-ALIST, looking for any less-than-zero values. If any exist, we took too much out of inventory, and the pull is \"invalid,\" we return NIL. Otherwise, the pull will be successful (we have enough inventory), so return T." + (not (find-any-invalid-qtys set-items-qty desired-items-qty))) + +;; Actually subtract the amounts from the set item +;; make the CONSTRUCTED-DECK with CONSTRUCTED-DECK-ITEM +;; Make the view panel + +(defun cdi-pull-from-inventory (cdi-list) + "Attempt to find inventory stock for every card in this deck, and if we are able to secure it, construct and insert a new PULLED-DECK into the database." + (with-connection (db) + (let* ((;; Get the OLD-DECK-ID + old-deck-id (deck-id-of (cdi-deck-item (car cdi-list)))) + (;; Get the OLD DECK + old-deck (mito:find-dao 'ydk-deck :id old-deck-id)) + (;; Create a new DECK based on the old DECK + new (mito:create-dao 'constructed-deck + :name (ydk-name-of old-deck) + :category (ydk-category-of old-deck) + :created-by (ydk-created-by old-deck) + :sell-price +default-constructed-deck-sell-price+ + :ydk-deck old-deck))) + ;; If the new deck was created successfully, + (when new + ;; Get the NEW-DECK-ID + (let ((new-deck-id (mito:object-id new))) + ;; iterate over all the items from the old deck + (with-transaction + (dolist (row cdi-list new) + ;; Create a bunch of CONSTRUCTED-DECK-ITEMs for the + ;; corresponding DECK-ITEMs. from the old DECK. + (mito:create-dao 'constructed-deck-item + :deck-id new-deck-id + :deck-item-id (mito:object-id (cdi-deck-item row)) + :ygo-set-item-id (mito:object-id (cdi-deck-set-item row)) + :ygo-card-id (deck-passcode-of (cdi-deck-item row)))))))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun return-to-inventory (cdi-items) + "Attempt to find inventory stock for every card in this deck, and increment the count by however many we specify in the CDR." + (let ((counts (deck-to-pull-desired-qty-as-alist cdi-items))) + (dolist (row counts) + (incf (qty-of (car row)) (cdr row)) + ;; Update each one and save - wrapping this in a transaction causes issues with pulling multiple items. + (save-dao (car row))))) + +(defun constructed-deck-as-cdi-list (constructed-deck-id) + (with-connection (db) + (let ((deck + (mito:select-dao 'constructed-deck-item + (mito:includes 'ygo-card 'deck-item 'ygo-set-item) + (sxql:order-by :asc :id) + (sxql:where (:= :deck-id constructed-deck-id)))) + (lst '())) + (dolist (row deck (reverse lst)) + (let ((deck-set-item (deck-set-item-of row))) + (push (make-instance 'constructed-deck-intermediate + :card (ygo-card-by-passcode (ygo-passcode-of (ygo-card-of row))) + :condition (variant-of deck-set-item) + :deck-item (deck-item-of row) + :deck-set (ygo-set-by-id (mito:object-id (item-of deck-set-item))) + :set-item deck-set-item) + lst)))))) + +;; TODO Use STORE-CONSTRUCTED-DECK-AS-CURRENT to load a +;; CONSTRUCTED-DECK out of the database into +;; *CURRENT-CONSTRUCTED-DECK* so we can use RETURN-TO-INVENTORY on it. +(defun cdi-return-to-inventory (cdi-list) + (error "TODO")) + +;; Where did this code from? I feel like it got easily superceded by CALCULATE-OPTIMUM-QTY. +;; I think it was used in CARDS-IN-ALL-DECKS? +(defun unique-constructed-deck-item-passcodes () + "Select the unique cards in all CONSTRUCTED-DECK-ITEMs" + (let ((deck-items + (with-connection (db) + (mito:select-dao 'constructed-deck-item + (sxql:group-by :passcode) + (sxql:order-by :passcode :desc)))) + (ht (make-hash-table))) + (with-connection (db) + (with-transaction + (dolist (deck-item (reverse deck-items) ht) + (pushnew (list :deck-id (deck-id-of deck-item) + :constructed-deck (mito:find-dao 'constructed-deck :id (deck-id-of deck-item)) + :ygo-card (mito:find-dao 'ygo-card :id (deck-passcode-of deck-item))) + (gethash (deck-passcode-of deck-item) ht) + :key (lambda (plist) (getf plist :deck-id)))))))) + +(defun calculate-optimum-qty () + (with-connection (db) + (let ((count-data + (with-transaction + (mito:retrieve-by-sql + (sxql:select (:passcode (:as (:count :passcode) :count)) + (sxql:from :deck_item) + (sxql:group-by :passcode) + (sxql:order-by (:count :passcode) :asc))))) + (lst '())) + (with-transaction + (mapcar #'mito:execute-sql + (dolist (row count-data lst) + (let ((passcode (getf row :passcode)) + (opt-qty (getf row :count))) + (push + (sxql:update :ygo_set_item + (sxql:set= :opt_qty (* 5 opt-qty)) + (sxql:where (:in :item_id + (sxql:select :id + (sxql:from :ygo_set) + (sxql:where (:= :passcode_id passcode)))))) + lst)))))))) diff --git a/src/models/crystal-commerce-csv.lisp b/src/models/crystal-commerce-csv.lisp new file mode 100644 index 0000000..da6fb0b --- /dev/null +++ b/src/models/crystal-commerce-csv.lisp @@ -0,0 +1,208 @@ +#| + +src/models/crystal-commerce-csv.lisp + +Crystal Commerce Search CSV Export / Import functionality. + +This code is so old. It dates back to May. I mistakenly assumed we +would get access to Crystal Commerce or TCGPlayer API data. + +Instead, I based my initial database design off of the CSV export +data. The CSV export data does not supply the following necessary +fields: Passcode (Card Image), Variants (Condition). + +I learned July 15 that this design was insufficient and set out to +replace it with something more robust. Within 2 weeks by the beginning +of August I had conceptualized a new design, and by the second week of +August, had implemented that design. That is currenly YGOPRODECK-2. + +There is some munging facility in here that I wrote while munging the +YGOProDeck API data during the v2 rewrite. + +TODO This needs to be rewritten to match the new YGOProDeck v3 +API. Currently we scan in the Product Name, it could be split out to +match the corresponding db entry. + +TODO Some time in October I became aware we have access to Crystal Commerce API now. + +https://crystal-service.readme.io/docs/get-started-with-the-admin-api +https://crystal-service.readme.io/reference/get_api-v1-activity-logs + +|# + +(in-package #:cl-user) + +(defpackage #:cl-deck-builder2.models.crystal-commerce.csv + (:use #:cl + #:cl-deck-builder2.db + #:cl-deck-builder2.models.generics + #:cl-deck-builder2.models.crystal-commerce) + (:import-from #:cl-deck-builder2.toolkit + #:grouped) + (:local-nicknames (#:v #:org.shirakumo.verbose)) + (:export #:*cc-csv-import-fields* + #:*cc-csv-header-fields* + #:csv-import-cc)) + +(in-package #:cl-deck-builder2.models.crystal-commerce.csv) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; CSV Import +(defvar *csv* nil + "The currently loaded CSV data.") + +(defvar *card-sets* nil + "Data loaded from CARD-SET table. We use datafly for this one because +mito conses a lot for CLOS. A PLIST is faster.") + +(defvar *cc-csv-import-fields* + '("Product Name" + "Category" + "Total Qty" + "Wishlists" + "Buy Price" + "Sell Price" + "URL" + "Barcode" + "Manufacturer SKU" + "Amazon ASIN" + "MSRP" + "Brand" + "Weight" + "Description" + "Max Qty" + "Domestic Only" + "Tax Exempt") + "Crystal Commerce header fields via CSV import. We transform this into *CC-CSV-HEADER-FIELDS*. + +SEE *CC-CSV-HEADER-FIELDS*.") + +(defvar *cc-csv-header-fields* + (mapcar (lambda (s) + (alexandria:make-keyword + (string-upcase + (substitute #\- #\Space s)))) + *cc-csv-import-fields*) + "Transformed list of Keyword-ified header fields. That is, we take *CC-CSV-IMPORT-FIELDS* and transform the strings into keywords: + + \"Product Name\" => :PRODUCT-NAME.") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun load-csv (maybe-pathname &optional (force nil)) + "Cache CSV data from MAYBE-PATHNAME which may be a PATHNAME or a STRING containing CSV data." + (if (or force + (null *csv*)) + (progn + (v:info :cc-csv "Loading CSV from ~A~%" + (typecase maybe-pathname + (pathname maybe-pathname) + (string 'STRING))) + (setf *csv* + ;; Skip the first header line + (rest + (cl-csv:read-csv maybe-pathname)))) + (v:info :cc-csv "Using previously loaded CSV data of length ~d~%" (length *csv*)))) + +(defun load-card-sets () + "Cache CARD-SET info to match up from PRODUCT-NAME." + (unless *card-sets* + (with-datafly-connection (db) + (with-datafly-transaction + (setf *card-sets* + (datafly:retrieve-all + (sxql:select (:code :passcode) + (sxql:from :ygo_set)))))))) + +;; TODO update this code with the new YGOProDeck stuff +(defun normalize-product-name (name) + "Given a PRODUCT-NAME, apply the extracted data from the string: Name, +Set Code, Rarity, and Edition. Return a property list that can be +passed to SXQL:SET=." + (let ((normalized-name name)) + ;; XXX EW + ;; Replace things like "Rare-" and "Common-" With "Rare" and "Common" + (setf normalized-name (cl-ppcre:regex-replace "(\\w+)- " normalized-name "\\1")) + ;; A few single cards is borked + (setf normalized-name (cl-ppcre:regex-replace "MRD-EN134 - Unlimited" normalized-name "MRD-EN134 - Common - Unlimited")) + (setf normalized-name (cl-ppcre:regex-replace "SXG3-ENE05" normalized-name "SGX3-ENE05")) + (setf normalized-name (cl-ppcre:regex-replace "wCPP-EN002" normalized-name "WCPP-EN002")) + ;; This set was borknd + ;; Maybe not, maybe it just doesn't have a Limited/Unlimited status? + ;; (setf normalized-name (cl-ppcre:regex-replace "TKN4-([^ ]+) - Super Rare" normalized-name "TKN4-\\1 - Super Rare - Unlimited")) + ;; Replace things like Rare 1st Edition with Rare - 1st Edition + (setf normalized-name (cl-ppcre:regex-replace "(Common|Rare) (1st|Limited|Unlimited)" normalized-name "\\1 - \\2")) + (let ((parts (reverse + (cl-ppcre:split " \\s?[-–] \\s?" normalized-name)))) + (case (length parts) + (1 `(:name ,(first parts))) + (2 `(:name ,(format nil "~{~A~^ - ~}" parts))) + (3 `(:name ,(first parts) + :code ,(second parts) + :rarity ,(third parts))) + (4 `(:name ,(first parts) + :code ,(second parts) + :rarity ,(third parts) + :edition ,(fourth parts))) + (5 `(:name ,(format nil "~{~A~^ - ~}" (subseq parts 0 2)) + :code ,(third parts) + :rarity ,(fourth parts) + :edition ,(fifth parts))) + (6 `(:name ,(format nil "~{~A~^ - ~}" (subseq parts 0 3)) + :code ,(fourth parts) + :rarity ,(fifth parts) + :edition ,(sixth parts))) + (otherwise (format t "Skipping data: ~a~%" name)))))) + +;; (defparameter *db-variants* +;; (let ((ht (make-hash-table))) +;; (loop for variant in (select-dao 'variant) do +;; (setf (gethash (variant-name-of variant) ht) variant)) +;; ht)) + +;; TODO clean up the field names to auto generate +;; +;; TODO I added some additional fields, opt-qty reserved-qty condition language +;; I guess we will need one of each in the db... +(defun csv-import-cc (csv) + "Import the perfect data from Crystal Commerce. Do nothing with it but import it into the table." + (load-csv csv) + + (v:info :cc-csv "CSV Loaded") + ;; (load-card-sets) + ;; (format t "Card sets loaded from DB~&") + + (let ((csv-items (seed-csv-items))) + (pre-seed-db-items csv-items)) + + (v:info :cc-csv "done.~&")) + +(defun seed-csv-items () + (let ((csv-items '())) + (with-connection (db) + (with-transaction + (dolist (row *csv*) + (let ((row-plist (mapcan #'list *cc-csv-header-fields* row))) + (push (or (mito:find-dao 'cc-item :product-name (getf row-plist :product-name)) + (apply #'make-instance 'cc-item row-plist)) + csv-items))))) + (v:info :cc-csv "CSV Items: ~d" (length csv-items)) + + (unless (mito:dao-synced (car csv-items)) + (do-grouped-insert csv-items)))) + +(defun pre-seed-db-items (cc-items) + (let ((db-items '())) + (with-connection (db) + (with-transaction + (dolist (cc-item cc-items) + (dolist (variant (select-dao 'variant)) + (push (or (mito:find-dao 'ygo-cc-item :item-id (mito:object-id cc-item) + :variant-id (mito:object-id variant)) + (make-instance 'ygo-cc-item + :item cc-item + :variant variant)) + db-items))))) + (v:info :cc-csv "DB Items: ~d" (length db-items)) + + (unless (mito:dao-synced (car db-items)) + (do-grouped-insert db-items)))) diff --git a/src/models/crystal-commerce.lisp b/src/models/crystal-commerce.lisp new file mode 100644 index 0000000..6da921c --- /dev/null +++ b/src/models/crystal-commerce.lisp @@ -0,0 +1,235 @@ +#| + +src/models/crystal-commerce.lisp + +Crystal Commerce-style Inventory Management Backend + +TODO All of the old style database accessores (*-BY-ID, etc) need to go. + +DONE It looks like the CSV listing is totally outdated after all: + +CL-DECK-BUILDER2> (count-dao 'cc-item) +48883 (16 bits, #xBEF3) +CL-DECK-BUILDER2> (count-dao 'cl-deck-builder2.models.ygoprodeck.classes::ygo-set) +49240 (16 bits, #xC058) + +That's awfully close enough for me, taking into account the art cards, +the duelist name tag, and prize cards! I wonder if there'd be a way to +see the diff. Some cards are name "Dark Magician A" which is +unfortunate! + +TODO Because of the previous item being DONE, this code is now +outdated and stale, and probably safe to delete, unless we intend on +doing more with Crystal Commerce in the future. + +|# + +(in-package #:cl-user) + +(defpackage #:cl-deck-builder2.models.crystal-commerce + (:use #:cl + #:cl-deck-builder2.db + #:cl-deck-builder2.models.generics + #:cl-deck-builder2.toolkit.money + #:cl-deck-builder2.models.registered-table + #:cl-deck-builder2.models.ygoprodeck) + (:import-from #:cl-deck-builder2.models.ygoprodeck.fields + #:variant-condition) + (:export + :cc-item + :ygo-cc-item + + :name-of + :cc-category-of + :cc-wishlists-of + :cc-buy-price-of + :cc-sell-price-of + :cc-url-of + :cc-barcode-of + :cc-manufacturer-sku-of + :cc-asin-of + :cc-msrp-of + :cc-brand-of + :cc-weight-of + :cc-description-of + :cc-qty-of + :cc-max-qty-of + :cc-total-qty-of + :cc-domestic-only-of + :cc-tax-exempt-of + :cc-name-of + :cc-code-of + :cc-rarity-of + :cc-edition-of + :cc-passcode-of + + :cc-table-ensure-exists + :cc-table-drop + :cc-table-delete + :cc-table-select + :cc-table-select-count + :cc-table-zero + + :cc-select-by-id + :cc-select-by-passcode + + :cc-delete-by-id + + :cc-create + + :cc-variant-of)) + +(in-package #:cl-deck-builder2.models.crystal-commerce) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Cards v2 +;; +(defclass cc-item () + ((name :accessor name-of + :col-type :text) + (category :accessor cc-category-of + :col-type :text) + (total-qty :accessor cc-total-qty-of + :col-type :integer + :initform 0) + (wishlists :accessor cc-wishlists-of + :col-type :integer + :initform 0) + (;; 10 cent buy price + buy-price :accessor cc-buy-price-of + :col-type :integer + :initform 0.10 + :inflate #'currency-inflate + :deflate #'currency-deflate) + (;; 50 cent sell price + sell-price :accessor cc-sell-price-of + :col-type :integer + :initform 0.50 + :inflate #'currency-inflate + :deflate #'currency-deflate) + (url :accessor cc-url-of + :col-type (or :text :null)) + (barcode :accessor cc-barcode-of + :col-type (or :text :null)) + (manufacturer-sku :accessor cc-manufacturer-sku-of + :col-type (or :text :null)) + ;; Some cards don't have an ASIN: Prize Cards, for example. + ;; + ;; ASIN is a built in LISP function so this seems to be causing + ;; issues with Djula. I renamed it to AMAZON-ASIN. + (amazon-asin :accessor cc-asin-of + :col-type (or :text :null)) + (msrp :accessor cc-msrp-of + :col-type (or :integer :null) + :inflate #'currency-inflate + :deflate #'currency-deflate) + (brand :accessor cc-brand-of + :col-type (or :text :null)) + ;; Weight in pounds, lb, lbs.. silly + (weight :accessor cc-weight-of + :col-type :text + :initform "0.0625") + (description :accessor cc-description-of + :col-type (or :text :null)) + (max-qty :accessor cc-max-qty-of + :col-type (or :integer :null)) + (domestic-only :accessor cc-domestic-only-of + :col-type :integer + :initform 0) + (tax-exempt :accessor cc-tax-exempt-of + :col-type :integer + :initform 0)) + (:metaclass registered-table-class) + (:documentation "The base data from CrystalCommerce. This is what's available in a CSV export. + +These fields can be updated from CC CSV Export Search feature. + +The product descriptors. Contains information about the actual content +of the card. None of this is available via CC CSV Export Feature. This +information has to be updated aftewards. The Mass Updater may have +some hints as to how this works. + +Other stuff that doesn't appear in any export or search feature, but on YGOProDeck, which we will probably take info from.")) + +;; Allow bogus keys so we can just apply #'make-instance 'cc-item _parsed in web view +; (defmethod initialize-instance :after ((cc-item cc-item) &key &allow-other-keys)) + +(defclass ygo-cc-item () + ((item :accessor cc-item-of + :col-type cc-item) + (variant :accessor cc-variant-of + :col-type variant-condition) + (qty :accessor cc-qty-of + :col-type :integer + :initform 0) + (opt-qty :accessor cc-opt-qty-of + :col-type :integer + :initform 0) + (;; 10 cent buy price + buy-price :accessor cc-buy-price-of + :col-type :integer + :initform 0.10 + :inflate #'currency-inflate + :deflate #'currency-deflate) + (;; 50 cent sell price + sell-price :accessor cc-sell-price-of + :col-type :integer + :initform 0.50 + :inflate #'currency-inflate + :deflate #'currency-deflate)) + (:metaclass registered-table-class) + (:documentation "CC-ITEM + VARIANT relationship table.")) + + +(defmacro cc-table-delete (&body clauses) + `(delete-from 'cc-item ,@clauses)) + +(defmacro cc-table-select (&body body) + `(select-dao 'cc-item ,@body)) + +(defun cc-table-select-count (&optional fields-and-values) + (count-dao 'cc-item fields-and-values)) + + +;; TODO toolkit/db.lisp maybe? +(defun zero-field (class field &optional clauses) + "Set the specified FIELD of CLASS zero. You may additionally specify CLAUSES." + (with-connection (db) + (with-transaction + (mito:execute-sql + (sxql:update (sxql:make-sql-symbol + (mito.dao::table-name (find-class class))) + (sxql:set= (sxql:make-sql-symbol field) 0) + clauses))))) + +(defun set-buy-sell-price (&optional (buy-price 10) (sell-price 50)) + "This bypasses MITO:DEFLATE (the argument is in CENTS)." + (with-connection (db) + (with-transaction + (mito:execute-sql + (sxql:update :cc_item + (sxql:set= (sxql:make-sql-symbol "buy_price") buy-price + (sxql:make-sql-symbol "sell_price") sell-price)) + (sxql:update :ygo_cc_item + (sxql:set= (sxql:make-sql-symbol "buy_price") buy-price + (sxql:make-sql-symbol "sell_price") sell-price)))))) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun cc-select-by-id (id &rest args) + (apply #'find-dao 'cc-item :id id args)) + +(defun cc-select-by-passcode (passcode &rest args) + (apply #'find-dao 'cc-item :passcode passcode args)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; INSERT + +(defun cc-create (&rest args) + (apply #'create-dao 'cc-item args)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; DELETE +(defun cc-delete-by-id (id &rest args) + (apply #'delete-by-values 'cc-item :id id args)) diff --git a/src/models/feedback.lisp b/src/models/feedback.lisp new file mode 100644 index 0000000..6b9e02d --- /dev/null +++ b/src/models/feedback.lisp @@ -0,0 +1,27 @@ +#| + +User Feedback Module + +TODO User Messaging Module + +|# + +(in-package #:cl-deck-builder2.models.feedback) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defclass feedback () + ((user :accessor feedback-user-of + :col-type user + :initarg :user) + (body :accessor feedback-body-of + :col-type :text + :initarg :body)) + (:metaclass registered-table-class)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defgeneric create-feedback (user body) + (:documentation "Use CREATE-DAO to construct a new FEEDBACK instance. Return the instance, if successful, NIL otherwise.") + (:method ((user user) (body string)) + (create-dao 'feedback + :user user + :body body))) diff --git a/src/models/generics.lisp b/src/models/generics.lisp new file mode 100644 index 0000000..2a2e8ae --- /dev/null +++ b/src/models/generics.lisp @@ -0,0 +1,40 @@ +#| + +When I started this file I was going to generalize EVERY method then I +realized that's too time consuming. So I am going to generalize +methods as they conflict. Hybrid Power! + +There were some issues with merging symbols, I was using +:SHADOWING-IMPORT-FROM which is probably not correct. So instead, what +we do, is, every package that gets :USE-REEXPORTed, we :USE +#:CL-DECK-BUILDER2.MODELS.GENERICS. + +|# + +(in-package #:cl-deck-builder2.models.generics) + +;; Get the NAME slot of an object +(defgeneric name-of (obj)) + +;; Get the PASSCODE slot of an object +(defgeneric ygo-passcode-of (obj)) + +;; Get the Containing Deck ID of the DECK-ITEM, CONSTRUCTED-DECK-ITEM +(defgeneric deck-id-of (obj)) + +;; Get the PRICE slot of an object +(defgeneric ygo-price-of (obj)) + +(defgeneric ygo-archetype-of (obj)) +(defgeneric ygo-atk-of (obj)) +(defgeneric ygo-attribute-of (obj)) +(defgeneric ygo-def-of (obj)) +(defgeneric ygo-description-of (obj)) +(defgeneric ygo-frame-type-of (obj)) +(defgeneric ygo-level-of (obj)) +(defgeneric ygo-linkmarkers-of (obj)) +(defgeneric ygo-linkval-of (obj)) +(defgeneric ygo-passcode-of (obj)) +(defgeneric ygo-race-of (obj)) +(defgeneric ygo-scale-of (obj)) +(defgeneric ygo-type-of (obj)) diff --git a/src/models/label-maker.lisp b/src/models/label-maker.lisp new file mode 100644 index 0000000..188ecfa --- /dev/null +++ b/src/models/label-maker.lisp @@ -0,0 +1,136 @@ +#| + +Conceptually, The Label Maker is very similar to the DRAW component of The Deck Builder. + +We currently support Avery 5160 and ULINE S-20246 labels. + +|# + +(in-package #:cl-user) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; This package doesn't touch the DB ... yet +(defpackage #:cl-deck-builder2.models.label-maker + (:use :cl) + (:import-from #:cl-deck-builder2.toolkit + #:latex-escape) + (:export #:latex-label + #:latex-label-page + #:latex-label-uline-s-20247 + #:latex-label-avery-5160 + #:render-page)) + +(in-package #:cl-deck-builder2.models.label-maker) + +(defclass latex-label () + ((barcode :accessor latex-label-barcode + :initform nil + :initarg :barcode) + (description :accessor latex-label-description + :initform nil + :initarg :description) + (price :accessor latex-label-price + :initform nil + :initarg :price)) + (:documentation "An individual LaTeX label. Encapsulate metadata for a particular label.")) + +(defclass latex-label-page () + ((;; List of LATEX-LABEL content + labels :accessor latex-label-page-labels + :initarg :page-labels + :initform '()) + (;; Number of Labels this page thinks it has + labels-length :accessor latex-label-page-labels-length + :initarg :labels-length + :initform 0) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Templates + (;; Template for this page + label-template :accessor latex-label-label-template + :initform nil + :initarg :label-template) + (;; Header template for this page + header-template :accessor latex-label-header-template + :initform #P"latex/header.tex" + :initarg :header-template)) + (:documentation "Class for a LaTeX Label Page, which encapsulates label information and additional output templating information.")) + +(defclass latex-label-uline-s-20247 (latex-label-page) + ((labels-length :initform 32) + (label-template :initform #P"latex/ULINE-S-20247.tpl.tex"))) + +(defclass latex-label-avery-5160 (latex-label-page) + ((labels-length :initform 30) + (label-template :initform #P"latex/Avery-5160.tpl.tex"))) + +(defmethod initialize-instance :after ((page latex-label-page) &rest initargs &key csv &allow-other-keys) + (declare (ignore initargs)) + (when csv + (initialize-with-csv page csv))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defmethod add-label ((page latex-label-page) (label latex-label)) + "Add a LABEL to PAGE." + (push label (latex-label-page-labels page))) + +(defmethod initialize-with-csv ((page latex-label-page) pathspec) + "Create LATEX-LABEL information for this LATEX-LABEL-PAGE by reading CSV information from PATHSPEC." + (let ((csv (cl-csv:read-csv pathspec))) + (loop for i from 1 upto (latex-label-page-labels-length page) do + (destructuring-bind (label-no description price barcode) + (elt csv i) + (declare (ignore label-no)) + (when (> (length description) 0) + (barcode-png barcode) + (let ((label (ignore-errors + (make-instance 'latex-label + :barcode barcode + :description (latex-escape description) + :price (cl-ppcre:regex-replace "\\$" price "\\\\$"))))) + (add-label page label))))))) + +(defmethod render-page ((page latex-label-page)) + "Use Djula to render the LATEX-LABEL-LABEL-TEMPLATE." + (cl-deck-builder2.view:render (latex-label-label-template page) + (list :labels (latex-label-page-labels page)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun label-info (&optional t-or-nil) + (let ((arg (if t-or-nil "true" "false"))) + (format nil "\LabelGrid~a\LabelInfo~a%%~%" arg arg))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; TODO (defclass barcode () ()) +(defun barcode-png (barcode &optional (directory #P"/tmp/labels/") (size "1x30")) + (ensure-directories-exist directory) + (let* ((barcode (etypecase barcode + (string barcode) + (integer (princ-to-string barcode)))) + (output (merge-pathnames + (make-pathname :name barcode :type "png") + (probe-file directory)))) + (unless (probe-file output) + (and + (> (length barcode) 0) + (multiple-value-bind (stdout stderr rc) + (inferior-shell:run + `("ZXingWriter" -size ,size + ,(case (length barcode) + ;; 12 and 11 digit barcodes for products in store on the shelves usually - UPC-A + ((12 11) 'UPC-A) + ;; 10 digit barcodes for "fake" Amazon ASIN "X0037THWV7" + (10 'Code128) + ;; Not sure why we have UPC-E in here + ;; but presumbly we have encountered + ;; products with a 6 digit barcode... + (6 'UPC-E) + ;; Treat everything else as 13 digit + ;; international EAN-13 barcodes like + ;; stuff from Pokemon Stores: + ;; 8206508090648 + (t 'EAN-13)) + ,barcode + ,output)) + (declare (ignore stdout stderr)) + (eq rc 0)) + (probe-file output))))) diff --git a/src/models/mtg.lisp b/src/models/mtg.lisp new file mode 100644 index 0000000..bc9f4f9 --- /dev/null +++ b/src/models/mtg.lisp @@ -0,0 +1,65 @@ +#| + +scryfall API parser + +WIP + +This downloads the API data. We haven't even parsed that data +yet. It's hundreds of GB. + +|# + +(in-package #:cl-user) + +(defpackage #:cl-deck-builder2.models.mtg + (:use :cl)) + +(in-package #:cl-deck-builder2.models.mtg) + +(defparameter *base-scryfall-api-uri* "https://api.scryfall.com/") + +(defun scryfall-api-uri (path) + (format nil "~a~a" *base-scryfall-api-uri* path)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defvar *scryfall-api-data* nil + "A list of SCRYFALL-API-DATA objects.") + +(defclass scryfall-api-data () + ((|content_encoding| :accessor scryfall-content-encoding :initarg :|content_encoding|) + (|content_type| :accessor scryfall-content-type :initarg :|content_type|) + (|description| :accessor scryfall-description :initarg :|description|) + (|download_uri| :accessor scryfall-download-uri :initarg :|download_uri|) + (|id| :accessor scryfall-id :initarg :|id|) + (|name| :accessor scryfall-name :initarg :|name|) + (|object| :accessor scryfall-object :initarg :|object|) + (|size| :accessor scryfall-size :initarg :|size|) + (|type| :accessor scryfall-type :initarg :|type|) + (|updated_at| :accessor scryfall-updated-at :initarg :|updated_at|) + (|uri| :accessor scryfall-uri :initarg :|uri|))) + +(defun get-scryfall-data () + (let ((json (getf + (jonathan:parse + (flex:octets-to-string + (drakma:http-request (scryfall-api-uri "bulk-data")))) + :|data|))) + (mapcar (lambda (row) + (apply #'make-instance 'scryfall-api-data row)) + json))) + +(defun load-scryfall-data () + (setf *scryfall-api-data* + (get-scryfall-data))) + +(defun size-in-gb (size) + (float (/ size (* 1024 1024 1024)))) + +(defun get-bulk-data-uris (path) + (with-open-file (out path + :direction :output + :if-exists :supersede + :if-does-not-exist :create) + (format out "~{~A~%~}" + (mapcar #'scryfall-download-uri *scryfall-api-data*)))) diff --git a/src/models/packages.lisp b/src/models/packages.lisp new file mode 100644 index 0000000..4ee7747 --- /dev/null +++ b/src/models/packages.lisp @@ -0,0 +1,502 @@ +#| + +src/models/packages.lisp + +Models Main Package List + +|# + +(in-package #:cl-user) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defpackage #:cl-deck-builder2.models.generics + (:use #:cl) + (:export #:deck-id-of + #:name-of + #:ygo-archetype-of + #:ygo-atk-of + #:ygo-attribute-of + #:ygo-def-of + #:ygo-description-of + #:ygo-frame-type-of + #:ygo-level-of + #:ygo-linkmarkers-of + #:ygo-linkval-of + #:ygo-passcode-of + #:ygo-price-of + #:ygo-race-of + #:ygo-scale-of + #:ygo-type-of)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defpackage #:cl-deck-builder2.models.registered-table + (:use #:cl + #:cl-deck-builder2.db + #:cl-deck-builder2.models.generics) + (:import-from #:cl-deck-builder2.toolkit + #:relative-pathname) + (:export #:registry + #:registered-classes + #:registered-table-class + #:ensure-tables-exist + #:migration-expressions + #:migrate-table + #:export-registered-classes + #:export-registered-classe-to-file)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defpackage #:cl-deck-builder2.models.attachment + (:use #:cl + #:cl-deck-builder2.models.generics) + (:import-from #:cl-deck-builder2.models.registered-table + #:registered-table-class) + (:import-from #:cl-deck-builder2.db + #:create-dao) + (:export #:attachment + #:create-attachment + #:attachment-valid-p)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defpackage #:cl-deck-builder2.models.category + (:use #:cl + #:cl-deck-builder2.models.generics) + (:import-from #:cl-deck-builder2.db + #:create-dao + #:select-dao) + (:import-from #:cl-deck-builder2.models.registered-table + #:registered-table-class) + (:export #:category + #:category-name-of + #:category-left-of + #:category-right-of + + #:category-rename + + #:category-insert-right-of + #:category-insert-new-child + #:category-insert-fake-data + #:category-full-tree + #:category-leaf-nodes + #:category-full-tree-format + #:category-delete-tree + #:category-delete-and-reparent + #:category-tree-depth + #:category-node-depth + #:category-subtree-depth + #:category-subtree-max-depth + + #:by-category)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defpackage #:cl-deck-builder2.models.ygoprodeck.fields + (:use #:cl + #:cl-deck-builder2.db + #:cl-deck-builder2.models.generics) + (:import-from #:cl-deck-builder2.models.registered-table + #:registered-table-class) + (:export #:variant + #:name-of + #:define-variant-list + #:variant-condition + #:variant-language + #:ygo-banlist-name + #:ygo-format-name + #:ygo-linkmarker-name + #:ygo-set-rarity-code)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defpackage #:cl-deck-builder2.models.ygoprodeck + (:use #:cl + #:cl-deck-builder2.db + #:cl-deck-builder2.models.generics + #:cl-deck-builder2.models.registered-table) + (:export :ygo-info + #:ygo-description-of + #:ygo-frame-type-of + #:ygo-type-of + #:ygo-passcode-of + #:name-of + #:ygo-race-of + #:ygo-archetype-of + #:ygo-attribute-of + #:ygo-linkmarkers-of + #:ygo-atk-of + #:ygo-def-of + #:ygo-level-of + #:ygo-linkval-of + #:ygo-scale-of)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defpackage #:cl-deck-builder2.models.ygoprodeck.classes + (:use #:cl + #:cl-deck-builder2.models.generics + #:cl-deck-builder2.models.ygoprodeck.fields) + (:import-from #:cl-deck-builder2.models.registered-table + #:registered-table-class) + (:import-from #:cl-deck-builder2.models.ygoprodeck.fields + #:variant-condition + #:ygo-banlist-name + #:ygo-format-name + #:ygo-linkmarker-name + #:ygo-set-rarity-code) + (:import-from :cl-deck-builder2.toolkit + :currency-deflate + :currency-inflate) + (:export #:ygo-card-name + #:ygo-card-type + #:ygo-card-frame-type + #:ygo-card-race + #:ygo-card-archetype + #:ygo-card-attribute + #:ygo-card + #:ygo-card-misc-info + #:ygo-set-name + #:ygo-set-code + #:ygo-set-rarity-code + #:ygo-set-rarity + #:ygo-set-edition + #:ygo-set + #:ygo-set-item + #:ygo-linkmarker + #:ygo-format + ;; #:ygo-banlist-name + ;; #:ygo-format-name + ;; #:ygo-linkmarker-name + #:ygo-banlist + #:ygo-alternative-artwork + #:ygo-price + + ;; Accessor Methods + #:ygo-alternate-id-of + #:ygo-archetype-of + #:ygo-atk-of + #:ygo-attribute-of + #:ygo-ban-goat + #:ygo-ban-ocg + #:ygo-ban-tcg + #:ygo-beta-id-of + #:ygo-beta-name-of + #:ygo-card-type-of + #:ygo-code-of + #:ygo-common-charity-format + #:ygo-def-of + #:ygo-desc-of + #:ygo-downvotes-of + #:ygo-duel-links-format + #:ygo-edison-format + #:ygo-edition-of + #:ygo-frame-type-of + #:ygo-goat-format + #:ygo-has-effect + #:ygo-is-staple + #:ygo-konami-id-of + #:ygo-level-of + #:ygo-linkmarker-bottom + #:ygo-linkmarker-bottom-left + #:ygo-linkmarker-bottom-right + #:ygo-linkmarker-left + #:ygo-linkmarker-right + #:ygo-linkmarker-top + #:ygo-linkmarker-top-left + #:ygo-linkmarker-top-right + #:ygo-name-of + #:ygo-ocg-date-of + #:ygo-ocg-format + #:ygo-ocg-goat-format + #:ygo-passcode-of + #:ygo-question-atk + #:ygo-question-def + #:ygo-race-of + #:ygo-rarity-of + #:ygo-scale-of + #:ygo-set-code-of + #:ygo-set-rarity-code-of + #:ygo-speed-duel-format + #:ygo-tcg-date-of + #:ygo-tcg-format + #:ygo-treated-as + #:ygo-upvotes-of + #:ygo-url-of + #:ygo-views-of + #:ygo-viewsweek-of + #:ygo-amazon-price-of + #:ygo-cardmarket-price-of + #:ygo-coolstuffinc-price-of + #:ygo-ebay-price-of + #:ygo-tcgplayer-price-of + #:ygo-price-of + + #:qty-of + #:item-of + #:variant-of + #:sell-price-of + #:opt-qty-of + #:buy-price-of) + (:documentation "New YGOProDeck database schema - classes.")) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defpackage #:cl-deck-builder2.models.ygoprodeck.methods + (:use #:cl + #:cl-deck-builder2.db + #:cl-deck-builder2.models.generics + #:cl-deck-builder2.models.ygoprodeck.classes + #:cl-deck-builder2.models.ygoprodeck.fields) + (:import-from #:cl-deck-builder2.models.registered-table + #:registered-classes + #:registry) + (:export #:print-object + #:split-code + #:ygo-card + #:ygo-card-by-name + #:ygo-card-by-passcode + #:ygo-card-names-by-deck-id + #:ygo-card-names-from-list + #:ygo-card-sets + #:ygo-set + #:ygo-set-by-id + #:ygo-set-by-code + #:ygo-set-by-name + #:ygo-set-by-passcode + #:ygo-select-set-item) + (:documentation "New YGOProDeck database schema - methods.")) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defpackage #:cl-deck-builder2.models.ygoprodeck.cardinfo + (:use #:cl) + (:local-nicknames (#:v #:org.shirakumo.verbose)) + (:export #:cardinfo + #:cardinfo-input + #:cardinfo-output + #:cardinfo-input-exists-p + #:cardinfo-output-exists-p + #:cardinfo-json + #:cardinfo-list + #:cardinfo-download + #:cardinfo-cleanup + #:cardinfo-convert + #:cardinfo-update-and-cleanup)) + +(defpackage #:cl-deck-builder2.models.ygoprodeck.json + (:use #:cl + #:cl-deck-builder2.db + #:cl-deck-builder2.toolkit + #:cl-deck-builder2.models.generics + #:cl-deck-builder2.models.ygoprodeck.fields + #:cl-deck-builder2.models.ygoprodeck.cardinfo + #:cl-deck-builder2.models.ygoprodeck.classes) + (:local-nicknames (#:v #:org.shirakumo.verbose)) + (:export #:cardinfo-import)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defpackage #:cl-deck-builder2.models.user + (:use #:cl + #:cl-deck-builder2.models.generics + #:cl-deck-builder2.db) + (:import-from #:cl-deck-builder2.models.registered-table + #:registered-table-class) + (:import-from :mito-auth + :has-secure-password) + (:export #:user + #:name-of + #:user-email-of + #:user-roles-of + + #:role + + #:user-role + #:user-role-user + #:user-role-role + + #:user-admin-p + #:user-verified-p + + #:create-user + #:find-user + #:create-role + #:add-role)) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defpackage #:cl-deck-builder2.models.feedback + (:use #:cl) + (:import-from #:cl-deck-builder2.db + #:create-dao) + (:import-from #:cl-deck-builder2.models.registered-table + #:registered-table-class) + (:import-from #:cl-deck-builder2.models.user + #:user) + (:export #:feedback + #:feedback-body-of + #:feedback-user-of + #:create-feedback)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; This package doesn't touch the DB ... yet +(defpackage #:cl-deck-builder2.models.qr-code + (:use :cl + :cl-deck-builder2.db) + (:local-nicknames (#:v #:org.shirakumo.verbose)) + (:import-from :cl-deck-builder2.toolkit + :query-param) + (:export :qr-settings + :qr-string + :qr-min-version + :qr-ec-level + :qr-encoding-mode + :qr-mask-number + :qr-to-plist + :qr-generate)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defpackage #:cl-deck-builder2.models.ydk + (:use #:cl + #:cl-deck-builder2.db + #:cl-deck-builder2.models.generics + #:cl-deck-builder2.models.registered-table + #:cl-deck-builder2.toolkit) + (:import-from #:cl-deck-builder2.models.category + #:category) + (:import-from #:cl-deck-builder2.models.ygoprodeck + #:ygo-info) + (:export #:ydk + #:deck-item + #:ydk-deck + + #:deck-id-of + #:deck-kind-of + #:deck-passcode-of + #:ydk-created-by + #:ydk-name-of + #:ydk-id-of + #:ydk-deck-delete-from + #:ydk-deck-item-delete-from + #:ydk-deck-delete-by-id + #:ydk-deck-delete-by-name + #:ydk-deck-by-id + #:ydk-deck-by-name + #:ydk-deck-info-by-id + #:ydk-rename-deck + #:ydk-add + #:ydk-clear + #:ydk-sync + + #:ydk-main-deck-of + #:ydk-extra-deck-of + #:ydk-side-deck-of + #:ydk-category-of + + #:ydk-all + #:ydk-concatenate + #:ydk-unique + #:ydk-query + #:ydk-sorted + + #:ydk-delete + #:ydk-delete-index + + #:ydk-table-ensure-exists + #:ydk-table-drop + #:ydk-table-delete + #:ydk-table-select + #:ydk-table-select-count + + #:ydk-to-kde) + (:documentation "This model is just a thin wrapper around YDK format. + +The YDK Format is like this: + + created by... + #main + + #extra + + !side + + +TODO CL-YDK + YDK-STORAGE-MIXIN?")) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Psuedo class for working with the SQLite database. +;; This will probably go away once we switch over to MariaDB. +(defpackage #:cl-deck-builder2.models.sqlite-schema + (:use :cl + :cl-deck-builder2.db) + (:export #:sqlite-schema + #:kind-of + #:sql-of + #:rootpage-of + #:table-names)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defpackage #:cl-deck-builder2.models.constructed-decks + (:use #:cl + #:cl-deck-builder2.db + #:cl-deck-builder2.toolkit + #:cl-deck-builder2.models.generics + #:cl-deck-builder2.models.registered-table + #:cl-deck-builder2.models.ygoprodeck.classes + #:cl-deck-builder2.models.ygoprodeck.methods) + (:import-from #:cl-deck-builder2.models.category + #:category) + (:import-from #:cl-deck-builder2.models.ydk + #:deck-item + #:deck-id-of + #:deck-passcode-of + #:ydk-category-of + #:ydk-created-by + #:ydk-name-of + #:ydk-deck) + (:local-nicknames (#:v #:org.shirakumo.verbose)) + (:export #:constructed-deck + #:constructed-deck-item + #:constructed-deck-intermediate + + #:cdi-deck-item + #:cdi-deck-set + #:cdi-deck-set-item + #:cdi-deck-condition + #:cdi-deck-card + + #:constructed-deck-as-cdi-list + + ;; :deck-category-of + ;; :deck-created-by + ;; :deck-id-of + :deck-name-of + ;; :deck-sell-price + :deck-sell-price-of + :deck-sold + ;; :ydk-deck-of + ;; :ygo-card-of + + ;; #:sold-deck + + #:ydk-deck-pull-from-inventory + #:find-any-invalid-qtys + #:deck-to-pull-set-items-qty-as-alist + #:deck-to-pull-desired-qty-as-alist + #:subtract-desired-from-set-item-qty-as-alist + #:valid-pull-p + + #:cdi-pull-from-inventory)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(uiop:define-package #:cl-deck-builder2.models + (:use #:cl) + (:use-reexport #:cl-deck-builder2.models.attachment + #:cl-deck-builder2.models.category + #:cl-deck-builder2.models.constructed-decks + #:cl-deck-builder2.models.feedback + #:cl-deck-builder2.models.qr-code + #:cl-deck-builder2.models.registered-table + #:cl-deck-builder2.models.sqlite-schema + #:cl-deck-builder2.models.user + #:cl-deck-builder2.models.ydk + #:cl-deck-builder2.models.ygoprodeck + #:cl-deck-builder2.models.ygoprodeck.fields + #:cl-deck-builder2.models.ygoprodeck.cardinfo + #:cl-deck-builder2.models.ygoprodeck.json + ;; TODO replace ygoprodeck with ygoprodeck2 + #:cl-deck-builder2.models.ygoprodeck.classes + #:cl-deck-builder2.models.ygoprodeck.methods)) diff --git a/src/models/qr-code.lisp b/src/models/qr-code.lisp new file mode 100644 index 0000000..7795349 --- /dev/null +++ b/src/models/qr-code.lisp @@ -0,0 +1,100 @@ +#| + +QR Code Model + +Constantly fixing their user input was getting janky. DEFCLASS to the rescue! + +TODO This is still pretty clumbsy. I'm generating HTML in here?? + +Originally I was using INITIALIZE-INSTANCE but that would clobber the +object with the DEFAULT-INITARGS. Now we're overriding +REINITIALIZE-INSTANCE, which seems to work exactly as you'd expect. + +|# + +(in-package #:cl-deck-builder2.models.qr-code) + +;; XXX +(defparameter *qr-public-file* #P"~/public/qr.png") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defclass qr-settings () + ((string :accessor qr-string + :initarg :string) + (min-version :accessor qr-min-version + :initarg :min-version) + (ec-level :accessor qr-ec-level + :initarg :ec-level) + (encoding-mode :accessor qr-encoding-mode + :initarg :encoding-mode) + (mask-number :accessor qr-mask-number + :initarg :mask-number) + (output-path :accessor qr-output-path + :initarg :output)) + (:default-initargs + :ec-level :L + :encoding-mode :8-BIT-BYTE + :mask-number -1 + :min-version 1 + :output #P"/tmp/qr.png" + :string "Hello World")) + +(defmethod reinitialize-instance :after ((qr-settings qr-settings) &rest initargs &key content &allow-other-keys) + (declare (ignore initargs)) + (when content + (reinitialize-with-content qr-settings content))) + +;; Overwrite existing slots even if they're SLOT-BOUNDP with SLOT-VALUE +(defmethod reinitialize-with-content ((qr-settings qr-settings) content) + ;; TODO ALIST-PARAMS-to-class? The idea is there... + (alexandria:if-let ((string (query-param "string" content))) + (setf (qr-string qr-settings) string)) + + (alexandria:if-let ((min-version (query-param "min-version" content))) + (setf (qr-min-version qr-settings) (parse-integer min-version))) + + (alexandria:if-let ((ec-level (query-param "ec-level" content))) + (setf (qr-ec-level qr-settings) (alexandria:make-keyword ec-level))) + + (alexandria:if-let ((encoding-mode (query-param "encoding-mode" content))) + (setf (qr-encoding-mode qr-settings) (alexandria:make-keyword encoding-mode))) + + (alexandria:if-let ((mask-number (query-param "mask-number" content))) + (setf (qr-mask-number qr-settings) (parse-integer mask-number))) + qr-settings) + +;; TODO %from-plist +;; TODO %from-alist? +(defmethod qr-to-plist ((qr-settings qr-settings) &optional html) + (let ((params + (list :ec-level (qr-ec-level qr-settings) + :encoding-mode (qr-encoding-mode qr-settings) + :mask-number (qr-mask-number qr-settings) + :min-version (qr-min-version qr-settings)))) + (when html + (setf (getf params :string) (qr-string qr-settings) + (getf params :ec-level) (princ-to-string (getf params :ec-level)) + (getf params :encoding-mode) (princ-to-string (getf params :encoding-mode)))) + params)) + +(defmethod qr-generate ((qr qr-settings)) + (v:info :qr "QR-STRING: ~a" (qr-string qr)) + + (v:info :qr "UIOP:DELETE-FILE-IF-EXISTS: ~a" + (ignore-errors + (mapcar #'uiop:delete-file-if-exists '(#P"/tmp/qr.png" #P"~/public/qr.png")))) + + (v:info :qr "LISPQR:ENCODE->IMAGE: ~a" + (ignore-errors + (apply #'lispqr:encode->image (qr-string qr) (qr-output-path qr) + (qr-to-plist qr)))) + + (v:info :qr "UIOP:COPY-FILE: ~a" + (ignore-errors + (uiop:copy-file (qr-output-path qr) *qr-public-file*))) + + (if (probe-file *qr-public-file*) + (qr-format-html (get-universal-time)))) + +(defun qr-format-html (when) + (format nil "\"QR" when)) diff --git a/src/models/registered-table-mixin.lisp b/src/models/registered-table-mixin.lisp new file mode 100644 index 0000000..162eacf --- /dev/null +++ b/src/models/registered-table-mixin.lisp @@ -0,0 +1,99 @@ +#| + +src/models/registered-table-mixin.lisp + +Model Object Class. Instead of writing new code every time for every +new Model (Model, View, Component), encapsulate the behavior here. + +Now using mixins! + +|# + +(in-package #:cl-deck-builder2.models.registered-table) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Thanks mariari! https://lispcookbook.github.io/cl-cookbook/clos.html#metaclasses +(defclass model-registry () + ((registry :allocation :class + :accessor model-registry + :initform (make-hash-table)))) + +(defmethod registered-classes ((registry model-registry) &optional package) + (if package + (gethash (find-package package) (model-registry registry)) + ;; If no package was provided return a LIST of all packages tracked by the MODEL-REGISTRY. + (apply #'concatenate 'list + (alexandria:hash-table-values (model-registry registry))))) + +(defparameter *registry* (make-instance 'model-registry) + "Global model registry instance.") + +(defun registry (&optional (registry *registry*)) + "Get the MODEL-REGISTRY associated with REGISTRY. Default is *REGISTRY*." + registry) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Inherit from MITO:DAO-TABLE-CLASS because MITO:DAO-TABLE-MIXIN +;; doesn't have the additional PRIMARY-KEY or TIMESTAMP mechanisms or +;; anything. +(defclass registered-table-class (mito:dao-table-class) ()) + +(defmethod closer-mop:validate-superclass ((class registered-table-class) + (superclass mito:dao-table-class)) + t) + +(defmethod initialize-instance :after ((class registered-table-class) &rest initargs &key &allow-other-keys) + (declare (ignore initargs)) + (pushnew (class-name class) + (gethash (symbol-package (class-name class)) + (model-registry (registry))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Tables +(defmethod create-tables ((registry model-registry) &optional package) + "Create tables for CLASS-LIST by wrapping DBD:CREATE-TABLE." + (apply #'create-table + (registered-classes registry package))) + +(defmethod drop-tables ((registry model-registry) &optional package) + "Drop tables for CLASS-LIST by wrapping DB:DROP-TABLE." + (apply #'drop-table + (registered-classes registry package))) + +(defmethod recreate-tables ((registry model-registry) &optional package) + (drop-tables registry package) + (create-tables registry package)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defmethod migration-expressions ((registry model-registry) &optional package) + (with-connection (db) + (with-transaction + (mapcar #'mito:migration-expressions + (registered-classes registry package))))) + +(defmethod migrate-table ((registry model-registry) &optional package) + (with-connection (db) + (with-transaction + (mapcar #'mito:migrate-table + (registered-classes registry package))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun ensure-tables-exist (&optional package) + (create-tables (registry) package)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defmethod export-registered-classes ((registry model-registry) &key package (stream *standard-output*)) + "Export REGISTERED-CLASSES for REGISTRY to STREAM, which by default, is *STANDARD-OUTPUT*." + (with-connection (db) + (with-transaction + (format stream "~{~a~^;~%~};" + (mapcar (lambda (class) (sxql:yield (car (mito:table-definition class)))) + (registered-classes registry package)))))) + +(defun export-registered-classes-to-file (&key (output (relative-pathname "db/schema.sql")) package) + (with-open-file (stream output + :direction :output + :if-exists :supersede + :if-does-not-exist :create) + (export-registered-classes (registry) :package package :stream stream) + (probe-file output))) diff --git a/src/models/search.lisp b/src/models/search.lisp new file mode 100644 index 0000000..aeeff64 --- /dev/null +++ b/src/models/search.lisp @@ -0,0 +1,76 @@ +#| + +Search Session Object + +TODO + +The idea was I basically just wanted to copy the code from web/search.lisp + +Maybe each database object could have their own search sessions? Like +the web deck builder could subclass SEARCH-SESSION with the correct +DEFAULT-INITARGS and relevant CLASS info + +|# + +(defpackage #:cl-deck-builder2.models.search + (:use #:cl)) + +(in-package #:cl-deck-builder2.models.search) + +;; TODO Where does this go? +(defparameter +search-param-whitelist+ + '("amazon-asin" "barcode" "brand" "buy-price" "category" "code" "created-by" + "deck-id" "desc" "description" "domestic-only" "edition" "email" "id" "kind" + "linkmarkers" "linkval" "manufacturer-sku" "max-qty" "msrp" "parent" "price" + "product-name" "rarity" "rarity-code" "sell-price" "tax-exempt" "total-qty" + "url" "weight" "wishlists" "atk" "def" "level" "scale" "passcode" "type" + "frame-type" "race" "attribute" "archetype" "name" "opt-qty" "qty" "condition") + "A whitelist of keywords allowed by user input on the database side.") + +(defclass search-session-base () ()) + +;; TODO SLOTs or MAKE-HASH-TABLE? Or an ALIST? +(defclass search-session (search-session-base) + ((direction) + (limit) + (offset) + (sort-by) + (variant)) + (:default-initargs + :direction "asc" + :limit 10 + :offset 0 + :sort-by "id")) + +(defmethod initialize-instance :after ((obj search-session) &rest initargs &key &allow-other-keys) + (declare (ignore initargs))) + +;; FILTER-ALIST +(defgeneric search-query-filter (obj)) + +;; MAKE-SEARCH-QUERY +(defgeneric search-query-exec (obj)) + +;; MAKE-COUNT-QUERY +(defgeneric search-query-count (obj)) + +;; MAKE-ORDER-BY +(defgeneric search-query-order-by (obj direction sort-by)) + +;; MAKE-WHERE-CLAUSE +(defgeneric search-where-and (obj direction sort-by)) + +(defun make-sql-clause (op field value) + (let ((op (typecase op + (symbol op) + (string (alexandria:make-keyword (string-upcase + (substitute #\_ #\- op)))))) + (field (typecase field + (symbol field) + (string (alexandria:make-keyword (string-upcase + (substitute #\_ #\- field))))))) + (list op field (if (eq op :like) + (format nil "%~a%" value) + value)))) + +;; (defun make-kind (kind alist)) diff --git a/src/models/sqlite-schema.lisp b/src/models/sqlite-schema.lisp new file mode 100644 index 0000000..149df70 --- /dev/null +++ b/src/models/sqlite-schema.lisp @@ -0,0 +1,40 @@ +#| + +SQLite has a built-in schema table where you can do a level of +introspection on the database. I've used this functionality a few +times now so this encapsulates that behavior. + +|# + +(in-package #:cl-deck-builder2.models.sqlite-schema) + +;; https://www.sqlite.org/schematab.html +(defclass sqlite-schema () + ((type :col-type :text) + (name :col-type :text) + (tbl-name :col-type :text) + (rootpage :col-type :integer) + (sql :col-type :text)) + (:auto-pk nil) + (:record-timestamps nil) + (:metaclass mito:dao-table-mixin)) + +(defgeneric kind-of (obj) + (:method ((sqlite-schema sqlite-schema)) + (slot-value sqlite-schema 'type))) + +(defmethod name-of ((sqlite-schema sqlite-schema)) + (slot-value sqlite-schema 'name)) + +(defgeneric rootpage-of (obj) + (:method ((sqlite-schema sqlite-schema)) + (slot-value sqlite-schema 'rootpage))) + +(defgeneric sql-of (obj) + (:method ((sqlite-schema sqlite-schema)) + (slot-value sqlite-schema 'sql))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun table-names () + (mapcar #'name-of + (select-dao 'sqlite-schema))) diff --git a/src/models/user.lisp b/src/models/user.lisp new file mode 100644 index 0000000..8d96668 --- /dev/null +++ b/src/models/user.lisp @@ -0,0 +1,127 @@ +#| + +src/models/user.lisp + +# User Interaction Backend + +## Create a superuser + +(create-superuser name email password) + +## Create a normal user + + (bookshops.models::create-user "Joe Blogg" "JoeBlogg@example.com" "i<3books") + +## Give him rights + + (add-role user :admin) + +Bootstrap roles: see database.lisp bootstrap-base-roles. + +# More Information + +- + +|# + +(in-package #:cl-deck-builder2.models.user) + +(defclass user (has-secure-password) + ((name :accessor name-of + :col-type :text + :initarg :name) + (email :accessor user-email-of + :col-type :text + :initarg :email)) + (:unique-keys email) + ;; (:primary-key email) + (:metaclass registered-table-class) + (:documentation "The USER class encapsulates information about the users of The Deck Builder: name, email, password, password salt, user roles.")) + +(defclass role () + ((name ;;:col-type :text + :col-type (:varchar 64) + :initarg :role + :inflate (alexandria:compose #'alexandria:make-keyword #'string-upcase) + :deflate #'string-downcase + :accessor name-of)) + (:documentation "The ROLE class encapsulates information about the roles of actions a user may perform, e.g. :ADMIN, :USER, :BANNED.") + (:metaclass registered-table-class) + (:primary-key name) + (:auto-pk nil) + (:record-timestamps nil)) + +(defclass user-role () + ((user :col-type user + :initarg :user + :accessor user-role-user) + (role :col-type role + :initarg :role + :accessor user-role-role)) + (:metaclass registered-table-class) + (:primary-key user role) + (:auto-pk nil) + (:record-timestamps nil)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun create-user (name email password) + "Create a USER object with NAME, EMAIL, and PASSWORD fields. Will automatically be synced to db via CREATE-DAO. Password hashing provided by MITO-AUTH." + (create-dao 'user :name name + :email email + :password password)) + +(defun find-user (email) + "Find a user by EMAIL." + (find-dao 'user :email email)) + +;; (defun create-superuser (name email password) +;; "Create a USER with the ADMIN role." +;; (let ((user (create-user name email password))) +;; (add-role user :admin))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; TODO Role Viewer / Editor +(defun create-role (name) + "Create a ROLE called NAME. If the ROLE exists, return that, instead." + (with-connection (db) + (with-transaction + (or (mito:find-dao 'role :name name) + (mito:create-dao 'role :name name))))) + +(defun %find-role-from-keyword (role-name) + "Return a role object from a keyword and throw an error if an associated role cannot be found" + (let ((role (find-dao 'role :name role-name))) + (assert role (role) "There is no role named ~a" role-name) + role)) + +(defgeneric add-role (user role) + (:documentation "Add the given role to this user. ROLE is either a role object or a symbol. An example role is ':admin`.") + (:method ((user user) (role role)) + (or (find-dao 'user-role :user user :role role) + (create-dao 'user-role :user user :role role))) + (:method ((user user) (role-name symbol)) + (let ((role (%find-role-from-keyword role-name))) + (add-role user role)))) + +;; Retrieving roles from "user-role" table +(defmethod user-roles-of ((user user)) + (with-connection (db) + (with-transaction + (mapcar #'user-role-role + (mito:retrieve-dao 'user-role :user user))))) + +(defgeneric user-has-role (user role) + (:documentation "Given a USER and a ROLE, return T if ROLE is a MEMBER of USER-ROLES for USER, NIL otherwise.") + (:method ((user user) (role role)) + (member (name-of role) (user-roles-of user) :key #'name-of)) + (:method ((user user) (role-name symbol)) + (let ((role (%find-role-from-keyword role-name))) + (user-has-role user role)))) + +(defmethod user-admin-p ((user user)) + "Is USER an admin? Return T if so. NIL otherwise." + (user-has-role user :admin)) + +(defmethod user-verified-p ((user user)) + "Is USER in the VERIFIED role? Return T if so. NIL otherwise." + (user-has-role user :verified)) diff --git a/src/models/ydk.lisp b/src/models/ydk.lisp new file mode 100644 index 0000000..9248362 --- /dev/null +++ b/src/models/ydk.lisp @@ -0,0 +1,591 @@ +#| + +src/models/ydk/classes.lisp + +# YDK + +Yu-Gi-Oh! Pro Deck YDK Importer And Models + +TODO This can be a stand-alone package CL-YDK + the CL-YDK+MITO mixin probably. + +|# + +(in-package #:cl-deck-builder2.models.ydk) + +(defclass deck-item () + (;; 0 => Main Deck + ;; 1 => Extra Deck + ;; 2 => Side Deck + (deck-id :accessor deck-id-of :col-type :integer) + (kind :accessor deck-kind-of :col-type :integer) + (passcode :accessor deck-passcode-of :col-type :integer)) + (:metaclass registered-table-class) + (:documentation "DECK-LIST is a representation of a single card in a YDK deck in +SQL. Since SQL doesn't have a LIST type, we use a bunch of +these (60-90 rows generally make up a deck). The ID field supplied by +MITO:DAO-TABLE-CLASS is the \"Deck ID\" in the builder system.")) + +(defclass ydk-deck () + (;; (id :accessor ydk-id-of :col-type :integer :primary-key t) + (category :accessor ydk-category-of :col-type (or category :null)) + (created-by :accessor ydk-created-by :col-type :text :initarg :created-by) + (name :accessor ydk-name-of :col-type :text :initarg :name)) + (:unique-keys name) + (:metaclass registered-table-class) + (:documentation "A YDK-DECK is an in-database representation of a deck. It's really actually just an index to keep track of metadata, with the ID field used to key into DECK-ITEM. + +SQL doesn't allow us to store anything as a list. We take advantage +of Mito's INSERT-DAO, SELECT-DAO, etc. being methods which we can +define :BEFORE :AFTER and :AROUND methods for. The YDK-DECK class is +an intermediate representation of a deck. Bookeeping for the \"Deck +ID\", CREATED-BY, and NAME.")) + +(defclass ydk () + ((;; I think this is supposed to be the MITO:OBJECT-ID to keep tabs + ;; on the SYNC status... Looks like I never wrote it down, but I'm + ;; pretty sure that was my intention with this SLOT. It's been a + ;; pain point previously (PPP). + deck-id :accessor ydk-id-of :initarg :deck-id) + (created-by :accessor ydk-created-by :initarg :created-by :initform nil) + (name :accessor ydk-name-of :initarg :name :initform nil) + (main-deck :accessor ydk-main-deck-of :initarg :main-deck :initform '()) + (extra-deck :accessor ydk-extra-deck-of :initarg :extra-deck :initform '()) + (side-deck :accessor ydk-side-deck-of :initarg :side-deck :initform '())) + (:documentation "Intermediate YDK representation. + +This is what's stored in-memory during program operation, and then gets synced to the database. + +Notice this class does not draw from MITO:DAO-TABLE-CLASS.")) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Helper functions +;; +;; TODO maybe I don't have to duplicate this data? +;; +;; I tried using defparameter but defmacro complained when I tried to +;; load it. +;; +;; Aha, The Original Variant. +;; This code needs to be incorporated into the VARIANT code. + +(defmacro %sql-to-keyword (type) + `(ecase ,type + (0 :main-deck) + (1 :extra-deck) + (2 :side-deck))) + +(defmacro %keyword-to-sql (type) + `(ecase ,type + (:main-deck 0) + (:extra-deck 1) + (:side-deck 2))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; TODO I think I'm going to erase all these DEFUNs since they're kinda +;; outdated now with the changes I made in db.lisp +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Delete +(defun ydk-deck-delete-from (&rest clauses) + (apply #'delete-from 'ydk-deck clauses)) + +(defun ydk-deck-item-delete-from (&rest clauses) + (apply #'delete-from 'deck-item clauses)) + +(defun ydk-deck-delete-by-id (id) + "Remove all matching ID from YDK-DECK and DECK-ITEM, effectively erasing the deck from the database." + (ydk-deck-delete-from + (sxql:where (:= :id id))) + (ydk-deck-item-delete-from + (sxql:where (:= :deck_id id)))) + +(defun ydk-deck-delete-by-name (name) + (let ((found (ydk-deck-by-name name))) + (when found + ;; Delete from both the DECK-ITEM and the YDK-DECK reference + ;; table. The :deck_item table doesn't have a :NAME field, it + ;; only has the :DECK_ID field. So we need to use + ;; SELECT-DECK-BY-NAME anyway. + (ydk-deck-delete-by-id (mito:object-id found))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Select +(defmacro ydk-table-select (&body body) + `(select-dao 'ydk-deck ,@body)) + +(defun ydk-table-select-count (&optional fields-and-values) + (apply #'count-dao 'ydk-deck fields-and-values)) + +(defun ydk-deck-by-id (id &rest args) + (apply #'find-dao 'ydk-deck :id id args)) + +(defun ydk-deck-by-name (name &rest args) + (apply #'find-dao 'ydk-deck :name name args)) + +;; Very cool to have figured this out. To get info on a deck, select +;; the deck_item where the deck_id is the deck you want. Then INNER +;; JOIN on :card_info. It just works. One db trip. Aweseome! +;; +;; TODO how can we do this with SELECT-DAO? +;; +;; For now since this is only getting used in one place, RENDER-YDK, +;; which is albeit, a pretty core component, ... I'll use +;; datafly. Until I figure out how to relate these columns. +;; +;; I think this is a duplicate of YDK-QUERY... Okay it occured to +;; me. I used to use YDK-QUERY before I figured this one out and I +;; think I know what's going on. +;; +;; So YDK-DECK-INFO-BY-ID uses SQL to do an INNER JOIN to get the data +;; from the deck. YDK-QUERY works on decks that aren't in the database +;; and only returns partial information. I have to use that info to +;; re-construct the data. The original purpose of YDK-QUERY was to use +;; it like a look-up table, based on that sorting dev.to article. +;; +;; But then I realized, it's a lot more efficient to do it at the +;; database level. so that's where YDK-DECK-INFO-BY-ID was born +;; from. It works on existing decks in the database. +(defgeneric ydk-query (id)) + +(defmethod ydk-query ((id integer)) + "Query the database for information from YGO_INFO about the DECK ID." + (with-connection (db) + (with-transaction + (mito:retrieve-by-sql + (sxql:select :* + (sxql:from :ygo_info) + (sxql:inner-join :deck_item + :on (:= :deck_item.passcode :ygo_info.passcode)) + (sxql:order-by :asc :deck_item.id) + (sxql:where (:= :deck_id id))))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defmethod ydk-query ((ydk-deck ydk-deck)) + "Query the YDK-DECK by its MITO:OBJECT-ID" + (ydk-query (mito:object-id ydk-deck))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defmethod ydk-query ((ydk ydk)) + "Select entries from :YGOPRODECK-DATA corresponding to the unique list +of cards in DECK. This can be used as a look up table to construct a +deck description. + +It looks like I updated YDK-QUERY to work with the new YDK-ALL output. Neat!" + (let* ((all (ydk-all ydk)) + (cards (ydk-concatenate ydk)) + (info (with-datafly-connection (db) + (with-datafly-transaction (db) + (datafly:retrieve-all + (sxql:select :* + (sxql:from :ygo_info) + (sxql:where (:in :passcode cards)))))))) + (labels ((query-deck (kind) + (loop for passcode in (getf all kind) + collect + (find passcode info + :key (lambda (plist) (getf plist :passcode)))))) + (list + :main-deck (query-deck :main-deck) + :extra-deck (query-deck :extra-deck) + :side-deck (query-deck :side-deck))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Update +(defmethod ydk-rename-deck ((ydk-deck ydk-deck) new-name) + (setf (ydk-name-of ydk-deck) new-name) + (save-dao ydk-deck)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun normalize-content (content) + "Strip UTF-8 BOM, \"\r\n\" sequences, then split on #\Newline into a list." + (etypecase content + ;; It's a LIST - pass it on + (list content) + ;; It's a PATHNAME - UIOP:READ-FILE-STRING and then treat it like + ;; a STRING. + (pathname + (split-sequence:split-sequence + #\Newline + (normalize-newlines + (strip-bom (uiop:read-file-string content))))) + ;; It's a STRING: strip BOM and normalize newlines. + (string + (split-sequence:split-sequence + #\Newline + (normalize-newlines + (strip-bom content)))))) + +(defmethod initialize-with-content ((ydk ydk) content) + (let ((created-by nil) + (main-deck '()) + (extra-deck '()) + (side-deck '()) + (state :in-created-by)) + + (dolist (itm (normalize-content content)) + ;; A bunch of :END2 checks to prevent overrun. + (unless + ;; Detect state change + (cond ((string-equal "#main" itm :end2 (min (length itm) 5)) + (setf state :in-main) + t) + ((string-equal "#extra" itm :end2 (min (length itm) 6)) + (setf state :in-extra) + t) + ((string-equal "!side" itm :end2 (min (length itm) 5)) + (setf state :in-side) + t) + ((equal "" itm) + t)) ; Skip blank lines! + ;; Otherwise, we assume it's a valid PASSCODE. + (ccase state + (:in-created-by (setf created-by itm)) + (:in-main (push (parse-integer itm) main-deck)) + (:in-side (push (parse-integer itm) side-deck)) + (:in-extra (push (parse-integer itm) extra-deck))))) + + (unless (and (slot-boundp ydk 'created-by) + (slot-value ydk 'created-by)) + (setf (ydk-created-by ydk) created-by)) + ;; Currently we don't read the NAME of the YDK from anywhere + ;; *inside* the file contents, it is provided externally, + ;; e.g. file name. + ;; + ;; (unless (and (slot-boundp ydk 'name) + ;; (slot-value ydk 'name)) + ;; (setf (ydk-name-of ydk) name)) + (unless (and (slot-boundp ydk 'main-deck) + (slot-value ydk 'main-deck)) + (setf (ydk-main-deck-of ydk) + (reverse main-deck))) + (unless (and (slot-boundp ydk 'extra-deck) + (slot-value ydk 'extra-deck)) + (setf (ydk-extra-deck-of ydk) + (reverse extra-deck))) + (unless (and (slot-boundp ydk 'side-deck) + (slot-value ydk 'side-deck)) + (setf (ydk-side-deck-of ydk) + (reverse side-deck))))) + +(defmethod initialize-instance :after ((ydk ydk) &rest initargs + &key content &allow-other-keys) + (declare (ignore initargs)) + (when content + (initialize-with-content ydk content))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defmethod ydk-add ((ydk ydk) target-deck passcode) + (let ((deck + (ecase target-deck + (:main (ydk-main-deck-of ydk)) + (:extra (ydk-extra-deck-of ydk)) + (:side (ydk-side-deck-of ydk))))) + (ccase target-deck + (:main + (setf (ydk-main-deck-of ydk) (append deck (list passcode)))) + (:extra + (setf (ydk-extra-deck-of ydk) (append deck (list passcode)))) + (:side + (setf (ydk-side-deck-of ydk) (append deck (list passcode))))))) + +;; TODO Deprecated. Remove this code. YDK-DELETE-INDEX is +;; superior. How are we going to tackle moving cards? +(defmethod ydk-delete ((ydk ydk) kind passcode &optional (count 1)) + "Sloppily remove PASSCODE from YDK KIND deck. KIND is one of :MAIN +:EXTRA or :SIDE. Optionally specify how many to remove with COUNT, +default of 1." + (labels ((remove-fn (array) + (remove-if (lambda (lst) (eq lst passcode)) array :count count))) + (with-slots (main-deck extra-deck side-deck) ydk + (ccase kind + (:main (setf main-deck (remove-fn main-deck))) + (:side (setf side-deck (remove-fn side-deck))) + (:extra (setf extra-deck (remove-fn extra-deck))))))) + +(defmethod ydk-delete-index ((ydk ydk) kind index &optional (count 1)) + "Delete COUNT sequential cards at INDEX from the KIND of deck. KIND +is one of :MAIN :EXTRA or :SIDE." + (with-slots (main-deck extra-deck side-deck) ydk + (ccase kind + (:main (setf main-deck + (append + (subseq main-deck 0 index) + (subseq main-deck (+ count index))))) + (:extra (setf extra-deck + (append + (subseq extra-deck 0 index) + (subseq extra-deck (+ count index))))) + (:side (setf side-deck + (append + (subseq side-deck 0 index) + (subseq side-deck (+ count index)))))))) + +(defmethod ydk-clear ((ydk ydk) &optional target-deck) + "Clear out the YDK." + (case target-deck + (:main (setf (ydk-main-deck-of ydk) nil)) + (:side (setf (ydk-side-deck-of ydk) nil)) + (:extra (setf (ydk-extra-deck-of ydk) nil)) + (t (progn + (ydk-clear ydk :main) + (ydk-clear ydk :extra) + (ydk-clear ydk :side))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defmethod ydk-sync ((ydk ydk)) + "Synchronize this YDK intermediate deck to the database. If there's +already a deck by this name, we \"update\" it by erasing all the +entries matching that DECK ID using YDK-DECK-ITEM-DELETE-FROM. That is, YDK => SQL." + (let ((deck-list '()) + (deck (ydk-deck-by-name (ydk-name-of ydk)))) + + ;; Create the new deck if it does not exist. + (unless deck + (setf deck + (create-dao 'ydk-deck + :name (ydk-name-of ydk) + :created-by (ydk-created-by ydk)))) + + ;; If A deck with this name already exists: clear out the old + ;; list. This no longer erases the YDK-DECK entry, so DECK-ID + ;; should stay consistent now. + (ydk-deck-item-delete-from + (sxql:where + (:= :deck_item.deck_id (mito:object-id deck)))) + + ;; Insert new deck_items into the database. How do we do + ;; that? We create a bunch of objects then MITO:INSERT-DAO them. + (loop for (kind lst) on (ydk-all ydk) by #'cddr do + (dolist (passcode lst) + (push (make-instance 'deck-item + :deck-id (mito:object-id deck) + :kind (%keyword-to-sql kind) + :passcode passcode) + deck-list))) + + (if (do-grouped-insert deck-list) + deck))) + +(defmethod ydk-sync ((ydk-deck ydk-deck)) + "Query the database deck with this YDK-DECK. That is, SQL => YDK. + +TODO Why not WITH-SLOTS?" + (with-connection (db) + (let* ((id (mito:object-id ydk-deck)) + (created-by (ydk-created-by ydk-deck)) + (name (ydk-name-of ydk-deck)) + (deck-list (mito:retrieve-dao 'deck-item :deck-id id)) + (main-deck '()) + (extra-deck '()) + (side-deck '())) + + (dolist (deck-item deck-list) + (let ((passcode (deck-passcode-of deck-item))) + ;; TODO There could be a macro (with-main-side-extra-decks) + ;; or something to suplliment %keyword-to-sql and + ;; %sql-to-keyword. + (ccase (deck-kind-of deck-item) + (0 (push passcode main-deck)) + (1 (push passcode extra-deck)) + (2 (push passcode side-deck))))) + + (make-instance 'ydk + :deck-id id + :name name + :created-by created-by + :main-deck main-deck + :extra-deck extra-deck + :side-deck side-deck)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defmethod ydk-all ((ydk ydk)) + "Get the list of cards from a deck, duplicates included. Generally this order is retained from e.g. file upload or deck creation. + +SEE YDK-SORTED." + (with-slots (main-deck extra-deck side-deck) ydk + (list :main-deck main-deck + :side-deck side-deck + :extra-deck extra-deck))) + +(defmethod ydk-concatenate ((ydk ydk)) + "Get the list of cards from a deck, duplicates included. Generally this order is retained from e.g. file upload or deck creation. + +SEE YDK-SORTED." + (with-slots (main-deck extra-deck side-deck) ydk + (concatenate 'list main-deck extra-deck side-deck))) + +(defmethod ydk-unique ((ydk ydk)) + "Get the unique list of cards from a deck." + (remove-duplicates (ydk-concatenate ydk))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; (with-datafly-connection (db) +;; (with-datafly-transaction +;; (datafly:retrieve-all +;; (select (:frame_type) (from :ygo_info) (group-by :frame_type))))) +;; ((:FRAME-TYPE "effect") (:FRAME-TYPE "effect_pendulum") (:FRAME-TYPE "fusion") +;; (:FRAME-TYPE "fusion_pendulum") (:FRAME-TYPE "link") (:FRAME-TYPE "normal") +;; (:FRAME-TYPE "normal_pendulum") (:FRAME-TYPE "ritual") +;; (:FRAME-TYPE "ritual_pendulum") (:FRAME-TYPE "skill") (:FRAME-TYPE "spell") +;; (:FRAME-TYPE "synchro") (:FRAME-TYPE "synchro_pendulum") (:FRAME-TYPE "token") +;; (:FRAME-TYPE "trap") (:FRAME-TYPE "xyz") (:FRAME-TYPE "xyz_pendulum")) +(defmethod ydk-sorted ((ydk ydk)) + "Sort the YDK according to FRAME-TYPE-PRIO." + (let ((deck-info (copy-list (ydk-query ydk)))) + (labels ((frame-type-prio (plist) + (let ((kind (getf plist :frame-type))) + (cond ((string= kind "normal") 0) + ((string= kind "effect") 1) + ((string= kind "ritual") 2) + ((string= kind "fusion") 3) + ((string= kind "link") 4) + ((string= kind "skill") 5) + ((string= kind "synchro") 6) + ((string= kind "token") 7) + ((string= kind "xyz") 8) + ((string= kind "spell") 9) + ((string= kind "trap") 10) + ((string= kind "effect_pendulum") 11) + ((string= kind "fusion_pendulum") 12) + ((string= kind "normal_pendulum") 13) + ((string= kind "ritual_pendulum") 14) + ((string= kind "synchro_pendulum") 15) + ((string= kind "xyz_pendulum") 16) + (t 17)))) + (sort-and-extract (kind) + (mapcar (lambda (plist) (getf plist :passcode)) + (sort + (sort (copy-list (getf deck-info kind)) + #'string< :key (lambda (plist) (princ-to-string + (getf plist :name)))) + #'< :key #'frame-type-prio)))) + (make-instance 'ydk + :created-by (ydk-created-by ydk) + ;; Sometimes unbound - on unsaved decks. + :deck-id (ignore-errors (ydk-id-of ydk)) + :name (ydk-name-of ydk) + :main-deck (sort-and-extract :main-deck) + :extra-deck (sort-and-extract :extra-deck) + :side-deck (sort-and-extract :side-deck))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Now where on earth does this belong? Probably with the YDK stuff maybe? +;; +;; Maybe this will go back to the toolkit This code might be useful for parsing CSVs or similar. +;; +#+nil +(defun parse-decklist (string) + (let ((split-query + (mapcar #'(lambda (s) + (string-trim '(#\Newline #\Return #\Tab #\Space) s)) + (remove "" + (split-sequence:split-sequence + #\Newline + (normalize-newlines string)) + :test #'equal))) + (new-list '())) + (dolist (line split-query) + (multiple-value-bind (string substrings) + (cl-ppcre:scan-to-strings "^(\\d+)x (.*)" line) + (declare (ignore string)) + (cond (substrings + (let ((card-name (svref substrings 1)) + (as-number (read-from-string (svref substrings 0)))) + ;; 10x => dotimes 10 + (dotimes (_ as-number) + (push card-name new-list)))) + (t (push line new-list))))) + (reverse new-list))) + +(defmethod ydk-filter-frame-type ((ydk ydk) kind) + (let ((monster '("normal" "effect" "ritual" "fusion" "link" "synchro" + "xyz" "effect_pendulum" "fusion_pendulum" "normal_pendulum" + "ritual_pendulum" "synchro_pendulum" "xyz_pendulum")) + (spell '("spell")) + (trap '("trap")) + (deck-info (ydk-query ydk))) + (labels ((filter (plist) + (remove-if (lambda (itm) + (if (member (getf itm :frame-type) + (case kind + (:monster monster) + (:spell spell) + (:trap trap)) + :test #'equal) + nil + t)) + plist))) + (filter (getf deck-info :main-deck))))) + +(defmethod ydk-monster-cards ((ydk ydk)) + (ydk-filter-frame-type ydk :monster)) +(defmethod ydk-spell-cards ((ydk ydk)) + (ydk-filter-frame-type ydk :spell)) +(defmethod ydk-trap-cards ((ydk ydk)) + (ydk-filter-frame-type ydk :trap)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defmethod ydk-length ((ydk ydk)) + (reduce #'+ (list (length (ydk-main-deck-of ydk)) + (length (ydk-extra-deck-of ydk)) + (length (ydk-side-deck-of ydk))))) + +(defmethod ydk-to-kde ((ydk ydk)) + "Transform the YDK according to KDE Team List." + (let ((created-by (ydk-created-by ydk)) + (deck-info (ydk-query ydk)) + (monster-cards (ydk-monster-cards ydk)) + (spell-cards (ydk-spell-cards ydk)) + (trap-cards (ydk-trap-cards ydk))) + (let ((main-deck (getf deck-info :main-deck)) + (extra-deck (getf deck-info :extra-deck)) + (side-deck (getf deck-info :side-deck))) + (let ((main-deck-rle (rle-encode-plist main-deck)) + (extra-deck-rle (rle-encode-plist extra-deck)) + (side-deck-rle (rle-encode-plist side-deck)) + (monster-cards-rle (rle-encode-plist monster-cards)) + (spell-cards-rle (rle-encode-plist spell-cards)) + (trap-cards-rle (rle-encode-plist trap-cards))) + (labels ((pad (lst) + (let ((max 17)) + (append lst + (loop for i from (length lst) upto max collect + '("" :name "")))))) + (list + :name (ydk-name-of ydk) + :set nil + :length (ydk-length ydk) + :created-by created-by + :first-date nil + :final-date nil + :monster-cards monster-cards + :spell-cards spell-cards + :trap-cards trap-cards + :main-deck main-deck + :side-deck side-deck + :extra-deck extra-deck + :monster-cards-rle (pad monster-cards-rle) + :spell-cards-rle (pad spell-cards-rle) + :trap-cards-rle (pad trap-cards-rle) + :main-deck-rle (pad main-deck-rle) + :side-deck-rle (pad side-deck-rle) + :extra-deck-rle (pad extra-deck-rle))))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defmethod %to-string ((ydk ydk)) + (with-slots (created-by main-deck extra-deck side-deck) ydk + (with-output-to-string (s) + (format s "~A~%" + (if created-by + created-by + "created by...")) + (format s "#main~%") + (dolist (card-name (coerce main-deck 'list)) + (format s "~A~%" card-name)) + (format s "#extra~%") + (dolist (card-name (coerce extra-deck 'list)) + (format s "~A~%" card-name)) + (format s "!side~%") + (dolist (card-name (coerce side-deck 'list)) + (format s "~A~%" card-name)) + s))) diff --git a/src/models/ygoprodeck-cardinfo.lisp b/src/models/ygoprodeck-cardinfo.lisp new file mode 100644 index 0000000..67a9156 --- /dev/null +++ b/src/models/ygoprodeck-cardinfo.lisp @@ -0,0 +1,158 @@ +#| + +src/models/ygoprodeck-cardinfo.lisp + +Version 2 JSON Downloader + +The idea behind this code is you'll be able to one click button download and update the db: + + (cardinfo-update-and-cleanup t) + +TODO Use INFERIOR-SHELL + +|# + +(in-package #:cl-deck-builder2.models.ygoprodeck.cardinfo) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Constants +(defparameter +ygoprodeck-api-uri+ "https://db.ygoprodeck.com/api/v7/cardinfo.php") +(defparameter +ygoprodeck-api-uri-misc+ :|misc|) +(defparameter +ygoprodeck-api-uri-tcgplayer-data+ :|tcgplayer_data|) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Specials +(defparameter *cardinfo* nil + "The current CARDINFO object.") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Class Definitions +(defclass cardinfo () + ((input :initarg :input) + (output :initarg :output))) + +(defclass cardinfo-php (cardinfo) + () + (:default-initargs + :input +ygoprodeck-api-uri+ + :output #P"/tmp/cardinfo.php" + :tcgplayer-data "yes" + :misc "yes")) + +(defclass cardinfo-json (cardinfo) + () + (:default-initargs + :input #P"/tmp/cardinfo.php" + :output #P"/tmp/cardinfo.json")) + +;; Extract the card_images image_url from the cardinfo.json +;; +;; jq '.[].card_images[].image_url' < /tmp/cardinfo.json +(defclass cardinfo-list (cardinfo) + () + (:default-initargs + :input #P"/tmp/cardinfo.json" + :output #P"/tmp/cardinfo.list")) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Generics +(defgeneric cardinfo-cleanup (obj)) + +(defgeneric cardinfo-convert (from to &optional force)) + +(defgeneric cardinfo-download (obj &optional force)) + +(defgeneric cardinfo-input (obj) + (:method ((obj cardinfo)) + (let ((slot-value (slot-value obj 'input))) + (typecase slot-value + (pathname (namestring slot-value)) + (t slot-value))))) + +(defgeneric cardinfo-output (obj) + (:method ((obj cardinfo)) + (let ((slot-value (slot-value obj 'output))) + (typecase slot-value + (pathname (namestring slot-value)) + (t slot-value))))) + +(defgeneric (setf cardinfo-input) (new-value obj) + (:method (new-value (obj cardinfo)) + (setf (slot-value obj 'input) new-value))) + +(defgeneric (setf cardinfo-output) (new-value obj) + (:method (new-value (obj cardinfo)) + (setf (slot-value obj 'output) new-value))) + +(defgeneric cardinfo-input-exists-p (obj) + (:method ((obj cardinfo)) + (probe-file (cardinfo-output obj)))) + +(defgeneric cardinfo-output-exists-p (obj) + (:method ((obj cardinfo)) + (probe-file (cardinfo-output obj)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Methods +(defmethod initialize-instance :after ((obj cardinfo-php) &rest initargs &key misc tcgplayer-data &allow-other-keys) + (declare (ignore initargs)) + (let ((params '())) + (when misc (setf (getf params +ygoprodeck-api-uri-misc+) misc)) + (when tcgplayer-data (setf (getf params +ygoprodeck-api-uri-tcgplayer-data+) tcgplayer-data)) + (when params + (setf (cardinfo-input obj) + (caveman2.helper::add-query-parameters + (cardinfo-input obj) params)))) + obj) + +(defmethod cardinfo-cleanup ((obj cardinfo)) + (v:info :ygoprodeck.json "CARDINFO-CLEANUP: ~a" obj) + (uiop:delete-file-if-exists (cardinfo-output obj))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; TODO This could probably be replaced with CL-JSON processor. +(defun cardinfo-run-program (command from to &optional force) + (let* ((from-output (cardinfo-output from)) + (from-output-exists-p (probe-file from-output)) + ;; TO-INPUT is the same as FROM-OUTPUT + (to-input (cardinfo-input to)) + (to-output (cardinfo-output to)) + (to-output-exists-p (probe-file to-output))) + (if (and (string= from-output to-input) + from-output-exists-p + (or force + (not to-output-exists-p))) + (let ((command (format nil command from-output to-output))) + (v:info :ygoprodeck.cardinfo "Running command: \"~a\"" command) + (if (uiop:run-program command :output '(:string :stripped t)) + (cardinfo-output-exists-p to))) + (v:info :ygoprodeck.cardinfo "Detected existing file: \"~a\"" to-output)))) + +(defmethod cardinfo-convert ((from cardinfo-php) (to cardinfo-json) &optional force) + (cardinfo-run-program "jq '.data' < \"~a\" > \"~a\"" from to force)) + +(defmethod cardinfo-convert ((from cardinfo-json) (to cardinfo-list) &optional force) + (cardinfo-run-program "jq '.[].card_images[].image_url' < \"~a\" > \"~a\"" from to force)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defmethod cardinfo-download ((obj cardinfo) &optional force) + (v:info :ygoprodeck.json "CARDINFO-DOWNLOAD: ~a" + (cardinfo-input obj)) + (let* ((input (cardinfo-input obj)) + (output (cardinfo-output obj)) + (output-exists-p (probe-file output))) + (if (or force + (not output-exists-p)) + (trivial-download:download input output) + (cardinfo-output-exists-p obj)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun cardinfo-update-and-cleanup (&optional cleanup) + (let ((cardinfo-php (make-instance 'cardinfo-php)) + (cardinfo-json (make-instance 'cardinfo-json)) + (cardinfo-list (make-instance 'cardinfo-list))) + (cardinfo-download cardinfo-php) + (cardinfo-convert cardinfo-php cardinfo-json) + (cardinfo-convert cardinfo-json cardinfo-list) + (when cleanup + (mapcar #'cardinfo-cleanup (list cardinfo-php cardinfo-json cardinfo-list))))) diff --git a/src/models/ygoprodeck-classes.lisp b/src/models/ygoprodeck-classes.lisp new file mode 100644 index 0000000..2e4694a --- /dev/null +++ b/src/models/ygoprodeck-classes.lisp @@ -0,0 +1,472 @@ +#| + +src/models/ygoprodeck-classes.lisp + +Yu-Gi-Oh! Pro Deck Database Interface v2 + +TODO Documentation; The diagram from schemacrawler would be nice. + +|# + +(in-package #:cl-deck-builder2.models.ygoprodeck.classes) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; This is part of cardsv3 now. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defclass ygo-name-mixin () + ((name :accessor name-of + :col-type :text + :initarg :name)) + (:unique-keys name) + (:documentation "A table for the names of all Yu-Gi-Oh! card properties.") + (:metaclass registered-table-class)) + +(defclass ygo-card-name (ygo-name-mixin) + () + (:documentation "A table for the names of all Yu-Gi-Oh! card names. Dark Magician, Red-Eyes Black Dragon, and so on.") + (:metaclass registered-table-class)) + +(defclass ygo-card-type (ygo-name-mixin) + () + (:documentation "A table for the types of Yu-Gi-Oh! cards. Spell, Flip Effect Monster, and so on.") + (:metaclass registered-table-class)) + +(defclass ygo-card-frame-type (ygo-name-mixin) + () + (:documentation "A table for the frame types of Yu-Gi-Oh! cards. spell, effect_pendulum, and so on.") + (:metaclass registered-table-class)) + +(defclass ygo-card-race (ygo-name-mixin) + () + (:documentation "A table for the races of Yu-Gi-Oh! cards. Insect, Beast, and so on. + +YGOProDeck stores the kind of spell card here too, like Equip or Continuous.") + (:metaclass registered-table-class)) + +(defclass ygo-card-archetype (ygo-name-mixin) + () + (:documentation "A table for the archetypes of Yu-Gi-Oh! cards. Archfiend, Elemental HERO, A.I, and so on.") + (:metaclass registered-table-class)) + +(defclass ygo-card-attribute (ygo-name-mixin) + () + (:documentation "A table for the attributes of Yu-Gi-Oh! cards. FIRE, WIND, EARTH, DARK, and so on.") + (:metaclass registered-table-class)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; YGO-CARD uses the PASSCODE as its UNIQUE ID, so you don't see it in +;; here, because it's added implicitly by MITO as ID slot. +(defclass ygo-card () + ((id :accessor ygo-passcode-of + :col-type :integer + :primary-key t + :initarg :id) + (;; Cards *always* have a UNIQUE Name, and a description. Description isn't necessarily unique. + name :accessor name-of + :col-type :text + :initarg :name) + (desc :accessor ygo-desc-of + :col-type :text + :initarg :desc) + + ;; Some cards pre-date Archetype (e.g. Normal Monsters) + (archetype :accessor ygo-archetype-of + :col-type (or ygo-card-archetype :null) + :initarg :archetype) + ;; Some cards don't have Attribute/ATK/DEF/Level/Scale: + ;; - Skill + ;; - Spell + ;; - Trap + (attribute :accessor ygo-attribute-of + :col-type (or ygo-card-attribute :null) + :initarg :attribute) + (atk :accessor ygo-atk-of + :col-type (or :integer :null) + :initarg :atk) + (def :accessor ygo-def-of + :col-type (or :integer :null) + :initarg :def) + (scale :accessor ygo-scale-of + :col-type (or :integer :null) + :initarg :scale) + (level :accessor ygo-level-of + :col-type (or :integer :null) + :initarg :level) + + ;; Every card has a Frame-Type and a Race; Even Spell and Trap cards have a Race. + ;; YGOProDeck uses this field to keep "Continuous", or "Field" ... yuck. + (frame-type :accessor ygo-frame-type-of + :col-type ygo-card-frame-type + :initarg :frame-type) + (race :accessor ygo-race-of + :col-type ygo-card-race + :initarg :race) + + ;; There's a conflict with the existing lisp builtin TYPE-OF. Call + ;; it CARD-TYPE and access with CARD-TYPE-OF. + (card-type :accessor ygo-card-type-of + :col-type ygo-card-type + :initarg :type)) + (:primary-key id) + (:auto-pk nil) + (:documentation "A table for most info of Yu-Gi-Oh! cards. + +This corresponds to the top level data for each card in the YGOProDeck API export.") + (:metaclass registered-table-class)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; From here onward, the code depends on YGO-CARD. +(defclass ygo-card-misc-info () + ((passcode :accessor ygo-passcode-of + :col-type ygo-card + :initarg :passcode) + (views :accessor ygo-views-of + :col-type :integer + :initform 0 + :initarg :views) + (viewsweek :accessor ygo-viewsweek-of + :col-type :integer + :initform 0 + :initarg :viewsweek) + (upvotes :accessor ygo-upvotes-of + :col-type :integer + :initform 0 + :initarg :upvotes) + (downvotes :accessor ygo-downvotes-of + :col-type :integer + :initform 0 + :initarg :downvotes) + (beta-id :accessor ygo-beta-id-of + :col-type (or :integer :null) + :initarg :beta--id) + (beta-name :accessor ygo-beta-name-of + :col-type (or ygo-name-mixin :null) + :initarg :beta--name) + (staple :accessor ygo-is-staple + :col-type (or :integer :null) + :initarg :staple) + (konami-id :accessor ygo-konami-id-of + :col-type :integer + :initarg :konami--id) + ;; This :INTEGER is just an index into this table, YGO-CARDS. + (treated-as :accessor ygo-treated-as + :col-type (or :null ygo-name-mixin) + :initarg :treated--as) + (has-effect :accessor ygo-has-effect + :col-type (or :integer :null) + :initarg :has--effect) + (question-atk :accessor ygo-question-atk + :col-type (or :integer :null) + :initarg :question--atk) + (question-def :accessor ygo-question-def + :col-type (or :integer :null) + :initarg :question--def) + + ;; When the TCG-DATE or OCG-DATE is NULL, that means it hasn't been released in TCG/OCG... + (tcg-date :accessor ygo-tcg-date-of + :col-type (or :timestamp :null) + :initarg :tcg--date) + (ocg-date :accessor ygo-ocg-date-of + :col-type (or :timestamp :null) + :initarg :ocg--date)) + (:metaclass registered-table-class) + (:documentation "This corresponds to the \"misc_info\" data for each card in the YGOProDeck API export.")) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Now Card Set Stuff +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defclass ygo-set-name (ygo-name-mixin) + () + (:documentation "A table for the sets of Yu-Gi-Oh! cards. Lightning Overdrive, 2021 Tin of Ancient Battles, and so on.") + (:metaclass registered-table-class)) + +(defclass ygo-set-code (ygo-name-mixin) + () + (:documentation "A table for the set codes of Yu-Gi-Oh! cards. LOB-001, LOB-002, and so on. + +SET-CODE is the full code, e.g. \"LOB-001\". + +CODE is just \"001\" part, SET is just \"LOB\" part, both of which can be accessed by SPLIT-CODE.") + (:metaclass registered-table-class)) + +;; Rarity => "Common", "Ghost Rare", "Ultra Rare", "Secret Rare" +(defclass ygo-set-rarity (ygo-name-mixin) + () + (:documentation "A table for the rarities of Yu-Gi-Oh! cards. Common, Secret Rare, Ghost Rare, and so on.") + (:metaclass registered-table-class)) + +;; jq '.[]?.card_sets[]?.set_rarity_code' < /tmp/cardinfo.json | sort -h | uniq +(defclass ygo-set-rarity-code (ygo-name-mixin) + () + (:documentation "A table for the rarity codes of Yu-Gi-Oh! cards. (C), (SR), (GUR), etc.") + (:metaclass registered-table-class)) + +(defclass ygo-set-edition (ygo-name-mixin) + () + (:documentation "A table for the editions of Yu-Gi-Oh! cards. 1st Edition, Unlimited, and so on.") + (:metaclass registered-table-class)) + +(defclass ygo-set () + ((passcode :accessor ygo-passcode-of + :col-type ygo-card + :initarg :passcode) + (name :accessor name-of + :col-type ygo-set-name + :initarg :name) + (code :accessor ygo-code-of + :col-type ygo-set-code + :initarg :code) + (rarity :accessor ygo-rarity-of + :col-type ygo-set-rarity + :initarg :rarity) + (rarity-code :accessor ygo-rarity-code--of + :col-type ygo-set-rarity-code + :initarg :rarity-code) + (edition :accessor ygo-edition-of + :col-type ygo-set-edition + :initarg :edition) + + (url :accessor ygo-url-of + :col-type :text + :initarg :url) + + ;; PRICE is $X,XX * 100 => XXX,00 That way we don't have to store floats at all. + ;; + ;; Default set price is Half a Doll Hair (0.50$) if none supplied + (price :accessor ygo-price-of + :col-type :integer + :initarg :price + :initform 0.50 + :inflate #'currency-inflate + :deflate #'currency-deflate)) + (:documentation "A table for the sets of Yu-Gi-Oh! cards. + +This corresponds to the \"card_sets\" field in the YGOProDeck API export.") + (:metaclass registered-table-class)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defclass ygo-linkmarker () + ((passcode :accessor ygo-passcode-of + :col-type ygo-card + :initarg :passcode) + (bottom :accessor ygo-linkmarker-bottom + :col-type (or :null ygo-linkmarker-name) + :initarg :bottom) + (bottom-left :accessor ygo-linkmarker-bottom-left + :col-type (or :null ygo-linkmarker-name) + :initarg :bottom-left) + (bottom-right :accessor ygo-linkmarker-bottom-right + :col-type (or :null ygo-linkmarker-name) + :initarg :bottom-right) + (left :accessor ygo-linkmarker-left + :col-type (or :null ygo-linkmarker-name) + :initarg :left) + (right :accessor ygo-linkmarker-right + :col-type (or :null ygo-linkmarker-name) + :initarg :right) + (top :accessor ygo-linkmarker-top + :col-type (or :null ygo-linkmarker-name) + :initarg :top) + (top-left :accessor ygo-linkmarker-top-left + :col-type (or :null ygo-linkmarker-name) + :initarg :top-left) + (top-right :accessor ygo-linkmarker-top-right + :col-type (or :null ygo-linkmarker-name) + :initarg :top-right)) + (:metaclass registered-table-class) + (:documentation "A table for Yu-Gi-Oh! Link Monster Link markers. + +This corresponds to the \"linkmarkers\" field in each card.")) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defclass ygo-format () + ((passcode :accessor ygo-passcode-of + :col-type (or :null ygo-format-name) + :initarg :passcode) + (common-charity :accessor ygo-common-charity-format + :col-type (or :null ygo-format-name) + :initarg :common-charity) + (duel-links :accessor ygo-duel-links-format + :col-type (or :null ygo-format-name) + :initarg :duel-links) + (edison :accessor ygo-edison-format + :col-type (or :null ygo-format-name) + :initarg :edison) + (goat :accessor ygo-goat-format + :col-type (or :null ygo-format-name) + :initarg :goat) + (ocg :accessor ygo-ocg-format + :col-type (or :null ygo-format-name) + :initarg :ocg) + (ocg-goat :accessor ygo-ocg-goat-format + :col-type (or :null ygo-format-name) + :initarg :ocg-goat) + (speed-duel :accessor ygo-speed-duel-format + :col-type (or :null ygo-format-name) + :initarg :speed-duel) + (tcg :accessor ygo-tcg-format + :col-type (or :null ygo-format-name) + :initarg :tcg)) + (:metaclass registered-table-class) + (:documentation "A table for Yu-Gi-Oh! rule formats. + +This corresponds to the \"formats\" field in the \"misc_info\" for each card. + +If the card is available in this format, e.g. listed under misc_info.formats \"TCG\", that means the card is allowed in TCG games. The YGO-TCG-FORMAT slot for this object would have a non-NIL YGO-FORMAT-NAME value.")) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defclass ygo-banlist () + ((passcode :accessor ygo-passcode-of + :col-type ygo-card + :initarg :passcode) + (ban-goat :accessor ygo-ban-goat + :col-type (or :null ygo-banlist-name) + :initarg :ban--goat) + (ban-ocg :accessor ygo-ban-ocg + :col-type (or :null ygo-banlist-name) + :initarg :ban--ocg) + (ban-tcg :accessor ygo-ban-tcg + :col-type (or :null ygo-banlist-name) + :initarg :ban--tcg)) + (:unique-keys passcode) + (:metaclass registered-table-class) + (:documentation "A table for Yu-Gi-Oh! rule banlist. + +This corresponds to the \"banlist_info\" field for each card.")) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defclass ygo-alternative-artwork () + ((passcode :accessor ygo-passcode-of + :col-type ygo-card + :initarg :passcode) + (alternate :accessor ygo-alternate-id-of + :col-type ygo-card + :initarg :alternate)) + (:metaclass registered-table-class) + (:documentation "A table for Yu-Gi-Oh! alternative artwork. + +This corresponds to the \"card_images\" array for each card.")) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defclass ygo-price () + ((passcode :accessor ygo-passcode-of + :col-type ygo-card + :initarg :passcode + :deflate #'currency-deflate + :inflate #'currency-inflate) + (cardmarket-price :accessor ygo-cardmarket-price-of + :col-type :integer + :initarg :cardmarket--price + :deflate #'currency-deflate + :inflate #'currency-inflate) + (tcgplayer-price :accessor ygo-tcgplayer-price-of + :col-type :integer + :initarg :tcgplayer--price + :deflate #'currency-deflate + :inflate #'currency-inflate) + (ebay-price :accessor ygo-ebay-price-of + :col-type :integer + :initarg :ebay--price + :deflate #'currency-deflate + :inflate #'currency-inflate) + (amazon-price :accessor ygo-amazon-price-of + :col-type :integer + :initarg :amazon--price + :deflate #'currency-deflate + :inflate #'currency-inflate) + (coolstuffinc-price :accessor ygo-coolstuffinc-price-of + :col-type :integer + :initarg :coolstuffinc--price + :deflate #'currency-deflate + :inflate #'currency-inflate)) + (:metaclass registered-table-class) + (:documentation "A table for Yu-Gi-Oh! pricing information. Represents the API information about Card Pricing. Encapsulates the following fields: +- Passcode +- CardMarket +- TCGPlayer +- eBay +- Amazon +- CoolStuffInc + +This corresponds to the \"card_prices\" array for each card.")) + +;; YGO-FORMAT-NAME, YGO-LINKMARKER-NAME, YGO-BANLIST-NAME, +;; YGO-SET-RARITY-CODE, and the like have moved to YGOPRODECK.FIELDS. + +(defclass ygo-set-item () + ((item :accessor item-of + :initarg :item + :col-type ygo-set) + (variant :accessor variant-of + :initarg :variant + :col-type variant-condition) + (qty :accessor qty-of + :col-type :integer + :initform 0 + :initarg :qty) + (opt-qty :accessor opt-qty-of + :col-type :integer + :initform 0 + :initarg :opt-qty) + (;; 10 cent buy price + buy-price :accessor buy-price-of + :col-type :integer + :initform 0.10 + :initarg :buy-price + :inflate #'currency-inflate + :deflate #'currency-deflate) + (;; 50 cent sell price + sell-price :accessor sell-price-of + :col-type :integer + :initform 0.50 + :initarg :sell-price + :inflate #'currency-inflate + :deflate #'currency-deflate)) + (:metaclass registered-table-class) + (:documentation "YGO-SET + VARIANT-CONDITION relationship table.")) + + +#| +;;;; models/ygoprodeck.lisp + (defstruct ygoprodeck-item + (:documentation "Represents the top level API information queried from YGOProDeck. Encapsulates the following fields: ~Passcode~,~Name~,~Type~, ~Frame Type~, ~Documentation~,~Race~,~ATK~, ~DEF~,~Level~,~Attribute~, and ~Archetype~.")) + (defstruct ygoprodeck-card-set + (:documentation "Represents the API information about Card Sets. Encapsulates the following fields: ~Passcode~,~Name~,~Code~, ~Rarity~, ~Rarity-code~, and ~Price~.")) + (defstruct ygoprodeck-card-image + (:documentation "Card images. We don't use this much.")) + (defstruct ygoprodeck-card-price + (defun drop-table-ygoprodeck-data + (:documentation "Destroy the table for this data.")) + (defun create-table-ygoprodeck-data + (:documentation "Create the corresponding database structure for the YGOProDeck API data import.")) + (defun json-import-ygoprodeck-data + (:arguments + ((data "The data to be imported.")) + :documentation "Import the base API data (ATK, DEF,Level, ...) information from the Card Info API data.")) + (defun json-import-ygoprodeck-card-images + (:arguments + ((data "The data to be imported.")) + :documentation "Import the images information from the Card Info API data.")) + (defun json-import-ygoprodeck-card-prices + (:arguments + ((data "The data to be imported.")) + :documentation "Import the pricing information from the Card Info API data.")) + (defun json-import-ygoprodeck-card-sets + (:arguments + ((data "The data to be imported.")) + :documentation "Import the card set information from the Card Info API data.")) + (defun json-import-ygoprodeck-banlist-info + (:arguments + ((data "The data to be imported.")) + :documentation "Import the banlist information from the Card Info API data.")) + (defun json-import-ygoprodeck + (:arguments + ((json "The JSON query to iterate over. Response from YGOProDeck API.")) + :documentation "Import YGOProDeck data. Wraps the ~JSON-IMPORT-*~ functions.")) + (defun card-rarity-list + (:documentation "List all card rarities.")) + (defun card-code-list + (:documentation "List all card set codes.")) + +|# diff --git a/src/models/ygoprodeck-fields.lisp b/src/models/ygoprodeck-fields.lisp new file mode 100644 index 0000000..583db59 --- /dev/null +++ b/src/models/ygoprodeck-fields.lisp @@ -0,0 +1,62 @@ +#| + +If you wanted to add an item, you would add to the end of the list +or the matching position in the list to the matching DEFPARAMETER +and DEFCLASS. + +These are all extracted from cardinfo.php + +|# + +(in-package #:cl-deck-builder2.models.ygoprodeck.fields) + +;; TODO Merge this with YGO-CARD-NAME? What is even going on +;; here. This could be mixed with any DAO/table with a NAME +;; column. That *feels* like it's a lot more general than I +;; realize.... +(defclass variant () + ((name :col-type :text + :initarg :name)) + (:metaclass registered-table-class)) + +(defmethod name-of ((obj variant)) + (slot-value obj 'name)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun create-variant (class variant) + (or (mito:find-dao class :name variant) + (mito:create-dao class :name variant))) + +(defun create-variants (class &rest variants) + (with-connection (db) + (with-transaction + (dolist (v variants) + (create-variant class v))))) + +(defmacro define-variant-list (name &rest lst) + `(progn + (defclass ,name (variant) + () + (:metaclass registered-table-class)) + (create-table ',name) + (create-variants (find-class ',name) ,@lst))) + +;; Card Conditions +(define-variant-list variant-condition + "Near Mint" "Lightly Played" "Moderately Played" "Heavily Played" "Damaged") + +;; Languages +(define-variant-list variant-language + "English" "French" "Italian" "Spanish" "German" "Portuguese") + +;; Ban List Info +(define-variant-list ygo-banlist-name + "Unlimited" "Semi-Limited" "Limited" "Banned") + +;; Formats +(define-variant-list ygo-format-name + "Common Charity" "Duel Links" "Edison" "GOAT" "OCG" "OCG GOAT" "Speed Duel" "TCG") + +;; Link Markers +(define-variant-list ygo-linkmarker-name + "Top" "Top-Right" "Right" "Bottom-Right" "Bottom" "Bottom-Left" "Left" "Top-Left") diff --git a/src/models/ygoprodeck-json.lisp b/src/models/ygoprodeck-json.lisp new file mode 100644 index 0000000..e89bfa2 --- /dev/null +++ b/src/models/ygoprodeck-json.lisp @@ -0,0 +1,477 @@ +#| + +src/models/ygoprodeck.json.lisp + +Version 3 JSON Importer + +TODO Write a test suite - it should be easier now that it's in FNF + +The idea behind this code is you'll be able to one click button download and update the db. + + (cl-deck-builder2.models.ygoprodeck.json2::json-import-cardinfo #P"/tmp/cardinfo.json") + +|# + +(in-package #:cl-user) + +(in-package #:cl-deck-builder2.models.ygoprodeck.json) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defvar *json* nil + "The currently loaded CARDINFO data pulled from YGOProDeck API.") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defmethod cardinfo-import ((obj cardinfo) &optional force) + "Set *JSON* to the decoded JSON data from CARDINFO, by processing it into CARDINFO-JSON using CARDINFO-CONVERT. + +Optionally, FORCE the data to be loaded anyway. + +If the (CARDINFO-OUTPUT OBJ) does not exist, try to (CARDINFO-INPUT *CARDINFO*)." + (cardinfo-load obj force) + (process-all-nodes)) + +(defmethod cardinfo-load ((obj cardinfo) &optional force) + (let ((output (cardinfo-output obj))) + (v:info :ygoprodeck.json "CARDINFO-LOAD ~a (exists:~a) (force:~a)" output (cardinfo-output-exists-p obj) force) + (if (cardinfo-output-exists-p obj) + (progn + (setf *json* (with-open-file (f output) + (cl-json:decode-json f))))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun json-cardinfo-base-fields (plist) + "Filter only the base fields for this CARD-INFO PLIST." + (set-difference plist + '((:banlist--info) + (:card--images) + (:card--prices) + (:card--sets) + (:linkmarkers) + (:misc--info)) + :key #'car)) + +;; (defparameter +ygo-card-ids+ (make-hash-table :test #'equal)) +;; (defparameter +ygo-card-descs+ (make-hash-table :test #'equal)) + +;; TODO put all of these hash tables inside another hash table, then +;; make an API around it. I've seen that done before with CLOS, maybe +;; in cl-opengl defvao stuff. Remember? +(defparameter +ygo-card-names+ (make-hash-table :test #'equal)) +(defparameter +ygo-card-types+ (make-hash-table :test #'equal)) +(defparameter +ygo-card-races+ (make-hash-table :test #'equal)) +(defparameter +ygo-card-frame-types+ (make-hash-table :test #'equal)) +(defparameter +ygo-card-archetypes+ (make-hash-table :test #'equal)) +(defparameter +ygo-card-attributes+ (make-hash-table :test #'equal)) + +(defparameter +ygo-set-names+ (make-hash-table :test #'equal)) +(defparameter +ygo-set-codes+ (make-hash-table :test #'equal)) +(defparameter +ygo-set-rarity+ (make-hash-table :test #'equal)) +(defparameter +ygo-set-editions+ (make-hash-table :test #'equal)) + +;; Here we use the ID/PASSCODE so EQ is Okay +(defparameter +ygo-card-prices+ (make-hash-table)) ;; One to one: setf place +(defparameter +ygo-alternative-artwork+ (make-hash-table)) ;; Many to many: push place + +(defparameter +ygo-cards+ (make-hash-table)) ;; One to one: setf place +(defparameter +ygo-sets+ (make-hash-table)) ;; Many to many: push place + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Field Names +(defparameter +ygo-banlist-info+ (make-hash-table)) +(defparameter +ygo-format-info+ (make-hash-table)) +(defparameter +ygo-linkmarker-info+ (make-hash-table)) + +(defparameter +ygo-banlist-names+ (make-hash-table :test #'equal)) +(defparameter +ygo-format-names+ (make-hash-table :test #'equal)) +(defparameter +ygo-linkmarker-names+ (make-hash-table :test #'equal)) +(defparameter +ygo-set-rarity-codes+ (make-hash-table :test #'equal)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; The bulk of the operation ... FIND-OR-MAKE-INSTANCE + SYNC-HASH-TABLE +(defun sync-hash-table (ht) + (let ((values (alexandria:hash-table-values ht))) + (cond ((null values) nil) + (;; The ht is a bunch of lists (card sets, prices, images) + (listp (car values)) + (dolist (lst values) + (unless (mito:dao-synced (car lst)) + (do-grouped-insert lst)))) + (t + (unless (mito:dao-synced (car values)) + (do-grouped-insert values)))))) + +;; TODO Where should this go? I'm seeing bits of code like this all over. +(defun %keywordify (s) + (alexandria:make-keyword + (string-upcase + (substitute #\- #\Space s)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Importer v3 +(defun extract-json-tag (json tag) + "Get all the tags from JSON matching TAG." + (mapcar (lambda (alist) (assoc-utils:aget alist tag)) json)) + +(defun extract-concat (json tag) + "Concatenate the results of EXTRACT-JSON-TAG into a single list for MAPCAR'ing." + (apply #'concatenate 'list (extract-json-tag json tag))) + +(defun extract-card-sets (json) + "Just extract :CARD--SETS. No Processing" + (extract-concat json :card--sets)) + +(defun extract-card-set-map (json) + "Extract PASSCODE => SETS mapping." + (let ((lst '())) + (dolist (node json (copy-alist + (apply #'concatenate 'list (reverse lst)))) + (let* ((node-id (assoc-utils:aget node :id)) + (maybe-card-sets + (mapcar (lambda (alist) + (acons :passcode-id node-id alist)) + (assoc-utils:aget node :card--sets)))) + (when maybe-card-sets + (push maybe-card-sets lst)))))) + +(defun extract-card-images (json) + "Just extract :CARD--IMAGES. No Processing" + (extract-concat json :card--images)) + +(defun extract-card-alternative-images-map (json) + "Mapping of ID to alternative art IDs." + (let ((lst '())) + (dolist (node json (reverse lst)) + (let* ((alternate-id (assoc-utils:aget node :id)) + (maybe-alternative-images + (remove alternate-id + (mapcar (lambda (alist) + (assoc-utils:aget alist :id)) + (assoc-utils:aget node :card--images))))) + (when maybe-alternative-images + (mapcar (lambda (node-id) + (push (list :passcode-id node-id + :alternate-id alternate-id) + lst)) + maybe-alternative-images)))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Working with the base fields +(defun extract-card-tag (json tag) + "Extract TAG from JSON using EXTRACT-JSON-TAG. Also, SORT, and SUBSTITUTE NIL for \"\"." + (sort + (substitute "" NIL + (remove-duplicates + (extract-json-tag json tag) + :test #'string=)) + #'string<)) + +(defun extract-card-name (json) + (extract-card-tag json :name)) + +(defun extract-card-type (json) + (extract-card-tag json :type)) + +(defun extract-card-race (json) + (extract-card-tag json :race)) + +(defun extract-card-frame-type (json) + (extract-card-tag json :frame-type)) + +(defun extract-card-archetype (json) + (extract-card-tag json :archetype)) + +(defun extract-card-attribute (json) + (extract-card-tag json :attribute)) + +(defun extract-cards (json) + "Just extract the base field for every card." + (mapcar #'json-cardinfo-base-fields json)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun extract-card-banlist-info (json) + "Lots of cards don't have banlist info records." + (let ((lst '())) + (dolist (node json (copy-list lst)) + (let ((node-id (assoc-utils:aget node :id)) + (maybe-banlist-info + (assoc-utils:alist-plist + (assoc-utils:aget node :banlist--info)))) + (when maybe-banlist-info + (push (append (list :passcode-id node-id) + maybe-banlist-info) + lst)))))) + +(defun extract-card-banlist-names (json) + "Just extract the names of the ban status. \"Banned\" etc." + (let ((lst '())) + (dolist (node json (copy-list lst)) + (let ((maybe-banlist-names + (assoc-utils:alist-values + (assoc-utils:aget node :banlist--info)))) + (when maybe-banlist-names + (loop for name in maybe-banlist-names do + (pushnew name lst :test #'string=))))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun extract-card-prices (json) + (extract-json-tag json :card--prices)) + +(defun extract-card-price-map (json) + "Extract :CARD--PRICE and process into ID => PRICES mapping" + (let ((lst '())) + (dolist (node json lst) + (let ((node-id (assoc-utils:aget node :id)) + (maybe-price-data + (assoc-utils:alist-plist + (apply #'concatenate 'list + (assoc-utils:aget node :card--prices))))) + (when maybe-price-data + (push (append (list :passcode-id node-id) + maybe-price-data) + lst)))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun extract-card-misc-info (json) + (extract-json-tag json :misc--info)) + +(defun extract-card-misc-info-map (json) + "Extract :MISC--INFO and process into ID => FORMATS mapping" + (let ((lst '())) + (dolist (node json lst) + (let* ((node-id (assoc-utils:aget node :id)) + (maybe-misc-info + (assoc-utils:alist-plist + (remove :formats + (apply #'concatenate 'list + (assoc-utils:aget node :misc--info)) + :key #'car)))) + (when maybe-misc-info + (push (append (list :passcode-id node-id) + maybe-misc-info) + lst)))))) + +;; TODO +(defun extract-card-format-info (json) + "Extract :MISC--INFO and process into ID => FORMATS mapping" + (let ((lst '())) + (dolist (node json lst) + (let* ((node-id (assoc-utils:aget node :id)) + (maybe-misc-info + (assoc-utils:aget + (apply #'concatenate 'list + (assoc-utils:aget node :misc--info)) + :formats))) + (when maybe-misc-info + (push (list node-id maybe-misc-info) lst)))))) + +;; TODO - The card formats need to be processed like the card-sets and cards +(defun process-card-format-info-map (json) + (let ((info (extract-card-format-info json))) + (with-connection (db) + (with-transaction + (mapcar (lambda (row) + (list :passcode-id (car row) + (apply #'concatenate 'list + (mapcar (lambda (tag) + (let ((db-tag (or (find-or-create-instance 'ygo-format-name :name tag)))) + (list (%keywordify tag) db-tag))) + (cadr row))))) + info))))) + +(defun extract-card-format-names (json) + (sort + (remove-duplicates + (apply #'concatenate 'list + (mapcar (lambda (alist) (assoc-utils:aget alist :formats)) + (apply #'concatenate 'list + (extract-card-misc-info json)))) + :test #'string=) + #'string<)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun extract-card-linkmarker-names (json) + (sort (remove-duplicates + (extract-concat json :linkmarkers) + :test #'string=) + #'string<)) + +;; TODO +(defun extract-card-linkmarker-info (json) + "Just extract :CARD--IMAGES. No Processing" + (let ((lst '())) + (dolist (node json lst) + (let ((node-id (assoc-utils:aget node :id)) + (maybe-linkmarkers + (assoc-utils:aget node :linkmarkers))) + (when maybe-linkmarkers + (push (list node-id maybe-linkmarkers) lst)))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Working with CARD--SETS + +;; Here, JSON shuld be: (extract-card-sets json) +(defun extract-set-tag (json tag) + (sort (remove-duplicates + (extract-json-tag json tag) + :test #'string=) + #'string<)) + +(defun extract-set-name (json) + (extract-set-tag json :set--name)) + +(defun extract-set-code (json) + (extract-set-tag json :set--code)) + +(defun extract-set-rarity (json) + (extract-set-tag json :set--rarity)) + +(defun extract-set-rarity-code (json) + (extract-set-tag json :set--rarity--code)) + +(defun extract-set-edition (json) + (extract-set-tag json :set--edition)) + +(defun extract-set-price (json) + (extract-set-tag json :set--price)) + +(defun extract-set-url (json) + (extract-set-tag json :set--url)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Card Images +(defun extract-card-main-image (json) + "From :CARD--IMAGES, extract the first IMAGE--URL. The other two are small and cropped images." + (sort + (mapcar (lambda (alist) (assoc-utils:aget alist :image--url)) + (extract-concat json :card--images)) + #'string<)) + +(defun gen-hash-table (ht class tags) + "Just a list mapping like \"Normal\" => 1, \"Tested\" => 2, and so on. Could be used for anything that has a NAME column." + (v:info :ygoprodeck.json "GEN-HASH-TABLE: ~a" class) + (with-connection (db) + (with-transaction + (dolist (tag tags ht) + (unless (gethash tag ht) + (setf (gethash tag ht) + (or (mito:find-dao class :name tag) + (mito:create-dao class :name tag)))))))) + +(defun gen-hash-mapping-table (class tags &key (test 'equal)) + "A more complex mapping of PASSCODE -> DATA" + (let ((ht (make-hash-table :test test))) + (with-connection (db) + (with-transaction + (dolist (node tags ht) + (let ((passcode-id (getf node :passcode-id))) + (setf (gethash passcode-id ht) + (or (mito:find-dao class :passcode-id passcode-id) + (apply #'mito:create-dao class node))))))))) + +(defun gen-hash-map-list-table (class tags &key (test 'equal)) + "A more complex mapping of PASSCODE -> (DATA, DATA, DATA)" + (let ((ht (make-hash-table :test test))) + (with-connection (db) + (with-transaction + (dolist (node tags ht) + (let ((passcode-id (getf node :passcode-id))) + (push (or (apply #'mito:find-dao class node) + (apply #'mito:create-dao class node)) + (gethash passcode-id ht)))))))) + +(defun process-card-nodes (json) + "Mostly preserved from V2." + (let* ((base-fields (json-cardinfo-base-fields json)) + (id (assoc-utils:aget base-fields :id)) + (args (list + :name (assoc-utils:aget base-fields :name) + :desc (assoc-utils:aget base-fields :desc) + :archetype (gethash (assoc-utils:aget base-fields :archetype) +ygo-card-archetypes+) + :attribute (gethash (assoc-utils:aget base-fields :attribute) +ygo-card-attributes+) + :frame-type (gethash (assoc-utils:aget base-fields :frame-type) +ygo-card-frame-types+) + :race (gethash (assoc-utils:aget base-fields :race) +ygo-card-races+) + :card-type (gethash (assoc-utils:aget base-fields :type) +ygo-card-types+) + :atk (assoc-utils:aget base-fields :atk) + :def (assoc-utils:aget base-fields :def) + :scale (assoc-utils:aget base-fields :scale) + :level (assoc-utils:aget base-fields :level))) + (found (or (mito:find-dao 'ygo-card :id id) + (apply #'create-dao 'ygo-card :id id args)))) + (unless (gethash id +ygo-cards+) + (setf (gethash id +ygo-cards+) found)))) + +(defun process-card-sets (&rest sets) + "Mostly preserved from V2." + (dolist (node sets +ygo-sets+) + (let* ((args + (list :passcode-id (assoc-utils:aget node :passcode-id) + :code (gethash (assoc-utils:aget node :set--code) +ygo-set-codes+) + :name (gethash (assoc-utils:aget node :set--name) +ygo-set-names+) + :edition (gethash (assoc-utils:aget node :set--edition) +ygo-set-editions+) + :rarity (gethash (assoc-utils:aget node :set--rarity) +ygo-set-rarity+) + :rarity-code (gethash (assoc-utils:aget node :set--rarity--code) +ygo-set-rarity-codes+))) + (rest-args + (list :price (assoc-utils:aget node :set--price) + :url (assoc-utils:aget node :set--url))) + (found (or (apply #'mito:find-dao 'ygo-set args) + (apply #'mito:create-dao 'ygo-set (append args rest-args))))) + (pushnew found + (gethash (assoc-utils:aget node :passcode-id) +ygo-sets+) + :test #'mito:object=)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; TODO for Import-v4 - It might be useful to have PASSCODE as the ID, +;; that way, there is a uniform interface for querying card info... +;; +;; TODO Split this up? +(defun pre-process-nodes (json) + (let ((card-names (extract-card-name json)) + (card-types (extract-card-type json)) + (card-races (extract-card-race json)) + (card-frame-types (extract-card-frame-type json)) + (card-archetypes (extract-card-archetype json)) + (card-attributes (extract-card-attribute json)) + (card-sets (extract-card-sets json))) + + (gen-hash-table +ygo-card-names+ 'ygo-card-name card-names) + (gen-hash-table +ygo-card-archetypes+ 'ygo-card-archetype card-archetypes) + (gen-hash-table +ygo-card-attributes+ 'ygo-card-attribute card-attributes) + (gen-hash-table +ygo-card-frame-types+ 'ygo-card-frame-type card-frame-types) + (gen-hash-table +ygo-card-races+ 'ygo-card-race card-races) + (gen-hash-table +ygo-card-types+ 'ygo-card-type card-types) + + (gen-hash-table +ygo-set-names+ 'ygo-set-name (extract-set-name card-sets)) + (gen-hash-table +ygo-set-codes+ 'ygo-set-code (extract-set-code card-sets)) + (gen-hash-table +ygo-set-rarity+ 'ygo-set-rarity (extract-set-rarity card-sets)) + (gen-hash-table +ygo-set-editions+ 'ygo-set-edition (extract-set-edition card-sets)) + (gen-hash-table +ygo-set-rarity-codes+ 'ygo-set-rarity-code (extract-set-rarity-code card-sets)) + + (gen-hash-table +ygo-banlist-names+ 'ygo-banlist-name (extract-card-banlist-info card-sets)) + (gen-hash-table +ygo-linkmarker-names+ 'ygo-linkmarker-name (extract-card-linkmarker-names card-sets)) + (gen-hash-table +ygo-format-names+ 'ygo-format-name (extract-card-format-names json)))) + +(defun pre-process-card-prices (json) + (setf +ygo-card-prices+ (gen-hash-mapping-table 'ygo-price (extract-card-price-map json) :test 'eq))) + +(defun pre-process-card-alternative-artwork (json) + (setf +ygo-alternative-artwork+ (gen-hash-map-list-table 'ygo-alternative-artwork (extract-card-alternative-images-map json) :test 'eq))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun process-all-nodes (&optional (json *json*)) + "Process all nodes from JSON." + (v:info :ygoprodeck.json "PROCESS-ALL-NODES: PRE-PROCESS-NODES") + (pre-process-nodes json) + (pre-process-card-prices json) + (pre-process-card-alternative-artwork json) + + ;; +ygo-cards+ + (v:info :ygoprodeck.json "PROCESS-ALL-NODES: PROCESS-CARD-NODES") + (with-connection (db) + (with-transaction + (mapcan #'process-card-nodes json))) + + ;; +ygo-sets+ + (v:info :ygoprodeck.json "PROCESS-ALL-NODES: PROCESS-CARD-SETS") + (with-connection (db) + (with-transaction + (apply #'process-card-sets (extract-card-set-map json))))) diff --git a/src/models/ygoprodeck-methods.lisp b/src/models/ygoprodeck-methods.lisp new file mode 100644 index 0000000..e6815e6 --- /dev/null +++ b/src/models/ygoprodeck-methods.lisp @@ -0,0 +1,258 @@ +#| + +src/models/ygoprodeck-2.lisp + +Yu-Gi-Oh! Pro Deck Database Interface v2 + +TODO Documentation + +|# + +(in-package #:cl-deck-builder2.models.ygoprodeck.methods) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defmacro ygo-card (&body body) + `(with-includes + 'ygo-card + (mito:includes + 'ygo-card-archetype + 'ygo-card-attribute + 'ygo-card-frame-type + 'ygo-card-race + 'ygo-card-type) + ,@body)) + +(defmacro ygo-set (&body body) + `(with-includes 'ygo-set + (mito:includes + 'ygo-card + 'ygo-set-code + 'ygo-set-edition + 'ygo-set-name + 'ygo-set-rarity + 'ygo-set-rarity-code) + ;; (mito:includes + ;; 'ygo-card-name) + ,@body)) + +(defun ygo-set-by-id (id) + (first (ygo-set (sxql:where (:= :id id))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defmethod split-code ((set-code ygo-set-code)) + (cl-ppcre:split "-" (name-of set-code))) + +(defmethod ygo-card-sets ((obj ygo-card)) + (ygo-card-sets (ygo-passcode-of obj))) + +(defmethod ygo-card-sets ((passcode integer)) + ;; If alternate IDs exist, just mush them in + (let ((alt-id (has-alternative-artwork passcode))) + (when alt-id + ;; XXX Why the long accessor name here? How can we get this accessor? Maybe I have to specify it manually. + (with-slots ((alternate-id cl-deck-builder2.models.ygoprodeck.classes::alternate-id)) alt-id + (setf passcode alternate-id))) + (let ((sets + (ygo-set + ;; (sxql:left-join :ygo_card_name :on (:= :ygo-card.name-id :ygo-card-name.id)) + (sxql:where (:= :passcode-id passcode)) + (sxql:order-by :price :desc)))) + sets))) + +;; Only showing cards with inventory + +;; (with-connection (db) +;; (mito:select-dao 'cl-deck-builder2.models.ygoprodeck.classes::ygo-set-item +;; (sxql:where (:and (:in :item_id +;; (sxql:select :id +;; (sxql:from :ygo_set) +;; (sxql:where (:= :passcode-id 89631139)))) +;; (:> :qty 0))))) + +;; (mapcar (alexandria:compose #'cl-deck-builder2.models.ygoprodeck2::ygo-card-sets #'deck-passcode-of) +;; (retrieve-dao 'deck-item :deck-id 5)) + +;; (reduce #'+ (mapcar (alexandria:compose #'read-from-string #'cl-deck-builder2.models.ygoprodeck2::ygo-price-of) +;; (cl-deck-builder2.models.ygoprodeck2::ygo-card-sets (deck-passcode-of (find-dao 'deck-item))))) + +;; price of a deck by id using #'first of the ygo-card-sets +;; +;; (reduce '+ (mapcar (alexandria:compose #'read-from-string #'cl-deck-builder2.models.ygoprodeck.classes::ygo-price-of) +;; (mapcar #'first +;; (mapcar (alexandria:compose #'cl-deck-builder2.models.ygoprodeck.methods::ygo-card-sets #'deck-passcode-of) +;; (retrieve-dao 'deck-item :deck-id 308))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun ygo-card-by-name (name &optional (test :=)) + (let ((clauses (case test + (:= (sxql:where (:= :name name))) + (:like (sxql:where (:like :name (format nil "%~a%" name))))))) + (ygo-card clauses))) + +(defun ygo-card-by-passcode (passcode) + (first (ygo-card (sxql:where (:= :id passcode))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun ygo-set-by-code (name &optional (test :=)) + (let ((clauses (case test + (:= (sxql:where (:= :name name))) + (:like (sxql:where (:like :name (format nil "%~a%" name))))))) + (ygo-set + (sxql:where (:in :code-id + (sxql:select :id + (sxql:from (sxql:make-sql-symbol + (mito.class.table:table-name + (find-class 'ygo-set-code)))) + clauses)))))) + +(defun ygo-set-by-name (name &optional (test :=)) + (let ((clauses (case test + (:= (sxql:where (:= :set_name name))) + (:like (sxql:where (:like :set_name (format nil "%~a%" name))))))) + (ygo-set + (sxql:where (:in :code-id + (sxql:select :id + (sxql:from (sxql:make-sql-symbol + (mito.class.table:table-name + (find-class 'ygo-set-name)))) + clauses)))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun ygo-select-set-item (item-id variant-id) + "Helper function. Select a single YGO-SET-ITEM by ITEM-ID and VARIANT-ID." + (mito:select-dao 'ygo-set-item + (mito:includes 'ygo-set 'variant-condition) + (sxql:where (:and (:= :item-id item-id) + (:= :variant-id variant-id))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; https://lispcookbook.github.io/cl-cookbook/clos.html#pretty-printing +;; +;; (defmethod print-object ((obj person) stream) +;; (print-unreadable-object (obj stream :type t) +;; (with-accessors ((name name) +;; (lisper lisper)) +;; obj +;; (format stream "~a, lisper: ~a" name lisper)))) +;; +;; (defmethod print-object ((obj person) stream) +;; (print-unreadable-object (obj stream :type t) +;; (format stream "~a, lisper: ~a" (name obj) (lisper obj)))) +;; +;; (defmethod print-object ((obj person) stream) +;; (print-unreadable-object (obj stream :type t :identity t))) +;; +;; Caution: trying to access a slot that is not bound by default will lead to an error. Use slot-boundp. + +(defmethod print-object ((obj ygo-card) stream) + (print-unreadable-object (obj stream :type t) + (let ((args)) + (when (ygo-passcode-of obj) + (push (ygo-passcode-of obj) args)) + (ignore-errors + (with-accessors ((name name-of)) + obj + (when (and (slot-boundp obj 'name) + (slot-value obj 'name)) + (push (name-of name) args)))) + (when args + (format stream "~{~a~^ - ~}" (reverse args)))))) + +(defmethod print-object ((obj ygo-set) stream) + (print-unreadable-object (obj stream :type t) + (let ((args)) + (when (mito:object-id obj) + (push (mito:object-id obj) args)) + (ignore-errors + (with-accessors ((passcode ygo-passcode-of) + (name name-of) + (code ygo-code-of) + (rarity ygo-rarity-of) + (edition ygo-edition-of)) + obj + (when (and (slot-boundp obj 'passcode) + (slot-value obj 'passcode)) + (push (ygo-passcode-of passcode) args)) + (when (and (slot-boundp obj 'code) + (slot-value obj 'code)) + (push (ygo-set-code-of code) args)) + (when (and (slot-boundp obj 'rarity) + (slot-value obj 'rarity)) + (push (ygo-rarity-of rarity) args)) + (when (and (slot-boundp obj 'edition) + (slot-value obj 'edition)) + (push (ygo-edition-of edition) args)) + (when (and (slot-boundp obj 'name) + (slot-value obj 'name)) + (push (name-of name) args)))) + (when args + (format stream "~{~a~^ - ~}" (reverse args)))))) + +(defun ygo-card-names-from-list (&rest args) + (with-connection (db) + (with-transaction + (mito:retrieve-by-sql + (sxql:select (:ygo_card.id :name) + (sxql:from :ygo_card) + (sxql:left-join :ygo_card_name :on (:= :ygo_card.name_id :ygo_card_name.id)) + (sxql:where (:in :ygo_card_name.id + (sxql:select :name_id + (sxql:from :ygo_card) + (sxql:where (:in :id args)))))))))) + +(defun ygo-card-names-by-deck-id (id) + (with-connection (db) + (with-transaction + (mito:retrieve-by-sql + (sxql:select (:ygo_card.id :name) + (sxql:from :ygo_card) + (sxql:left-join :ygo_card_name :on (:= :ygo_card.name_id :ygo_card_name.id)) + (sxql:where (:in :ygo_card_name.id + (sxql:select :name_id + (sxql:from :ygo_card) + (sxql:where (:in :id + (sxql:select :passcode + (sxql:from :deck_item) + (sxql:where (:= :deck_id id))))))))))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun count-all-dao () + (let ((class-list (append (registered-classes (registry) :cl-deck-builder2.models.ygoprodeck.fields) + (registered-classes (registry) :cl-deck-builder2.models.ygoprodeck.classes))) + (lst '())) + (with-connection (db) + (with-transaction + (dolist (class class-list lst) + (push (list class (mito:count-dao class)) lst)))))) + +;; If you have altnerative artwork and you are the main card, youll get a list with length > 1 +;; If you have alternative artwork and you are an alternative artwork card, you'll get the main list with length 1 +(defmethod has-alternative-artwork ((id integer)) + (find-dao 'ygo-alternative-artwork :passcode-id id)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; So in the CSV importer I had a function PRE-SEED-DB-ITEMS that +;; would copy CC-ITEM x5 VARIANT-CONDITION to seed something like 250k +;; items in the db. We're just going to duplicate the logic here. +;; +;; INPUT: (select-dao 'ygo-set) +(defun pre-seed-db-items (ygo-sets) + (let ((variants (select-dao 'variant-condition))) + (with-connection (db) + (with-transaction + (dolist (itm ygo-sets) + (dolist (variant variants) + (mito:create-dao 'ygo-set-item :item-id (mito:object-id itm) + :variant-id (mito:object-id variant)))) + (mito:count-dao 'ygo-set-item))))) + +(defun set-ygo-set-item-qty (amt) + "Helper function. Set the QTY of every YGO-SET-ITEM to AMT." + (with-connection (db) + (with-transaction + (mito:execute-sql + (sxql:update (sxql:make-sql-symbol + (mito.class.table:table-name + (find-class 'ygo-set-item))) + (sxql:set= :qty amt)))))) diff --git a/src/models/ygoprodeck.lisp b/src/models/ygoprodeck.lisp new file mode 100644 index 0000000..41e47a2 --- /dev/null +++ b/src/models/ygoprodeck.lisp @@ -0,0 +1,38 @@ +#| + +src/models/ygoprodeck.lisp + +Yu-Gi-Oh! Pro Deck JSON Importer v1 + +Looks like this is old/outdated code and due to be deleted soon! + +|# + +(in-package #:cl-deck-builder2.models.ygoprodeck) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; These models correspond to the YGOProDeck JSON dump. API Guide: +;; https://ygoprodeck.com/api-guide/ +(defclass ygo-info () + ((desc :accessor ygo-description-of :col-type :text) + (frame-type :accessor ygo-frame-type-of :col-type :text) + (type :accessor ygo-type-of :col-type :text) + (passcode :accessor ygo-passcode-of :col-type :integer) + (name :accessor name-of :col-type :text) + (race :accessor ygo-race-of :col-type :text) + (archetype :accessor ygo-archetype-of :col-type (or :text :null)) + (attribute :accessor ygo-attribute-of :col-type (or :text :null)) + (linkmarkers :accessor ygo-linkmarkers-of :col-type (or :text :null)) + (atk :accessor ygo-atk-of :col-type (or :integer :null)) + (def :accessor ygo-def-of :col-type (or :integer :null)) + (level :accessor ygo-level-of :col-type (or :integer :null)) + (linkval :accessor ygo-linkval-of :col-type (or :integer :null)) + (scale :accessor ygo-scale-of :col-type (or :integer :null))) + (:metaclass registered-table-class)) + +;; banlist_info +;; card_images +;; card_prices +;; card_sets +;; jq '.[][]|{card_sets}|select( .card_sets != null )|.[][]' cardinfo.php + diff --git a/src/toolkit/git.lisp b/src/toolkit/git.lisp new file mode 100644 index 0000000..9112a42 --- /dev/null +++ b/src/toolkit/git.lisp @@ -0,0 +1,70 @@ +#| + +src/toolkit/git.lisp + +Tools For Working with git repository information + +e.g. commit id, commit author, message, date, etc. + +TODO Use INFERIOR-SHELL? Turns out it just calls UIOP:RUN-PROGRAM... + +|# + +(in-package #:cl-deck-builder2.toolkit.git) + +(defparameter *git-directory* + (relative-pathname ".git") + "The base path to the directory we run git in during UIOP:RUN-PROGRAM.") + +(defparameter +git-binary+ + (format nil "git --no-pager --git-dir ~a" *git-directory*) + "The full git command line, with *GIT-DIRECTORY* passed in already. What could go wrong?") + +(defparameter +git-log+ + (concatenate 'string + +git-binary+ + " log --format=\"%h%nAuthor: %an%nDate: %cD%n%s%n%b%n----\"") + "Full command line to git log.") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun git-revision () + "Query git rev-parse for the current HEAD revision id." + (let ((command + (concatenate 'string + +git-binary+ + " rev-parse --short HEAD"))) + (string-trim '(#\Newline) + (uiop:run-program command :output :string :error-output nil)))) + +(defun git-log () + "Query git log into a somewhat parseable format." + (cl-ppcre:split + "\\n+----\\n" + (uiop:run-program +git-log+ :output :string))) + +;; Not terrible... +(defun parse-git-log (msg) + "Split the output of GIT-MESSAGES-LIST into an actual LIST. + +ARGUMENTS +MSG The output of GIT-MESSAGES-LIST. + +SEE GIT-LOG" + (let ((state :in-commit) + (c '())) + (loop for line in (split-sequence:split-sequence #\Newline msg) do + (case state + (:in-commit (setf (getf c :commit) line + state :in-author)) + (:in-author (setf (getf c :author) line + state :in-date)) + (:in-date (setf (getf c :date) line + state :in-subject)) + (:in-subject (setf (getf c :subject) line + state :in-message)) + (:in-message (setf (getf c :message) + (format nil "~a~a~%" + (getf c :message "") + line))))) + c)) diff --git a/src/toolkit/money.lisp b/src/toolkit/money.lisp new file mode 100644 index 0000000..18a7db9 --- /dev/null +++ b/src/toolkit/money.lisp @@ -0,0 +1,62 @@ +#| + +Money Stuff + +Storing Floating Point values in an SQL database is *BAD*!: + + CL-DECK-BUILDER2> (with-connection (db) + (mito:retrieve-by-sql + (sxql:select ((:as 0.005 :real))))) + ((:REAL 0.004999999888241291d0)) + +So I'm taking expert's advice and storing money as a fixed point integer with 100 divisions (cents). + +Deflate: Mito -> RDBMS + +Now with test suite! + +|# + +(in-package #:cl-deck-builder2.toolkit.money) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defgeneric currency-deflate (obj) + (:documentation "CURRENCY-DEFLATE takes a NUMBER or a STRING and converts it into a fixed point number. + + ;; One Half Dollar / $0.50 / 50 Cents / These are all the same thing + (CURRENCY-DEFLATE 1/2) => 50 + (CURRENCY-DEFLATE 0.50) => 50 + (CURRENCY-DEFLATE 0.5d0) => 50 + (CURRENCY-DEFLATE \"1/2\") => 50 + (CURRENCY-DEFLATE \"0.50\") => 50 + (CURRENCY-DEFLATE \"0.5d0\") => 50 + + ;; One Dollar / $1.00 / 100 Cents / These are all the same thing + (CURRENCY-DEFLATE 1) => 100 + (CURRENCY-DEFLATE 1.00) => 100 + (CURRENCY-DEFLATE 1.0d0) => 100 + (CURRENCY-DEFLATE \"1\") => 100 + (CURRENCY-DEFLATE \"1.00\") => 100 + (CURRENCY-DEFLATE \"1.0d0\") => 100 + + ;; Ten Dollars / $10.00 / 1000 Cents / These are all the same thing + (CURRENCY-DEFLATE 10) => 1000 + (CURRENCY-DEFLATE 10.00) => 1000 + (CURRENCY-DEFLATE 10.0d0) => 1000 + (CURRENCY-DEFLATE \"10\") => 1000 + (CURRENCY-DEFLATE \"10.00\") => 1000 + (CURRENCY-DEFLATE \"10.0d0\") => 1000") + (:method ((number number)) + ;; CEILING or FLOOR? + (ceiling (* 100 number))) + (:method ((string string)) + (currency-deflate + (read-from-string + (if (eq (char string 0) #\$) + (subseq string 1) + string))))) + +(defgeneric currency-inflate (obj) + (:documentation "CURRENCY-INFLATE takes a NUMBER and converts it into a STRING representation of the fixed point amount of cents (100 cents per dollar) into \"$DD.CC\" format.") + (:method ((number number)) + (format nil "~$" (float (/ number 100))))) diff --git a/src/toolkit/packages.lisp b/src/toolkit/packages.lisp new file mode 100644 index 0000000..362b4fb --- /dev/null +++ b/src/toolkit/packages.lisp @@ -0,0 +1,62 @@ +(in-package #:cl-user) + +(defpackage #:cl-deck-builder2.toolkit.paths + (:use #:cl) + (:import-from #:cl-deck-builder2.config + #:*public-directory* + #:*static-directory*) + (:export #:relative-pathname + #:public-pathname + #:static-pathname + #:ygo-pathname + + #:image-files-list + #:make-static-filename-kind + #:probe-file-list + #:probe-image-files-list + #:relative-file-list + #:static-probe-file-list + #:ydk-rename-files + #:ygo-probe-file-list + #:random-pathname-name)) + +;; #:CL-DECK-BUILDER2.TOOLKIT.GIT depends on #:CL-DECK-BUILDER2.TOOLKIT.PATHS +(defpackage #:cl-deck-builder2.toolkit.git + (:use #:cl) + (:import-from #:cl-deck-builder2.toolkit.paths + #:relative-pathname) + (:export #:git-revision + #:parse-git-log + #:git-log)) + +(defpackage #:cl-deck-builder2.toolkit.money + (:use #:cl) + (:export #:currency-inflate + #:currency-deflate)) + +(defpackage #:cl-deck-builder2.toolkit.time + (:use #:cl) + (:export #:generate-status-report)) + +(defpackage #:cl-deck-builder2.toolkit.utils + (:use #:cl) + (:export #:grouped + #:normalize-newlines + #:strip-bom + + #:query-param + #:generate-pages + #:get-opposite-direction + + #:rle-encode + #:rle-encode-plist + #:rle-decode + #:latex-escape)) + +(uiop:define-package #:cl-deck-builder2.toolkit + (:use #:cl) + (:use-reexport #:cl-deck-builder2.toolkit.git + #:cl-deck-builder2.toolkit.money + #:cl-deck-builder2.toolkit.paths + #:cl-deck-builder2.toolkit.time + #:cl-deck-builder2.toolkit.utils)) diff --git a/src/toolkit/paths.lisp b/src/toolkit/paths.lisp new file mode 100644 index 0000000..7a15fe8 --- /dev/null +++ b/src/toolkit/paths.lisp @@ -0,0 +1,149 @@ +#| + +src/toolkit/paths.lisp + +Utilities For Working With Directories, Files, Paths, etc. + +|# + +(in-package #:cl-deck-builder2.toolkit.paths) + +;;;; Code for munging paths and finding files at paths and renaming +;;;; files and that sort of thing. + +(defvar +ygoprodeck-images-root+ + (merge-pathnames #P"ygoprodeck/" *public-directory*) + "The path to where the web server can display YGOProDeck images.") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun probe-file-list (seq defaults) + "PROBE-FILE-LIST wille apply PROBE-FILE to every file in SEQ. + +It appears we also do some MERGE-PATHNAMES trickery." + (mapcar (lambda (filename) + (probe-file + (merge-pathnames filename defaults))) + seq)) + +(defun relative-file-list (seq &key (type "jpg")) + "RELATIVE-FILE-LIST takes a LIST of files and transforms them into data that can be presented on the web interface, e.g. for A HREF URLs. + +RELATIVE is in the title because we use PATHNAME-NAME to strip out any directory components on elements of SEQ. + +ARGUMENTS: +SEQ A LIST of files. +DEFAULTS This is passed as the defaults argument to MERGE-PATHNAMES. + +SEE STATIC-RELATIVE-FILE-LIST +SEE YGO-RELATIVE-FILE-LIST" + (mapcar (lambda (file) + (make-pathname :name file :type type)) + (mapcar #'pathname-name seq))) + +(defun static-probe-file-list (seq) + "STATIC-PROBE-FILE-LIST takes a LIST of Yu-Gi-Oh! passcodes and transforms them into data that can be presented on the web interface,e.g. for A HREF URLs. + +STATIC-PROBE-FILE-LIST takes a LIST of files and transforms them into data that can be presented on the web interface, e.g. for A HREF URLs. We use *PUBLIC-DIRECTORY* as the root directory for the output. + +ARGUMENTS: +SEQ A LIST of files. + +SEE RELATIVE-FILE-LIST" + (probe-file-list seq + (relative-pathname *public-directory*))) + +(defun ygo-probe-file-list (seq) + "YGO-RELATIVE-FILE-LIST takes a LIST of Yu-Gi-Oh! passcodes and transforms them into data that can be presented on the web interface,e.g. for A HREF URLs. + +ARGUMENTS: +SEQ A LIST of files. + +SEE RELATIVE-FILE-LIST" + (probe-file-list + (relative-file-list (mapcar #'princ-to-string seq) :type "jpg") + (relative-pathname +ygoprodeck-images-root+))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun make-static-filename-kind (pathname-name maybe-list &key (type "jpg")) + "We use UIOP:ENSURE-LIST so this may be called with one LIST argument. + +TODO That seems kinda hacky to me." + (merge-pathnames + (make-pathname :name (format nil "~A-~{~A~^-~}" + pathname-name + (uiop:ensure-list maybe-list)) + :type type) + *public-directory*)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Get the files from the file system .. so sloppy ... +(defun image-files-list (name) + (mapcar + (lambda (kind) + (make-static-filename-kind name kind)) + '("MAIN" "EXTRA" "SIDE" "MAIN-EXTRA" "MAIN-SIDE" "FINAL"))) + +(defun probe-image-files-list (name &optional (strip t)) + (let* ((pathname *public-directory*) + (len (length (namestring pathname)))) + (remove + NIL + (mapcar + (lambda (path) + (if (probe-file path) + (if strip + (subseq (namestring path) len) + path))) + (image-files-list name))))) + +;; TODO UIOP:ENOUGH-PATHNAME + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; This had to be here, in WEB package probably, because YDK depends +;; on TOOLKIT so it can't go in TOOLKIT because it depends on YDK: it +;; uses YDK-NAME-OF. Perhaps I could pass just a name into this and +;; make it deck agnostic. +;; +;; Okay I've done exactly that. +(defun ydk-rename-files (old-name new-name) + "Rename the files from DECK if there are any files according to PROBE-IMAGE-FILES-LIST. + +If there are images, NEW-NAME will replace the PATHNAME-NAME of the old images." + (let* ((old-files (probe-image-files-list old-name nil)) + (new-files + (mapcar (lambda (path) + (merge-pathnames + (make-pathname :name path :type "jpg") *public-directory*)) + (mapcar (lambda (old-path) + (cl-ppcre:regex-replace-all old-name (pathname-name old-path) new-name)) + old-files)))) + ;; (format t "
      ~a
      " (mapcar #'list old-files new-files)))) + (mapcar (lambda (pair) + (when (probe-file (car pair)) + (rename-file (car pair) (cadr pair)))) + (mapcar #'list old-files new-files)))) + +(defun relative-pathname (name) + (asdf:system-relative-pathname :cl-deck-builder2 name)) + +(defun public-pathname (name) + (merge-pathnames name *public-directory*)) + +(defun static-pathname (name) + (merge-pathnames name *static-directory*)) + +(defun ygo-pathname (name) + (merge-pathnames name +ygoprodeck-images-root+)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Was originally from files.lisp + +(defun digest-file-string (digest-spec pathspec &rest args) + (format nil "~{~x~}" + (coerce (apply #'ironclad:digest-file digest-spec pathspec args) + 'list))) + +;; (random-filename (pathname-type pathspec)) => uuid.type +(defun random-pathname-name (&key type) + (let ((uuid (uuid:print-bytes nil (uuid:make-v4-uuid)))) + (format nil "~a~@[.~a~]" uuid type))) diff --git a/src/toolkit/time.lisp b/src/toolkit/time.lisp new file mode 100644 index 0000000..47c4d98 --- /dev/null +++ b/src/toolkit/time.lisp @@ -0,0 +1,89 @@ +;; I noticed I've been doing a lot of work with time. This is time +;; helpers. + +(in-package #:cl-deck-builder2.toolkit.time) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun time-format (when &optional (format local-time:+rfc3339-format+)) + (local-time:format-timestring nil when :format format)) + +(defun time-format/date-only (when) + (time-format when local-time:+rfc3339-format/date-only+)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun day- (when &optional (amount 1)) + "Subtract AMOUNT days from WHEN." + (local-time:timestamp- when amount :day)) + +(defun day+ (when &optional (amount 1)) + "Add AMOUNT days to WHEN." + (local-time:timestamp+ when amount :day)) + +(defun month- (when &optional (amount 1)) + "Subtract AMOUNT months from WHEN." + (local-time:timestamp- + (local-time:timestamp- when amount :month) + local-time:+seconds-per-day+ :sec)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun time-now () + "Today's date, passed through FORMAT-DMY." + (local-time:now)) + +(defun time-yesterday () + "Yesterday's date, passed through FORMAT-DMY." + (day- (time-now))) + +;; TODO Why am I using this? +(defun time-first-of-month () + "The first day of this month." + (local-time:timestamp-minimize-part + (time-now) :day)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun n-month-list (&key (when (time-now)) (start 1) (n 6)) + "Produce a LIST of the last N months, using WHEN as the reference point. +The values iterate numerically from START, that is, the result will be length N - START. +The date will be on the first of each month, in chronological order." + (mapcar (lambda (n) + (month- when n)) + (loop for i from start upto n collect i))) + +(defun n-day-list (&key (when (time-now)) (start 0) (n 5)) + "Produce a LIST of the last N days, using WHEN as a reference point. +The values will iterate numerically from START, that is, the result will be length N - START. +The exact times will not be modified. The results will be in chronological order." + (mapcar (lambda (n) + (day- when n)) + (loop for i from start upto n collect i))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun time-friday (&key (when (time-now))) + (local-time:adjust-timestamp + when + (offset :day-of-week :friday))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun format-status-report (&key (stream *standard-output*) (when (time-friday))) + (let ((date-str (time-format/date-only when)) + (day-map (reverse + (mapcar #'time-format/date-only (n-day-list :when when :n 4))))) + (format stream + "#+TITLE: Status Report: Week of ~A~%~%* Status Report: ~ +Week of ~A~%~%Total hours: 40 h.~%~%~{** ~A~%~%Hours: 0800A-1600P (8h)~%~%~}" + date-str date-str day-map))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defparameter *status-report-base-dir* + (probe-file #P"~/code/cl-deck-builder2/doc/status-report/")) + +(defun generate-status-report (&key (when (time-friday))) + (let ((filespec (merge-pathnames + (format nil "~a.org" (time-format/date-only when)) + *status-report-base-dir*))) + (with-open-file (f filespec + :direction :output + :if-exists :error + :if-does-not-exist :create) + (format-status-report :stream f :when when) + (probe-file filespec)))) diff --git a/src/toolkit/utils.lisp b/src/toolkit/utils.lisp new file mode 100644 index 0000000..28a670d --- /dev/null +++ b/src/toolkit/utils.lisp @@ -0,0 +1,141 @@ +;;;; src/toolkit/toolkit.lisp + +(in-package #:cl-deck-builder2.toolkit.utils) + +;; https://stackoverflow.com/a/11965885 +;; def grouped(l, n): +;; for i in xrange(0, len(l), n): +;; yield l[i:i+n] + +(defun grouped (seq &optional (n 1000)) + "Group elements in a list by some number of elements. + +ARGUMENTS +SEQ The sequence to be grouped. +N The number of elements per grouping." + (loop :for i :upto (1- (length seq)) :by n + :collect (subseq seq i (min (length seq) + (+ i n))))) + +;; Not sure how I arrived at this gist. +;; +;; +;; +;; My code is modified slightly. +(defun normalize-newlines (string) + "Remove or replace #\Return(#\Newline)? sequences with just #\Newline. + +The \#Newline following #\Return is optional, so just #\Return also gets turned into #\Newline. + +ARGUMENTS +STRING The target string." + (ppcre:regex-replace-all + (format nil "~C(\\n)?" #\Return) + string + (format nil "~C" #\Newline))) + +;; Is this necessary? I uploaded a file with a BOM and it exploded. +(defun strip-bom (string) + "If STRING is UTF-8 and contains a UTF-8 BOM it will be removed. + +ARGUMENTS +STRING The string to check." + + (when string + (case (type-of (char string 0)) + (extended-char (subseq string 1)) + (t string)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun query-param (name parsed) + "Parse query param values. Get the value of the specified element NAME in the query PARSED. + +ARGUMENTS +NAME The query to search for in the parameter list. +PARSED The parameter list." + ;; TODO STRING=? STRING-EQUAL?? Maybe I should add a &KEY (test #'STRING=)? + (assoc-utils:aget parsed name)) + +;; (defun generate-pages () +;; "Generate pagination" +;; (let ((pages nil)) +;; (dotimes (i 10) +;; (push (list :id (+ 1 i) :start (* 10 i)) pages)) +;; (reverse pages))) + +;; TODO Passing weird floats to this. How can I put the weird math into here? +;; +;; I made it into a helper function for now. +;; No idea how to even explain this. It works! +(defun generate-pages-helper (start &optional (max 10) (multiplier 10)) + "Generate pagination up to MAX pages, with MULTIPLIER items per page." + ;; We always want 10 pages. If we start at page 0, subtract five, + ;; then take the nearest lowest non-negative integer (0), this gets + ;; us a comfy left bound. + (let ((start- (- start 5))) + ;; If START- is less than zero, make it zero. This gives us a safe + ;; left bound. + (when (< start- 0) + (setf start- 0)) + (loop for i from 0 upto (1- (min (min max 8) (- max start -8))) collect + `(:id ,(+ start- i) :offset ,(* multiplier (+ start- i)))))) + +(defun generate-pages (length offset &optional (limit 10)) + "Generate pagination for LENGTH number of pages, with LIMIT number of items per page, offset into the list by OFFSET number of pages. + +ARGUMENTS +LENGTH The length of the array we're generating pages for. +OFFSET The starting index. +LIMIT The number of entries per page. Default is 10." + (generate-pages-helper (floor (/ offset limit)) + (ceiling (/ length limit)) + limit)) + +(defun get-opposite-direction (direction) + "Get the opposite direction" + (if (string= direction "asc") + "desc" + "asc")) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Idea for RLE from PCL by Paul Graham +;; This implementation based on +;; +;; Nope it's not I wrote my own implementation! +(defun rle-encode (lst &key (key #'identity) (test #'eq)) + (loop for line in (mapcar key (remove-duplicates lst :key key :test test)) + collect (cons (count line lst :key key :test test) line))) +;; (sort * ;#'> :key #'car)) + +(defun rle-decode (lst) + (loop for line in lst + nconc (make-list 3 :initial-element (second line)))) + +;; XXX Where does this go? +(defun rle-encode-plist (plist &key (key #'identity) (test #'eq)) + (rle-encode + (mapcar (lambda (plist) + (setf (getf plist :name) + (princ-to-string (getf plist :name))) + plist) + plist) + :key key :test test)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; For The Label Maker +;; https://tex.stackexchange.com/a/119383 +(defun latex-escape (s) + (cl-ppcre:regex-replace-all + "(\\\\backslash)" + (cl-ppcre:regex-replace-all + "~" + (cl-ppcre:regex-replace-all + "(\\^)" + (cl-ppcre:regex-replace-all + "([\$\#&%_{}])" + (cl-ppcre:regex-replace-all "\\" s "\\backslash") + "\\\\\\1") + "\\\\\\1{}") + "\\\\texttt{\\~{}}") + "$\\1$")) + diff --git a/src/view.lisp b/src/view.lisp new file mode 100644 index 0000000..d9d9f09 --- /dev/null +++ b/src/view.lisp @@ -0,0 +1,75 @@ +(in-package :cl-user) + +(defpackage #:cl-deck-builder2.view + (:use #:cl) + (:import-from #:cl-deck-builder2.config + #:*template-directory*) + (:import-from #:cl-deck-builder2.i18n + #:with-locale) + (:import-from #:caveman2 + #:*response* + #:response-headers) + (:import-from #:djula + #:add-template-directory + #:compile-template* + #:render-template* + #:*djula-execute-package*) + (:import-from #:datafly + #:encode-json) + (:export #:render + #:render-json) + (:documentation "The VIEW package. + +We just use the defaults generated by Caveman2. + +It provides rendering functions for web view. + +Additionally, we have i18n support with gettext.")) + +(in-package :cl-deck-builder2.view) + +(djula:add-template-directory *template-directory*) + +(defparameter *template-registry* (make-hash-table :test 'equal) + "Hash table of registered templates. Used for caching.") + +(defun render (template-path &optional env (lang "en_US")) + "Use Djula to render a template." + (let ((template (gethash template-path *template-registry*))) + (unless template + (setf template (djula:compile-template* (princ-to-string template-path))) + (setf (gethash template-path *template-registry*) template)) + (with-locale (lang) + (apply #'djula:render-template* template nil env)))) + +(defun render-json (object) + "Use Datafly to render a JSON object." + (setf (getf (response-headers *response*) :content-type) "application/json") + (encode-json object)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Execute package definition + +(defpackage #:cl-deck-builder2.djula + (:use :cl) + (:import-from :cl-deck-builder2.config + :config + :appenv + :developmentp + :productionp) + (:import-from :caveman2 + :url-for) + (:documentation "The package in which template expressions are evaluated. + +SEE ")) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(setf djula:*djula-execute-package* (find-package :cl-deck-builder2.djula)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(in-package #:djula) + +(djula:def-filter :describe (it) + (with-output-to-string (s) (describe it s))) diff --git a/src/web/builder.lisp b/src/web/builder.lisp new file mode 100644 index 0000000..85164b1 --- /dev/null +++ b/src/web/builder.lisp @@ -0,0 +1,351 @@ +#| + +src/web/builder.lisp + +"The Deck Builder" + +I figure we can also put YDK stuff here since they sorta do the +same thing. Since CSV import comes from Crystal Commerce I've left +that in the crystal-commerce file. + +"The old one used to just have a list of cards, and you would +click it, and add it to the deck." + - Yuki, ~July 2023 + +TODO I think some of these modules are going to have conflicting +names, e.g. RENDER-SAVED-DECK-LIST and SAVED-DECK-LIST ... Maybe +I ought to start packaging this up. + +|# + +(in-package #:cl-deck-builder2.web) + +;; TODO Not in use yet. +;; I really should be using https://github.com/40ants/reblocks +(defclass builder-session () + ((current-deck :accessor builder-session-current-deck + :initform (make-instance 'ydk) + :initarg :deck)) + (:documentation "A BUILDER-SESSION encapsulates a deck building session.")) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defparameter *current-deck* (make-instance 'ydk) + "An instance of YDK that the builder uses as a working region.") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun render-current-deck-list () + "Helper function. Render the current deck list from *CURRENT-DECK*. + +The HTMX JS in the builder is what this gets output to." + + (let ((deck-info (ydk-query *current-deck*))) + ;; No Deck info? Just return an empty list. + (render-with-env #P"builder/current-deck-list.html" + `(:active "/builder" + :deck-id ,(ignore-errors (ydk-id-of *current-deck*)) + :main-deck ,(ignore-errors (getf deck-info :main-deck)) + :extra-deck ,(ignore-errors (getf deck-info :extra-deck)) + :side-deck ,(ignore-errors (getf deck-info :side-deck)))))) + +(defun render-saved-deck-list (&optional id) + "Helper function. Render the saved deck list from SAVED-DECK-LIST." + (render-with-env #P"builder/saved-deck-list.html" + `(:active "/builder" + :current-deck-id ,(ignore-errors + (ydk-id-of *current-deck*)) + :id ,id + :saved-deck-list ,(select-ydk-deck)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Index route +(defroute ("/builder" :method :GET) (&key _parsed) + "The builder home page. The *CURRENT-DECK* is used as a temporary workspace to create a YDK style deck listing." + (v:info :builder "GET /builder => ~a" _parsed) + + (with-logged-in-user + (render-results :active "/builder" + :class 'ygo-info + :params _parsed + :tpl #P"builder/index.html"))) + +(defroute ("/builder/current-deck-list" :method :GET) () + "The endpoint for RENDER-CURRENT-DECK-LIST. + +TODO This should be re-written as a Redblocks Widget." + + ;; Haha, I moved the hack somewhere else. Now it's somebody elses + ;; problem. I actually think I fixed the hack. This comment stays + ;; for now. + (with-logged-in-user + (render-current-deck-list))) + +(defroute ("/builder/saved-deck-list" :method :GET) () + "The endpoint for RENDER-SAVED-DECK-LIST. + +TODO This should be re-written as a Redblocks Widget." + (with-logged-in-user + (render-saved-deck-list))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Search route +(defroute ("/builder/search" :method :POST) (&key _parsed) + "Main deck builder card search route. Will return a list of data from YGOProDeck. Now souped up and using an ALIST to pass parameters around." + (v:info :builder "POST /builder/search => ~a~%" _parsed) + + (with-logged-in-user + (render-results :active "/builder" + :class 'ygo-info + :params _parsed + :tpl #P"builder/search-results.html"))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; POST ROUTES +;; +;; TODO Review Logic +;; +;; Always Extra, then Side +;; "fusion" +;; "link" +;; "ritual" +;; "synchro" +;; "xyz" +;; "fusion_pendulum" +;; "ritual_pendulum" +;; "synchro_pendulum" +;; "xyz_pendulum" +;; +;; TODO Pretty Gnarly! +(defroute ("/builder/add/:passcode" :method :POST) (&key passcode _parsed) + "Try to add PASSCODE to *CURRENT-DECK*. + +TODO Parameters: PASSCODE DECK" + (v:info :builder "POST /builder/add/~d => ~a" passcode _parsed) + + ;; Clumsily enforce login + (unless (logged-in-p) + (_ "Oops")) + + (let ((passcode (ignore-errors + (parse-integer passcode))) + (target-deck (alexandria:make-keyword + (string-upcase + (or + (query-param "deck" _parsed) + "MAIN"))))) + (when passcode + (let* ((card-info (ygo-select-info-by-passcode passcode)) + (frame-type (ygo-frame-type-of card-info))) + (labels ((is-special (frame-type) + (or + ;; First check what kind of monster it is + (string= "fusion" frame-type) + (string= "link" frame-type) + ;; Ritual cards go in the main deck... + ;; (string= "ritual" frame-type) + (string= "synchro" frame-type) + (string= "xyz" frame-type) + (string= "fusion_pendulum" frame-type) + ;; (string= "ritual_pendulum" frame-type) + (string= "synchro_pendulum" frame-type) + (string= "xyz_pendulum" frame-type))) + (try-add (frame-type passcode target-deck) + (v:info :builder "TRY-ADD ~a ~a ~a" frame-type passcode target-deck) + (cond ((is-special frame-type) + ;; It's a Special Summon - try to add it to the Extra Deck, then Side Deck. + (cond ((< (length (ydk-extra-deck-of *current-deck*)) +extra-deck-card-limit+) + ;; Add to extra deck + (ydk-add *current-deck* :extra passcode)) + ((< (length (ydk-side-deck-of *current-deck*)) +extra-deck-card-limit+) + ;; Add to side deck + (ydk-add *current-deck* :side passcode)) + (t (v:info :builder (_ "Deck ~a has too many cards~%") (ydk-name-of *current-deck*))))) + ;; So if we get here theoretically the card shouldn't be a "Special Summon" + ((and (eq target-deck :main) + (< (length (ydk-main-deck-of *current-deck*)) +main-deck-card-limit+)) + ;; Add to main deck + (ydk-add *current-deck* target-deck passcode)) + ((and (eq target-deck :extra) + (< (length (ydk-extra-deck-of *current-deck*)) +extra-deck-card-limit+) + (not (equal frame-type "ritual"))) + ;; Add to extra deck + (ydk-add *current-deck* target-deck passcode)) + ((and (eq target-deck :side) + (< (length (ydk-side-deck-of *current-deck*)) +extra-deck-card-limit+) + (not (equal frame-type "ritual"))) + ;; Add to side deck + (ydk-add *current-deck* target-deck passcode))))) + ;; TODO Where should we validate deck constrains? Here or ADD? + ;; For now we'll do it here. + (if (< (count passcode (ydk-concatenate *current-deck*)) 3) + ;; There *are* fewer than three of this card in the deck... + (try-add frame-type passcode target-deck) + (flash-error (format nil (_ "Deck ~a has too many cards~%") (ydk-name-of *current-deck*)))))) + (setf (getf (response-headers *response*) :HX-Trigger) "deck-list-changed") + (render-current-deck-list)))) + +(defroute ("/builder/remove" :method :POST) (&key _parsed) + "Try to remove PASSCODE from *CURRENT-DECK*. + +TODO Parameters: PASSCODE DECK" + (v:info :builder "POST /builder/remove => ~a" _parsed) + + (let ((index (query-param "index" _parsed)) + (deck (query-param "deck" _parsed))) + (handler-case + (ratify:with-parsed-forms + ((:integer index) + (:string deck)) + (ydk-delete-index *current-deck* (alexandria:make-keyword (string-upcase deck)) index) + (setf (getf (response-headers *response*) :HX-Trigger) "deck-list-changed")) + (ratify:combined-error (e) + (flash-error (princ-to-string e)) + (redirect "/builder" 302)))) + + (render-current-deck-list)) + +(defroute ("/builder/clear" :method :POST) () + "Clear the *CURRENT-DECK* of any cards using YDK-CLEAR." + (ydk-clear *current-deck*) + (render-current-deck-list)) + +(defroute ("/builder/create" :method :POST) (&key _parsed) + "Create a new deck. This will preserve some information from *CURRENT-DECK*, giving it a new name, and immediately synchronising it to the database. You may use the CLEAR route to erase the deck." + (v:info :builder "POST /builder/create => ~a" _parsed) + + (let ((name (query-param "deck-create-name" _parsed))) + (handler-case + (ratify:with-parsed-forms + ((:string name)) + (let ((found (ydk-deck-by-name name))) + (if found + ;; The deck already exists + (progn + (flash-message + (format nil (_ "Deck ~a already exists in database; loading...") name)) + (setf *current-deck* (ydk-sync found))) + (progn + (flash-message + (format nil (_ "Creating deck ~a into database.") name)) + (setf *current-deck* + (make-instance 'ydk + :name name + :created-by (user-name) + :main-deck (ydk-main-deck-of *current-deck*) + :extra-deck (ydk-extra-deck-of *current-deck*) + :side-deck (ydk-side-deck-of *current-deck*))) + ;; Sync it to the database to save it to the + ;; names list - doesn't matter if it has no + ;; cards in it. + (let ((new (ydk-sync *current-deck*))) + (when new + (setf (ydk-id-of *current-deck*) + (mito:object-id new)))))))) + (ratify:combined-error (e) + (flash-error e)))) + + (render-saved-deck-list)) + +(defroute ("/builder/delete" :method :DELETE) (&key _parsed) + "Delete the deck specified by DECK-CREATE-NAME in the HTML. + +TODO Parameters: NAME The name of the deck to use YDK-DECK-DELETE-BY-NAME on." + (v:info :builder "DELETE /builder/delete => ~a" _parsed) + + (let ((name (query-param "deck-create-name" _parsed))) + (handler-case + (ratify:with-parsed-forms + ((:string name)) + (ydk-deck-delete-by-name name)) + (ratify:combined-error (e) + (flash-error e)))) + + (render-saved-deck-list)) + +(defroute ("/builder/save" :method :POST) () + "Save *CURRENT-DECK* to the database using YDK-SYNC. Return an updated deck listing with RENDER-CURRENT-DECK-LIST." + (v:info :builder "POST /builder/save") + + (v:info :builder "~a" (ydk-sync *current-deck*)) + + (render-current-deck-list)) + +(defroute ("/builder/load" :method :POST) (&key _parsed) + "Load Deck POST Route. Load ID into *CURRENT-DECK*." + (v:info :builder "POST /builder/load => ~a" _parsed) + + (let ((id (query-param "deck-load-id" _parsed))) + (handler-case + (ratify:with-parsed-forms + ((:integer id)) + (let ((found (ydk-deck-by-id id))) + (when found + (setf *current-deck* (ydk-sorted (ydk-sync found))) + (flash-message + (format nil (_ "Found entry ~A (~d); loading...~%") + (ydk-name-of found) (mito:object-id found)))))) + (ratify:combined-error (e) + (flash-error e)))) + + (render-current-deck-list)) + +(defroute ("/builder/rename" :method :POST) (&key _parsed) + "Try to rename a deck. Rename Deck ID to DECK-CREATE-NAME. + +TODO There is other code to rename, isn't there? It looks like that code is inteded to be used from the Deck Overview page. This is just in the builder." + (v:info :builder "POST /builder/rename => ~a" _parsed) + + (let ((create-name (query-param "deck-create-name" _parsed)) + (id (query-param "deck-load-id" _parsed))) + ;; We want to change the name of LOAD-NAME to CREATE-NAME. + (handler-case + (ratify:with-parsed-forms + ((:integer id)) + (let ((found (ydk-deck-by-id id))) + (ydk-rename-deck found create-name) + (flash-message + (format nil (_ "Found entry ~A (~d); renaming to ~a.~%") + (ydk-name-of found) id create-name)))) + (ratify:combined-error (e) + (flash-error e)))) + + (render-saved-deck-list)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Since we're doing this in a builder context I thought it would be +;; better to do this here than at /category/saved-category-list as +;; that seemed a bit redundant. Surely there's a better way to +;; organize all this stuff! +(defroute ("/builder/saved-category-list" :method :GET) (&key _parsed) + "Route for rendering the saved category list. + +This is a \"widget\" that we include with Djula, and render separately via HTMX AJAX." + (let ((id (query-param "id" _parsed))) + (handler-case + (ratify:with-parsed-forms + ((:integer id)) + (let ((found (find-dao 'category :id id))) + (if found + (render-category found + :tpl #P"builder/saved-category-list.html")))) + (ratify:combined-error (e) + (flash-error e) + (render-category (find-dao 'category :id (max-dao 'category)) + :tpl #P"builder/saved-category-list.html"))))) + +;; TODO This has got to be better! +(defroute ("/builder/decks-by-cat-id" :method :GET) (&key |id|) + "Saved Deck List helper. Display the saved deck list, and if an |ID| is provided, send that as the current ID." + (with-logged-in-user + (render-with-env #P"builder/saved-deck-list.html" + `(:active "/builder" + :current-deck-id ,(ignore-errors + (ydk-id-of *current-deck*)) + :id ,|id| + :saved-deck-list ,(select-ydk-deck + (if |id| + (sxql:where (:= :category-id |id|)))))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defroute ("/builder/move-to-category" :method :POST) (&key _parsed) + "Move *CURRENT-DECK* into CATEGORY ID. TODO Implement this?" + (v:info :builder "GET /builder/move-to-category => ~a" _parsed)) diff --git a/src/web/cards.lisp b/src/web/cards.lisp new file mode 100644 index 0000000..7f80a71 --- /dev/null +++ b/src/web/cards.lisp @@ -0,0 +1,92 @@ +#| + +src/web/cards.lisp + +Card Browser + +TODO Link To Inventory Item +TODO This needs to be rewritten using YGOProDeck 2 still. + +|# + +(in-package #:cl-deck-builder2.web) + +(defroute ("/cards" :method :GET) (&key _parsed) + "Card Browser Main Route. We use RENDER-RESULTS from `/inventory` URL. + +TODO Cards should probably have their own RENDER-RESULTS. RENDER-CARD?" + (v:info :cards "GET /cards => ~a" _parsed) + + (with-logged-in-user + (render-results :active "/cards" + :class 'ygo-info + :params _parsed + :tpl #P"cards/index.html"))) + +(defroute ("/cards/search" :method :POST) (&key _parsed) + "Card Browser Search POST Route. We also user RENDER-RESULTS here." + (v:info :cards "POST /cards/search => ~a" _parsed) + + (with-logged-in-user + (render-results :active "/cards" + :class 'ygo-info + :params _parsed + :tpl #P"cards/search-results.html"))) + +(defroute ("/cards/:id/view" :method :GET) (&key id) + "View Route for Card ID. We use YGO-SELECT-INFO-BY-ID to get the PASSCODE to get the YGO-SET-BY-PASSCODE." + (v:info :cards "GET /cards/~d/view" id) + + (with-logged-in-user + (handler-case + (ratify:with-parsed-forms + ((:integer id)) + (with-connection (db) + (with-transaction + (let* ((variants (select-variant-condition)) + (ygo-info (ygo-select-info-by-id id)) + (passcode (ygo-passcode-of ygo-info)) + (found (ygo-card-sets passcode))) + (if found + (render-with-env #P"cards/view.html" + `(:ygo-card-sets ,found + :variants ,variants))))))) + (ratify:combined-error (e) + (flash-error (format nil "/cards/~d/view.error => ~a~%" id e)))))) + +(defroute ("/cards/by-passcode/:id" :method :GET) (&key id) + "View YGO-INFO by PASSCODE ID." + (alexandria:if-let ((info (find-dao 'ygo-info :passcode id))) + (redirect (format nil "/cards/~d/view" (mito:object-id info))) + (redirect "/cards"))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; This is bad, but could be better for other things +(defroute ("/cards/:id/image" :method :GET) (&key id) + "Get the card image for card ID. + +TODO Rewrite with templates +TODO This is bad, the way that it's written right now it will take one ID, ideally, this should wrap a list of IDs to save on database bandwidth. Each request triggers a FIND-DAO." + (v:debug :cards "GET /cards/~d/image" id) + + (with-logged-in-user + (handler-case + (ratify:with-parsed-forms + ((:integer id)) + (let ((found (find-dao 'ygo-info :id id))) + (if found + (format nil + "\"Card" + (ygo-passcode-of found) + (ygo-passcode-of found) + (name-of found)))))))) + +(defroute ("/cards/by-passcode/:id/price" :method :GET) (&key id) + "Get the YGO-PRICE info for this PASSCODE ID. The pricing info comes from YGOProDeck." + (with-logged-in-user + (handler-case + (ratify:with-parsed-forms + ((:integer id)) + (let ((found (find-dao 'ygo-price :passcode-id id))) + (render-with-env #P"cards/ygo-price.html" + (list :price found))))))) diff --git a/src/web/category.lisp b/src/web/category.lisp new file mode 100644 index 0000000..583640b --- /dev/null +++ b/src/web/category.lisp @@ -0,0 +1,138 @@ +(in-package #:cl-deck-builder2.web) + +(defparameter *current-category* nil) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun render-category (id &key (tpl #P"category/index.html") env) + "Helper function. Use RENDER-WITH-ENV to display template TPL with environment ENV. + +ID is the CATEGORY we wish to render. + +TODO etypecase? defmethod?" + (let ((found (ignore-errors + (find-dao 'category :id id)))) + (render-with-env tpl + (append env + `(:active "/category" + :category ,found + :categories ,(select-category) + :children ,(ignore-errors (category-full-tree :node.name (category-name-of found))) + :id ,(ignore-errors (mito:object-id found))))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defroute ("/category" :method :GET) (&key _parsed) + "Category Viewer Main Route. + +TODO Parameters: ID The desired CATEGORY ID." + (with-logged-in-user + (render-category (query-param "id" _parsed)))) + +(defroute ("/category/search" :method :POST) (&key _parsed) + "POST Category Search Route. + +TODO Implement this?" + (with-logged-in-user + (render-category (query-param "id" _parsed)))) + +(defroute ("/category/:id/view" :method :GET) (&key id) + "Category Viewer Single Route. + +TODO Parameters: ID The desired CATEGORY ID." + (with-logged-in-user + (render-category id))) + +(defroute ("/category/list" :method :GET) (&key _parsed) + "GET route for the list of categories." + (v:info :web "GET /category/list => ~a" _parsed) + + (with-logged-in-user + (render-category (query-param "id" _parsed)))) + +(defroute ("/category/:id/delete" :method :DELETE) (&key id) + "DELETE a CATEGORY. + +TODO Parameters: ID The ID of the CATEGORY to remove. +TODO Also delete associated deck metadata?" + (v:info :web "DELETE /category/:id/delete" id) + + (handler-case + (ratify:with-parsed-forms + ((:integer id)) + (let ((found (find-dao 'category :id id))) + (when found + (category-delete-tree (category-name-of found)) + (v:info :web "DELETE /category/:id/delete OK" id) + (flash-message (_ "Success!"))))) + (ratify:combined-error (e) + (flash-error e)))) + +(defroute ("/category/:id/rename" :method :POST) (&key id _parsed) + "POST route to RENAME a CATEGORY. + +TODO Parameters: NAME The new name of the CATEGORY. ID of the CATEGORY to be RENAMEd." + (v:info :web "POST /category/~d/rename => ~a" id _parsed) + + (let ((name (query-param "name" _parsed))) + (handler-case + (ratify:with-parsed-forms + ((:integer id) + (:string name)) + (if (category-rename (find-dao 'category :id id) name) + (format nil "OK!") + (format nil "Error!"))) + (ratify:combined-error (e) + (flash-error e))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defroute ("/category/fake-data" :method :GET) () + "Route to generate new fake CATEGORY data. + +TODO Parameters: NAME The name of the new child CATEGORY. ID The parent of the new child CATEGORY." + + (v:info :web "GET /category/fake-data") + (category-insert-fake-data) + (v:info :web "GET /category/fake-data OK")) + +(defroute ("/category/new-parent" :method :POST) (&key _parsed) + "Create a new parent by NAME. We use CATEGORY-INSERT-RIGHT-OF." + (v:info :web "POST /category/new-parent => ~a" _parsed) + + (let ((id (or (query-param "id" _parsed) 0)) + (name (query-param "name" _parsed))) + (handler-case + (ratify:with-parsed-forms + ((:integer id) + (:string name)) + (let ((left-of (ignore-errors + (category-name-of (find-dao 'category :id id))))) + (category-insert-right-of name left-of))) + (ratify:combined-error (e) + (flash-error e))))) + +(defroute ("/category/new-child" :method :POST) (&key _parsed) + "POST route for a new child CATEGORY. + +TODO Parameters: NAME The name of the new child CATEGORY. ID The parent of the new child CATEGORY." + (v:info :web "POST /category/new-child => ~a" _parsed) + + (let ((id (query-param "id" _parsed)) + (name (query-param "name" _parsed))) + (handler-case + (ratify:with-parsed-forms + ((:integer id) + (:string name)) + (let ((left-of (ignore-errors + (category-name-of (find-dao 'category :id id))))) + (category-insert-new-child name left-of) + (format nil "OK!"))) + (ratify:combined-error (e) + (flash-error e))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defroute ("/category/explain" :method :GET) () + "TODO This needs to be incorporated into the documentation." + (with-logged-in-user + (render-with-env #P"category/explain.html" + `(:active "/category" + :categories ,(select-category))))) diff --git a/src/web/constructed-decks.lisp b/src/web/constructed-decks.lisp new file mode 100644 index 0000000..72c0515 --- /dev/null +++ b/src/web/constructed-decks.lisp @@ -0,0 +1,239 @@ +#| + +src/web/construct-decks.lisp + +Web Routes For Construct Decks + +TODO Pick one: /construct/ or /construct/ ? + +Features Requsted: + +- DONE Card Names +- DONE Card Prices - I think we'll need to wire this up to the + YGO-CC-ITEM. That requires rewriting that component to use the new + YGO-SET instead of the CSV. +- DONE Sort by Price - Honestly having trouble sorting this junk lmao! +- Show only YGO-SET-ITEMS with inventory - see constructed-decks.lisp + + +|# + +(in-package #:cl-deck-builder2.web) + +(defparameter *current-constructed-deck* nil) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun render-construct-deck (id tpl) + (with-logged-in-user + (let ((deck (first + (select-constructed-decks + (sxql:where (:= :id id)))))) + (when deck + (render-with-env tpl + (list :active "/construct" + :deck deck + :id (mito:object-id deck) + :name (cl-deck-builder2.models.constructed-decks::deck-name-of deck) + :saved-deck-list (select-constructed-decks))))))) + +;; I think this takes a CAR and a CDR pair of YGO-SET ID and VARIANT ID +;; I'm pretty sure it's supposed to be finding YGO-SET-ITEMs though +(defun selected-sets-to-deck-listing (cards) + (let ((lst '())) + (with-connection (db) + (with-transaction + (dolist (card cards (reverse lst)) + (destructuring-bind (set variant) + card + (let* ((set-id (cdr set)) + (variant-id (cdr variant)) + (set-item (first (ygo-select-set-item set-id variant-id))) + (set (first (ygo-set (sxql:where (:= :id set-id))))) + (variant (mito:find-dao 'variant-condition :id variant-id))) + (with-slots ((passcode-id cl-deck-builder2.models.ygoprodeck.classes::passcode-id)) + set + (push (list :deck-set set + :condition variant + :set-item set-item + :card (ygo-card-by-passcode passcode-id)) + lst))))))))) + +;; XXX Where does this go? What does this accomplish? +(defun select-deck-as-plist (id) + (let ((lst '())) + (dolist (itm (retrieve-dao 'deck-item :deck-id id) (reverse lst)) + (push (list :deck-item itm) lst)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun default-constructed-deck-is-valid-to-pull () + (valid-pull-p + (deck-to-pull-set-items-qty-as-alist *current-constructed-deck*) + (deck-to-pull-desired-qty-as-alist *current-constructed-deck*))) + +(defun default-constructed-deck-invalid-qtys () + (find-any-invalid-qtys + (deck-to-pull-set-items-qty-as-alist *current-constructed-deck*) + (deck-to-pull-desired-qty-as-alist *current-constructed-deck*))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun store-combined-deck-as-current (original-deck selected-listing) + (setf *current-constructed-deck* + (loop for original in (reverse original-deck) + for selected in selected-listing + collect (apply #'make-instance 'constructed-deck-intermediate (append original selected))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; We have to actually pull the inventory. +;; This is the old code but it's written for YDK-DECK object so maybe I'll write one for CONSTRUCTED-DECK-INTERMEDIATE. +(defun pull-from-inventory (cdi-items) + "Attempt to find inventory stock for every card in this deck, and if we are able to secure it, construct and insert a new PULLED-DECK into the database." + (let ((counts (deck-to-pull-desired-qty-as-alist cdi-items))) + (dolist (row counts) + (decf (qty-of (car row)) (cdr row)) + ;; Update each one and save - wrapping this in a transaction causes issues with pulling multiple items. + (save-dao (car row))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defroute ("/construct" :method :GET) () + "Constructed Deck View Main Route. Login Required." + (v:info :construct "GET /construct") + + (with-logged-in-user + (render-with-env #P"construct/index.html" + (list :active "/construct" + :saved-deck-list (select-constructed-decks))))) + +(defroute ("/construct/:id/view" :method :GET) (&key id) + "Constructed Deck View deck by ID Route. Login Required." + (v:info :construct "GET /construct/~d" id) + + (with-logged-in-user + (render-construct-deck id #P"construct/index.html"))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defroute ("/construct/ygo-set-item" :method :GET) (&key _parsed) + "Find the YGO-SET-ITEM associated with the |SET-ID| and |VARIANT-ID| + +TODO This needs a rewrite as it currently actually accepts multiple +CARDs and operates on their component |SET-ID| and |VARIANT-ID| which +is really not optimal. Ideally we should be handling this all in bulk +with better routes." + (v:info :cards "GET /cards/ygo-set-items ~a" _parsed) + + (with-logged-in-user + (alexandria:if-let ((cards (query-param "cards" _parsed))) + (dolist (card cards) + (let ((|set-id| (query-param "set-id" card)) + (|variant-id| (query-param "variant-id" card))) + (handler-case + (ratify:with-parsed-forms + ((:integer |set-id|) + (:integer |variant-id|)) + (return + (render-with-env #P"cards/variant-results.html" + (list :id (gensym) + :item (find |variant-id| + (select-ygo-cc-item-variants |set-id|) + :key (alexandria:compose #'mito:object-id #'variant-of)))))) + (ratify:combined-error (e) + (flash-error (format nil "/cards/ygo-set-items => ~d:~d ~a~%" |set-id| |variant-id| e))))))))) + + +(defroute ("/construct/:id/select-sets" :method :GET) (&key id) + "Select the YDK-SET for the corresponding PASSCODEs. Use Deck ID from the deck builder." + (v:info :construct "GET /construct/~d/select-sets" id) + + (with-logged-in-user + (with-connection (db) + (let* ((cards (mito:retrieve-dao 'deck-item :deck-id id)) + (sets (mapcar (alexandria:compose #'ygo-card-sets #'deck-passcode-of) cards)) + (variants (select-variant-condition))) + (render-with-env #P"construct/select-sets.html" + (list :sets (reverse sets) + :deck-id id + :variants variants)))))) + +(defroute ("/construct/:id/select-sets" :method :POST) (&key id _parsed) + "Constructed Decks Select Sets POST Route - Attempt to SUBTRACT-DESIRED-FROM-SET-ITEM-QTY-AS-ALIST, and if VALID-PULL-P, call PULL-FROM-INVENTORY. Otherwise, FLASH-ERROR to the user about Insufficient Inventory." + (v:info :construct "POST /construct/~d/select-sets ~a" id _parsed) + + (with-logged-in-user + (alexandria:if-let ((cards (query-param "cards" _parsed))) + (let ((original-deck (select-deck-as-plist id)) + (selected-listing (selected-sets-to-deck-listing cards))) + + ;; Store the current constructed deck template + (store-combined-deck-as-current original-deck selected-listing) + + ;; See if there are any issues with the current inventory + (if (default-constructed-deck-is-valid-to-pull) + (progn + ;; Decrement the stock from the YGO-SET-ITEM + (pull-from-inventory *current-constructed-deck*) + ;; Create a new CONSTRUCTED-DECK based on *CURRENT-CONSTRUCTED-DECK* + (cdi-pull-from-inventory *current-constructed-deck*) + (flash-message (_ "Deck constructed!")) + (render-with-env #P"construct/constructed-deck-list.html" + (list :original-deck original-deck + :deck-id id + :total-price nil + :table *current-constructed-deck*))) + (let ((err (default-constructed-deck-invalid-qtys))) + (with-connection (db) + (flash-error (format nil (_ "Insufficient Inventory:
      ~a") + ;; TODO all this nesting again... + (ygo-passcode-of err) + (ygo-passcode-of err)))) + (redirect (format nil "/construct/~d/select-sets" id)))))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defroute ("/construct/:id/deconstruct" :method :POST) (&key id _parsed) + "Deconstruct deck. That is, increment the QTY of the the contents to of the CONSTRUCTED-DECK-AS-CDI-LIST." + (v:info :construct "POST /construct/~d/deconstruct ~a" id _parsed) + + (with-logged-in-user + (return-to-inventory + (constructed-deck-as-cdi-list id))) + + (_ "Ok!")) + +(defroute ("/construct/:id/selected-sets" :method :GET) (&key id _parsed) + "Query CONSTRUCTED-DECK ID for the YGO-SET-ITEMS it contains. We use CONSTRUCTED-DECK-AS-CDI-LIST again." + (v:info :construct "GET /construct/~d/selected-sets ~a" id _parsed) + + (with-logged-in-user + (let ((table (constructed-deck-as-cdi-list id))) + (render-with-env #P"construct/constructed-deck-list.html" + (list :table table))))) + +(defroute ("/construct/:id/update" :method :POST) (&key id |name| |sell-price| |sold| _parsed) + "Update a CONSTRUCTED-DECK by ID" + (v:info :construct "POST /construct/~d/update ~a" id _parsed) + + (with-logged-in-user + (let ((found (find-dao 'constructed-deck :id id))) + (when found + (when |name| (setf (deck-name-of found) |name|)) + (when |sell-price| (setf (deck-sell-price-of found) |sell-price|)) + (when (string= |sold| "on") (setf (deck-sold found) 1)) + (update-dao found) + (flash-message (_ "Deck Updated")) + (redirect (format nil "/construct/~d/view" id)))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; This one looks like: Get all the cards in a deck id 13 and query all the sets using YGO-CARD-SETS + +;; (let* ((cards (retrieve-dao 'deck-item :deck-id 13)) +;; (all-sets (mapcar #'deck-passcode-of cards))) +;; (mapcar #'cl-deck-builder2.models.ygoprodeck.methods::ygo-card-sets +;; (reverse all-sets))) + +;; (with-connection (db) +;; (with-transaction +;; (let ((v (mito:find-dao 'cl-deck-builder2.models.ygoprodeck.fields::variant-condition :name "Near Mint"))) +;; (mapcar (lambda (set) +;; (mito:find-dao 'cl-deck-builder2.models.ygoprodeck.classes::ygo-set-item +;; :item set +;; :variant v)) +;; *)))) diff --git a/src/web/contact.lisp b/src/web/contact.lisp new file mode 100644 index 0000000..2b0c940 --- /dev/null +++ b/src/web/contact.lisp @@ -0,0 +1,76 @@ +#| + +# Contact Form + +GET /contact Index +GET /contact/admin Admin Panel +GET /contact/:id View Submission TODO + +DELETE /contact Clear All +DELETE /contact/:id Delete By ID + +POST /contact New Submission + +|# + +(in-package #:cl-deck-builder2.web) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun render-feedback (&optional (tpl #P"contact/index.html")) + (render-with-env tpl (append + (list :active "/contact") + (auth (:admin) + (list :feedback (select-feedback)))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defroute ("/contact" :method :GET) () + "Contact Form Index Page" + (v:info :contact "GET /contact") + + (with-logged-in-user + (render-feedback))) + +(defroute ("/contact/admin" :method :GET) () + "Contact Form Admin Panel" + (with-logged-in-user + (render-feedback #P"contact/admin.html"))) + +(defroute ("/contact" :method :DELETE) () + "Delete *ALL* FEEDBACK." + (v:info :contact "DELETE /contact") + + (auth (:admin) + (progn + (delete-from 'feedback) + (flash-message (_ "Feedback cleared.")) + (render-feedback #P"contact/list.html")) + (flash-error (_ "Something went wrong. Try again?")))) + +(defroute ("/contact/:id/delete" :method :DELETE) (&key id) + "Delete FEEDBACK with matching ID." + + (auth (:admin) + (handler-case + (ratify:with-parsed-forms + ((:integer id)) + (delete-by-values 'feedback :id id)) + (ratify:combined-error (e) + (flash-error e))))) + +(defroute ("/contact" :method :POST) (&key _parsed) + "User Submit Feedback POST Route. Login Required." + (v:info :contact "POST /contact => ~a" _parsed) + + (with-logged-in-user + (let ((user (find-dao 'user :email (user-name))) + (body (query-param "query" _parsed))) + (handler-case + (ratify:with-parsed-forms + ((:string body)) + (if (ignore-errors + (create-feedback user body)) + (flash-message (_ "Thanks! We got your message.")) + (flash-error (_ "Something went wrong. Try again?")))) + (ratify:combined-error (e) + (flash-error e)))) + (redirect "/contact"))) diff --git a/src/web/decks.lisp b/src/web/decks.lisp new file mode 100644 index 0000000..4bf9bf6 --- /dev/null +++ b/src/web/decks.lisp @@ -0,0 +1,376 @@ +#| + +src/web/decks.lisp + +Deck Overview Web Interface + +Here we see the cards in the deck, we have the option to generate +deck images, and we have the option to pull the deck from +inventory. + +|# + +(in-package #:cl-deck-builder2.web) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; TODO both YDK-DATA-TO-TEMPLATE and RENDER-YDK desperately need an overhaul. +(defun ydk-to-template-data (ydk) + "Transform information from YDK-QUERY on YDK into: main, side, extra decks, with RLE encodings of all three, plus metadata." + (let ((data (ydk-query ydk))) + (when data + (labels ((filter-kind (lst kind) + (remove-if + (lambda (card) + (if (eq (getf card :kind) kind) + nil + t)) + (reverse lst)))) + (let ((main-deck (filter-kind data 0)) + (extra-deck (filter-kind data 1)) + (side-deck (filter-kind data 2))) + (list + :name (ydk-name-of ydk) + :created-by (ydk-created-by ydk) + + :main-deck main-deck + :extra-deck extra-deck + :side-deck side-deck + + :main-deck-rle (rle-encode-plist main-deck :key (lambda (plist) (getf plist :name)) :test #'string=) + :extra-deck-rle (rle-encode-plist extra-deck :key (lambda (plist) (getf plist :name)) :test #'string=) + :side-deck-rle (rle-encode-plist side-deck :key (lambda (plist) (getf plist :name)) :test #'string=))))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; TODO This is ugly still. Fix it. +(defun draw-deck-image-by-id (id) + (let ((found (find-dao 'ydk-deck :id id))) + (when found + (let ((ydk (ydk-sync found))) + (draw-deck-image ydk (ydk-name-of ydk)))))) + +;; TODO this only works with decks from the database as it uses +;; YDK-DECK-INFO-BY-ID, making the name of this function a +;; misnomer. It should be RENDER-YDK-BY-DECK-ID. I'd use YDK-QUERY for +;; now beacuse that nets you INNER-JOIN with fields coming from +;; datafly as an associated list... sloppy work. +(defun render-ydk (id tpl) + "Render a YDK-DECK from the databse with ID using template TPL. We also use YDK-TO-TEMPLATE-DATA to query additional deck information." + (let ((found (ydk-deck-by-id id))) + (if found + (render-with-env + tpl + (append + (list :active "/decks" + :id id + :category (with-connection (db) + (ydk-category-of found)) + :saved-deck-list (select-ydk-deck) + :saved-category-list (select-category) + :files (probe-image-files-list + (ydk-name-of found))) + (ydk-to-template-data found))) + (_ "Nothing to see here...")))) + +(defgeneric ydk-listing-as (id tpl) + (:documentation "Looks like this is a kludge to accept ID as a string or integer. TODO Move to generics.lisp") + (:method ((id string) (tpl pathname)) + (ydk-listing-as (parse-integer id) tpl)) + (:method ((id integer) (tpl pathname)) + (render-ydk id tpl))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defroute ("/decks" :method :GET) (&key _parsed) + "Deck List Main Route. Login Required." + (with-logged-in-user + (let ((id (query-param "deck-load-id" _parsed))) + (if id + (let ((found (ydk-deck-by-id id))) + (render-with-env #P"decks/index.html" + `(:active "/decks" + :files ,(probe-image-files-list (ydk-name-of found)) + :id ,id + :category ,(ydk-category-of found) + :saved-deck-list ,(select-ydk-deck) + :saved-category-list ,(select-category)))) + (render-with-env #P"decks/index.html" + `(:active "/decks" + :saved-deck-list ,(select-ydk-deck) + :saved-category-list ,(select-category))))))) + +(defroute ("/decks/:id/view" :method :GET) (&key id) + "Deck Viewer Main Route. Login Required. View YDK-DECK with YDK-DECK-BY-ID. Uses RENDER-YDK." + (with-logged-in-user + (handler-case + (ratify:with-parsed-forms + ((:integer id)) + (let ((found (ydk-deck-by-id id))) + (if found + (render-ydk id #P"decks/index.html") + (progn + (flash-error (format nil (_ "No Deck ID ~d") id)) + (render-with-env #P"decks/index.html" + `(:active "/decks" + :saved-deck-list ,(select-ydk-deck) + :saved-category-list ,(select-category))))))) + (ratify:combined-error (e) + (flash-error (format nil "~a~%" e)) + (render-with-env #P"decks/index.html" + `(:active "/decks" + :saved-deck-list ,(select-ydk-deck) + :saved-category-list ,(select-category))))))) + +(defroute ("/decks/:id/generate-cover-images" :method :GET) (&key id) + "Deck Viewer - Generate Cover Image. Login Required. Render a static image and display it with DECK-IMAGE-LISTING template." + (v:info :decks "GET /decks/~d/generate-cover-images" id) + + (with-logged-in-user + (handler-case + (ratify:with-parsed-forms + ((:integer id)) + (if (draw-deck-image-by-id id) + (ydk-listing-as id #P"decks/deck-image-listing.html") + (_ "Something went wrong. Try again?"))) + (ratify:combined-error (e) + (flash-error e))))) + +(defroute ("/decks/:id/delete-generated-images" :method :DELETE) (&key id) + "Deck Viewer - Delete Generate Cover Image. Login Required." + (v:info :decks "DELETE /decks/~d/delete-generated-images" id) + + (with-logged-in-user + (handler-case + (ratify:with-parsed-forms + ((:integer id)) + (let ((found (ydk-deck-by-id id))) + (when found + (if (notany #'null + (mapcar #'uiop:delete-file-if-exists + (probe-image-files-list (ydk-name-of found) nil))) + (flash-message (_ "Success!")) + (flash-error (_ "Something went wrong. Try again?")))))) + (ratify:combined-error (e) + (flash-error e))))) + +(defroute ("/decks/:id/to-category" :method :POST) (&key id _parsed) + "POST route to send deck ID to category ID." + (v:info :decks "POST /decks/~d/to-category._parsed = ~a~%" id _parsed) + + (with-logged-in-user + (let ((cat-id (query-param "category-id" _parsed))) + (handler-case + (ratify:with-parsed-forms + ((:integer id) + (:integer cat-id)) + (let ((found (ydk-deck-by-id id))) + (when found + (setf (ydk-category-of found) + (find-dao 'category :id cat-id)) + (with-connection (db) + (mito:save-dao found)) + (render-with-env #P"decks/category-select.html" + `(:category-id ,(mito:object-id + (ydk-category-of found)) + :deck-id ,(mito:object-id found) + :categories ,(select-category)))))) + (ratify:combined-error (e) + (flash-error e)))))) + +(defroute ("/decks/:id/rename" :method :POST) (&key id _parsed) + "Deck Viewer - Rename deck ID with new name. Will also rename the generated image files, if they exist." + (v:info :decks "GET /decks/~d/rename._parsed = ~a~%" id _parsed) + + (with-logged-in-user + (let ((name (query-param "name" _parsed))) + ;; We want to change the name of LOAD-NAME to CREATE-NAME. + (handler-case + (ratify:with-parsed-forms + ((:integer id) + (:string name)) + (let ((found (ydk-deck-by-id id))) + ;; Ahaha that was a fun hunt. Using YDK-DECK-RENAME + ;; before RENAME-FILES caused the OLD-NAME in + ;; RENAME-FILES to be NEW-NAME... Rename the files + ;; before renaming the database entry. + (v:info :decks "RENAME ~a => ~a" (ydk-name-of found) name) + (ydk-rename-files (ydk-name-of found) name) + (ydk-rename-deck found name) + (flash-message + (format nil "Found entry ~A (~d); renaming to ~a.~%" + (ydk-name-of found) id name)) + (redirect (format nil "/decks/~d/view" id) 302))) + (ratify:combined-error (e) + (flash-error e)))))) + +(defroute ("/decks/:id/pull" :method :GET) (&key id) + "Pull deck ID using YDK-DECK-PULL-FROM-INVENTORY. + +TODO I think This is outdated." + (v:info :decks "GET /decks/~d/pull" id) + + ;; We want to "pull" the deck from inventory. That is, take the list + ;; of cards in the deck and remove them from the inventory count. + + (with-logged-in-user + (handler-case + (ratify:with-parsed-forms + ((:integer id)) + (let ((found (ydk-deck-by-id id))) + ;; The deck exists by ID + (when found + (let ((pulled (ydk-deck-pull-from-inventory found))) + (if pulled + (progn + (flash-message + (format nil "Found entry ~A (~d); pulling cards.~%" + (ydk-name-of found) id)) + (redirect (format nil "/construct/~d/view" + (mito:object-id pulled)) + 302)) + (flash-message + (format nil "Unable to pull deck ~d?~%" id))))))) + (ratify:combined-error (e) + (flash-error e))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defroute ("/decks/cards-in-decks" :method :GET) (&key _parsed) + "Route to display all the unique cards in all decks." + (v:info :decks "GET /decks/cards-in-decks => ~a" _parsed) + + (render #P"decks/cards-in-decks.html" + (list :active "/decks" + :table (cards-in-all-decks)))) + +(defroute ("/decks/:id/name" :method :GET) (&key id) + "Route to display the name of the YDK-DECK by this ID. + +TODO This should be a batch request." + (with-logged-in-user + (handler-case + (ratify:with-parsed-forms + ((:integer id)) + (let ((found (ydk-deck-by-id id))) + (if found + ;; Deck names like "29036" are coming back as INTEGER + ;; which is causing issues with Caveman2. It seems to + ;; use REDUCE #'LENGTH to measure the content length. + ;; It didn't like: (LENGTH 29036) + (princ-to-string (ydk-name-of found)) + (_ "No Name"))))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defroute ("/decks/by-category/:id" :method :GET) (&key id _parsed) + "Query a list of decks by category." + (v:info :decks "GET /decks/by-category/~d => ~a" id _parsed) + + (with-logged-in-user + (render #P"decks/decks-by-category.html" + (list :active "/decks" + :table (by-category 'ydk-deck id))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; All the various kinds of deck representations: HTML, HTML as Text, +;; Text as Text Area, Resulting Deck File Images +(defroute ("/decks/:id/html-listing" :method :GET) (&key id _parsed) + "Helper route. Get the builder HTML listing using YDK-LISTING-AS and DECK-HTML-RESULTS template." + (v:info :decks "GET /decks/~d/html-listing => ~a" id _parsed) + + (with-logged-in-user + (ydk-listing-as id #P"decks/deck-html-results.html"))) + +(defroute ("/decks/:id/html-text-listing" :method :GET) (&key id _parsed) + "Helper route. Get the HTML listing using YDK-LISTING-AS and DECK-TEXT-THREE-COLUMN template." + (v:info :decks "GET /decks/~d/html-text-listing => ~a" id _parsed) + + (with-logged-in-user + (ydk-listing-as id #P"decks/deck-text-three-column.html"))) + +(defroute ("/decks/:id/text-listing" :method :GET) (&key id _parsed) + "Helper route. Get the text listing using YDK-LISTING-AS and DECK-TEXT-TEXTAREA template." + (v:info :decks "GET /decks/~d/text-listing => ~a" id _parsed) + + (with-logged-in-user + (ydk-listing-as id #P"decks/deck-text-textarea.html"))) + +(defroute ("/decks/:id/text-listing-with-brs" :method :GET) (&key id _parsed) + "Helper route. Get the text listing using YDK-LISTING-AS and DECK-TEXT-TEXTAREA template with ." + (v:info :decks "GET /decks/~d/text-listing-with-brs => ~a" id _parsed) + + (with-logged-in-user + (ydk-listing-as id #P"decks/deck-text-textarea-with-brs.html"))) + +(defroute ("/decks/:id/image-listing" :method :GET) (&key id _parsed) + "Helper route. Get the image listing using YDK-LISTING-AS and DECK-IMAGE-LISTING template." + (v:info :decks "GET /decks/~d/text-listing => ~a" id _parsed) + + (with-logged-in-user + (ydk-listing-as id #P"decks/deck-image-listing.html"))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defroute ("/decks/:id/delete" :method :DELETE) (&key id) + "Delete Deck by ID." + (v:info :builder "DELETE /decks/:id/delete => ~a" id) + + (with-logged-in-user + (handler-case + (ratify:with-parsed-forms + ((:integer id)) + (ydk-deck-delete-by-id id) + (flash-message (format nil (_ "Deck ~a deleted success!" id)))) + (ratify:combined-error (e) + (flash-error e))) + + (redirect "/decks"))) + +(defroute ("/decks/search" :method :GET) (&key _parsed) + "Deck Viewer Search Main Route." + (v:info :builder "GET /decks/search => ~a" _parsed) + + (with-logged-in-user + (render-with-env #P"decks/search.html" + (list :active "/decks")))) + +(defroute ("/decks/search" :method :POST) (&key _parsed) + "Deck Viewer Search POST route. + +TODO Ensure this is functional." + (v:info :builder "GET /decks/search => ~a" _parsed) + + (with-logged-in-user + (let* ((name (query-param "name" _parsed)) + (decks (select-ydk-deck + (sxql:where (%sxql-like :name name))))) + + (render-with-env #P"decks/search.html" + (list :active "/decks" + :decks decks))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; XXX Duplicate code from /builder/saved-deck-list +(defroute ("/decks/deck-select" :method :GET) (&key |id|) + "Deck Select Route Helper." + (with-logged-in-user + (render-with-env #P"decks/deck-select.html" + (list :active "/decks" + :id (ignore-errors + (parse-integer |id|)) + :decks (select-ydk-deck))))) + +(defroute ("/decks/category-select" :method :GET) (&key |deck-id| |category-id|) + "Category Select Route Helper. +TODO Return Sub-categories." + (with-logged-in-user + (render-with-env #P"decks/category-select.html" + (list :active "/decks" + :category-id (ignore-errors + (parse-integer |category-id|)) + :deck-id (ignore-errors + (parse-integer |deck-id|)) + :categories (select-category))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defroute ("/decks/kde/:id" :method :GET) (&key id) + "KDE Team Deck List Viewer. View Deck by ID" + (render-with-env #P"kde-team.html" + (ydk-to-kde + (ydk-sync + (ydk-deck-by-id id))))) diff --git a/src/web/exception.lisp b/src/web/exception.lisp new file mode 100644 index 0000000..4b33632 --- /dev/null +++ b/src/web/exception.lisp @@ -0,0 +1,15 @@ +#| + +src/web/exception.lisp + +Error Pages + +|# + +(in-package #:cl-deck-builder2.web) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defmethod on-exception ((app ) (code (eql 404))) + (declare (ignore app)) + (merge-pathnames #P"_errors/404.html" + *template-directory*)) diff --git a/src/web/flash-message.lisp b/src/web/flash-message.lisp new file mode 100644 index 0000000..f22b8bd --- /dev/null +++ b/src/web/flash-message.lisp @@ -0,0 +1,49 @@ +(in-package #:cl-deck-builder2.web.flash-message) + +(defvar *flash-messages* '()) + +(defclass flash-message () + ((body :accessor flash-body-of + :initarg :body) + (class :accessor flash-class-of + :initarg :class) + (title :accessor flash-title-of + :initarg :title))) + +(defun flash (class title body) + "Essentially HASH-TABLE-PUSH: helper function to PUSHNEW a VALUE associated with KEY to *SESSION* HASH-TABLE." + (let ((obj (make-instance 'flash-message + :class class + :title title + :body body))) + (push obj *flash-messages*) + (flash-body-of obj))) + +(defun flash-gethash () + (let ((messages *flash-messages*)) + (setf *flash-messages* '()) + (reverse messages))) + +;; error -> is-danger +(defun flash-error (msg) + (flash "is-danger" "Error" (princ-to-string msg))) + +;; message -> is-success +(defun flash-message (msg) + (flash "is-success" "Success" (princ-to-string msg))) + +;; info -> is-info +(defun flash-info (title msg) + (flash "is-info" title (princ-to-string msg))) + +;; link -> is-link +(defun flash-link (title msg) + (flash "is-link" title (princ-to-string msg))) + +;; primary -> is-primary +(defun flash-primary (title msg) + (flash "is-primary" title (princ-to-string msg))) + +;; warning -> is-warning +(defun flash-warning (msg) + (flash "is-warning" "warning" (princ-to-string msg))) diff --git a/src/web/index.lisp b/src/web/index.lisp new file mode 100644 index 0000000..9072c9c --- /dev/null +++ b/src/web/index.lisp @@ -0,0 +1,81 @@ +#| + +src/web/index.lisp + +Some static top-level routes. + +If there isn't much to the page it probably appears here e.g. / /about /news + +|# + +(in-package :cl-deck-builder2.web) + +(defroute index "/" () + "Main HTML index." + (with-logged-in-user + (render-with-env #P"index.html" `(:active "/")))) + +;; (render-markdown +;; (relative-pathname "doc/index.md") +;; :title "Index" :env `(:active "/index")) + +(defroute "/about" () + "About page." + (with-logged-in-user + (render-markdown + (relative-pathname "doc/about.md") + :title "About" :env `(:active "/about")))) + +(defroute "/news" () + "News page. We use parse git log in toolkit/git.lisp." + (with-logged-in-user + (render-with-env #P"news.html" + `(:active "/news" + :git-log ,(mapcar #'parse-git-log (git-log)))))) + +(defroute ("/todo" :method :GET) () + "To-Do list page. This is my personal professional todo list!" + (with-logged-in-user + (render-markdown + (asdf:system-relative-pathname :cl-deck-builder2 + "doc/todo.md") + :title "To-Do List" + :env `(:active "/todo")))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defroute ("/markdown" :method :GET) (&key _parsed) + "A utility URL to parse markdown files. + +In a production environment you would probably want to disable this URL, as it could potentially allow an attacker to read arbitrary source files. That isn't a concern since we're running in a Docker container." + (with-logged-in-user + (let* ((path (query-param "path" _parsed)) + (pathspec (asdf:system-relative-pathname :cl-deck-builder2 path))) + (alexandria:if-let ((extracted-title (ignore-errors + (car (uiop:read-file-lines pathspec))))) + (render-markdown pathspec :title extracted-title) + (render-with-env #P"markdown.html" (list :title "Oops!" :html "Nothing to see here...")))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun extract-router-docs (app) + "Courtesy of knobo: https://github.com/fukamachi/caveman/pull/108" + (sort + (mapcar (lambda (route) + (list + (myway.rule::rule-url (myway.route:route-rule route)) + (documentation (ningle.route:route-controller route) 'function) + (car (map-set:ms-map 'list 'identity (myway.rule::rule-methods (myway.route:route-rule route)))) + (myway.rule::rule-param-keys (myway.route:route-rule route)))) + (myway:mapper-routes (ningle.app::mapper app))) + #'string< + :key #'car)) + +(defroute doc "/doc" (&key |org|) + "This url shows this the documentation." + (with-logged-in-user + (let ((docs (extract-router-docs *web*)) + (tpl (if |org| + #P"docs.md" + #P"docs.html"))) + (render-with-env tpl + `(:active "/doc" + :docs ,docs))))) diff --git a/src/web/inventory.lisp b/src/web/inventory.lisp new file mode 100644 index 0000000..abb6fd9 --- /dev/null +++ b/src/web/inventory.lisp @@ -0,0 +1,244 @@ +#| + +src/web/inventory.lisp + +Crystal Commerce-style Inventory Management User Interface and helpers. + +TODO pass over the results of (make-search-query) such that +:total-qty is the aggregate of: + +(select 'ygo-cc-item (where (:= :item_id xxx))) + +(reduce #'+ + (mapcar (alexandria:compose #'read-from-string #'cc-sell-price-of) + (retrieve-dao 'ygo-cc-item :item-id 48883))) + +(reduce #'+ (mapcar #'cc-qty-of (retrieve-dao 'ygo-cc-item :item-id 48883))) + + +|# + +(in-package #:cl-deck-builder2.web) + +(defun render-results (&key (active "/inventory") (class 'cc-item) (params nil) (tpl #P"inventory/search-results.html")) + "Mega helper function. Render function for anything that currently queries the databse. We search both PRODUCT-NAME and NAME, as well as querying a list of VARIANTs, with a LIMIT on the number of results and an OFFSET into those search results. You may also specify a DIRECTION, and SORT-BY options. + +TODO Major rewrite candidate right here. +TODO Integrate new SEARCH-SESSION object after that's done." + (let ((direction (or (query-param "direction" params) "desc")) + (variant (or (query-param "variant" params) + (find-dao 'variant-condition :name "Near Mint"))) + (variants (select-variant-condition)) + (limit (or (query-param "limit" params) "10")) + (name (or + (query-param "name" params) + (query-param "product-name" params))) + (offset (or (query-param "offset" params) "0")) + (sort-by (or (query-param "sort-by" params) "id"))) + (handler-case + (ratify:with-parsed-forms + ((:integer limit) + (:integer offset) + (:string direction) + (:string sort-by)) + ;; NAME can be blank, so... + (let* ((filtered-cards (make-search-query class params)) + (length (make-count-query class params)) + (pages (generate-pages length offset limit))) + (render-with-env tpl + `(:active ,active + :cards ,filtered-cards + :direction ,direction + :last-page ,(car (last pages)) + :length ,length + :limit ,limit + :name ,name + :offset ,offset + :opposite-direction ,(get-opposite-direction direction) + :pages ,pages + :search-params ,+search-params+ + :sort-by ,sort-by + :total ,(count-dao class) + :variant ,variant + :variants ,variants)))) + (ratify:combined-error (e) + (flash-error (format nil "~a/search.error => ~a~%" active e)))))) + +;; USE REINITIALIZE-INSTANCE to update the existing YGO-SET-ITEM from _PARSED +(defun patch-card (card _parsed) + (let ((set-id (query-param "set-id" card)) + (variant-id (query-param "variant-id" card))) + (handler-case + (ratify-parsing:with-parsed-forms + ((:integer set-id) + (:integer variant-id)) + (let ((found (find-or-create-instance 'ygo-set-item :item-id set-id :variant-id variant-id)) + (clean (filter-alist _parsed))) + (v:info :inventory "PATCH-CARD: ~a" found) + (if found + ;; TODO redraw item based on context? Like patching from the inventory list vs patching from the editor? + ;; (redirect (format nil "/inventory/~d/edit" (mito:object-id found)) 303) + (progn + (apply #'reinitialize-instance found (assoc-utils:alist-plist clean)) + (update-dao found) + (_ "Save")) + (progn + (flash-error (format nil "Error udpating id ~d:~d" set-id variant-id)))))) + (ratify:combined-error (e) + (flash-error e))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Inventory Viewer +(defroute ("/inventory" :method :GET) (&key _parsed) + "Inventory Viewer GET route. Will display index with search results." + (v:info :inventory "GET /inventory ~a" _parsed) + + ;; (with-logged-in-user + ;; (render-results :params _parsed :tpl #P"inventory/index.html")) + (redirect "/cards")) + +#| +(defroute ("/inventory" :method :POST) (&key _parsed) + "Inventory Viewer search POST route. Will display index with search results." + (v:info :inventory "POST /inventory ~a" _parsed) + + (with-logged-in-user + (render-results :params _parsed :tpl #P"inventory/index.html"))) + +(defroute ("/inventory/search" :method :POST) (&key _parsed) + "Inventory Viewer search POST route. Will display index with search results." + (v:info :inventory "POST /inventory/search ~a" _parsed) + + (with-logged-in-user + (render-results :params _parsed))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Inventory Item Editor +;; +;; TODO PUT?? POST?? GET?? + +;; New Item +(defroute ("/inventory/new" :method :GET) () + "Display the page for creation of a new inventory item" + (v:info :inventory "GET /inventory/new") + + (with-logged-in-user + (render-with-env #P"inventory/new.html" + `(:active "/inventory" + :card ,(make-instance 'cc-item))))) + +(defroute ("/inventory/new" :method :POST) (&key _parsed) + "POST method for the processing the information from page for creation of a new inventory item." + (v:info :inventory "POST /inventory/new => ~a" _parsed) + + (with-logged-in-user + (let ((clean (filter-alist _parsed))) + (let ((new (apply #'cc-create (assoc-utils:alist-plist clean)))) + (when (mito:object-id new) + (redirect (format nil "/inventory/~d/edit" (mito:object-id new)))))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Inventory Item Importer +(defroute ("/inventory/import" :method :GET) () + "Inventory Item Importer. TODO" + (v:info :inventory "GET /inventory/import") + + (with-logged-in-user + (render-with-env #P"inventory/import.html" + `(:active "/inventory")))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Seems like this one needs to be last. It has something to do with +;; the wildcard :ID parameter. Maybe we ought to add the /edit back? + +(defroute ("/inventory/:id/edit" :method :GET) (&key id) + "Edit Route for Inventory Item. + +ARGUMENTS +ID The ID of the CC-ITEM inventory item you wish to edit." + (v:info :inventory "GET /inventory/~d/edit" id) + + (with-logged-in-user + (handler-case + (ratify-parsing:with-parsed-forms + ((:integer id)) + (render-with-env #P"inventory/edit.html" + `(:active "/inventory" + :errors ,(flash-gethash :errors) + :messages ,(flash-gethash :messages) + :card ,(cc-select-by-id id)))) + (ratify:combined-error (e) + (flash-error e))))) + +(defroute ("/inventory/:id/edit" :method :POST) (&key id _parsed) + "CC-ITEM Update POST route. If the item exists, update it using REINITIALIZE-INSTANCE, after filtering _PARSED through FILTER-ALIST. + +TODO Differentiate between CC-ITEM and YGO-CC-ITEM?" + (v:info :inventory "POST /inventory/~d/edit => ~a" id _parsed) + + (with-logged-in-user + (handler-case + (ratify-parsing:with-parsed-forms + ((:integer id)) + (with-connection (db) + (let ((found (mito:find-dao 'cc-item :id id)) + (clean (filter-alist _parsed))) + (when found + (apply #'reinitialize-instance found (assoc-utils:alist-plist clean)) + (mito:save-dao found) + (redirect (format nil "/inventory/~d/edit" (mito:object-id found)) 303))))) + (ratify:combined-error (e) +(flash-error e))))) + +(defroute ("/inventory/:id/delete" :method :DELETE) (&key id) + "DELETE an Inventory Item specified by ID." + (v:info :inventory "DELETE /inventory/~d/delete" id) + + (with-logged-in-user + (handler-case + (ratify-parsing:with-parsed-forms + ((:integer id)) + (cc-delete-by-id id)) + (ratify:combined-error (e) + (flash-error e))))) +|# + +(defroute ("/inventory/patch" :method :PATCH) (&key _parsed) + "YGO-CC-ITEM PATCH route. This appears to be functionally identical to EDIT route for ID, but this is using YGO-CC-ITEM as class. The POST route appears to be used for CC-ITEM object." + (v:info :inventory "PATCH /inventory/patch => ~a" _parsed) + + (with-logged-in-user + (alexandria:if-let ((cards (query-param "cards" _parsed))) + (dolist (card cards) + (patch-card card _parsed)) + (patch-card _parsed _parsed)))) + +;; Huh? It works?? +(defroute ("/inventory/variants/:id" :method :GET) (&key id) + "Display the VARIANTs for this inventory item using SELECT-YGO-CC-ITEM-VARIANTS." + (v:info :inventory "GET /inventory/variants/~d" id) + + (with-logged-in-user + (handler-case + (ratify-parsing:with-parsed-forms + ((:integer id)) + (render-with-env #P"inventory/variant-results.html" + (list :active "/inventory" + :id id + :cards (select-ygo-cc-item-variants id)))) + ;; :cards ,filtered-cards + ;; :variant ,variant + ;; :variants ,variants + ;; :direction ,direction + ;; :length ,length + ;; :total ,(count-dao class) + ;; :limit ,limit + ;; :name ,name + ;; :offset ,offset + ;; :opposite-direction ,(get-opposite-direction direction) + ;; :pages ,(generate-pages length offset limit) + ;; :search-params ,+search-params+ + ;; :sort-by ,sort-by) + + (ratify:combined-error (e) + (flash-error e))))) diff --git a/src/web/label-maker.lisp b/src/web/label-maker.lisp new file mode 100644 index 0000000..7e0323b --- /dev/null +++ b/src/web/label-maker.lisp @@ -0,0 +1,171 @@ +#| + +src/web/label-maker.lisp + +Label Maker Front-End + +https://www.uline.com/product/detail/s-20247/store-fixtures/price-tag-insert-cards-1-1-4-x-2 + +Supports arbitrary number of labels. +Currently tested with LABELS-LENGTH set to 32 (ULINE S-20247) or 30 (Avery 5160). + +We generate a LaTeX file then use PDFLaTeX to produce a pdf in +GENERATE-LABELS-FOR-ATTACHMENT-ID. + +The barcodes are generated by ZXingWriter. + +TODO A lot of functionality that resides in the web interface needs to be moved to the model interface: +- public-relative-pathname +- generate-labels +- generate-labels-for-attachment +- generate-labels-for-attachment-id +- *current-label-class* + +|# + +(in-package #:cl-user) + +(defpackage #:cl-deck-builder2.web.label-maker + (:use #:cl + #:cl-deck-builder2.models.label-maker) + (:import-from #:caveman2 + #: + #:defroute + #:redirect + #:clear-routing-rules) + (:import-from #:cl-deck-builder2.i18n + #:_) + (:import-from #:cl-deck-builder2.toolkit + #:query-param + #:random-pathname-name) + (:import-from #:cl-deck-builder2.web + #:flash-error + #:flash-message + #:render-with-env + #:render-markdown-file) + (:import-from #:cl-deck-builder2.web.query + #:select-attachment-by-id) + (:import-from #:cl-deck-builder2.models.attachment + #:attachment-valid-p + #:create-attachment) + (:import-from #:cl-deck-builder2.config + #:*public-directory* + #:*static-directory* + #:*template-directory*) + (:local-nicknames (#:v #:org.shirakumo.verbose)) + (:export #:*web*)) + +(in-package #:cl-deck-builder2.web.label-maker) + +(defclass () ()) +(defvar *web* (make-instance ')) +(clear-routing-rules *web*) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defparameter *base-pathspec* #P"/tmp/labels/") + +(defparameter *current-label-class* 'latex-label-uline-s-20247 + "The most recently used class for making labels. + +The idea was you could select the types of labels from a select box on the Label Maker page.") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun public-relative-pathname (pathspec) + "PROBE-FILE on PATHSPEC in *PUBLIC-DIRECTORY*. + +TODO I think this is duplicate code from TOOLKIT.PATHS." + (probe-file + (merge-pathnames + pathspec + cl-deck-builder2.config:*public-directory*))) + +;; TODO All of this needs to be rewritten in some kind of pipeline form. +(defun generate-labels (output &key (class 'latex-label-uline-s-20247) csv pdf tex) + "Create output with RENDER-PAGE." + (ensure-directories-exist *base-pathspec*) + (let ((page (make-instance class :csv csv))) + (with-open-file (s tex + :if-exists :supersede + :direction :output) + (format s "~a" (render-page page)))) + + (uiop:delete-file-if-exists (probe-file #P"~/public/labels.pdf")) + (if (inferior-shell:run + `(and + (cd "/tmp/labels/") + (pdflatex ,tex) + (mv ,pdf ,output))) + output)) + +;; TODO ENOUGH-PATHNAME +;; TODO rewrite this using defclass like we did for CARDINFO +(defun generate-labels-for-attachment (path file-key) + (generate-labels (make-pathname :name file-key + :type "pdf" + :directory (namestring *public-directory*)) + :class *current-label-class* + :csv path + :tex #P"/tmp/labels/labels.tex" + :pdf #P"/tmp/labels/labels.pdf")) + +(defun generate-labels-for-attachment-id (id) + (let ((found (select-attachment-by-id id))) + (when found + (generate-labels-for-attachment + (public-relative-pathname + (;; Trim leading "/" + subseq + (namestring (mito-attachment:file-url found)) 1)) + (pathname-name + (mito-attachment:file-key found)))))) + +(defun label-maker-process-files (files) + "Process FILES with ATTACHMENT-VALID-P, CREATE-ATTACHMENT, then GENERATE-LABELS-FOR-ATTACHMENT-ID." + (dolist (file files) + (if (attachment-valid-p file) + (destructuring-bind (content filename content-type) + file + + (setf filename (random-pathname-name :type (pathname-type filename))) + + (let ((success (create-attachment content filename content-type))) + (if success + (progn + ;; Create ATTACHMENT was successful + (generate-labels-for-attachment-id (mito:object-id success)) + (flash-message (format nil (_ "Success! Download link: labels.pdf") + (pathname-name + (mito-attachment:file-key success))))) + (flash-error (_ "Something went wrong. Try again?"))))) + (flash-error (_ "Invalid upload."))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defroute ("/" :method :GET) () + "Label Maker Main Route." + (render-with-env #P"label-maker.html" + `(:active "/label-maker"))) + +(defroute ("/instructions" :method :GET) () + "Display Label Maker Instructions using RENDER-MARKDOWN-FILE." + (render-markdown-file + (asdf:system-relative-pathname :cl-deck-builder2 "doc/label-maker.md"))) + +(defroute ("/" :method :POST) (&key _parsed) + "Label Maker POST route. + +TODO Parameters: FILES A list of CSV files to process. CLASS the class of label you wish to generate. May be one of LATEX-LABEL-ULINE-S-20247 or LATEX-LABEL-AVERY-5160." + (v:info :label-maker "POST /label-maker => ~a" _parsed) + + (let ((files (query-param "files" _parsed)) + (class (query-param "class" _parsed))) + + ;; Check the CLASS parameter + (setf *current-label-class* + (find-class + (cond ((string= class "latex-label-uline-s-20247") 'latex-label-uline-s-20247) + (t 'latex-label-avery-5160)))) + + (if files + (label-maker-process-files files) + (flash-error (_ "No files."))) + (redirect "/label-maker"))) diff --git a/src/web/packages.lisp b/src/web/packages.lisp new file mode 100644 index 0000000..e5b7270 --- /dev/null +++ b/src/web/packages.lisp @@ -0,0 +1,64 @@ +;;;; src/web/package.lisp + +(in-package #:cl-user) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defpackage #:cl-deck-builder2.web.flash-message + (:use #:cl) + (:export #:flash + #:flash-gethash + #:flash-error + #:flash-message)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defpackage #:cl-deck-builder2.web.query + (:use #:cl + #:cl-deck-builder2.db + #:cl-deck-builder2.models) + (:export #:%sxql-like + + #:select-attachment + #:select-category + #:select-constructed-deck-items + #:select-constructed-decks + #:select-deck-item + #:select-feedback + #:select-ydk-deck + + #:cards-in-all-decks + #:select-attachment-by-id + #:select-variant-condition + #:select-ygo-cc-item-variants + #:ygo-select-info-by-id + #:ygo-select-info-by-passcode + #:ygo-set-item-by-id + #:ygo-set-item-by-item-id)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defpackage #:cl-deck-builder2.web + (:use #:cl + #:caveman2 + #:cl-deck-builder2.db + #:cl-deck-builder2.models + #:cl-deck-builder2.i18n + #:cl-deck-builder2.toolkit + #:cl-deck-builder2.web.query + #:cl-deck-builder2.web.flash-message) + (:local-nicknames (#:v #:org.shirakumo.verbose)) + (:import-from #:cl-deck-builder2.config + #:*public-directory* + #:*static-directory* + #:*template-directory*) + (:import-from #:cl-deck-builder2.draw + #:draw-deck-image) + (:import-from #:cl-deck-builder2.view #:render) + (:import-from #:hermetic + #:setup + #:login + #:logged-in-p + #:user-name + #:logout + #:auth) + (:export #:*web* + #:make-chat-client + #:make-chat-server)) diff --git a/src/web/params.lisp b/src/web/params.lisp new file mode 100644 index 0000000..ddc13c9 --- /dev/null +++ b/src/web/params.lisp @@ -0,0 +1,146 @@ +#| + +Various constants or parameters used around the web interface + +|# + +(in-package #:cl-deck-builder2.web) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; builder.lisp + +(defparameter +main-deck-card-limit+ 60) + +(defparameter +extra-deck-card-limit+ 15) + +(defparameter +search-params+ + '(:ATTRIBUTE ("DARK" "DIVINE" "EARTH" "FIRE" "LIGHT" "WATER" "WIND") + :TYPE + ("Effect Monster" "Flip Effect Monster" "Fusion Monster" + "Gemini Monster" "Link Monster" "Normal Monster" + "Normal Tuner Monster" "Pendulum Effect Fusion Monster" + "Pendulum Effect Monster" "Pendulum Effect Ritual Monster" + "Pendulum Flip Effect Monster" "Pendulum Normal Monster" + "Pendulum Tuner Effect Monster" "Ritual Effect Monster" + "Ritual Monster" "Skill Card" "Spell Card" "Spirit Monster" + "Synchro Monster" "Synchro Pendulum Effect Monster" + "Synchro Tuner Monster" "Token" "Toon Monster" "Trap Card" + "Tuner Monster" "Union Effect Monster" "XYZ Monster" + "XYZ Pendulum Effect Monster") + :RACE + ("Abidos the Third" "Adrian Gecko" "Alexis Rhodes" "Amnael" "Andrew" + "Aqua" "Arkana" "Aster Phoenix" "Axel Brodie" "Bastion Misaw" "Beast" + "Beast-Warrior" "Bonz" "Camula" "Chazz Princet" "Christine" "Chumley Huffi" + "Continuous" "Counter" "Creator-God" "Cyberse" "David" + "Dinosaur" "Divine-Beast" "Don Zaloog" "Dr. Vellian C" "Dragon" "Emma" + "Equip" "Espa Roba" "Fairy" "Field" "Fiend" "Fish" "Illusionist" + "Insect" "Ishizu" "Ishizu Ishtar" "Jaden Yuki" "Jesse Anderso" "Joey" + "Joey Wheeler" "Kagemaru" "Kaiba" "Keith" "Lumis and Umb" "Lumis Umbra" + "Machine" "Mai" "Mai Valentine" "Mako" "Nightshroud" "Normal" + "Odion" "Paradox Broth" "Pegasus" "Plant" "Psychic" "Pyro" + "Quick-Play" "Reptile" "Rex" "Ritual" "Rock" "Sea Serpent" "Seto Kaiba" + "Spellcaster" "Syrus Truesda" "Tania" "Tea Gardner" "The Supreme K" + "Thelonious Vi" "Thunder" "Titan" "Tyranno Hassl" "Warrior" + "Weevil" "Winged Beast" "Wyrm" "Yami Bakura" "Yami Marik" "Yami Yugi" + "Yubel" "Yugi" "Zane Truesdal" "Zombie") + :FRAME-TYPE + ("effect" "effect_pendulum" "fusion" "fusion_pendulum" "link" + "normal" "normal_pendulum" "ritual" "ritual_pendulum" "skill" "spell" + "synchro" "synchro_pendulum" "token" "trap" "xyz" "xyz_pendulum") + :ARCHETYPE + ("\"C\"" "-Eyes Dragon" "@Ignister" "A.I." "ABC" "Abyss Actor" "Abyss Script" + "Adamancipator" "Advanced Crystal Beast" "Adventurer Token" "Aesir" "Aether" + "Albaz Dragon" "Alien" "Alligator" "Allure Queen" "Ally of Justice" + "Altergeist" "Amazement" "Amazoness" "Amorphage" "Ancient Gear" + "Ancient Treasure" "Ancient Warriors" "Anti" "Apoqliphort" "Appliancer" + "Aquaactress" "Aquamirror" "Arcana Force" "Archfiend" "Armed Dragon" "Aroma" + "Artifact" "Assault Mode" "Atlantean" "Attraction" "Attribute Summoner" + "B.E.S." "Bamboo Sword" "Barbaros" "Barian's" "Batteryman" "Battleguard" + "Battlewasp" "Battlin' Boxer" "Battlin' Boxing" "Beetrooper" + "Black Luster Soldier" "Blackwing" "Blaze Accelerator" "Blue-Eyes" "Bonding" + "Book of" "Boot-Up" "Borrel" "Bounzer" "Branded" "Bridge" "Bugroth" "Bujin" + "Burning Abyss" "Butterfly" "Butterspy" "Bystial" "Cataclysmic" + "Celtic Guard" "Chaos" "Chaos Phantom" "Charmer" "Chemicritter" "Chronomaly" + "Chrysalis" "Cipher" "Clear Wing" "Cloudian" "Code Talker" "Codebreaker" + "Constellar" "Contact" "Cosmic Synchro Monster" "Counter Fairy" "Crusadia" + "Crystal" "Crystal Beast" "Crystron" "Cubic" "Cupid" "CXyz" "Cyber" + "Cyber Angel" "Cyber Dragon" "Cyberdark" "Cynet" "D.D." "D/D" "D/D/D" + "Danger!" "Dark Contract" "Dark Magician" "Dark Scorpion" "Dark World" + "Darklord" "Deep Sea" "Demise" "Deskbot" "Despia" "Destiny HERO" + "Destruction Sword" "Dice" "Digital Bug" "Dinomist" "Dinomorphia" + "Dinowrestler" "Divine Dragon" "Djinn" "Dododo" "Dogmatika" "Doll" + "Doodle Beast" "Doodlebook" "Doriado" "Dracoslayer" "Dracoverlord" + "Dragonmaid" "Dragunity" "Dream Mirror" "Drytron" "Dual Avatar" "Duston" + "Earthbound" "Edge Imp" "Egyptian God" "Eldlich" "Elemental HERO" + "Elemental Lord" "Elementsaber" "Empowered Warrior" "Endymion" "Evil Eye" + "Evil HERO" "Evil★Twin" "Evolsaur" "Evoltile" "Evolzar" + "Exchange of the Spirit" "Exodia" "Exosister" "Eyes Restrict" "F.A." "Fabled" + "Fairy" "Fairy Tail" "Fire Fist" "Fire Formation" "Fire King" "Firewall" + "Fishborg" "Flamvell" "Fleur" "Floowandereeze" "Flower Cardian" "Fluffal" + "Forbidden" "Fortune Fairy" "Fortune Lady" "Fossil" "Frightfur" "Frog" + "From the Underworld" "Fur Hire" "Fusion" "G Golem" "Gadget" "Gagaga" + "Gaia Knight" "Gaia The Fierce Knight" "Galaxy" "Galaxy-Eyes" "Gandora" + "Gate Guardian" "Geargia" "Gem-" "Generaider" "Genex" "Ghostrick" "Ghoti" + "Gimmick Puppet" "Gishki" "Gizmek" "Glacial Beast" "Gladiator Beast" "Gogogo" + "Gold Pride" "Golden Castle of Stromberg" "Golden Land" "Gorgonic" "Gouki" + "Gravekeeper's" "Graydle" "Greed" "Grepher" "Guardian" "Guardragon" "Gunkan" + "Gusto" "Harpie" "Hazy" "Hellfire" "Herald" "Heraldic" "Heraldry" "HERO" + "Heroic" "Hi-Speedroid" "Hieratic" "Hole" "Holy Knight" + "Horus the Black Flame Dragon" "Hyperion" "Ice Barrier" "Icejade" "Igknight" + "Impcantation" "Infernity" "Infernoble Knight" "Infernoid" "Infestation" + "Infinitrack" "Invoked" "Inzektor" "Iron Chain" "Jar" "Jester" "Jinzo" "Junk" + "Jurrac" "Kaiju" "Kairyu-Shin" "Karakuri" "Kashtira" "Knight" "Knightmare" + "Koa'ki Meiru" "Koala" "Kozmo" "Krawler" "Kuriboh" "Labrynth" + "Labyrinth Wall" "Lady of Lament" "Laval" "Legendary Knight" "Libromancer" + "Lightsworn" "Lil-la" "Live☆Twin" "Lswarm" "Lunalight" "Lyrilusc" "Machina" + "Madolche" "Madoor" "Magical Musket" "Magician" "Magician Girl" "Magikey" + "Magistus" "Magnet Warrior" "Majespecter" "Majestic" "Maju" "Malefic" + "Malicevorous" "Man-Eater Bug" "Manadome" "Marincess" "Martial Art Spirit" + "Mask" "Masked HERO" "Materiactor" "Mathmech" "Mayakashi" "Mayakashi Shiranui" + "Mecha Phantom Beast" "Megalith" "Mekk-Knight" "Meklord" "Melffy" "Melodious" + "Mermail" "Metalfoes" "Metaphys" "Mikanko" "Mist Valley" "Mokey Mokey" + "Monarch" "Morphtronic" "Mystical Beast of the Forest" "Myutant" "Naturia" + "Nekroz" "Nemeses" "Nemleria" "Nemurelia" "Neo Space" "Neo-Spacian" "Neos" + "Nephthys" "Nimble" "Ninja" "Ninjitsu Art" "Noble Knight" "Nordic" + "Nouvellez" "Number" "Numeron" "Odd-Eyes" "Ogdoadic" "Ojama" "Onomat" + "Orcust" "Overlay" "P.U.N.K." "Paladins of Dragons" "Paleozoic" "Parasite" + "Parshath" "Pendulum" "Pendulum Dragon" "Penguin" "Performage" "Performapal" + "Phantasm Spiral" "Phantom Beast" "Phantom Knights" "Photon" + "Plunder Patroll" "Polymerization" "Possessed" "Potan" "Power Tool" + "Prank-Kids" "Predaplant" "Prediction Princess" "Priestess" "PSY-Frame" + "Puppet" "Purrely" "Qli" "Raidraptor" "Rank-Up-Magic" "Recipe" "Red-Eyes" + "Reptilianne" "Rescue-ACE" "Resonator" "Rikka" "Ritual Beast" "Roid" "Rokket" + "Roland" "Rose" "Rose Dragon" "Runick" "S-Force" "Sacred Beast" + "Salamangreat" "Scareclaw" "Scrap" "Scrap-Iron" "Secret Six Samurai" + "Seven Emperors" "Seventh" "Shaddoll" "Shark" "Shinobird" "Shiranui" + "Silent Magician" "Silent Swordsman" "Simorgh" "Six Samurai" "Skull Servant" + "Sky Scourge" "Sky Striker" "Slime" "Solemn" "Solfachord" "Speedroid" + "Spellbook" "Sphinx" "Spider" "Spirit Message" "Spiritual Art" "Spright" + "Springans" "SPYRAL" "Star" "Star Seraph" "Stardust" "Starliege" + "Starry Knight" "Stealth Kragen" "Steelswarm" "Stellarknight" "Subterror" + "Sunavalon" "Sunseed" "Sunvine" "Super Defense Robot" "Super Quant" + "Superheavy" "Superheavy Samurai" "Supreme King" "Swordsoul" "Sylvan" + "Symphonic" "Symphonic Warrior" "Synchro" "Synchron" "T.G." "Tearlaments" + "Tellarknight" "Tenyi" "The Agent" "The Sanctuary in the Sky" "The Weather" + "Therion" "Thunder Dragon" "Time Thief" "Timelord" "Tindangle" "Toon" "Train" + "Transcendrake" "Trap Hole" "Trap Monster" "Traptrix" "Tri-Brigade" "Triamid" + "Trickstar" "True Draco" "U.A." "Umbral Horror" "Umi" "Unchained" "Ursarctic" + "Utopia" "Utopic" "Valkyrie" "Vampire" "Vanquish Soul" "Vassal" "Vaylantz" + "Vendread" "Venom" "Vernusylph" "Virtual World" "Visas" "Vision HERO" "Void" + "Volcanic" "Vylon" "War Rock" "Watt" "White" "Wicked God" "Wind-Up" + "Windwitch" "Witchcrafter" "World Chalice" "World Legacy" "Worm" "X-Saber" + "Xyz" "Yang Zing" "Yosenju" "Yubel" "Zefra" "ZEXAL" "Zoodiac") + ;; Card Rarity - Not in use at the moment. + :RARITY + ("10000 Secret Rare" "Collector's Rare" "Common" "Ghost/Gold Hybrid Rare" + "Ghost Rare" "Gold Rare" "Gold Secret Rare" "Mosaic Rare" "Parallel Rare" + "Platinum Rare" "Platinum Secret Rare" "Premium Gold Rare" "Prismatic Secret Rare" + "Quarter Century Secret Rare" "Rare" "Rare Parallel Rare" "Rush Rare" + "Secret Pharaoh's Rare" "Secret Rare" "Shatterfoil" "Starfoil Rare" + "Starlight Rare" "Super Parallel Rare" "Super Rare" "Ultimate Rare" + "Ultra Parallel Rare" "Ultra Pharaoh's Rare" "Ultra Rare") + :LIMIT + ("10" "50" "100" "1000" "2000"))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; search.lisp diff --git a/src/web/qr.lisp b/src/web/qr.lisp new file mode 100644 index 0000000..e6d83c4 --- /dev/null +++ b/src/web/qr.lisp @@ -0,0 +1,41 @@ +#| + +src/web/qr.lisp + +QR Generator + +New style web page with DEFCLASS brings some challenges: APPLY +#'FN e.g. MAKE-INSTANCE usually expects a PLIST e.g. :SLOT VALUE, +however, rendering with HTMX/HTML will require (SYMBOL-VALUE +:SLOT) e.g. "8-BIT-BYTE" which makes matching them up +tricky. Perhaps this is a solved problem. + +|# + +(in-package #:cl-deck-builder2.web) + +(defparameter *qr-settings* (make-instance 'qr-settings) + "The saved settings for the QR module.") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defroute ("/qr" :method :GET) () + "QR Generator Main Route. Display the index page. Login Required." + (v:info :qr "GET /qr") + + (with-logged-in-user + (setf (getf (response-headers *response*) :cache-control) "no-cache, must-revalidate") + (render-with-env #P"qr.html" + (append + (list :active "/qr") + (qr-to-plist *qr-settings* t))))) + +(defroute ("/qr" :method :POST) (&key _parsed) + "QR Generator Main Route. Update the *QR-SETTINGS* and display the result. Login Required." + (v:info :qr "POST /qr => ~a" _parsed) + + (with-logged-in-user + (alexandria:if-let ((settings (reinitialize-instance *qr-settings* :content _parsed))) + (alexandria:if-let ((html (qr-generate settings))) + html + (_ "Something went wrong. Try again?")) + (setf *qr-settings* (make-instance 'qr-settings))))) diff --git a/src/web/query.lisp b/src/web/query.lisp new file mode 100644 index 0000000..16301ea --- /dev/null +++ b/src/web/query.lisp @@ -0,0 +1,156 @@ +#| + +I didn't want to keep the query stuff in the model as it's not really +got anything to do with the model and more with the database. I tried +the DATABASE-OBJECT approach and that was clumsy too. + +I just want to write queries. Maybe I should have used CL-YESQL. + +TODO I have multiple of these too: saved-deck-list, +saved-category-list, constructed-deck-list ... where should these go? +Into their respective pacakges? + +|# + +(in-package #:cl-deck-builder2.web.query) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defmacro select-attachment (&body body) + `(select-dao 'attachment + (sxql:order-by :created-at :desc) + ,@body)) + +(defun select-attachment-by-id (id) + (first (select-attachment + (sxql:where (:= :id id))))) + +(defmacro select-category (&body body) + `(select-dao 'category + ;; Why did I use this? + ;; (sxql:group-by name) + (sxql:order-by :created-at :desc) + ,@body)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defmacro select-feedback (&body body) + `(select-dao 'feedback + (mito:includes 'user) + (sxql:order-by :created-at :desc) + ,@body)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; TODO Now where does this go? db? toolkit? +(defun %sxql-like (field value) + "Helper function. Turn \"value\" into \"%value%\" for SQL LIKE queries." + (list :like field (format nil "%%~a%%" value))) + +(defmacro select-ydk-deck (&body body) + `(select-dao 'ydk-deck + (sxql:order-by :asc :created-at) + ,@body)) + +(defmacro select-deck-item (&body body) + `(select-dao 'deck-item + ;; (mito:includes 'ydk-deck) + (sxql:order-by :asc :created-at) + ,@body)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defmacro select-constructed-decks (&body body) + `(select-dao 'constructed-deck + (mito:includes 'ydk-deck) + (sxql:order-by :asc :created-at) + ,@body)) + +(defmacro select-constructed-deck-items (&body body) + `(select-dao 'constructed-deck-item + (mito:includes 'ygo-card 'deck-item 'ygo-set-item) + (sxql:order-by :asc :created-at) + ,@body)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; builder.lisp +;; (defun unique-cards-in-decks () +;; "Select the unique cards in all DECK-ITEMs" +;; (let ((deck-items +;; (with-connection (db) +;; (mito:select-dao 'deck-item +;; (sxql:group-by :passcode)))) +;; (ht (make-hash-table))) +;; (dolist (deck-item deck-items ht) +;; (push deck-item (gethash (deck-id-of deck-item) ht))))) + +;; Asked for this one. For every card in a deck, show what deck the card is in... +(defun cards-in-all-decks () + "Select the unique cards in all DECK-ITEMs" + (let ((deck-items + (with-connection (db) + (with-transaction + (select-deck-item)))) + (ht (make-hash-table))) + (with-connection (db) + (with-transaction + (dolist (deck-item (reverse deck-items) ht) + (pushnew (list :deck-id (deck-id-of deck-item) + :ydk-deck (mito:find-dao 'ydk-deck :id (deck-id-of deck-item)) + :ygo-card (mito:find-dao 'ygo-card :id (deck-passcode-of deck-item))) + (gethash (deck-passcode-of deck-item) ht) + :key (lambda (plist) (getf plist :deck-id)))))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun select-variant-condition () + (select-dao 'variant-condition)) + +(defun ygo-set-item-by-item-id (item-id) + (with-connection (db) + (with-transaction + (let ((set-items + (mito:select-dao 'ygo-set-item + (mito:includes 'ygo-set 'variant-condition) + (sxql:where (:= :item-id item-id))))) + (dolist (set-item set-items set-items) + (setf (item-of set-item) + (ygo-set-by-id (mito:object-id set-item)))))))) + +(defun ygo-set-item-by-id (id) + (with-connection (db) + (with-transaction + (let ((set-item (mito:select-dao 'ygo-set-item + (mito:includes 'ygo-set + 'variant-condition) + (sxql:where (:= :id id))))) + (setf (item-of set-item) + (ygo-set-by-id (mito:object-id set-item))) + set-item)))) + +(defun select-ygo-cc-item-variants (id) + "YGO-CC-ITEM is a relatively new addition, a database relationship between CC-ITEMs and VARIANT. Actually now that I think about it as I write this, YGO-CC-ITEM is a misnomer, and this is actually a CC-ITEM-VARIANT. +SELECT all the variants available for this CC-ITEM ID. + +This will generate a blank of 5 items if they don't already have corresponding YGO-SET-ITEMS in the database +It will also fetch all corresponding YGO-SET-ITEMS. If they do exist, REMOVE-DUPLICATES will use MITO:OBJECT-ID to remove them by VARIANT-OF. + +TODO FIXME" + (with-connection (db) + (with-transaction + (remove-duplicates + ;; Append the blanks and the existing data from the database, and remove-duplicates + (append + ;; Create a list of blanks + (mapcar (lambda (v) + (make-instance 'ygo-set-item :item-id id + :item (ygo-set-by-id id) + :variant v + :variant-id (mito:object-id v))) + (select-variant-condition)) + ;; Select what exists from the database, and fill in the YGO-SET info with the macro we wrote + (ygo-set-item-by-item-id id)) + :key (alexandria:compose #'mito:object-id #'variant-of))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; TODO: old ygoprodeck code +(defun ygo-select-info-by-id (id &rest fields-and-values) + (apply #'find-dao 'ygo-info :id id fields-and-values)) + +(defun ygo-select-info-by-passcode (passcode &rest fields-and-values) + (apply #'find-dao 'ygo-info :passcode passcode fields-and-values)) diff --git a/src/web/search.lisp b/src/web/search.lisp new file mode 100644 index 0000000..de3daff --- /dev/null +++ b/src/web/search.lisp @@ -0,0 +1,138 @@ +#| + +src/web/search.lisp + +This is some ancient old dusty code that had preminitions of how +things would work in the future. + +The idea was that there'd be a list of default parameters, maybe +you've seen it in the code, *SEARCH-DEFAULTS*. And this machinery +would query that default, then build an SQL query to hit the +database based on what was read from Caveman2. + +This code needs a rewrite. + +|# + +(in-package #:cl-deck-builder2.web) + +;; TODO defstruct search-params? +(defparameter *search-defaults* + '(("direction" . "asc") + ("limit" . "10") + ("name" . "") + ("variant" . (1 . "on")) + ("offset" . "0") + ("sort-by" . "id"))) + +(defun make-op-list (kind name value &key (fuzzy nil)) + (if fuzzy + (setf kind "LIKE" + value (format nil "%~a%" value))) + (list + (alexandria:make-keyword kind) + (alexandria:make-keyword (string-upcase + (substitute #\_ #\- name))) + value)) + +(defparameter +param-field-whitelist+ + '("amazon-asin" "barcode" "brand" "buy-price" "category" "code" "created-by" + "deck-id" "desc" "description" "domestic-only" "edition" "email" "id" "kind" + "linkmarkers" "linkval" "manufacturer-sku" "max-qty" "msrp" "parent" "price" + "product-name" "rarity" "rarity-code" "sell-price" "tax-exempt" "total-qty" + "url" "weight" "wishlists" "atk" "def" "level" "scale" "passcode" "type" + "frame-type" "race" "attribute" "archetype" "name" "opt-qty" "qty" "condition") + "A whitelist of keywords allowed by user input on the database side.") + +(defun filter-alist (alist &optional (whitelist +param-field-whitelist+)) + "Filter ALIST by CAR matching MEMBER in WHITELIST." + (remove-if (lambda (pair) + (destructuring-bind (key . value) + pair + (if (and (member key whitelist :test #'equal) + value + (> (length value) 0)) + nil + t))) + alist)) + +;; (defparameter *variant-id* +;; (mito:object-id (find-dao 'variant :name "Near Mint"))) + +(defun make-where-clause (alist) + "Helper function. Will rewrite ALIST into a series of SXQL queries. This is terrible, and needs a rewrite." + (let* ((fuzzy-match (query-param "fuzzy-match" alist)) + (op (or (query-param "and-or" alist) "and")) + (params (or + (remove nil + (mapcar + (lambda (pair) + (destructuring-bind (name . value) + pair + (when (string= name "product-name") + (setf name "name")) + (when (and value (> (length value) 0)) + (let ((kind (make-kind name alist)) + (fuzzy (and (string= name "name") + (string= fuzzy-match "on")))) + (make-op-list kind name value :fuzzy fuzzy))))) + (filter-alist alist))) + (list (sxql:make-op :not-null :name))))) + (sxql:where + (apply #'sxql:make-op (alexandria:make-keyword (string-upcase op)) + params)))) + +;; TODO This isn't terrible but I don't know how to improve +(defun make-kind (kind alist) + (if + (or (string= kind "atk") + (string= kind "def") + (string= kind "level") + (string= kind "scale")) + (let ((param (query-param (format nil "~a-kind" kind) alist))) + (cond ((string= "eq" param) "=") + ((string= "ge" param) ">=") + ((string= "le" param) "<=") + ((string= "lt" param) "<") + ((string= "gt" param) ">") + (t "="))) + "=")) + +;; TODO default arguments +(defun make-search-query (class _parsed) + (let ((direction (or (query-param "direction" _parsed) "desc")) + (limit (or (query-param "limit" _parsed) "10")) + (sort-by (or (query-param "sort-by" _parsed) "id")) + (offset (or (query-param "offset" _parsed) "0"))) + (with-connection (db) + (with-transaction + (mito:select-dao class + (sxql:limit limit) + (sxql:offset offset) + (make-order-by direction sort-by) + (make-where-clause _parsed)))))) + +;; TODO this is bad and could be re-written using mito:count-dao maybe? +(defun make-count-query (class _parsed) + (let ((place (with-connection (db) + (with-transaction + (mito:retrieve-by-sql + (sxql:select + ((:as (:count :id) :count)) + (sxql:from + (alexandria:make-keyword + (string-upcase + (mito.class:table-name (find-class class))))) + (make-where-clause _parsed))))))) + (getf (car place) :count))) + +(defun make-order-by (direction sort-by) + "Construct SXQL:ORDER-BY list values" + (let ((dir (if (string= direction "asc") + :asc + :desc)) + (sortby (if (member sort-by +param-field-whitelist+ :test #'string=) + (alexandria:make-keyword + (string-upcase sort-by)) + :id))) + (sxql:order-by (list dir sortby)))) diff --git a/src/web/setup.lisp b/src/web/setup.lisp new file mode 100644 index 0000000..0e67a85 --- /dev/null +++ b/src/web/setup.lisp @@ -0,0 +1,35 @@ +(in-package #:cl-deck-builder2.web) + +;; +;; Application + +(defclass () ()) +(defvar *web* (make-instance ')) +(clear-routing-rules *web*) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Aha,, figured it out. Hermetic Setup! +(setup + ;; str->bool, t if a username exists, nil otherwise + :user-p (lambda (str) + (ignore-errors + (find-dao 'user :email str))) + ;; str->str, maps a username to a password (hash, hopefully) + :user-pass (lambda (arg) + (ignore-errors + (mito-auth:password-hash + (find-dao 'user :email arg)))) + ;; str->(list sym), maps a username to a list of roles, + ;; for example: (:user) (:user :tester :staff) (:user :admin) + :user-roles (lambda (arg) + (ignore-errors + (mapcar #'name-of + (user-roles-of + (find-dao 'user :email arg))))) + ;; the /expression/ for the session object. ningle:*session* on + ;; Ningle . + :session caveman2:*session* + ;; A function that displays an "access denied" message + :denied (lambda (&optional params) + (declare (ignore params)) + (cl-markup:html5 (:h1 "Generic auth denied page")))) diff --git a/src/web/sse.lisp b/src/web/sse.lisp new file mode 100644 index 0000000..0b09e5b --- /dev/null +++ b/src/web/sse.lisp @@ -0,0 +1,88 @@ +#| + +src/web/sse.lisp + +HTMX Server Sent Events + +|# + +(in-package #:cl-user) + +(defpackage #:cl-deck-builder2.web.sse + (:use #:cl) + (:import-from #:websocket-driver + #:make-client + #:make-server + #:on + #:send + #:start-connection + #:close-connection) + (:import-from #:cl-deck-builder2.i18n + #:_) + (:local-nicknames (#:v #:org.shirakumo.verbose)) + (:export #:make-chat-client + #:make-chat-server + #:message)) + +(in-package #:cl-deck-builder2.web.sse) + +;; TODO (defclass chat-room () ()) +(defvar *connections* (make-hash-table)) + +(defvar *chat-handler* nil + "The WebSocket client on the server side.") + +(defun handle-new-connection (con) + (setf (gethash con *connections*) + ;; (format nil "user-~a" (random 100000)) + (princ-to-string (gensym "USER-")))) + +(defun broadcast-to-room (connection message) + (let ((message (format nil "

      ~a: ~a

      " + (gethash connection *connections*) + message))) + (loop :for con :being :the :hash-key :of *connections* :do + (send con message)))) + +(defun handle-close-connection (connection) + (let ((message (format nil "

      ... ~a disconnected.

      " + (gethash connection *connections*)))) + (loop :for con :being :the :hash-key :of *connections* :do + (send con message)))) + +(defun make-chat-server (env) + (handler-case + (let ((ws (make-server env))) + (on :open ws + (lambda () (handle-new-connection ws))) + + (on :message ws + (lambda (msg) (broadcast-to-room ws msg))) + + (on :close ws + (lambda (&key code reason) + (declare (ignore code reason)) + (handle-close-connection ws))) + + (lambda (responder) + (declare (ignore responder)) + (start-connection ws))) + (error (e) + (declare (ignore e)) + (_ "Something went wrong. Try again?")))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun make-chat-client (&key (address "localhost") (port 5001) (endpoint "chat-server") &allow-other-keys) + (let ((url (format nil "ws://~a:~d/~a" address port endpoint))) + (when *chat-handler* + (close-connection *chat-handler*) + (setf *chat-handler* nil)) + (setf *chat-handler* + (start-connection + (make-client url))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun message (message) + (unless *chat-handler* + (make-chat-client)) + (send *chat-handler* message)) diff --git a/src/web/test.lisp b/src/web/test.lisp new file mode 100644 index 0000000..967d7d9 --- /dev/null +++ b/src/web/test.lisp @@ -0,0 +1,56 @@ +#| + +Workbench Module + +|# + +(in-package #:cl-deck-builder2.web) + +(defroute ("/test" :method :GET) (&key _parsed) + "Workbench Test Route" + (if _parsed + (format nil "~a" _parsed) + (render-with-env #P"workbench/test.html" + (list :id 1)))) + +(defun selected-sets-to-deck-listing (cards) + (let ((lst '())) + (with-connection (db) + (with-transaction + (dolist (card cards lst) + (destructuring-bind (set variant) + card + (let ((set (mito:find-dao 'ygo-set :id (cdr set))) + (variant (mito:find-dao 'variant-condition :id (cdr variant)))) + (with-slots ((passcode-id cl-deck-builder2.models.ygoprodeck.classes::passcode-id)) + set + (push (list :ygo-set set + :condition variant + :ygo-card (mito:find-dao 'ygo-card :id passcode-id)) + lst))))))))) + +(defroute ("/test" :method :POST) (&key _parsed) + "Workbench Test Route" + ;; (v:info :test "POST /test ~a" _parsed) + ;; (format nil "~a" _parsed) + (render-with-env #P"construct/constructed-deck-list.html" + (list + (with-output-to-string (s) + (format s "
      ")
      +    (alexandria:if-let ((cards (query-param "cards" _parsed)))
      +      (format s "~a" (selected-sets-to-deck-listing cards)))
      +    (format s "
      "))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defroute ("/chat" :method :GET) () + "HTMX SSE Endpoint. Functional, but not in use. + +https://htmx.org/extensions/server-sent-events/" + (with-logged-in-user + (render-with-env #P"chat.html"))) + +(defroute ("/html" :method :GET) (&key |path|) + "Raw HTML viewer. Straight up render a file. Login Required." + (with-logged-in-user + (when |path| + (render-with-env (make-pathname :name |path|))))) diff --git a/src/web/tinymce.lisp b/src/web/tinymce.lisp new file mode 100644 index 0000000..f14a95f --- /dev/null +++ b/src/web/tinymce.lisp @@ -0,0 +1,61 @@ +#| + +src/web/tinymce.lisp + +TinyMCE Hosting + +TODO Handle POST Route + +|# + +(in-package #:cl-user) + +(defpackage #:cl-deck-builder2.web.tinymce + (:use #:cl) + (:import-from #:caveman2 + #: + #:defroute + #:clear-routing-rules) + (:import-from #:cl-deck-builder2.web + #:render-with-env) + (:local-nicknames (#:v #:org.shirakumo.verbose)) + (:export #:*web*)) + +(in-package #:cl-deck-builder2.web.tinymce) + +(defclass () ()) +(defvar *web* (make-instance ')) +(clear-routing-rules *web*) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defclass mce-document () + ((name :initarg :name) + (path :initarg :path) + (body :initarg :body))) + +(defvar *current-document* (make-instance 'mce-document :name "test" :path #P"/tmp/test")) + +(defun update-current-document (name body) + (reinitialize-instance *current-document* :name name + :body body)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defroute ("/" :method :GET) (&key _parsed) + "TinyMCE Index Page" + + ;; (declare (ignore _parsed)) + (v:info :tinymce "GET / ~a" _parsed) + + (render-with-env #P"tinymce/index.html" + `(:active ,"/tinymce" + :file ,*current-document*))) + +(defroute ("/" :method :POST) (&key |mode| |filename| |default| _parsed) + "TinyMCE POST Route: Handle User Input" + + (v:info :tinymce "POST / ~a" _parsed) + + (when (string= |mode| "create") + (update-current-document |filename| |default|)) + + (princ-to-string |default|)) diff --git a/src/web/toolkit.lisp b/src/web/toolkit.lisp new file mode 100644 index 0000000..ccf74b9 --- /dev/null +++ b/src/web/toolkit.lisp @@ -0,0 +1,78 @@ +#| + +src/web/toolkit.lisp + +Helper Functions - Web Toolkit + +TODO move to src/toolkit/web.lisp ? + +TODO Packaging up and exporting macros seems to be a bad idea, it +causes some kind of symbol errors. Maybe we need to be using the full +name of each thing in a defmacro? I feel like taichi would say don't +use a macro at all. + +|# + +(in-package #:cl-deck-builder2.web) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defparameter *md2html* "/usr/lib/cgit/filters/html-converters/md2html") + +(defmacro with-logged-in-user (&body body) + `(progn + ;; (v:info :web "~a" caveman2:*request*) + ;; + ;; Store the current REQUEST-PATH-INFO + ;; + ;; We lose the query parameters when we do it this way. Problem? Not sure. + ;; + ;; (setf (gethash :request-query-parameters caveman2:*session*) + ;; (lack.request:request-query-parameters caveman2:*request*)) + (setf (gethash :request-path-info caveman2:*session*) + (lack.request:request-path-info caveman2:*request*)) + (if (logged-in-p) + (progn + ,@body) + (progn + (flash-error (_ "Please log in.")) + (redirect "/user/login"))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun render-with-env (tpl &optional lst) + "Helper macro: APPEND some variables to ENV list passed to RENDER." + (render tpl + (append lst + `(:messages ,(flash-gethash) + :session ,*session* + :token ,(token) + :is-admin ,(ignore-errors + (user-admin-p + (find-user (user-name)))) + :is-verified ,(ignore-errors + (user-verified-p + (find-user (user-name)))) + :csrf_token ,(lack.middleware.csrf:csrf-token *session*))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun render-markdown (pathspec &key env title (tpl #P"markdown.html")) + "Render Markdown Page with template TPL" + (alexandria:if-let ((path (probe-file pathspec))) + (alexandria:if-let ((html (render-markdown-file pathspec))) + (render-with-env tpl + (append env + (list :title title :html html)))))) + +(defun render-markdown-file (pathspec) + "Wrap md2html from cgit installation." + (with-output-to-string (s) + (uiop:run-program *md2html* + :output s + :input pathspec))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun token () + "Helper function: get the CSRF token associated with this *REQUEST*." + ;; (cdr (assoc "lack.session" (request-cookies *request*) + ;; :test #'string=)) + ;; https://40ants.com/lisp-project-of-the-day/2020/06/0113-lack-middleware-csrf.html + (lack.middleware.csrf:csrf-html-tag *session*)) diff --git a/src/web/upload.lisp b/src/web/upload.lisp new file mode 100644 index 0000000..69497e3 --- /dev/null +++ b/src/web/upload.lisp @@ -0,0 +1,107 @@ +(in-package #:cl-deck-builder2.web) + +(defvar *icon-file-types* + (mapcar #'pathname-name + (mapcar (lambda (x) (uiop:enough-pathname x (merge-pathnames "img/file-icons-classic/" cl-deck-builder2.config::*static-directory*))) + (uiop:directory-files (merge-pathnames "img/file-icons-classic/" cl-deck-builder2.config::*static-directory*))))) + +(defun icon-or-url (file-url) + (let ((ext (pathname-type file-url)) + (thumbnails-allowed '("gif" "jpeg" "jpg" "png" "svg" "webp"))) + (cond + ((member ext thumbnails-allowed :test #'equal) file-url) + ((member ext *icon-file-types* :test #'equal) + (merge-pathnames + (make-pathname :directory "img/file-icons-classic" :name ext :type "svg") + cl-deck-builder2.config::*static-directory*)) + (t "/img/file-icons-classic/bin.svg")))) + +(defun render-upload-index-old () + "Helper Function. The purpose of RENDER-UPLOAD-INDEX is to generate a list of file information and thumbnail info from The files in the MITO-ATTACHMENT system. + +This is pretty crazy and probably needs to be unpacked into a few components: + +IMAGES: SELECT-DAO 'ATTACHMENT. This could probably just be something like GET-ATTACHMENTS. + +ICON-OR-URL: This component decides wether or not a provided URL might be a: JPG, PNG, GIF, SVG, etc., Binary File, or something we have icons for. + +THUMBNAILS-ALLOWED The supported viewable file types we want to forward straight to the web interface. + +ICON-EXISTS could probably use STATIC-PROBE-FILE-LIST. + +Then the final PLIST at the end could be similar to YDK-TO-TEMPLATE-DATA. ATTACHMENT-PLIST? + +We use icons from [dmhendricks/file-icon-vectors](https://github.com/dmhendricks/file-icon-vectors)." + (let ((images (select-attachment))) + (let ((files (mapcar + (lambda (image) + (let* ((url (mito-attachment:file-url image)) + (icon (icon-or-url url))) + `((:id . ,(mito:object-id image)) + (:url . ,url) + (:icon . ,icon) + (:attachment . ,image)))) + images))) + ))) + +(defun %images-to-plist (&rest images) + (let ((lst '())) + (dolist (image images (reverse lst)) + (let ((file-url (mito-attachment:file-url image))) + (push `((:id . ,(mito:object-id image)) + (:url . ,file-url) + (:icon . ,(icon-or-url file-url)) + (:attachment . ,image)) + lst))))) + +(defun render-upload-index () + (let* ((images (select-attachment)) + (files (apply #'%images-to-plist images))) + (render-with-env #P"upload.html" + `(:active "/upload" + :files ,files + :length ,(length images))))) + +(defroute ("/upload" :method :GET) () + "File Uploader Main Route." + (v:info :upload "GET /upload") + + (with-logged-in-user + (render-upload-index))) + +(defroute ("/upload" :method :POST) (&key _parsed) + "File Uploader POST processing Route. + +TODO Can this be merged with YDK uploader?" + (v:info :upload "POST /upload => ~a" _parsed) + + (with-logged-in-user + (let ((files (query-param "files" _parsed))) + (dolist (file files) + (destructuring-bind (content filename content-type) + file + (let ((success (create-attachment content filename content-type))) + (if success + (flash-message (format nil (_ "Upload success! ~a") + (mito-attachment:file-url success) + (mito-attachment:file-url success))) + (flash-error (_ "Error uploading file. Try again?"))))))) + (render-upload-index))) + +(defroute ("/upload/:id" :method :DELETE) (&key id) + "Remove an ATTACHMENT from the database using DELETE-BY-VALUES for ATTACHMENT by ID." + (v:info :upload "DELETE /upload/~d" id) + + (with-logged-in-user + (handler-case + (ratify:with-parsed-forms + ((:integer id)) + (let ((found (find-dao 'attachment :id id))) + (if found + (delete-by-values 'attachment :id id) + (progn + (flash-error (format nil (_ "No such attachment #~d") id)) + (redirect "/upload" 400))))) + (ratify:combined-error (e) + (flash-error e) + (redirect "/upload" 400))))) diff --git a/src/web/user.lisp b/src/web/user.lisp new file mode 100644 index 0000000..311c217 --- /dev/null +++ b/src/web/user.lisp @@ -0,0 +1,184 @@ +#| + +src/web/user.lisp + +User Interaction Frontend + +|# + +(in-package :cl-deck-builder2.web) + +;; This seems to be okay. The intent of overriding HERMETIC::AUTHORIZE +;; is we use MITO-AUTH for user authentication and their class isn't +;; just a password hash. So this is an undocumented way of customizing +;; authorization method using HERMETIC. +(defun hermetic::authorize (username password) + (let ((object (funcall hermetic::*user-p* username))) + (and object + (string= (mito-auth:password-hash object) + (mito-auth::make-password-hash + password + (mito-auth:password-salt object)))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun already-logged-in-redirect () + "Tell the user they are already logged in, and send them to the home page." + (progn + (flash-error (format nil (_ "You are already logged in as: ~a") + (user-name))) + (redirect "/"))) + +(defun user-exists-register-redirect () + "Tell the user that email address already is registered, and send them to the registration page." + (progn + (flash-error (_ "A user with that email is already registered.")) + (redirect "/user/register" 302))) + +(defun login-redirect (email password &optional (target "/")) + "Try to log in using HERMETIC::LOGIN, and display an appropriate message upon success. + +TARGET may be set to the redirect target, and is provided from :REQUEST-PATH-INFO in *SESSION*." + (handler-case + (ratify:with-parsed-forms + ((:email email) + (:string password)) + (let ((params (list :|username| email :|password| password))) + (login params + (progn + (flash-message (format nil (_ "Hello, ~a!") + (user-name))) + (redirect target)) + (progn + (flash-error (_ "Incorrect password.")) + (redirect "/user/login")) + (progn + (flash-error (_ "No user corresponding to this email address.")) + (redirect "/user/login"))))) + (ratify:combined-error (e) + (flash-error e) + (redirect "/user/login" 302)))) + +(defun register-new-user (name email password) + "Try to register a new user by first SELECTing any matching USERs with EMAIL. If there is a match, use USER-EXISTS-REGISTER-REDIRECT. +Otherwise, create a new user, display the appropriate message, and redirect." + (handler-case + (ratify:with-parsed-forms + ((:string name) + (:string password) + (:email email)) + (with-connection (db) + (let ((found (mito:find-dao 'user :email email))) + ;; Try to select this username, if a username is returned, the + ;; user already exists, and display error. + ;; + ;; Otherwise, create the user and add to the database. + ;; Automatically direct to index.html on success. + (if found + (user-exists-register-redirect) + (progn + (if (create-user name email password) + (progn + (flash-message (_ "Success! Please log in.")) + (redirect "/user/login")) + (progn + (flash-message (_ "Something went wrong. Try again?")) + (redirect "/user/register")))))))) + (ratify:combined-error (e) + (flash-error e) + (flash-error (_ "Something went wrong. Try again?")) + (redirect "/user/register")))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun render-user-list (&optional (tpl #P"user/index.html")) + "Helper function. Display User Index page." + (render-with-env tpl + `(:active "/user" + :user-list ,(select-dao 'user)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defroute ("/user" :method :GET) () + "User Settings Main Index Page." + (with-logged-in-user + (render-with-env #P"user/index.html" + `(:active "/user")))) + +(defroute ("/user/login" :method :GET) () + "User Login Route - require the user to log in." + ;; Always display the USER/LOGIN page + (if (ignore-errors + (logged-in-p)) + (already-logged-in-redirect) + (render-with-env #P"user/login.html" + `(:active "/user")))) + +(defroute ("/user/login" :method :POST) (&key _parsed) + "User Login POST Route. We use HERMETIC:LOGGED-IN-P to do all the heavy lifting. LOGIN-REDIRECT does the redirect." + (v:info :web "POST /user/login => ~a" _parsed) + + ;; (v:info :web "REQUEST-PATH-INFO: ~a SESSION-REQUEST-PATH-INFO: ~a" + ;; (lack.request:request-path-info *request*) + ;; (gethash :request-path-info *session*)) + + (if (logged-in-p) + (already-logged-in-redirect) + (login-redirect (query-param "email" _parsed) + (query-param "password" _parsed) + (gethash :request-path-info *session*)))) + +;; TODO successmessage and errormessages +;; TODO POST /user/logout ? Currently just GET /user/logout will log you out :P +(defroute "/user/logout" () + "User Logout Route. GET request. Querying this from anywhere with the LACK.SESSION cookie set will trigger a logout and redirect." + (logout + (flash-message (_ "Logged out.")) + (flash-error (_ "You aren't logged in."))) + (redirect "/" 302)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Register +;; TODO React To Session Cookie In default.html +;; Not sure what this is about^ +(defroute ("/user/register" :method :GET) () + "User Registration Main Route. Registration required!" + (let ((logged-in (logged-in-p))) + (if logged-in + (already-logged-in-redirect) + (render-with-env #P"user/register.html" + `(:active "/user"))))) + +(defroute ("/user/register" :method :POST) (&key _parsed) + "User Registration POST Route. REGISTER-NEW-USER does all the work." + (v:info :web "POST /user/register => ~a" _parsed) + + (let ((logged-in (logged-in-p))) + (if logged-in + (already-logged-in-redirect) + (register-new-user (query-param "name" _parsed) + (query-param "email" _parsed) + (query-param "password" _parsed))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defroute ("/user/:id/delete" :method :POST) (&key id) + "User DELETE Route. ADMIN role only." + (v:info :user "DELETE /user ~d" id) + (handler-case + (ratify:with-parsed-forms + ((:integer id)) + (auth (:admin) + (with-connection (db) + (mito:delete-by-values 'user :id id) + ""))) + (ratify:combined-error (e) + (flash-error e)))) + +(defroute ("/user/:id/roles" :method :GET) (&key id) + "User Roles Route. ADMIN role only." + (auth (:admin) + (format nil "~{~s~^ ~}" + (mapcar #'name-of + (user-roles-of (find-dao 'user :id id)))))) + +(defroute ("/user/admin" :method :GET) () + "Main User List Route. ADMIN role only." + (auth (:admin) + (render-user-list #P"user/admin.html"))) diff --git a/src/web/widget.lisp b/src/web/widget.lisp new file mode 100644 index 0000000..1fdf8d3 --- /dev/null +++ b/src/web/widget.lisp @@ -0,0 +1,71 @@ +#| + +This is probably a complete waste of time, but this is a WIDGET class +that encapsulates doing stuff with web widgets. + +See the [reblocks Quickstart](https://40ants.com/reblocks/quickstart/) for more information on how this is intended to be structured and used. + +There are no guarantees that any of this is sane or useful. + +#+BEGIN_SRC +CLASS ztf_handler DEFINITION +TYPES t_sap_tables TYPE STANDARD TABLE OF dd02t WITH EMPTY KEY. + +DATA path TYPE string. +DATA searched_string TYPE string. +DATA page TYPE i. + +METHODS html_page RETURNING VALUE(html) TYPE string. +METHODS html_shellbar RETURNING VALUE(html) TYPE string. +METHODS html_searchbar RETURNING VALUE(html) TYPE string. +METHODS html_table RETURNING VALUE(html) TYPE string. +METHODS html_table_rows RETURNING VALUE(html) TYPE string. + +METHODS sap_table_getcount RETURNING VALUE(count) TYPE i. +METHODS sap_table_getlist RETURNING VALUE(sap_tables) TYPE t_sap_tables. +#+END_SRC +|# + +(defpackage #:cl-deck-builder2.web.widget + (:use #:cl + #:caveman2) + (:import-from #:cl-deck-builder2.web + #:render-with-env)) + +(in-package #:cl-deck-builder2.web.widget) + +(defclass widget-base (standard-object) + ((tables :accessor widget-tables + :initarg :tables + :initform '()) + ;; Hash table of registered templates. Mapping :PAGE to #P"page.html" + (templates :accessor widget-templates + :initform (make-hash-table))) + (:documentation "The WIDGET-BASE is the base class for other WIDGET objects. We have the minimum info: the environment TABLES and the template PATH.")) + +(defmethod widget-path ((obj widget-base) tag) + (gethash tag (widget-templates obj))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defmethod html-page ((obj widget-base) tag) + (render-with-env + (widget-path obj tag) + (list (widget-tables obj)))) + +(defmethod html-shellbar ((obj widget-bells)) + (render-with-env (widget-search-path obj) + (list (widget-tables obj)))) + +(in-package #:cl-deck-builder2.web) + +(defparameter *w* (make-instance 'cl-deck-builder2.web.widget::widget-bells + :path #P"workbench/tabs.html" + :search-path #P"workbench/test.html")) + +(defroute ("/test" :method :GET) (&key _parsed) + (declare (ignore _parsed)) + (cl-deck-builder2.web.widget::html-page *w*)) + +(defroute ("/test2" :method :GET) (&key _parsed) + (declare (ignore _parsed)) + (cl-deck-builder2.web.widget::html-shellbar *w*)) diff --git a/src/web/ydk.lisp b/src/web/ydk.lisp new file mode 100644 index 0000000..f495d6f --- /dev/null +++ b/src/web/ydk.lisp @@ -0,0 +1,101 @@ +(in-package #:cl-deck-builder2.web) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Helper Functions +(defun upload-deck-by-content (name content &optional (sort t)) + "Helper Function. Create a new YDK deck with CREATED-BY set, a new deck name of NAME, with deck CONTENT. Optionally if SORT is T (which it is by default), sort the deck with YDK-SORTED before committing it to the database, with YDK-SYNC." + ;; TODO RATIFY:WITH-PARSED-FORMS here? + (assert (and name content)) + + ;; Insert the Deck + (let ((ydk (make-instance 'ydk :created-by "UPLOAD-DECK-BY-CONTENT" + :content content :name name))) + (unless ydk + (flash-error (_ "Something went wrong. Try again?")) + (redirect "/ydk")) + + (if sort + (setf ydk (ydk-sorted ydk))) + + (let ((deck (ignore-errors + (ydk-sync ydk)))) + (if deck + (redirect (format nil "/decks/~d/view" (mito:object-id deck))) + (progn + (flash-error (_ "Something went wrong. Try again?")) + (redirect "/ydk")))))) + +;; TODO Since we now accept multiple file uploads, we'll also either have to: +;; 1) Allow multiple file names +;; 2) Disallow naming multiple file uploads +;; 3) Something else +(defun process-uploaded-files (files query query-filename &optional (random-filename nil)) + "Helper Function. Process FILES uploaded in the YDK POST route." + (v:info :ydk "PROCESS-UPLOADED-FILES: ~a ~a ~a" files query query-filename) + (if files + (dolist (file files) + (destructuring-bind (content filename content-type) + file + + ;; First - if the user specified a filename, use that as the file name. + (ignore-errors + (ratify:with-parsed-forms + ((:string query-filename)) + (setf filename query-filename))) + + ;; If RANDOM-FILENAME is T, just use a random file key anyway. + (if random-filename + (setf filename + (random-pathname-name + :type (pathname-type filename)))) + + ;; Then - Try to save whatever was uploaded using CREATE-ATTACHMENT-FROM-UPLOAD + (let ((attachment (create-attachment content filename content-type))) + ;; Then - If that was successful, use *that* newly + ;; created ATTACHMENT and pass it to + ;; UPLOAD-DECK-BY-CONTENT which is the old mechanism we + ;; first wrote, that handles everything nicely with + ;; YDK-SYNC and YDK-SORTED abstracting things. + (if attachment + (upload-deck-by-content filename + (uiop:slurp-stream-string + (mito-attachment:get-object attachment))) + (progn + (flash :errors "YDK Upload failed! Try again?") + (redirect "/ydk" 302)))))) + (progn + ;; If QUERY-FILENAME is set, supersede FILENAME with that. + ;; If we got here something went wrong with the FILE + ;; parse. Try to use QUERY before flashing an error. We do + ;; the same thing - enfore :STRING with + ;; RATIFY:WITH-PARSED-FORMS. Maybe this is a good case for + ;; RESTART-CASE? + (handler-case + (ratify:with-parsed-forms + ((:string query) + (:string query-filename)) + (flash :messages "YDK-SUBMIT: using QUERY instead of FILE-QUERY") + (upload-deck-by-content query-filename query)) + (ratify:combined-error (e) + (flash :errors (format nil "YDK Upload failed! Try again?~%~a" e)) + (redirect "/ydk" 302)))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; YDK Upload +(defroute ("/ydk" :method :GET) () + "YDK Upload Main Route" + (v:info :ydk "GET /ydk") + + (with-logged-in-user + (render-with-env #P"ydk/index.html" + `(:active "/ydk")))) + + +(defroute ("/ydk" :method :POST) (&key _parsed) + "YDK Upload POST Processing Route" + (v:info :ydk "POST /ydk => ~a" _parsed) + + (with-logged-in-user + (process-uploaded-files (query-param "files" _parsed) + (query-param "query" _parsed) + (query-param "filename" _parsed)))) diff --git a/src/workers/main.lisp b/src/workers/main.lisp new file mode 100644 index 0000000..4bf25a8 --- /dev/null +++ b/src/workers/main.lisp @@ -0,0 +1,13 @@ +(in-package #:cl-user) + +(defpackage #:cl-deck-builder2.workers + (:use :cl) + (:export :background-job)) + +(in-package #:cl-deck-builder2.workers) + +;; Background-Job class for saving metadata into RDBMS +(defclass background-job (psy:worker) ()) + +(defmethod psy:perform ((psy:worker background-job) &rest args) + (format nil "Hello, world!~#[~:; Here are my args: ~a~]~%" args)) diff --git a/static/css/site.css b/static/css/site.css new file mode 100644 index 0000000..0e7e01f --- /dev/null +++ b/static/css/site.css @@ -0,0 +1,133 @@ +@charset "UTF-8"; + +body, html { + height: 100%; +} + +#main { + min-height: 90%; + background-image: url("/img/noise.png"); + background-repeat: repeat; +} + +.footer { + color: white; + background-image: linear-gradient(#2367a9, #050a30); +} + +/* https://www.w3schools.com/howto/howto_css_zoom_hover.asp */ +.zoom { + transition: transform .2s; /* Animation */ + width: auto; + height: auto; +} + +.zoom:hover { + /* (1000% zoom - Note: if the zoom is too large, it will go outside of the viewport) + TranslateX by 50% to prevent overflow */ + transform: scale(1.2); +} + +/* https://htmx.org/attributes/hx-indicator/ */ +.htmx-indicator{ + display:none; + opacity:0; + transition: opacity 500ms ease-in; +} +.htmx-request .htmx-indicator{ + display:inline-block; + opacity:1; +} +.htmx-request.htmx-indicator{ + display:inline-block; + opacity:1; +} + +/*********************************************************************************/ +.htmx-swapping div, tr.htmx-swapping td { + opacity: 0; + transition: opacity 1s ease-out; +} + +/*********************************************************************************/ +/* */ +.main-deck-list { + color: #000; + background-color: #FF8B53; + background-image: url("/img/noise.png"); + background-blend-mode: overlay; +} +.extra-deck-list { + color: #000; + background-color: #BC5A84; + background-image: url("/img/noise.png"); + background-blend-mode: overlay; +} +.side-deck-list { + color: #000; + background-color: #1D9E74; + background-image: url("/img/noise.png"); + background-blend-mode: overlay; +} + +/*********************************************************************************/ +/* background-image: url("/img/noise.png"), linear-gradient(rgba(0,0,0,0.5),rgba(0,0,0,0.5)); */ +.effect {color: #000; background-color: #FF8B53; background-image: url("/img/noise.png"); } +.fusion {color: #000; background-color: #A086B7; background-image: url("/img/noise.png"); } +.link {color: #fff; background-color: #00008B; background-image: url("/img/noise.png"); } +.normal {color: #000; background-color: #FDE68A; background-image: url("/img/noise.png"); } +.ritual {color: #000; background-color: #9DB5CC; background-image: url("/img/noise.png"); } +.skill {color: #fff; background-color: #078cc4; background-image: url("/img/noise.png"); } +.spell {color: #fff; background-color: #1D9E74; background-image: url("/img/noise.png"); } +.synchro {color: #000; background-color: #CCCCCC; background-image: url("/img/noise.png"); } +.token {color: #000; background-color: #C0C0C0; background-image: url("/img/noise.png"); } +.trap {color: #fff; background-color: #BC5A84; background-image: url("/img/noise.png"); } +.xyz {color: #fff; background-color: #000; background-image: url("/img/noise.png"); } + +/*********************************************************************************/ +.effect_pendulum { + color: #000; + background-color: #1d9e74; + background-image: url("/img/noise.png"), linear-gradient(#ff8b53 20%, rgba(0,0,0,0) 100%); + background-blend-mode: normal; +} +.fusion_pendulum { + color: #000; + background-color: #1d9e74; + background-image: url("/img/noise.png"), linear-gradient(#a086b7 20%, rgba(0,0,0,0) 100%); + background-blend-mode: normal; +} +.normal_pendulum { + color: #000; + background-color: #1d9e74; + background-image: url("/img/noise.png"), linear-gradient(#fde68a 20%, rgba(0,0,0,0) 100%); + background-blend-mode: normal; +} +.ritual_pendulum { + color: #000; + background-color: #1d9e74; + background-image: url("/img/noise.png"), linear-gradient(#9db5cc 20%, rgba(0,0,0,0) 100%); + background-blend-mode: normal; +} +.synchro_pendulum { + color: #000; + background-color: #1d9e74; + background-image: url("/img/noise.png"), linear-gradient(#cccccc 20%, rgba(0,0,0,0) 100%); + background-blend-mode: normal; +} +.xyz_pendulum { + color: #fff; + background-color: #1d9e74; + background-image: url("/img/noise.png"), linear-gradient(#000 20%, rgba(0,0,0,0) 100%); + background-blend-mode: normal; +} + +input[type=number] { + -moz-appearance: textfield; + appearance: textfield; + margin: 0; +} + +[data-loading] { + display: none; +} diff --git a/static/css/w3.css b/static/css/w3.css new file mode 100644 index 0000000..fd89e8d --- /dev/null +++ b/static/css/w3.css @@ -0,0 +1,235 @@ +/* W3.CSS 4.15 December 2020 by Jan Egil and Borge Refsnes */ +html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit} +/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */ +html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0} +article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}summary{display:list-item} +audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline} +audio:not([controls]){display:none;height:0}[hidden],template{display:none} +a{background-color:transparent}a:active,a:hover{outline-width:0} +abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted} +b,strong{font-weight:bolder}dfn{font-style:italic}mark{background:#ff0;color:#000} +small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} +sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none} +code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible} +button,input,select,textarea,optgroup{font:inherit;margin:0}optgroup{font-weight:bold} +button,input{overflow:visible}button,select{text-transform:none} +button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button} +button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0} +button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText} +fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em} +legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto} +[type=checkbox],[type=radio]{padding:0} +[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto} +[type=search]{-webkit-appearance:textfield;outline-offset:-2px} +[type=search]::-webkit-search-decoration{-webkit-appearance:none} +::-webkit-file-upload-button{-webkit-appearance:button;font:inherit} +/* End extract */ +html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden} +h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px} +.w3-serif{font-family:serif}.w3-sans-serif{font-family:sans-serif}.w3-cursive{font-family:cursive}.w3-monospace{font-family:monospace} +h1,h2,h3,h4,h5,h6{font-family:"Segoe UI",Arial,sans-serif;font-weight:400;margin:10px 0}.w3-wide{letter-spacing:4px} +hr{border:0;border-top:1px solid #eee;margin:20px 0} +.w3-image{max-width:100%;height:auto}img{vertical-align:middle}a{color:inherit} +.w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}.w3-table-all{border:1px solid #ccc} +.w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1} +.w3-table-all tr:nth-child(odd){background-color:#fff}.w3-table-all tr:nth-child(even){background-color:#f1f1f1} +.w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}.w3-centered tr th,.w3-centered tr td{text-align:center} +.w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top} +.w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px} +.w3-btn,.w3-button{border:none;display:inline-block;padding:8px 16px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap} +.w3-btn:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)} +.w3-btn,.w3-button{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} +.w3-disabled,.w3-btn:disabled,.w3-button:disabled{cursor:not-allowed;opacity:0.3}.w3-disabled *,:disabled *{pointer-events:none} +.w3-btn.w3-disabled:hover,.w3-btn:disabled:hover{box-shadow:none} +.w3-badge,.w3-tag{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;text-align:center}.w3-badge{border-radius:50%} +.w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none} +.w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block} +.w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s} +.w3-input{padding:8px;display:block;border:none;border-bottom:1px solid #ccc;width:100%} +.w3-select{padding:9px 0;width:100%;border:none;border-bottom:1px solid #ccc} +.w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer} +.w3-dropdown-hover:hover .w3-dropdown-content{display:block} +.w3-dropdown-hover:first-child,.w3-dropdown-click:hover{background-color:#ccc;color:#000} +.w3-dropdown-hover:hover > .w3-button:first-child,.w3-dropdown-click:hover > .w3-button:first-child{background-color:#ccc;color:#000} +.w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0;z-index:1} +.w3-check,.w3-radio{width:24px;height:24px;position:relative;top:6px} +.w3-sidebar{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto} +.w3-bar-block .w3-dropdown-hover,.w3-bar-block .w3-dropdown-click{width:100%} +.w3-bar-block .w3-dropdown-hover .w3-dropdown-content,.w3-bar-block .w3-dropdown-click .w3-dropdown-content{min-width:100%} +.w3-bar-block .w3-dropdown-hover .w3-button,.w3-bar-block .w3-dropdown-click .w3-button{width:100%;text-align:left;padding:8px 16px} +.w3-main,#main{transition:margin-left .4s} +.w3-modal{z-index:3;display:none;padding-top:100px;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4)} +.w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px} +.w3-bar{width:100%;overflow:hidden}.w3-center .w3-bar{display:inline-block;width:auto} +.w3-bar .w3-bar-item{padding:8px 16px;float:left;width:auto;border:none;display:block;outline:0} +.w3-bar .w3-dropdown-hover,.w3-bar .w3-dropdown-click{position:static;float:left} +.w3-bar .w3-button{white-space:normal} +.w3-bar-block .w3-bar-item{width:100%;display:block;padding:8px 16px;text-align:left;border:none;white-space:normal;float:none;outline:0} +.w3-bar-block.w3-center .w3-bar-item{text-align:center}.w3-block{display:block;width:100%} +.w3-responsive{display:block;overflow-x:auto} +.w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before, +.w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after{content:"";display:table;clear:both} +.w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%} +.w3-col.s1{width:8.33333%}.w3-col.s2{width:16.66666%}.w3-col.s3{width:24.99999%}.w3-col.s4{width:33.33333%} +.w3-col.s5{width:41.66666%}.w3-col.s6{width:49.99999%}.w3-col.s7{width:58.33333%}.w3-col.s8{width:66.66666%} +.w3-col.s9{width:74.99999%}.w3-col.s10{width:83.33333%}.w3-col.s11{width:91.66666%}.w3-col.s12{width:99.99999%} +@media (min-width:601px){.w3-col.m1{width:8.33333%}.w3-col.m2{width:16.66666%}.w3-col.m3,.w3-quarter{width:24.99999%}.w3-col.m4,.w3-third{width:33.33333%} +.w3-col.m5{width:41.66666%}.w3-col.m6,.w3-half{width:49.99999%}.w3-col.m7{width:58.33333%}.w3-col.m8,.w3-twothird{width:66.66666%} +.w3-col.m9,.w3-threequarter{width:74.99999%}.w3-col.m10{width:83.33333%}.w3-col.m11{width:91.66666%}.w3-col.m12{width:99.99999%}} +@media (min-width:993px){.w3-col.l1{width:8.33333%}.w3-col.l2{width:16.66666%}.w3-col.l3{width:24.99999%}.w3-col.l4{width:33.33333%} +.w3-col.l5{width:41.66666%}.w3-col.l6{width:49.99999%}.w3-col.l7{width:58.33333%}.w3-col.l8{width:66.66666%} +.w3-col.l9{width:74.99999%}.w3-col.l10{width:83.33333%}.w3-col.l11{width:91.66666%}.w3-col.l12{width:99.99999%}} +.w3-rest{overflow:hidden}.w3-stretch{margin-left:-16px;margin-right:-16px} +.w3-content,.w3-auto{margin-left:auto;margin-right:auto}.w3-content{max-width:980px}.w3-auto{max-width:1140px} +.w3-cell-row{display:table;width:100%}.w3-cell{display:table-cell} +.w3-cell-top{vertical-align:top}.w3-cell-middle{vertical-align:middle}.w3-cell-bottom{vertical-align:bottom} +.w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important} +@media (max-width:1205px){.w3-auto{max-width:95%}} +@media (max-width:600px){.w3-modal-content{margin:0 10px;width:auto!important}.w3-modal{padding-top:30px} +.w3-dropdown-hover.w3-mobile .w3-dropdown-content,.w3-dropdown-click.w3-mobile .w3-dropdown-content{position:relative} +.w3-hide-small{display:none!important}.w3-mobile{display:block;width:100%!important}.w3-bar-item.w3-mobile,.w3-dropdown-hover.w3-mobile,.w3-dropdown-click.w3-mobile{text-align:center} +.w3-dropdown-hover.w3-mobile,.w3-dropdown-hover.w3-mobile .w3-btn,.w3-dropdown-hover.w3-mobile .w3-button,.w3-dropdown-click.w3-mobile,.w3-dropdown-click.w3-mobile .w3-btn,.w3-dropdown-click.w3-mobile .w3-button{width:100%}} +@media (max-width:768px){.w3-modal-content{width:500px}.w3-modal{padding-top:50px}} +@media (min-width:993px){.w3-modal-content{width:900px}.w3-hide-large{display:none!important}.w3-sidebar.w3-collapse{display:block!important}} +@media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}} +@media (max-width:992px){.w3-sidebar.w3-collapse{display:none}.w3-main{margin-left:0!important;margin-right:0!important}.w3-auto{max-width:100%}} +.w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0} +.w3-overlay{position:fixed;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:2} +.w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0} +.w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0} +.w3-display-middle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)} +.w3-display-left{position:absolute;top:50%;left:0%;transform:translate(0%,-50%);-ms-transform:translate(-0%,-50%)} +.w3-display-right{position:absolute;top:50%;right:0%;transform:translate(0%,-50%);-ms-transform:translate(0%,-50%)} +.w3-display-topmiddle{position:absolute;left:50%;top:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} +.w3-display-bottommiddle{position:absolute;left:50%;bottom:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} +.w3-display-container:hover .w3-display-hover{display:block}.w3-display-container:hover span.w3-display-hover{display:inline-block}.w3-display-hover{display:none} +.w3-display-position{position:absolute} +.w3-circle{border-radius:50%} +.w3-round-small{border-radius:2px}.w3-round,.w3-round-medium{border-radius:4px}.w3-round-large{border-radius:8px}.w3-round-xlarge{border-radius:16px}.w3-round-xxlarge{border-radius:32px} +.w3-row-padding,.w3-row-padding>.w3-half,.w3-row-padding>.w3-third,.w3-row-padding>.w3-twothird,.w3-row-padding>.w3-threequarter,.w3-row-padding>.w3-quarter,.w3-row-padding>.w3-col{padding:0 8px} +.w3-container,.w3-panel{padding:0.01em 16px}.w3-panel{margin-top:16px;margin-bottom:16px} +.w3-code,.w3-codespan{font-family:Consolas,"courier new";font-size:16px} +.w3-code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word} +.w3-codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%} +.w3-card,.w3-card-2{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)} +.w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19)} +.w3-spin{animation:w3-spin 2s infinite linear}@keyframes w3-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}} +.w3-animate-fading{animation:fading 10s infinite}@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}} +.w3-animate-opacity{animation:opac 0.8s}@keyframes opac{from{opacity:0} to{opacity:1}} +.w3-animate-top{position:relative;animation:animatetop 0.4s}@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}} +.w3-animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}} +.w3-animate-right{position:relative;animation:animateright 0.4s}@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}} +.w3-animate-bottom{position:relative;animation:animatebottom 0.4s}@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}} +.w3-animate-zoom {animation:animatezoom 0.6s}@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}} +.w3-animate-input{transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important} +.w3-opacity,.w3-hover-opacity:hover{opacity:0.60}.w3-opacity-off,.w3-hover-opacity-off:hover{opacity:1} +.w3-opacity-max{opacity:0.25}.w3-opacity-min{opacity:0.75} +.w3-greyscale-max,.w3-grayscale-max,.w3-hover-greyscale:hover,.w3-hover-grayscale:hover{filter:grayscale(100%)} +.w3-greyscale,.w3-grayscale{filter:grayscale(75%)}.w3-greyscale-min,.w3-grayscale-min{filter:grayscale(50%)} +.w3-sepia{filter:sepia(75%)}.w3-sepia-max,.w3-hover-sepia:hover{filter:sepia(100%)}.w3-sepia-min{filter:sepia(50%)} +.w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}.w3-medium{font-size:15px!important}.w3-large{font-size:18px!important} +.w3-xlarge{font-size:24px!important}.w3-xxlarge{font-size:36px!important}.w3-xxxlarge{font-size:48px!important}.w3-jumbo{font-size:64px!important} +.w3-left-align{text-align:left!important}.w3-right-align{text-align:right!important}.w3-justify{text-align:justify!important}.w3-center{text-align:center!important} +.w3-border-0{border:0!important}.w3-border{border:1px solid #ccc!important} +.w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important} +.w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important} +.w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important} +.w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important} +.w3-section,.w3-code{margin-top:16px!important;margin-bottom:16px!important} +.w3-margin{margin:16px!important}.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important} +.w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important} +.w3-padding-small{padding:4px 8px!important}.w3-padding{padding:8px 16px!important}.w3-padding-large{padding:12px 24px!important} +.w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important} +.w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important} +.w3-padding-64{padding-top:64px!important;padding-bottom:64px!important} +.w3-padding-top-64{padding-top:64px!important}.w3-padding-top-48{padding-top:48px!important} +.w3-padding-top-32{padding-top:32px!important}.w3-padding-top-24{padding-top:24px!important} +.w3-left{float:left!important}.w3-right{float:right!important} +.w3-button:hover{color:#000!important;background-color:#ccc!important} +.w3-transparent,.w3-hover-none:hover{background-color:transparent!important} +.w3-hover-none:hover{box-shadow:none!important} +/* Colors */ +.w3-amber,.w3-hover-amber:hover{color:#000!important;background-color:#ffc107!important} +.w3-aqua,.w3-hover-aqua:hover{color:#000!important;background-color:#00ffff!important} +.w3-blue,.w3-hover-blue:hover{color:#fff!important;background-color:#2196F3!important} +.w3-light-blue,.w3-hover-light-blue:hover{color:#000!important;background-color:#87CEEB!important} +.w3-brown,.w3-hover-brown:hover{color:#fff!important;background-color:#795548!important} +.w3-cyan,.w3-hover-cyan:hover{color:#000!important;background-color:#00bcd4!important} +.w3-blue-grey,.w3-hover-blue-grey:hover,.w3-blue-gray,.w3-hover-blue-gray:hover{color:#fff!important;background-color:#607d8b!important} +.w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important} +.w3-light-green,.w3-hover-light-green:hover{color:#000!important;background-color:#8bc34a!important} +.w3-indigo,.w3-hover-indigo:hover{color:#fff!important;background-color:#3f51b5!important} +.w3-khaki,.w3-hover-khaki:hover{color:#000!important;background-color:#f0e68c!important} +.w3-lime,.w3-hover-lime:hover{color:#000!important;background-color:#cddc39!important} +.w3-orange,.w3-hover-orange:hover{color:#000!important;background-color:#ff9800!important} +.w3-deep-orange,.w3-hover-deep-orange:hover{color:#fff!important;background-color:#ff5722!important} +.w3-pink,.w3-hover-pink:hover{color:#fff!important;background-color:#e91e63!important} +.w3-purple,.w3-hover-purple:hover{color:#fff!important;background-color:#9c27b0!important} +.w3-deep-purple,.w3-hover-deep-purple:hover{color:#fff!important;background-color:#673ab7!important} +.w3-red,.w3-hover-red:hover{color:#fff!important;background-color:#f44336!important} +.w3-sand,.w3-hover-sand:hover{color:#000!important;background-color:#fdf5e6!important} +.w3-teal,.w3-hover-teal:hover{color:#fff!important;background-color:#009688!important} +.w3-yellow,.w3-hover-yellow:hover{color:#000!important;background-color:#ffeb3b!important} +.w3-white,.w3-hover-white:hover{color:#000!important;background-color:#fff!important} +.w3-black,.w3-hover-black:hover{color:#fff!important;background-color:#000!important} +.w3-grey,.w3-hover-grey:hover,.w3-gray,.w3-hover-gray:hover{color:#000!important;background-color:#9e9e9e!important} +.w3-light-grey,.w3-hover-light-grey:hover,.w3-light-gray,.w3-hover-light-gray:hover{color:#000!important;background-color:#f1f1f1!important} +.w3-dark-grey,.w3-hover-dark-grey:hover,.w3-dark-gray,.w3-hover-dark-gray:hover{color:#fff!important;background-color:#616161!important} +.w3-pale-red,.w3-hover-pale-red:hover{color:#000!important;background-color:#ffdddd!important} +.w3-pale-green,.w3-hover-pale-green:hover{color:#000!important;background-color:#ddffdd!important} +.w3-pale-yellow,.w3-hover-pale-yellow:hover{color:#000!important;background-color:#ffffcc!important} +.w3-pale-blue,.w3-hover-pale-blue:hover{color:#000!important;background-color:#ddffff!important} +.w3-text-amber,.w3-hover-text-amber:hover{color:#ffc107!important} +.w3-text-aqua,.w3-hover-text-aqua:hover{color:#00ffff!important} +.w3-text-blue,.w3-hover-text-blue:hover{color:#2196F3!important} +.w3-text-light-blue,.w3-hover-text-light-blue:hover{color:#87CEEB!important} +.w3-text-brown,.w3-hover-text-brown:hover{color:#795548!important} +.w3-text-cyan,.w3-hover-text-cyan:hover{color:#00bcd4!important} +.w3-text-blue-grey,.w3-hover-text-blue-grey:hover,.w3-text-blue-gray,.w3-hover-text-blue-gray:hover{color:#607d8b!important} +.w3-text-green,.w3-hover-text-green:hover{color:#4CAF50!important} +.w3-text-light-green,.w3-hover-text-light-green:hover{color:#8bc34a!important} +.w3-text-indigo,.w3-hover-text-indigo:hover{color:#3f51b5!important} +.w3-text-khaki,.w3-hover-text-khaki:hover{color:#b4aa50!important} +.w3-text-lime,.w3-hover-text-lime:hover{color:#cddc39!important} +.w3-text-orange,.w3-hover-text-orange:hover{color:#ff9800!important} +.w3-text-deep-orange,.w3-hover-text-deep-orange:hover{color:#ff5722!important} +.w3-text-pink,.w3-hover-text-pink:hover{color:#e91e63!important} +.w3-text-purple,.w3-hover-text-purple:hover{color:#9c27b0!important} +.w3-text-deep-purple,.w3-hover-text-deep-purple:hover{color:#673ab7!important} +.w3-text-red,.w3-hover-text-red:hover{color:#f44336!important} +.w3-text-sand,.w3-hover-text-sand:hover{color:#fdf5e6!important} +.w3-text-teal,.w3-hover-text-teal:hover{color:#009688!important} +.w3-text-yellow,.w3-hover-text-yellow:hover{color:#d2be0e!important} +.w3-text-white,.w3-hover-text-white:hover{color:#fff!important} +.w3-text-black,.w3-hover-text-black:hover{color:#000!important} +.w3-text-grey,.w3-hover-text-grey:hover,.w3-text-gray,.w3-hover-text-gray:hover{color:#757575!important} +.w3-text-light-grey,.w3-hover-text-light-grey:hover,.w3-text-light-gray,.w3-hover-text-light-gray:hover{color:#f1f1f1!important} +.w3-text-dark-grey,.w3-hover-text-dark-grey:hover,.w3-text-dark-gray,.w3-hover-text-dark-gray:hover{color:#3a3a3a!important} +.w3-border-amber,.w3-hover-border-amber:hover{border-color:#ffc107!important} +.w3-border-aqua,.w3-hover-border-aqua:hover{border-color:#00ffff!important} +.w3-border-blue,.w3-hover-border-blue:hover{border-color:#2196F3!important} +.w3-border-light-blue,.w3-hover-border-light-blue:hover{border-color:#87CEEB!important} +.w3-border-brown,.w3-hover-border-brown:hover{border-color:#795548!important} +.w3-border-cyan,.w3-hover-border-cyan:hover{border-color:#00bcd4!important} +.w3-border-blue-grey,.w3-hover-border-blue-grey:hover,.w3-border-blue-gray,.w3-hover-border-blue-gray:hover{border-color:#607d8b!important} +.w3-border-green,.w3-hover-border-green:hover{border-color:#4CAF50!important} +.w3-border-light-green,.w3-hover-border-light-green:hover{border-color:#8bc34a!important} +.w3-border-indigo,.w3-hover-border-indigo:hover{border-color:#3f51b5!important} +.w3-border-khaki,.w3-hover-border-khaki:hover{border-color:#f0e68c!important} +.w3-border-lime,.w3-hover-border-lime:hover{border-color:#cddc39!important} +.w3-border-orange,.w3-hover-border-orange:hover{border-color:#ff9800!important} +.w3-border-deep-orange,.w3-hover-border-deep-orange:hover{border-color:#ff5722!important} +.w3-border-pink,.w3-hover-border-pink:hover{border-color:#e91e63!important} +.w3-border-purple,.w3-hover-border-purple:hover{border-color:#9c27b0!important} +.w3-border-deep-purple,.w3-hover-border-deep-purple:hover{border-color:#673ab7!important} +.w3-border-red,.w3-hover-border-red:hover{border-color:#f44336!important} +.w3-border-sand,.w3-hover-border-sand:hover{border-color:#fdf5e6!important} +.w3-border-teal,.w3-hover-border-teal:hover{border-color:#009688!important} +.w3-border-yellow,.w3-hover-border-yellow:hover{border-color:#ffeb3b!important} +.w3-border-white,.w3-hover-border-white:hover{border-color:#fff!important} +.w3-border-black,.w3-hover-border-black:hover{border-color:#000!important} +.w3-border-grey,.w3-hover-border-grey:hover,.w3-border-gray,.w3-hover-border-gray:hover{border-color:#9e9e9e!important} +.w3-border-light-grey,.w3-hover-border-light-grey:hover,.w3-border-light-gray,.w3-hover-border-light-gray:hover{border-color:#f1f1f1!important} +.w3-border-dark-grey,.w3-hover-border-dark-grey:hover,.w3-border-dark-gray,.w3-hover-border-dark-gray:hover{border-color:#616161!important} +.w3-border-pale-red,.w3-hover-border-pale-red:hover{border-color:#ffe7e7!important}.w3-border-pale-green,.w3-hover-border-pale-green:hover{border-color:#e7ffe7!important} +.w3-border-pale-yellow,.w3-hover-border-pale-yellow:hover{border-color:#ffffcc!important}.w3-border-pale-blue,.w3-hover-border-pale-blue:hover{border-color:#e7ffff!important} \ No newline at end of file diff --git a/static/favicon.png b/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..a1f00f733bb3b11bf47aafec429ed18bc497582d GIT binary patch literal 12319 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 literal 0 HcmV?d00001 diff --git a/static/img/attribute/Continuous.svg b/static/img/attribute/Continuous.svg new file mode 100644 index 0000000..967def8 --- /dev/null +++ b/static/img/attribute/Continuous.svg @@ -0,0 +1,376 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + Created by Falzar FZ + + + + Created by Falzar FZ + + + + + + + + diff --git a/static/img/attribute/Counter.svg b/static/img/attribute/Counter.svg new file mode 100644 index 0000000..5519ff7 --- /dev/null +++ b/static/img/attribute/Counter.svg @@ -0,0 +1,366 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + Created by Falzar FZ + + + + + + + + + + diff --git a/static/img/attribute/DARK.svg b/static/img/attribute/DARK.svg new file mode 100644 index 0000000..c30722e --- /dev/null +++ b/static/img/attribute/DARK.svg @@ -0,0 +1,451 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + Created by Falzar FZ + + + + + + + + + + + + + + + + + + diff --git a/static/img/attribute/DIVINE.svg b/static/img/attribute/DIVINE.svg new file mode 100644 index 0000000..dadf9c5 --- /dev/null +++ b/static/img/attribute/DIVINE.svg @@ -0,0 +1,378 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + Created by Falzar FZ + + + + + + + + + + + + + + + + + + + diff --git a/static/img/attribute/EARTH.svg b/static/img/attribute/EARTH.svg new file mode 100644 index 0000000..a71e67f --- /dev/null +++ b/static/img/attribute/EARTH.svg @@ -0,0 +1,607 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + Created by Falzar FZ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/attribute/Equip.svg b/static/img/attribute/Equip.svg new file mode 100644 index 0000000..c7afb59 --- /dev/null +++ b/static/img/attribute/Equip.svg @@ -0,0 +1,455 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + Created by Falzar FZ + + + + + + + + + + diff --git a/static/img/attribute/FIRE.svg b/static/img/attribute/FIRE.svg new file mode 100644 index 0000000..2a87c01 --- /dev/null +++ b/static/img/attribute/FIRE.svg @@ -0,0 +1,418 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + Created by Falzar FZ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/attribute/Field.svg b/static/img/attribute/Field.svg new file mode 100644 index 0000000..ed99803 --- /dev/null +++ b/static/img/attribute/Field.svg @@ -0,0 +1,456 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + Created by Falzar FZ + + + + + + + + diff --git a/static/img/attribute/LIGHT.svg b/static/img/attribute/LIGHT.svg new file mode 100644 index 0000000..1f6b54e --- /dev/null +++ b/static/img/attribute/LIGHT.svg @@ -0,0 +1,387 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + Created by Falzar FZ + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/attribute/Normal-N.svg b/static/img/attribute/Normal-N.svg new file mode 100644 index 0000000..c03fa8e --- /dev/null +++ b/static/img/attribute/Normal-N.svg @@ -0,0 +1,353 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + Created by Falzar FZ + + + + + + + + diff --git a/static/img/attribute/Normal.svg b/static/img/attribute/Normal.svg new file mode 100644 index 0000000..2ad94ad --- /dev/null +++ b/static/img/attribute/Normal.svg @@ -0,0 +1,348 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + Created by Falzar FZ + + + + + + + diff --git a/static/img/attribute/Quick-Play.svg b/static/img/attribute/Quick-Play.svg new file mode 100644 index 0000000..703c7f9 --- /dev/null +++ b/static/img/attribute/Quick-Play.svg @@ -0,0 +1,454 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + Created by Falzar FZ + + + + + + + + + diff --git a/static/img/attribute/Ritual.svg b/static/img/attribute/Ritual.svg new file mode 100644 index 0000000..97909dd --- /dev/null +++ b/static/img/attribute/Ritual.svg @@ -0,0 +1,360 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + Created by Falzar FZ + + + + + + + diff --git a/static/img/attribute/SPELL.svg b/static/img/attribute/SPELL.svg new file mode 100644 index 0000000..b62fe6b --- /dev/null +++ b/static/img/attribute/SPELL.svg @@ -0,0 +1,785 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + Created by Falzar FZ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/attribute/TRAP.svg b/static/img/attribute/TRAP.svg new file mode 100644 index 0000000..90428e2 --- /dev/null +++ b/static/img/attribute/TRAP.svg @@ -0,0 +1,701 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + Created by Falzar FZ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/attribute/WATER.svg b/static/img/attribute/WATER.svg new file mode 100644 index 0000000..f9971d5 --- /dev/null +++ b/static/img/attribute/WATER.svg @@ -0,0 +1,816 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + Created by Falzar FZ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/attribute/WIND.svg b/static/img/attribute/WIND.svg new file mode 100644 index 0000000..2c7ea4e --- /dev/null +++ b/static/img/attribute/WIND.svg @@ -0,0 +1,280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + Created by Falzar FZ + + + + + + + + + + + + + diff --git a/static/img/file-icons-classic/3g2.svg b/static/img/file-icons-classic/3g2.svg new file mode 100644 index 0000000..5e4bc6e --- /dev/null +++ b/static/img/file-icons-classic/3g2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/3ga.svg b/static/img/file-icons-classic/3ga.svg new file mode 100644 index 0000000..a5390d7 --- /dev/null +++ b/static/img/file-icons-classic/3ga.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/3gp.svg b/static/img/file-icons-classic/3gp.svg new file mode 100644 index 0000000..81c39c1 --- /dev/null +++ b/static/img/file-icons-classic/3gp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/7z.svg b/static/img/file-icons-classic/7z.svg new file mode 100644 index 0000000..76f519a --- /dev/null +++ b/static/img/file-icons-classic/7z.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/aa.svg b/static/img/file-icons-classic/aa.svg new file mode 100644 index 0000000..5d02cef --- /dev/null +++ b/static/img/file-icons-classic/aa.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/aac.svg b/static/img/file-icons-classic/aac.svg new file mode 100644 index 0000000..d9a4b8b --- /dev/null +++ b/static/img/file-icons-classic/aac.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ac.svg b/static/img/file-icons-classic/ac.svg new file mode 100644 index 0000000..808eaf3 --- /dev/null +++ b/static/img/file-icons-classic/ac.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/accdb.svg b/static/img/file-icons-classic/accdb.svg new file mode 100644 index 0000000..048fbe5 --- /dev/null +++ b/static/img/file-icons-classic/accdb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/accdt.svg b/static/img/file-icons-classic/accdt.svg new file mode 100644 index 0000000..b11abe6 --- /dev/null +++ b/static/img/file-icons-classic/accdt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ace.svg b/static/img/file-icons-classic/ace.svg new file mode 100644 index 0000000..7f21f0b --- /dev/null +++ b/static/img/file-icons-classic/ace.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/adn.svg b/static/img/file-icons-classic/adn.svg new file mode 100644 index 0000000..4ec6387 --- /dev/null +++ b/static/img/file-icons-classic/adn.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ai.svg b/static/img/file-icons-classic/ai.svg new file mode 100644 index 0000000..3720c35 --- /dev/null +++ b/static/img/file-icons-classic/ai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/aif.svg b/static/img/file-icons-classic/aif.svg new file mode 100644 index 0000000..dcf73f4 --- /dev/null +++ b/static/img/file-icons-classic/aif.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/aifc.svg b/static/img/file-icons-classic/aifc.svg new file mode 100644 index 0000000..910866f --- /dev/null +++ b/static/img/file-icons-classic/aifc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/aiff.svg b/static/img/file-icons-classic/aiff.svg new file mode 100644 index 0000000..79d3263 --- /dev/null +++ b/static/img/file-icons-classic/aiff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ait.svg b/static/img/file-icons-classic/ait.svg new file mode 100644 index 0000000..09db707 --- /dev/null +++ b/static/img/file-icons-classic/ait.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/amr.svg b/static/img/file-icons-classic/amr.svg new file mode 100644 index 0000000..771c5d9 --- /dev/null +++ b/static/img/file-icons-classic/amr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ani.svg b/static/img/file-icons-classic/ani.svg new file mode 100644 index 0000000..b494ce6 --- /dev/null +++ b/static/img/file-icons-classic/ani.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/apk.svg b/static/img/file-icons-classic/apk.svg new file mode 100644 index 0000000..88ef63b --- /dev/null +++ b/static/img/file-icons-classic/apk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/app.svg b/static/img/file-icons-classic/app.svg new file mode 100644 index 0000000..d4fbb83 --- /dev/null +++ b/static/img/file-icons-classic/app.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/applescript.svg b/static/img/file-icons-classic/applescript.svg new file mode 100644 index 0000000..aeb4a94 --- /dev/null +++ b/static/img/file-icons-classic/applescript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/asax.svg b/static/img/file-icons-classic/asax.svg new file mode 100644 index 0000000..6b502a6 --- /dev/null +++ b/static/img/file-icons-classic/asax.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/asc.svg b/static/img/file-icons-classic/asc.svg new file mode 100644 index 0000000..7bebc88 --- /dev/null +++ b/static/img/file-icons-classic/asc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ascx.svg b/static/img/file-icons-classic/ascx.svg new file mode 100644 index 0000000..80e5399 --- /dev/null +++ b/static/img/file-icons-classic/ascx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/asf.svg b/static/img/file-icons-classic/asf.svg new file mode 100644 index 0000000..4000fd8 --- /dev/null +++ b/static/img/file-icons-classic/asf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ash.svg b/static/img/file-icons-classic/ash.svg new file mode 100644 index 0000000..d7ebb97 --- /dev/null +++ b/static/img/file-icons-classic/ash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ashx.svg b/static/img/file-icons-classic/ashx.svg new file mode 100644 index 0000000..5a16bc4 --- /dev/null +++ b/static/img/file-icons-classic/ashx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/asm.svg b/static/img/file-icons-classic/asm.svg new file mode 100644 index 0000000..1ab99da --- /dev/null +++ b/static/img/file-icons-classic/asm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/asmx.svg b/static/img/file-icons-classic/asmx.svg new file mode 100644 index 0000000..4c25036 --- /dev/null +++ b/static/img/file-icons-classic/asmx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/asp.svg b/static/img/file-icons-classic/asp.svg new file mode 100644 index 0000000..e1481df --- /dev/null +++ b/static/img/file-icons-classic/asp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/aspx.svg b/static/img/file-icons-classic/aspx.svg new file mode 100644 index 0000000..f110284 --- /dev/null +++ b/static/img/file-icons-classic/aspx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/asx.svg b/static/img/file-icons-classic/asx.svg new file mode 100644 index 0000000..45b8947 --- /dev/null +++ b/static/img/file-icons-classic/asx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/au.svg b/static/img/file-icons-classic/au.svg new file mode 100644 index 0000000..3929f29 --- /dev/null +++ b/static/img/file-icons-classic/au.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/aup.svg b/static/img/file-icons-classic/aup.svg new file mode 100644 index 0000000..0cfa832 --- /dev/null +++ b/static/img/file-icons-classic/aup.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/avi.svg b/static/img/file-icons-classic/avi.svg new file mode 100644 index 0000000..3616d30 --- /dev/null +++ b/static/img/file-icons-classic/avi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/axd.svg b/static/img/file-icons-classic/axd.svg new file mode 100644 index 0000000..73be59c --- /dev/null +++ b/static/img/file-icons-classic/axd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/aze.svg b/static/img/file-icons-classic/aze.svg new file mode 100644 index 0000000..1aa3912 --- /dev/null +++ b/static/img/file-icons-classic/aze.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/bak.svg b/static/img/file-icons-classic/bak.svg new file mode 100644 index 0000000..93794cb --- /dev/null +++ b/static/img/file-icons-classic/bak.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/bash.svg b/static/img/file-icons-classic/bash.svg new file mode 100644 index 0000000..62df364 --- /dev/null +++ b/static/img/file-icons-classic/bash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/bat.svg b/static/img/file-icons-classic/bat.svg new file mode 100644 index 0000000..310e22b --- /dev/null +++ b/static/img/file-icons-classic/bat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/bin.svg b/static/img/file-icons-classic/bin.svg new file mode 100644 index 0000000..e2abd50 --- /dev/null +++ b/static/img/file-icons-classic/bin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/blank.svg b/static/img/file-icons-classic/blank.svg new file mode 100644 index 0000000..f28402e --- /dev/null +++ b/static/img/file-icons-classic/blank.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/bmp.svg b/static/img/file-icons-classic/bmp.svg new file mode 100644 index 0000000..1c80620 --- /dev/null +++ b/static/img/file-icons-classic/bmp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/bowerrc.svg b/static/img/file-icons-classic/bowerrc.svg new file mode 100644 index 0000000..a4ddbd6 --- /dev/null +++ b/static/img/file-icons-classic/bowerrc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/bpg.svg b/static/img/file-icons-classic/bpg.svg new file mode 100644 index 0000000..99fa884 --- /dev/null +++ b/static/img/file-icons-classic/bpg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/browser.svg b/static/img/file-icons-classic/browser.svg new file mode 100644 index 0000000..79fa571 --- /dev/null +++ b/static/img/file-icons-classic/browser.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/bz2.svg b/static/img/file-icons-classic/bz2.svg new file mode 100644 index 0000000..2c0f0b0 --- /dev/null +++ b/static/img/file-icons-classic/bz2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/bzempty.svg b/static/img/file-icons-classic/bzempty.svg new file mode 100644 index 0000000..237cb71 --- /dev/null +++ b/static/img/file-icons-classic/bzempty.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/c.svg b/static/img/file-icons-classic/c.svg new file mode 100644 index 0000000..229cb40 --- /dev/null +++ b/static/img/file-icons-classic/c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/cab.svg b/static/img/file-icons-classic/cab.svg new file mode 100644 index 0000000..f58a984 --- /dev/null +++ b/static/img/file-icons-classic/cab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/cad.svg b/static/img/file-icons-classic/cad.svg new file mode 100644 index 0000000..bfd9531 --- /dev/null +++ b/static/img/file-icons-classic/cad.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/caf.svg b/static/img/file-icons-classic/caf.svg new file mode 100644 index 0000000..e55477f --- /dev/null +++ b/static/img/file-icons-classic/caf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/cal.svg b/static/img/file-icons-classic/cal.svg new file mode 100644 index 0000000..4134281 --- /dev/null +++ b/static/img/file-icons-classic/cal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/catalog.json b/static/img/file-icons-classic/catalog.json new file mode 100644 index 0000000..357913b --- /dev/null +++ b/static/img/file-icons-classic/catalog.json @@ -0,0 +1 @@ +["3g2","3ga","3gp","7z","aa","aac","ac","accdb","accdt","ace","adn","ai","aif","aifc","aiff","ait","amr","ani","apk","app","applescript","asax","asc","ascx","asf","ash","ashx","asm","asmx","asp","aspx","asx","au","aup","avi","axd","aze","bak","bash","bat","bin","blank","bmp","bowerrc","bpg","browser","bz2","bzempty","c","cab","cad","caf","cal","cd","cdda","cer","cfg","cfm","cfml","cgi","chm","class","cmd","code-workspace","codekit","coffee","coffeelintignore","com","compile","conf","config","cpp","cptx","cr2","crdownload","crt","crypt","cs","csh","cson","csproj","css","csv","cue","cur","dart","dat","data","db","dbf","deb","default","dgn","dist","diz","dll","dmg","dng","doc","docb","docm","docx","dot","dotm","dotx","download","dpj","ds_store","dsn","dtd","dwg","dxf","editorconfig","el","elf","eml","enc","eot","eps","epub","eslintignore","exe","f4v","fax","fb2","fla","flac","flv","fnt","folder","fon","gadget","gdp","gem","gif","gitattributes","gitignore","go","gpg","gpl","gradle","gz","h","handlebars","hbs","heic","hlp","hs","hsl","htm","html","ibooks","icns","ico","ics","idx","iff","ifo","image","img","iml","in","inc","indd","inf","info","ini","inv","iso","j2","jar","java","jpe","jpeg","jpg","js","json","jsp","jsx","key","kf8","kmk","ksh","kt","kts","kup","less","lex","licx","lisp","lit","lnk","lock","log","lua","m","m2v","m3u","m3u8","m4","m4a","m4r","m4v","map","master","mc","md","mdb","mdf","me","mi","mid","midi","mk","mkv","mm","mng","mo","mobi","mod","mov","mp2","mp3","mp4","mpa","mpd","mpe","mpeg","mpg","mpga","mpp","mpt","msg","msi","msu","nef","nes","nfo","nix","npmignore","ocx","odb","ods","odt","ogg","ogv","ost","otf","ott","ova","ovf","p12","p7b","pages","part","pcd","pdb","pdf","pem","pfx","pgp","ph","phar","php","pid","pkg","pl","plist","pm","png","po","pom","pot","potx","pps","ppsx","ppt","pptm","pptx","prop","ps","ps1","psd","psp","pst","pub","py","pyc","qt","ra","ram","rar","raw","rb","rdf","rdl","reg","resx","retry","rm","rom","rpm","rpt","rsa","rss","rst","rtf","ru","rub","sass","scss","sdf","sed","sh","sit","sitemap","skin","sldm","sldx","sln","sol","sphinx","sql","sqlite","step","stl","svg","swd","swf","swift","swp","sys","tar","tax","tcsh","tex","tfignore","tga","tgz","tif","tiff","tmp","tmx","torrent","tpl","ts","tsv","ttf","twig","txt","udf","vb","vbproj","vbs","vcd","vcf","vcs","vdi","vdx","vmdk","vob","vox","vscodeignore","vsd","vss","vst","vsx","vtx","war","wav","wbk","webinfo","webm","webp","wma","wmf","wmv","woff","woff2","wps","wsf","xaml","xcf","xfl","xlm","xls","xlsm","xlsx","xlt","xltm","xltx","xml","xpi","xps","xrb","xsd","xsl","xspf","xz","yaml","yml","z","zip","zsh"] \ No newline at end of file diff --git a/static/img/file-icons-classic/cd.svg b/static/img/file-icons-classic/cd.svg new file mode 100644 index 0000000..27e0e2f --- /dev/null +++ b/static/img/file-icons-classic/cd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/cdda.svg b/static/img/file-icons-classic/cdda.svg new file mode 100644 index 0000000..b416484 --- /dev/null +++ b/static/img/file-icons-classic/cdda.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/cer.svg b/static/img/file-icons-classic/cer.svg new file mode 100644 index 0000000..a96586c --- /dev/null +++ b/static/img/file-icons-classic/cer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/cfg.svg b/static/img/file-icons-classic/cfg.svg new file mode 100644 index 0000000..5889d5d --- /dev/null +++ b/static/img/file-icons-classic/cfg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/cfm.svg b/static/img/file-icons-classic/cfm.svg new file mode 100644 index 0000000..993e0ab --- /dev/null +++ b/static/img/file-icons-classic/cfm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/cfml.svg b/static/img/file-icons-classic/cfml.svg new file mode 100644 index 0000000..c07fa40 --- /dev/null +++ b/static/img/file-icons-classic/cfml.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/cgi.svg b/static/img/file-icons-classic/cgi.svg new file mode 100644 index 0000000..0ba2e2b --- /dev/null +++ b/static/img/file-icons-classic/cgi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/chm.svg b/static/img/file-icons-classic/chm.svg new file mode 100644 index 0000000..a96a118 --- /dev/null +++ b/static/img/file-icons-classic/chm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/class.svg b/static/img/file-icons-classic/class.svg new file mode 100644 index 0000000..ce2d4cd --- /dev/null +++ b/static/img/file-icons-classic/class.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/cmd.svg b/static/img/file-icons-classic/cmd.svg new file mode 100644 index 0000000..a666c36 --- /dev/null +++ b/static/img/file-icons-classic/cmd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/code-workspace.svg b/static/img/file-icons-classic/code-workspace.svg new file mode 100644 index 0000000..a3e0e35 --- /dev/null +++ b/static/img/file-icons-classic/code-workspace.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/codekit.svg b/static/img/file-icons-classic/codekit.svg new file mode 100644 index 0000000..ccba98e --- /dev/null +++ b/static/img/file-icons-classic/codekit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/coffee.svg b/static/img/file-icons-classic/coffee.svg new file mode 100644 index 0000000..fa087a5 --- /dev/null +++ b/static/img/file-icons-classic/coffee.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/coffeelintignore.svg b/static/img/file-icons-classic/coffeelintignore.svg new file mode 100644 index 0000000..2dd1c39 --- /dev/null +++ b/static/img/file-icons-classic/coffeelintignore.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/com.svg b/static/img/file-icons-classic/com.svg new file mode 100644 index 0000000..aeca78c --- /dev/null +++ b/static/img/file-icons-classic/com.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/compile.svg b/static/img/file-icons-classic/compile.svg new file mode 100644 index 0000000..3a51e60 --- /dev/null +++ b/static/img/file-icons-classic/compile.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/conf.svg b/static/img/file-icons-classic/conf.svg new file mode 100644 index 0000000..a1362aa --- /dev/null +++ b/static/img/file-icons-classic/conf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/config.svg b/static/img/file-icons-classic/config.svg new file mode 100644 index 0000000..b95e77c --- /dev/null +++ b/static/img/file-icons-classic/config.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/cpp.svg b/static/img/file-icons-classic/cpp.svg new file mode 100644 index 0000000..f827eff --- /dev/null +++ b/static/img/file-icons-classic/cpp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/cptx.svg b/static/img/file-icons-classic/cptx.svg new file mode 100644 index 0000000..0a07c09 --- /dev/null +++ b/static/img/file-icons-classic/cptx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/cr2.svg b/static/img/file-icons-classic/cr2.svg new file mode 100644 index 0000000..0f9aede --- /dev/null +++ b/static/img/file-icons-classic/cr2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/crdownload.svg b/static/img/file-icons-classic/crdownload.svg new file mode 100644 index 0000000..0b12bfb --- /dev/null +++ b/static/img/file-icons-classic/crdownload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/crt.svg b/static/img/file-icons-classic/crt.svg new file mode 100644 index 0000000..196f65c --- /dev/null +++ b/static/img/file-icons-classic/crt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/crypt.svg b/static/img/file-icons-classic/crypt.svg new file mode 100644 index 0000000..5263b6e --- /dev/null +++ b/static/img/file-icons-classic/crypt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/cs.svg b/static/img/file-icons-classic/cs.svg new file mode 100644 index 0000000..97490c4 --- /dev/null +++ b/static/img/file-icons-classic/cs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/csh.svg b/static/img/file-icons-classic/csh.svg new file mode 100644 index 0000000..e5404cb --- /dev/null +++ b/static/img/file-icons-classic/csh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/cson.svg b/static/img/file-icons-classic/cson.svg new file mode 100644 index 0000000..03f30b8 --- /dev/null +++ b/static/img/file-icons-classic/cson.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/csproj.svg b/static/img/file-icons-classic/csproj.svg new file mode 100644 index 0000000..46ab7fe --- /dev/null +++ b/static/img/file-icons-classic/csproj.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/css.svg b/static/img/file-icons-classic/css.svg new file mode 100644 index 0000000..76c8666 --- /dev/null +++ b/static/img/file-icons-classic/css.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/csv.svg b/static/img/file-icons-classic/csv.svg new file mode 100644 index 0000000..1a54426 --- /dev/null +++ b/static/img/file-icons-classic/csv.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/cue.svg b/static/img/file-icons-classic/cue.svg new file mode 100644 index 0000000..634320c --- /dev/null +++ b/static/img/file-icons-classic/cue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/cur.svg b/static/img/file-icons-classic/cur.svg new file mode 100644 index 0000000..a091449 --- /dev/null +++ b/static/img/file-icons-classic/cur.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/dart.svg b/static/img/file-icons-classic/dart.svg new file mode 100644 index 0000000..7c2a6d9 --- /dev/null +++ b/static/img/file-icons-classic/dart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/dat.svg b/static/img/file-icons-classic/dat.svg new file mode 100644 index 0000000..0351bf8 --- /dev/null +++ b/static/img/file-icons-classic/dat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/data.svg b/static/img/file-icons-classic/data.svg new file mode 100644 index 0000000..a455a99 --- /dev/null +++ b/static/img/file-icons-classic/data.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/db.svg b/static/img/file-icons-classic/db.svg new file mode 100644 index 0000000..6996d94 --- /dev/null +++ b/static/img/file-icons-classic/db.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/dbf.svg b/static/img/file-icons-classic/dbf.svg new file mode 100644 index 0000000..6d89194 --- /dev/null +++ b/static/img/file-icons-classic/dbf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/deb.svg b/static/img/file-icons-classic/deb.svg new file mode 100644 index 0000000..50a1910 --- /dev/null +++ b/static/img/file-icons-classic/deb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/default.svg b/static/img/file-icons-classic/default.svg new file mode 100644 index 0000000..b19f8fb --- /dev/null +++ b/static/img/file-icons-classic/default.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/dgn.svg b/static/img/file-icons-classic/dgn.svg new file mode 100644 index 0000000..ba44e93 --- /dev/null +++ b/static/img/file-icons-classic/dgn.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/dist.svg b/static/img/file-icons-classic/dist.svg new file mode 100644 index 0000000..2cff977 --- /dev/null +++ b/static/img/file-icons-classic/dist.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/diz.svg b/static/img/file-icons-classic/diz.svg new file mode 100644 index 0000000..8b9b5e6 --- /dev/null +++ b/static/img/file-icons-classic/diz.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/dll.svg b/static/img/file-icons-classic/dll.svg new file mode 100644 index 0000000..1f4c8a8 --- /dev/null +++ b/static/img/file-icons-classic/dll.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/dmg.svg b/static/img/file-icons-classic/dmg.svg new file mode 100644 index 0000000..aa7af78 --- /dev/null +++ b/static/img/file-icons-classic/dmg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/dng.svg b/static/img/file-icons-classic/dng.svg new file mode 100644 index 0000000..96c26c4 --- /dev/null +++ b/static/img/file-icons-classic/dng.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/doc.svg b/static/img/file-icons-classic/doc.svg new file mode 100644 index 0000000..78a9ee7 --- /dev/null +++ b/static/img/file-icons-classic/doc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/docb.svg b/static/img/file-icons-classic/docb.svg new file mode 100644 index 0000000..c97a3e7 --- /dev/null +++ b/static/img/file-icons-classic/docb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/docm.svg b/static/img/file-icons-classic/docm.svg new file mode 100644 index 0000000..fa38edb --- /dev/null +++ b/static/img/file-icons-classic/docm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/docx.svg b/static/img/file-icons-classic/docx.svg new file mode 100644 index 0000000..d3529a1 --- /dev/null +++ b/static/img/file-icons-classic/docx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/dot.svg b/static/img/file-icons-classic/dot.svg new file mode 100644 index 0000000..e131871 --- /dev/null +++ b/static/img/file-icons-classic/dot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/dotm.svg b/static/img/file-icons-classic/dotm.svg new file mode 100644 index 0000000..8c08479 --- /dev/null +++ b/static/img/file-icons-classic/dotm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/dotx.svg b/static/img/file-icons-classic/dotx.svg new file mode 100644 index 0000000..a951ccb --- /dev/null +++ b/static/img/file-icons-classic/dotx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/download.svg b/static/img/file-icons-classic/download.svg new file mode 100644 index 0000000..c670c80 --- /dev/null +++ b/static/img/file-icons-classic/download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/dpj.svg b/static/img/file-icons-classic/dpj.svg new file mode 100644 index 0000000..142328c --- /dev/null +++ b/static/img/file-icons-classic/dpj.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ds_store.svg b/static/img/file-icons-classic/ds_store.svg new file mode 100644 index 0000000..b860f97 --- /dev/null +++ b/static/img/file-icons-classic/ds_store.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/dsn.svg b/static/img/file-icons-classic/dsn.svg new file mode 100644 index 0000000..3c70360 --- /dev/null +++ b/static/img/file-icons-classic/dsn.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/dtd.svg b/static/img/file-icons-classic/dtd.svg new file mode 100644 index 0000000..64f56f8 --- /dev/null +++ b/static/img/file-icons-classic/dtd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/dwg.svg b/static/img/file-icons-classic/dwg.svg new file mode 100644 index 0000000..f57d6f9 --- /dev/null +++ b/static/img/file-icons-classic/dwg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/dxf.svg b/static/img/file-icons-classic/dxf.svg new file mode 100644 index 0000000..e8853df --- /dev/null +++ b/static/img/file-icons-classic/dxf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/editorconfig.svg b/static/img/file-icons-classic/editorconfig.svg new file mode 100644 index 0000000..765d647 --- /dev/null +++ b/static/img/file-icons-classic/editorconfig.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/el.svg b/static/img/file-icons-classic/el.svg new file mode 100644 index 0000000..8319a05 --- /dev/null +++ b/static/img/file-icons-classic/el.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/elf.svg b/static/img/file-icons-classic/elf.svg new file mode 100644 index 0000000..27fdc42 --- /dev/null +++ b/static/img/file-icons-classic/elf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/eml.svg b/static/img/file-icons-classic/eml.svg new file mode 100644 index 0000000..5702b29 --- /dev/null +++ b/static/img/file-icons-classic/eml.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/enc.svg b/static/img/file-icons-classic/enc.svg new file mode 100644 index 0000000..7ded266 --- /dev/null +++ b/static/img/file-icons-classic/enc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/eot.svg b/static/img/file-icons-classic/eot.svg new file mode 100644 index 0000000..8a36828 --- /dev/null +++ b/static/img/file-icons-classic/eot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/eps.svg b/static/img/file-icons-classic/eps.svg new file mode 100644 index 0000000..9d03fe9 --- /dev/null +++ b/static/img/file-icons-classic/eps.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/epub.svg b/static/img/file-icons-classic/epub.svg new file mode 100644 index 0000000..9bcf867 --- /dev/null +++ b/static/img/file-icons-classic/epub.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/eslintignore.svg b/static/img/file-icons-classic/eslintignore.svg new file mode 100644 index 0000000..2dd1c39 --- /dev/null +++ b/static/img/file-icons-classic/eslintignore.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/exe.svg b/static/img/file-icons-classic/exe.svg new file mode 100644 index 0000000..7f57732 --- /dev/null +++ b/static/img/file-icons-classic/exe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/f4v.svg b/static/img/file-icons-classic/f4v.svg new file mode 100644 index 0000000..c418480 --- /dev/null +++ b/static/img/file-icons-classic/f4v.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/fax.svg b/static/img/file-icons-classic/fax.svg new file mode 100644 index 0000000..b6b9e97 --- /dev/null +++ b/static/img/file-icons-classic/fax.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/fb2.svg b/static/img/file-icons-classic/fb2.svg new file mode 100644 index 0000000..97600ef --- /dev/null +++ b/static/img/file-icons-classic/fb2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/fla.svg b/static/img/file-icons-classic/fla.svg new file mode 100644 index 0000000..eb7fb1e --- /dev/null +++ b/static/img/file-icons-classic/fla.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/flac.svg b/static/img/file-icons-classic/flac.svg new file mode 100644 index 0000000..6b92fd7 --- /dev/null +++ b/static/img/file-icons-classic/flac.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/flv.svg b/static/img/file-icons-classic/flv.svg new file mode 100644 index 0000000..6145082 --- /dev/null +++ b/static/img/file-icons-classic/flv.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/fnt.svg b/static/img/file-icons-classic/fnt.svg new file mode 100644 index 0000000..d3880cf --- /dev/null +++ b/static/img/file-icons-classic/fnt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/folder.svg b/static/img/file-icons-classic/folder.svg new file mode 100644 index 0000000..f5969c3 --- /dev/null +++ b/static/img/file-icons-classic/folder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/fon.svg b/static/img/file-icons-classic/fon.svg new file mode 100644 index 0000000..ce380f6 --- /dev/null +++ b/static/img/file-icons-classic/fon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/gadget.svg b/static/img/file-icons-classic/gadget.svg new file mode 100644 index 0000000..176bcc0 --- /dev/null +++ b/static/img/file-icons-classic/gadget.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/gdp.svg b/static/img/file-icons-classic/gdp.svg new file mode 100644 index 0000000..7fb05c6 --- /dev/null +++ b/static/img/file-icons-classic/gdp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/gem.svg b/static/img/file-icons-classic/gem.svg new file mode 100644 index 0000000..212b500 --- /dev/null +++ b/static/img/file-icons-classic/gem.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/gif.svg b/static/img/file-icons-classic/gif.svg new file mode 100644 index 0000000..5c5024b --- /dev/null +++ b/static/img/file-icons-classic/gif.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/gitattributes.svg b/static/img/file-icons-classic/gitattributes.svg new file mode 100644 index 0000000..7e0aba6 --- /dev/null +++ b/static/img/file-icons-classic/gitattributes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/gitignore.svg b/static/img/file-icons-classic/gitignore.svg new file mode 100644 index 0000000..2dd1c39 --- /dev/null +++ b/static/img/file-icons-classic/gitignore.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/go.svg b/static/img/file-icons-classic/go.svg new file mode 100644 index 0000000..488f842 --- /dev/null +++ b/static/img/file-icons-classic/go.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/gpg.svg b/static/img/file-icons-classic/gpg.svg new file mode 100644 index 0000000..c9a4410 --- /dev/null +++ b/static/img/file-icons-classic/gpg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/gpl.svg b/static/img/file-icons-classic/gpl.svg new file mode 100644 index 0000000..fa4bd4a --- /dev/null +++ b/static/img/file-icons-classic/gpl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/gradle.svg b/static/img/file-icons-classic/gradle.svg new file mode 100644 index 0000000..d2ba14f --- /dev/null +++ b/static/img/file-icons-classic/gradle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/gz.svg b/static/img/file-icons-classic/gz.svg new file mode 100644 index 0000000..a9eeb07 --- /dev/null +++ b/static/img/file-icons-classic/gz.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/h.svg b/static/img/file-icons-classic/h.svg new file mode 100644 index 0000000..af7f7ce --- /dev/null +++ b/static/img/file-icons-classic/h.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/handlebars.svg b/static/img/file-icons-classic/handlebars.svg new file mode 100644 index 0000000..8c32682 --- /dev/null +++ b/static/img/file-icons-classic/handlebars.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/hbs.svg b/static/img/file-icons-classic/hbs.svg new file mode 100644 index 0000000..ef3893d --- /dev/null +++ b/static/img/file-icons-classic/hbs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/heic.svg b/static/img/file-icons-classic/heic.svg new file mode 100644 index 0000000..1c6c6d7 --- /dev/null +++ b/static/img/file-icons-classic/heic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/hlp.svg b/static/img/file-icons-classic/hlp.svg new file mode 100644 index 0000000..afac1e6 --- /dev/null +++ b/static/img/file-icons-classic/hlp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/hs.svg b/static/img/file-icons-classic/hs.svg new file mode 100644 index 0000000..4885111 --- /dev/null +++ b/static/img/file-icons-classic/hs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/hsl.svg b/static/img/file-icons-classic/hsl.svg new file mode 100644 index 0000000..a1c0b21 --- /dev/null +++ b/static/img/file-icons-classic/hsl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/htm.svg b/static/img/file-icons-classic/htm.svg new file mode 100644 index 0000000..285fa02 --- /dev/null +++ b/static/img/file-icons-classic/htm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/html.svg b/static/img/file-icons-classic/html.svg new file mode 100644 index 0000000..949d82f --- /dev/null +++ b/static/img/file-icons-classic/html.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ibooks.svg b/static/img/file-icons-classic/ibooks.svg new file mode 100644 index 0000000..bfa5adf --- /dev/null +++ b/static/img/file-icons-classic/ibooks.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/icns.svg b/static/img/file-icons-classic/icns.svg new file mode 100644 index 0000000..48fd4f6 --- /dev/null +++ b/static/img/file-icons-classic/icns.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ico.svg b/static/img/file-icons-classic/ico.svg new file mode 100644 index 0000000..9f7f0e2 --- /dev/null +++ b/static/img/file-icons-classic/ico.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ics.svg b/static/img/file-icons-classic/ics.svg new file mode 100644 index 0000000..7a370b5 --- /dev/null +++ b/static/img/file-icons-classic/ics.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/idx.svg b/static/img/file-icons-classic/idx.svg new file mode 100644 index 0000000..847f80b --- /dev/null +++ b/static/img/file-icons-classic/idx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/iff.svg b/static/img/file-icons-classic/iff.svg new file mode 100644 index 0000000..b8fdda2 --- /dev/null +++ b/static/img/file-icons-classic/iff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ifo.svg b/static/img/file-icons-classic/ifo.svg new file mode 100644 index 0000000..3838258 --- /dev/null +++ b/static/img/file-icons-classic/ifo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/image.svg b/static/img/file-icons-classic/image.svg new file mode 100644 index 0000000..5072e2e --- /dev/null +++ b/static/img/file-icons-classic/image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/img.svg b/static/img/file-icons-classic/img.svg new file mode 100644 index 0000000..3b963bb --- /dev/null +++ b/static/img/file-icons-classic/img.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/iml.svg b/static/img/file-icons-classic/iml.svg new file mode 100644 index 0000000..daeb5cf --- /dev/null +++ b/static/img/file-icons-classic/iml.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/in.svg b/static/img/file-icons-classic/in.svg new file mode 100644 index 0000000..ae3fc0a --- /dev/null +++ b/static/img/file-icons-classic/in.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/inc.svg b/static/img/file-icons-classic/inc.svg new file mode 100644 index 0000000..01ebb4b --- /dev/null +++ b/static/img/file-icons-classic/inc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/indd.svg b/static/img/file-icons-classic/indd.svg new file mode 100644 index 0000000..4590539 --- /dev/null +++ b/static/img/file-icons-classic/indd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/inf.svg b/static/img/file-icons-classic/inf.svg new file mode 100644 index 0000000..323251e --- /dev/null +++ b/static/img/file-icons-classic/inf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/info.svg b/static/img/file-icons-classic/info.svg new file mode 100644 index 0000000..51d1d22 --- /dev/null +++ b/static/img/file-icons-classic/info.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ini.svg b/static/img/file-icons-classic/ini.svg new file mode 100644 index 0000000..0eeadeb --- /dev/null +++ b/static/img/file-icons-classic/ini.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/inv.svg b/static/img/file-icons-classic/inv.svg new file mode 100644 index 0000000..c47e58c --- /dev/null +++ b/static/img/file-icons-classic/inv.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/iso.svg b/static/img/file-icons-classic/iso.svg new file mode 100644 index 0000000..2d7f2fa --- /dev/null +++ b/static/img/file-icons-classic/iso.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/j2.svg b/static/img/file-icons-classic/j2.svg new file mode 100644 index 0000000..6db5588 --- /dev/null +++ b/static/img/file-icons-classic/j2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/jar.svg b/static/img/file-icons-classic/jar.svg new file mode 100644 index 0000000..6c4ea53 --- /dev/null +++ b/static/img/file-icons-classic/jar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/java.svg b/static/img/file-icons-classic/java.svg new file mode 100644 index 0000000..0e6fae1 --- /dev/null +++ b/static/img/file-icons-classic/java.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/jpe.svg b/static/img/file-icons-classic/jpe.svg new file mode 100644 index 0000000..f98fdec --- /dev/null +++ b/static/img/file-icons-classic/jpe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/jpeg.svg b/static/img/file-icons-classic/jpeg.svg new file mode 100644 index 0000000..38b49f6 --- /dev/null +++ b/static/img/file-icons-classic/jpeg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/jpg.svg b/static/img/file-icons-classic/jpg.svg new file mode 100644 index 0000000..008800d --- /dev/null +++ b/static/img/file-icons-classic/jpg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/js.svg b/static/img/file-icons-classic/js.svg new file mode 100644 index 0000000..1a688f1 --- /dev/null +++ b/static/img/file-icons-classic/js.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/json.svg b/static/img/file-icons-classic/json.svg new file mode 100644 index 0000000..3519a5a --- /dev/null +++ b/static/img/file-icons-classic/json.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/jsp.svg b/static/img/file-icons-classic/jsp.svg new file mode 100644 index 0000000..41357c3 --- /dev/null +++ b/static/img/file-icons-classic/jsp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/jsx.svg b/static/img/file-icons-classic/jsx.svg new file mode 100644 index 0000000..05d5ca7 --- /dev/null +++ b/static/img/file-icons-classic/jsx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/key.svg b/static/img/file-icons-classic/key.svg new file mode 100644 index 0000000..bdadcd7 --- /dev/null +++ b/static/img/file-icons-classic/key.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/kf8.svg b/static/img/file-icons-classic/kf8.svg new file mode 100644 index 0000000..8d766c3 --- /dev/null +++ b/static/img/file-icons-classic/kf8.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/kmk.svg b/static/img/file-icons-classic/kmk.svg new file mode 100644 index 0000000..69e4294 --- /dev/null +++ b/static/img/file-icons-classic/kmk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ksh.svg b/static/img/file-icons-classic/ksh.svg new file mode 100644 index 0000000..78038e6 --- /dev/null +++ b/static/img/file-icons-classic/ksh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/kt.svg b/static/img/file-icons-classic/kt.svg new file mode 100644 index 0000000..3e3f775 --- /dev/null +++ b/static/img/file-icons-classic/kt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/kts.svg b/static/img/file-icons-classic/kts.svg new file mode 100644 index 0000000..71ef2dd --- /dev/null +++ b/static/img/file-icons-classic/kts.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/kup.svg b/static/img/file-icons-classic/kup.svg new file mode 100644 index 0000000..3ed3181 --- /dev/null +++ b/static/img/file-icons-classic/kup.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/less.svg b/static/img/file-icons-classic/less.svg new file mode 100644 index 0000000..cd0e8de --- /dev/null +++ b/static/img/file-icons-classic/less.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/lex.svg b/static/img/file-icons-classic/lex.svg new file mode 100644 index 0000000..c91ab9d --- /dev/null +++ b/static/img/file-icons-classic/lex.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/licx.svg b/static/img/file-icons-classic/licx.svg new file mode 100644 index 0000000..d5ffd31 --- /dev/null +++ b/static/img/file-icons-classic/licx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/lisp.svg b/static/img/file-icons-classic/lisp.svg new file mode 100644 index 0000000..70feb93 --- /dev/null +++ b/static/img/file-icons-classic/lisp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/lit.svg b/static/img/file-icons-classic/lit.svg new file mode 100644 index 0000000..4dbb532 --- /dev/null +++ b/static/img/file-icons-classic/lit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/lnk.svg b/static/img/file-icons-classic/lnk.svg new file mode 100644 index 0000000..8f3346f --- /dev/null +++ b/static/img/file-icons-classic/lnk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/lock.svg b/static/img/file-icons-classic/lock.svg new file mode 100644 index 0000000..b5264f2 --- /dev/null +++ b/static/img/file-icons-classic/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/log.svg b/static/img/file-icons-classic/log.svg new file mode 100644 index 0000000..2056b28 --- /dev/null +++ b/static/img/file-icons-classic/log.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/lua.svg b/static/img/file-icons-classic/lua.svg new file mode 100644 index 0000000..f388b7a --- /dev/null +++ b/static/img/file-icons-classic/lua.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/m.svg b/static/img/file-icons-classic/m.svg new file mode 100644 index 0000000..8ed8ddc --- /dev/null +++ b/static/img/file-icons-classic/m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/m2v.svg b/static/img/file-icons-classic/m2v.svg new file mode 100644 index 0000000..1d46397 --- /dev/null +++ b/static/img/file-icons-classic/m2v.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/m3u.svg b/static/img/file-icons-classic/m3u.svg new file mode 100644 index 0000000..4fd2312 --- /dev/null +++ b/static/img/file-icons-classic/m3u.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/m3u8.svg b/static/img/file-icons-classic/m3u8.svg new file mode 100644 index 0000000..916f88c --- /dev/null +++ b/static/img/file-icons-classic/m3u8.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/m4.svg b/static/img/file-icons-classic/m4.svg new file mode 100644 index 0000000..a044287 --- /dev/null +++ b/static/img/file-icons-classic/m4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/m4a.svg b/static/img/file-icons-classic/m4a.svg new file mode 100644 index 0000000..3f2b106 --- /dev/null +++ b/static/img/file-icons-classic/m4a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/m4r.svg b/static/img/file-icons-classic/m4r.svg new file mode 100644 index 0000000..fda2096 --- /dev/null +++ b/static/img/file-icons-classic/m4r.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/m4v.svg b/static/img/file-icons-classic/m4v.svg new file mode 100644 index 0000000..619039e --- /dev/null +++ b/static/img/file-icons-classic/m4v.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/map.svg b/static/img/file-icons-classic/map.svg new file mode 100644 index 0000000..de569c7 --- /dev/null +++ b/static/img/file-icons-classic/map.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/master.svg b/static/img/file-icons-classic/master.svg new file mode 100644 index 0000000..24ae5be --- /dev/null +++ b/static/img/file-icons-classic/master.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mc.svg b/static/img/file-icons-classic/mc.svg new file mode 100644 index 0000000..eefdc13 --- /dev/null +++ b/static/img/file-icons-classic/mc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/md.svg b/static/img/file-icons-classic/md.svg new file mode 100644 index 0000000..b2bd3fd --- /dev/null +++ b/static/img/file-icons-classic/md.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mdb.svg b/static/img/file-icons-classic/mdb.svg new file mode 100644 index 0000000..ebe6a70 --- /dev/null +++ b/static/img/file-icons-classic/mdb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mdf.svg b/static/img/file-icons-classic/mdf.svg new file mode 100644 index 0000000..ed4e01e --- /dev/null +++ b/static/img/file-icons-classic/mdf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/me.svg b/static/img/file-icons-classic/me.svg new file mode 100644 index 0000000..8417b05 --- /dev/null +++ b/static/img/file-icons-classic/me.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mi.svg b/static/img/file-icons-classic/mi.svg new file mode 100644 index 0000000..ff20452 --- /dev/null +++ b/static/img/file-icons-classic/mi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mid.svg b/static/img/file-icons-classic/mid.svg new file mode 100644 index 0000000..2afdb5c --- /dev/null +++ b/static/img/file-icons-classic/mid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/midi.svg b/static/img/file-icons-classic/midi.svg new file mode 100644 index 0000000..06071a7 --- /dev/null +++ b/static/img/file-icons-classic/midi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mk.svg b/static/img/file-icons-classic/mk.svg new file mode 100644 index 0000000..4ea388d --- /dev/null +++ b/static/img/file-icons-classic/mk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mkv.svg b/static/img/file-icons-classic/mkv.svg new file mode 100644 index 0000000..7eec925 --- /dev/null +++ b/static/img/file-icons-classic/mkv.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mm.svg b/static/img/file-icons-classic/mm.svg new file mode 100644 index 0000000..29b4bee --- /dev/null +++ b/static/img/file-icons-classic/mm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mng.svg b/static/img/file-icons-classic/mng.svg new file mode 100644 index 0000000..4525fbc --- /dev/null +++ b/static/img/file-icons-classic/mng.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mo.svg b/static/img/file-icons-classic/mo.svg new file mode 100644 index 0000000..571f76d --- /dev/null +++ b/static/img/file-icons-classic/mo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mobi.svg b/static/img/file-icons-classic/mobi.svg new file mode 100644 index 0000000..a0a299c --- /dev/null +++ b/static/img/file-icons-classic/mobi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mod.svg b/static/img/file-icons-classic/mod.svg new file mode 100644 index 0000000..1319fe2 --- /dev/null +++ b/static/img/file-icons-classic/mod.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mov.svg b/static/img/file-icons-classic/mov.svg new file mode 100644 index 0000000..21c12dd --- /dev/null +++ b/static/img/file-icons-classic/mov.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mp2.svg b/static/img/file-icons-classic/mp2.svg new file mode 100644 index 0000000..dce1aa7 --- /dev/null +++ b/static/img/file-icons-classic/mp2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mp3.svg b/static/img/file-icons-classic/mp3.svg new file mode 100644 index 0000000..0e25673 --- /dev/null +++ b/static/img/file-icons-classic/mp3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mp4.svg b/static/img/file-icons-classic/mp4.svg new file mode 100644 index 0000000..be90ef2 --- /dev/null +++ b/static/img/file-icons-classic/mp4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mpa.svg b/static/img/file-icons-classic/mpa.svg new file mode 100644 index 0000000..9707c44 --- /dev/null +++ b/static/img/file-icons-classic/mpa.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mpd.svg b/static/img/file-icons-classic/mpd.svg new file mode 100644 index 0000000..a36393d --- /dev/null +++ b/static/img/file-icons-classic/mpd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mpe.svg b/static/img/file-icons-classic/mpe.svg new file mode 100644 index 0000000..f73fa7b --- /dev/null +++ b/static/img/file-icons-classic/mpe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mpeg.svg b/static/img/file-icons-classic/mpeg.svg new file mode 100644 index 0000000..2631f70 --- /dev/null +++ b/static/img/file-icons-classic/mpeg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mpg.svg b/static/img/file-icons-classic/mpg.svg new file mode 100644 index 0000000..d2f60ba --- /dev/null +++ b/static/img/file-icons-classic/mpg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mpga.svg b/static/img/file-icons-classic/mpga.svg new file mode 100644 index 0000000..63a89c1 --- /dev/null +++ b/static/img/file-icons-classic/mpga.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mpp.svg b/static/img/file-icons-classic/mpp.svg new file mode 100644 index 0000000..1e5bc8e --- /dev/null +++ b/static/img/file-icons-classic/mpp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/mpt.svg b/static/img/file-icons-classic/mpt.svg new file mode 100644 index 0000000..76e1a30 --- /dev/null +++ b/static/img/file-icons-classic/mpt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/msg.svg b/static/img/file-icons-classic/msg.svg new file mode 100644 index 0000000..0ddd9ca --- /dev/null +++ b/static/img/file-icons-classic/msg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/msi.svg b/static/img/file-icons-classic/msi.svg new file mode 100644 index 0000000..6657d9c --- /dev/null +++ b/static/img/file-icons-classic/msi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/msu.svg b/static/img/file-icons-classic/msu.svg new file mode 100644 index 0000000..b1a9d79 --- /dev/null +++ b/static/img/file-icons-classic/msu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/nef.svg b/static/img/file-icons-classic/nef.svg new file mode 100644 index 0000000..d25da5f --- /dev/null +++ b/static/img/file-icons-classic/nef.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/nes.svg b/static/img/file-icons-classic/nes.svg new file mode 100644 index 0000000..5461fa6 --- /dev/null +++ b/static/img/file-icons-classic/nes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/nfo.svg b/static/img/file-icons-classic/nfo.svg new file mode 100644 index 0000000..5b7a1f0 --- /dev/null +++ b/static/img/file-icons-classic/nfo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/nix.svg b/static/img/file-icons-classic/nix.svg new file mode 100644 index 0000000..c40c6fd --- /dev/null +++ b/static/img/file-icons-classic/nix.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/npmignore.svg b/static/img/file-icons-classic/npmignore.svg new file mode 100644 index 0000000..2dd1c39 --- /dev/null +++ b/static/img/file-icons-classic/npmignore.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ocx.svg b/static/img/file-icons-classic/ocx.svg new file mode 100644 index 0000000..2963442 --- /dev/null +++ b/static/img/file-icons-classic/ocx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/odb.svg b/static/img/file-icons-classic/odb.svg new file mode 100644 index 0000000..fa7b655 --- /dev/null +++ b/static/img/file-icons-classic/odb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ods.svg b/static/img/file-icons-classic/ods.svg new file mode 100644 index 0000000..46930f4 --- /dev/null +++ b/static/img/file-icons-classic/ods.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/odt.svg b/static/img/file-icons-classic/odt.svg new file mode 100644 index 0000000..d966291 --- /dev/null +++ b/static/img/file-icons-classic/odt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ogg.svg b/static/img/file-icons-classic/ogg.svg new file mode 100644 index 0000000..8770b91 --- /dev/null +++ b/static/img/file-icons-classic/ogg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ogv.svg b/static/img/file-icons-classic/ogv.svg new file mode 100644 index 0000000..62acac9 --- /dev/null +++ b/static/img/file-icons-classic/ogv.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ost.svg b/static/img/file-icons-classic/ost.svg new file mode 100644 index 0000000..e0d5556 --- /dev/null +++ b/static/img/file-icons-classic/ost.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/otf.svg b/static/img/file-icons-classic/otf.svg new file mode 100644 index 0000000..778b2c4 --- /dev/null +++ b/static/img/file-icons-classic/otf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ott.svg b/static/img/file-icons-classic/ott.svg new file mode 100644 index 0000000..bbd041d --- /dev/null +++ b/static/img/file-icons-classic/ott.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ova.svg b/static/img/file-icons-classic/ova.svg new file mode 100644 index 0000000..aec7d6f --- /dev/null +++ b/static/img/file-icons-classic/ova.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ovf.svg b/static/img/file-icons-classic/ovf.svg new file mode 100644 index 0000000..af15b39 --- /dev/null +++ b/static/img/file-icons-classic/ovf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/p12.svg b/static/img/file-icons-classic/p12.svg new file mode 100644 index 0000000..ec86c32 --- /dev/null +++ b/static/img/file-icons-classic/p12.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/p7b.svg b/static/img/file-icons-classic/p7b.svg new file mode 100644 index 0000000..54b69c6 --- /dev/null +++ b/static/img/file-icons-classic/p7b.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/pages.svg b/static/img/file-icons-classic/pages.svg new file mode 100644 index 0000000..d97b8f7 --- /dev/null +++ b/static/img/file-icons-classic/pages.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/part.svg b/static/img/file-icons-classic/part.svg new file mode 100644 index 0000000..fec8246 --- /dev/null +++ b/static/img/file-icons-classic/part.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/pcd.svg b/static/img/file-icons-classic/pcd.svg new file mode 100644 index 0000000..6eb0f75 --- /dev/null +++ b/static/img/file-icons-classic/pcd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/pdb.svg b/static/img/file-icons-classic/pdb.svg new file mode 100644 index 0000000..9403e03 --- /dev/null +++ b/static/img/file-icons-classic/pdb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/pdf.svg b/static/img/file-icons-classic/pdf.svg new file mode 100644 index 0000000..babf198 --- /dev/null +++ b/static/img/file-icons-classic/pdf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/pem.svg b/static/img/file-icons-classic/pem.svg new file mode 100644 index 0000000..254380e --- /dev/null +++ b/static/img/file-icons-classic/pem.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/pfx.svg b/static/img/file-icons-classic/pfx.svg new file mode 100644 index 0000000..8a96bf1 --- /dev/null +++ b/static/img/file-icons-classic/pfx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/pgp.svg b/static/img/file-icons-classic/pgp.svg new file mode 100644 index 0000000..87c3208 --- /dev/null +++ b/static/img/file-icons-classic/pgp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ph.svg b/static/img/file-icons-classic/ph.svg new file mode 100644 index 0000000..1286dc2 --- /dev/null +++ b/static/img/file-icons-classic/ph.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/phar.svg b/static/img/file-icons-classic/phar.svg new file mode 100644 index 0000000..066e286 --- /dev/null +++ b/static/img/file-icons-classic/phar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/php.svg b/static/img/file-icons-classic/php.svg new file mode 100644 index 0000000..7a21f87 --- /dev/null +++ b/static/img/file-icons-classic/php.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/pid.svg b/static/img/file-icons-classic/pid.svg new file mode 100644 index 0000000..8e91e5d --- /dev/null +++ b/static/img/file-icons-classic/pid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/pkg.svg b/static/img/file-icons-classic/pkg.svg new file mode 100644 index 0000000..48f6448 --- /dev/null +++ b/static/img/file-icons-classic/pkg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/pl.svg b/static/img/file-icons-classic/pl.svg new file mode 100644 index 0000000..2f5b942 --- /dev/null +++ b/static/img/file-icons-classic/pl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/plist.svg b/static/img/file-icons-classic/plist.svg new file mode 100644 index 0000000..6d6146a --- /dev/null +++ b/static/img/file-icons-classic/plist.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/pm.svg b/static/img/file-icons-classic/pm.svg new file mode 100644 index 0000000..2c6a6be --- /dev/null +++ b/static/img/file-icons-classic/pm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/png.svg b/static/img/file-icons-classic/png.svg new file mode 100644 index 0000000..49432d3 --- /dev/null +++ b/static/img/file-icons-classic/png.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/po.svg b/static/img/file-icons-classic/po.svg new file mode 100644 index 0000000..4184f10 --- /dev/null +++ b/static/img/file-icons-classic/po.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/pom.svg b/static/img/file-icons-classic/pom.svg new file mode 100644 index 0000000..3517f8b --- /dev/null +++ b/static/img/file-icons-classic/pom.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/pot.svg b/static/img/file-icons-classic/pot.svg new file mode 100644 index 0000000..919f7ef --- /dev/null +++ b/static/img/file-icons-classic/pot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/potx.svg b/static/img/file-icons-classic/potx.svg new file mode 100644 index 0000000..bdfcd33 --- /dev/null +++ b/static/img/file-icons-classic/potx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/pps.svg b/static/img/file-icons-classic/pps.svg new file mode 100644 index 0000000..8647fb6 --- /dev/null +++ b/static/img/file-icons-classic/pps.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ppsx.svg b/static/img/file-icons-classic/ppsx.svg new file mode 100644 index 0000000..cd9c3ff --- /dev/null +++ b/static/img/file-icons-classic/ppsx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ppt.svg b/static/img/file-icons-classic/ppt.svg new file mode 100644 index 0000000..54737a9 --- /dev/null +++ b/static/img/file-icons-classic/ppt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/pptm.svg b/static/img/file-icons-classic/pptm.svg new file mode 100644 index 0000000..49425ed --- /dev/null +++ b/static/img/file-icons-classic/pptm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/pptx.svg b/static/img/file-icons-classic/pptx.svg new file mode 100644 index 0000000..e5cd09e --- /dev/null +++ b/static/img/file-icons-classic/pptx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/prop.svg b/static/img/file-icons-classic/prop.svg new file mode 100644 index 0000000..2d44071 --- /dev/null +++ b/static/img/file-icons-classic/prop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ps.svg b/static/img/file-icons-classic/ps.svg new file mode 100644 index 0000000..c9699ca --- /dev/null +++ b/static/img/file-icons-classic/ps.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ps1.svg b/static/img/file-icons-classic/ps1.svg new file mode 100644 index 0000000..1657e6f --- /dev/null +++ b/static/img/file-icons-classic/ps1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/psd.svg b/static/img/file-icons-classic/psd.svg new file mode 100644 index 0000000..e8af1f6 --- /dev/null +++ b/static/img/file-icons-classic/psd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/psp.svg b/static/img/file-icons-classic/psp.svg new file mode 100644 index 0000000..ce0af52 --- /dev/null +++ b/static/img/file-icons-classic/psp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/pst.svg b/static/img/file-icons-classic/pst.svg new file mode 100644 index 0000000..8a69e94 --- /dev/null +++ b/static/img/file-icons-classic/pst.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/pub.svg b/static/img/file-icons-classic/pub.svg new file mode 100644 index 0000000..7a78f1d --- /dev/null +++ b/static/img/file-icons-classic/pub.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/py.svg b/static/img/file-icons-classic/py.svg new file mode 100644 index 0000000..7de406b --- /dev/null +++ b/static/img/file-icons-classic/py.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/pyc.svg b/static/img/file-icons-classic/pyc.svg new file mode 100644 index 0000000..4ffd574 --- /dev/null +++ b/static/img/file-icons-classic/pyc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/qt.svg b/static/img/file-icons-classic/qt.svg new file mode 100644 index 0000000..f3a1566 --- /dev/null +++ b/static/img/file-icons-classic/qt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ra.svg b/static/img/file-icons-classic/ra.svg new file mode 100644 index 0000000..5a8d06c --- /dev/null +++ b/static/img/file-icons-classic/ra.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ram.svg b/static/img/file-icons-classic/ram.svg new file mode 100644 index 0000000..4bb5e3b --- /dev/null +++ b/static/img/file-icons-classic/ram.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/rar.svg b/static/img/file-icons-classic/rar.svg new file mode 100644 index 0000000..bf6821a --- /dev/null +++ b/static/img/file-icons-classic/rar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/raw.svg b/static/img/file-icons-classic/raw.svg new file mode 100644 index 0000000..fc8fc3a --- /dev/null +++ b/static/img/file-icons-classic/raw.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/rb.svg b/static/img/file-icons-classic/rb.svg new file mode 100644 index 0000000..141a78b --- /dev/null +++ b/static/img/file-icons-classic/rb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/rdf.svg b/static/img/file-icons-classic/rdf.svg new file mode 100644 index 0000000..6a7cef0 --- /dev/null +++ b/static/img/file-icons-classic/rdf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/rdl.svg b/static/img/file-icons-classic/rdl.svg new file mode 100644 index 0000000..31d7477 --- /dev/null +++ b/static/img/file-icons-classic/rdl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/reg.svg b/static/img/file-icons-classic/reg.svg new file mode 100644 index 0000000..65c837e --- /dev/null +++ b/static/img/file-icons-classic/reg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/resx.svg b/static/img/file-icons-classic/resx.svg new file mode 100644 index 0000000..43d19e6 --- /dev/null +++ b/static/img/file-icons-classic/resx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/retry.svg b/static/img/file-icons-classic/retry.svg new file mode 100644 index 0000000..c2bf17c --- /dev/null +++ b/static/img/file-icons-classic/retry.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/rm.svg b/static/img/file-icons-classic/rm.svg new file mode 100644 index 0000000..7a5c8d6 --- /dev/null +++ b/static/img/file-icons-classic/rm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/rom.svg b/static/img/file-icons-classic/rom.svg new file mode 100644 index 0000000..876c443 --- /dev/null +++ b/static/img/file-icons-classic/rom.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/rpm.svg b/static/img/file-icons-classic/rpm.svg new file mode 100644 index 0000000..485d940 --- /dev/null +++ b/static/img/file-icons-classic/rpm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/rpt.svg b/static/img/file-icons-classic/rpt.svg new file mode 100644 index 0000000..ca6ec07 --- /dev/null +++ b/static/img/file-icons-classic/rpt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/rsa.svg b/static/img/file-icons-classic/rsa.svg new file mode 100644 index 0000000..483b8ef --- /dev/null +++ b/static/img/file-icons-classic/rsa.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/rss.svg b/static/img/file-icons-classic/rss.svg new file mode 100644 index 0000000..6679ae3 --- /dev/null +++ b/static/img/file-icons-classic/rss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/rst.svg b/static/img/file-icons-classic/rst.svg new file mode 100644 index 0000000..1d38c64 --- /dev/null +++ b/static/img/file-icons-classic/rst.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/rtf.svg b/static/img/file-icons-classic/rtf.svg new file mode 100644 index 0000000..1fc7b90 --- /dev/null +++ b/static/img/file-icons-classic/rtf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ru.svg b/static/img/file-icons-classic/ru.svg new file mode 100644 index 0000000..c7b7630 --- /dev/null +++ b/static/img/file-icons-classic/ru.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/rub.svg b/static/img/file-icons-classic/rub.svg new file mode 100644 index 0000000..5d84d47 --- /dev/null +++ b/static/img/file-icons-classic/rub.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/sass.svg b/static/img/file-icons-classic/sass.svg new file mode 100644 index 0000000..ab71efc --- /dev/null +++ b/static/img/file-icons-classic/sass.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/scss.svg b/static/img/file-icons-classic/scss.svg new file mode 100644 index 0000000..d66ef8b --- /dev/null +++ b/static/img/file-icons-classic/scss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/sdf.svg b/static/img/file-icons-classic/sdf.svg new file mode 100644 index 0000000..42fcaad --- /dev/null +++ b/static/img/file-icons-classic/sdf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/sed.svg b/static/img/file-icons-classic/sed.svg new file mode 100644 index 0000000..919bb14 --- /dev/null +++ b/static/img/file-icons-classic/sed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/sh.svg b/static/img/file-icons-classic/sh.svg new file mode 100644 index 0000000..1a882e5 --- /dev/null +++ b/static/img/file-icons-classic/sh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/sit.svg b/static/img/file-icons-classic/sit.svg new file mode 100644 index 0000000..3175095 --- /dev/null +++ b/static/img/file-icons-classic/sit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/sitemap.svg b/static/img/file-icons-classic/sitemap.svg new file mode 100644 index 0000000..efa12e9 --- /dev/null +++ b/static/img/file-icons-classic/sitemap.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/skin.svg b/static/img/file-icons-classic/skin.svg new file mode 100644 index 0000000..7143a51 --- /dev/null +++ b/static/img/file-icons-classic/skin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/sldm.svg b/static/img/file-icons-classic/sldm.svg new file mode 100644 index 0000000..41ed221 --- /dev/null +++ b/static/img/file-icons-classic/sldm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/sldx.svg b/static/img/file-icons-classic/sldx.svg new file mode 100644 index 0000000..230aba4 --- /dev/null +++ b/static/img/file-icons-classic/sldx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/sln.svg b/static/img/file-icons-classic/sln.svg new file mode 100644 index 0000000..b6b132a --- /dev/null +++ b/static/img/file-icons-classic/sln.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/sol.svg b/static/img/file-icons-classic/sol.svg new file mode 100644 index 0000000..1d120f0 --- /dev/null +++ b/static/img/file-icons-classic/sol.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/sphinx.svg b/static/img/file-icons-classic/sphinx.svg new file mode 100644 index 0000000..6689256 --- /dev/null +++ b/static/img/file-icons-classic/sphinx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/sql.svg b/static/img/file-icons-classic/sql.svg new file mode 100644 index 0000000..c93f33e --- /dev/null +++ b/static/img/file-icons-classic/sql.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/sqlite.svg b/static/img/file-icons-classic/sqlite.svg new file mode 100644 index 0000000..9ff1938 --- /dev/null +++ b/static/img/file-icons-classic/sqlite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/step.svg b/static/img/file-icons-classic/step.svg new file mode 100644 index 0000000..647897e --- /dev/null +++ b/static/img/file-icons-classic/step.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/stl.svg b/static/img/file-icons-classic/stl.svg new file mode 100644 index 0000000..fb5597b --- /dev/null +++ b/static/img/file-icons-classic/stl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/svg.svg b/static/img/file-icons-classic/svg.svg new file mode 100644 index 0000000..f7b3141 --- /dev/null +++ b/static/img/file-icons-classic/svg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/swd.svg b/static/img/file-icons-classic/swd.svg new file mode 100644 index 0000000..eaebca3 --- /dev/null +++ b/static/img/file-icons-classic/swd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/swf.svg b/static/img/file-icons-classic/swf.svg new file mode 100644 index 0000000..6beac3d --- /dev/null +++ b/static/img/file-icons-classic/swf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/swift.svg b/static/img/file-icons-classic/swift.svg new file mode 100644 index 0000000..1af5d99 --- /dev/null +++ b/static/img/file-icons-classic/swift.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/swp.svg b/static/img/file-icons-classic/swp.svg new file mode 100644 index 0000000..ab0bd8d --- /dev/null +++ b/static/img/file-icons-classic/swp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/sys.svg b/static/img/file-icons-classic/sys.svg new file mode 100644 index 0000000..63623d6 --- /dev/null +++ b/static/img/file-icons-classic/sys.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/tar.svg b/static/img/file-icons-classic/tar.svg new file mode 100644 index 0000000..519731a --- /dev/null +++ b/static/img/file-icons-classic/tar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/tax.svg b/static/img/file-icons-classic/tax.svg new file mode 100644 index 0000000..2791565 --- /dev/null +++ b/static/img/file-icons-classic/tax.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/tcsh.svg b/static/img/file-icons-classic/tcsh.svg new file mode 100644 index 0000000..2bae3f6 --- /dev/null +++ b/static/img/file-icons-classic/tcsh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/tex.svg b/static/img/file-icons-classic/tex.svg new file mode 100644 index 0000000..4088110 --- /dev/null +++ b/static/img/file-icons-classic/tex.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/tfignore.svg b/static/img/file-icons-classic/tfignore.svg new file mode 100644 index 0000000..2dd1c39 --- /dev/null +++ b/static/img/file-icons-classic/tfignore.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/tga.svg b/static/img/file-icons-classic/tga.svg new file mode 100644 index 0000000..6884f9b --- /dev/null +++ b/static/img/file-icons-classic/tga.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/tgz.svg b/static/img/file-icons-classic/tgz.svg new file mode 100644 index 0000000..966f76d --- /dev/null +++ b/static/img/file-icons-classic/tgz.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/tif.svg b/static/img/file-icons-classic/tif.svg new file mode 100644 index 0000000..d86a7c2 --- /dev/null +++ b/static/img/file-icons-classic/tif.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/tiff.svg b/static/img/file-icons-classic/tiff.svg new file mode 100644 index 0000000..41f3e5a --- /dev/null +++ b/static/img/file-icons-classic/tiff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/tmp.svg b/static/img/file-icons-classic/tmp.svg new file mode 100644 index 0000000..f52b00c --- /dev/null +++ b/static/img/file-icons-classic/tmp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/tmx.svg b/static/img/file-icons-classic/tmx.svg new file mode 100644 index 0000000..2cc1e37 --- /dev/null +++ b/static/img/file-icons-classic/tmx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/torrent.svg b/static/img/file-icons-classic/torrent.svg new file mode 100644 index 0000000..c23ffe5 --- /dev/null +++ b/static/img/file-icons-classic/torrent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/tpl.svg b/static/img/file-icons-classic/tpl.svg new file mode 100644 index 0000000..61fcc4e --- /dev/null +++ b/static/img/file-icons-classic/tpl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ts.svg b/static/img/file-icons-classic/ts.svg new file mode 100644 index 0000000..0c489b4 --- /dev/null +++ b/static/img/file-icons-classic/ts.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/tsv.svg b/static/img/file-icons-classic/tsv.svg new file mode 100644 index 0000000..d2edafb --- /dev/null +++ b/static/img/file-icons-classic/tsv.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/ttf.svg b/static/img/file-icons-classic/ttf.svg new file mode 100644 index 0000000..aac1c96 --- /dev/null +++ b/static/img/file-icons-classic/ttf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/twig.svg b/static/img/file-icons-classic/twig.svg new file mode 100644 index 0000000..579fa77 --- /dev/null +++ b/static/img/file-icons-classic/twig.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/txt.svg b/static/img/file-icons-classic/txt.svg new file mode 100644 index 0000000..496d593 --- /dev/null +++ b/static/img/file-icons-classic/txt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/udf.svg b/static/img/file-icons-classic/udf.svg new file mode 100644 index 0000000..5de105d --- /dev/null +++ b/static/img/file-icons-classic/udf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/vb.svg b/static/img/file-icons-classic/vb.svg new file mode 100644 index 0000000..a3de697 --- /dev/null +++ b/static/img/file-icons-classic/vb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/vbproj.svg b/static/img/file-icons-classic/vbproj.svg new file mode 100644 index 0000000..f67d2d1 --- /dev/null +++ b/static/img/file-icons-classic/vbproj.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/vbs.svg b/static/img/file-icons-classic/vbs.svg new file mode 100644 index 0000000..056173c --- /dev/null +++ b/static/img/file-icons-classic/vbs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/vcd.svg b/static/img/file-icons-classic/vcd.svg new file mode 100644 index 0000000..77435da --- /dev/null +++ b/static/img/file-icons-classic/vcd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/vcf.svg b/static/img/file-icons-classic/vcf.svg new file mode 100644 index 0000000..7c9ce72 --- /dev/null +++ b/static/img/file-icons-classic/vcf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/vcs.svg b/static/img/file-icons-classic/vcs.svg new file mode 100644 index 0000000..2b2cf79 --- /dev/null +++ b/static/img/file-icons-classic/vcs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/vdi.svg b/static/img/file-icons-classic/vdi.svg new file mode 100644 index 0000000..8a0e639 --- /dev/null +++ b/static/img/file-icons-classic/vdi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/vdx.svg b/static/img/file-icons-classic/vdx.svg new file mode 100644 index 0000000..b0a9108 --- /dev/null +++ b/static/img/file-icons-classic/vdx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/vmdk.svg b/static/img/file-icons-classic/vmdk.svg new file mode 100644 index 0000000..34317f0 --- /dev/null +++ b/static/img/file-icons-classic/vmdk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/vob.svg b/static/img/file-icons-classic/vob.svg new file mode 100644 index 0000000..00e5f64 --- /dev/null +++ b/static/img/file-icons-classic/vob.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/vox.svg b/static/img/file-icons-classic/vox.svg new file mode 100644 index 0000000..a3a6518 --- /dev/null +++ b/static/img/file-icons-classic/vox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/vscodeignore.svg b/static/img/file-icons-classic/vscodeignore.svg new file mode 100644 index 0000000..a3e0e35 --- /dev/null +++ b/static/img/file-icons-classic/vscodeignore.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/vsd.svg b/static/img/file-icons-classic/vsd.svg new file mode 100644 index 0000000..8801bef --- /dev/null +++ b/static/img/file-icons-classic/vsd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/vss.svg b/static/img/file-icons-classic/vss.svg new file mode 100644 index 0000000..84ce428 --- /dev/null +++ b/static/img/file-icons-classic/vss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/vst.svg b/static/img/file-icons-classic/vst.svg new file mode 100644 index 0000000..7b17e8e --- /dev/null +++ b/static/img/file-icons-classic/vst.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/vsx.svg b/static/img/file-icons-classic/vsx.svg new file mode 100644 index 0000000..8fae382 --- /dev/null +++ b/static/img/file-icons-classic/vsx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/vtx.svg b/static/img/file-icons-classic/vtx.svg new file mode 100644 index 0000000..07cd871 --- /dev/null +++ b/static/img/file-icons-classic/vtx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/war.svg b/static/img/file-icons-classic/war.svg new file mode 100644 index 0000000..b660a39 --- /dev/null +++ b/static/img/file-icons-classic/war.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/wav.svg b/static/img/file-icons-classic/wav.svg new file mode 100644 index 0000000..3a525ad --- /dev/null +++ b/static/img/file-icons-classic/wav.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/wbk.svg b/static/img/file-icons-classic/wbk.svg new file mode 100644 index 0000000..962814e --- /dev/null +++ b/static/img/file-icons-classic/wbk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/webinfo.svg b/static/img/file-icons-classic/webinfo.svg new file mode 100644 index 0000000..79fa571 --- /dev/null +++ b/static/img/file-icons-classic/webinfo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/webm.svg b/static/img/file-icons-classic/webm.svg new file mode 100644 index 0000000..7f67838 --- /dev/null +++ b/static/img/file-icons-classic/webm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/webp.svg b/static/img/file-icons-classic/webp.svg new file mode 100644 index 0000000..add6c2a --- /dev/null +++ b/static/img/file-icons-classic/webp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/wma.svg b/static/img/file-icons-classic/wma.svg new file mode 100644 index 0000000..d967339 --- /dev/null +++ b/static/img/file-icons-classic/wma.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/wmf.svg b/static/img/file-icons-classic/wmf.svg new file mode 100644 index 0000000..da0bff1 --- /dev/null +++ b/static/img/file-icons-classic/wmf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/wmv.svg b/static/img/file-icons-classic/wmv.svg new file mode 100644 index 0000000..3a44fc3 --- /dev/null +++ b/static/img/file-icons-classic/wmv.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/woff.svg b/static/img/file-icons-classic/woff.svg new file mode 100644 index 0000000..3361869 --- /dev/null +++ b/static/img/file-icons-classic/woff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/woff2.svg b/static/img/file-icons-classic/woff2.svg new file mode 100644 index 0000000..8687d5b --- /dev/null +++ b/static/img/file-icons-classic/woff2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/wps.svg b/static/img/file-icons-classic/wps.svg new file mode 100644 index 0000000..9eccbe4 --- /dev/null +++ b/static/img/file-icons-classic/wps.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/wsf.svg b/static/img/file-icons-classic/wsf.svg new file mode 100644 index 0000000..2676e59 --- /dev/null +++ b/static/img/file-icons-classic/wsf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/xaml.svg b/static/img/file-icons-classic/xaml.svg new file mode 100644 index 0000000..b36b80d --- /dev/null +++ b/static/img/file-icons-classic/xaml.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/xcf.svg b/static/img/file-icons-classic/xcf.svg new file mode 100644 index 0000000..7464caf --- /dev/null +++ b/static/img/file-icons-classic/xcf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/xfl.svg b/static/img/file-icons-classic/xfl.svg new file mode 100644 index 0000000..02b0aa3 --- /dev/null +++ b/static/img/file-icons-classic/xfl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/xlm.svg b/static/img/file-icons-classic/xlm.svg new file mode 100644 index 0000000..f13a44b --- /dev/null +++ b/static/img/file-icons-classic/xlm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/xls.svg b/static/img/file-icons-classic/xls.svg new file mode 100644 index 0000000..5102c0b --- /dev/null +++ b/static/img/file-icons-classic/xls.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/xlsm.svg b/static/img/file-icons-classic/xlsm.svg new file mode 100644 index 0000000..9fdb8a2 --- /dev/null +++ b/static/img/file-icons-classic/xlsm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/xlsx.svg b/static/img/file-icons-classic/xlsx.svg new file mode 100644 index 0000000..3a5d610 --- /dev/null +++ b/static/img/file-icons-classic/xlsx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/xlt.svg b/static/img/file-icons-classic/xlt.svg new file mode 100644 index 0000000..0008337 --- /dev/null +++ b/static/img/file-icons-classic/xlt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/xltm.svg b/static/img/file-icons-classic/xltm.svg new file mode 100644 index 0000000..b8ace08 --- /dev/null +++ b/static/img/file-icons-classic/xltm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/xltx.svg b/static/img/file-icons-classic/xltx.svg new file mode 100644 index 0000000..c06c902 --- /dev/null +++ b/static/img/file-icons-classic/xltx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/xml.svg b/static/img/file-icons-classic/xml.svg new file mode 100644 index 0000000..7096392 --- /dev/null +++ b/static/img/file-icons-classic/xml.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/xpi.svg b/static/img/file-icons-classic/xpi.svg new file mode 100644 index 0000000..b37c989 --- /dev/null +++ b/static/img/file-icons-classic/xpi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/xps.svg b/static/img/file-icons-classic/xps.svg new file mode 100644 index 0000000..f5a4632 --- /dev/null +++ b/static/img/file-icons-classic/xps.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/xrb.svg b/static/img/file-icons-classic/xrb.svg new file mode 100644 index 0000000..5fbf7cc --- /dev/null +++ b/static/img/file-icons-classic/xrb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/xsd.svg b/static/img/file-icons-classic/xsd.svg new file mode 100644 index 0000000..eb26b1e --- /dev/null +++ b/static/img/file-icons-classic/xsd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/xsl.svg b/static/img/file-icons-classic/xsl.svg new file mode 100644 index 0000000..062c4c6 --- /dev/null +++ b/static/img/file-icons-classic/xsl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/xspf.svg b/static/img/file-icons-classic/xspf.svg new file mode 100644 index 0000000..2a59c7e --- /dev/null +++ b/static/img/file-icons-classic/xspf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/xz.svg b/static/img/file-icons-classic/xz.svg new file mode 100644 index 0000000..cbc7776 --- /dev/null +++ b/static/img/file-icons-classic/xz.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/yaml.svg b/static/img/file-icons-classic/yaml.svg new file mode 100644 index 0000000..c13ea31 --- /dev/null +++ b/static/img/file-icons-classic/yaml.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/yml.svg b/static/img/file-icons-classic/yml.svg new file mode 100644 index 0000000..59f66b2 --- /dev/null +++ b/static/img/file-icons-classic/yml.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/z.svg b/static/img/file-icons-classic/z.svg new file mode 100644 index 0000000..c8ae280 --- /dev/null +++ b/static/img/file-icons-classic/z.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/zip.svg b/static/img/file-icons-classic/zip.svg new file mode 100644 index 0000000..f9bcec1 --- /dev/null +++ b/static/img/file-icons-classic/zip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/file-icons-classic/zsh.svg b/static/img/file-icons-classic/zsh.svg new file mode 100644 index 0000000..ac2959d --- /dev/null +++ b/static/img/file-icons-classic/zsh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/icon-256x256.png b/static/img/icon-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..7881e9333b27607a552322209ff635a8f41ed4ed GIT binary patch literal 47263 zcmV)ZK&!urP)pHZ`jMSM`Sz2^;ceRFS3`G5G~QFv`8&O3y*LuuJglvue)beHPGFtMmOkbm6es18R354 z^B(b>=R7C!OZ`fSBo-z5B0Z7B*ht4nBr;Y~(bGjqqG!nPC;Q4o#=}qkKSeboLmSrg z6%-VWr8fi~P$ZFtPf_@3 zjvpomIR1nO5=j({CCUoMied$0LnE<*f><2B_uuo^FS!8>C5-i@ipC--;YbpxNWn;| zs9NHM8QBLQj$*m zMkFE`|NS$CVjS_VqJFp{%YT z%PU3`|Bxt(jSTb@42%p#Mjr_VKc>d`<$Hbl9w2(+rhQtkk+vm?v67KUtYqFO#OqW+ zHTVYdqtEVlI(b*YRm;LcjwxjS6@~IH5+ey7r6LKQfw9C`q@pY`)C(BIAbj1?$DTv< zvETb8e0|ymkfmgws^t$Qq*^-W43zYxNGwP-#Ueu^HL0P3g0XaR*s1u5|IXfHmd__M z)qJEF3?Q9k8F4VKWajS`Q6W?xLnEW`9iM!pnYZ|R@cL8@U^w&TK0O~0zGmN%n#5Sy z&`_$XAl6k3`Tv4;Km`Xg?tdJ9kb8z`VgLpG$=l41JVO?URgFZ-QiYIu#v&ynvDi5H zh%E1jKUNe*c@X&9KZhB7;^$CteEK0EgJaT9wMNb!W>dqOkwhdlG&Zm3$UsFOa|*hO zin>Nm7=VwVc3Ik3RMHEMx}Y4Kedb5XhGIo|xtJY%Pd9jwXaWdlspqsj%w8E{`L_%L zQ^-2=tDipZ@F^QW@B!n@wPtBiGWmZ$!<)-Ld?b=OQZa9=WN2idVo^~;s$!sEQ6cmV z2EpwMrQ`Tx$5WIjiX1Dah42DFu9-jtKxh{tLD%roMr`p1z?` z=t3mHD@7rX7%ODqWcJo3PeRC_=+d7sq8zV?6@ESy<<9{Jm@$E9;u!zN<4>j^w;+~? zrA7wE!O2G9fgUTUp{O7-RIy@SGZbcZzu`G=`6Epua~4%*DuD6Kqb(>ZD=H{!8HMkY zd4Vio%&F;%j1`On_Lv~j2qw^DN;5omOh}U=h@($#pe5ocjzSGzR#jEEXxXv_<#23;&;-une@RVA zNl_wJQg_wYEIF3=nyLjK7%FJm3pX+U+u5xzhW{!nE2*o91O6W?tEeiA6fG(#C`*(B z=o|;H5Kr83B=;_HNC~6K5f?)O8H$bABzG`9;wRCl07&OvGy8sH#o%c^^%msM#Q;b% zBN&IGsu1q$_>;P*agNL74=+(sw_wqtB@0SMOb)OZVA!h5UUS~SK*8&tchI35OG+9Nk;Eu;@X|?|R#sCpXF*+Aq96%(G6{Xa zK{&_^6do8EIMS3DI#RW2MOQQQ4T>uIdf`WY$T^&pginzwC@UI-BNqZrmX{PlcAsY^ zS%~W!216_xO0@sp8bEFYBqOPjqKct`^dmLxINa2%?NhO8L1dtzqH0ssiI$;?l2p|h z`@V10uUnBCdMGoanu4ZYFgHpTEL*i^)qs%Rgi|NK`8Rl;8h~^ zi6JeCjGg@aVCBElcJL6%*uY3p*~maTQwZgiK$hE&48$sG7BwB~npbniuNdh2bKi5; zD~A5mO_83lnyQk-g0s$9QZaC3$6IzC>l#U=c{UwhIYgWt)=*tV$&$8X$9CIY7#Zw&H}xlo%Px0#((DzJam2 zbzLLyvmMy2|)YVliTeYHTM@ed4 zqN?RT_=d4#!w^pk&UnT-bB2!G^vGi;`qD{^&C)i~fDb-dTaUDZhpMVua^%Ra$Ylll z`UXBU!h%blRWNX55mi+U`-Vow%6hsXlgR6j%mhZk=aiH~_K@+IGINM@LlU`Y&8dOZ zx-|_)0i*atJmsTE!Y{o6WJZvTrFsF4k3$XcGdtGYm1cCR4tfy+hGV1{cxXa z8osG&(VUC^iIF2mzT#_c+EF#qv@UjE*GQ}~F@SL>OH*@JM0VB1MoKCnVH{)Ll6eDF z*9;vRhbf5B-BIS5*x;{G0`)fKX&uWojIVUIPX5il}O620%K? z#fxsZmrWoU`=N`jDO)nuFjRF`&29hKEqh{Z;|VyFRRaR8by>}6s5%Pf6qQ4#am}*2 zp-ayBfwmF`1QW`SKQZ_;m>0h+oWMvyqNHM8RnMuRM9rMb9vT{X)0{a=5)A_@o_1N? zfj8ZdMBtdQx>mWviao zx2?>K0p(RoP2W&K`nPQn{lX1k(*DTu-#L-vFbI-J-O^XHtSAlD!;%$eJ)>;b+qQL$ z)a02^qHfbAP463rGV3|NX4RbP)^*-O$v@p{P>$rzpav*9>(v9on^J+wsIB z42)E?{Lr%BL~KdLQx<*C15bIzg4mygEN2u_)hL+2v$h`ZO zc|tVtM^&qa+REydt=Y8cj1_hBE*WXrw`EV;P^#xdD%J3xExKmWp+(=Z;TfB5xgDk& zqR=o(^t`QRLC3QauX@kWMa$k2d)W<(-V>`#hSV~W%fP0~9tMc{Q+WNN4Isb$r7+z$ z4y9pME0>j&WMknkcpA5D=@_dR$XYfvLoH3)?mN~pvgD#GmR+=|Vx;Yl(bEg}Zya2A zA~G~EHqx88^*H=I(hn6xW~4m}4n1(kzOG0?Pm24V z#k;QAv=c%=Y;4hjfw2wi_AIEVc|%)C%b}s3A9>MP=hf7_?9koG#KLDRc-v_(%5+LS z{aG==pA#S8CpdnShns{SIVGf|9DbCPT=q|V&9S#V(nVGh2?VXIK5pwecAy(dttGE& zddp1>y-+xHb%S~Ij8x2_i`cQ9&>EWlNDad8jKV*|KmyO){gxZvc1K&RsA|DEm#m6( z^#i7H=$2DeHEk!M&WWU6^4q!+7uy69pc2Po@2*KjvP2v_p%j_C5DQwy5Jpm z4L&lDG)DBZ&8zBn>Dx;Y6bhNcRcE*NH zs}?P~X3P6-+7IC@QPtB@3Fee4Sa;cd@9Ak7DX5DKCHfYfcO;g$;ccm+=hS`Rl7aUu zTlKC7q4SVTDDM-B+0Oz9{bE8u{$QiY@s|QCKbaI^6;Jz3XZ_F*v@Hhy%}6gmtC@mF zek}89)R!LytW0 z73W3D-g6+IjLhEAK-NgkILgsaZvubE1~75`(d6h7CFPKk#o_Q1%f8}k_WiDh#$jrw z5IXsT3B{}^QBt>VQ%%9po)6rRIt>mtpZM?UVW^8`i();IlBO*OlLT-!FNtQ%G!FhI zFUWGgH8fV1sOvd!!=kI6vEhv3|&#GURg<%;0Az3;#|H;A6+1-To}zC&3>Sm0a{s zT=rc*(3Vf_X8nQ;FDnH1ny6TI-B}HHw5+)7Ifr(vcNt2Iv`Du@=V5sz$av zaB50k&)*@jSwedBL>S1-Hda(ul*P5aiZyX9CBgUKjtf8w)#xeZ_@@r!02V_8{s zVgLnIpYdC|e%E~_Rd7*J#fFQ%Z%a`c__~X(Tl1cGyz4~OrWake;?O%zWdmHPp1!ex zo&}rc^bJ)+wtZkflxNdd^h7X-C%&LCleJ{Dw6iwMqZ4Y4v9YGdZh7AGHeFWnfn6hg z9~z6CvFy}_OIj8@=epEA51gtQIyEp>v+9!1I`+N;XT|pXXEpy)#|8g4ErY-|$g~Pd z7>4e|FRuZ7?D+HBUsatLKxEO^ecrpi;WRj10ngv`oC|6?z8kc>hkydE3^wpiWsIRZ8V9&cA>U}~jJyEjRR44fK8J%MP4~ z#456Z)T-DZAe%oEGWd5H0-~8{nuPeBvG6kk;EaFlyg&Aikz|Hpzv#2RY+2;c2b$`H zd$^(Ju|ugfCC55?+Rg?DwJf_EBLy8LXDu1%swg`0fxEhXyyKkB3Z68Bf`P7%6Zn{&PCRSD4=jsp zyY00ZrJ}N$q7yrgG(#i#XL$V`89?HRJCuZ`OIbxlMOj(VRlgrO*wr(~gan)~l zSw-I?f96j$!%P0%KjzRep^xMb zc1i}10?D(lqv)Da7~2>ss!2jt-qUfQyf<|XyeIVq&v;wk4Or2#p*;o9?H?=22*OAx-|G;aij(yj=Qe{H}T_=uJb?n%7SK^VTDA2H1 ztm&(`B*XuQsz$o1YDNai%DVP70##%9k@uND!2JF{Ioz7vwR{9La-y$ns1$&#?9U8! z?by;$v20NZsZ*(fd9UgDkyJ$_@uC$!P_(6EXvuTl)R;^i#vb^QFWPojMMtFNJ!OYF zMicyWGJH>;ohPJzv&f!=|}n@@@FFvFZ(T5jeX!hdPCWw zijIM<)S;S|10x;tx&{&>MPu_8ZL3=Ii~|RHss^fR5*^ee+79&<#A-SL1)RqE?D*4} z0r07T;a>0Mm4MJ0MuDI{}9@^JZF>ft! z8M9Za;Fb$sv~R^@ExW$1>4pc2h5?SsF_JWdtg)Y%DE4zPfW#BGW;zm?1cyJx`ioZl zQ_uQS?@K4-P!@d6uUppgO@HXVfvTa{KwHujumE}_2h5= zBqs24Fo4OO&!^r#>i)|rllZ^pw_Wsy?#ZQCVbgDUUD+dl;G2#OgX>SF+InIqirV2G zbwk)#u%V)2&kvljrexECq1Yu)J9SSfq+z4*j!G6olP7zZmsP#5>Q%RN!ZFVdl}{yR za-$g9a$;rjyF*=%d}!b)mz8uv3yM@RF5^a5B9bG+h3Qm+lsETKb(F2E` z@`h#GPJPe+9^VQi)nYjCY=C?eNGcyuM*KT9fbeKCT6b2~OwsdX(&{NI+VDHh`UBf? z9iFk+)Bc&~jJ@GMcvmOTG_%|~)zuR@F*XnfZZFHus@v9a+1QD?^Uiu?V8gL}i&j0r*9Sl6EH=CoYZFsJBLK~)?O#N3~aCyq9Mjcs|$Q|d}0Lmdx%h?krf>lqs8 z1kI76x~HY~G1k#icHpt|=2eYUovNxR5n9K&;7-piUlM7G#X8=%tt3%GIW&g5T3R~t z`NGjpmIeGA+QDJmyEvJ0pQ3&_#Upe6XZ%a+{uf&c6J)#SGyb)wb^W>j!4191@MTvw zRQde?yNp6TF*ffx1GhA6c*TLbC5x`uQL^s5)W|lTm)Z-lyJ;+O-Z=-_=F|)fopsf! z2X;`fYF%5dFi;5nim6}A0podfMMF*Z+*0tOOMy~yY|m*BpR8K-6~{g_Hq;E1mbU8_ z>?=zQobx$%J=T{~)${WCIfw2B?5}Cv$f*q%oU(r}^^hS0{-{N-Sno&nQ`tXil21*%-^R%g!n|c4${C zc#yHarX9zsHiG_0LBU*5Bx>md>g$QFhFxFv882yDR`-$(_q`Pc#It;3WN67y*P3Vb zEclZD9PWH9QJZo2X-HmwB7Vrv&j6y}*rQ+o#c=oq1q=R}%YM(J(CCdt=KYGVtGnUf zdQ&&J{^{`#!l9?8)J^KHyQAr{m$cn7@7U0yB{eOHijlGRt$W^W@96u$Q+n=)RWnr` zH{8|^kE^NUR8OjfMTt|fvp#EV;7AmPI|mc`YS%-1Vq>eGv7&6G>(HT*O$$oK24VE2 ztfb>4G;S(EaH?aVt>S{GT`_jzeQ#^zN;`6~osvk=wtpv94^sxIu5R#>gP>hDo=I4L zfd-IMC$eAVef~tE<~Kd#_uV&@eVOyCzNYLg|HcQC$e(+FoSc=p#5rrBgHZE|g2>BO z?0RU$IRn?6bvgX$id0F*V?E2BwQJ;&D^6@$)sq@)TeK(_kR2*Ihl09gJHdMS3!aiIiuas2)U#w>MP#6(6TDYjs;wh6RuYE-F_qfUx2NeEe&n{1 zQqU5ZZA+aO`H_(|t0MO%G?sDb49*JTjr~MC!Jl6hkObANoamYJ{>r}Qb${qq2nuBt zOTOldir(;V+z5x?oftr_+L3+0vWsd`RaNJ0xMSHBsrLOfmV5laf@?YQST zzwT`xI8=4cp`x-u;MY#;{T<_pJmh}px@Re9Q&-u#a~7O;Q(wuJBPE-z8{5^?a;&9j zT@_vXb{tDX1=I)$EF~pvU725q^vtPQu%w~xId$9K(+Qw+hCYtMVaJ~JS^NGXm{mIA zJx%ZZ_$LK}KXn6`EMF)ph4yGJzLq6>i=Or8-kBVK)rw#7d5L%YzWe&Rlhm&t`s}$H zACV=i4jihQbKRD0^X_Yy3t-W=wOkJMcVEGZRk6o*?P{A-_0X;t4IJrd2NRp(e(8(@ z%_oa1=4{&wGI3d3xnQW_u0s{q^+bjaHI1#B7i-&g$CjQ*GjMt4l<-6_$04YaRI{M+=-L&a@3aWZR^B@PU^27gy_5!8?O4*8+L`kBmYG}>C ze+X>cjBCH_t3EGr!?(1g;qbdN&VMvB#$C1QP+eqXT}j8fR9jcgQ&!!yYt5dHk*1D< zEvZc__MG^pulTyQhf-G@$yQAyIw5*yE;W~x%zJ@ji4)t}5@RPeBzkJLydR3hqEk%; zMT@G6`tG~ou9MK(9fw2g8aU%IT6*C-l%)oG-Zipe;Cnt)w5mH{AZ0$Z800TwE1q$~ zo6cEvVB4;JjR60Qf4bxU)D2*A|KrdkO@c2d*z{Z8^#%XVVW58`N|t=d>x%C9p^=)w z6G=^flKJP5$co6GYp!T`!AQrZCHokd({UhmAVS-zf(0v%+);AgmX=#;uIhT=f{IOh z&f4&nEfr0@07m6HBAMAG<~-02(}_p6jlC4u2E?vdbEIt1f>S;FKJbB^pct}fK}9)? zfOlN-W{CY+fmaTg<3K~?(3>7v(Xc1qgBFV|TlS7UsmQW<-_wozDYk!J%z!uBU8 z2mL(u1!Q@DS&<;2R8r8e?*HsR=_^f2!Udo61!edBNLSS;)cV~?=07r?$!zNu>}%^v z%-irVh(@*bmEEvmPeUara-Db8vORkS?s?sgj`uaZ}ad zHyk^o-~qC1y{8o7?Wr3oR;9L#Lb=$oZo|C310Q(TeQiY>&RSQ;Fp#&~?s!2V9DgiQ z4-M<=iLJQlk%qE{oe5wai(Qb~3*~2Gs4v!Wps5p7O9zvr@n^ZRpU!LM{#Vojb1zT+ zhTiv__a@DYg1XQ6s+ui7)R5?D>goiBU4N3|2=}mH!_cV(XDzvE!}kn4_Q;kMCsIpJ zWUD0BU9qUk}B8< z?W*iL)m-uj3!(kB;Ift_H3Hl`_(&1>i!gvEIKO38g@AR%YGOTiyrB^!pbE;K_iGj$ z_>m(8sRMgXb!KjVj%UYWiVArdj*0YPAhj>$JHUSlg0>`l8qJ4K!6Zs%02xXuDl4Wn3*U?sTQS8L2 zuEeTD;yCCd{0!?lK1C=vo*sX}k~K-Vw~6zCGdnsax(k2rg}E z&v_$h#dD4vip5TJUDI^OF!b~0bZt6y+1D+&;SB{JT6IHDUCGG6nq5t)RA0lotG0C} zeZ7oMacavwhXz^(#v0n{F1c!vz`vQOAB!w2*jKgTz>>CtS3PCfp%1+0o`$J3WY)DG zcumKSqH360%<6(AFMG#UAhI2FjM~Nfj(xl6q0mrUP%gYpP75iR=R!O zzch5+pH0TODt^VQQa9a|?cX~IBi7v~jz1d}se8tP1%sf9le(*b-JFZs5EP~~Uez3YuY@t9YfaFRyOy6$~# zHA6j@6y4F)bgCT&QGG-$;HMf7`>73J66qOFzts%!D>H$ifs(SZg1U!_&U-Jg@CrWb z*OlD$p`qAN%Z^8mgZm%N@CXtG3pUiOxF=Gx?3{}CowX>IdSA!bS?f+T4fUleF1jrC z2j0~SAZ=o-6Q=ZIiO2q*=Dc9eI}Sn=o-=RBikG}@tl^P69y$zw%*eJKi!S*UkKDq7 z$BI%%_AH~VC9-bCz8i97urx4}3*mr|ecNyPtZ!>fo>=OElB(E(c(U@Q=%SZxd4yv{ zJ3dtNmV)7=Nj{jAuH&En_~A+jk!;YDS8d6}1eldJyJ@7d-E?Zurk0 z7=(t@SS9q}Gx}I2Mp?AwHR~SQndAbQR?(8PF1YA_4K>es#{rgn z*;l;hk30^zd&aF@foi8&bi1MyjJ{tm2Z-TlJ>* z3^ZNxzq0B3?s{b4MBj?k>7-3YYW%YR0Y9+;WSkALd1q~eMGkokik>ilLTLNON>*I) zigVs_tR^+~t9~7SSNPONGeAhP|&EVsavTN>X%osp6$}!ZmYuz~qfqR(u9Y>+9d&k>8)OFPtTo-GG zx#FtZ+Mc!IG>oZS^P(N8O^Z(Ln6u!F^VThzpUehC`Z|VM?(2KT%Py!(%$c_;5nK1H z*Icsi+in^gX&Jhz>XrwgH*%_}t~lWU!T4v9i1>*OAQs%~SxW)mn^OqHrhH&(mie2A zj9qqJ$9o#e>MAbzM;5*5ckMaV*4EGnDtx_gV-tx*6$Q(Ns2b^Lx@Vve7P^m&tc%^# zGthQXBz0(D*=;{^GRY(|!1cPG+mps}8cZN-Go9MC?t+7$`!)QCAq*V3;Q{aN;j{DcEVN%qrxaA(;rkI2w{clBoOe-dcl zB_+?g=Fo|?z>cFuT@99bPW&~X*dfK8NXiU0`d5Srm{$2HJ>i*0lQ`y*AHgh4=BTxH^ zXB>IY_w0rC(Wd9@dS6dQXKy*S6XYqgg%X9p{B1eWF%13DoE=rO>Viv_MVe0R+H)E@ ze>n|x!3*Be7U?;ia3nKQN+jE72wC~6MRhT%x?z*YRPCn}KH7P| z=8N8QYN)3z^{SVQ{h7be*3;2+hik3r`ThUjxYR66(@XRo?6$=(!wQJR> z69pSK+;m&fMQzQXH+JKnSH zDW9?8SVJls4!Pj6Q$wjkC!X<&wGapeBs8lLPIUvPF`XQ4o~8g9Gkfj#X2h2>~y zs_T(cJ&{$BX5dFPRRcA^-?8QR26mXI~FZ!=@q%ZavETzE=WOe_ zY{8pO9qQY(6bxnFs;50|*BeeI$DdP6CVle|D4Moi@PdKEFoBTq{zgyyNDZ`YdFWZM zE85mU-?o|;bhUI8yyjicP8d-oBYpFZv@`=dC^vvKgsQ4VCC#vZXevyVd$DW)J=N8> zq3k3WM;bDkIB*8!8_NDx29Pasi=#M-v)EozQ9#YQg)r8gW#$=Su_0gfPzcArY{@_O zs-|yA6~yNKSDts|KWV7yI@Z<=Y~TD)GRDwVt11q4#TISb2|c%1!MZQoF&6vKK--4M zp)1PX(l&D9z|g!^8&;GZc-w8=aQM*^)QOLVzewVuB@dlUj3YOM9L`B4RvmlK`zpTT zihCL&V~0jw3f%pR7L;u%JGQ5zZq=!MZB3n-iKCp%F}7$;9P*%%Daj)>JEAr+(s624 zRcoRNkV-?TIr`~+z$Y5O%znEZx=k@}Rh1yJPmvUUGh-COqjrDpI9 zulp^DKlO(i%H|9lX-(Qb*=$Ru5OPVZY+uK+vbz(R_M)?1_azVAcPJGpd%=14T-J5p zsiBd+6T7xNa?d?GAsx%wrTM^kcHFbOIg3_Z)b^egmmD~qJdCk?u}pqcMSBKLePG+V zTaLolXlZ&**`9qxH+5XqcYsLUW2ZXWx--;`+^Aw})(yjPuR*0?(XvR_yy7J1kB!yBVv}qXBy-}w?Q_Qd@4l-N zShVYYRo!j>#gU<18_tG8D@XnEG3S!8d(J9L%m?@-4zN&3&tKUOv31pNdcmKoNZe2q z=}ww7`RcYQ5SxL(^8uI3J7yX4w&a|3C$@Anebv|eh3$!n%+3dvlyDI~*Q6OlE)?wSw% zRR|{eZscrj_TZ;Qf@VBGB97uXj^q6Irg1VcZ%M&GqGT8}cZ#xob|WJ#qj1zktG?h_ zXYAOOEBO7IuNe4!KhO(I_@Q+R20CU}w`Y&|aiEmOc4TE?-IsjXvd8X(j^bti$_0Pm z&n#Q@gW!n<;jjlYF+cxzwr;W%$XK}#h*e#&X4_+3V=ad+x$IDL5*qTS5m_@1#Efw$ z#KnK&H{v52_n|`C`V@z(7we{GFOb9Y1o>j-Ev9 zqJLq<+kVf9p1!VAJC0S9C*0Vqf5xyc*p@*!=8gjwU2>#lDi{@uEm(0F{7gIvABEs0 z2G-5nv+Jq_dxmxlz2>oZ#A-5?;%-m^n);{IhAW}_IIEhPucFPimR?mgkXW|vtM+|U zPZCgosa({^@Mkc9(BR2#bgn{^vDk7xYez>#MOP-O&<|N?q8RR2Uq!wX^MY@A(=9y( z1!e!x=QRC~-Vf70U0rQ^ww&tf8LPYOnswvQhwrHw1X;u+G+*1^Gf~ z7rbI!s%4<(nx2LO*HrBXKxoH9)WY~^J181Yvw*S7&PtW#8&(U!0OHBJ{uTcR%kC;D z`I4qTb`-RaGd0xAq)Q@w+u_eFZS3Pn(Ax~WM+ZKG^A83Y2pPcpEa;lF7uezjbU`|_KY|*0KaNKjQE7}hn zn8fG&OON~;4-E~}UGt$WLj#Mtfw?o9kV$h`CubHc=!b!j{M8RjVP@-s+zT9Ni&b5) zWX-ysibX5VIIF6o=wDcqdQM_b8<#b-9C}vlP~WbSp(AMkz1rFaPXvL)bLtYcaO;bc zoHO*7c10nZh=SM4LUmDJnjd$P`>wxcMsR8XVVZ0xZ2rz+hJGMV zmnEU|mQ}l5!;qVnWwY<|x`v+fe|5n(LaJ6!_K&=#;dk9Kcw*oqZ~T;8cg=?$+6%fp zRqI+BGCh&Y{*{pj#uACw{Ej>Rt?l54&e-sV6REzUYJg+LGjXvX@A4JRSq!3WQ|{b2 zFb`*!w$patl1q;DR9&&@oPx-lnt3%XTTVnS*!CBiz8u6|>n><$I`*P&-~(QAWM8Iy zHgX(109mR!=XnJSsxncmT;Vh}70HY|V^!*|6WhkBD&{BoL_c_vNY%(7!vZD?d85D4 z0K%?sB5^$1+0SKNvH{Mzx}xL2>W{+X&7${6!Lo*tu96G>P%ES{*Zhuo-|>f9lL_DM z1d_>ej29&KoY!}vq^>HlCk;9Are|#1Q&8}-f9;-sYj+Zco>K6pu51moMJp0z4TFFw)}8nt-IgeL#_xFSckPAa?};qh)tLagCze8O zGM$qdNGCmtMPsSh?9jz@s4AUt%wwrt-w^qlbwwrH4s{ibY}pRmM+Oc&G%~bfO-0c) z7sGvgmQaj!T}7UW<<{+eA=7%R&JT&mWCu3t9kpD$Z0S+o$galPmF z4UDCR&iJgzo8AefS%0QH8;31n^CGJ%9!fkD#FI{g`IUXnMMs*r;CGz*T|43U`vxj% zc0*mCN*#+Wcycx_8!6A?e?4I5(^=&wKkaM-W^8Q7Uy6Ozc>^b6b0XUg!@{XicqiGs zK*@?P`E?K659W7M%PV-x9j|!SBM%*a?2zY;m5hR*gkRbQP5qJ>!D+5n1uC%=!PgGf6^+ zM$S9$Ehm#h9AH5^V-JSV76mxF?o8-hWHnE=op729JedRJ1L$qXp7)~rcFif+bs7q} z=_?x|yXv~jzNzmOcXUO@j$Fr%BiRDUVGwqle%F%g=G2Vrh3TOg)jvX(l!sU!c&m{Gu~r`UCI(Qn?3^?VVie8U6bCJ^S;c|z#|)vT&T*N&=W`}CXj`RM67S!s*(rV zI__#&bc~U{QFvEFv0C63mxF}X_-{0T86oHCuciwUl7R9jBIiBhAgJwTqumSU%!!RP zLg%{|9?e+MH7ounKb#0XIKa+&_{iJmKqN=9L*4?%p z9`x+(&ow+69yl}#;_&|)J=-EJ6_?%DQ?+Hw=>&<)FUeIM1NV(Bn-gnH@P~K?ZpxtJ z%j%A78yc8%A&jSGp(q!sE2_%W)uSMC_17D~%tX(usN+=IuN1m;*@Ctg^c*TlEU8$u zY0hui)X-GX3#eQ6U^?FQo*y_d2;*L}3E-UPoKaR)v}EjkcPxt>OH@=mZPh!*Vwe33 zH~i0`la{Dhv~0;)*L~=*@#LN?Th>sLJjh&6H^#CXUW(-J*n%SR`y*I@yeGp zj`j5=64zbyx;Z^xcgam%uPE3P$v0e%f?D=);`(#<9Vu9HOwc#579 zIdJ6EoU;;ddDFH7$GRb1oi@rwYA&eSc5H0j7qyH$=V92go-+rs8n6>k)d?&VPc+VE z3?P2;&gZL93IUPM30|45cUBT!@rtJ%dfFE(`j!J_T{N6G^jId4mX}od=whz)F$(Zc z5`xA>=XKrluBJ_?rjn|%=XKl@i+$N^e$V?xA}h`+>o~IS)K!tc%B);T-8n_Oy1L5B zTE;VsY{lqxAYCndEPZU zZcY;8CTEfoFR>yOXq#f;H@g za$?=Fhc4T65PF!|uJiN>Y(LK^B8S#|&Ml`n^^60@=FrkraZTBwIp;lcq%C$%!JD?^ z`e%J@r-q8b3uN+=tImkLWzWE>uK(zV`h>zbC$WrzDKkskFJd(LuR`Vla_dTz0}fCK zXWVc5@rDifDF>yr2MjlJO4{E;^dq!z8tOzUyp zC2wmgDw}uCf<4C*-v7|Dv7TrqjT&od=!ncsK$AsF7A;z_s&8K>q=h6QqsY^|krh?j zc3pEWw0BaGr3ukHKmOe3bVR;t*N#Zj1t(4{dCpn)-PDt~VB~RFAh+m_M&`8RDGrh9 z>l)~4YH4eG)|$3=^|V#}ua(4(HA8+i^#NmfM<8EwGnOse$z*FrQsY8AB|j$;^HvlM zq*h%uCk?>wnoVc*MQ%C@D1TNsowH%pP~SPr0fLBv21X9R*34V9VnGt(Zem`=9k<>0 zz+;?M@Ul4r1)sI=k&(K8?!@m07HrwN1^L36vS-b^LAbqVbnS&fiOlm9Erj9eoHE%7 z*m=R6s#Mjw4QrMyn>X?}%mHQxxMacZOq+OwGa|bVJnfRQSW9AVvJ+@p+~qKH!&9z! z-@s5})xM`)^&>ZoL@F*iaA>69tbvC{S+ z5Crl75@LPGRYR?3vnF&!U!crbr%9ZZP{mB(6a37e$CSk{gp_=P(e-A zSj9L9sE}{i&3G;G454uxTz<*CWmRJ%W$Zf93(e*;$~vABJ95_5uubPRulx6I1`blH zV8N1k^X9F1MHo__fZPUsms z=NUDJ3a*Lt6+Gn`Z`ukRy+xN)44v_er#$O<&wIwYYDoV^A>+>V!RzMK!lJjV?Gq{K zgm@KMu&HgRp=0dx_S`bW%Z~hsPI$u^OD^__(f>X+S zH0gT`0!S1J#*mH2ktYkmv7S?rD>gOU*Y=#JBznGW99&yb;*8IF#=M@cj+Tzpx@#_~ z>gb9m-?*%%sum#Qf_cjpjkIJ$=Av^FXM92A#JXpEFN}8G@s`ujaEVndm{$sYuLY~_ zXvvm0XL59jRIVwU-S|aiJ^7}Rl1kX@lc|k%Y}#(Wo+BP1tH zee)jLR@Vu0MiUSsp7j9v*i9^vF{r9;2FL%Uly8a{`op(X3qin%(i1}F$VKz+6S#lVb)qBDNWF=O|u_Ff_dhDWg`+A{_o*r7H zVnwX(jGC7`u#eQ!9%_kQvFVJinr%ns9OVdOZUE^t3`~K!oHF{V6?<;VcadCjR)ZNI zkcGm6YUtNydye}b1BZu_*`y(_nGb7tg7vFGF3BO|DH8>nl=q}!^30GFyQ2;p(Qo#0cQQQu~j|&&{dxbIAj?}z8|zB z7HR4GsxSMN)D;cep;xX=~dhJ zz&V%I!c5l4W!F76P}5b_H=KCfih_!48Ap_{rDo|Ng&B3Py!n&g+M<;6E57eufJ&-fan|jiuOD0Vinb#eWAIeNb7DIob_xkhUW?XosE@Y9 znxPwNHhfRpIWPF0<51Y-6S6%$nKIv!>z3^)saudy$uo>Gp9Yw2CoL*llZZng%5PPk zC**6a%Bq2&wyNXw3GV)ryTfK zwe9F&-f1w$CvbZCY*JxDy~$VYE_zALZ4bkziG0SceT>4U;wa;Z*UQ**16Ad)c6RVY6+X=cvfw=X^8?@TD=vH2l1+(wTIQTHu%oSK=#fXB z^Fuu?9rNB2i7lFQq7n`$GTl!W2NW>>zBL=_s;cJ9n?utXm;4~;8=p9}F4JhO>Zt}3 zFQ|!iqzYNF`cZaZl03O8eL9X5Srhx5|A@${Q|ItuXrVBY1f;Mi6|1=FL1?Aq5BIin zp0}$VrirS`<`lFX8>?GJ%gB-&Zn|RL`-U!A@#pH233n#XABH+k6>aEx;Es9gQcZ&F zeA`jjpEEMuPhK)~#<~MJb8tLC`=+aGGXmP&&$hhhH>}u_+H=-TBV8MwcFTEtMtPrZVxC0>}g zbuC=7WZzgp&z@C@zC=|=U%^PCD$&;$>18OxM_mNZF z@S%Pvt7e^jb|;6yc=8l|91LOXfxq;tUhzFG7hSdOKu=;`hRxsfn=acH*>~Q&BMWMV zDi*|cCQ}ws@G>JMH3hvOOPi>Nu4T4~;TUVqISt7Fp0l#W)kU>1HI%h~vi?i^lkR`6 z{WMjjp0)h34?Pwet1CD!b=y?IGg47=#;+@iHLNNGx@3l$mlZ`0v|S7Bjy!d$so64T z!>Juj$8PC3W5KbOf(`5Lx@#u@%d-rc@udB7AXb+;a-BuUERdBAtvI_(>ihn?x(At4xsNL_wq@-;K9y=)4`rMw8=@)s*d-^G}`g zrn3qL`XR?2gm%oS`>v^k?HCz2Q@5ny)IiIQQ)l&bt%~jHD{1?tzfyPT$z>7K_q^s< z$GWz;bTqX!!0dlx;~R2F5z>df9@8nj=d#l)WeMtb2N{I`%k(6roZ|40N4y z(TQUNTaH!L)KrvIwJch*5`^Y5-f@4DW@i~qTieJuOaF$SXaE^KJ0naig#C6yZO{9< zW&aO{!S=cZU&tfnOwXUT*sGW>rlD56bKf&BL8J|K11*jK&o+wN=HbUvt;GIZCMtU2+t z#Hl%VoH%2w=*XEMqM2tIky6+`(z9tjNXuo#c2?bVG%TyBSkyMu)U%`|TT(wT(9zW~ z6lsLw{KptTYNW60L^Uif$~3q>>(8Bv6?DxThn<^wcA8D4)V2JX$G+f-y|5f1R|L+0 zlT#zB!Md|rJk@r=qHnt8$k6v~gr>+TM#0Z?(shon9S(vh5cl)))Oqoj~PIo#$?p3F8UhEKCtMI3`0n$iNZ`^7KIZP3lbN7 z(Kmc(;4A7D6pR8Im$xt|T2wR+xKzcQf|0T{**Ig(lA05#rc~@jyB>tb?r8F{r(-J{ zhT2w?>}pPSWlZz?*p_9BfwdFKTA*3CEL$Z*QCVc&*UkAuZyT8llSW5&v?sHRk+Mx| z_H`z3){|i%?^5Q!H+Em-E5790PV_V_g->zf(0K)YH|==njAuP`&zcP%Xqt-FWS_KZ z&0NUFM&bYFY7B)SK2y_?s%z?MSW$2)YZ?!Y0#uSImmBia5Y76|1rZ$Q_$5D_e9{(TP*p4!*j7 z=6mit9l1$x-DRg*oyuBJV8#en9IgGgOsWS|?`&|LIedj7v|>&R-9 zwu*Lepu>>LZaAaiNMgx>qmP86{O7zR%=r6v@l{{)EvF8ghP=IJ*JV|Gb@Pr5RP~IU zx??0yIOA~ZGu@x6B9qyl%-HkVX2;09$cd_ot|QMV2X~((zayuaj_Hq|4NPVpZT_J$ z;Ng~iWd*UmhtA730gZxvjV0=0kKA?Lm+fjxEUP&VxZjk_oRxrC0adl2X=q=`f(vR2 ziiRGT*ACo(1;*wEAdsYAc# zp`NZ(M;DvO^+m=q!ODRHeHCi~=LAE^)Mc9q1es@e;9I`pE4~%JUp6|j9hzh{S2W!B zp?!THs@qTxiVAfr%AuW}cQrD~N>@i;p16-3>ZzLZK%}JLSXEUd4bvHY?N6@#pEQ8! zRKTp5Ld&kRMq=I21Wm(qdlEuGRUJ(q`oPOxcTU-|1^fC&hCwkX3aEQiTV$YS)z|~~ zJgu&dk+#QntOaGRWl?}^o@`L%VAZmkh6RG2UleXkJ~5PQ01jqGxW>T=cQgV*aLvE4 zSRYT>p6CGrAdq0rK zau=NjlKWWXqJL%IzYoXX3$=Y@sx6cu>1V7v)DD#PlZlaqaqD6B_{OG{K*mAHxYVcK z_jy&{aT?zJsgY%guAyrlO05`ZDeAbWYuBb{oKXzVyBu<=;f%!X6dXU*wqjlqg!J0R z<|f(FPrN%gYll?LTd-nLL0{KM?7GYTJCVe)u7X7ef$^7Eu%Z^Mv#a5Tx_@HXq7~hs z?3+D~nxV(qp<8z-a^HcrrVTYc`}VaJC4s%Sq^-WR)=W_t5oK2f)ZDhlw!u?H6H<`>l*dgO2uZ%JPtz^ks zfTLmuo-^+UnhFvFLu)F|+jM}EMJGlUlvHerU3XDcJW2a9f!c0hED3Gy45{e_uN9*k zzWV$V-JD6)lKj{#ATb|$fFq~6VWC+r4Yg~PFq+V_>7jm@u$#A_JQI(49y+jS*{YsB zqd?B$47TO!mnA(PIziFHFecFxt0)A@@?u!vIIB-!@?mP$9I6`xGD`M0&RR7HGK(4C zFxJQ~sGKRE5u?udnwtLP8l`Y7_f?!~hBUA5z`XLL(VHO@ zZ6^}Zj2WfDSih+5-`lt3*wG|U$cmHAQo~q-CHde=$j*_Fm zOp26^9Y`%%(3`lz%vhhb?%#Xc*je+oCdQHf&7!P?s@QbSV@+)*A^Dq_;wL=J?7P$y zJPOrJtR!-1QAx*Hb^DI&TG7|FW(7A5oKdu5L#%Jv$f0~`o{$1&c}^$LyiBO3T@3>M z8c7Xwf&qX0$N0yEfg~VL<1n$4i>hV=Tvx1{^M=RnD>?P7j#N)cNz;!!v@f=x8xpax zHH$beaiC-5m9SYSORE+&WvkU!joopg8~jaXfY~TXdlG3s3IZ2wIF;!E_d~06WTY($ z6Y{CpFvQoU1#6)}E&HyPGZJIpc4FvQ*ShCbHC4qOlf%XE+BEwWFh7!F%a4mPGqs&Y5?^JwnYf4oO~dGGrmt&r^m%&8kDOj<#HM zJqnbubaFf$B_(5ByN1qKP!btg7W;+|)h7ca(`8GsLclh&H4jf)vZodPPeFos@*T&? zCq2wmQ?9L?wT?%j0IleGXvOuwKcJWKH&3F?3{c zvS9MbzWsF3Y%15!%~q;(&=!TgJ#DEa6^{bxtEg_#Lg-~wQMD*CE5n?trheQ2q8U?| z6^@7}yu>VB?l>}Z&60UtEpv8^!%#>Dy$?is;t3v+2|)Gql|w=}4Ea+MOgAgF^Grb) z(VI&AZ*>E%-M6p1F52FkfYuS744C29WC8Z*XLGTH1@z9XYAO~nHT2{4S&Z$$2-uJZY9vWa?q7kMKVwJG1FY5)=!`kbNQQOzjozXX%8o`r~a_VlU z(~wp3hN>ERy6$V(a?xd%H5}_{prxZ@s1_iptf!yd_H52C%l>nE*eDQPGXv~QnnW3n z(F*wMll-pHgk|uFIY9nDvu}|zXY-2S*f&*t(LZ+Acf^L?b=8-B7)VT6K3dh*GZGnT znzP`nk-zddz`!Q~v^nd7$8Mu$;4oP9C}g)e4cpAkn>JdgSh1xOGJx^S?KiW&QV3{S zKC>*gtE}i9&w0`F_6)IOJ5&f`y|C0FYqC_$S+r>0va4c`j6)`wa6tly@q# za(HSU*;izwr=u_OeVq3-+fD*rSq$^cnNM5N6DbEDnoUyobQMMNUBe@>Ldg2_p|eWZamKfPDkLrHa;?~vELt-!br@F3R^;1xa)H-;VC>0=nl05^wdce*IO?KG*sL@T z$9K=JD_)m6aKXB!V@IlDkwvM3=488IR~njKgV5KELb9C)gsfqm3-jeqBa`*L>Xt_{ zNni-{AI$=ikUM9;E*ctz#&0eIpKS$bc-mu+mGvxn?9f$T(sAI_Sjmb*D>f~O-S=m1 zX=pkLveLOe&|?+bdZFH!b)%yYu|_i4^e2GKU=V9khsJ?kF%#3C_(;>rKGpPCG3*$x z_|Omhn$NlKG&EvO?oJwxsp>g(brpO zRbMVoF*ee3&w}TToJd@>?xsTUS*!NLbW^q}Ix_(Z271N;dYdMBd24F+NlxYEW&^=E zf$Kv7w~hxSR0z)QYt;0Tvp(e=QFihUZC~ZbpBX@jL^`nAV z%chHp9)?4m_V%JshK_B!>8{5vdey_AZJIL^vTA!Y^R8wMG&Xds8B))z1~{v(p{u5) zHK{pz&Us2**PfB5!~UNh4xH#1C@2ytp^WX6P7=#_=11zT545CWV^^c4h!nD zoMk#N?&E_YxgbJ1;rzu0`T=38EBS$fma1!>vg=4>UC)67C6SVvqK^CK%*nvX(=e!& zE7#-{tESf_T2_?Ym|4v<4B6^XFNh~cGtNuM0Je1{0W|(NP&B;*(|ugS5D9x)O16E| zy5~LAn#k4X!x!0i8|f$-*!740m9O}{nSsm#;Wm$FzK_X!8EOVtD+;jsymxa)WXIa1ru^ z-vz(si?)K))YRzn(YQhgMlIj=zqRS%B%4k|Gu|;0g>lrJ9G2s!Q5Z<6T2{2<&=8we z9T^9H{|zkK5P4|mo-=r0KZxuLS{~VQi!2?S?hYu-R2-S$O;I+fP@iNYODY~ua+}zX zWd#(%PTVvra=C+N6o1s}A%;p0eTxy1{u(b$qYd^rmJgR@2FGPr=UFxxHy6T##d%`Es`n zm()B8?|c*vtq=;VY4qe3eIHEb4GUr&Lj`3uE0$)mk=e#|wwY+o8JjvDXd3B;iRMh< zblFf(Q^z?Kr}|E9x@!-`P=;qzmslET-{f1IrrSgcrV?0ViI=3_k*fP=ensr|jAF_p zZT_U$z@kx*C(G_a#uHA|)f_p}lIr?~lA;Z5dyaK2xuWQ{nx4LbnxcE^it4JylS;N| z(VPm}j)GT^9HVj zMIRscrXTSDiDXh(1{gk^E-_G$&dl*eGRAh_bm4T>B_oS| zN7b@zBjb>=zpCSX*;r`b4?UWsx-&D*AN2rHpdF$T}iLHAQW!=0bC+KUqzaR}lGjg_4>xsvg=kRQDM@e;G`@5=y}X70Xg(C$^l^ z^|k{SwY3Zk^<+yVic$qjMmlochGnn#D;VwXF)zVweKLPZPavBv^4_&(RbCi{K%JWYpR4b z2W1P+x#6}|ov<3d;Y8b5F*IUs=va3v$g56a--fcpP}`ABCH)D6kt#Z?qa)v^l}XrC zLhmtAS9D;YC^85oUXBK4IY7yxb&HnFD=2DvThUp+sqS4REvb^GgOHY%3|%vHCwRwL zUsEG67*>=Vhi=4lm?P^$E;>ulFH2k!xe*G?%==#OD=Ny~bwkHxkHzj|MN!GB9hvS~ zKVYkg492Yn1FN`ZK|#qSNto8kUX{>C;DUdM-}9E(-|)&hb-4~jT}98Sv7#kM4uean zgl(Do2BC0V(0A;n_mnJ)bX4?Jl${9#&4DAQItC&&6;)*WM(=qbcGkL9IH*w|H&mVK z+jd1=J9vRqY~H3*b@ku|vzk2BcdDUa)md{oiZ-;|o^a{12R{g&U|(HH*RfdJV@JN` zg0EZirY$`+ZF5Fppz4y>{m@ou2JhR^(l(TsH*f4XD0k+ux*$=tYDvpcfO0C<+?8zt z%U04CTyw*YR}_^Elx%8wPwI^GL8da5m4G8{JrxDxN&1rHaK(vC%XeVSQ%35_fdW#KYC3VM5soaIe!1qv&}IO2Gj*RsEAAWHGIqhO z-~mQbHEkc-4ZdPJ2bf`I1s#L1F>lA-45v5^U=Ra+1y#*3CUzp#({EWEAmQ>G? zZb<054t?N7Pg%9*`G5=D^(WqN6k4jP!leo`)8Kqi-81Td}BS zpsS_n)QN`EU=p!N*}ffXO3rHN2i*QptgfNsuIDZ31=Oo#Ehu{C3t47Szl_w~Q&$M{ zLDLj)>IFtBN)E!ZmZqVM#M#$#>W*b=R@B8B8t!V8Nmz+hN(%EO|9& z-9(|AnlTA;3_jyaUNCemXd5>qYW718mW`h7T5;8DTE630&sjB#_Jhh{c2O7A4a~dd z$PtRjxYf(LhN`~kixNNZZ#|fpz>l32%D-$W+z#Qti(-jvF>%eJwnkv9=aFa>(z>g9 zx{^Q!?S%Cx6=NNz8csDrXE1AQ7WF-L#d-4z>Q-$9188~}T0OVC?xMXw8(RqCQM0pm zv(&3>7A_961-Xb#_DVziELzkOI~$V6L7=h>bXBx8Je2bxt71LvN%Zee6bR}zbUe`T zll4h`?|i^B+m5>GWi`u&?%FeSPT$BJs?Nza3S0^LAtjlpjfv)YWW$`X zRU1BVYNVtP^0FmOL)ZO7_Z<6G`~LgC?(PQzNOJpW2goH?)X0*jRLPRWwsy#3hm*co z99k#;RLk${2c6neXU(e_iVQRzIdB*>H-rGQC9>(9kwa^a!X1mf8L;?A8lLrbsC?H% z4nBfY#^K8Dq+sY7eMN72+hZrjMve?^niFXo z>Jc!8q9t>VgM>yoK*Ni63|)}=J=@k@SDfilq9l#jpUe8c{PvXP}(BYicg zj%>+YM$D>M6S?nDchaW%sBq*Ie$Il=sTJEscAdH{Hs>`1AF2dZzch@4Eh&4~2M(O~ zriYVomug6DT2L|w$GoPjY$=SnW`|m~Vr0&{22PZ{Ld!~JP5+K=ud_~3N6=wKjD+UhL_4UF8eb#QtgxJ~! zrv36vlrq!Y%T-E?LDF_>qDVZeTM~W3@n>Ia-%}Pe_4GyNT(IcCV^yopnO9XZ5V>i` zo^A-)97%3>5vtd;$P^&Y!xS5X{tb0y9Y$NSy zTaf7-WOB;q6y4U8FMOEZmIbj)qj*lm*rB8UUwQY{E$MaM2mV(%ot!!+bV4Qw<{(m( zOv#qVlI68*kG;nJ0`pDgGtA9gdDhI>3M0$%Xh|X^N)!l!$Ux`ZeR8av=VI@-s!oFe zBpN~1dlq8%IbBuz*?T|XAENF3n6>ygDro$Fhq1f4>rC`MPOC_HPZ)SFNV#HPUd_Bc zRd=PFkXBIAl;|8V)Uv5(PFY?~!|V2)5cI|$$S7E`qGRAd%AWsXNzWa(MZpYe6Cxe`Y%!P=;7Djt(lE;*^{wnq_VygyPG zziZu4$ChI%F~>M!+JTh1w|vJ5w=Bx4MoRh_d8^T7JBU=wnpaWLv286L&WGP@&Vss{ ztiHCoo~)cy#M}j1b!!6F5x!cn!x?g+y@+e>kG8S{7}Ym6Nxl=emv9VNB$)(guPV=9G$z|DvxQ#Wa80dj=Lf?Vh5BI)-*^ zYHP&n{HG}%KXw94{6aQ?GiIYzY%7*;<0pun1o797l8Qg~S`;ZSXsO$`Y&xP^Q_`lC zO*^HgZqKF-2l~F_uC9`d6AD%%Ej*wJYxZp_$!ObG zjq||6Jb^iR4+J~Ama3L)G*)ffb49^H{Ie$!_5&l;OngPnlA(ryo@g z#vgf*zxblMT%^L^x2x&s%idDJ!O(wCkp|*gIXcByS!Y1|FHxRo8dIj{TUbjv=w*PrV;oUhu$w z({t^G@UbN(>M~2?=vaf5oZzyL;ZX|@B zNGOkSLx}*zaoI4dpvbZu7NEp3bFllxTQK-`h||)ik6y+ zgV-!S;gm%=Ef2h_YeB`lX(@}I(Q=?_LCyn9+U_b!Tks=^!*b7<>^d&x#)*2joT`|Wy)3W3u4esTWaPU zaV>sF=)UI^6k-q*O=&4wv!kY9-a{oTb``9vIbuf3miK(!`x-J*iVAX(2-zC%^wE(# z`igv=A*M`wGy=N?P}sJ471Q?P$F0Y z1N+{y7lqn$YI5ey$jYj#+cdBsE$67WG%UF2racMwFqvllbo6t|P|G7*@+z`e7Q|u) zR{c=k+q$D`Yx4dN0NM$baAxx7j!waW-uMvejej-ibB)i6th^~17D`ygFI*GL_IcLQYpZ9_lDI2bO*DafIupAm^ z(}EXp*8Oh?4ZV`nT; z-_1wA&skFfE2rT^gf$n;nO8HAbIw_JqUT0iPu)hG9yoNc#lI)7HyiZE%GTokpFFgO z@@Dj+Us!+Q133H>Q~GkIM?l&)DfC|X}fa3|H znXG|=h7AqJ?U_-~a9>r!Ww)iwYD@XLO#}PZ;~wgcrtopm9)HzYD4Mga9rKq&1)-~D zPe$6JT1*`lkb=*!`bwi%}s+;zrG9A5Y36iu6R!|o{bk`Z%O#%161$Qv>154G5RJ$+|cM6XH2|IxHo-w{6x-gYTFcqOzzon+)=NN`g8$UnpQHUqGF&Z zFQY7P%`GkGopNAB&zhT3&g(j^=%G?95=9>EScoAw6FjEb6Q>)?xMr&Myn{iq6Se)swbi zSKp$y-BYluf|8D$r?kA~tfknGN%s7Vr&L_Gi9~5V9R5Y$^sn4>Q!7qHmIO6ZrsWMy z8+#~)bU84;Iwsl8zia?RgSqh)F^GS}yDI*jWx*<vo#~qc9Q-Fb{eN6)eQ>M*D zvPIrd-il3S7tPqQWX7vj^-*%kQTNXbEg0|Pf@ zw7eHdc}d?g6Q{ESdXJs&zw8Mxc?Kj`K+98J^2opQe`xBbV|!7|b~8 z?=@t!?D|`6JF)2PkCs2J9zLBhJ=-O+qPpadQ&sb-vdpv z9kI0y4f6`>ZrgOsX+?cA@w?M%o^nCMYJ_ryzC=f`kZi@CUnY)m`uc(S9$Q%pGIk_} z4vE9TxNqOrmeJL;qoVAnn%z;yGxY6)h1^*$s8|+6bJx^kJ9%MXQ#ztXPa3#eHpcSJdq2NIMe6c>{ByABSz^wWZ8>N=|*0|Cc;(#)jMR{S4wf zqpGYQ+g5prQi&)yTYs#b|EmQ+oUVXv=NKT(lU+M9DBI=vp+? z9hj9e6u-I~6;9iG5RFN@hfwBFr(MY+*D%%*0+~dvyCv zdZh=6_*^ukPWbj2)6Q9vvt$uhye;pZ2O5H=Y0_{Gf3>w^%j>|FfZl!Dx4r2NoOIDc zx0S3~(6DO9K-Yoba58URb~KF2$D(hbAuX>VW!gzQI+44$pVcqsq6ZE9I7Tr#JpGl5ttao;|bL9_hJg z(H-Xv%tpG`(3B(U)@`fmnsr9sO|9s)Gn9&n;f#uhamtWWcGB_KlxEz$3&J)@R*;f6 zW7#n)%DNh^yXLOEb8$Mi>4JGxO+7_f-NzO`F?UZ%oA=L^{U=*4I^!?hQ!-`KfitG% zWvpxI>B*b7B&VY(kCeo$hMbgY^h*wQkin6W8#NveGZH^odSRxUVw;Lbxn&@iOsR*l^WpmmISf10Wx7;>-wTlQ!*w3krgS zTwcSjt}pAEj=<7enlhGT-EhTL#4G3RS@eRUo3SewGlyig`yIGcTj+ku}@Wj(enSULhu#2lmZH_0vEl8~4^jm7a^a|CHZ$-XFOo?TChf zt|?V(3I=*MtZGI~;k+Z!bzu;7OS@72E|5$cs><31QA%&IbG{5sw+HP5QNyZI1CA2h5%i1%H zO_OP-Wo_t?|xPyvM>63+zwT~jqDuN?s;gVEui zi^`-qCExbze&`4CzG>axYU!C#*KowX9BRrjqd96>Nl#61Z_CDw6v%n~I4Rw?5IMqu z4wiMtLz(!h&dRtl65$GckEV?5L?>{({7Ex7nWX$mSHO7r`|<7zW1g&OJ)e{F=P~0x z@Rnzs^_+Ut7w*eMW?#6GbEAUgkr~U8jd;qsX-DO3=qj4Bp{gryPF~%rTFmOxYO22B zy(pzLt!iC1zOsrV(rOA$o0joN-lC(9n>VoIrZxL&Bb$k&6PS&7fr6rH{7{3wQBg%t zY1CjEi&EwlRQ$T%_7i`p;gX|X)6kVyj3zN@=gml~$;nu-tP)vGWog6MYaHsR30h%U zSqHkxf(F1jr}SOX5KMA%o^vl=0NuzcPU~qY#j`n)01vM=FC$SRpX{6bl9xa-r4D_y zz|J3PdCRnK>${;VhoLK0osNn;9Zl`H=((6K22+HLrUO|8n^xsasX1awVrSW~;UH2z zj%nG7Biyv2IcX;}t!YRr*tKkES6|kgd2L=V-M`u8s*n%yWVrkB^SIMfm~xX@<2RGNo(7aleOhtyUr_&0ckPHn*xPme5 zBs=Qp2le8Np{!{I`wEUK*(9d5c{v3+v%c#)Ui1H{TJdEy-&0eObJXoPZRkcNl_?b^ zb4s$hx`GX4UV`6CN$KcC6O63Bp`xy1&f{8?)ga>;2X4fr@5LYpU4*)o7qW+*RX%96{TCc@3HyKPM^a+`X_T1b;EokV#k zFHz*m3m)7hl~~}O5h8A3NUroaaXXIq@NKao=M@d0SQAO|) z94bge?p~_t80vq3LS>-2irlv zLI8{^fw2@*M?QX#EfxR558RhiQn2T`uejvAyAltaWJH=lOHJ35yp9Jtrpzd72(nQH z(}waEV^uq)V8*mFz9Mf!NliyXkb>IQl9D&)xD$>$rRa{^c5K^G)reigo<#JqZ>;e# zNhhtwlrm#VNl!Lv6AU$Fl~A0x{ZIRs&iQjc)Hcv}&u(-yt=Y8WtY_^zFwj&t9hLus z%uGvg7Rknd3?#jxT)gs13US|_^*pY7D8WEoknv_jNKSs`6*P1hoo}hg@g96|HGicO z;ITYl5Sc{b!`#73wq;_@`w=}#*@yv{ z^{fY8aKy`+-WF60+G?_j8ZypXv}_s&ZrCwpLruwXbM|aTepA@>L6JKN<;gIpyKX2j zq~|QlVBXO)mB{_$1xpURp%xS9lILCZ=+M&l<7Zlsp8&{)Y^AU7ry53llxH}Kv9^MO zzJi(``z`af1yJ}SH+{h+@47KUyr$xjH!xH%Ev@UG17#%@dDDspiZ*2}Sdvm#aMZNE zb6(QYmbYVH!@iDb=k>fGt6|eE8}?;9?`+(`0~L#w-LtAXqN(+M%JCmY*CDk%P<6yp zj!2m{w5k`&(D^v9rx7a37yu#}Gp!g~AUkfx0wp9~JvVLZ+qPuNmO00r(zf8V zzW1dg&?IBgF;98qp;fE4RAZMdrK4`wfucm<Ug{pMyv$`166PP zlK0gVQtP+LSX;l9f?#psB2>rE6B#wyFc?eI9Q(kTzve zUsKb9>t3;`Cg}MU1qZS{O{I4Y!hQsPCc?6P9qm}@_l=oAV-(;d+%>479q2>`V%tF4qP(1QzH8d6eh^)b zbDp*6NA5>d|3FF3h9mN(?AV*Adx8vPm_`;9WJlzj#4b1Bp3)LY=qX>fWXF$GBSG0|2G~04zgEL_t)bbQa!g=VvYdubc!%-2FgT@cHRQ%w9)c&!)G0 z*>!vIW4`Ad-*V9nZ;TGAbR2mMt$9;bR@#hZIcc-*>DiZ&v#V>~fr4qXI&w}}weNvz zR`q<|dSvnBWR)CIkK*gWD88#df{g^&b7lm)NS1$6=yfbWnNu|Hgfr&txoO&>8F{~@ zeFa<`%hK=Sfj|fl5?q1@3GNPyy9NlZ3oPzI0!gsIq5%Q~w=9wXixUFD-Q9w_I|TMk z&OPUTcE0z!@4kWBF1o9#`#;^w%vASutySPHULPrxcl%8SWhgo^O=Va7 z^cHuvE5-#Qs7QE!a%aa*^? z(Z(D6ge-}^ zGw4TzVl;@(fVgsD(q*nvOY@t6bFY!#GwuQvp~3^Ki98FzM2g9BVa=ylZ0;r|@_L#U zm$5NJmt)LNuoIdKVCE(F-Ef*VbIPcFtw=_HC@1~WO~3KBL`_KvfY~CX(s#Jr28r-q z5A%%0YfrpCjC!r$JL+z79AH2yW>7Qd+I@fF#AJ20de5MSokX^Pg0J**N!~#Sv=YYb zV`r?aXrRuSSxUCqZB(%VGZwQI`;u>~)M*6lUUV!pSiffM{nSgKn2jr9@QTLVjZlJO z;5FsJH6QD_*rCQ`6pQMtVZo;fH?@g0Cx;zHq3!ha?DW(oeW+62=9>{E6Dc`Gf)?c> z5^$|BVW1^w0Mp0LMN51m?YPWG=INFA8iW3PcIxohIAv_~b?#8D)6~dLAy`ubU+yW$}#}#0(HbUhm>jyxdk*ZmY%9ZZFV8e7q)}O zY%nB-x6!O6wVLJ-u~L6v;58w%n50`{-5RQjRsQ%u9U(__aT*V~U;Q%X<85Xgo$W*p zq-D8k6XUu4Rb0TJP(j&Bb~Y?D6qa6gu_xzH|?!E+Jv-Xu?v(CbuKo%Lk1hEZo~NF?7*^-3(`%3Heixw9@9 zh6t7KVmvJM+f>|?o9=Krk($sx7|b%yd@~by*+6q_61l8xAR|%DVQZ>t&{ATp9a6tp zxsC^|br{6%<=(F&BGxgg#(N|hnVT6LMf{{MWjHC}J*qzB>ax%i2(2D&w-CxtcS>*T zuip+0dV=9`&E1r@cEBq);yJH*C$VsoX$6W>3kIdle5lAHB-q6uUpPYu0M4GO^})V| zVp{fGi<#=|MxqQ&(zC@d!$|)8Pi~!1@AQeUJFH59b`z0&qZ!<5CD4m`y(;ECT_~x0 z(xXx^;{ymDyU_wA*S<}EiXJzS_YCK9qJZw6d|_)vqKL^+NV;P>HizBJX&I5y1iQ}! zn(qeRo+9Z~^-g$t6#<%ahxK3=$xJkpil!zb=IbK;A)S%2=yp>^#@E0@LJ9o9fG>&| zi7|Ldw9}zh5Z3$M)DIa{1PYH{%+yp=>%+vVKgY#ozxQDJ=I)24>1ko^=UF5BeW6%A z7egc6g^I#H#ZG=mR}zome(}fQuUook1_#fIeUy3;UjV<+i_!5Ki=PFJ6`luzwx$c% zd@M12snr`PW%8-#bJX)k5mhfkoXOhq*bA9Ui+AwEHXf~>&Uv>#K2B0?_(D^>-b~P` zGe113uX#%Ippu(=oq~(Cbj8fVpW+dr*31kXF5DC65F61MBsZY%-#x^-K*s0W+q6|J zfU)-j){2*98oP%qVLCYp5@Hn#A;1spIEWzDL5;;7$S8dgEa2(ipVWVu)}S|zfghW^ zOCr3+;_kLN715f|*i>dLFlNk+D5P>larbgrFhFCU6xHzPgXv1G1$CB@?{5k2=Y@nG zbU|JXBhKO;TjXE~3MnX>5rHveWQc+Nl1f_Lp@0rjzC-XR{%m_U5VT`nrfNf()Uwr=H7THLG5mh)f?*Q3$WKzpWM|0RF1ZF^L; z4Z=JPU72BOA%}GI7^k3*b;s9kJQY4DWHZnHwsY;+)Q3?F{<$uAvx|k zg>FQq*+PX0Z-u%%uCwhb{Dna5d&}9VMCTczc()W5S*GaUOhcunx_I&ZGW0uVBIiqYH<*yUI^6?lL;lnL9TpOMBX7EE=ziC% z`wWA&jf!ITcCoqXXhC&j6d1!O)ek4cN438x7y&i*E-?^T3uie|a(mF*lE*M(C#I{q zSL9pkU?gwcQbB!HACl@&wv&>eTd@|lZy2waz`Y|Gz^lq8YylZ_!D$dD+9<$&TS?h) zX33@{*MnF*ElK)*-1OF8{}_7FNGSB(I3oG#XYL*nKNHuxU)+90A-h#0? z*KzXm5`#Ey1|BV5Dy6il5_(OV-i|iTDEHQ<)d-KL%bavvd2E;UUzB~v@jaKll&&fa zg6xpxYsjt}WGi~}pwXSIlKIG?7u6Hx>Q(@J$(Q|T8fO%MudoNi>(#;*Gth21Sx5;m;ZD+wZljLjQ}apSL5kKup$z{L%>^yZ$yx&6h^R~A>bhVAWK@o z<7^rCD>Xi{y80*J>C87(>e%qtpMG^Gfkogt?cM$4*T>oVqr*%c!uNZbrcfku4s_`| zpI3V^nmhK~l|TVAH2}{UyeV%m{7UTxuK$#SouLcAe|l^Tv6e_|Y@XpW`go*3#i*R3 zymIss-!QPfXeD1kpK!1)ac3g?v(G6LUrDb7o+N%?_YrGa&tVV(mToKcV9qFU zh`@#1c8d(Xe!e}Jc_NxXrgq6xfZ!X~Nss6ibDrPdWL9S>l2wqCTtDYUtPwA>I<*Ig zMp@gKn8;0lkqHd=xBA89(dpW5b31q9NrBzV7ZTU|NEfE&!B>QX^UYQ}TdL_G%AJBf zc#78WS*oe~!YkBdMy7o8ZeY7|*S-z5I!n_|I9~+YDfaz(xK`w_2?jipkf5pnCM`>7 zJLf)|D)-2JbM^uTWsw1kc(K77s0_jfnWvLSXyKT86qOd6+4_5|zBCR7QYPJrJ5H~% zY&uU0&hkp@`RY&fbuACX!UZKZgytpkQoc{KmZ#vLh{p zEuYn*iY6j8k(G*!g8DFErnpZSqGqftCr*`y!GKFw_Wbp;UZv2P>Jq=svT9xYdCrZu zM3KT?cyytc@5|~-ZS6Gs$UD>)IC30W*7yqM)9r9xRaNCEy!<}Y{#Yp$=3^&g zWTM#~IlVdZWa>l=@-&sd@6;&NMx}durW$TPfgw6FK32XHcS83e9+B{1F7m}|1Z4wv zoCJwkD%kpFpNx6u1$U`MhsJ1=h|^RA+I(<9RN{Om$HI|C-tv$Tk-^aIls|{8nSv2h zb=GKHM@HqUcYtE2DG+^yZ0;!YRvzNb%NYNCz;Y$i^z-crI;z>}+n%Ok+AkzQCUPbQ zQtj?a>wVL4d>;K#w!el<&}E%`CiEM#i_Kb7E7G4T6#yI6^ln1rQnWdt*kSfrI;!$+ zXRz4^>8`S)Cg?g`Uu_0;5{-ly*P!E<+2fR5spVF~iVc{0xM!sX`iLU)b^;#1Pgw!XhyPJB0gX)e>39Oft1G`-xBuon+HDjaUX4$3b%?+V$O0MzLMPp!VUdM*DY$01*V{c>Kp&Kd~>Pa|QwPr8+ zTy-%qK`-6aaHfnwnG8O`hyE@DTzN#YSPA9n(Z*cYB4Krw&kRv?nXY9XV151bcDjPR zdoLnR*JkXp-|+NR6YI{wZQQ36S&2R0SN8lKjl|A(oud*G4H7rznK7aF$ds&};@}9M zuhMO>7n=QSjuDIMj~-&0J1YR@74TR{q27JM)Z}0BF2-^R722D`4QH-}wKVlPFTL}^ zDQ^nU()2u4m1oQC)t`rO5>|jm3#yngk|~CbMUp70atbYnHAw?>XQ_IMyWwD>j`A;l zAyceM(e@XL@0Q+zDQLKjj@NPJHh-`fZF64}+)IMl^(10^-)L|%IqR&J`_M|-`Kzu5 zeXV`q9w>?8?oEu}P0%VRoLXr_e-InyuL#SG{ZNzm=^QLpbDHPq*ZIDFpKNp1d;I%K8fSc>#_kt|BA*1SMWDIb|t?(J>=jrI%cV#mQcuWc%^mjJ>!^M<~!&nR6X0tg$ zOsBc+mSWc=k1T458K$L7Mm6+}g`|6N2&%;(FD05VwdMDE@C*Ut_y&sj%&%&WK+P8I9nK0MDQ)#IxI& ze&?=2Jv8X-M-bq>BA+a#+^oDTMv`VMGvAIxx3}($WN4%Te8BUjqLG%D8C~Gw3)@#( zBl|8B>A&WpyeMQY9Km?aPN$gL%IRH3bPYQ>CC#tPls&pSa1^G)ua%?S;>^d+_rSJ! zC2bdMd$mC;lh(hcsO2((B(HJTjJ-zSScJgCJXvi8?BwcVF!Qty>Z#NFw?yMeq^gzHJ!!O!g+3-I_&^~qvZ6A*M z5l)tNo)~nnbNMRBkhhC!rv0pUKyB?jr7M|h{|}wEWbFcGdV`ci_|VBB$ey^`1)utDmft~+|QoM=I+<^A28WY62?%&B<6jP%2tjea}7{;C%suLtaRKfCjS)agMF zvQY?qHfZ!_z@%uTtv+ow-*z*721-;_XP*re!xhQxrp`5pnQmX1j#t5-9Q4T6(9zs` zV`#^?P)B(~up-}{sPp2h2OGNh-Uang6lC~M!qs+$ZGM!VE?$oov+dn37Y;6c?Gs-Uj?y?Es-7SBQ0Z zis1h2=X-niLgT@sAq?j$lag9Qd31-olpD!XoRxWN$g?ClbT2$Bm7STIf<1YYh}!(J z&WOwmm2)IITC*U53VHFql?8+9S5JlMnpM_;x-BewLS(rr#^CnM$V7Oj-#9#nfpwsF zI$~iuf>A0~1ftx2*4vpTp&;R{%k~lZmG&W;Pu7~GNVPX6SIQ5?*!NjcX0FLx#b(T< zB~QNqo}i(Dj{>%anmL?_f}lLhSpiKn>iP|KZ#w$CjoRn+n<5Hk7C9&u_)+rd8VeDx)w)OxeY4|8 z@*`&OeLvvSGU?ws88E&fwv!Gvh*)(XL=R>pFUnTMB5K}G3@NB!SbPu9Oz=dm?g#zo zMZQHf`=RM5NC2AF1bM7<&LHend()j?nRL<_OTEwCBjurjw=+Cg=DyHj6IlvL7o)Uf z_(bDJ_}HF?{fOZKdr@^f`2NTPM3A2FrM7f!Ap!WwHKt#xJ$#11l{37y1rce$!s6ST zam1Hdljqc#K`8=P$~aEf4ke4*{vbI-lz-f|_SH(xxV^^MZDjG)8d}tM*;Crk=7fe@ z2^fgP=utlX2tfqX;MAqd&)Q@w-nkKix4@KJ!)l_ZE=u0VxQg}A4D0tCf@S$+z_t{Z zbCWUmpI10yX;p-#lDR!DQJ5Z$Qz{(!oJozD>zI`-j#9S^7FZ3A*Ln-xu(F8v8SxG< z>7NB+0u(#dZWS0g)j|dxLv}HgVfLNz_C6{t<${ttUA>dnQ*WAIMqH8KHgd*x?gy$a zIxJM?Q}f-ca19woY!w(kc{zdr7NtsFsYMIlfz?@k+o6;5zD<58@1Pl zk5619HQxFox_DE5lbfWT6?ICzc&jdccJl(&>{njvVuh=}NO;}dQm|vsP$+pIML%G~U zwIl;m0ZVkecG+lvchLv_|$iGi#NcewHZ!b8PEw#_2492y|S;=(z6 zlu2==!iMauK}s}%6xv0_r{vC~Hx5_c)8sq!HYMid4#P^JKv3@_wC8mt=1fVimYSVv zH>#6ZDq(f2DtUT^4BNK`4Ea-OtUdDWB|^si!)6PV&sU}wPb2eJg|FZBrtKzuqD{j{Y=nyKsUy5 z<~>n+EXCv}p1r1$`fTNAYIWq~=H|orXyW1p)q_lrK)E@biobqza$+AUs4QS=_HJv+ z;?!6)0aM7H^8J-2iIGLuhk3ZWb!!Fi5XgHDpP4PYbdo*`=@^c}Ec$$N5x^jx+CfI7d(yX!Cf!m^#)k{9rWqz3mCZ+a#1B#_ zExGrW)~EyGku+#OH7xB2*(EYsV_u=nCmlCSE@lKg(fHn9XTT z43EXT5BLf|qcKINH7_s3a_xhuXM zrB}iXco|qp`m6I*6}NiY{Ag`o&aE*?KmClM74zY>kb!&Cc9T&EjhyQ#Rb+*sR?;^% z>mL2m+2j|Jp&Lcu8p#D$Q}@MBK6lpihTsG$xzFlPK^ajBV^|r@l>WO&`h}*};py1; zXoVE?tI2301Wf^%%^ix>9i9HSpT!&vOYA#-L=p@!p2Z6uZ9*FqJhlVrmBM6RP@l~V zC@CxExxC7H>ldyg>3w-lTjA=@fUAou*HJj6FKi|LjijGtcv5xuHw#74-BiCgq@_hDfRh|Qt|n4t!j?LeL2>r(hE!bYACethPEkJ0Kg zGv#8Wyu6Z@7v|fp>Gq^iwdp7LOZ}J6G+!X2m4r3O7uj%>CMB`S0 z{qFSIa!M7jjw5uZAV+F7odpA|eFO%c>h;E^Au)4&+Jr)#A@L%20{HK4MCja$1Xc3Z zX7@>ax({xeYWP0nm-r5|1UXMig88ZTf>j^xo?)I3)#REhYilbT>+<}N2@N}Wjm$za6APOQ#~SPhnpRZ^-y_ z6^%G;ic|P=bF#9y$p!)svH9bOr)!BubNgt9#zqLsBwOJb$+s|sfDW;kmgj;ZzHV-> z9rMd>k}i?;rd06vr4;0@p%pbEms`_0aZ!|DdD4~>B>gZ-I*U44EbsN_%fYv%v6N>$ z*Kxl-&_j#@H=(wTo4%%q?NltfH<#w*p+9%qL=^>Hd!yU8AxE7JIaciB6Sih!vn(qv?~=~ zo@<_}bTI2)d|OFPB_8x0V9_pbo#HXzDDW7!$P7NU+fVZN*@^bCDZ{lvc<#n}G{m$s zUfU@ue<~kiG%D5hWpxCklhU=%dQg})-=4;Dcw-I$FSK6RaJ(8;IA+^sfpW2B8PF`^_cqGrXtc6c|+l^##A;FAu#7UdYZA z*%wpEIs9>l1OhvD69*$N5uOblIF=D;$ITn;EPlffAsKdEV~hrPMTT3SQ7Sy7eN1eJ z;AZmU>o8amb!Oi&uymz)le9*Rh#bDu_9fqf@>5oHB_T%q5siSz^%odg%{Pl~>_SR! zHN(-S0CK9WXSF4c>N6}gP(>gL$l#Zp&rmy>osgumG*n@(9RpSMk0UNRqp*{GaJW4Q z$!OI<_N<8u5I3dRX?8?ITYoaywI?;>{la8CpUce6(QS0gBH9~u`wgbSLLXEW4Fuu! z3*7Jw84B?ZmXRqM=&#A8FR)a+nwPHQXm|{rx^pA3ULA`1z?S9?@ay`=Dv;WugT|bU z(8MpoTV;!1okc3*uaoA#W;+icLJLcam0osmbIJCu1FrA(i`y=|wAAuCF^>_Rh4Osj z&X)TH#-mikK}0u5qAjHVV^p({!sIOH&~7C4tsx=$ijlKaouvYCqzQ}6M}#bY?U;){>65l*51bXj4aA&+gV zrZQEBiB$+)&&Tr+28rVUeJDg0$Dl)Uy7$4$5AIpd!{WVni;5xOtI4>{S&1Bw*;{G~ zGEQ25N;LDQxQrjd6GZ%uaZ^tF$zVf`ij{@dEd)V7VFlI73uj%vi~NUAv;uoIN0TT# zdy=#RE$lWM_4)Fxc4yCSY`#I&l}%f%p(1kO(hx9HK=+Nwkp_EC3}MM}CCo>+J*4_1 zgYU4~D9$^5GmwF0N1_bW#Ynw07;#H5clzcg$o~PZoCtHvoOcdY;Z)OSKZ(Z?qaATRX6@F!=?2hFRu|^Gwl9 zdr+Rl*m2lKd9hiAJSTPzMHK7~*zuW)L>77jH`ELkQNi=`qPw|lh6Ugw&T@X9-o_m% zU$PiI(^}xu7!$Bo?|5%BPPa!-40UZNFH!9^I1i~T^HtYtDJTh6wGM)+FA~`1Nc-BN zhbZ1!kj*9ph`*(6>%6d%$Nu@8=z?frO_ACecS+?ng{6j_p`2n*@S9D+3|M-8OVMa@ zs)B4Mv3zRyBjz++U$u(O9I_Eg`ZLZE0EzQ%mxMd*(o zi`pGA$e;O~3QtGivu7k$SVN!&GD5!WXyo=Y`?Kx~;KAAQd<-pDdYX?gAP&H{od>-IyHys=tYB}3q*Cp@yL4rjH`Y>B4I#e2f+hN({k@`n9!l{ z{An@<>T#$wSMTJ>sIb;I(&mew|6%2kVrLn^Jy__6!ReY6^fuRdSxdpETdIU#er#Rs z^nL>E$&1O&LqR(?q;;Plq$9~M?_=UEt2|zbgOK$s`QuLsCqt<$#1>A&LnFZAvn+F& zLCIO=P^Y?5xb?&&@9n1@!`wUYv+823%vFX%17zEFO|J`wsd|B*G9I zPy^3VcxW|DOa%6EGKQ?p9P^UP4s@HdG0K6qvVU;fqu+A*aR^D)rj$io7$jBA@w}L* zDu@Zs>A~}W=BH0|zgjBG6TT3-KLfu^CuPuw3ObwhHz5MqFj_y4P9!HEcX{`1U#kkt zkBq>g7t5eG1&OPCe9^%tcf<6-31P?tKfe}%R~C5`s(T?lrgX=N33NePyFyn7G>Y9V z_p->g-x;uyJy<;*H+E}}@$Y}X;Hf%KBYbaTwa?xj+bpiSBmhI~Jth}D(RW~D@B%!_ z7PT?0D_*@N?ZAw~)19xQntJ@2j|B|x6mxo(Knn68CHFC16<&N+8!@c}ZQjGlK*EIX zu>GQy6ygK8$d~MukWki&P>!C>+9mdwNa3eh6xusv=VfV z84Ik%BUh93tnSyyjYg=Yzg*yPD2m8gLhoB8dL@2lKGb;@HPh$2Rr@P!ePCw4 z4p9+eTov)4r38ad25bG1sLm-d-%Yh6FgF_$X}NLRMebF_MmiPwgJ%z$N<&>)PDwlH zE%lvjZ?ifQ=khYcmF{w*hgA-(1pU3l#H~8192-*2it{ak%NCfTTd}$IE~IO)l~eDR z@$_Yx^#T@Mh4;MyR-sjRE1=N_m+Z54$xB|oP}(8#6X#))oOrHxd~Ka^O0s#CZ6765 ziP@GRrDjN{N7(&^o%}_@QDbnJ7eaU5TXFD4IMr)+dSYU12xbwhTBur=do}7vEhkeP z=+^Ozjs>lAu$KBTZ{fPR*-Vfm@bcJAM;7*OGbG30;GxoYih!;sCADzkGy&2BUsV}- znbx7kH<|;B!+N8hI^#3h)5sJ$QcOL?k*ke;xd{!dMVvz`uFOE1$lHbup& zdiq*>m$H&@fKL2aQ$ntHHa`S8`Ns znLl`c*@}|Nu&-DvJwrbxgKOc`Q`rF~6qOwuVCSBOs>)&oz>~Z)*$aM$jUi8N#drcK zo6OTfTF0h7;LC7c6~22?zqegJ@Zta^At+S z;9JV|Sh$NarXVeogxu_xe-8@hvk7sL!4xLZl*@xviz4}DpT$rZu&WnF0K0CqX0r#> z!M@|OrQ3=(9fv23=Wuz!8z7So! zai0dPwbu_pXc4{6$NRz~+;JFZAAQ8fLE%9@+XuGsj2-(}P6mK=E+&!M46gF_{~(nOs(y z(#P_x-!xAI(f#~9l>8Z!klK4_Z8w?fv}ae=nQ@24mp5-?b3+Oe5pVA8DI9jA?Frh8 zv&r*JDBr4}-`a*yTpL`{h>sPEsTksk2p2QF_Zt&PYhzOPx`{uae)q$6#W<*bw0W>g z>~hI;5B(9}mF;VHKKT)jY}ZExH$?pE)7{?Jq|>+ln4H1L!;D?4)>`I#rkHbdzCA9* z#=#y7Bw~Yy`~GFvsfr+D;cAY{n%%mfF!h6gPTPwsMDgpOSas)L<#?y^+>a~`J0()y zM;VER1`E28jv3f z5Fx<-mibL&C>VdFQ2%I=^V)Z3zIaEkM?JKF@b!{|HKpj$^XWVg8C1e3V=N7pF9y3PyihN zXghKW`4jX|NlsA?sOUEg-~%}ek^$Yr#KgkHxQB&>g^hg=2lo*k?*03?q=ZEHk0{Bg zsVK=PC}`+8m}s7|(NRz^3$Uf!G* zg@%fbhJk^O4wMD}?c?kB=Iy)C zu<(e;_=Lm{Ny#Z6Q*(0j@(T)!KEo?25mnVSwRQDBTHD$?I=i}iMu3^OiOH$ynWg2G z)wT7F&8_XD)*J3|4@!KUNUIwZDm8^(D|&%4BM^c&hA$o@58A^#S#e**gtTr(hC zG!&ro&hpsTw`<}B1d=$R4-78xH2g5~8zf|&moa_}e^?doS-^aDX3?KPc3FS0O) z)mVd7|FrR!Eg;R?(;WL$1j>nI{#OX)URS}-YwgV}OtWjvH|lv#iJ%_loYy#iQ9_lx zme>ER7-MR4CwGMP7t5riB)#{O7>cB8mh76^uBY=ds60V*lSdG5zoQ z2?@QT$f4>YK;1?cN<{s90@?2xtbHIh!qN~AcMWSdZF8uL zqcup7jpp|+;hs1XAVu&`DH&%+XE$vZb4zOw7k(P5B2Y;C&q7(Ci8>JIKbra9ZaCsp z_zeJIqJIj5flAeFY}~CqKwLtcDzK9uKr!(@ixr{fw$>`vPPQI)AZ|WR!3>E0S3uy= ze-+S&Sp6>N=j2IYs@w(2{{xS--VN84hr0D-?#ly}MYT;xKar}Gy zG~}n+fIP+D$jdlGUEHkQ-676SApR?B7kxmE>Tl%!3lLs@MF$jVK$7x*ll&7AAAdOJ z_3wK==D!hC(g4dVI(b;TS=yO9*;>mvyFtx8Ks?-n$(>6rfX?%ORp-z1%O%Lg#cW4> z3aCE&8&wTEXAftnwTBzT@{d{p*dFE{f8Zu0jwA!LX#Pg)9|P(4kkWwoSUZAvmL~fR z0a^0jvJgv4VM}KhUpI)Yod-z6)4~yANh9kFHHSD=$8i|}Vo(1Pv$A%#bc4A3QQse3 zY2gWR^k9cL(YR~LORLyQ5dqSFjGNy^q2^AWHs+Qdo^IA|fAqXcMr;ot@Zc|V!1n@Z o%x_gAGesGo1p9Z1r;~$|v$qq7Ylc?WAIJnLg4JZpq|HM94-mY@{r~^~ literal 0 HcmV?d00001 diff --git a/static/img/icon-512x512.png b/static/img/icon-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..1c85c2d7d755e6444ad04abaa0f8ff23540c0e81 GIT binary patch literal 144078 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 =lhNa8v4U*9%$S!z}_`cy0m1{ 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

      4*0gaG3#`IlPLz-MY>iBvF1$-Du>Bq@OO0IY&}E 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%0D~$2sa)>DCU({vWo6C$jwT`0e2e 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

      OWLcsUKmD^652$waY}rZyOR)Rj`ic#0DA8_L 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

      QEQwl(7XY!0s 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 z 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�bGM#}wZuNY+HwZ6v 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∾NMpx3dz{eUej)w8 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

      g|a>?wIHF|Ol( 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

      Vj@T3G7tVo)2+kvG~oS(|8BKcl}oNw?* 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 { + if (evt.key === "Enter") { + ws.send(evt.target.value); + evt.target.value = ""; + } +}); diff --git a/static/js/driver.js b/static/js/driver.js new file mode 100644 index 0000000..feec4e2 --- /dev/null +++ b/static/js/driver.js @@ -0,0 +1,14 @@ +import { driver } from "driver.js"; +import "driver.js/dist/driver.css"; + +const driverObj = driver({ + showProgress: true, + steps: [ + { element: '.page-header', popover: { title: 'Title', description: 'Description' } }, + { element: '.top-nav', popover: { title: 'Title', description: 'Description' } }, + { element: '.sidebar', popover: { title: 'Title', description: 'Description' } }, + { element: '.footer', popover: { title: 'Title', description: 'Description' } }, + ] +}); + +driverObj.drive(); diff --git a/static/js/mittens.js b/static/js/mittens.js new file mode 100644 index 0000000..074423f --- /dev/null +++ b/static/js/mittens.js @@ -0,0 +1,41 @@ +const b = (id) => ` +

      + `; +const s = (id) => ` +
      + 🧽 +
      + `; +const m = document.getElementById('interactive-menu'); +function balloons() { confetti(b) }; +function sponges() { confetti(s) }; + +function confetti(f) { + const vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0) + for (let i = 0; i < 3; i++) { + const id = `c-${String(Math.random()).slice(2, 9)}` + m.insertAdjacentHTML('beforeend', f(id)) + sink(id) + } + async function sink(id) { + const e = document.getElementById(id); + const startTop = getComputedStyle(e)?.top ?? '0px'; + let top = parseInt(startTop.slice(0, startTop.indexOf('p')), 10); + while (top < vh + 100) { + top = top + 2; + e.style.top = `${top}px`; + await new Promise(r => setTimeout(r, 16.67)); + } + e.remove(); + } +} diff --git a/static/js/register-sw.js b/static/js/register-sw.js new file mode 100644 index 0000000..d3d8662 --- /dev/null +++ b/static/js/register-sw.js @@ -0,0 +1,18 @@ +const registerServiceWorker = async () => { + if ("serviceWorker" in navigator) { + try { + const registration = await navigator.serviceWorker.register('/js/service-worker.js', {scope: "/"}); + if (registration.installing) { + console.log("Service worker installing"); + } else if (registration.waiting) { + console.log("Service worker installed"); + } else if (registration.active) { + console.log("Service worker active"); + } + } catch (error) { + console.error(`Registration failed with ${error}`); + } + } +}; + +registerServiceWorker(); diff --git a/static/js/service-worker.js b/static/js/service-worker.js new file mode 100644 index 0000000..8a0c7f9 --- /dev/null +++ b/static/js/service-worker.js @@ -0,0 +1,54 @@ +// This is the service worker with the combined offline experience (Offline page + Offline copy of pages) + +const CACHE = "pwabuilder-offline-page"; + +importScripts('https://storage.googleapis.com/workbox-cdn/releases/5.1.2/workbox-sw.js'); + +// TODO: replace the following with the correct offline fallback page i.e.: const offlineFallbackPage = "offline.html"; +const offlineFallbackPage = "offline.html"; + +self.addEventListener("message", (event) => { + if (event.data && event.data.type === "SKIP_WAITING") { + self.skipWaiting(); + } +}); + +self.addEventListener('install', async (event) => { + event.waitUntil( + caches.open(CACHE) + .then((cache) => cache.add(offlineFallbackPage)) + ); +}); + +if (workbox.navigationPreload.isSupported()) { + workbox.navigationPreload.enable(); +} + +workbox.routing.registerRoute( + new RegExp('/*'), + new workbox.strategies.StaleWhileRevalidate({ + cacheName: CACHE + }) +); + +self.addEventListener('fetch', (event) => { + if (event.request.mode === 'navigate') { + event.respondWith((async () => { + try { + const preloadResp = await event.preloadResponse; + + if (preloadResp) { + return preloadResp; + } + + const networkResp = await fetch(event.request); + return networkResp; + } catch (error) { + + const cache = await caches.open(CACHE); + const cachedResp = await cache.match(offlineFallbackPage); + return cachedResp; + } + })()); + } +}); diff --git a/static/js/site.js b/static/js/site.js new file mode 100644 index 0000000..edd23e0 --- /dev/null +++ b/static/js/site.js @@ -0,0 +1,54 @@ +function sort_table (){ + /* https://stackoverflow.com/questions/3160277/jquery-table-sort */ + const getCellValue = (tr, idx) => tr.children[idx].innerText || tr.children[idx].textContent; + + const comparer = (idx, asc) => (a, b) => ((v1, v2) => + v1 !== '' && v2 !== '' && !isNaN(v1) && !isNaN(v2) ? v1 - v2 : v1.toString().localeCompare(v2, undefined, {numeric:true}) + )(getCellValue(asc ? a : b, idx), getCellValue(asc ? b : a, idx)); + + // do the work... + window.addEventListener('load', function() { + document.querySelectorAll('th').forEach(th => th.addEventListener('click', (() => { + const table = th.closest('table'); + Array.from(table.querySelectorAll('tr:nth-child(n+2)')) + .sort(comparer(Array.from(th.parentNode.children).indexOf(th), this.asc = !this.asc)) + .forEach(tr => table.appendChild(tr) ); + }))); + }, false); +} + +function toggle_hidden(id) { + var x = document.getElementById(id); + if (x.className.indexOf("is-hidden") == -1) { + /* It is showing, hide it */ + x.className = x.className.replace("is-visible", "is-hidden"); + /* Special case for the sidebar */ + if (id == "sidebar") { + document.getElementById("main").style.marginLeft = "0px"; + } + } else { + /* It's hidden, show it */ + x.className = x.className.replace("is-hidden", "is-visible"); + if (id == "sidebar") { + document.getElementById("main").style.marginLeft = "200px"; + } + } +} + +/* https://github.com/jloh/bulma-prefers-dark/issues/22#issuecomment-663790065 */ +function toggle_darkness() { + let darkLink = document.getElementById('dark-theme'); + if(darkLink){ + darkLink.remove(); + }else{ + darkLink = document.createElement('link'); + darkLink.crossOrigin = "anonymous"; + darkLink.href = "https://cdnjs.cloudflare.com/ajax/libs/bulma-prefers-dark/0.1.0-beta.1/bulma-prefers-dark.min.css"; + darkLink.id = "dark-theme"; + darkLink.integrity = "sha512-8L9NjgWBr9opkijcN9ZZCzzl7T3hVqji0baeKdTvfq1VN119XV4RNCGGI6vAF8ygQkSK0Qew84toTqqpzmbxUw=="; + darkLink.referrerPolicy="no-referrer"; + darkLink.rel="stylesheet"; + + document.head.appendChild(darkLink); + } +} diff --git a/static/js/tinymce/icons/default/icons.min.js b/static/js/tinymce/icons/default/icons.min.js new file mode 100644 index 0000000..e3750c6 --- /dev/null +++ b/static/js/tinymce/icons/default/icons.min.js @@ -0,0 +1 @@ +tinymce.IconManager.add("default",{icons:{"accessibility-check":'',"accordion-toggle":'',accordion:'',"action-next":'',"action-prev":'',addtag:'',"ai-prompt":'',ai:'',"align-center":'',"align-justify":'',"align-left":'',"align-none":'',"align-right":'',"arrow-left":'',"arrow-right":'',bold:'',bookmark:'',"border-style":'',"border-width":'',brightness:'',browse:'',cancel:'',"cell-background-color":'',"cell-border-color":'',"change-case":'',"character-count":'',"checklist-rtl":'',checklist:'',checkmark:'',"chevron-down":'',"chevron-left":'',"chevron-right":'',"chevron-up":'',close:'',"code-sample":'',"color-levels":'',"color-picker":'',"color-swatch-remove-color":'',"color-swatch":'',"comment-add":'',comment:'',contrast:'',copy:'',crop:'',"cut-column":'',"cut-row":'',cut:'',"document-properties":'',drag:'',"duplicate-column":'',"duplicate-row":'',duplicate:'',"edit-block":'',"edit-image":'',"embed-page":'',embed:'',emoji:'',export:'',fill:'',"flip-horizontally":'',"flip-vertically":'',footnote:'',"format-painter":'',format:'',fullscreen:'',gallery:'',gamma:'',help:'',"highlight-bg-color":'',home:'',"horizontal-rule":'',"image-options":'',image:'',indent:'',info:'',"insert-character":'',"insert-time":'',invert:'',italic:'',language:'',"line-height":'',line:'',link:'',"list-bull-circle":'',"list-bull-default":'',"list-bull-square":'',"list-num-default-rtl":'',"list-num-default":'',"list-num-lower-alpha-rtl":'',"list-num-lower-alpha":'',"list-num-lower-greek-rtl":'',"list-num-lower-greek":'',"list-num-lower-roman-rtl":'',"list-num-lower-roman":'',"list-num-upper-alpha-rtl":'',"list-num-upper-alpha":'',"list-num-upper-roman-rtl":'',"list-num-upper-roman":'',lock:'',ltr:'',minus:'',"more-drawer":'',"new-document":'',"new-tab":'',"non-breaking":'',notice:'',"ordered-list-rtl":'',"ordered-list":'',orientation:'',outdent:'',"page-break":'',paragraph:'',"paste-column-after":'',"paste-column-before":'',"paste-row-after":'',"paste-row-before":'',"paste-text":'',paste:'',"permanent-pen":'',plus:'',preferences:'',preview:'',print:'',quote:'',redo:'',reload:'',"remove-formatting":'',remove:'',"resize-handle":'',resize:'',"restore-draft":'',"rotate-left":'',"rotate-right":'',rtl:'',save:'',search:'',"select-all":'',selected:'',send:'',settings:'',sharpen:'',sourcecode:'',"spell-check":'',"strike-through":'',subscript:'',superscript:'',"table-caption":'',"table-cell-classes":'',"table-cell-properties":'',"table-cell-select-all":'',"table-cell-select-inner":'',"table-classes":'',"table-delete-column":'',"table-delete-row":'',"table-delete-table":'',"table-insert-column-after":'',"table-insert-column-before":'',"table-insert-row-above":'',"table-insert-row-after":'',"table-left-header":'',"table-merge-cells":'',"table-row-numbering-rtl":'',"table-row-numbering":'',"table-row-properties":'',"table-split-cells":'',"table-top-header":'',table:'',"template-add":'',template:'',"temporary-placeholder":'',"text-color":'',"text-size-decrease":'',"text-size-increase":'',toc:'',translate:'',typography:'',underline:'',undo:'',unlink:'',unlock:'',"unordered-list":'',unselected:'',upload:'',user:'',"vertical-align":'',visualblocks:'',visualchars:'',warning:'',"zoom-in":'',"zoom-out":''}}); \ No newline at end of file diff --git a/static/js/tinymce/langs/README.md b/static/js/tinymce/langs/README.md new file mode 100644 index 0000000..cd93d8c --- /dev/null +++ b/static/js/tinymce/langs/README.md @@ -0,0 +1,3 @@ +This is where language files should be placed. + +Please DO NOT translate these directly, use this service instead: https://crowdin.com/project/tinymce diff --git a/static/js/tinymce/license.txt b/static/js/tinymce/license.txt new file mode 100644 index 0000000..3a49f66 --- /dev/null +++ b/static/js/tinymce/license.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Ephox Corporation DBA Tiny Technologies, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/static/js/tinymce/models/dom/model.min.js b/static/js/tinymce/models/dom/model.min.js new file mode 100644 index 0000000..a6b5053 --- /dev/null +++ b/static/js/tinymce/models/dom/model.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.7.2 (2023-10-25) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.ModelManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(o=n=e,(r=String).prototype.isPrototypeOf(o)||(null===(s=n.constructor)||void 0===s?void 0:s.name)===r.name)?"string":t;var o,n,r,s})(t)===e,o=e=>t=>typeof t===e,n=e=>t=>e===t,r=t("string"),s=t("object"),l=t("array"),a=n(null),c=o("boolean"),i=n(void 0),m=e=>!(e=>null==e)(e),d=o("function"),u=o("number"),f=()=>{},g=e=>()=>e,h=e=>e,p=(e,t)=>e===t;function w(e,...t){return(...o)=>{const n=t.concat(o);return e.apply(null,n)}}const b=e=>t=>!e(t),v=e=>e(),y=g(!1),x=g(!0);class C{constructor(e,t){this.tag=e,this.value=t}static some(e){return new C(!0,e)}static none(){return C.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?C.some(e(this.value)):C.none()}bind(e){return this.tag?e(this.value):C.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:C.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return m(e)?C.some(e):C.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}C.singletonNone=new C(!1);const S=Array.prototype.slice,T=Array.prototype.indexOf,R=Array.prototype.push,D=(e,t)=>{return o=e,n=t,T.call(o,n)>-1;var o,n},O=(e,t)=>{for(let o=0,n=e.length;o{const o=[];for(let n=0;n{const o=e.length,n=new Array(o);for(let r=0;r{for(let o=0,n=e.length;o{const o=[],n=[];for(let r=0,s=e.length;r{const o=[];for(let n=0,r=e.length;n(((e,t)=>{for(let o=e.length-1;o>=0;o--)t(e[o],o)})(e,((e,n)=>{o=t(o,e,n)})),o),A=(e,t,o)=>(N(e,((e,n)=>{o=t(o,e,n)})),o),L=(e,t)=>((e,t,o)=>{for(let n=0,r=e.length;n{for(let o=0,n=e.length;o{const t=[];for(let o=0,n=e.length;oM(E(e,t)),P=(e,t)=>{for(let o=0,n=e.length;o{const o={};for(let n=0,r=e.length;nt>=0&&tF(e,0),$=e=>F(e,e.length-1),V=(e,t)=>{for(let o=0;o{const o=q(e);for(let n=0,r=o.length;nY(e,((e,o)=>({k:o,v:t(e,o)}))),Y=(e,t)=>{const o={};return G(e,((e,n)=>{const r=t(e,n);o[r.k]=r.v})),o},J=(e,t)=>{const o=[];return G(e,((e,n)=>{o.push(t(e,n))})),o},Q=e=>J(e,h),X=(e,t)=>U.call(e,t),Z="undefined"!=typeof window?window:Function("return this;")(),ee=(e,t)=>((e,t)=>{let o=null!=t?t:Z;for(let t=0;t{const t=ee("ownerDocument.defaultView",e);return s(e)&&((e=>((e,t)=>{const o=((e,t)=>ee(e,t))(e,t);if(null==o)throw new Error(e+" not available on this browser");return o})("HTMLElement",e))(t).prototype.isPrototypeOf(e)||/^HTML\w*Element$/.test(te(e).constructor.name))},ne=e=>e.dom.nodeName.toLowerCase(),re=e=>e.dom.nodeType,se=e=>t=>re(t)===e,le=e=>8===re(e)||"#comment"===ne(e),ae=e=>ce(e)&&oe(e.dom),ce=se(1),ie=se(3),me=se(9),de=se(11),ue=e=>t=>ce(t)&&ne(t)===e,fe=(e,t,o)=>{if(!(r(o)||c(o)||u(o)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",o,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,o+"")},ge=(e,t,o)=>{fe(e.dom,t,o)},he=(e,t)=>{const o=e.dom;G(t,((e,t)=>{fe(o,t,e)}))},pe=(e,t)=>{const o=e.dom.getAttribute(t);return null===o?void 0:o},we=(e,t)=>C.from(pe(e,t)),be=(e,t)=>{e.dom.removeAttribute(t)},ve=e=>A(e.dom.attributes,((e,t)=>(e[t.name]=t.value,e)),{}),ye=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},xe={fromHtml:(e,t)=>{const o=(t||document).createElement("div");if(o.innerHTML=e,!o.hasChildNodes()||o.childNodes.length>1){const t="HTML does not have a single root node";throw console.error(t,e),new Error(t)}return ye(o.childNodes[0])},fromTag:(e,t)=>{const o=(t||document).createElement(e);return ye(o)},fromText:(e,t)=>{const o=(t||document).createTextNode(e);return ye(o)},fromDom:ye,fromPoint:(e,t,o)=>C.from(e.dom.elementFromPoint(t,o)).map(ye)},Ce=(e,t)=>{const o=e.dom;if(1!==o.nodeType)return!1;{const e=o;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}},Se=e=>1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType||0===e.childElementCount,Te=(e,t)=>{const o=void 0===t?document:t.dom;return Se(o)?C.none():C.from(o.querySelector(e)).map(xe.fromDom)},Re=(e,t)=>e.dom===t.dom,De=(e,t)=>{const o=e.dom,n=t.dom;return o!==n&&o.contains(n)},Oe=Ce,ke=e=>xe.fromDom(e.dom.ownerDocument),Ee=e=>me(e)?e:ke(e),Ne=e=>C.from(e.dom.parentNode).map(xe.fromDom),Be=e=>C.from(e.dom.parentElement).map(xe.fromDom),_e=(e,t)=>{const o=d(t)?t:y;let n=e.dom;const r=[];for(;null!==n.parentNode&&void 0!==n.parentNode;){const e=n.parentNode,t=xe.fromDom(e);if(r.push(t),!0===o(t))break;n=e}return r},ze=e=>C.from(e.dom.previousSibling).map(xe.fromDom),Ae=e=>C.from(e.dom.nextSibling).map(xe.fromDom),Le=e=>E(e.dom.childNodes,xe.fromDom),We=(e,t)=>{const o=e.dom.childNodes;return C.from(o[t]).map(xe.fromDom)},Me=(e,t)=>{Ne(e).each((o=>{o.dom.insertBefore(t.dom,e.dom)}))},je=(e,t)=>{Ae(e).fold((()=>{Ne(e).each((e=>{Ie(e,t)}))}),(e=>{Me(e,t)}))},Pe=(e,t)=>{const o=(e=>We(e,0))(e);o.fold((()=>{Ie(e,t)}),(o=>{e.dom.insertBefore(t.dom,o.dom)}))},Ie=(e,t)=>{e.dom.appendChild(t.dom)},Fe=(e,t)=>{Me(e,t),Ie(t,e)},He=(e,t)=>{N(t,((o,n)=>{const r=0===n?e:t[n-1];je(r,o)}))},$e=(e,t)=>{N(t,(t=>{Ie(e,t)}))},Ve=e=>{e.dom.textContent="",N(Le(e),(e=>{qe(e)}))},qe=e=>{const t=e.dom;null!==t.parentNode&&t.parentNode.removeChild(t)},Ue=e=>{const t=Le(e);t.length>0&&He(e,t),qe(e)},Ge=(e,t)=>xe.fromDom(e.dom.cloneNode(t)),Ke=e=>Ge(e,!1),Ye=e=>Ge(e,!0),Je=(e,t)=>{const o=xe.fromTag(t),n=ve(e);return he(o,n),o},Qe=["tfoot","thead","tbody","colgroup"],Xe=(e,t,o)=>({element:e,rowspan:t,colspan:o}),Ze=(e,t,o)=>({element:e,cells:t,section:o}),et=(e,t,o)=>({element:e,isNew:t,isLocked:o}),tt=(e,t,o,n)=>({element:e,cells:t,section:o,isNew:n}),ot=d(Element.prototype.attachShadow)&&d(Node.prototype.getRootNode),nt=g(ot),rt=ot?e=>xe.fromDom(e.dom.getRootNode()):Ee,st=e=>xe.fromDom(e.dom.host),lt=e=>{const t=ie(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;const o=t.ownerDocument;return(e=>{const t=rt(e);return de(o=t)&&m(o.dom.host)?C.some(t):C.none();var o})(xe.fromDom(t)).fold((()=>o.body.contains(t)),(n=lt,r=st,e=>n(r(e))));var n,r},at=e=>{const t=e.dom.body;if(null==t)throw new Error("Body is not available yet");return xe.fromDom(t)},ct=(e,t)=>{let o=[];return N(Le(e),(e=>{t(e)&&(o=o.concat([e])),o=o.concat(ct(e,t))})),o},it=(e,t,o)=>((e,o,n)=>_(_e(e,n),(e=>Ce(e,t))))(e,0,o),mt=(e,t)=>((e,o)=>_(Le(e),(e=>Ce(e,t))))(e),dt=(e,t)=>((e,t)=>{const o=void 0===t?document:t.dom;return Se(o)?[]:E(o.querySelectorAll(e),xe.fromDom)})(t,e);var ut=(e,t,o,n,r)=>e(o,n)?C.some(o):d(r)&&r(o)?C.none():t(o,n,r);const ft=(e,t,o)=>{let n=e.dom;const r=d(o)?o:y;for(;n.parentNode;){n=n.parentNode;const e=xe.fromDom(n);if(t(e))return C.some(e);if(r(e))break}return C.none()},gt=(e,t,o)=>ut(((e,t)=>t(e)),ft,e,t,o),ht=(e,t,o)=>ft(e,(e=>Ce(e,t)),o),pt=(e,t)=>((e,o)=>L(e.dom.childNodes,(e=>{return o=xe.fromDom(e),Ce(o,t);var o})).map(xe.fromDom))(e),wt=(e,t)=>Te(t,e),bt=(e,t,o)=>ut(((e,t)=>Ce(e,t)),ht,e,t,o),vt=(e,t,o=p)=>e.exists((e=>o(e,t))),yt=e=>{const t=[],o=e=>{t.push(e)};for(let t=0;te?C.some(t):C.none(),Ct=(e,t,o)=>""===t||e.length>=t.length&&e.substr(o,o+t.length)===t,St=(e,t,o=0,n)=>{const r=e.indexOf(t,o);return-1!==r&&(!!i(n)||r+t.length<=n)},Tt=(e,t)=>Ct(e,t,0),Rt=(e,t)=>Ct(e,t,e.length-t.length),Dt=(e=>t=>t.replace(e,""))(/^\s+|\s+$/g),Ot=e=>e.length>0,kt=e=>void 0!==e.style&&d(e.style.getPropertyValue),Et=(e,t,o)=>{if(!r(o))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",o,":: Element ",e),new Error("CSS value must be a string: "+o);kt(e)&&e.style.setProperty(t,o)},Nt=(e,t,o)=>{const n=e.dom;Et(n,t,o)},Bt=(e,t)=>{const o=e.dom;G(t,((e,t)=>{Et(o,t,e)}))},_t=(e,t)=>{const o=e.dom,n=window.getComputedStyle(o).getPropertyValue(t);return""!==n||lt(e)?n:zt(o,t)},zt=(e,t)=>kt(e)?e.style.getPropertyValue(t):"",At=(e,t)=>{const o=e.dom,n=zt(o,t);return C.from(n).filter((e=>e.length>0))},Lt=(e,t)=>{((e,t)=>{kt(e)&&e.style.removeProperty(t)})(e.dom,t),vt(we(e,"style").map(Dt),"")&&be(e,"style")},Wt=(e,t,o=0)=>we(e,t).map((e=>parseInt(e,10))).getOr(o),Mt=(e,t)=>Wt(e,t,1),jt=e=>ue("col")(e)?Wt(e,"span",1)>1:Mt(e,"colspan")>1,Pt=e=>Mt(e,"rowspan")>1,It=(e,t)=>parseInt(_t(e,t),10),Ft=g(10),Ht=g(10),$t=(e,t)=>Vt(e,t,x),Vt=(e,t,o)=>j(Le(e),(e=>Ce(e,t)?o(e)?[e]:[]:Vt(e,t,o))),qt=(e,t)=>((e,t,o=y)=>o(t)?C.none():D(e,ne(t))?C.some(t):ht(t,e.join(","),(e=>Ce(e,"table")||o(e))))(["td","th"],e,t),Ut=e=>$t(e,"th,td"),Gt=e=>Ce(e,"colgroup")?mt(e,"col"):j(Jt(e),(e=>mt(e,"col"))),Kt=(e,t)=>bt(e,"table",t),Yt=e=>$t(e,"tr"),Jt=e=>Kt(e).fold(g([]),(e=>mt(e,"colgroup"))),Qt=(e,t)=>E(e,(e=>{if("colgroup"===ne(e)){const t=E(Gt(e),(e=>{const t=Wt(e,"span",1);return Xe(e,1,t)}));return Ze(e,t,"colgroup")}{const o=E(Ut(e),(e=>{const t=Wt(e,"rowspan",1),o=Wt(e,"colspan",1);return Xe(e,t,o)}));return Ze(e,o,t(e))}})),Xt=e=>Ne(e).map((e=>{const t=ne(e);return(e=>D(Qe,e))(t)?t:"tbody"})).getOr("tbody"),Zt=e=>{const t=Yt(e),o=[...Jt(e),...t];return Qt(o,Xt)},eo=e=>{let t,o=!1;return(...n)=>(o||(o=!0,t=e.apply(null,n)),t)},to=()=>oo(0,0),oo=(e,t)=>({major:e,minor:t}),no={nu:oo,detect:(e,t)=>{const o=String(t).toLowerCase();return 0===e.length?to():((e,t)=>{const o=((e,t)=>{for(let o=0;oNumber(t.replace(o,"$"+e));return oo(n(1),n(2))})(e,o)},unknown:to},ro=(e,t)=>{const o=String(t).toLowerCase();return L(e,(e=>e.search(o)))},so=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,lo=e=>t=>St(t,e),ao=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:e=>St(e,"edge/")&&St(e,"chrome")&&St(e,"safari")&&St(e,"applewebkit")},{name:"Chromium",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,so],search:e=>St(e,"chrome")&&!St(e,"chromeframe")},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:e=>St(e,"msie")||St(e,"trident")},{name:"Opera",versionRegexes:[so,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:lo("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:lo("firefox")},{name:"Safari",versionRegexes:[so,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:e=>(St(e,"safari")||St(e,"mobile/"))&&St(e,"applewebkit")}],co=[{name:"Windows",search:lo("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:e=>St(e,"iphone")||St(e,"ipad"),versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:lo("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"macOS",search:lo("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:lo("linux"),versionRegexes:[]},{name:"Solaris",search:lo("sunos"),versionRegexes:[]},{name:"FreeBSD",search:lo("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:lo("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}],io={browsers:g(ao),oses:g(co)},mo="Edge",uo="Chromium",fo="Opera",go="Firefox",ho="Safari",po=e=>{const t=e.current,o=e.version,n=e=>()=>t===e;return{current:t,version:o,isEdge:n(mo),isChromium:n(uo),isIE:n("IE"),isOpera:n(fo),isFirefox:n(go),isSafari:n(ho)}},wo=()=>po({current:void 0,version:no.unknown()}),bo=po,vo=(g(mo),g(uo),g("IE"),g(fo),g(go),g(ho),"Windows"),yo="Android",xo="Linux",Co="macOS",So="Solaris",To="FreeBSD",Ro="ChromeOS",Do=e=>{const t=e.current,o=e.version,n=e=>()=>t===e;return{current:t,version:o,isWindows:n(vo),isiOS:n("iOS"),isAndroid:n(yo),isMacOS:n(Co),isLinux:n(xo),isSolaris:n(So),isFreeBSD:n(To),isChromeOS:n(Ro)}},Oo=()=>Do({current:void 0,version:no.unknown()}),ko=Do,Eo=(g(vo),g("iOS"),g(yo),g(xo),g(Co),g(So),g(To),g(Ro),e=>window.matchMedia(e).matches);let No=eo((()=>((e,t,o)=>{const n=io.browsers(),r=io.oses(),s=t.bind((e=>((e,t)=>V(t.brands,(t=>{const o=t.brand.toLowerCase();return L(e,(e=>{var t;return o===(null===(t=e.brand)||void 0===t?void 0:t.toLowerCase())})).map((e=>({current:e.name,version:no.nu(parseInt(t.version,10),0)})))})))(n,e))).orThunk((()=>((e,t)=>ro(e,t).map((e=>{const o=no.detect(e.versionRegexes,t);return{current:e.name,version:o}})))(n,e))).fold(wo,bo),l=((e,t)=>ro(e,t).map((e=>{const o=no.detect(e.versionRegexes,t);return{current:e.name,version:o}})))(r,e).fold(Oo,ko),a=((e,t,o,n)=>{const r=e.isiOS()&&!0===/ipad/i.test(o),s=e.isiOS()&&!r,l=e.isiOS()||e.isAndroid(),a=l||n("(pointer:coarse)"),c=r||!s&&l&&n("(min-device-width:768px)"),i=s||l&&!c,m=t.isSafari()&&e.isiOS()&&!1===/safari/i.test(o),d=!i&&!c&&!m;return{isiPad:g(r),isiPhone:g(s),isTablet:g(c),isPhone:g(i),isTouch:g(a),isAndroid:e.isAndroid,isiOS:e.isiOS,isWebView:g(m),isDesktop:g(d)}})(l,s,e,o);return{browser:s,os:l,deviceType:a}})(navigator.userAgent,C.from(navigator.userAgentData),Eo)));const Bo=()=>No(),_o=(e,t)=>{const o=o=>{const n=t(o);if(n<=0||null===n){const t=_t(o,e);return parseFloat(t)||0}return n},n=(e,t)=>A(t,((t,o)=>{const n=_t(e,o),r=void 0===n?0:parseInt(n,10);return isNaN(r)?t:t+r}),0);return{set:(t,o)=>{if(!u(o)&&!o.match(/^[0-9]+$/))throw new Error(e+".set accepts only positive integer values. Value was "+o);const n=t.dom;kt(n)&&(n.style[e]=o+"px")},get:o,getOuter:o,aggregate:n,max:(e,t,o)=>{const r=n(e,o);return t>r?t-r:0}}},zo=(e,t,o)=>((e,t)=>(e=>{const t=parseFloat(e);return isNaN(t)?C.none():C.some(t)})(e).getOr(t))(_t(e,t),o),Ao=_o("width",(e=>e.dom.offsetWidth)),Lo=e=>Ao.get(e),Wo=e=>Ao.getOuter(e),Mo=e=>((e,t)=>{const o=e.dom,n=o.getBoundingClientRect().width||o.offsetWidth;return"border-box"===t?n:((e,t,o,n)=>t-zo(e,`padding-${o}`,0)-zo(e,`padding-${n}`,0)-zo(e,`border-${o}-width`,0)-zo(e,`border-${n}-width`,0))(e,n,"left","right")})(e,"content-box"),jo=(e,t,o)=>{const n=e.cells,r=n.slice(0,t),s=n.slice(t),l=r.concat(o).concat(s);return Fo(e,l)},Po=(e,t,o)=>jo(e,t,[o]),Io=(e,t,o)=>{e.cells[t]=o},Fo=(e,t)=>tt(e.element,t,e.section,e.isNew),Ho=(e,t)=>e.cells[t],$o=(e,t)=>Ho(e,t).element,Vo=e=>e.cells.length,qo=e=>{const t=B(e,(e=>"colgroup"===e.section));return{rows:t.fail,cols:t.pass}},Uo=(e,t,o)=>{const n=E(e.cells,o);return tt(t(e.element),n,e.section,!0)},Go="data-snooker-locked-cols",Ko=e=>we(e,Go).bind((e=>C.from(e.match(/\d+/g)))).map((e=>I(e,x))),Yo=e=>{const t=A(qo(e).rows,((e,t)=>(N(t.cells,((t,o)=>{t.isLocked&&(e[o]=!0)})),e)),{}),o=J(t,((e,t)=>parseInt(t,10)));return((e,t)=>{const o=S.call(e,0);return o.sort(void 0),o})(o)},Jo=(e,t)=>e+","+t,Qo=(e,t)=>{const o=j(e.all,(e=>e.cells));return _(o,t)},Xo=e=>{const t={},o=[],n=H(e).map((e=>e.element)).bind(Kt).bind(Ko).getOr({});let r=0,s=0,l=0;const{pass:a,fail:c}=B(e,(e=>"colgroup"===e.section));N(c,(e=>{const a=[];N(e.cells,(e=>{let o=0;for(;void 0!==t[Jo(l,o)];)o++;const r=((e,t)=>X(e,t)&&void 0!==e[t]&&null!==e[t])(n,o.toString()),c=((e,t,o,n,r,s)=>({element:e,rowspan:t,colspan:o,row:n,column:r,isLocked:s}))(e.element,e.rowspan,e.colspan,l,o,r);for(let n=0;n{const t=(e=>{const t={};let o=0;return N(e.cells,(e=>{const n=e.colspan;k(n,(r=>{const s=o+r;t[s]=((e,t,o)=>({element:e,colspan:t,column:o}))(e.element,n,s)})),o+=n})),t})(e),o=((e,t)=>({element:e,columns:t}))(e.element,Q(t));return{colgroups:[o],columns:t}})).getOrThunk((()=>({colgroups:[],columns:{}}))),d=((e,t)=>({rows:e,columns:t}))(r,s);return{grid:d,access:t,all:o,columns:i,colgroups:m}},Zo=e=>{const t=Zt(e);return Xo(t)},en=Xo,tn=(e,t,o)=>C.from(e.access[Jo(t,o)]),on=(e,t,o)=>{const n=Qo(e,(e=>o(t,e.element)));return n.length>0?C.some(n[0]):C.none()},nn=Qo,rn=e=>j(e.all,(e=>e.cells)),sn=e=>Q(e.columns),ln=e=>q(e.columns).length>0,an=(e,t)=>C.from(e.columns[t]),cn=(e,t=x)=>{const o=e.grid,n=k(o.columns,h),r=k(o.rows,h);return E(n,(o=>mn((()=>j(r,(t=>tn(e,t,o).filter((e=>e.column===o)).toArray()))),(e=>1===e.colspan&&t(e.element)),(()=>tn(e,0,o)))))},mn=(e,t,o)=>{const n=e();return L(n,t).orThunk((()=>C.from(n[0]).orThunk(o))).map((e=>e.element))},dn=e=>{const t=e.grid,o=k(t.rows,h),n=k(t.columns,h);return E(o,(t=>mn((()=>j(n,(o=>tn(e,t,o).filter((e=>e.row===t)).fold(g([]),(e=>[e]))))),(e=>1===e.rowspan),(()=>tn(e,t,0)))))},un=(e,t)=>o=>"rtl"===fn(o)?t:e,fn=e=>"rtl"===_t(e,"direction")?"rtl":"ltr",gn=_o("height",(e=>{const t=e.dom;return lt(e)?t.getBoundingClientRect().height:t.offsetHeight})),hn=e=>gn.get(e),pn=e=>gn.getOuter(e),wn=(e,t)=>({left:e,top:t,translate:(o,n)=>wn(e+o,t+n)}),bn=wn,vn=(e,t)=>void 0!==e?e:void 0!==t?t:0,yn=e=>{const t=e.dom.ownerDocument,o=t.body,n=t.defaultView,r=t.documentElement;if(o===e.dom)return bn(o.offsetLeft,o.offsetTop);const s=vn(null==n?void 0:n.pageYOffset,r.scrollTop),l=vn(null==n?void 0:n.pageXOffset,r.scrollLeft),a=vn(r.clientTop,o.clientTop),c=vn(r.clientLeft,o.clientLeft);return xn(e).translate(l-c,s-a)},xn=e=>{const t=e.dom,o=t.ownerDocument.body;return o===t?bn(o.offsetLeft,o.offsetTop):lt(e)?(e=>{const t=e.getBoundingClientRect();return bn(t.left,t.top)})(t):bn(0,0)},Cn=(e,t)=>({row:e,y:t}),Sn=(e,t)=>({col:e,x:t}),Tn=e=>yn(e).left+Wo(e),Rn=e=>yn(e).left,Dn=(e,t)=>Sn(e,Rn(t)),On=(e,t)=>Sn(e,Tn(t)),kn=e=>yn(e).top,En=(e,t)=>Cn(e,kn(t)),Nn=(e,t)=>Cn(e,kn(t)+pn(t)),Bn=(e,t,o)=>{if(0===o.length)return[];const n=E(o.slice(1),((t,o)=>t.map((t=>e(o,t))))),r=o[o.length-1].map((e=>t(o.length-1,e)));return n.concat([r])},_n={delta:h,positions:e=>Bn(En,Nn,e),edge:kn},zn=un({delta:h,edge:Rn,positions:e=>Bn(Dn,On,e)},{delta:e=>-e,edge:Tn,positions:e=>Bn(On,Dn,e)}),An={delta:(e,t)=>zn(t).delta(e,t),positions:(e,t)=>zn(t).positions(e,t),edge:e=>zn(e).edge(e)},Ln={unsupportedLength:["em","ex","cap","ch","ic","rem","lh","rlh","vw","vh","vi","vb","vmin","vmax","cm","mm","Q","in","pc","pt","px"],fixed:["px","pt"],relative:["%"],empty:[""]},Wn=(()=>{const e="[0-9]+",t="[eE][+-]?"+e,o=e=>`(?:${e})?`,n=["Infinity",e+"\\."+o(e)+o(t),"\\."+e+o(t),e+o(t)].join("|");return new RegExp(`^([+-]?(?:${n}))(.*)$`)})(),Mn=/(\d+(\.\d+)?)%/,jn=/(\d+(\.\d+)?)px|em/,Pn=ue("col"),In=(e,t,o)=>{const n=Be(e).getOrThunk((()=>at(ke(e))));return t(e)/o(n)*100},Fn=(e,t)=>{Nt(e,"width",t+"px")},Hn=(e,t)=>{Nt(e,"width",t+"%")},$n=(e,t)=>{Nt(e,"height",t+"px")},Vn=e=>{const t=(e=>{return zo(t=e,"height",t.dom.offsetHeight)+"px";var t})(e);return t?((e,t,o,n)=>{const r=parseFloat(e);return Rt(e,"%")&&"table"!==ne(t)?((e,t,o,n)=>{const r=Kt(e).map((e=>{const n=o(e);return Math.floor(t/100*n)})).getOr(t);return n(e,r),r})(t,r,o,n):r})(t,e,hn,$n):hn(e)},qn=(e,t)=>At(e,t).orThunk((()=>we(e,t).map((e=>e+"px")))),Un=e=>qn(e,"width"),Gn=e=>In(e,Lo,Mo),Kn=e=>{return Pn(e)?Lo(e):zo(t=e,"width",t.dom.offsetWidth);var t},Yn=e=>((e,t,o)=>o(e)/Mt(e,"rowspan"))(e,0,Vn),Jn=(e,t,o)=>{Nt(e,"width",t+o)},Qn=e=>In(e,Lo,Mo)+"%",Xn=g(Mn),Zn=ue("col"),er=e=>Un(e).getOrThunk((()=>Kn(e)+"px")),tr=e=>{return(t=e,qn(t,"height")).getOrThunk((()=>Yn(e)+"px"));var t},or=(e,t,o,n,r,s)=>e.filter(n).fold((()=>s(((e,t)=>{if(t<0||t>=e.length-1)return C.none();const o=e[t].fold((()=>{const o=(e=>{const t=S.call(e,0);return t.reverse(),t})(e.slice(0,t));return V(o,((e,t)=>e.map((e=>({value:e,delta:t+1})))))}),(e=>C.some({value:e,delta:0}))),n=e[t+1].fold((()=>{const o=e.slice(t+1);return V(o,((e,t)=>e.map((e=>({value:e,delta:t+1})))))}),(e=>C.some({value:e,delta:1})));return o.bind((e=>n.map((t=>{const o=t.delta+e.delta;return Math.abs(t.value-e.value)/o}))))})(o,t))),(e=>r(e))),nr=(e,t,o,n)=>{const r=cn(e),s=ln(e)?(e=>E(sn(e),(e=>C.from(e.element))))(e):r,l=[C.some(An.edge(t))].concat(E(An.positions(r,t),(e=>e.map((e=>e.x))))),a=b(jt);return E(s,((e,t)=>or(e,t,l,a,(e=>{if((e=>{const t=Bo().browser,o=t.isChromium()||t.isFirefox();return!Zn(e)||o})(e))return o(e);{const e=null!=(s=r[t])?h(s):C.none();return or(e,t,l,a,(e=>n(C.some(Lo(e)))),n)}var s}),n)))},rr=e=>e.map((e=>e+"px")).getOr(""),sr=(e,t,o)=>nr(e,t,Kn,(e=>e.getOrThunk(o.minCellWidth))),lr=(e,t,o,n,r)=>{const s=dn(e),l=[C.some(o.edge(t))].concat(E(o.positions(s,t),(e=>e.map((e=>e.y)))));return E(s,((e,t)=>or(e,t,l,b(Pt),n,r)))},ar=(e,t)=>()=>lt(e)?t(e):parseFloat(At(e,"width").getOr("0")),cr=e=>{const t=ar(e,(e=>parseFloat(Qn(e)))),o=ar(e,Lo);return{width:t,pixelWidth:o,getWidths:(t,o)=>((e,t,o)=>nr(e,t,Gn,(e=>e.fold((()=>o.minCellWidth()),(e=>e/o.pixelWidth()*100)))))(t,e,o),getCellDelta:e=>e/o()*100,singleColumnWidth:(e,t)=>[100-e],minCellWidth:()=>Ft()/o()*100,setElementWidth:Hn,adjustTableWidth:o=>{const n=t();Hn(e,n+o/100*n)},isRelative:!0,label:"percent"}},ir=e=>{const t=ar(e,Lo);return{width:t,pixelWidth:t,getWidths:(t,o)=>sr(t,e,o),getCellDelta:h,singleColumnWidth:(e,t)=>[Math.max(Ft(),e+t)-e],minCellWidth:Ft,setElementWidth:Fn,adjustTableWidth:o=>{const n=t()+o;Fn(e,n)},isRelative:!1,label:"pixel"}},mr=e=>Un(e).fold((()=>(e=>{const t=ar(e,Lo),o=g(0);return{width:t,pixelWidth:t,getWidths:(t,o)=>sr(t,e,o),getCellDelta:o,singleColumnWidth:g([0]),minCellWidth:o,setElementWidth:f,adjustTableWidth:f,isRelative:!0,label:"none"}})(e)),(t=>((e,t)=>null!==Xn().exec(t)?cr(e):ir(e))(e,t))),dr=ir,ur=cr,fr=(e,t,o)=>{const n=e[o].element,r=xe.fromTag("td");Ie(r,xe.fromTag("br")),(t?Ie:Pe)(n,r)},gr=((e,t)=>{const o=t=>e(t)?C.from(t.dom.nodeValue):C.none();return{get:t=>{if(!e(t))throw new Error("Can only get text value of a text node");return o(t).getOr("")},getOption:o,set:(t,o)=>{if(!e(t))throw new Error("Can only set raw text value of a text node");t.dom.nodeValue=o}}})(ie),hr=e=>gr.get(e),pr=e=>gr.getOption(e),wr=(e,t)=>gr.set(e,t),br=e=>"img"===ne(e)?1:pr(e).fold((()=>Le(e).length),(e=>e.length)),vr=["img","br"],yr=e=>pr(e).filter((e=>0!==e.trim().length||e.indexOf("\xa0")>-1)).isSome()||D(vr,ne(e))||(e=>ae(e)&&"false"===pe(e,"contenteditable"))(e),xr=e=>((e,t)=>{const o=e=>{for(let n=0;nSr(e,yr),Sr=(e,t)=>{const o=e=>{const n=Le(e);for(let e=n.length-1;e>=0;e--){const r=n[e];if(t(r))return C.some(r);const s=o(r);if(s.isSome())return s}return C.none()};return o(e)},Tr={scope:["row","col"]},Rr=e=>()=>{const t=xe.fromTag("td",e.dom);return Ie(t,xe.fromTag("br",e.dom)),t},Dr=e=>()=>xe.fromTag("col",e.dom),Or=e=>()=>xe.fromTag("colgroup",e.dom),kr=e=>()=>xe.fromTag("tr",e.dom),Er=(e,t,o)=>{const n=((e,t)=>{const o=Je(e,t),n=Le(Ye(e));return $e(o,n),o})(e,t);return G(o,((e,t)=>{null===e?be(n,t):ge(n,t,e)})),n},Nr=e=>e,Br=(e,t,o)=>{const n=(e,t)=>{((e,t)=>{const o=e.dom,n=t.dom;kt(o)&&kt(n)&&(n.style.cssText=o.style.cssText)})(e.element,t),Lt(t,"height"),1!==e.colspan&&Lt(t,"width")};return{col:o=>{const r=xe.fromTag(ne(o.element),t.dom);return n(o,r),e(o.element,r),r},colgroup:Or(t),row:kr(t),cell:r=>{const s=xe.fromTag(ne(r.element),t.dom),l=o.getOr(["strong","em","b","i","span","font","h1","h2","h3","h4","h5","h6","p","div"]),a=l.length>0?((e,t,o)=>xr(e).map((n=>{const r=o.join(","),s=it(n,r,(t=>Re(t,e)));return z(s,((e,t)=>{const o=Ke(t);return Ie(e,o),o}),t)})).getOr(t))(r.element,s,l):s;return Ie(a,xe.fromTag("br")),n(r,s),((e,t)=>{G(Tr,((o,n)=>we(e,n).filter((e=>D(o,e))).each((e=>ge(t,n,e)))))})(r.element,s),e(r.element,s),s},replace:Er,colGap:Dr(t),gap:Rr(t)}},_r=e=>({col:Dr(e),colgroup:Or(e),row:kr(e),cell:Rr(e),replace:Nr,colGap:Dr(e),gap:Rr(e)}),zr=e=>t=>t.options.get(e),Ar="100%",Lr=e=>{var t;const o=e.dom,n=null!==(t=o.getParent(e.selection.getStart(),o.isBlock))&&void 0!==t?t:e.getBody();return Mo(xe.fromDom(n))+"px"},Wr=e=>C.from(e.options.get("table_clone_elements")),Mr=zr("table_header_type"),jr=zr("table_column_resizing"),Pr=e=>"preservetable"===jr(e),Ir=e=>"resizetable"===jr(e),Fr=zr("table_sizing_mode"),Hr=e=>"relative"===Fr(e),$r=e=>"fixed"===Fr(e),Vr=e=>"responsive"===Fr(e),qr=zr("table_resize_bars"),Ur=zr("table_style_by_css"),Gr=zr("table_merge_content_on_paste"),Kr=e=>{const t=e.options,o=t.get("table_default_attributes");return t.isSet("table_default_attributes")?o:((e,t)=>Vr(e)||Ur(e)?t:$r(e)?{...t,width:Lr(e)}:{...t,width:Ar})(e,o)},Yr=zr("table_use_colgroups"),Jr=e=>bt(e,"[contenteditable]"),Qr=(e,t=!1)=>lt(e)?e.dom.isContentEditable:Jr(e).fold(g(t),(e=>"true"===Xr(e))),Xr=e=>e.dom.contentEditable,Zr=e=>xe.fromDom(e.getBody()),es=e=>t=>Re(t,Zr(e)),ts=e=>{be(e,"data-mce-style");const t=e=>be(e,"data-mce-style");N(Ut(e),t),N(Gt(e),t),N(Yt(e),t)},os=e=>xe.fromDom(e.selection.getStart()),ns=e=>e.getBoundingClientRect().width,rs=e=>e.getBoundingClientRect().height,ss=e=>gt(e,ue("table")).exists(Qr),ls=(e,t)=>{const o=t.column,n=t.column+t.colspan-1,r=t.row,s=t.row+t.rowspan-1;return o<=e.finishCol&&n>=e.startCol&&r<=e.finishRow&&s>=e.startRow},as=(e,t)=>t.column>=e.startCol&&t.column+t.colspan-1<=e.finishCol&&t.row>=e.startRow&&t.row+t.rowspan-1<=e.finishRow,cs=(e,t,o)=>{const n=on(e,t,Re),r=on(e,o,Re);return n.bind((e=>r.map((t=>{return o=e,n=t,{startRow:Math.min(o.row,n.row),startCol:Math.min(o.column,n.column),finishRow:Math.max(o.row+o.rowspan-1,n.row+n.rowspan-1),finishCol:Math.max(o.column+o.colspan-1,n.column+n.colspan-1)};var o,n}))))},is=(e,t,o)=>cs(e,t,o).map((t=>{const o=nn(e,w(ls,t));return E(o,(e=>e.element))})),ms=(e,t)=>on(e,t,((e,t)=>De(t,e))).map((e=>e.element)),ds=(e,t,o)=>{const n=fs(e);return is(n,t,o)},us=(e,t,o,n,r)=>{const s=fs(e),l=Re(e,o)?C.some(t):ms(s,t),a=Re(e,r)?C.some(n):ms(s,n);return l.bind((e=>a.bind((t=>is(s,e,t)))))},fs=Zo;var gs=["body","p","div","article","aside","figcaption","figure","footer","header","nav","section","ol","ul","li","table","thead","tbody","tfoot","caption","tr","td","th","h1","h2","h3","h4","h5","h6","blockquote","pre","address"],hs=()=>({up:g({selector:ht,closest:bt,predicate:ft,all:_e}),down:g({selector:dt,predicate:ct}),styles:g({get:_t,getRaw:At,set:Nt,remove:Lt}),attrs:g({get:pe,set:ge,remove:be,copyTo:(e,t)=>{const o=ve(e);he(t,o)}}),insert:g({before:Me,after:je,afterAll:He,append:Ie,appendAll:$e,prepend:Pe,wrap:Fe}),remove:g({unwrap:Ue,remove:qe}),create:g({nu:xe.fromTag,clone:e=>xe.fromDom(e.dom.cloneNode(!1)),text:xe.fromText}),query:g({comparePosition:(e,t)=>e.dom.compareDocumentPosition(t.dom),prevSibling:ze,nextSibling:Ae}),property:g({children:Le,name:ne,parent:Ne,document:e=>Ee(e).dom,isText:ie,isComment:le,isElement:ce,isSpecial:e=>{const t=ne(e);return D(["script","noscript","iframe","noframes","noembed","title","style","textarea","xmp"],t)},getLanguage:e=>ce(e)?we(e,"lang"):C.none(),getText:hr,setText:wr,isBoundary:e=>!!ce(e)&&("body"===ne(e)||D(gs,ne(e))),isEmptyTag:e=>!!ce(e)&&D(["br","img","hr","input"],ne(e)),isNonEditable:e=>ce(e)&&"false"===pe(e,"contenteditable")}),eq:Re,is:Oe});const ps=(e,t,o,n)=>{const r=t(e,o);return z(n,((o,n)=>{const r=t(e,n);return ws(e,o,r)}),r)},ws=(e,t,o)=>t.bind((t=>o.filter(w(e.eq,t)))),bs=hs(),vs=(e,t)=>((e,t,o)=>o.length>0?((e,t,o,n)=>n(e,t,o[0],o.slice(1)))(e,t,o,ps):C.none())(bs,((t,o)=>e(o)),t),ys=e=>ht(e,"table"),xs=(e,t,o)=>{const n=e=>t=>void 0!==o&&o(t)||Re(t,e);return Re(e,t)?C.some({boxes:C.some([e]),start:e,finish:t}):ys(e).bind((r=>ys(t).bind((s=>{if(Re(r,s))return C.some({boxes:ds(r,e,t),start:e,finish:t});if(De(r,s)){const o=it(t,"td,th",n(r)),l=o.length>0?o[o.length-1]:t;return C.some({boxes:us(r,e,r,t,s),start:e,finish:l})}if(De(s,r)){const o=it(e,"td,th",n(s)),l=o.length>0?o[o.length-1]:e;return C.some({boxes:us(s,e,r,t,s),start:e,finish:l})}return((e,t,o)=>((e,t,o,n=y)=>{const r=[t].concat(e.up().all(t)),s=[o].concat(e.up().all(o)),l=e=>W(e,n).fold((()=>e),(t=>e.slice(0,t+1))),a=l(r),c=l(s),i=L(a,(t=>O(c,((e,t)=>w(e.eq,t))(e,t))));return{firstpath:a,secondpath:c,shared:i}})(bs,e,t,void 0))(e,t).shared.bind((l=>bt(l,"table",o).bind((o=>{const l=it(t,"td,th",n(o)),a=l.length>0?l[l.length-1]:t,c=it(e,"td,th",n(o)),i=c.length>0?c[c.length-1]:e;return C.some({boxes:us(o,e,r,t,s),start:i,finish:a})}))))}))))},Cs=(e,t)=>{const o=dt(e,t);return o.length>0?C.some(o):C.none()},Ss=(e,t,o)=>wt(e,t).bind((t=>wt(e,o).bind((e=>vs(ys,[t,e]).map((o=>({first:t,last:e,table:o}))))))),Ts=(e,t,o,n,r)=>((e,t)=>L(e,(e=>Ce(e,t))))(e,r).bind((e=>((e,t,o)=>Kt(e).bind((n=>((e,t,o,n)=>on(e,t,Re).bind((t=>{const r=o>0?t.row+t.rowspan-1:t.row,s=n>0?t.column+t.colspan-1:t.column;return tn(e,r+o,s+n).map((e=>e.element))})))(fs(n),e,t,o))))(e,t,o).bind((e=>((e,t)=>ht(e,"table").bind((o=>wt(o,t).bind((t=>xs(t,e).bind((e=>e.boxes.map((t=>({boxes:t,start:e.start,finish:e.finish}))))))))))(e,n))))),Rs=(e,t)=>Cs(e,t),Ds=(e,t,o)=>Ss(e,t,o).bind((t=>{const o=t=>Re(e,t),n="thead,tfoot,tbody,table",r=ht(t.first,n,o),s=ht(t.last,n,o);return r.bind((e=>s.bind((o=>Re(e,o)?((e,t,o)=>((e,t,o)=>cs(e,t,o).bind((t=>((e,t)=>{let o=!0;const n=w(as,t);for(let r=t.startRow;r<=t.finishRow;r++)for(let s=t.startCol;s<=t.finishCol;s++)o=o&&tn(e,r,s).exists(n);return o?C.some(t):C.none()})(e,t))))(fs(e),t,o))(t.table,t.first,t.last):C.none()))))})),Os=h,ks=e=>{const t=(e,t)=>we(e,t).exists((e=>parseInt(e,10)>1));return e.length>0&&P(e,(e=>t(e,"rowspan")||t(e,"colspan")))?C.some(e):C.none()},Es=(e,t,o)=>t.length<=1?C.none():Ds(e,o.firstSelectedSelector,o.lastSelectedSelector).map((e=>({bounds:e,cells:t}))),Ns="data-mce-selected",Bs="data-mce-first-selected",_s="data-mce-last-selected",zs="["+Ns+"]",As={selected:Ns,selectedSelector:"td["+Ns+"],th["+Ns+"]",firstSelected:Bs,firstSelectedSelector:"td["+Bs+"],th["+Bs+"]",lastSelected:_s,lastSelectedSelector:"td["+_s+"],th["+_s+"]"},Ls=(e,t,o)=>({element:o,mergable:Es(t,e,As),unmergable:ks(e),selection:Os(e)}),Ws=e=>(t,o)=>{const n=ne(t),r="col"===n||"colgroup"===n?Kt(s=t).bind((e=>Rs(e,As.firstSelectedSelector))).fold(g(s),(e=>e[0])):t;var s;return bt(r,e,o)},Ms=Ws("th,td,caption"),js=Ws("th,td"),Ps=e=>{return t=e.model.table.getSelectedCells(),E(t,xe.fromDom);var t},Is=(e,t)=>{e.on("BeforeGetContent",(t=>{const o=o=>{t.preventDefault(),(e=>Kt(e[0]).map((e=>{const t=((e,t)=>{const o=e=>Ce(e.element,t),n=Ye(e),r=Zt(n),s=mr(e),l=en(r),a=((e,t)=>{const o=e.grid.columns;let n=e.grid.rows,r=o,s=0,l=0;const a=[],c=[];return G(e.access,(e=>{if(a.push(e),t(e)){c.push(e);const t=e.row,o=t+e.rowspan-1,a=e.column,i=a+e.colspan-1;ts&&(s=o),al&&(l=i)}})),((e,t,o,n,r,s)=>({minRow:e,minCol:t,maxRow:o,maxCol:n,allCells:r,selectedCells:s}))(n,r,s,l,a,c)})(l,o),c="th:not("+t+"),td:not("+t+")",i=Vt(n,"th,td",(e=>Ce(e,c)));N(i,qe),((e,t,o,n)=>{const r=_(e,(e=>"colgroup"!==e.section)),s=t.grid.columns,l=t.grid.rows;for(let e=0;eo.maxRow||ao.maxCol||(tn(t,e,a).filter(n).isNone()?fr(r,l,e):l=!0)}})(r,l,a,o);const m=((e,t,o,n)=>{if(0===n.minCol&&t.grid.columns===n.maxCol+1)return 0;const r=sr(t,e,o),s=A(r,((e,t)=>e+t),0),l=A(r.slice(n.minCol,n.maxCol+1),((e,t)=>e+t),0),a=l/s*o.pixelWidth()-o.pixelWidth();return o.getCellDelta(a)})(e,Zo(e),s,a);return((e,t,o,n)=>{G(o.columns,(e=>{(e.columnt.maxCol)&&qe(e.element)}));const r=_($t(e,"tr"),(e=>0===e.dom.childElementCount));N(r,qe),t.minCol!==t.maxCol&&t.minRow!==t.maxRow||N($t(e,"th,td"),(e=>{be(e,"rowspan"),be(e,"colspan")})),be(e,Go),be(e,"data-snooker-col-series"),mr(e).adjustTableWidth(n)})(n,a,l,m),n})(e,zs);return ts(t),[t]})))(o).each((o=>{t.content="text"===t.format?(e=>E(e,(e=>e.dom.innerText)).join(""))(o):((e,t)=>E(t,(t=>e.selection.serializer.serialize(t.dom,{}))).join(""))(e,o)}))};if(!0===t.selection){const t=(e=>_(Ps(e),(e=>Ce(e,As.selectedSelector))))(e);t.length>=1&&o(t)}})),e.on("BeforeSetContent",(o=>{if(!0===o.selection&&!0===o.paste){const n=Ps(e);H(n).each((n=>{Kt(n).each((r=>{const s=_(((e,t)=>{const o=document.createElement("div");return o.innerHTML=e,Le(xe.fromDom(o))})(o.content),(e=>"meta"!==ne(e))),l=ue("table");if(Gr(e)&&1===s.length&&l(s[0])){o.preventDefault();const l=xe.fromDom(e.getDoc()),a=_r(l),c=((e,t,o)=>({element:e,clipboard:t,generators:o}))(n,s[0],a);t.pasteCells(r,c).each((()=>{e.focus()}))}}))}))}}))},Fs=(e,t)=>({element:e,offset:t}),Hs=(e,t,o)=>e.property().isText(t)&&0===e.property().getText(t).trim().length||e.property().isComment(t)?o(t).bind((t=>Hs(e,t,o).orThunk((()=>C.some(t))))):C.none(),$s=(e,t)=>e.property().isText(t)?e.property().getText(t).length:e.property().children(t).length,Vs=(e,t)=>{const o=Hs(e,t,e.query().prevSibling).getOr(t);if(e.property().isText(o))return Fs(o,$s(e,o));const n=e.property().children(o);return n.length>0?Vs(e,n[n.length-1]):Fs(o,$s(e,o))},qs=Vs,Us=hs(),Gs=(e,t)=>{if(!jt(e)){const o=(e=>Un(e).bind((e=>{return t=e,o=["fixed","relative","empty"],C.from(Wn.exec(t)).bind((e=>{const t=Number(e[1]),n=e[2];return((e,t)=>O(t,(t=>O(Ln[t],(t=>e===t)))))(n,o)?C.some({value:t,unit:n}):C.none()}));var t,o})))(e);o.each((o=>{const n=o.value/2;Jn(e,n,o.unit),Jn(t,n,o.unit)}))}},Ks=e=>E(e,g(0)),Ys=(e,t,o,n,r)=>r(e.slice(0,t)).concat(n).concat(r(e.slice(o))),Js=e=>(t,o,n,r)=>{if(e(n)){const e=Math.max(r,t[o]-Math.abs(n)),s=Math.abs(e-t[o]);return n>=0?s:-s}return n},Qs=Js((e=>e<0)),Xs=Js(x),Zs=()=>{const e=(e,t,o,n)=>{const r=(100+o)/100,s=Math.max(n,(e[t]+o)/r);return E(e,((e,o)=>(o===t?s:e/r)-e))},t=(t,o,n,r,s,l)=>l?e(t,o,r,s):((e,t,o,n,r)=>{const s=Qs(e,t,n,r);return Ys(e,t,o+1,[s,0],Ks)})(t,o,n,r,s);return{resizeTable:(e,t)=>e(t),clampTableDelta:Qs,calcLeftEdgeDeltas:t,calcMiddleDeltas:(e,o,n,r,s,l,a)=>t(e,n,r,s,l,a),calcRightEdgeDeltas:(t,o,n,r,s,l)=>{if(l)return e(t,n,r,s);{const e=Qs(t,n,r,s);return Ks(t.slice(0,n)).concat([e])}},calcRedestributedWidths:(e,t,o,n)=>{if(n){const n=(t+o)/t,r=E(e,(e=>e/n));return{delta:100*n-100,newSizes:r}}return{delta:o,newSizes:e}}}},el=()=>{const e=(e,t,o,n,r)=>{const s=Xs(e,n>=0?o:t,n,r);return Ys(e,t,o+1,[s,-s],Ks)};return{resizeTable:(e,t,o)=>{o&&e(t)},clampTableDelta:(e,t,o,n,r)=>{if(r){if(o>=0)return o;{const t=A(e,((e,t)=>e+t-n),0);return Math.max(-t,o)}}return Qs(e,t,o,n)},calcLeftEdgeDeltas:e,calcMiddleDeltas:(t,o,n,r,s,l)=>e(t,n,r,s,l),calcRightEdgeDeltas:(e,t,o,n,r,s)=>{if(s)return Ks(e);{const t=n/e.length;return E(e,g(t))}},calcRedestributedWidths:(e,t,o,n)=>({delta:0,newSizes:e})}},tl=e=>Zo(e).grid,ol=ue("th"),nl=e=>P(e,(e=>ol(e.element))),rl=(e,t)=>e&&t?"sectionCells":e?"section":"cells",sl=e=>{const t="thead"===e.section,o=vt(ll(e.cells),"th");return"tfoot"===e.section?{type:"footer"}:t||o?{type:"header",subType:rl(t,o)}:{type:"body"}},ll=e=>{const t=_(e,(e=>ol(e.element)));return 0===t.length?C.some("td"):t.length===e.length?C.some("th"):C.none()},al=(e,t,o)=>et(o(e.element,t),!0,e.isLocked),cl=(e,t)=>e.section!==t?tt(e.element,e.cells,t,e.isNew):e,il=()=>({transformRow:cl,transformCell:(e,t,o)=>{const n=o(e.element,t),r="td"!==ne(n)?((e,t)=>{const o=Je(e,"td");je(e,o);const n=Le(e);return $e(o,n),qe(e),o})(n):n;return et(r,e.isNew,e.isLocked)}}),ml=()=>({transformRow:cl,transformCell:al}),dl=()=>({transformRow:(e,t)=>cl(e,"thead"===t?"tbody":t),transformCell:al}),ul=il,fl=ml,gl=dl,hl=()=>({transformRow:h,transformCell:al}),pl=(e,t,o,n)=>{o===n?be(e,t):ge(e,t,o)},wl=(e,t,o)=>{$(mt(e,t)).fold((()=>Pe(e,o)),(e=>je(e,o)))},bl=(e,t)=>{const o=[],n=[],r=e=>E(e,(e=>{e.isNew&&o.push(e.element);const t=e.element;return Ve(t),N(e.cells,(e=>{e.isNew&&n.push(e.element),pl(e.element,"colspan",e.colspan,1),pl(e.element,"rowspan",e.rowspan,1),Ie(t,e.element)})),t})),s=e=>j(e,(e=>E(e.cells,(e=>(pl(e.element,"span",e.colspan,1),e.element))))),l=(t,o)=>{const n=((e,t)=>{const o=pt(e,t).getOrThunk((()=>{const o=xe.fromTag(t,ke(e).dom);return"thead"===t?wl(e,"caption,colgroup",o):"colgroup"===t?wl(e,"caption",o):Ie(e,o),o}));return Ve(o),o})(e,o),l=("colgroup"===o?s:r)(t);$e(n,l)},a=(t,o)=>{t.length>0?l(t,o):(t=>{pt(e,t).each(qe)})(o)},c=[],i=[],m=[],d=[];return N(t,(e=>{switch(e.section){case"thead":c.push(e);break;case"tbody":i.push(e);break;case"tfoot":m.push(e);break;case"colgroup":d.push(e)}})),a(d,"colgroup"),a(c,"thead"),a(i,"tbody"),a(m,"tfoot"),{newRows:o,newCells:n}},vl=(e,t)=>{if(0===e.length)return 0;const o=e[0];return W(e,(e=>!t(o.element,e.element))).getOr(e.length)},yl=(e,t)=>{const o=E(e,(e=>E(e.cells,y)));return E(e,((n,r)=>{const s=j(n.cells,((n,s)=>{if(!1===o[r][s]){const m=((e,t,o,n)=>{const r=((e,t)=>e[t])(e,t),s="colgroup"===r.section,l=vl(r.cells.slice(o),n),a=s?1:vl(((e,t)=>E(e,(e=>Ho(e,t))))(e.slice(t),o),n);return{colspan:l,rowspan:a}})(e,r,s,t);return((e,t,n,r)=>{for(let s=e;s({element:e,cells:t,section:o,isNew:n}))(n.element,s,n.section,n.isNew)}))},xl=(e,t,o)=>{const n=[];N(e.colgroups,(r=>{const s=[];for(let n=0;net(e.element,o,!1))).getOrThunk((()=>et(t.colGap(),!0,!1)));s.push(r)}n.push(tt(r.element,s,"colgroup",o))}));for(let r=0;ret(e.element,o,e.isLocked))).getOrThunk((()=>et(t.gap(),!0,!1)));s.push(l)}const l=e.all[r],a=tt(l.element,s,l.section,o);n.push(a)}return n},Cl=e=>yl(e,Re),Sl=(e,t)=>V(e.all,(e=>L(e.cells,(e=>Re(t,e.element))))),Tl=(e,t,o)=>{const n=E(t.selection,(t=>qt(t).bind((t=>Sl(e,t))).filter(o))),r=yt(n);return xt(r.length>0,r)},Rl=(e,t,o,n,r)=>(s,l,a,c)=>{const i=Zo(s),m=C.from(null==c?void 0:c.section).getOrThunk(hl);return t(i,l).map((t=>{const o=((e,t)=>xl(e,t,!1))(i,a),n=e(o,t,Re,r(a),m),s=Yo(n.grid);return{info:t,grid:Cl(n.grid),cursor:n.cursor,lockedColumns:s}})).bind((e=>{const t=bl(s,e.grid),r=C.from(null==c?void 0:c.sizing).getOrThunk((()=>mr(s))),l=C.from(null==c?void 0:c.resize).getOrThunk(el);return o(s,e.grid,e.info,{sizing:r,resize:l,section:m}),n(s),be(s,Go),e.lockedColumns.length>0&&ge(s,Go,e.lockedColumns.join(",")),C.some({cursor:e.cursor,newRows:t.newRows,newCells:t.newCells})}))},Dl=(e,t)=>Tl(e,t,x).map((e=>({cells:e,generators:t.generators,clipboard:t.clipboard}))),Ol=(e,t)=>Tl(e,t,x),kl=(e,t)=>Tl(e,t,(e=>!e.isLocked)),El=(e,t)=>P(t,(t=>((e,t)=>Sl(e,t).exists((e=>!e.isLocked)))(e,t))),Nl=(e,t,o,n)=>{const r=qo(e).rows;let s=!0;for(let e=0;e{const t=t=>t(e),o=g(e),n=()=>r,r={tag:!0,inner:e,fold:(t,o)=>o(e),isValue:x,isError:y,map:t=>zl.value(t(e)),mapError:n,bind:t,exists:t,forall:t,getOr:o,or:n,getOrThunk:o,orThunk:n,getOrDie:o,each:t=>{t(e)},toOptional:()=>C.some(e)};return r},_l=e=>{const t=()=>o,o={tag:!1,inner:e,fold:(t,o)=>t(e),isValue:y,isError:x,map:t,mapError:t=>zl.error(t(e)),bind:t,exists:y,forall:x,getOr:h,or:h,getOrThunk:v,orThunk:v,getOrDie:(n=String(e),()=>{throw new Error(n)}),each:f,toOptional:C.none};var n;return o},zl={value:Bl,error:_l,fromOption:(e,t)=>e.fold((()=>_l(t)),Bl)},Al=(e,t)=>({rowDelta:0,colDelta:Vo(e[0])-Vo(t[0])}),Ll=(e,t)=>({rowDelta:e.length-t.length,colDelta:0}),Wl=(e,t,o,n)=>{const r="colgroup"===t.section?o.col:o.cell;return k(e,(e=>et(r(),!0,n(e))))},Ml=(e,t,o,n)=>{const r=e[e.length-1];return e.concat(k(t,(()=>{const e="colgroup"===r.section?o.colgroup:o.row,t=Uo(r,e,h),s=Wl(t.cells.length,t,o,(e=>X(n,e.toString())));return Fo(t,s)})))},jl=(e,t,o,n)=>E(e,(e=>{const r=Wl(t,e,o,y);return jo(e,n,r)})),Pl=(e,t,o)=>{const n=t.colDelta<0?jl:h,r=t.rowDelta<0?Ml:h,s=Yo(e),l=Vo(e[0]),a=O(s,(e=>e===l-1)),c=n(e,Math.abs(t.colDelta),o,a?l-1:l),i=Yo(c);return r(c,Math.abs(t.rowDelta),o,I(i,x))},Il=(e,t,o,n)=>{const r=w(n,Ho(e[t],o).element),s=e[t];return e.length>1&&Vo(s)>1&&(o>0&&r($o(s,o-1))||o0&&r($o(e[t-1],o))||t_(o,(o=>o>=e.column&&o<=Vo(t[0])+e.column)),Hl=(e,t,o,n,r)=>{((e,t,o,n)=>{t>0&&t{const r=e.cells[t-1];let s=0;const l=n();for(;e.cells.length>t+s&&o(r.element,e.cells[t+s].element);)Io(e,t+s,et(l,!0,e.cells[t+s].isLocked)),s++}))})(t,e,r,n.cell);const s=Ll(o,t),l=Pl(o,s,n),a=Ll(t,l),c=Pl(t,a,n);return E(c,((t,o)=>jo(t,e,l[o].cells)))},$l=(e,t,o,n,r)=>{((e,t,o,n)=>{const r=qo(e).rows;if(t>0&&tA(e,((e,o)=>O(e,(e=>t(e.element,o.element)))?e:e.concat([o])),[]))(r[t-1].cells,o);N(e,(e=>{let s=C.none();for(let l=t;l{Io(a,t,et(e,!0,c.isLocked))})))}}))}})(t,e,r,n.cell);const s=Yo(t),l=Al(t,o),a={...l,colDelta:l.colDelta-s.length},c=Pl(t,a,n),{cols:i,rows:m}=qo(c),d=Yo(c),u=Al(o,t),f={...u,colDelta:u.colDelta+d.length},g=(p=n,w=d,E(o,(e=>A(w,((t,o)=>{const n=Wl(1,e,p,x)[0];return Po(t,o,n)}),e)))),h=Pl(g,f,n);var p,w;return[...i,...m.slice(0,e),...h,...m.slice(e,m.length)]},Vl=(e,t,o,n,r)=>{const{rows:s,cols:l}=qo(e),a=s.slice(0,t),c=s.slice(t);return[...l,...a,((e,t,o,n)=>Uo(e,(e=>n(e,o)),t))(s[o],((e,o)=>t>0&&tE(e,(e=>{const s=t>0&&t{if("colgroup"!==o&&n)return Ho(e,t);{const t=Ho(e,r);return et(l(t.element,s),!0,!1)}})(e,t,e.section,s,o,n,r);return Po(e,t,l)})),Ul=(e,t,o,n)=>((e,t,o,n)=>void 0!==$o(e[t],o)&&t>0&&n($o(e[t-1],o),$o(e[t],o)))(e,t,o,n)||((e,t,o)=>t>0&&o($o(e,t-1),$o(e,t)))(e[t],o,n),Gl=(e,t,o,n)=>{const r=e=>(e=>"row"===e?Pt(t):jt(t))(e)?`${e}group`:e;return e?ol(t)?r(o):null:n&&ol(t)?r("row"===o?"col":"row"):null},Kl=(e,t,o)=>et(o(e.element,t),!0,e.isLocked),Yl=(e,t,o,n,r,s,l)=>E(e,((e,a)=>((e,c)=>{const i=e.cells,m=E(i,((e,c)=>{if((e=>O(t,(t=>o(e.element,t.element))))(e)){const t=l(e,a,c)?r(e,o,n):e;return s(t,a,c).each((e=>{var o,n;o=t.element,n={scope:C.from(e)},G(n,((e,t)=>{e.fold((()=>{be(o,t)}),(e=>{fe(o.dom,t,e)}))}))})),t}return e}));return tt(e.element,m,e.section,e.isNew)})(e))),Jl=(e,t,o)=>j(e,((n,r)=>Ul(e,r,t,o)?[]:[Ho(n,t)])),Ql=(e,t,o,n,r)=>{const s=qo(e).rows,l=j(t,(e=>Jl(s,e,n))),a=E(s,(e=>nl(e.cells))),c=((e,t)=>P(t,h)&&nl(e)?x:(e,o,n)=>!("th"===ne(e.element)&&t[o]))(l,a),i=((e,t)=>(o,n)=>C.some(Gl(e,o.element,"row",t[n])))(o,a);return Yl(e,l,n,r,Kl,i,c)},Xl=(e,t,o,n)=>{const r=qo(e).rows,s=E(t,(e=>Ho(r[e.row],e.column)));return Yl(e,s,o,n,Kl,C.none,x)},Zl=e=>{if(!l(e))throw new Error("cases must be an array");if(0===e.length)throw new Error("there must be at least one case");const t=[],o={};return N(e,((n,r)=>{const s=q(n);if(1!==s.length)throw new Error("one and only one name per case");const a=s[0],c=n[a];if(void 0!==o[a])throw new Error("duplicate key detected:"+a);if("cata"===a)throw new Error("cannot have a case named cata (sorry)");if(!l(c))throw new Error("case arguments must be an array");t.push(a),o[a]=(...o)=>{const n=o.length;if(n!==c.length)throw new Error("Wrong number of arguments to case "+a+". Expected "+c.length+" ("+c+"), got "+n);return{fold:(...t)=>{if(t.length!==e.length)throw new Error("Wrong number of arguments to fold. Expected "+e.length+", got "+t.length);return t[r].apply(null,o)},match:e=>{const n=q(e);if(t.length!==n.length)throw new Error("Wrong number of arguments to match. Expected: "+t.join(",")+"\nActual: "+n.join(","));if(!P(t,(e=>D(n,e))))throw new Error("Not all branches were specified when using match. Specified: "+n.join(", ")+"\nRequired: "+t.join(", "));return e[a].apply(null,o)},log:e=>{console.log(e,{constructors:t,constructor:a,params:o})}}}})),o},ea={...Zl([{none:[]},{only:["index"]},{left:["index","next"]},{middle:["prev","index","next"]},{right:["prev","index"]}])},ta=(e,t,o)=>{let n=0;for(let r=e;r{const o=rn(e);return E(o,(e=>{const o=ta(e.row,e.row+e.rowspan,t);return{element:e.element,height:o,rowspan:e.rowspan}}))},na=(e,t,o)=>{const n=((e,t)=>ln(e)?((e,t)=>{const o=sn(e);return E(o,((e,o)=>({element:e.element,width:t[o],colspan:e.colspan})))})(e,t):((e,t)=>{const o=rn(e);return E(o,(e=>{const o=ta(e.column,e.column+e.colspan,t);return{element:e.element,width:o,colspan:e.colspan}}))})(e,t))(e,t);N(n,(e=>{o.setElementWidth(e.element,e.width)}))},ra=(e,t,o,n,r)=>{const s=Zo(e),l=r.getCellDelta(t),a=r.getWidths(s,r),c=o===s.grid.columns-1,i=n.clampTableDelta(a,o,l,r.minCellWidth(),c),m=((e,t,o,n,r)=>{const s=e.slice(0),l=((e,t)=>0===e.length?ea.none():1===e.length?ea.only(0):0===t?ea.left(0,1):t===e.length-1?ea.right(t-1,t):t>0&&tn.singleColumnWidth(s[e],o)),((e,t)=>r.calcLeftEdgeDeltas(s,e,t,o,n.minCellWidth(),n.isRelative)),((e,t,l)=>r.calcMiddleDeltas(s,e,t,l,o,n.minCellWidth(),n.isRelative)),((e,t)=>r.calcRightEdgeDeltas(s,e,t,o,n.minCellWidth(),n.isRelative)))})(a,o,i,r,n),d=E(m,((e,t)=>e+a[t]));na(s,d,r),n.resizeTable(r.adjustTableWidth,i,c)},sa=e=>A(e,((e,t)=>O(e,(e=>e.column===t.column))?e:e.concat([t])),[]).sort(((e,t)=>e.column-t.column)),la=ue("col"),aa=ue("colgroup"),ca=e=>"tr"===ne(e)||aa(e),ia=e=>({element:e,colspan:Wt(e,"colspan",1),rowspan:Wt(e,"rowspan",1)}),ma=e=>we(e,"scope").map((e=>e.substr(0,3))),da=(e,t=ia)=>{const o=o=>{if(ca(o))return aa((r={element:o}).element)?e.colgroup(r):e.row(r);{const r=o,s=(t=>la(t.element)?e.col(t):e.cell(t))(t(r));return n=C.some({item:r,replacement:s}),s}var r};let n=C.none();return{getOrInit:(e,t)=>n.fold((()=>o(e)),(n=>t(e,n.item)?n.replacement:o(e)))}},ua=e=>t=>{const o=[],n=n=>{const r="td"===e?{scope:null}:{},s=t.replace(n,e,r);return o.push({item:n,sub:s}),s};return{replaceOrInit:(e,t)=>{if(ca(e)||la(e))return e;{const r=e;return((e,t)=>L(o,(o=>t(o.item,e))))(r,t).fold((()=>n(r)),(o=>t(e,o.item)?o.sub:n(r)))}}}},fa=e=>({unmerge:t=>{const o=ma(t);return o.each((e=>ge(t,"scope",e))),()=>{const n=e.cell({element:t,colspan:1,rowspan:1});return Lt(n,"width"),Lt(t,"width"),o.each((e=>ge(n,"scope",e))),n}},merge:e=>(Lt(e[0],"width"),(()=>{const t=yt(E(e,ma));if(0===t.length)return C.none();{const e=t[0],o=["row","col"];return O(t,(t=>t!==e&&D(o,t)))?C.none():C.from(e)}})().fold((()=>be(e[0],"scope")),(t=>ge(e[0],"scope",t+"group"))),g(e[0]))}),ga=["body","p","div","article","aside","figcaption","figure","footer","header","nav","section","ol","ul","table","thead","tfoot","tbody","caption","tr","td","th","h1","h2","h3","h4","h5","h6","blockquote","pre","address"],ha=hs(),pa=e=>((e,t)=>{const o=e.property().name(t);return D(ga,o)})(ha,e),wa=e=>((e,t)=>{const o=e.property().name(t);return D(["ol","ul"],o)})(ha,e),ba=e=>{const t=ue("br"),o=e=>Cr(e).bind((o=>{const n=Ae(o).map((e=>!!pa(e)||!!((e,t)=>D(["br","img","hr","input"],e.property().name(t)))(ha,e)&&"img"!==ne(e))).getOr(!1);return Ne(o).map((r=>{return!0===n||("li"===ne(s=r)||ft(s,wa).isSome())||t(o)||pa(r)&&!Re(e,r)?[]:[xe.fromTag("br")];var s}))})).getOr([]),n=(()=>{const n=j(e,(e=>{const n=Le(e);return(e=>P(e,(e=>t(e)||ie(e)&&0===hr(e).trim().length)))(n)?[]:n.concat(o(e))}));return 0===n.length?[xe.fromTag("br")]:n})();Ve(e[0]),$e(e[0],n)},va=e=>Qr(e,!0),ya=e=>{0===Ut(e).length&&qe(e)},xa=(e,t)=>({grid:e,cursor:t}),Ca=(e,t,o)=>{const n=((e,t,o)=>{var n,r;const s=qo(e).rows;return C.from(null===(r=null===(n=s[t])||void 0===n?void 0:n.cells[o])||void 0===r?void 0:r.element).filter(va).orThunk((()=>(e=>V(e,(e=>V(e.cells,(e=>{const t=e.element;return xt(va(t),t)})))))(s)))})(e,t,o);return xa(e,n)},Sa=e=>A(e,((e,t)=>O(e,(e=>e.row===t.row))?e:e.concat([t])),[]).sort(((e,t)=>e.row-t.row)),Ta=(e,t)=>(o,n,r,s,l)=>{const a=Sa(n),c=E(a,(e=>e.row)),i=((e,t,o,n,r,s,l)=>{const{cols:a,rows:c}=qo(e),i=c[t[0]],m=j(t,(e=>((e,t,o)=>{const n=e[t];return j(n.cells,((n,r)=>Ul(e,t,r,o)?[]:[n]))})(c,e,r))),d=E(i.cells,((e,t)=>nl(Jl(c,t,r)))),u=[...c];N(t,(e=>{u[e]=l.transformRow(c[e],o)}));const f=[...a,...u],g=((e,t)=>P(t,h)&&nl(e.cells)?x:(e,o,n)=>!("th"===ne(e.element)&&t[n]))(i,d),p=((e,t)=>(o,n,r)=>C.some(Gl(e,o.element,"col",t[r])))(n,d);return Yl(f,m,r,s,l.transformCell,p,g)})(o,c,e,t,r,s.replaceOrInit,l);return Ca(i,n[0].row,n[0].column)},Ra=Ta("thead",!0),Da=Ta("tbody",!1),Oa=Ta("tfoot",!1),ka=(e,t,o)=>{const n=((e,t)=>Qt(e,(()=>t)))(e,o.section),r=en(n);return xl(r,t,!0)},Ea=(e,t,o,n)=>((e,t,o,n)=>{const r=en(t),s=n.getWidths(r,n);na(r,s,n)})(0,t,0,n.sizing),Na=(e,t,o,n)=>((e,t,o,n,r)=>{const s=en(t),l=n.getWidths(s,n),a=n.pixelWidth(),{newSizes:c,delta:i}=r.calcRedestributedWidths(l,a,o.pixelDelta,n.isRelative);na(s,c,n),n.adjustTableWidth(i)})(0,t,o,n.sizing,n.resize),Ba=(e,t)=>O(t,(e=>0===e.column&&e.isLocked)),_a=(e,t)=>O(t,(t=>t.column+t.colspan>=e.grid.columns&&t.isLocked)),za=(e,t)=>{const o=cn(e),n=sa(t);return A(n,((e,t)=>e+o[t.column].map(Wo).getOr(0)),0)},Aa=e=>(t,o)=>Ol(t,o).filter((o=>!(e?Ba:_a)(t,o))).map((e=>({details:e,pixelDelta:za(t,e)}))),La=e=>(t,o)=>Dl(t,o).filter((o=>!(e?Ba:_a)(t,o.cells))),Wa=ua("th"),Ma=ua("td"),ja=Rl(((e,t,o,n)=>{const r=t[0].row,s=Sa(t),l=z(s,((e,t)=>({grid:Vl(e.grid,r,t.row+e.delta,o,n.getOrInit),delta:e.delta+1})),{grid:e,delta:0}).grid;return Ca(l,r,t[0].column)}),Ol,f,f,da),Pa=Rl(((e,t,o,n)=>{const r=Sa(t),s=r[r.length-1],l=s.row+s.rowspan,a=z(r,((e,t)=>Vl(e,l,t.row,o,n.getOrInit)),e);return Ca(a,l,t[0].column)}),Ol,f,f,da),Ia=Rl(((e,t,o,n)=>{const r=t.details,s=sa(r),l=s[0].column,a=z(s,((e,t)=>({grid:ql(e.grid,l,t.column+e.delta,o,n.getOrInit),delta:e.delta+1})),{grid:e,delta:0}).grid;return Ca(a,r[0].row,l)}),Aa(!0),Na,f,da),Fa=Rl(((e,t,o,n)=>{const r=t.details,s=r[r.length-1],l=s.column+s.colspan,a=sa(r),c=z(a,((e,t)=>ql(e,l,t.column,o,n.getOrInit)),e);return Ca(c,r[0].row,l)}),Aa(!1),Na,f,da),Ha=Rl(((e,t,o,n)=>{const r=sa(t.details),s=((e,t)=>j(e,(e=>{const o=e.cells,n=z(t,((e,t)=>t>=0&&t0?[tt(e.element,n,e.section,e.isNew)]:[]})))(e,E(r,(e=>e.column))),l=s.length>0?s[0].cells.length-1:0;return Ca(s,r[0].row,Math.min(r[0].column,l))}),((e,t)=>kl(e,t).map((t=>({details:t,pixelDelta:-za(e,t)})))),Na,ya,da),$a=Rl(((e,t,o,n)=>{const r=Sa(t),s=((e,t,o)=>{const{rows:n,cols:r}=qo(e);return[...r,...n.slice(0,t),...n.slice(o+1)]})(e,r[0].row,r[r.length-1].row),l=s.length>0?s.length-1:0;return Ca(s,Math.min(t[0].row,l),t[0].column)}),Ol,f,ya,da),Va=Rl(((e,t,o,n)=>{const r=sa(t),s=E(r,(e=>e.column)),l=Ql(e,s,!0,o,n.replaceOrInit);return Ca(l,t[0].row,t[0].column)}),kl,f,f,Wa),qa=Rl(((e,t,o,n)=>{const r=sa(t),s=E(r,(e=>e.column)),l=Ql(e,s,!1,o,n.replaceOrInit);return Ca(l,t[0].row,t[0].column)}),kl,f,f,Ma),Ua=Rl(Ra,kl,f,f,Wa),Ga=Rl(Da,kl,f,f,Ma),Ka=Rl(Oa,kl,f,f,Ma),Ya=Rl(((e,t,o,n)=>{const r=Xl(e,t,o,n.replaceOrInit);return Ca(r,t[0].row,t[0].column)}),kl,f,f,Wa),Ja=Rl(((e,t,o,n)=>{const r=Xl(e,t,o,n.replaceOrInit);return Ca(r,t[0].row,t[0].column)}),kl,f,f,Ma),Qa=Rl(((e,t,o,n)=>{const r=t.cells;ba(r);const s=((e,t,o,n)=>{const r=qo(e).rows;if(0===r.length)return e;for(let e=t.startRow;e<=t.finishRow;e++)for(let o=t.startCol;o<=t.finishCol;o++){const t=r[e],s=Ho(t,o).isLocked;Io(t,o,et(n(),!1,s))}return e})(e,t.bounds,0,n.merge(r));return xa(s,C.from(r[0]))}),((e,t)=>((e,t)=>t.mergable)(0,t).filter((t=>El(e,t.cells)))),Ea,f,fa),Xa=Rl(((e,t,o,n)=>{const r=z(t,((e,t)=>Nl(e,t,o,n.unmerge(t))),e);return xa(r,C.from(t[0]))}),((e,t)=>((e,t)=>t.unmergable)(0,t).filter((t=>El(e,t)))),Ea,f,fa),Za=Rl(((e,t,o,n)=>{const r=((e,t)=>{const o=Zo(e);return xl(o,t,!0)})(t.clipboard,t.generators);var s,l;return((e,t,o,n,r)=>{const s=Yo(t),l=((e,t,o)=>{const n=Vo(t[0]),r=qo(t).cols.length+e.row,s=k(n-e.column,(t=>t+e.column));return{row:r,column:L(s,(e=>P(o,(t=>t!==e)))).getOr(n-1)}})(e,t,s),a=qo(o).rows,c=Fl(l,a,s),i=((e,t,o)=>{if(e.row>=t.length||e.column>Vo(t[0]))return zl.error("invalid start address out of table bounds, row: "+e.row+", column: "+e.column);const n=t.slice(e.row),r=n[0].cells.slice(e.column),s=Vo(o[0]),l=o.length;return zl.value({rowDelta:n.length-l,colDelta:r.length-s})})(l,t,a);return i.map((e=>{const o={...e,colDelta:e.colDelta-c.length},s=Pl(t,o,n),i=Yo(s),m=Fl(l,a,i);return((e,t,o,n,r,s)=>{const l=e.row,a=e.column,c=l+o.length,i=a+Vo(o[0])+s.length,m=I(s,x);for(let e=l;exa(e,C.some(t.element))),(e=>Ca(e,t.row,t.column)))}),((e,t)=>qt(t.element).bind((o=>Sl(e,o).map((e=>({...e,generators:t.generators,clipboard:t.clipboard})))))),Ea,f,da),ec=Rl(((e,t,o,n)=>{const r=qo(e).rows,s=t.cells[0].column,l=r[t.cells[0].row],a=ka(t.clipboard,t.generators,l),c=Hl(s,e,a,t.generators,o);return Ca(c,t.cells[0].row,t.cells[0].column)}),La(!0),f,f,da),tc=Rl(((e,t,o,n)=>{const r=qo(e).rows,s=t.cells[t.cells.length-1].column+t.cells[t.cells.length-1].colspan,l=r[t.cells[0].row],a=ka(t.clipboard,t.generators,l),c=Hl(s,e,a,t.generators,o);return Ca(c,t.cells[0].row,t.cells[0].column)}),La(!1),f,f,da),oc=Rl(((e,t,o,n)=>{const r=qo(e).rows,s=t.cells[0].row,l=r[s],a=ka(t.clipboard,t.generators,l),c=$l(s,e,a,t.generators,o);return Ca(c,t.cells[0].row,t.cells[0].column)}),Dl,f,f,da),nc=Rl(((e,t,o,n)=>{const r=qo(e).rows,s=t.cells[t.cells.length-1].row+t.cells[t.cells.length-1].rowspan,l=r[t.cells[0].row],a=ka(t.clipboard,t.generators,l),c=$l(s,e,a,t.generators,o);return Ca(c,t.cells[0].row,t.cells[0].column)}),Dl,f,f,da),rc=(e,t)=>{const o=Zo(e);return Ol(o,t).bind((e=>{const t=e[e.length-1],n=e[0].column,r=t.column+t.colspan,s=M(E(o.all,(e=>_(e.cells,(e=>e.column>=n&&e.column{const o=Zo(e);return Ol(o,t).bind(ll).getOr("")},lc=(e,t)=>{const o=Zo(e);return Ol(o,t).bind((e=>{const t=e[e.length-1],n=e[0].row,r=t.row+t.rowspan;return(e=>{const t=E(e,(e=>sl(e).type)),o=D(t,"header"),n=D(t,"footer");if(o||n){const e=D(t,"body");return!o||e||n?o||e||!n?C.none():C.some("footer"):C.some("header")}return C.some("body")})(o.all.slice(n,r))})).getOr("")},ac=(e,t)=>e.dispatch("NewRow",{node:t}),cc=(e,t)=>e.dispatch("NewCell",{node:t}),ic=(e,t,o)=>{e.dispatch("TableModified",{...o,table:t})},mc={structure:!1,style:!0},dc={structure:!0,style:!1},uc={structure:!0,style:!0},fc=(e,t)=>Hr(e)?ur(t):$r(e)?dr(t):mr(t),gc=(e,t,o)=>{const n=e=>"table"===ne(Zr(e)),r=Wr(e),s=Ir(e)?f:Gs,l=t=>{switch(Mr(e)){case"section":return ul();case"sectionCells":return fl();case"cells":return gl();default:return((e,t)=>{var o;switch((o=Zo(e),V(o.all,(e=>{const t=sl(e);return"header"===t.type?C.from(t.subType):C.none()}))).getOr(t)){case"section":return il();case"sectionCells":return ml();case"cells":return dl()}})(t,"section")}},a=(n,s,a,c)=>(i,m,d=!1)=>{ts(i);const u=xe.fromDom(e.getDoc()),f=Br(a,u,r),g={sizing:fc(e,i),resize:Ir(e)?Zs():el(),section:l(i)};return s(i)?n(i,m,f,g).bind((n=>{t.refresh(i.dom),N(n.newRows,(t=>{ac(e,t.dom)})),N(n.newCells,(t=>{cc(e,t.dom)}));const r=((t,n)=>n.cursor.fold((()=>{const n=Ut(t);return H(n).filter(lt).map((n=>{o.clearSelectedCells(t.dom);const r=e.dom.createRng();return r.selectNode(n.dom),e.selection.setRng(r),ge(n,"data-mce-selected","1"),r}))}),(n=>{const r=qs(Us,n),s=e.dom.createRng();return s.setStart(r.element.dom,r.offset),s.setEnd(r.element.dom,r.offset),e.selection.setRng(s),o.clearSelectedCells(t.dom),C.some(s)})))(i,n);return lt(i)&&(ts(i),d||ic(e,i.dom,c)),r.map((e=>({rng:e,effect:c})))})):C.none()},c=a($a,(t=>!n(e)||tl(t).rows>1),f,dc),i=a(Ha,(t=>!n(e)||tl(t).columns>1),f,dc);return{deleteRow:c,deleteColumn:i,insertRowsBefore:a(ja,x,f,dc),insertRowsAfter:a(Pa,x,f,dc),insertColumnsBefore:a(Ia,x,s,dc),insertColumnsAfter:a(Fa,x,s,dc),mergeCells:a(Qa,x,f,dc),unmergeCells:a(Xa,x,f,dc),pasteColsBefore:a(ec,x,f,dc),pasteColsAfter:a(tc,x,f,dc),pasteRowsBefore:a(oc,x,f,dc),pasteRowsAfter:a(nc,x,f,dc),pasteCells:a(Za,x,f,uc),makeCellsHeader:a(Ya,x,f,dc),unmakeCellsHeader:a(Ja,x,f,dc),makeColumnsHeader:a(Va,x,f,dc),unmakeColumnsHeader:a(qa,x,f,dc),makeRowsHeader:a(Ua,x,f,dc),makeRowsBody:a(Ga,x,f,dc),makeRowsFooter:a(Ka,x,f,dc),getTableRowType:lc,getTableCellType:sc,getTableColType:rc}},hc=(e,t,o)=>{const n=Wt(e,t,1);1===o||n<=1?be(e,t):ge(e,t,Math.min(o,n))},pc=(e,t)=>o=>{const n=o.column+o.colspan-1,r=o.column;return n>=e&&r{const n=o.substring(0,o.length-e.length),r=parseFloat(n);return n===r.toString()?t(r):wc.invalid(o)},vc={...wc,from:e=>Rt(e,"%")?bc("%",wc.percent,e):Rt(e,"px")?bc("px",wc.pixels,e):wc.invalid(e)},yc=(e,t,o)=>{const n=vc.from(o),r=P(e,(e=>"0px"===e))?((e,t)=>{const o=e.fold((()=>g("")),(e=>g(e/t+"px")),(()=>g(100/t+"%")));return k(t,o)})(n,e.length):((e,t,o)=>e.fold((()=>t),(e=>((e,t,o)=>{const n=o/t;return E(e,(e=>vc.from(e).fold((()=>e),(e=>e*n+"px"),(e=>e/100*o+"px"))))})(t,o,e)),(e=>((e,t)=>E(e,(e=>vc.from(e).fold((()=>e),(e=>e/t*100+"%"),(e=>e+"%")))))(t,o))))(n,e,t);return Sc(r)},xc=(e,t)=>0===e.length?t:z(e,((e,t)=>vc.from(t).fold(g(0),h,h)+e),0),Cc=(e,t)=>vc.from(e).fold(g(e),(e=>e+t+"px"),(e=>e+t+"%")),Sc=e=>{if(0===e.length)return e;const t=z(e,((e,t)=>{const o=vc.from(t).fold((()=>({value:t,remainder:0})),(e=>((e,t)=>{const o=Math.floor(e);return{value:o+"px",remainder:e-o}})(e)),(e=>({value:e+"%",remainder:0})));return{output:[o.value].concat(e.output),remainder:e.remainder+o.remainder}}),{output:[],remainder:0}),o=t.output;return o.slice(0,o.length-1).concat([Cc(o[o.length-1],Math.round(t.remainder))])},Tc=vc.from,Rc=e=>Tc(e).fold(g("px"),g("px"),g("%")),Dc=(e,t,o)=>{const n=Zo(e),r=n.all,s=rn(n),l=sn(n);t.each((t=>{const o=Rc(t),r=Lo(e),a=((e,t)=>nr(e,t,er,rr))(n,e),c=yc(a,r,t);ln(n)?((e,t,o)=>{N(t,((t,n)=>{const r=xc([e[n]],Ft());Nt(t.element,"width",r+o)}))})(c,l,o):((e,t,o)=>{N(t,(t=>{const n=e.slice(t.column,t.colspan+t.column),r=xc(n,Ft());Nt(t.element,"width",r+o)}))})(c,s,o),Nt(e,"width",t)})),o.each((t=>{const o=Rc(t),l=hn(e),a=((e,t,o)=>lr(e,t,o,tr,rr))(n,e,_n);((e,t,o,n)=>{N(o,(t=>{const o=e.slice(t.row,t.rowspan+t.row),r=xc(o,Ht());Nt(t.element,"height",r+n)})),N(t,((t,o)=>{Nt(t.element,"height",e[o])}))})(yc(a,l,t),r,s,o),Nt(e,"height",t)}))},Oc=e=>Un(e).exists((e=>Mn.test(e))),kc=e=>Un(e).exists((e=>jn.test(e))),Ec=e=>Un(e).isNone(),Nc=e=>{be(e,"width")},Bc=e=>{const t=Qn(e);Dc(e,C.some(t),C.none()),Nc(e)},_c=e=>{const t=(e=>Lo(e)+"px")(e);Dc(e,C.some(t),C.none()),Nc(e)},zc=e=>{Lt(e,"width");const t=Gt(e),o=t.length>0?t:Ut(e);N(o,(e=>{Lt(e,"width"),Nc(e)})),Nc(e)},Ac={styles:{"border-collapse":"collapse",width:"100%"},attributes:{border:"1"},colGroups:!1},Lc=(e,t,o,n)=>k(e,(e=>((e,t,o,n)=>{const r=xe.fromTag("tr");for(let s=0;s{e.selection.select(t.dom,!0),e.selection.collapse(!0)},Mc=(e,t,o,n,s)=>{const l=(e=>{const t=e.options,o=t.get("table_default_styles");return t.isSet("table_default_styles")?o:((e,t)=>Vr(e)||!Ur(e)?t:$r(e)?{...t,width:Lr(e)}:{...t,width:Ar})(e,o)})(e),a={styles:l,attributes:Kr(e),colGroups:Yr(e)};return e.undoManager.ignore((()=>{const r=((e,t,o,n,r,s=Ac)=>{const l=xe.fromTag("table"),a="cells"!==r;Bt(l,s.styles),he(l,s.attributes),s.colGroups&&Ie(l,(e=>{const t=xe.fromTag("colgroup");return k(e,(()=>Ie(t,xe.fromTag("col")))),t})(t));const c=Math.min(e,o);if(a&&o>0){const e=xe.fromTag("thead");Ie(l,e);const s=Lc(o,t,"sectionCells"===r?c:0,n);$e(e,s)}const i=xe.fromTag("tbody");Ie(l,i);const m=Lc(a?e-c:e,t,a?0:o,n);return $e(i,m),l})(o,t,s,n,Mr(e),a);ge(r,"data-mce-id","__mce");const l=(e=>{const t=xe.fromTag("div"),o=xe.fromDom(e.dom.cloneNode(!0));return Ie(t,o),(e=>e.dom.innerHTML)(t)})(r);e.insertContent(l),e.addVisual()})),wt(Zr(e),'table[data-mce-id="__mce"]').map((t=>($r(e)?_c(t):Vr(e)?zc(t):(Hr(e)||(e=>r(e)&&-1!==e.indexOf("%"))(l.width))&&Bc(t),ts(t),be(t,"data-mce-id"),((e,t)=>{N(dt(t,"tr"),(t=>{ac(e,t.dom),N(dt(t,"th,td"),(t=>{cc(e,t.dom)}))}))})(e,t),((e,t)=>{wt(t,"td,th").each(w(Wc,e))})(e,t),t.dom))).getOrNull()};var jc=tinymce.util.Tools.resolve("tinymce.FakeClipboard");const Pc="x-tinymce/dom-table-",Ic=Pc+"rows",Fc=Pc+"columns",Hc=e=>{const t=jc.FakeClipboardItem(e);jc.write([t])},$c=e=>{var t;const o=null!==(t=jc.read())&&void 0!==t?t:[];return V(o,(t=>C.from(t.getType(e))))},Vc=e=>{$c(e).isSome()&&jc.clear()},qc=e=>{e.fold(Gc,(e=>Hc({[Ic]:e})))},Uc=()=>$c(Ic),Gc=()=>Vc(Ic),Kc=e=>{e.fold(Jc,(e=>Hc({[Fc]:e})))},Yc=()=>$c(Fc),Jc=()=>Vc(Fc),Qc=e=>Ms(os(e),es(e)).filter(ss),Xc=(e,t)=>{const o=es(e),n=e=>Kt(e,o),l=t=>(e=>js(os(e),es(e)).filter(ss))(e).bind((e=>n(e).map((o=>t(o,e))))),a=t=>{e.focus()},c=(t,o=!1)=>l(((n,r)=>{const s=Ls(Ps(e),n,r);t(n,s,o).each(a)})),i=()=>l(((t,o)=>((e,t,o)=>{const n=Zo(e);return Ol(n,t).bind((e=>{const t=xl(n,o,!1),r=qo(t).rows.slice(e[0].row,e[e.length-1].row+e[e.length-1].rowspan),s=j(r,(e=>{const t=_(e.cells,(e=>!e.isLocked));return t.length>0?[{...e,cells:t}]:[]})),l=Cl(s);return xt(l.length>0,l)})).map((e=>E(e,(e=>{const t=Ke(e.element);return N(e.cells,(e=>{const o=Ye(e.element);pl(o,"colspan",e.colspan,1),pl(o,"rowspan",e.rowspan,1),Ie(t,o)})),t}))))})(t,Ls(Ps(e),t,o),Br(f,xe.fromDom(e.getDoc()),C.none())))),m=()=>l(((t,o)=>((e,t)=>{const o=Zo(e);return kl(o,t).map((e=>{const t=e[e.length-1],n=e[0].column,r=t.column+t.colspan,s=((e,t,o)=>{if(ln(e)){const n=_(sn(e),pc(t,o)),r=E(n,(e=>{const n=Ye(e.element);return hc(n,"span",o-t),n})),s=xe.fromTag("colgroup");return $e(s,r),[s]}return[]})(o,n,r),l=((e,t,o)=>E(e.all,(e=>{const n=_(e.cells,pc(t,o)),r=E(n,(e=>{const n=Ye(e.element);return hc(n,"colspan",o-t),n})),s=xe.fromTag("tr");return $e(s,r),s})))(o,n,r);return[...s,...l]}))})(t,Ls(Ps(e),t,o)))),d=(t,o)=>o().each((o=>{const n=E(o,(e=>Ye(e)));l(((o,r)=>{const s=_r(xe.fromDom(e.getDoc())),l=((e,t,o,n)=>({selection:Os(e),clipboard:o,generators:n}))(Ps(e),0,n,s);t(o,l).each(a)}))})),g=e=>(t,o)=>((e,t)=>X(e,t)?C.from(e[t]):C.none())(o,"type").each((t=>{c(e(t),o.no_events)}));G({mceTableSplitCells:()=>c(t.unmergeCells),mceTableMergeCells:()=>c(t.mergeCells),mceTableInsertRowBefore:()=>c(t.insertRowsBefore),mceTableInsertRowAfter:()=>c(t.insertRowsAfter),mceTableInsertColBefore:()=>c(t.insertColumnsBefore),mceTableInsertColAfter:()=>c(t.insertColumnsAfter),mceTableDeleteCol:()=>c(t.deleteColumn),mceTableDeleteRow:()=>c(t.deleteRow),mceTableCutCol:()=>m().each((e=>{Kc(e),c(t.deleteColumn)})),mceTableCutRow:()=>i().each((e=>{qc(e),c(t.deleteRow)})),mceTableCopyCol:()=>m().each((e=>Kc(e))),mceTableCopyRow:()=>i().each((e=>qc(e))),mceTablePasteColBefore:()=>d(t.pasteColsBefore,Yc),mceTablePasteColAfter:()=>d(t.pasteColsAfter,Yc),mceTablePasteRowBefore:()=>d(t.pasteRowsBefore,Uc),mceTablePasteRowAfter:()=>d(t.pasteRowsAfter,Uc),mceTableDelete:()=>Qc(e).each((t=>{Kt(t,o).filter(b(o)).each((t=>{const o=xe.fromText("");if(je(t,o),qe(t),e.dom.isEmpty(e.getBody()))e.setContent(""),e.selection.setCursorLocation();else{const t=e.dom.createRng();t.setStart(o.dom,0),t.setEnd(o.dom,0),e.selection.setRng(t),e.nodeChanged()}}))})),mceTableCellToggleClass:(t,o)=>{l((t=>{const n=Ps(e),r=P(n,(t=>e.formatter.match("tablecellclass",{value:o},t.dom))),s=r?e.formatter.remove:e.formatter.apply;N(n,(e=>s("tablecellclass",{value:o},e.dom))),ic(e,t.dom,mc)}))},mceTableToggleClass:(t,o)=>{l((t=>{e.formatter.toggle("tableclass",{value:o},t.dom),ic(e,t.dom,mc)}))},mceTableToggleCaption:()=>{Qc(e).each((t=>{Kt(t,o).each((o=>{pt(o,"caption").fold((()=>{const t=xe.fromTag("caption");Ie(t,xe.fromText("Caption")),((e,t,o)=>{We(e,0).fold((()=>{Ie(e,t)}),(e=>{Me(e,t)}))})(o,t),e.selection.setCursorLocation(t.dom,0)}),(n=>{ue("caption")(t)&&Te("td",o).each((t=>e.selection.setCursorLocation(t.dom,0))),qe(n)})),ic(e,o.dom,dc)}))}))},mceTableSizingMode:(t,n)=>(t=>Qc(e).each((n=>{Vr(e)||$r(e)||Hr(e)||Kt(n,o).each((o=>{"relative"!==t||Oc(o)?"fixed"!==t||kc(o)?"responsive"!==t||Ec(o)||zc(o):_c(o):Bc(o),ts(o),ic(e,o.dom,dc)}))})))(n),mceTableCellType:g((e=>"th"===e?t.makeCellsHeader:t.unmakeCellsHeader)),mceTableColType:g((e=>"th"===e?t.makeColumnsHeader:t.unmakeColumnsHeader)),mceTableRowType:g((e=>{switch(e){case"header":return t.makeRowsHeader;case"footer":return t.makeRowsFooter;default:return t.makeRowsBody}}))},((t,o)=>e.addCommand(o,t))),e.addCommand("mceInsertTable",((t,o)=>{((e,t,o,n={})=>{const r=e=>u(e)&&e>0;if(r(t)&&r(o)){const r=n.headerRows||0,s=n.headerColumns||0;return Mc(e,o,t,s,r)}console.error("Invalid values for mceInsertTable - rows and columns values are required to insert a table.")})(e,o.rows,o.columns,o.options)})),e.addCommand("mceTableApplyCellStyle",((t,o)=>{const l=e=>"tablecell"+e.toLowerCase().replace("-","");if(!s(o))return;const a=_(Ps(e),ss);if(0===a.length)return;const c=((e,t)=>{const o={};return((e,t,o,n)=>{G(e,((e,r)=>{(t(e,r)?o:n)(e,r)}))})(e,t,(e=>(t,o)=>{e[o]=t})(o),f),o})(o,((t,o)=>e.formatter.has(l(o))&&r(t)));(e=>{for(const t in e)if(U.call(e,t))return!1;return!0})(c)||(G(c,((t,o)=>{const n=l(o);N(a,(o=>{""===t?e.formatter.remove(n,{value:null},o.dom,!0):e.formatter.apply(n,{value:t},o.dom)}))})),n(a[0]).each((t=>ic(e,t.dom,mc))))}))},Zc=Zl([{before:["element"]},{on:["element","offset"]},{after:["element"]}]),ei={before:Zc.before,on:Zc.on,after:Zc.after,cata:(e,t,o,n)=>e.fold(t,o,n),getStart:e=>e.fold(h,h,h)},ti=(e,t)=>({selection:e,kill:t}),oi=(e,t)=>{const o=e.document.createRange();return o.selectNode(t.dom),o},ni=(e,t)=>{const o=e.document.createRange();return ri(o,t),o},ri=(e,t)=>e.selectNodeContents(t.dom),si=(e,t,o)=>{const n=e.document.createRange();var r;return r=n,t.fold((e=>{r.setStartBefore(e.dom)}),((e,t)=>{r.setStart(e.dom,t)}),(e=>{r.setStartAfter(e.dom)})),((e,t)=>{t.fold((t=>{e.setEndBefore(t.dom)}),((t,o)=>{e.setEnd(t.dom,o)}),(t=>{e.setEndAfter(t.dom)}))})(n,o),n},li=(e,t,o,n,r)=>{const s=e.document.createRange();return s.setStart(t.dom,o),s.setEnd(n.dom,r),s},ai=e=>({left:e.left,top:e.top,right:e.right,bottom:e.bottom,width:e.width,height:e.height}),ci=Zl([{ltr:["start","soffset","finish","foffset"]},{rtl:["start","soffset","finish","foffset"]}]),ii=(e,t,o)=>t(xe.fromDom(o.startContainer),o.startOffset,xe.fromDom(o.endContainer),o.endOffset),mi=(e,t)=>{const o=((e,t)=>t.match({domRange:e=>({ltr:g(e),rtl:C.none}),relative:(t,o)=>({ltr:eo((()=>si(e,t,o))),rtl:eo((()=>C.some(si(e,o,t))))}),exact:(t,o,n,r)=>({ltr:eo((()=>li(e,t,o,n,r))),rtl:eo((()=>C.some(li(e,n,r,t,o))))})}))(e,t);return((e,t)=>{const o=t.ltr();return o.collapsed?t.rtl().filter((e=>!1===e.collapsed)).map((e=>ci.rtl(xe.fromDom(e.endContainer),e.endOffset,xe.fromDom(e.startContainer),e.startOffset))).getOrThunk((()=>ii(0,ci.ltr,o))):ii(0,ci.ltr,o)})(0,o)},di=(e,t)=>mi(e,t).match({ltr:(t,o,n,r)=>{const s=e.document.createRange();return s.setStart(t.dom,o),s.setEnd(n.dom,r),s},rtl:(t,o,n,r)=>{const s=e.document.createRange();return s.setStart(n.dom,r),s.setEnd(t.dom,o),s}});ci.ltr,ci.rtl;const ui=(e,t,o,n)=>({start:e,soffset:t,finish:o,foffset:n}),fi=(e,t,o,n)=>({start:ei.on(e,t),finish:ei.on(o,n)}),gi=(e,t)=>{const o=di(e,t);return ui(xe.fromDom(o.startContainer),o.startOffset,xe.fromDom(o.endContainer),o.endOffset)},hi=fi,pi=(e,t,o,n,r)=>Re(o,n)?C.none():xs(o,n,t).bind((t=>{const n=t.boxes.getOr([]);return n.length>1?(r(e,n,t.start,t.finish),C.some(ti(C.some(hi(o,0,o,br(o))),!0))):C.none()})),wi=(e,t)=>({item:e,mode:t}),bi=(e,t,o,n=vi)=>e.property().parent(t).map((e=>wi(e,n))),vi=(e,t,o,n=yi)=>o.sibling(e,t).map((e=>wi(e,n))),yi=(e,t,o,n=yi)=>{const r=e.property().children(t);return o.first(r).map((e=>wi(e,n)))},xi=[{current:bi,next:vi,fallback:C.none()},{current:vi,next:yi,fallback:C.some(bi)},{current:yi,next:yi,fallback:C.some(vi)}],Ci=(e,t,o,n,r=xi)=>L(r,(e=>e.current===o)).bind((o=>o.current(e,t,n,o.next).orThunk((()=>o.fallback.bind((o=>Ci(e,t,o,n))))))),Si=(e,t,o,n,r,s)=>Ci(e,t,n,r).bind((t=>s(t.item)?C.none():o(t.item)?C.some(t.item):Si(e,t.item,o,t.mode,r,s))),Ti=e=>t=>0===e.property().children(t).length,Ri=(e,t,o,n)=>Si(e,t,o,vi,{sibling:(e,t)=>e.query().prevSibling(t),first:e=>e.length>0?C.some(e[e.length-1]):C.none()},n),Di=(e,t,o,n)=>Si(e,t,o,vi,{sibling:(e,t)=>e.query().nextSibling(t),first:e=>e.length>0?C.some(e[0]):C.none()},n),Oi=hs(),ki=(e,t)=>((e,t,o)=>Ri(e,t,Ti(e),o))(Oi,e,t),Ei=(e,t)=>((e,t,o)=>Di(e,t,Ti(e),o))(Oi,e,t),Ni=Zl([{none:["message"]},{success:[]},{failedUp:["cell"]},{failedDown:["cell"]}]),Bi=e=>bt(e,"tr"),_i={...Ni,verify:(e,t,o,n,r,s,l)=>bt(n,"td,th",l).bind((o=>bt(t,"td,th",l).map((t=>Re(o,t)?Re(n,o)&&br(o)===r?s(t):Ni.none("in same cell"):vs(Bi,[o,t]).fold((()=>((e,t,o)=>{const n=e.getRect(t),r=e.getRect(o);return r.right>n.left&&r.lefts(t))))))).getOr(Ni.none("default")),cata:(e,t,o,n,r)=>e.fold(t,o,n,r)},zi=ue("br"),Ai=(e,t,o)=>t(e,o).bind((e=>ie(e)&&0===hr(e).trim().length?Ai(e,t,o):C.some(e))),Li=(e,t,o,n)=>((e,t)=>We(e,t).filter(zi).orThunk((()=>We(e,t-1).filter(zi))))(t,o).bind((t=>n.traverse(t).fold((()=>Ai(t,n.gather,e).map(n.relative)),(e=>(e=>Ne(e).bind((t=>{const o=Le(t);return((e,t)=>W(e,w(Re,t)))(o,e).map((n=>((e,t,o,n)=>({parent:e,children:t,element:o,index:n}))(t,o,e,n)))})))(e).map((e=>ei.on(e.parent,e.index))))))),Wi=(e,t)=>({left:e.left,top:e.top+t,right:e.right,bottom:e.bottom+t}),Mi=(e,t)=>({left:e.left,top:e.top-t,right:e.right,bottom:e.bottom-t}),ji=(e,t,o)=>({left:e.left+t,top:e.top+o,right:e.right+t,bottom:e.bottom+o}),Pi=e=>({left:e.left,top:e.top,right:e.right,bottom:e.bottom}),Ii=(e,t)=>C.some(e.getRect(t)),Fi=(e,t,o)=>ce(t)?Ii(e,t).map(Pi):ie(t)?((e,t,o)=>o>=0&&o0?e.getRangedRect(t,o-1,t,o):C.none())(e,t,o).map(Pi):C.none(),Hi=(e,t)=>ce(t)?Ii(e,t).map(Pi):ie(t)?e.getRangedRect(t,0,t,br(t)).map(Pi):C.none(),$i=Zl([{none:[]},{retry:["caret"]}]),Vi=(e,t,o)=>gt(t,pa).fold(y,(t=>Hi(e,t).exists((e=>((e,t)=>e.leftt.right)(o,e))))),qi={point:e=>e.bottom,adjuster:(e,t,o,n,r)=>{const s=Wi(r,5);return Math.abs(o.bottom-n.bottom)<1||o.top>r.bottom?$i.retry(s):o.top===r.bottom?$i.retry(Wi(r,1)):Vi(e,t,r)?$i.retry(ji(s,5,0)):$i.none()},move:Wi,gather:Ei},Ui=(e,t,o,n,r)=>0===r?C.some(n):((e,t,o)=>e.elementFromPoint(t,o).filter((e=>"table"===ne(e))).isSome())(e,n.left,t.point(n))?((e,t,o,n,r)=>Ui(e,t,o,t.move(n,5),r))(e,t,o,n,r-1):e.situsFromPoint(n.left,t.point(n)).bind((s=>s.start.fold(C.none,(s=>Hi(e,s).bind((l=>t.adjuster(e,s,l,o,n).fold(C.none,(n=>Ui(e,t,o,n,r-1))))).orThunk((()=>C.some(n)))),C.none))),Gi=(e,t,o)=>{const n=e.move(o,5),r=Ui(t,e,o,n,100).getOr(n);return((e,t,o)=>e.point(t)>o.getInnerHeight()?C.some(e.point(t)-o.getInnerHeight()):e.point(t)<0?C.some(-e.point(t)):C.none())(e,r,t).fold((()=>t.situsFromPoint(r.left,e.point(r))),(o=>(t.scrollBy(0,o),t.situsFromPoint(r.left,e.point(r)-o))))},Ki={tryUp:w(Gi,{point:e=>e.top,adjuster:(e,t,o,n,r)=>{const s=Mi(r,5);return Math.abs(o.top-n.top)<1||o.bottome.getSelection().bind((n=>((e,t,o,n)=>{const r=zi(t)?((e,t,o)=>o.traverse(t).orThunk((()=>Ai(t,o.gather,e))).map(o.relative))(e,t,n):Li(e,t,o,n);return r.map((e=>({start:e,finish:e})))})(t,n.finish,n.foffset,o).fold((()=>C.some(Fs(n.finish,n.foffset))),(r=>{const s=e.fromSitus(r);return l=_i.verify(e,n.finish,n.foffset,s.finish,s.foffset,o.failure,t),_i.cata(l,(e=>C.none()),(()=>C.none()),(e=>C.some(Fs(e,0))),(e=>C.some(Fs(e,br(e)))));var l})))),Ji=(e,t,o,n,r,s)=>0===s?C.none():Zi(e,t,o,n,r).bind((l=>{const a=e.fromSitus(l),c=_i.verify(e,o,n,a.finish,a.foffset,r.failure,t);return _i.cata(c,(()=>C.none()),(()=>C.some(l)),(l=>Re(o,l)&&0===n?Qi(e,o,n,Mi,r):Ji(e,t,l,0,r,s-1)),(l=>Re(o,l)&&n===br(l)?Qi(e,o,n,Wi,r):Ji(e,t,l,br(l),r,s-1)))})),Qi=(e,t,o,n,r)=>Fi(e,t,o).bind((t=>Xi(e,r,n(t,Ki.getJumpSize())))),Xi=(e,t,o)=>{const n=Bo().browser;return n.isChromium()||n.isSafari()||n.isFirefox()?t.retry(e,o):C.none()},Zi=(e,t,o,n,r)=>Fi(e,o,n).bind((t=>Xi(e,r,t))),em=(e,t,o,n,r)=>bt(n,"td,th",t).bind((n=>bt(n,"table",t).bind((s=>((e,t)=>ft(e,(e=>Ne(e).exists((e=>Re(e,t)))),void 0).isSome())(r,s)?((e,t,o)=>Yi(e,t,o).bind((n=>Ji(e,t,n.element,n.offset,o,20).map(e.fromSitus))))(e,t,o).bind((e=>bt(e.finish,"td,th",t).map((t=>({start:n,finish:t,range:e}))))):C.none())))),tm=(e,t,o,n,r,s)=>s(n,t).orThunk((()=>em(e,t,o,n,r).map((e=>{const t=e.range;return ti(C.some(hi(t.start,t.soffset,t.finish,t.foffset)),!0)})))),om=(e,t)=>bt(e,"tr",t).bind((e=>bt(e,"table",t).bind((o=>{const n=dt(o,"tr");return Re(e,n[0])?((e,t,o)=>Ri(Oi,e,(e=>Cr(e).isSome()),o))(o,0,t).map((e=>{const t=br(e);return ti(C.some(hi(e,t,e,t)),!0)})):C.none()})))),nm=(e,t)=>bt(e,"tr",t).bind((e=>bt(e,"table",t).bind((o=>{const n=dt(o,"tr");return Re(e,n[n.length-1])?((e,t,o)=>Di(Oi,e,(e=>xr(e).isSome()),o))(o,0,t).map((e=>ti(C.some(hi(e,0,e,0)),!0))):C.none()})))),rm=(e,t,o,n,r,s,l)=>em(e,o,n,r,s).bind((e=>pi(t,o,e.start,e.finish,l))),sm=e=>{let t=e;return{get:()=>t,set:e=>{t=e}}},lm=()=>{const e=(e=>{const t=sm(C.none()),o=()=>t.get().each(e);return{clear:()=>{o(),t.set(C.none())},isSet:()=>t.get().isSome(),get:()=>t.get(),set:e=>{o(),t.set(C.some(e))}}})(f);return{...e,on:t=>e.get().each(t)}},am=(e,t)=>bt(e,"td,th",t),cm=e=>Be(e).exists(Qr),im={traverse:Ae,gather:Ei,relative:ei.before,retry:Ki.tryDown,failure:_i.failedDown},mm={traverse:ze,gather:ki,relative:ei.before,retry:Ki.tryUp,failure:_i.failedUp},dm=e=>t=>t===e,um=dm(38),fm=dm(40),gm=e=>e>=37&&e<=40,hm={isBackward:dm(37),isForward:dm(39)},pm={isBackward:dm(39),isForward:dm(37)},wm=Zl([{domRange:["rng"]},{relative:["startSitu","finishSitu"]},{exact:["start","soffset","finish","foffset"]}]),bm={domRange:wm.domRange,relative:wm.relative,exact:wm.exact,exactFromRange:e=>wm.exact(e.start,e.soffset,e.finish,e.foffset),getWin:e=>{const t=(e=>e.match({domRange:e=>xe.fromDom(e.startContainer),relative:(e,t)=>ei.getStart(e),exact:(e,t,o,n)=>e}))(e);return xe.fromDom(Ee(t).dom.defaultView)},range:ui},vm=document.caretPositionFromPoint?(e,t,o)=>{var n,r;return C.from(null===(r=(n=e.dom).caretPositionFromPoint)||void 0===r?void 0:r.call(n,t,o)).bind((t=>{if(null===t.offsetNode)return C.none();const o=e.dom.createRange();return o.setStart(t.offsetNode,t.offset),o.collapse(),C.some(o)}))}:document.caretRangeFromPoint?(e,t,o)=>{var n,r;return C.from(null===(r=(n=e.dom).caretRangeFromPoint)||void 0===r?void 0:r.call(n,t,o))}:C.none,ym=(e,t)=>{const o=ne(e);return"input"===o?ei.after(e):D(["br","img"],o)?0===t?ei.before(e):ei.after(e):ei.on(e,t)},xm=e=>C.from(e.getSelection()),Cm=(e,t)=>{xm(e).each((e=>{e.removeAllRanges(),e.addRange(t)}))},Sm=(e,t,o,n,r)=>{const s=li(e,t,o,n,r);Cm(e,s)},Tm=(e,t)=>mi(e,t).match({ltr:(t,o,n,r)=>{Sm(e,t,o,n,r)},rtl:(t,o,n,r)=>{xm(e).each((s=>{if(s.setBaseAndExtent)s.setBaseAndExtent(t.dom,o,n.dom,r);else if(s.extend)try{((e,t,o,n,r,s)=>{t.collapse(o.dom,n),t.extend(r.dom,s)})(0,s,t,o,n,r)}catch(s){Sm(e,n,r,t,o)}else Sm(e,n,r,t,o)}))}}),Rm=(e,t,o,n,r)=>{const s=((e,t,o,n)=>{const r=ym(e,t),s=ym(o,n);return bm.relative(r,s)})(t,o,n,r);Tm(e,s)},Dm=(e,t,o)=>{const n=((e,t)=>{const o=e.fold(ei.before,ym,ei.after),n=t.fold(ei.before,ym,ei.after);return bm.relative(o,n)})(t,o);Tm(e,n)},Om=e=>{if(e.rangeCount>0){const t=e.getRangeAt(0),o=e.getRangeAt(e.rangeCount-1);return C.some(ui(xe.fromDom(t.startContainer),t.startOffset,xe.fromDom(o.endContainer),o.endOffset))}return C.none()},km=e=>{if(null===e.anchorNode||null===e.focusNode)return Om(e);{const t=xe.fromDom(e.anchorNode),o=xe.fromDom(e.focusNode);return((e,t,o,n)=>{const r=((e,t,o,n)=>{const r=ke(e).dom.createRange();return r.setStart(e.dom,t),r.setEnd(o.dom,n),r})(e,t,o,n),s=Re(e,o)&&t===n;return r.collapsed&&!s})(t,e.anchorOffset,o,e.focusOffset)?C.some(ui(t,e.anchorOffset,o,e.focusOffset)):Om(e)}},Em=(e,t,o=!0)=>{const n=(o?ni:oi)(e,t);Cm(e,n)},Nm=e=>(e=>xm(e).filter((e=>e.rangeCount>0)).bind(km))(e).map((e=>bm.exact(e.start,e.soffset,e.finish,e.foffset))),Bm=e=>({elementFromPoint:(t,o)=>xe.fromPoint(xe.fromDom(e.document),t,o),getRect:e=>e.dom.getBoundingClientRect(),getRangedRect:(t,o,n,r)=>{const s=bm.exact(t,o,n,r);return((e,t)=>(e=>{const t=e.getClientRects(),o=t.length>0?t[0]:e.getBoundingClientRect();return o.width>0||o.height>0?C.some(o).map(ai):C.none()})(di(e,t)))(e,s)},getSelection:()=>Nm(e).map((t=>gi(e,t))),fromSitus:t=>{const o=bm.relative(t.start,t.finish);return gi(e,o)},situsFromPoint:(t,o)=>((e,t,o)=>((e,t,o)=>{const n=xe.fromDom(e.document);return vm(n,t,o).map((e=>ui(xe.fromDom(e.startContainer),e.startOffset,xe.fromDom(e.endContainer),e.endOffset)))})(e,t,o))(e,t,o).map((e=>fi(e.start,e.soffset,e.finish,e.foffset))),clearSelection:()=>{(e=>{xm(e).each((e=>e.removeAllRanges()))})(e)},collapseSelection:(t=!1)=>{Nm(e).each((o=>o.fold((e=>e.collapse(t)),((o,n)=>{const r=t?o:n;Dm(e,r,r)}),((o,n,r,s)=>{const l=t?o:r,a=t?n:s;Rm(e,l,a,l,a)}))))},setSelection:t=>{Rm(e,t.start,t.soffset,t.finish,t.foffset)},setRelativeSelection:(t,o)=>{Dm(e,t,o)},selectNode:t=>{Em(e,t,!1)},selectContents:t=>{Em(e,t)},getInnerHeight:()=>e.innerHeight,getScrollY:()=>(e=>{const t=void 0!==e?e.dom:document,o=t.body.scrollLeft||t.documentElement.scrollLeft,n=t.body.scrollTop||t.documentElement.scrollTop;return bn(o,n)})(xe.fromDom(e.document)).top,scrollBy:(t,o)=>{((e,t,o)=>{const n=(void 0!==o?o.dom:document).defaultView;n&&n.scrollBy(e,t)})(t,o,xe.fromDom(e.document))}}),_m=(e,t)=>({rows:e,cols:t}),zm=e=>gt(e,ae).exists(Qr),Am=(e,t)=>zm(e)||zm(t),Lm=e=>void 0!==e.dom.classList,Wm=(e,t)=>((e,t,o)=>{const n=((e,t)=>{const o=pe(e,t);return void 0===o||""===o?[]:o.split(" ")})(e,t).concat([o]);return ge(e,t,n.join(" ")),!0})(e,"class",t),Mm=(e,t)=>{Lm(e)?e.dom.classList.add(t):Wm(e,t)},jm=(e,t)=>Lm(e)&&e.dom.classList.contains(t),Pm=()=>({tag:"none"}),Im=e=>({tag:"multiple",elements:e}),Fm=e=>({tag:"single",element:e}),Hm=e=>{const t=xe.fromDom((e=>{if(nt()&&m(e.target)){const t=xe.fromDom(e.target);if(ce(t)&&m(t.dom.shadowRoot)&&e.composed&&e.composedPath){const t=e.composedPath();if(t)return H(t)}}return C.from(e.target)})(e).getOr(e.target)),o=()=>e.stopPropagation(),n=()=>e.preventDefault(),r=(s=n,l=o,(...e)=>s(l.apply(null,e)));var s,l;return((e,t,o,n,r,s,l)=>({target:e,x:t,y:o,stop:n,prevent:r,kill:s,raw:l}))(t,e.clientX,e.clientY,o,n,r,e)},$m=(e,t,o,n)=>{e.dom.removeEventListener(t,o,n)},Vm=x,qm=(e,t,o)=>((e,t,o,n)=>((e,t,o,n,r)=>{const s=((e,t)=>o=>{e(o)&&t(Hm(o))})(o,n);return e.dom.addEventListener(t,s,r),{unbind:w($m,e,t,s,r)}})(e,t,o,n,!1))(e,t,Vm,o),Um=Hm,Gm=e=>!jm(xe.fromDom(e.target),"ephox-snooker-resizer-bar"),Km=(e,t)=>{const o=(r=As.selectedSelector,{get:()=>Rs(xe.fromDom(e.getBody()),r).fold((()=>js(os(e),es(e)).fold(Pm,Fm)),Im)}),n=((e,t,o)=>{const n=t=>{be(t,e.selected),be(t,e.firstSelected),be(t,e.lastSelected)},r=t=>{ge(t,e.selected,"1")},s=e=>{l(e),o()},l=t=>{const o=dt(t,`${e.selectedSelector},${e.firstSelectedSelector},${e.lastSelectedSelector}`);N(o,n)};return{clearBeforeUpdate:l,clear:s,selectRange:(o,n,l,a)=>{s(o),N(n,r),ge(l,e.firstSelected,"1"),ge(a,e.lastSelected,"1"),t(n,l,a)},selectedSelector:e.selectedSelector,firstSelectedSelector:e.firstSelectedSelector,lastSelectedSelector:e.lastSelectedSelector}})(As,((t,o,n)=>{Kt(o).each((r=>{const s=Wr(e),l=Br(f,xe.fromDom(e.getDoc()),s),a=((e,t,o)=>{const n=Zo(e);return Ol(n,t).map((e=>{const t=xl(n,o,!1),{rows:r}=qo(t),s=((e,t)=>{const o=e.slice(0,t[t.length-1].row+1),n=Cl(o);return j(n,(e=>{const o=e.cells.slice(0,t[t.length-1].column+1);return E(o,(e=>e.element))}))})(r,e),l=((e,t)=>{const o=e.slice(t[0].row+t[0].rowspan-1,e.length),n=Cl(o);return j(n,(e=>{const o=e.cells.slice(t[0].column+t[0].colspan-1,e.cells.length);return E(o,(e=>e.element))}))})(r,e);return{upOrLeftCells:s,downOrRightCells:l}}))})(r,{selection:Ps(e)},l);((e,t,o,n,r)=>{e.dispatch("TableSelectionChange",{cells:t,start:o,finish:n,otherCells:r})})(e,t,o,n,a)}))}),(()=>(e=>{e.dispatch("TableSelectionClear")})(e)));var r;return e.on("init",(o=>{const r=e.getWin(),s=Zr(e),l=es(e),a=((e,t,o,n)=>{const r=((e,t,o,n)=>{const r=lm(),s=r.clear,l=s=>{r.on((r=>{n.clearBeforeUpdate(t),am(s.target,o).each((l=>{xs(r,l,o).each((o=>{const r=o.boxes.getOr([]);if(1===r.length){const o=r[0],l="false"===Xr(o),a=vt(Jr(s.target),o,Re);l&&a&&(n.selectRange(t,r,o,o),e.selectContents(o))}else r.length>1&&(n.selectRange(t,r,o.start,o.finish),e.selectContents(l))}))}))}))};return{clearstate:s,mousedown:e=>{n.clear(t),am(e.target,o).filter(cm).each(r.set)},mouseover:e=>{l(e)},mouseup:e=>{l(e),s()}}})(Bm(e),t,o,n);return{clearstate:r.clearstate,mousedown:r.mousedown,mouseover:r.mouseover,mouseup:r.mouseup}})(r,s,l,n),c=((e,t,o,n)=>{const r=Bm(e),s=()=>(n.clear(t),C.none());return{keydown:(e,l,a,c,i,m)=>{const d=e.raw,u=d.which,f=!0===d.shiftKey,g=Cs(t,n.selectedSelector).fold((()=>(gm(u)&&!f&&n.clearBeforeUpdate(t),gm(u)&&f&&!Am(l,c)?C.none:fm(u)&&f?w(rm,r,t,o,im,c,l,n.selectRange):um(u)&&f?w(rm,r,t,o,mm,c,l,n.selectRange):fm(u)?w(tm,r,o,im,c,l,nm):um(u)?w(tm,r,o,mm,c,l,om):C.none)),(e=>{const o=o=>()=>{const s=V(o,(o=>((e,t,o,n,r)=>Ts(n,e,t,r.firstSelectedSelector,r.lastSelectedSelector).map((e=>(r.clearBeforeUpdate(o),r.selectRange(o,e.boxes,e.start,e.finish),e.boxes))))(o.rows,o.cols,t,e,n)));return s.fold((()=>Ss(t,n.firstSelectedSelector,n.lastSelectedSelector).map((e=>{const o=fm(u)||m.isForward(u)?ei.after:ei.before;return r.setRelativeSelection(ei.on(e.first,0),o(e.table)),n.clear(t),ti(C.none(),!0)}))),(e=>C.some(ti(C.none(),!0))))};return gm(u)&&f&&!Am(l,c)?C.none:fm(u)&&f?o([_m(1,0)]):um(u)&&f?o([_m(-1,0)]):m.isBackward(u)&&f?o([_m(0,-1),_m(-1,0)]):m.isForward(u)&&f?o([_m(0,1),_m(1,0)]):gm(u)&&!f?s:C.none}));return g()},keyup:(e,r,s,l,a)=>Cs(t,n.selectedSelector).fold((()=>{const c=e.raw,i=c.which;return!0===c.shiftKey&&gm(i)&&Am(r,l)?((e,t,o,n,r,s,l)=>Re(o,r)&&n===s?C.none():bt(o,"td,th",t).bind((o=>bt(r,"td,th",t).bind((n=>pi(e,t,o,n,l))))))(t,o,r,s,l,a,n.selectRange):C.none()}),C.none)}})(r,s,l,n),i=((e,t,o,n)=>{const r=Bm(e);return(e,s)=>{n.clearBeforeUpdate(t),xs(e,s,o).each((e=>{const o=e.boxes.getOr([]);n.selectRange(t,o,e.start,e.finish),r.selectContents(s),r.collapseSelection()}))}})(r,s,l,n);e.on("TableSelectorChange",(e=>i(e.start,e.finish)));const m=(t,o)=>{(e=>!0===e.raw.shiftKey)(t)&&(o.kill&&t.kill(),o.selection.each((t=>{const o=bm.relative(t.start,t.finish),n=di(r,o);e.selection.setRng(n)})))},d=e=>0===e.button,u=(()=>{const e=sm(xe.fromDom(s)),t=sm(0);return{touchEnd:o=>{const n=xe.fromDom(o.target);if(ue("td")(n)||ue("th")(n)){const r=e.get(),s=t.get();Re(r,n)&&o.timeStamp-s<300&&(o.preventDefault(),i(n,n))}e.set(n),t.set(o.timeStamp)}}})();e.on("dragstart",(e=>{a.clearstate()})),e.on("mousedown",(e=>{d(e)&&Gm(e)&&a.mousedown(Um(e))})),e.on("mouseover",(e=>{var t;void 0!==(t=e).buttons&&0==(1&t.buttons)||!Gm(e)||a.mouseover(Um(e))})),e.on("mouseup",(e=>{d(e)&&Gm(e)&&a.mouseup(Um(e))})),e.on("touchend",u.touchEnd),e.on("keyup",(t=>{const o=Um(t);if(o.raw.shiftKey&&gm(o.raw.which)){const t=e.selection.getRng(),n=xe.fromDom(t.startContainer),r=xe.fromDom(t.endContainer);c.keyup(o,n,t.startOffset,r,t.endOffset).each((e=>{m(o,e)}))}})),e.on("keydown",(o=>{const n=Um(o);t.hide();const r=e.selection.getRng(),s=xe.fromDom(r.startContainer),l=xe.fromDom(r.endContainer),a=un(hm,pm)(xe.fromDom(e.selection.getStart()));c.keydown(n,s,r.startOffset,l,r.endOffset,a).each((e=>{m(n,e)})),t.show()})),e.on("NodeChange",(()=>{const t=e.selection,o=xe.fromDom(t.getStart()),r=xe.fromDom(t.getEnd());vs(Kt,[o,r]).fold((()=>n.clear(s)),f)}))})),e.on("PreInit",(()=>{e.serializer.addTempAttr(As.firstSelected),e.serializer.addTempAttr(As.lastSelected)})),{getSelectedCells:()=>((e,t,o,n)=>{switch(e.tag){case"none":return t();case"single":return(e=>[e.dom])(e.element);case"multiple":return(e=>E(e,(e=>e.dom)))(e.elements)}})(o.get(),g([])),clearSelectedCells:e=>n.clear(xe.fromDom(e))}},Ym=e=>{let t=[];return{bind:e=>{if(void 0===e)throw new Error("Event bind error: undefined handler");t.push(e)},unbind:e=>{t=_(t,(t=>t!==e))},trigger:(...o)=>{const n={};N(e,((e,t)=>{n[e]=o[t]})),N(t,(e=>{e(n)}))}}},Jm=e=>({registry:K(e,(e=>({bind:e.bind,unbind:e.unbind}))),trigger:K(e,(e=>e.trigger))}),Qm=e=>e.slice(0).sort(),Xm=(e,t)=>{const o=_(t,(t=>!D(e,t)));o.length>0&&(e=>{throw new Error("Unsupported keys for object: "+Qm(e).join(", "))})(o)},Zm=e=>((e,t)=>((e,t,o)=>{if(0===t.length)throw new Error("You must specify at least one required field.");return((e,t)=>{if(!l(t))throw new Error("The "+e+" fields must be an array. Was: "+t+".");N(t,(t=>{if(!r(t))throw new Error("The value "+t+" in the "+e+" fields was not a string.")}))})("required",t),(e=>{const t=Qm(e);L(t,((e,o)=>o{throw new Error("The field: "+e+" occurs more than once in the combined fields: ["+t.join(", ")+"].")}))})(t),n=>{const r=q(n);P(t,(e=>D(r,e)))||((e,t)=>{throw new Error("All required keys ("+Qm(e).join(", ")+") were not specified. Specified keys were: "+Qm(t).join(", ")+".")})(t,r),e(t,r);const s=_(t,(e=>!o.validate(n[e],e)));return s.length>0&&((e,t)=>{throw new Error("All values need to be of type: "+t+". Keys ("+Qm(e).join(", ")+") were not.")})(s,o.label),n}})(e,t,{validate:d,label:"function"}))(Xm,e),ed=Zm(["compare","extract","mutate","sink"]),td=Zm(["element","start","stop","destroy"]),od=Zm(["forceDrop","drop","move","delayDrop"]),nd=()=>{const e=(()=>{const e=Jm({move:Ym(["info"])});return{onEvent:f,reset:f,events:e.registry}})(),t=(()=>{let e=C.none();const t=Jm({move:Ym(["info"])});return{onEvent:(o,n)=>{n.extract(o).each((o=>{const r=((t,o)=>{const n=e.map((e=>t.compare(e,o)));return e=C.some(o),n})(n,o);r.each((e=>{t.trigger.move(e)}))}))},reset:()=>{e=C.none()},events:t.registry}})();let o=e;return{on:()=>{o.reset(),o=t},off:()=>{o.reset(),o=e},isOn:()=>o===t,onEvent:(e,t)=>{o.onEvent(e,t)},events:t.events}},rd=e=>{const t=e.replace(/\./g,"-");return{resolve:e=>t+"-"+e}},sd=rd("ephox-dragster").resolve;var ld=ed({compare:(e,t)=>bn(t.left-e.left,t.top-e.top),extract:e=>C.some(bn(e.x,e.y)),sink:(e,t)=>{const o=(e=>{const t={layerClass:sd("blocker"),...e},o=xe.fromTag("div");return ge(o,"role","presentation"),Bt(o,{position:"fixed",left:"0px",top:"0px",width:"100%",height:"100%"}),Mm(o,sd("blocker")),Mm(o,t.layerClass),{element:g(o),destroy:()=>{qe(o)}}})(t),n=qm(o.element(),"mousedown",e.forceDrop),r=qm(o.element(),"mouseup",e.drop),s=qm(o.element(),"mousemove",e.move),l=qm(o.element(),"mouseout",e.delayDrop);return td({element:o.element,start:e=>{Ie(e,o.element())},stop:()=>{qe(o.element())},destroy:()=>{o.destroy(),r.unbind(),s.unbind(),l.unbind(),n.unbind()}})},mutate:(e,t)=>{e.mutate(t.left,t.top)}});const ad=rd("ephox-snooker").resolve,cd=ad("resizer-bar"),id=ad("resizer-rows"),md=ad("resizer-cols"),dd=e=>{const t=dt(e.parent(),"."+cd);N(t,qe)},ud=(e,t,o)=>{const n=e.origin();N(t,(t=>{t.each((t=>{const r=o(n,t);Mm(r,cd),Ie(e.parent(),r)}))}))},fd=(e,t,o,n,r)=>{const s=yn(o),l=t.isResizable,a=n.length>0?_n.positions(n,o):[],c=a.length>0?((e,t)=>j(e.all,((e,o)=>t(e.element)?[o]:[])))(e,l):[];((e,t,o,n)=>{ud(e,t,((e,t)=>{const r=((e,t,o,n,r)=>{const s=xe.fromTag("div");return Bt(s,{position:"absolute",left:t+"px",top:o-3.5+"px",height:"7px",width:n+"px"}),he(s,{"data-row":e,role:"presentation"}),s})(t.row,o.left-e.left,t.y-e.top,n);return Mm(r,id),r}))})(t,_(a,((e,t)=>O(c,(e=>t===e)))),s,Wo(o));const i=r.length>0?An.positions(r,o):[],m=i.length>0?((e,t)=>{const o=[];return k(e.grid.columns,(n=>{an(e,n).map((e=>e.element)).forall(t)&&o.push(n)})),_(o,(o=>{const n=nn(e,(e=>e.column===o));return P(n,(e=>t(e.element)))}))})(e,l):[];((e,t,o,n)=>{ud(e,t,((e,t)=>{const r=((e,t,o,n,r)=>{const s=xe.fromTag("div");return Bt(s,{position:"absolute",left:t-3.5+"px",top:o+"px",height:r+"px",width:"7px"}),he(s,{"data-column":e,role:"presentation"}),s})(t.col,t.x-e.left,o.top-e.top,0,n);return Mm(r,md),r}))})(t,_(i,((e,t)=>O(m,(e=>t===e)))),s,pn(o))},gd=(e,t)=>{if(dd(e),e.isResizable(t)){const o=Zo(t),n=dn(o),r=cn(o);fd(o,e,t,n,r)}},hd=(e,t)=>{const o=dt(e.parent(),"."+cd);N(o,t)},pd=e=>{hd(e,(e=>{Nt(e,"display","none")}))},wd=e=>{hd(e,(e=>{Nt(e,"display","block")}))},bd=ad("resizer-bar-dragging"),vd=e=>{const t=(()=>{const e=Jm({drag:Ym(["xDelta","yDelta","target"])});let t=C.none();const o=(()=>{const e=Jm({drag:Ym(["xDelta","yDelta"])});return{mutate:(t,o)=>{e.trigger.drag(t,o)},events:e.registry}})();return o.events.drag.bind((o=>{t.each((t=>{e.trigger.drag(o.xDelta,o.yDelta,t)}))})),{assign:e=>{t=C.some(e)},get:()=>t,mutate:o.mutate,events:e.registry}})(),o=((e,t={})=>{var o;return((e,t,o)=>{let n=!1;const r=Jm({start:Ym([]),stop:Ym([])}),s=nd(),l=()=>{m.stop(),s.isOn()&&(s.off(),r.trigger.stop())},c=((e,t)=>{let o=null;const n=()=>{a(o)||(clearTimeout(o),o=null)};return{cancel:n,throttle:(...t)=>{n(),o=setTimeout((()=>{o=null,e.apply(null,t)}),200)}}})(l);s.events.move.bind((o=>{t.mutate(e,o.info)}));const i=e=>(...t)=>{n&&e.apply(null,t)},m=t.sink(od({forceDrop:l,drop:i(l),move:i((e=>{c.cancel(),s.onEvent(e,t)})),delayDrop:i(c.throttle)}),o);return{element:m.element,go:e=>{m.start(e),s.on(),r.trigger.start()},on:()=>{n=!0},off:()=>{n=!1},isActive:()=>n,destroy:()=>{m.destroy()},events:r.registry}})(e,null!==(o=t.mode)&&void 0!==o?o:ld,t)})(t,{});let n=C.none();const r=(e,t)=>C.from(pe(e,t));t.events.drag.bind((e=>{r(e.target,"data-row").each((t=>{const o=It(e.target,"top");Nt(e.target,"top",o+e.yDelta+"px")})),r(e.target,"data-column").each((t=>{const o=It(e.target,"left");Nt(e.target,"left",o+e.xDelta+"px")}))}));const s=(e,t)=>It(e,t)-Wt(e,"data-initial-"+t,0);o.events.stop.bind((()=>{t.get().each((t=>{n.each((o=>{r(t,"data-row").each((e=>{const n=s(t,"top");be(t,"data-initial-top"),d.trigger.adjustHeight(o,n,parseInt(e,10))})),r(t,"data-column").each((e=>{const n=s(t,"left");be(t,"data-initial-left"),d.trigger.adjustWidth(o,n,parseInt(e,10))})),gd(e,o)}))}))}));const l=(n,r)=>{d.trigger.startAdjust(),t.assign(n),ge(n,"data-initial-"+r,It(n,r)),Mm(n,bd),Nt(n,"opacity","0.2"),o.go(e.parent())},c=qm(e.parent(),"mousedown",(e=>{var t;t=e.target,jm(t,id)&&l(e.target,"top"),(e=>jm(e,md))(e.target)&&l(e.target,"left")})),i=t=>Re(t,e.view()),m=qm(e.view(),"mouseover",(t=>{var r;(r=t.target,bt(r,"table",i).filter(Qr)).fold((()=>{lt(t.target)&&dd(e)}),(t=>{o.isActive()&&(n=C.some(t),gd(e,t))}))})),d=Jm({adjustHeight:Ym(["table","delta","row"]),adjustWidth:Ym(["table","delta","column"]),startAdjust:Ym([])});return{destroy:()=>{c.unbind(),m.unbind(),o.destroy(),dd(e)},refresh:t=>{gd(e,t)},on:o.on,off:o.off,hideBars:w(pd,e),showBars:w(wd,e),events:d.registry}},yd=(e,t,o)=>{const n=_n,r=An,s=vd(e),l=Jm({beforeResize:Ym(["table","type"]),afterResize:Ym(["table","type"]),startDrag:Ym([])});return s.events.adjustHeight.bind((e=>{const t=e.table;l.trigger.beforeResize(t,"row");((e,t,o,n)=>{const r=Zo(e),s=((e,t,o)=>lr(e,t,o,Yn,(e=>e.getOrThunk(Ht))))(r,e,n),l=E(s,((e,n)=>o===n?Math.max(t+e,Ht()):e)),a=oa(r,l),c=((e,t)=>E(e.all,((e,o)=>({element:e.element,height:t[o]}))))(r,l);N(c,(e=>{$n(e.element,e.height)})),N(a,(e=>{$n(e.element,e.height)}));const i=z(l,((e,t)=>e+t),0);$n(e,i)})(t,n.delta(e.delta,t),e.row,n),l.trigger.afterResize(t,"row")})),s.events.startAdjust.bind((e=>{l.trigger.startDrag()})),s.events.adjustWidth.bind((e=>{const n=e.table;l.trigger.beforeResize(n,"col");const s=r.delta(e.delta,n),a=o(n);ra(n,s,e.column,t,a),l.trigger.afterResize(n,"col")})),{on:s.on,off:s.off,refreshBars:s.refresh,hideBars:s.hideBars,showBars:s.showBars,destroy:s.destroy,events:l.registry}},xd=e=>m(e)&&"TABLE"===e.nodeName,Cd="bar-",Sd=e=>"false"!==pe(e,"data-mce-resize"),Td=e=>{const t=lm(),o=lm(),n=lm();let r,s;const l=t=>fc(e,t),a=()=>Pr(e)?el():Zs();return e.on("init",(()=>{const r=((e,t)=>e.inline?((e,t,o)=>({parent:g(t),view:g(e),origin:g(bn(0,0)),isResizable:o}))(xe.fromDom(e.getBody()),(()=>{const e=xe.fromTag("div");return Bt(e,{position:"static",height:"0",width:"0",padding:"0",margin:"0",border:"0"}),Ie(at(xe.fromDom(document)),e),e})(),t):((e,t)=>{const o=me(e)?(e=>xe.fromDom(Ee(e).dom.documentElement))(e):e;return{parent:g(o),view:g(e),origin:g(bn(0,0)),isResizable:t}})(xe.fromDom(e.getDoc()),t))(e,Sd);if(n.set(r),(e=>{const t=e.options.get("object_resizing");return D(t.split(","),"table")})(e)&&qr(e)){const n=a(),s=yd(r,n,l);s.on(),s.events.startDrag.bind((o=>{t.set(e.selection.getRng())})),s.events.beforeResize.bind((t=>{const o=t.table.dom;((e,t,o,n,r)=>{e.dispatch("ObjectResizeStart",{target:t,width:o,height:n,origin:r})})(e,o,ns(o),rs(o),Cd+t.type)})),s.events.afterResize.bind((o=>{const n=o.table,r=n.dom;ts(n),t.on((t=>{e.selection.setRng(t),e.focus()})),((e,t,o,n,r)=>{e.dispatch("ObjectResized",{target:t,width:o,height:n,origin:r})})(e,r,ns(r),rs(r),Cd+o.type),e.undoManager.add()})),o.set(s)}})),e.on("ObjectResizeStart",(t=>{const o=t.target;if(xd(o)){const n=xe.fromDom(o);N(e.dom.select(".mce-clonedresizable"),(t=>{e.dom.addClass(t,"mce-"+jr(e)+"-columns")})),!kc(n)&&$r(e)?_c(n):!Oc(n)&&Hr(e)&&Bc(n),Ec(n)&&Tt(t.origin,Cd)&&Bc(n),r=t.width,s=Vr(e)?"":((e,t)=>{const o=e.dom.getStyle(t,"width")||e.dom.getAttrib(t,"width");return C.from(o).filter(Ot)})(e,o).getOr("")}})),e.on("ObjectResized",(t=>{const o=t.target;if(xd(o)){const n=xe.fromDom(o),c=t.origin;Tt(c,"corner-")&&((t,o,n)=>{const c=Rt(o,"e");if(""===s&&Bc(t),n!==r&&""!==s){Nt(t,"width",s);const o=a(),i=l(t),m=Pr(e)||c?(e=>tl(e).columns)(t)-1:0;ra(t,n-r,m,o,i)}else if((e=>/^(\d+(\.\d+)?)%$/.test(e))(s)){const e=parseFloat(s.replace("%",""));Nt(t,"width",n*e/r+"%")}(e=>/^(\d+(\.\d+)?)px$/.test(e))(s)&&(e=>{const t=Zo(e);ln(t)||N(Ut(e),(e=>{const t=_t(e,"width");Nt(e,"width",t),be(e,"width")}))})(t)})(n,c,t.width),ts(n),ic(e,n.dom,mc)}})),e.on("SwitchMode",(()=>{o.on((t=>{e.mode.isReadOnly()?t.hideBars():t.showBars()}))})),e.on("dragstart dragend",(e=>{o.on((t=>{"dragstart"===e.type?(t.hideBars(),t.off()):(t.on(),t.showBars())}))})),e.on("remove",(()=>{o.on((e=>{e.destroy()})),n.on((t=>{((e,t)=>{e.inline&&qe(t.parent())})(e,t)}))})),{refresh:e=>{o.on((t=>t.refreshBars(xe.fromDom(e))))},hide:()=>{o.on((e=>e.hideBars()))},show:()=>{o.on((e=>e.showBars()))}}},Rd=e=>{(e=>{const t=e.options.register;t("table_clone_elements",{processor:"string[]"}),t("table_use_colgroups",{processor:"boolean",default:!0}),t("table_header_type",{processor:e=>{const t=D(["section","cells","sectionCells","auto"],e);return t?{value:e,valid:t}:{valid:!1,message:"Must be one of: section, cells, sectionCells or auto."}},default:"section"}),t("table_sizing_mode",{processor:"string",default:"auto"}),t("table_default_attributes",{processor:"object",default:{border:"1"}}),t("table_default_styles",{processor:"object",default:{"border-collapse":"collapse"}}),t("table_column_resizing",{processor:e=>{const t=D(["preservetable","resizetable"],e);return t?{value:e,valid:t}:{valid:!1,message:"Must be preservetable, or resizetable."}},default:"preservetable"}),t("table_resize_bars",{processor:"boolean",default:!0}),t("table_style_by_css",{processor:"boolean",default:!0}),t("table_merge_content_on_paste",{processor:"boolean",default:!0})})(e);const t=Td(e),o=Km(e,t),n=gc(e,t,o);return Xc(e,n),((e,t)=>{const o=es(e),n=t=>js(os(e)).bind((n=>Kt(n,o).map((o=>{const r=Ls(Ps(e),o,n);return t(o,r)})))).getOr("");G({mceTableRowType:()=>n(t.getTableRowType),mceTableCellType:()=>n(t.getTableCellType),mceTableColType:()=>n(t.getTableColType)},((t,o)=>e.addQueryValueHandler(o,t)))})(e,n),Is(e,n),{getSelectedCells:o.getSelectedCells,clearSelectedCells:o.clearSelectedCells}};e.add("dom",(e=>({table:Rd(e)})))}(); \ No newline at end of file diff --git a/static/js/tinymce/plugins/accordion/plugin.min.js b/static/js/tinymce/plugins/accordion/plugin.min.js new file mode 100644 index 0000000..8a39423 --- /dev/null +++ b/static/js/tinymce/plugins/accordion/plugin.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.7.2 (2023-10-25) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");let t=0;const o=e=>t=>typeof t===e,n=e=>"string"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(o=n=e,(r=String).prototype.isPrototypeOf(o)||(null===(s=n.constructor)||void 0===s?void 0:s.name)===r.name)?"string":t;var o,n,r,s})(e),r=o("boolean"),s=e=>null==e,i=e=>!s(e),a=o("function"),d=o("number"),l=e=>()=>e,c=(e,t)=>e===t,m=l(!1);class u{constructor(e,t){this.tag=e,this.value=t}static some(e){return new u(!0,e)}static none(){return u.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?u.some(e(this.value)):u.none()}bind(e){return this.tag?e(this.value):u.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:u.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return i(e)?u.some(e):u.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}u.singletonNone=new u(!1);const p=Array.prototype.indexOf,g=(e,t)=>{return o=e,n=t,p.call(o,n)>-1;var o,n},h=(e,t)=>{const o=e.length,n=new Array(o);for(let r=0;r{for(let o=0,n=e.length;oe.dom.nodeName.toLowerCase(),w=e=>e.dom.nodeType,b=e=>t=>w(t)===e,N=b(1),T=b(3),A=b(9),C=b(11),S=(e,t,o)=>{if(!(n(o)||r(o)||d(o)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",o,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,o+"")},x=(e,t)=>{const o=e.dom.getAttribute(t);return null===o?void 0:o},D=(e,t)=>u.from(x(e,t)),E=(e,t)=>{e.dom.removeAttribute(t)},M=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},P={fromHtml:(e,t)=>{const o=(t||document).createElement("div");if(o.innerHTML=e,!o.hasChildNodes()||o.childNodes.length>1){const t="HTML does not have a single root node";throw console.error(t,e),new Error(t)}return M(o.childNodes[0])},fromTag:(e,t)=>{const o=(t||document).createElement(e);return M(o)},fromText:(e,t)=>{const o=(t||document).createTextNode(e);return M(o)},fromDom:M,fromPoint:(e,t,o)=>u.from(e.dom.elementFromPoint(t,o)).map(M)},k=(e,t)=>{const o=e.dom;if(1!==o.nodeType)return!1;{const e=o;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}},B=e=>1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType||0===e.childElementCount,O=k,$=(L=/^\s+|\s+$/g,e=>e.replace(L,""));var L;const R=e=>void 0!==e.style&&a(e.style.getPropertyValue),I=e=>A(e)?e:P.fromDom(e.dom.ownerDocument),V=e=>u.from(e.dom.parentNode).map(P.fromDom),j=e=>u.from(e.dom.nextSibling).map(P.fromDom),q=e=>h(e.dom.childNodes,P.fromDom),F=a(Element.prototype.attachShadow)&&a(Node.prototype.getRootNode)?e=>P.fromDom(e.dom.getRootNode()):I,H=e=>P.fromDom(e.dom.host),z=e=>{const t=T(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;const o=t.ownerDocument;return(e=>{const t=F(e);return C(o=t)&&i(o.dom.host)?u.some(t):u.none();var o})(P.fromDom(t)).fold((()=>o.body.contains(t)),(n=z,r=H,e=>n(r(e))));var n,r},K=(e,t)=>R(e)?e.style.getPropertyValue(t):"",U=(e,t)=>{V(e).each((o=>{o.dom.insertBefore(t.dom,e.dom)}))},Y=(e,t)=>{j(e).fold((()=>{V(e).each((e=>{_(e,t)}))}),(e=>{U(e,t)}))},_=(e,t)=>{e.dom.appendChild(t.dom)},G=(e,t)=>{f(t,((o,n)=>{const r=0===n?e:t[n-1];Y(r,o)}))},J=(e,t)=>{let o=[];return f(q(e),(e=>{t(e)&&(o=o.concat([e])),o=o.concat(J(e,t))})),o},Q=(e,t,o)=>{let n=e.dom;const r=a(o)?o:m;for(;n.parentNode;){n=n.parentNode;const e=P.fromDom(n);if(t(e))return u.some(e);if(r(e))break}return u.none()},W=e=>{const t=e.dom;null!==t.parentNode&&t.parentNode.removeChild(t)},X=(e,t,o)=>Q(e,(e=>k(e,t)),o),Z=(e,t)=>((e,t)=>{const o=void 0===t?document:t.dom;return B(o)?u.none():u.from(o.querySelector(e)).map(P.fromDom)})(t,e),ee=((e,t)=>{const o=t=>e(t)?u.from(t.dom.nodeValue):u.none();return{get:t=>{if(!e(t))throw new Error("Can only get text value of a text node");return o(t).getOr("")},getOption:o,set:(t,o)=>{if(!e(t))throw new Error("Can only set raw text value of a text node");t.dom.nodeValue=o}}})(T);var te=["body","p","div","article","aside","figcaption","figure","footer","header","nav","section","ol","ul","li","table","thead","tbody","tfoot","caption","tr","td","th","h1","h2","h3","h4","h5","h6","blockquote","pre","address"];const oe=(e,t)=>({element:e,offset:t}),ne=(e,t,o)=>e.property().isText(t)&&0===e.property().getText(t).trim().length||e.property().isComment(t)?o(t).bind((t=>ne(e,t,o).orThunk((()=>u.some(t))))):u.none(),re=(e,t)=>e.property().isText(t)?e.property().getText(t).length:e.property().children(t).length,se=(e,t)=>{const o=ne(e,t,e.query().prevSibling).getOr(t);if(e.property().isText(o))return oe(o,re(e,o));const n=e.property().children(o);return n.length>0?se(e,n[n.length-1]):oe(o,re(e,o))},ie=se,ae={up:l({selector:X,closest:(e,t,o)=>((e,t,o,n,r)=>((e,t)=>k(e,t))(o,n)?u.some(o):a(r)&&r(o)?u.none():t(o,n,r))(0,X,e,t,o),predicate:Q,all:(e,t)=>{const o=a(t)?t:m;let n=e.dom;const r=[];for(;null!==n.parentNode&&void 0!==n.parentNode;){const e=n.parentNode,t=P.fromDom(e);if(r.push(t),!0===o(t))break;n=e}return r}}),down:l({selector:(e,t)=>((e,t)=>{const o=void 0===t?document:t.dom;return B(o)?[]:h(o.querySelectorAll(e),P.fromDom)})(t,e),predicate:J}),styles:l({get:(e,t)=>{const o=e.dom,n=window.getComputedStyle(o).getPropertyValue(t);return""!==n||z(e)?n:K(o,t)},getRaw:(e,t)=>{const o=e.dom,n=K(o,t);return u.from(n).filter((e=>e.length>0))},set:(e,t,o)=>{((e,t,o)=>{if(!n(o))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",o,":: Element ",e),new Error("CSS value must be a string: "+o);R(e)&&e.style.setProperty(t,o)})(e.dom,t,o)},remove:(e,t)=>{((e,t)=>{R(e)&&e.style.removeProperty(t)})(e.dom,t),((e,t,o=c)=>e.exists((e=>o(e,t))))(D(e,"style").map($),"")&&E(e,"style")}}),attrs:l({get:x,set:(e,t,o)=>{S(e.dom,t,o)},remove:E,copyTo:(e,t)=>{const o=(n=e.dom.attributes,r=(e,t)=>(e[t.name]=t.value,e),s={},f(n,((e,t)=>{s=r(s,e)})),s);var n,r,s;((e,t)=>{const o=e.dom;((e,t)=>{const o=y(e);for(let n=0,r=o.length;n{S(o,t,e)}))})(t,o)}}),insert:l({before:U,after:Y,afterAll:G,append:_,appendAll:(e,t)=>{f(t,(t=>{_(e,t)}))},prepend:(e,t)=>{(e=>((e,t)=>{const o=e.dom.childNodes;return u.from(o[0]).map(P.fromDom)})(e))(e).fold((()=>{_(e,t)}),(o=>{e.dom.insertBefore(t.dom,o.dom)}))},wrap:(e,t)=>{U(e,t),_(t,e)}}),remove:l({unwrap:e=>{const t=q(e);t.length>0&&G(e,t),W(e)},remove:W}),create:l({nu:P.fromTag,clone:e=>P.fromDom(e.dom.cloneNode(!1)),text:P.fromText}),query:l({comparePosition:(e,t)=>e.dom.compareDocumentPosition(t.dom),prevSibling:e=>u.from(e.dom.previousSibling).map(P.fromDom),nextSibling:j}),property:l({children:q,name:v,parent:V,document:e=>I(e).dom,isText:T,isComment:e=>8===w(e)||"#comment"===v(e),isElement:N,isSpecial:e=>{const t=v(e);return g(["script","noscript","iframe","noframes","noembed","title","style","textarea","xmp"],t)},getLanguage:e=>N(e)?D(e,"lang"):u.none(),getText:e=>ee.get(e),setText:(e,t)=>ee.set(e,t),isBoundary:e=>!!N(e)&&("body"===v(e)||g(te,v(e))),isEmptyTag:e=>!!N(e)&&g(["br","img","hr","input"],v(e)),isNonEditable:e=>N(e)&&"false"===x(e,"contenteditable")}),eq:(e,t)=>e.dom===t.dom,is:O},de="details",le="mce-accordion",ce="mce-accordion-summary",me="mce-accordion-body",ue="div";var pe=tinymce.util.Tools.resolve("tinymce.util.Tools");const ge=e=>"SUMMARY"===(null==e?void 0:e.nodeName),he=e=>"DETAILS"===(null==e?void 0:e.nodeName),fe=e=>e.hasAttribute("open"),ye=e=>{const t=e.selection.getNode();return ge(t)||Boolean(e.dom.getParent(t,ge))},ve=e=>!ye(e)&&e.dom.isEditable(e.selection.getNode()),we=e=>u.from(e.dom.getParent(e.selection.getNode(),he)),be=e=>(e.innerHTML='
      ',e),Ne=e=>be(e.dom.create("p")),Te=e=>t=>{((e,t)=>{if(ge(null==t?void 0:t.lastChild)){const o=Ne(e);t.appendChild(o),e.selection.setCursorLocation(o,0)}})(e,t),((e,t)=>{if(!ge(null==t?void 0:t.firstChild)){const o=(e=>be(e.dom.create("summary")))(e);t.prepend(o),e.selection.setCursorLocation(o,0)}})(e,t)},Ae=(e,t)=>{const o=null!=t?t:!fe(e);return o?e.setAttribute("open","open"):e.removeAttribute("open"),o},Ce=e=>{e.addCommand("InsertAccordion",(()=>(e=>{if(!ve(e))return;const o=P.fromDom(e.getBody()),n=(e=>{const o=(new Date).getTime(),n=Math.floor(1e9*Math.random());return t++,"acc_"+n+t+String(o)})(),r=e.dom.encode(e.selection.getRng().toString()||e.translate("Accordion summary...")),s=e.dom.encode(e.translate("Accordion body...")),i=`${r}`,a=`<${ue} class="${me}">

      ${s}

      `;e.undoManager.transact((()=>{e.insertContent([`
      `,i,a,"
      "].join("")),Z(o,`[data-mce-id="${n}"]`).each((t=>{E(t,"data-mce-id"),Z(t,"summary").each((t=>{const o=e.dom.createRng(),n=ie(ae,t);o.setStart(n.element.dom,n.offset),o.setEnd(n.element.dom,n.offset),e.selection.setRng(o)}))}))}))})(e))),e.addCommand("ToggleAccordion",((t,o)=>((e,t)=>{we(e).each((o=>{((e,t,o)=>{e.dispatch("ToggledAccordion",{element:t,state:o})})(e,o,Ae(o,t))}))})(e,o))),e.addCommand("ToggleAllAccordions",((t,o)=>((e,t)=>{const o=Array.from(e.getBody().querySelectorAll("details"));0!==o.length&&(f(o,(e=>Ae(e,null!=t?t:!fe(e)))),((e,t,o)=>{e.dispatch("ToggledAllAccordions",{elements:t,state:o})})(e,o,t))})(e,o))),e.addCommand("RemoveAccordion",(()=>(e=>{we(e).each((t=>{const{nextSibling:o}=t;o?(e.selection.select(o,!0),e.selection.collapse(!0)):((e,t)=>{const o=Ne(e);t.insertAdjacentElement("afterend",o),e.selection.setCursorLocation(o,0)})(e,t),t.remove()}))})(e)))};var Se=tinymce.util.Tools.resolve("tinymce.html.Node");const xe=e=>{var t,o;return null!==(o=null===(t=e.attr("class"))||void 0===t?void 0:t.split(" "))&&void 0!==o?o:[]},De=(e,t)=>{const o=new Set([...xe(e),...t]),n=Array.from(o);n.length>0&&e.attr("class",n.join(" "))},Ee=(e,t)=>{const o=((e,o)=>{const n=[];for(let o=0,s=e.length;o0?o.join(" "):null)},Me=e=>e.name===de&&g(xe(e),le),Pe=e=>{const t=e.children();let o,n;const r=[];for(let e=0;e{const t=new Se("br",1);t.attr("data-mce-bogus","1"),e.empty(),e.append(t)};var Be=tinymce.util.Tools.resolve("tinymce.util.VK");const Oe=e=>t=>{const o=()=>t.setEnabled(ve(e));return e.on("NodeChange",o),()=>e.off("NodeChange",o)};e.add("accordion",(e=>{(e=>{const t=()=>e.execCommand("InsertAccordion");e.ui.registry.addButton("accordion",{icon:"accordion",tooltip:"Insert accordion",onSetup:Oe(e),onAction:t}),e.ui.registry.addMenuItem("accordion",{icon:"accordion",text:"Accordion",onSetup:Oe(e),onAction:t}),e.ui.registry.addToggleButton("accordiontoggle",{icon:"accordion-toggle",tooltip:"Toggle accordion",onAction:()=>e.execCommand("ToggleAccordion")}),e.ui.registry.addToggleButton("accordionremove",{icon:"remove",tooltip:"Delete accordion",onAction:()=>e.execCommand("RemoveAccordion")}),e.ui.registry.addContextToolbar("accordion",{predicate:t=>e.dom.is(t,"details")&&e.getBody().contains(t)&&e.dom.isEditable(t.parentNode),items:"accordiontoggle accordionremove",scope:"node",position:"node"})})(e),Ce(e),(e=>{(e=>{e.on("keydown",(t=>{!t.shiftKey&&t.keyCode===Be.ENTER&&ye(e)&&(t.preventDefault(),e.execCommand("ToggleAccordion"))}))})(e),e.on("ExecCommand",(t=>{const o=t.command.toLowerCase();"delete"!==o&&"forwarddelete"!==o||!(e=>we(e).isSome())(e)||(e=>{pe.each(pe.grep(e.dom.select("details",e.getBody())),Te(e))})(e)}))})(e),(e=>{e.on("PreInit",(()=>{const{serializer:t,parser:o}=e;o.addNodeFilter(de,(e=>{for(let t=0;t0)for(let e=0;e{const t=new Set([ce]);for(let o=0;o{const r="UL"===e?"InsertUnorderedList":"InsertOrderedList";t.execCommand(r,!1,!1===s?null:{"list-style-type":s})},s=t=>e=>e.options.get(t),r=s("advlist_number_styles"),n=s("advlist_bullet_styles"),i=t=>null==t,l=t=>!i(t);var o=tinymce.util.Tools.resolve("tinymce.util.Tools");class a{constructor(t,e){this.tag=t,this.value=e}static some(t){return new a(!0,t)}static none(){return a.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?a.some(t(this.value)):a.none()}bind(t){return this.tag?t(this.value):a.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:a.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(null!=t?t:"Called getOrDie on None")}static from(t){return l(t)?a.some(t):a.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}a.singletonNone=new a(!1);const u=t=>e=>l(e)&&t.test(e.nodeName),d=u(/^(OL|UL|DL)$/),g=u(/^(TH|TD)$/),c=t=>i(t)||"default"===t?"":t,h=(t,e)=>s=>((t,e)=>{const s=t.selection.getNode();return e({parents:t.dom.getParents(s),element:s}),t.on("NodeChange",e),()=>t.off("NodeChange",e)})(t,(r=>((t,r)=>{const n=t.selection.getStart(!0);s.setActive(((t,e,s)=>((t,e,s)=>{for(let e=0,n=t.length;ee.nodeName===s&&((t,e)=>t.dom.isChildOf(e,t.getBody()))(t,e))))(t,r,e)),s.setEnabled(!((t,e)=>{const s=t.dom.getParent(e,"ol,ul,dl");return((t,e)=>null!==e&&!t.dom.isEditable(e))(t,s)&&t.selection.isEditable()})(t,n)&&t.selection.isEditable())})(t,r.parents))),m=(t,s,r,n,i,l)=>{l.length>1?((t,s,r,n,i,l)=>{t.ui.registry.addSplitButton(s,{tooltip:r,icon:"OL"===i?"ordered-list":"unordered-list",presets:"listpreview",columns:3,fetch:t=>{t(o.map(l,(t=>{const e="OL"===i?"num":"bull",s="disc"===t||"decimal"===t?"default":t,r=c(t),n=(t=>t.replace(/\-/g," ").replace(/\b\w/g,(t=>t.toUpperCase())))(t);return{type:"choiceitem",value:r,icon:"list-"+e+"-"+s,text:n}})))},onAction:()=>t.execCommand(n),onItemAction:(s,r)=>{e(t,i,r)},select:e=>{const s=(t=>{const e=t.dom.getParent(t.selection.getNode(),"ol,ul"),s=t.dom.getStyle(e,"listStyleType");return a.from(s)})(t);return s.map((t=>e===t)).getOr(!1)},onSetup:h(t,i)})})(t,s,r,n,i,l):((t,s,r,n,i,l)=>{t.ui.registry.addToggleButton(s,{active:!1,tooltip:r,icon:"OL"===i?"ordered-list":"unordered-list",onSetup:h(t,i),onAction:()=>t.queryCommandState(n)||""===l?t.execCommand(n):e(t,i,l)})})(t,s,r,n,i,c(l[0]))};t.add("advlist",(t=>{t.hasPlugin("lists")?((t=>{const e=t.options.register;e("advlist_number_styles",{processor:"string[]",default:"default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman".split(",")}),e("advlist_bullet_styles",{processor:"string[]",default:"default,circle,square".split(",")})})(t),(t=>{m(t,"numlist","Numbered list","InsertOrderedList","OL",r(t)),m(t,"bullist","Bullet list","InsertUnorderedList","UL",n(t))})(t),(t=>{t.addCommand("ApplyUnorderedListStyle",((s,r)=>{e(t,"UL",r["list-style-type"])})),t.addCommand("ApplyOrderedListStyle",((s,r)=>{e(t,"OL",r["list-style-type"])}))})(t)):console.error("Please use the Lists plugin together with the Advanced List plugin.")}))}(); \ No newline at end of file diff --git a/static/js/tinymce/plugins/anchor/plugin.min.js b/static/js/tinymce/plugins/anchor/plugin.min.js new file mode 100644 index 0000000..e1c650f --- /dev/null +++ b/static/js/tinymce/plugins/anchor/plugin.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.7.2 (2023-10-25) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.dom.RangeUtils"),o=tinymce.util.Tools.resolve("tinymce.util.Tools");const n=("allow_html_in_named_anchor",e=>e.options.get("allow_html_in_named_anchor"));const a="a:not([href])",r=e=>!e,i=e=>e.getAttribute("id")||e.getAttribute("name")||"",l=e=>(e=>"a"===e.nodeName.toLowerCase())(e)&&!e.getAttribute("href")&&""!==i(e),s=e=>e.dom.getParent(e.selection.getStart(),a),d=(e,a)=>{const r=s(e);r?((e,t,o)=>{o.removeAttribute("name"),o.id=t,e.addVisual(),e.undoManager.add()})(e,a,r):((e,a)=>{e.undoManager.transact((()=>{n(e)||e.selection.collapse(!0),e.selection.isCollapsed()?e.insertContent(e.dom.createHTML("a",{id:a})):((e=>{const n=e.dom;t(n).walk(e.selection.getRng(),(e=>{o.each(e,(e=>{var t;l(t=e)&&!t.firstChild&&n.remove(e,!1)}))}))})(e),e.formatter.remove("namedAnchor",void 0,void 0,!0),e.formatter.apply("namedAnchor",{value:a}),e.addVisual())}))})(e,a),e.focus()},c=e=>(e=>r(e.attr("href"))&&!r(e.attr("id")||e.attr("name")))(e)&&!e.firstChild,m=e=>t=>{for(let o=0;ot=>{const o=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",o),o(),()=>{e.off("NodeChange",o)}};e.add("anchor",(e=>{(e=>{(0,e.options.register)("allow_html_in_named_anchor",{processor:"boolean",default:!1})})(e),(e=>{e.on("PreInit",(()=>{e.parser.addNodeFilter("a",m("false")),e.serializer.addNodeFilter("a",m(null))}))})(e),(e=>{e.addCommand("mceAnchor",(()=>{(e=>{const t=(e=>{const t=s(e);return t?i(t):""})(e);e.windowManager.open({title:"Anchor",size:"normal",body:{type:"panel",items:[{name:"id",type:"input",label:"ID",placeholder:"example"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{id:t},onSubmit:t=>{((e,t)=>/^[A-Za-z][A-Za-z0-9\-:._]*$/.test(t)?(d(e,t),!0):(e.windowManager.alert("ID should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores."),!1))(e,t.getData().id)&&t.close()}})})(e)}))})(e),(e=>{const t=()=>e.execCommand("mceAnchor");e.ui.registry.addToggleButton("anchor",{icon:"bookmark",tooltip:"Anchor",onAction:t,onSetup:t=>{const o=e.selection.selectorChangedWithUnbind("a:not([href])",t.setActive).unbind,n=u(e)(t);return()=>{o(),n()}}}),e.ui.registry.addMenuItem("anchor",{icon:"bookmark",text:"Anchor...",onAction:t,onSetup:u(e)})})(e),e.on("PreInit",(()=>{(e=>{e.formatter.register("namedAnchor",{inline:"a",selector:a,remove:"all",split:!0,deep:!0,attributes:{id:"%value"},onmatch:(e,t,o)=>l(e)})})(e)}))}))}(); \ No newline at end of file diff --git a/static/js/tinymce/plugins/autolink/plugin.min.js b/static/js/tinymce/plugins/autolink/plugin.min.js new file mode 100644 index 0000000..220664d --- /dev/null +++ b/static/js/tinymce/plugins/autolink/plugin.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.7.2 (2023-10-25) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>t.options.get(e),n=t("autolink_pattern"),o=t("link_default_target"),r=t("link_default_protocol"),a=t("allow_unsafe_link_target"),s=("string",e=>"string"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=o=e,(r=String).prototype.isPrototypeOf(n)||(null===(a=o.constructor)||void 0===a?void 0:a.name)===r.name)?"string":t;var n,o,r,a})(e));const l=(void 0,e=>undefined===e);const i=e=>!(e=>null==e)(e),c=Object.hasOwnProperty,d=e=>"\ufeff"===e;var u=tinymce.util.Tools.resolve("tinymce.dom.TextSeeker");const f=e=>/^[(\[{ \u00a0]$/.test(e),g=(e,t,n)=>{for(let o=t-1;o>=0;o--){const t=e.charAt(o);if(!d(t)&&n(t))return o}return-1},m=(e,t)=>{var o;const a=e.schema.getVoidElements(),s=n(e),{dom:i,selection:d}=e;if(null!==i.getParent(d.getNode(),"a[href]"))return null;const m=d.getRng(),k=u(i,(e=>{return i.isBlock(e)||(t=a,n=e.nodeName.toLowerCase(),c.call(t,n))||"false"===i.getContentEditable(e);var t,n})),{container:p,offset:y}=((e,t)=>{let n=e,o=t;for(;1===n.nodeType&&n.childNodes[o];)n=n.childNodes[o],o=3===n.nodeType?n.data.length:n.childNodes.length;return{container:n,offset:o}})(m.endContainer,m.endOffset),w=null!==(o=i.getParent(p,i.isBlock))&&void 0!==o?o:i.getRoot(),h=k.backwards(p,y+t,((e,t)=>{const n=e.data,o=g(n,t,(r=f,e=>!r(e)));var r,a;return-1===o||(a=n[o],/[?!,.;:]/.test(a))?o:o+1}),w);if(!h)return null;let v=h.container;const _=k.backwards(h.container,h.offset,((e,t)=>{v=e;const n=g(e.data,t,f);return-1===n?n:n+1}),w),A=i.createRng();_?A.setStart(_.container,_.offset):A.setStart(v,0),A.setEnd(h.container,h.offset);const C=A.toString().replace(/\uFEFF/g,"").match(s);if(C){let t=C[0];return $="www.",(b=t).length>=4&&b.substr(0,4)===$?t=r(e)+"://"+t:((e,t,n=0,o)=>{const r=e.indexOf(t,n);return-1!==r&&(!!l(o)||r+t.length<=o)})(t,"@")&&!(e=>/^([A-Za-z][A-Za-z\d.+-]*:\/\/)|mailto:/.test(e))(t)&&(t="mailto:"+t),{rng:A,url:t}}var b,$;return null},k=(e,t)=>{const{dom:n,selection:r}=e,{rng:l,url:i}=t,c=r.getBookmark();r.setRng(l);const d="createlink",u={command:d,ui:!1,value:i};if(!e.dispatch("BeforeExecCommand",u).isDefaultPrevented()){e.getDoc().execCommand(d,!1,i),e.dispatch("ExecCommand",u);const t=o(e);if(s(t)){const o=r.getNode();n.setAttrib(o,"target",t),"_blank"!==t||a(e)||n.setAttrib(o,"rel","noopener")}}r.moveToBookmark(c),e.nodeChanged()},p=e=>{const t=m(e,-1);i(t)&&k(e,t)},y=p;e.add("autolink",(e=>{(e=>{const t=e.options.register;t("autolink_pattern",{processor:"regexp",default:new RegExp("^"+/(?:[A-Za-z][A-Za-z\d.+-]{0,14}:\/\/(?:[-.~*+=!&;:'%@?^${}(),\w]+@)?|www\.|[-;:&=+$,.\w]+@)[A-Za-z\d-]+(?:\.[A-Za-z\d-]+)*(?::\d+)?(?:\/(?:[-.~*+=!;:'%@$(),\/\w]*[-~*+=%@$()\/\w])?)?(?:\?(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?(?:#(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?/g.source+"$","i")}),t("link_default_target",{processor:"string"}),t("link_default_protocol",{processor:"string",default:"https"})})(e),(e=>{e.on("keydown",(t=>{13!==t.keyCode||t.isDefaultPrevented()||(e=>{const t=m(e,0);i(t)&&k(e,t)})(e)})),e.on("keyup",(t=>{32===t.keyCode?p(e):(48===t.keyCode&&t.shiftKey||221===t.keyCode)&&y(e)}))})(e)}))}(); \ No newline at end of file diff --git a/static/js/tinymce/plugins/autoresize/plugin.min.js b/static/js/tinymce/plugins/autoresize/plugin.min.js new file mode 100644 index 0000000..0432684 --- /dev/null +++ b/static/js/tinymce/plugins/autoresize/plugin.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.7.2 (2023-10-25) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.Env");const o=e=>t=>t.options.get(e),s=o("min_height"),i=o("max_height"),n=o("autoresize_overflow_padding"),r=o("autoresize_bottom_margin"),l=(e,t)=>{const o=e.getBody();o&&(o.style.overflowY=t?"":"hidden",t||(o.scrollTop=0))},g=(e,t,o,s)=>{var i;const n=parseInt(null!==(i=e.getStyle(t,o,s))&&void 0!==i?i:"",10);return isNaN(n)?0:n},a=(e,o,r,c)=>{var d;const f=e.dom,u=e.getDoc();if(!u)return;if((e=>e.plugins.fullscreen&&e.plugins.fullscreen.isFullscreen())(e))return void l(e,!0);const m=u.documentElement,h=c?c():n(e),p=null!==(d=s(e))&&void 0!==d?d:e.getElement().offsetHeight;let y=p;const S=g(f,m,"margin-top",!0),v=g(f,m,"margin-bottom",!0);let C=m.offsetHeight+S+v+h;C<0&&(C=0);const b=e.getContainer().offsetHeight-e.getContentAreaContainer().offsetHeight;C+b>p&&(y=C+b);const w=i(e);if(w&&y>w?(y=w,l(e,!0)):l(e,!1),y!==o.get()){const s=y-o.get();if(f.setStyle(e.getContainer(),"height",y+"px"),o.set(y),(e=>{e.dispatch("ResizeEditor")})(e),t.browser.isSafari()&&(t.os.isMacOS()||t.os.isiOS())){const t=e.getWin();t.scrollTo(t.pageXOffset,t.pageYOffset)}e.hasFocus()&&(e=>{if("setcontent"===(null==e?void 0:e.type.toLowerCase())){const t=e;return!0===t.selection||!0===t.paste}return!1})(r)&&e.selection.scrollIntoView(),(t.browser.isSafari()||t.browser.isChromium())&&s<0&&a(e,o,r,c)}};e.add("autoresize",(e=>{if((e=>{const t=e.options.register;t("autoresize_overflow_padding",{processor:"number",default:1}),t("autoresize_bottom_margin",{processor:"number",default:50})})(e),e.options.isSet("resize")||e.options.set("resize",!1),!e.inline){const o=(e=>{let t=0;return{get:()=>t,set:e=>{t=e}}})();((e,t)=>{e.addCommand("mceAutoResize",(()=>{a(e,t)}))})(e,o),((e,o)=>{let s,i,l=()=>r(e);e.on("init",(i=>{s=0;const r=n(e),g=e.dom;g.setStyles(e.getDoc().documentElement,{height:"auto"}),t.browser.isEdge()||t.browser.isIE()?g.setStyles(e.getBody(),{paddingLeft:r,paddingRight:r,"min-height":0}):g.setStyles(e.getBody(),{paddingLeft:r,paddingRight:r}),a(e,o,i,l),s+=1})),e.on("NodeChange SetContent keyup FullscreenStateChanged ResizeContent",(t=>{if(1===s)i=e.getContainer().offsetHeight,a(e,o,t,l),s+=1;else if(2===s){const t=i0):l,s+=1}else a(e,o,t,l)}))})(e,o)}}))}(); \ No newline at end of file diff --git a/static/js/tinymce/plugins/autosave/plugin.min.js b/static/js/tinymce/plugins/autosave/plugin.min.js new file mode 100644 index 0000000..362325f --- /dev/null +++ b/static/js/tinymce/plugins/autosave/plugin.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.7.2 (2023-10-25) + */ +!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=("string",t=>"string"===(t=>{const e=typeof t;return null===t?"null":"object"===e&&Array.isArray(t)?"array":"object"===e&&(r=o=t,(a=String).prototype.isPrototypeOf(r)||(null===(s=o.constructor)||void 0===s?void 0:s.name)===a.name)?"string":e;var r,o,a,s})(t));const r=(void 0,t=>undefined===t);var o=tinymce.util.Tools.resolve("tinymce.util.Delay"),a=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),s=tinymce.util.Tools.resolve("tinymce.util.Tools");const n=t=>{const e=/^(\d+)([ms]?)$/.exec(t);return(e&&e[2]?{s:1e3,m:6e4}[e[2]]:1)*parseInt(t,10)},i=t=>e=>e.options.get(t),u=i("autosave_ask_before_unload"),l=i("autosave_restore_when_empty"),c=i("autosave_interval"),d=i("autosave_retention"),m=t=>{const e=document.location;return t.options.get("autosave_prefix").replace(/{path}/g,e.pathname).replace(/{query}/g,e.search).replace(/{hash}/g,e.hash).replace(/{id}/g,t.id)},v=(t,e)=>{if(r(e))return t.dom.isEmpty(t.getBody());{const r=s.trim(e);if(""===r)return!0;{const e=(new DOMParser).parseFromString(r,"text/html");return t.dom.isEmpty(e)}}},f=t=>{var e;const r=parseInt(null!==(e=a.getItem(m(t)+"time"))&&void 0!==e?e:"0",10)||0;return!((new Date).getTime()-r>d(t)&&(p(t,!1),1))},p=(t,e)=>{const r=m(t);a.removeItem(r+"draft"),a.removeItem(r+"time"),!1!==e&&(t=>{t.dispatch("RemoveDraft")})(t)},g=t=>{const e=m(t);!v(t)&&t.isDirty()&&(a.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),a.setItem(e+"time",(new Date).getTime().toString()),(t=>{t.dispatch("StoreDraft")})(t))},y=t=>{var e;const r=m(t);f(t)&&(t.setContent(null!==(e=a.getItem(r+"draft"))&&void 0!==e?e:"",{format:"raw"}),(t=>{t.dispatch("RestoreDraft")})(t))};var D=tinymce.util.Tools.resolve("tinymce.EditorManager");const h=t=>e=>{e.setEnabled(f(t));const r=()=>e.setEnabled(f(t));return t.on("StoreDraft RestoreDraft RemoveDraft",r),()=>t.off("StoreDraft RestoreDraft RemoveDraft",r)};t.add("autosave",(t=>((t=>{const r=t.options.register,o=t=>{const r=e(t);return r?{value:n(t),valid:r}:{valid:!1,message:"Must be a string."}};r("autosave_ask_before_unload",{processor:"boolean",default:!0}),r("autosave_prefix",{processor:"string",default:"tinymce-autosave-{path}{query}{hash}-{id}-"}),r("autosave_restore_when_empty",{processor:"boolean",default:!1}),r("autosave_interval",{processor:o,default:"30s"}),r("autosave_retention",{processor:o,default:"20m"})})(t),(t=>{t.editorManager.on("BeforeUnload",(t=>{let e;s.each(D.get(),(t=>{t.plugins.autosave&&t.plugins.autosave.storeDraft(),!e&&t.isDirty()&&u(t)&&(e=t.translate("You have unsaved changes are you sure you want to navigate away?"))})),e&&(t.preventDefault(),t.returnValue=e)}))})(t),(t=>{(t=>{const e=c(t);o.setEditorInterval(t,(()=>{g(t)}),e)})(t);const e=()=>{(t=>{t.undoManager.transact((()=>{y(t),p(t)})),t.focus()})(t)};t.ui.registry.addButton("restoredraft",{tooltip:"Restore last draft",icon:"restore-draft",onAction:e,onSetup:h(t)}),t.ui.registry.addMenuItem("restoredraft",{text:"Restore last draft",icon:"restore-draft",onAction:e,onSetup:h(t)})})(t),t.on("init",(()=>{l(t)&&t.dom.isEmpty(t.getBody())&&y(t)})),(t=>({hasDraft:()=>f(t),storeDraft:()=>g(t),restoreDraft:()=>y(t),removeDraft:e=>p(t,e),isEmpty:e=>v(t,e)}))(t))))}(); \ No newline at end of file diff --git a/static/js/tinymce/plugins/charmap/plugin.min.js b/static/js/tinymce/plugins/charmap/plugin.min.js new file mode 100644 index 0000000..9660ebd --- /dev/null +++ b/static/js/tinymce/plugins/charmap/plugin.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.7.2 (2023-10-25) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=(e,t)=>{const r=((e,t)=>e.dispatch("insertCustomChar",{chr:t}))(e,t).chr;e.execCommand("mceInsertContent",!1,r)},r=e=>t=>e===t,a=("array",e=>"array"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(r=a=e,(n=String).prototype.isPrototypeOf(r)||(null===(i=a.constructor)||void 0===i?void 0:i.name)===n.name)?"string":t;var r,a,n,i})(e));const n=r(null),i=r(void 0),o=e=>"function"==typeof e,s=(!1,()=>false);class l{constructor(e,t){this.tag=e,this.value=t}static some(e){return new l(!0,e)}static none(){return l.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?l.some(e(this.value)):l.none()}bind(e){return this.tag?e(this.value):l.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:l.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return null==e?l.none():l.some(e)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}l.singletonNone=new l(!1);const c=Array.prototype.push,u=(e,t)=>{const r=e.length,a=new Array(r);for(let n=0;nt=>t.options.get(e),m=h("charmap"),p=h("charmap_append"),d=g.isArray,f="User Defined",y=e=>{return d(e)?(t=e,g.grep(t,(e=>d(e)&&2===e.length))):"function"==typeof e?e():[];var t},b=e=>{const t=((e,t)=>{const r=m(e);r&&(t=[{name:f,characters:y(r)}]);const a=p(e);if(a){const e=g.grep(t,(e=>e.name===f));return e.length?(e[0].characters=[...e[0].characters,...y(a)],t):t.concat({name:f,characters:y(a)})}return t})(e,[{name:"Currency",characters:[[36,"dollar sign"],[162,"cent sign"],[8364,"euro sign"],[163,"pound sign"],[165,"yen sign"],[164,"currency sign"],[8352,"euro-currency sign"],[8353,"colon sign"],[8354,"cruzeiro sign"],[8355,"french franc sign"],[8356,"lira sign"],[8357,"mill sign"],[8358,"naira sign"],[8359,"peseta sign"],[8360,"rupee sign"],[8361,"won sign"],[8362,"new sheqel sign"],[8363,"dong sign"],[8365,"kip sign"],[8366,"tugrik sign"],[8367,"drachma sign"],[8368,"german penny symbol"],[8369,"peso sign"],[8370,"guarani sign"],[8371,"austral sign"],[8372,"hryvnia sign"],[8373,"cedi sign"],[8374,"livre tournois sign"],[8375,"spesmilo sign"],[8376,"tenge sign"],[8377,"indian rupee sign"],[8378,"turkish lira sign"],[8379,"nordic mark sign"],[8380,"manat sign"],[8381,"ruble sign"],[20870,"yen character"],[20803,"yuan character"],[22291,"yuan character, in hong kong and taiwan"],[22278,"yen/yuan character variant one"]]},{name:"Text",characters:[[169,"copyright sign"],[174,"registered sign"],[8482,"trade mark sign"],[8240,"per mille sign"],[181,"micro sign"],[183,"middle dot"],[8226,"bullet"],[8230,"three dot leader"],[8242,"minutes / feet"],[8243,"seconds / inches"],[167,"section sign"],[182,"paragraph sign"],[223,"sharp s / ess-zed"]]},{name:"Quotations",characters:[[8249,"single left-pointing angle quotation mark"],[8250,"single right-pointing angle quotation mark"],[171,"left pointing guillemet"],[187,"right pointing guillemet"],[8216,"left single quotation mark"],[8217,"right single quotation mark"],[8220,"left double quotation mark"],[8221,"right double quotation mark"],[8218,"single low-9 quotation mark"],[8222,"double low-9 quotation mark"],[60,"less-than sign"],[62,"greater-than sign"],[8804,"less-than or equal to"],[8805,"greater-than or equal to"],[8211,"en dash"],[8212,"em dash"],[175,"macron"],[8254,"overline"],[164,"currency sign"],[166,"broken bar"],[168,"diaeresis"],[161,"inverted exclamation mark"],[191,"turned question mark"],[710,"circumflex accent"],[732,"small tilde"],[176,"degree sign"],[8722,"minus sign"],[177,"plus-minus sign"],[247,"division sign"],[8260,"fraction slash"],[215,"multiplication sign"],[185,"superscript one"],[178,"superscript two"],[179,"superscript three"],[188,"fraction one quarter"],[189,"fraction one half"],[190,"fraction three quarters"]]},{name:"Mathematical",characters:[[402,"function / florin"],[8747,"integral"],[8721,"n-ary sumation"],[8734,"infinity"],[8730,"square root"],[8764,"similar to"],[8773,"approximately equal to"],[8776,"almost equal to"],[8800,"not equal to"],[8801,"identical to"],[8712,"element of"],[8713,"not an element of"],[8715,"contains as member"],[8719,"n-ary product"],[8743,"logical and"],[8744,"logical or"],[172,"not sign"],[8745,"intersection"],[8746,"union"],[8706,"partial differential"],[8704,"for all"],[8707,"there exists"],[8709,"diameter"],[8711,"backward difference"],[8727,"asterisk operator"],[8733,"proportional to"],[8736,"angle"]]},{name:"Extended Latin",characters:[[192,"A - grave"],[193,"A - acute"],[194,"A - circumflex"],[195,"A - tilde"],[196,"A - diaeresis"],[197,"A - ring above"],[256,"A - macron"],[198,"ligature AE"],[199,"C - cedilla"],[200,"E - grave"],[201,"E - acute"],[202,"E - circumflex"],[203,"E - diaeresis"],[274,"E - macron"],[204,"I - grave"],[205,"I - acute"],[206,"I - circumflex"],[207,"I - diaeresis"],[298,"I - macron"],[208,"ETH"],[209,"N - tilde"],[210,"O - grave"],[211,"O - acute"],[212,"O - circumflex"],[213,"O - tilde"],[214,"O - diaeresis"],[216,"O - slash"],[332,"O - macron"],[338,"ligature OE"],[352,"S - caron"],[217,"U - grave"],[218,"U - acute"],[219,"U - circumflex"],[220,"U - diaeresis"],[362,"U - macron"],[221,"Y - acute"],[376,"Y - diaeresis"],[562,"Y - macron"],[222,"THORN"],[224,"a - grave"],[225,"a - acute"],[226,"a - circumflex"],[227,"a - tilde"],[228,"a - diaeresis"],[229,"a - ring above"],[257,"a - macron"],[230,"ligature ae"],[231,"c - cedilla"],[232,"e - grave"],[233,"e - acute"],[234,"e - circumflex"],[235,"e - diaeresis"],[275,"e - macron"],[236,"i - grave"],[237,"i - acute"],[238,"i - circumflex"],[239,"i - diaeresis"],[299,"i - macron"],[240,"eth"],[241,"n - tilde"],[242,"o - grave"],[243,"o - acute"],[244,"o - circumflex"],[245,"o - tilde"],[246,"o - diaeresis"],[248,"o slash"],[333,"o macron"],[339,"ligature oe"],[353,"s - caron"],[249,"u - grave"],[250,"u - acute"],[251,"u - circumflex"],[252,"u - diaeresis"],[363,"u - macron"],[253,"y - acute"],[254,"thorn"],[255,"y - diaeresis"],[563,"y - macron"],[913,"Alpha"],[914,"Beta"],[915,"Gamma"],[916,"Delta"],[917,"Epsilon"],[918,"Zeta"],[919,"Eta"],[920,"Theta"],[921,"Iota"],[922,"Kappa"],[923,"Lambda"],[924,"Mu"],[925,"Nu"],[926,"Xi"],[927,"Omicron"],[928,"Pi"],[929,"Rho"],[931,"Sigma"],[932,"Tau"],[933,"Upsilon"],[934,"Phi"],[935,"Chi"],[936,"Psi"],[937,"Omega"],[945,"alpha"],[946,"beta"],[947,"gamma"],[948,"delta"],[949,"epsilon"],[950,"zeta"],[951,"eta"],[952,"theta"],[953,"iota"],[954,"kappa"],[955,"lambda"],[956,"mu"],[957,"nu"],[958,"xi"],[959,"omicron"],[960,"pi"],[961,"rho"],[962,"final sigma"],[963,"sigma"],[964,"tau"],[965,"upsilon"],[966,"phi"],[967,"chi"],[968,"psi"],[969,"omega"]]},{name:"Symbols",characters:[[8501,"alef symbol"],[982,"pi symbol"],[8476,"real part symbol"],[978,"upsilon - hook symbol"],[8472,"Weierstrass p"],[8465,"imaginary part"]]},{name:"Arrows",characters:[[8592,"leftwards arrow"],[8593,"upwards arrow"],[8594,"rightwards arrow"],[8595,"downwards arrow"],[8596,"left right arrow"],[8629,"carriage return"],[8656,"leftwards double arrow"],[8657,"upwards double arrow"],[8658,"rightwards double arrow"],[8659,"downwards double arrow"],[8660,"left right double arrow"],[8756,"therefore"],[8834,"subset of"],[8835,"superset of"],[8836,"not a subset of"],[8838,"subset of or equal to"],[8839,"superset of or equal to"],[8853,"circled plus"],[8855,"circled times"],[8869,"perpendicular"],[8901,"dot operator"],[8968,"left ceiling"],[8969,"right ceiling"],[8970,"left floor"],[8971,"right floor"],[9001,"left-pointing angle bracket"],[9002,"right-pointing angle bracket"],[9674,"lozenge"],[9824,"black spade suit"],[9827,"black club suit"],[9829,"black heart suit"],[9830,"black diamond suit"],[8194,"en space"],[8195,"em space"],[8201,"thin space"],[8204,"zero width non-joiner"],[8205,"zero width joiner"],[8206,"left-to-right mark"],[8207,"right-to-left mark"]]}]);return t.length>1?[{name:"All",characters:(r=t,n=e=>e.characters,(e=>{const t=[];for(let r=0,n=e.length;r{let t=e;return{get:()=>t,set:e=>{t=e}}},v=(e,t,r=0,a)=>{const n=e.indexOf(t,r);return-1!==n&&(!!i(a)||n+t.length<=a)},k=String.fromCodePoint,C=(e,t)=>{const r=[],a=t.toLowerCase();return((e,t)=>{for(let t=0,i=e.length;t!!v(k(e).toLowerCase(),r)||v(t.toLowerCase(),r)||v(t.toLowerCase().replace(/\s+/g,""),r))((n=e[t])[0],n[1],a)&&r.push(n);var n})(e.characters),u(r,(e=>({text:e[1],value:k(e[0]),icon:k(e[0])})))},x="pattern",A=(e,r)=>{const a=()=>[{label:"Search",type:"input",name:x},{type:"collection",name:"results"}],i=1===r.length?w(f):w("All"),o=((e,t)=>{let r=null;const a=()=>{n(r)||(clearTimeout(r),r=null)};return{cancel:a,throttle:(...t)=>{a(),r=setTimeout((()=>{r=null,e.apply(null,t)}),40)}}})((e=>{const t=e.getData().pattern;((e,t)=>{var a,n;(a=r,n=e=>e.name===i.get(),((e,t,r)=>{for(let a=0,n=e.length;a{const a=C(r,t);e.setData({results:a})}))})(e,t)})),c={title:"Special Character",size:"normal",body:1===r.length?{type:"panel",items:a()}:{type:"tabpanel",tabs:u(r,(e=>({title:e.name,name:e.name,items:a()})))},buttons:[{type:"cancel",name:"close",text:"Close",primary:!0}],initialData:{pattern:"",results:C(r[0],"")},onAction:(r,a)=>{"results"===a.name&&(t(e,a.value),r.close())},onTabChange:(e,t)=>{i.set(t.newTabName),o.throttle(e)},onChange:(e,t)=>{t.name===x&&o.throttle(e)}};e.windowManager.open(c).focus(x)},q=e=>t=>{const r=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",r),r(),()=>{e.off("NodeChange",r)}};e.add("charmap",(e=>{(e=>{const t=e.options.register,r=e=>o(e)||a(e);t("charmap",{processor:r}),t("charmap_append",{processor:r})})(e);const r=b(e);return((e,t)=>{e.addCommand("mceShowCharmap",(()=>{A(e,t)}))})(e,r),(e=>{const t=()=>e.execCommand("mceShowCharmap");e.ui.registry.addButton("charmap",{icon:"insert-character",tooltip:"Special character",onAction:t,onSetup:q(e)}),e.ui.registry.addMenuItem("charmap",{icon:"insert-character",text:"Special character...",onAction:t,onSetup:q(e)})})(e),((e,t)=>{e.ui.registry.addAutocompleter("charmap",{trigger:":",columns:"auto",minChars:2,fetch:(e,r)=>new Promise(((r,a)=>{r(C(t,e))})),onAction:(t,r,a)=>{e.selection.setRng(r),e.insertContent(a),t.hide()}})})(e,r[0]),(e=>({getCharMap:()=>b(e),insertChar:r=>{t(e,r)}}))(e)}))}(); \ No newline at end of file diff --git a/static/js/tinymce/plugins/code/plugin.min.js b/static/js/tinymce/plugins/code/plugin.min.js new file mode 100644 index 0000000..644eee5 --- /dev/null +++ b/static/js/tinymce/plugins/code/plugin.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.7.2 (2023-10-25) + */ +!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("code",(e=>((e=>{e.addCommand("mceCodeEditor",(()=>{(e=>{const o=(e=>e.getContent({source_view:!0}))(e);e.windowManager.open({title:"Source Code",size:"large",body:{type:"panel",items:[{type:"textarea",name:"code"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{code:o},onSubmit:o=>{((e,o)=>{e.focus(),e.undoManager.transact((()=>{e.setContent(o)})),e.selection.setCursorLocation(),e.nodeChanged()})(e,o.getData().code),o.close()}})})(e)}))})(e),(e=>{const o=()=>e.execCommand("mceCodeEditor");e.ui.registry.addButton("code",{icon:"sourcecode",tooltip:"Source code",onAction:o}),e.ui.registry.addMenuItem("code",{icon:"sourcecode",text:"Source code",onAction:o})})(e),{})))}(); \ No newline at end of file diff --git a/static/js/tinymce/plugins/codesample/plugin.min.js b/static/js/tinymce/plugins/codesample/plugin.min.js new file mode 100644 index 0000000..71d3e4f --- /dev/null +++ b/static/js/tinymce/plugins/codesample/plugin.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.7.2 (2023-10-25) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>!(e=>null==e)(e),n=()=>{};class a{constructor(e,t){this.tag=e,this.value=t}static some(e){return new a(!0,e)}static none(){return a.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?a.some(e(this.value)):a.none()}bind(e){return this.tag?e(this.value):a.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:a.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return t(e)?a.some(e):a.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}a.singletonNone=new a(!1);var s=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils");const r="undefined"!=typeof window?window:Function("return this;")(),i=function(e,t,n){const a=window.Prism;window.Prism={manual:!0};var s=function(e){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,a={},s={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(t){return t instanceof r?new r(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);x+=_.value.length,_=_.next){var F=_.value;if(t.length>e.length)return;if(!(F instanceof r)){var A,S=1;if(y){if(!(A=i(v,x,e,m))||A.index>=e.length)break;var $=A.index,z=A.index+A[0].length,E=x;for(E+=_.value.length;$>=E;)E+=(_=_.next).value.length;if(x=E-=_.value.length,_.value instanceof r)continue;for(var C=_;C!==t.tail&&(Ed.reach&&(d.reach=O);var P=_.prev;if(B&&(P=u(t,P,B),x+=B.length),c(t,P,S),_=u(t,P,new r(g,f?s.tokenize(j,f):j,w,j)),T&&u(t,_,T),S>1){var N={cause:g+","+b,reach:O};o(e,t,n,_.prev,x,N),d&&N.reach>d.reach&&(d.reach=N.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function u(e,t,n){var a=t.next,s={value:n,prev:t,next:a};return t.next=s,a.prev=s,e.length++,s}function c(e,t,n){for(var a=t.next,s=0;s"+r.content+""},!e.document)return e.addEventListener?(s.disableWorkerMessageHandler||e.addEventListener("message",(function(t){var n=JSON.parse(t.data),a=n.language,r=n.code,i=n.immediateClose;e.postMessage(s.highlight(r,s.languages[a],a)),i&&e.close()}),!1),s):s;var d=s.util.currentScript();function g(){s.manual||s.highlightAll()}if(d&&(s.filename=d.src,d.hasAttribute("data-manual")&&(s.manual=!0)),!s.manual){var p=document.readyState;"loading"===p||"interactive"===p&&d&&d.defer?document.addEventListener("DOMContentLoaded",g):window.requestAnimationFrame?window.requestAnimationFrame(g):window.setTimeout(g,16)}return s}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});return s.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,a,s,r){if(n.language===a){var i=n.tokenStack=[];n.code=n.code.replace(s,(function(e){if("function"==typeof r&&!r(e))return e;for(var s,o=i.length;-1!==n.code.indexOf(s=t(a,o));)++o;return i[o]=e,s})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,a){if(n.language===a&&n.tokenStack){n.grammar=e.languages[a];var s=0,r=Object.keys(n.tokenStack);!function i(o){for(var l=0;l=r.length);l++){var u=o[l];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=r[s],d=n.tokenStack[c],g="string"==typeof u?u:u.content,p=t(a,c),b=g.indexOf(p);if(b>-1){++s;var h=g.substring(0,b),f=new e.Token(a,e.tokenize(d,n.grammar),"language-"+a,d),m=g.substring(b+p.length),y=[];h&&y.push.apply(y,i([h])),y.push(f),m&&y.push.apply(y,i([m])),"string"==typeof u?o.splice.apply(o,[l,1].concat(y)):u.content=y}}else u.content&&i(u.content)}return o}(n.tokens)}}}})}(s),s.languages.c=s.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),s.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),s.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},s.languages.c.string],char:s.languages.c.char,comment:s.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:s.languages.c}}}}),s.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete s.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(s),function(e){function t(e,t){return e.replace(/<<(\d+)>>/g,(function(e,n){return"(?:"+t[+n]+")"}))}function n(e,n,a){return RegExp(t(e,n),a||"")}function a(e,t){for(var n=0;n>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}var s="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var u=l(r),c=RegExp(l(s+" "+r+" "+i+" "+o)),d=l(r+" "+i+" "+o),g=l(s+" "+r+" "+o),p=a(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),b=a(/\((?:[^()]|<>)*\)/.source,2),h=/@?\b[A-Za-z_]\w*\b/.source,f=t(/<<0>>(?:\s*<<1>>)?/.source,[h,p]),m=t(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[d,f]),y=/\[\s*(?:,\s*)*\]/.source,w=t(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[m,y]),k=t(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[p,b,y]),v=t(/\(<<0>>+(?:,<<0>>+)+\)/.source,[k]),_=t(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[v,m,y]),x={keyword:c,punctuation:/[<>()?,.:[\]]/},F=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,A=/"(?:\\.|[^\\"\r\n])*"/.source,S=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;e.languages.csharp=e.languages.extend("clike",{string:[{pattern:n(/(^|[^$\\])<<0>>/.source,[S]),lookbehind:!0,greedy:!0},{pattern:n(/(^|[^@$\\])<<0>>/.source,[A]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:n(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[m]),lookbehind:!0,inside:x},{pattern:n(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[h,_]),lookbehind:!0,inside:x},{pattern:n(/(\busing\s+)<<0>>(?=\s*=)/.source,[h]),lookbehind:!0},{pattern:n(/(\b<<0>>\s+)<<1>>/.source,[u,f]),lookbehind:!0,inside:x},{pattern:n(/(\bcatch\s*\(\s*)<<0>>/.source,[m]),lookbehind:!0,inside:x},{pattern:n(/(\bwhere\s+)<<0>>/.source,[h]),lookbehind:!0},{pattern:n(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[w]),lookbehind:!0,inside:x},{pattern:n(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[_,g,h]),inside:x}],keyword:c,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:n(/([(,]\s*)<<0>>(?=\s*:)/.source,[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:n(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:n(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[b]),lookbehind:!0,alias:"class-name",inside:x},"return-type":{pattern:n(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[_,m]),inside:x,alias:"class-name"},"constructor-invocation":{pattern:n(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[_]),lookbehind:!0,inside:x,alias:"class-name"},"generic-method":{pattern:n(/<<0>>\s*<<1>>(?=\s*\()/.source,[h,p]),inside:{function:n(/^<<0>>/.source,[h]),generic:{pattern:RegExp(p),alias:"class-name",inside:x}}},"type-list":{pattern:n(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[u,f,h,_,c.source,b,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:n(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[f,b]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:c,"class-name":{pattern:RegExp(_),greedy:!0,inside:x},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var $=A+"|"+F,z=t(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[$]),E=a(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[z]),2),C=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,j=t(/<<0>>(?:\s*\(<<1>>*\))?/.source,[m,E]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:n(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[C,j]),lookbehind:!0,greedy:!0,inside:{target:{pattern:n(/^<<0>>(?=\s*:)/.source,[C]),alias:"keyword"},"attribute-arguments":{pattern:n(/\(<<0>>*\)/.source,[E]),inside:e.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var B=/:[^}\r\n]+/.source,T=a(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[z]),2),O=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[T,B]),P=a(t(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[$]),2),N=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[P,B]);function R(t,a){return{interpolation:{pattern:n(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[t]),lookbehind:!0,inside:{"format-string":{pattern:n(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[a,B]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:n(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[O]),lookbehind:!0,greedy:!0,inside:R(O,T)},{pattern:n(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[N]),lookbehind:!0,greedy:!0,inside:R(N,P)}],char:{pattern:RegExp(F),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(s),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+t.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(s),function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,a={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[a,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:a.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:a.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:a.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(s),s.languages.javascript=s.languages.extend("clike",{"class-name":[s.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),s.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,s.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:s.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:s.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:s.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:s.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:s.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),s.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:s.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),s.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),s.languages.markup&&(s.languages.markup.tag.addInlined("script","javascript"),s.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),s.languages.js=s.languages.javascript,s.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},s.languages.markup.tag.inside["attr-value"].inside.entity=s.languages.markup.entity,s.languages.markup.doctype.inside["internal-subset"].inside=s.languages.markup,s.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(s.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:s.languages[t]},n.cdata=/^$/i;var a={"included-cdata":{pattern://i,inside:n}};a["language-"+t]={pattern:/[\s\S]+/,inside:s.languages[t]};var r={};r[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:a},s.languages.insertBefore("markup","cdata",r)}}),Object.defineProperty(s.languages.markup.tag,"addAttribute",{value:function(e,t){s.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:s.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),s.languages.html=s.languages.markup,s.languages.mathml=s.languages.markup,s.languages.svg=s.languages.markup,s.languages.xml=s.languages.extend("markup",{}),s.languages.ssml=s.languages.xml,s.languages.atom=s.languages.xml,s.languages.rss=s.languages.xml,function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],a=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,s=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,r=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:a,operator:s,punctuation:r};var i={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},o=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:i}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:i}}];e.languages.insertBefore("php","variable",{string:o,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:o,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:a,operator:s,punctuation:r}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(t){/<\?/.test(t.code)&&e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")}))}(s),s.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},s.languages.python["string-interpolation"].inside.interpolation.inside.rest=s.languages.python,s.languages.py=s.languages.python,function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===||[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var t={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var n="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",a=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+n+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+a),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+a+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+n),greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+n),greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(s),window.Prism=a,s}(),o=e=>t=>t.options.get(e),l=o("codesample_languages"),u=o("codesample_global_prismjs"),c=e=>r.Prism&&u(e)?r.Prism:i,d=e=>t(e)&&"PRE"===e.nodeName&&-1!==e.className.indexOf("language-"),g=e=>{const t=e.selection?e.selection.getNode():null;return d(t)?a.some(t):a.none()},p=e=>{const t=(e=>l(e)||[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}])(e),n=(r=t,((e,t)=>0""),(e=>e.value));var r;const i=((e,t)=>g(e).fold((()=>t),(e=>{const n=e.className.match(/language-(\w+)/);return n?n[1]:t})))(e,n),o=(e=>g(e).bind((e=>a.from(e.textContent))).getOr(""))(e);e.windowManager.open({title:"Insert/Edit Code Sample",size:"large",body:{type:"panel",items:[{type:"listbox",name:"language",label:"Language",items:t},{type:"textarea",name:"code",label:"Code view"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{language:i,code:o},onSubmit:t=>{const n=t.getData();((e,t,n)=>{const a=e.dom;e.undoManager.transact((()=>{const r=g(e);return n=s.DOM.encode(n),r.fold((()=>{e.insertContent('
      '+n+"
      ");const s=a.select("#__new")[0];a.setAttrib(s,"id",null),e.selection.select(s)}),(s=>{a.setAttrib(s,"class","language-"+t),s.innerHTML=n,c(e).highlightElement(s),e.selection.select(s)}))}))})(e,n.language,n.code),t.close()}})},b=(h=/^\s+|\s+$/g,e=>e.replace(h,""));var h,f=tinymce.util.Tools.resolve("tinymce.util.Tools");const m=(e,t=n)=>n=>{const a=()=>{n.setEnabled(e.selection.isEditable()),t(n)};return e.on("NodeChange",a),a(),()=>{e.off("NodeChange",a)}};e.add("codesample",(e=>{(e=>{const t=e.options.register;t("codesample_languages",{processor:"object[]"}),t("codesample_global_prismjs",{processor:"boolean",default:!1})})(e),(e=>{e.on("PreProcess",(t=>{const n=e.dom,a=n.select("pre[contenteditable=false]",t.node);f.each(f.grep(a,d),(e=>{const t=e.textContent;let a;for(n.setAttrib(e,"class",b(n.getAttrib(e,"class"))),n.setAttrib(e,"contentEditable",null),n.setAttrib(e,"data-mce-highlighted",null);a=e.firstChild;)e.removeChild(a);n.add(e,"code").textContent=t}))})),e.on("SetContent",(()=>{const t=e.dom,n=f.grep(t.select("pre"),(e=>d(e)&&"true"!==t.getAttrib(e,"data-mce-highlighted")));n.length&&e.undoManager.transact((()=>{f.each(n,(n=>{var a;f.each(t.select("br",n),(n=>{t.replace(e.getDoc().createTextNode("\n"),n)})),n.innerHTML=t.encode(null!==(a=n.textContent)&&void 0!==a?a:""),c(e).highlightElement(n),t.setAttrib(n,"data-mce-highlighted",!0),n.className=b(n.className)}))}))})),e.on("PreInit",(()=>{e.parser.addNodeFilter("pre",(e=>{var t;for(let n=0,a=e.length;n{const t=()=>e.execCommand("codesample");e.ui.registry.addToggleButton("codesample",{icon:"code-sample",tooltip:"Insert/edit code sample",onAction:t,onSetup:m(e,(t=>{t.setActive((e=>{const t=e.selection.getStart();return e.dom.is(t,'pre[class*="language-"]')})(e))}))}),e.ui.registry.addMenuItem("codesample",{text:"Code sample...",icon:"code-sample",onAction:t,onSetup:m(e)})})(e),(e=>{e.addCommand("codesample",(()=>{const t=e.selection.getNode();e.selection.isCollapsed()||d(t)?p(e):e.formatter.toggle("code")}))})(e),e.on("dblclick",(t=>{d(t.target)&&p(e)}))}))}(); \ No newline at end of file diff --git a/static/js/tinymce/plugins/directionality/plugin.min.js b/static/js/tinymce/plugins/directionality/plugin.min.js new file mode 100644 index 0000000..d6a2eac --- /dev/null +++ b/static/js/tinymce/plugins/directionality/plugin.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.7.2 (2023-10-25) + */ +!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=t=>e=>typeof e===t,o=t=>"string"===(t=>{const e=typeof t;return null===t?"null":"object"===e&&Array.isArray(t)?"array":"object"===e&&(o=r=t,(n=String).prototype.isPrototypeOf(o)||(null===(i=r.constructor)||void 0===i?void 0:i.name)===n.name)?"string":e;var o,r,n,i})(t),r=e("boolean"),n=t=>!(t=>null==t)(t),i=e("function"),s=e("number"),l=(!1,()=>false);class a{constructor(t,e){this.tag=t,this.value=e}static some(t){return new a(!0,t)}static none(){return a.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?a.some(t(this.value)):a.none()}bind(t){return this.tag?t(this.value):a.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:a.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(null!=t?t:"Called getOrDie on None")}static from(t){return n(t)?a.some(t):a.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}a.singletonNone=new a(!1);const u=(t,e)=>{for(let o=0,r=t.length;o{if(null==t)throw new Error("Node cannot be null or undefined");return{dom:t}},d=c,h=(t,e)=>{const o=t.dom;if(1!==o.nodeType)return!1;{const t=o;if(void 0!==t.matches)return t.matches(e);if(void 0!==t.msMatchesSelector)return t.msMatchesSelector(e);if(void 0!==t.webkitMatchesSelector)return t.webkitMatchesSelector(e);if(void 0!==t.mozMatchesSelector)return t.mozMatchesSelector(e);throw new Error("Browser lacks native selectors")}};"undefined"!=typeof window?window:Function("return this;")();const m=t=>e=>(t=>t.dom.nodeType)(e)===t,g=m(1),f=m(3),v=m(9),y=m(11),p=(t,e)=>{t.dom.removeAttribute(e)},w=i(Element.prototype.attachShadow)&&i(Node.prototype.getRootNode)?t=>d(t.dom.getRootNode()):t=>v(t)?t:d(t.dom.ownerDocument),b=t=>d(t.dom.host),N=t=>{const e=f(t)?t.dom.parentNode:t.dom;if(null==e||null===e.ownerDocument)return!1;const o=e.ownerDocument;return(t=>{const e=w(t);return y(o=e)&&n(o.dom.host)?a.some(e):a.none();var o})(d(e)).fold((()=>o.body.contains(e)),(r=N,i=b,t=>r(i(t))));var r,i},S=t=>"rtl"===((t,e)=>{const o=t.dom,r=window.getComputedStyle(o).getPropertyValue(e);return""!==r||N(t)?r:((t,e)=>(t=>void 0!==t.style&&i(t.style.getPropertyValue))(t)?t.style.getPropertyValue(e):"")(o,e)})(t,"direction")?"rtl":"ltr",A=(t,e)=>((t,o)=>((t,e)=>{const o=[];for(let r=0,n=t.length;r{const o=t.length,r=new Array(o);for(let n=0;nh(t,e))))(t),E=("li",t=>g(t)&&"li"===t.dom.nodeName.toLowerCase());const T=(t,e,n)=>{u(e,(e=>{const c=d(e),m=E(c),f=((t,e)=>{return(e?(o=t,r="ol,ul",((t,e,o)=>{let n=t.dom;const s=i(o)?o:l;for(;n.parentNode;){n=n.parentNode;const t=d(n);if(h(t,r))return a.some(t);if(s(t))break}return a.none()})(o,0,n)):a.some(t)).getOr(t);var o,r,n})(c,m);var v;(v=f,(t=>a.from(t.dom.parentNode).map(d))(v).filter(g)).each((e=>{if(t.setStyle(f.dom,"direction",null),S(e)===n?p(f,"dir"):((t,e,n)=>{((t,e,n)=>{if(!(o(n)||r(n)||s(n)))throw console.error("Invalid call to Attribute.set. Key ",e,":: Value ",n,":: Element ",t),new Error("Attribute value was not simple");t.setAttribute(e,n+"")})(t.dom,e,n)})(f,"dir",n),S(f)!==n&&t.setStyle(f.dom,"direction",n),m){const e=A(f,"li[dir],li[style]");u(e,(e=>{p(e,"dir"),t.setStyle(e.dom,"direction",null)}))}}))}))},C=(t,e)=>{t.selection.isEditable()&&(T(t.dom,t.selection.getSelectedBlocks(),e),t.nodeChanged())},D=(t,e)=>o=>{const r=r=>{const n=d(r.element);o.setActive(S(n)===e),o.setEnabled(t.selection.isEditable())};return t.on("NodeChange",r),o.setEnabled(t.selection.isEditable()),()=>t.off("NodeChange",r)};t.add("directionality",(t=>{(t=>{t.addCommand("mceDirectionLTR",(()=>{C(t,"ltr")})),t.addCommand("mceDirectionRTL",(()=>{C(t,"rtl")}))})(t),(t=>{t.ui.registry.addToggleButton("ltr",{tooltip:"Left to right",icon:"ltr",onAction:()=>t.execCommand("mceDirectionLTR"),onSetup:D(t,"ltr")}),t.ui.registry.addToggleButton("rtl",{tooltip:"Right to left",icon:"rtl",onAction:()=>t.execCommand("mceDirectionRTL"),onSetup:D(t,"rtl")})})(t)}))}(); \ No newline at end of file diff --git a/static/js/tinymce/plugins/emoticons/js/emojiimages.js b/static/js/tinymce/plugins/emoticons/js/emojiimages.js new file mode 100644 index 0000000..6fcec71 --- /dev/null +++ b/static/js/tinymce/plugins/emoticons/js/emojiimages.js @@ -0,0 +1 @@ +window.tinymce.Resource.add("tinymce.plugins.emoticons",{100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],char:'💯',fitzpatrick_scale:false,category:"symbols"},1234:{keywords:["numbers","blue-square"],char:'🔢',fitzpatrick_scale:false,category:"symbols"},grinning:{keywords:["face","smile","happy","joy",":D","grin"],char:'😀',fitzpatrick_scale:false,category:"people"},grimacing:{keywords:["face","grimace","teeth"],char:'😬',fitzpatrick_scale:false,category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],char:'ðŸ˜',fitzpatrick_scale:false,category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],char:'😂',fitzpatrick_scale:false,category:"people"},rofl:{keywords:["face","rolling","floor","laughing","lol","haha"],char:'🤣',fitzpatrick_scale:false,category:"people"},partying:{keywords:["face","celebration","woohoo"],char:'🥳',fitzpatrick_scale:false,category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],char:'😃',fitzpatrick_scale:false,category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],char:'😄',fitzpatrick_scale:false,category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],char:'😅',fitzpatrick_scale:false,category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],char:'😆',fitzpatrick_scale:false,category:"people"},innocent:{keywords:["face","angel","heaven","halo"],char:'😇',fitzpatrick_scale:false,category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile","eye"],char:'😉',fitzpatrick_scale:false,category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],char:'😊',fitzpatrick_scale:false,category:"people"},slightly_smiling_face:{keywords:["face","smile"],char:'🙂',fitzpatrick_scale:false,category:"people"},upside_down_face:{keywords:["face","flipped","silly","smile"],char:'🙃',fitzpatrick_scale:false,category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],char:'☺ï¸',fitzpatrick_scale:false,category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"],char:'😋',fitzpatrick_scale:false,category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],char:'😌',fitzpatrick_scale:false,category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],char:'ðŸ˜',fitzpatrick_scale:false,category:"people"},smiling_face_with_three_hearts:{keywords:["face","love","like","affection","valentines","infatuation","crush","hearts","adore"],char:'🥰',fitzpatrick_scale:false,category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:'😘',fitzpatrick_scale:false,category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],char:'😗',fitzpatrick_scale:false,category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],char:'😙',fitzpatrick_scale:false,category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:'😚',fitzpatrick_scale:false,category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],char:'😜',fitzpatrick_scale:false,category:"people"},zany:{keywords:["face","goofy","crazy"],char:'🤪',fitzpatrick_scale:false,category:"people"},raised_eyebrow:{keywords:["face","distrust","scepticism","disapproval","disbelief","surprise"],char:'🤨',fitzpatrick_scale:false,category:"people"},monocle:{keywords:["face","stuffy","wealthy"],char:'ðŸ§',fitzpatrick_scale:false,category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],char:'ðŸ˜',fitzpatrick_scale:false,category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],char:'😛',fitzpatrick_scale:false,category:"people"},money_mouth_face:{keywords:["face","rich","dollar","money"],char:'🤑',fitzpatrick_scale:false,category:"people"},nerd_face:{keywords:["face","nerdy","geek","dork"],char:'🤓',fitzpatrick_scale:false,category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],char:'😎',fitzpatrick_scale:false,category:"people"},star_struck:{keywords:["face","smile","starry","eyes","grinning"],char:'🤩',fitzpatrick_scale:false,category:"people"},clown_face:{keywords:["face"],char:'🤡',fitzpatrick_scale:false,category:"people"},cowboy_hat_face:{keywords:["face","cowgirl","hat"],char:'🤠',fitzpatrick_scale:false,category:"people"},hugs:{keywords:["face","smile","hug"],char:'🤗',fitzpatrick_scale:false,category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],char:'ðŸ˜',fitzpatrick_scale:false,category:"people"},no_mouth:{keywords:["face","hellokitty"],char:'😶',fitzpatrick_scale:false,category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],char:'ðŸ˜',fitzpatrick_scale:false,category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],char:'😑',fitzpatrick_scale:false,category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"],char:'😒',fitzpatrick_scale:false,category:"people"},roll_eyes:{keywords:["face","eyeroll","frustrated"],char:'🙄',fitzpatrick_scale:false,category:"people"},thinking:{keywords:["face","hmmm","think","consider"],char:'🤔',fitzpatrick_scale:false,category:"people"},lying_face:{keywords:["face","lie","pinocchio"],char:'🤥',fitzpatrick_scale:false,category:"people"},hand_over_mouth:{keywords:["face","whoops","shock","surprise"],char:'🤭',fitzpatrick_scale:false,category:"people"},shushing:{keywords:["face","quiet","shhh"],char:'🤫',fitzpatrick_scale:false,category:"people"},symbols_over_mouth:{keywords:["face","swearing","cursing","cussing","profanity","expletive"],char:'🤬',fitzpatrick_scale:false,category:"people"},exploding_head:{keywords:["face","shocked","mind","blown"],char:'🤯',fitzpatrick_scale:false,category:"people"},flushed:{keywords:["face","blush","shy","flattered"],char:'😳',fitzpatrick_scale:false,category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],char:'😞',fitzpatrick_scale:false,category:"people"},worried:{keywords:["face","concern","nervous",":("],char:'😟',fitzpatrick_scale:false,category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],char:'😠',fitzpatrick_scale:false,category:"people"},rage:{keywords:["angry","mad","hate","despise"],char:'😡',fitzpatrick_scale:false,category:"people"},pensive:{keywords:["face","sad","depressed","upset"],char:'😔',fitzpatrick_scale:false,category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],char:'😕',fitzpatrick_scale:false,category:"people"},slightly_frowning_face:{keywords:["face","frowning","disappointed","sad","upset"],char:'ðŸ™',fitzpatrick_scale:false,category:"people"},frowning_face:{keywords:["face","sad","upset","frown"],char:'☹',fitzpatrick_scale:false,category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],char:'😣',fitzpatrick_scale:false,category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],char:'😖',fitzpatrick_scale:false,category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],char:'😫',fitzpatrick_scale:false,category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],char:'😩',fitzpatrick_scale:false,category:"people"},pleading:{keywords:["face","begging","mercy"],char:'🥺',fitzpatrick_scale:false,category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],char:'😤',fitzpatrick_scale:false,category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],char:'😮',fitzpatrick_scale:false,category:"people"},scream:{keywords:["face","munch","scared","omg"],char:'😱',fitzpatrick_scale:false,category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],char:'😨',fitzpatrick_scale:false,category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],char:'😰',fitzpatrick_scale:false,category:"people"},hushed:{keywords:["face","woo","shh"],char:'😯',fitzpatrick_scale:false,category:"people"},frowning:{keywords:["face","aw","what"],char:'😦',fitzpatrick_scale:false,category:"people"},anguished:{keywords:["face","stunned","nervous"],char:'😧',fitzpatrick_scale:false,category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],char:'😢',fitzpatrick_scale:false,category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],char:'😥',fitzpatrick_scale:false,category:"people"},drooling_face:{keywords:["face"],char:'🤤',fitzpatrick_scale:false,category:"people"},sleepy:{keywords:["face","tired","rest","nap"],char:'😪',fitzpatrick_scale:false,category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],char:'😓',fitzpatrick_scale:false,category:"people"},hot:{keywords:["face","feverish","heat","red","sweating"],char:'🥵',fitzpatrick_scale:false,category:"people"},cold:{keywords:["face","blue","freezing","frozen","frostbite","icicles"],char:'🥶',fitzpatrick_scale:false,category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],char:'😭',fitzpatrick_scale:false,category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],char:'😵',fitzpatrick_scale:false,category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],char:'😲',fitzpatrick_scale:false,category:"people"},zipper_mouth_face:{keywords:["face","sealed","zipper","secret"],char:'ðŸ¤',fitzpatrick_scale:false,category:"people"},nauseated_face:{keywords:["face","vomit","gross","green","sick","throw up","ill"],char:'🤢',fitzpatrick_scale:false,category:"people"},sneezing_face:{keywords:["face","gesundheit","sneeze","sick","allergy"],char:'🤧',fitzpatrick_scale:false,category:"people"},vomiting:{keywords:["face","sick"],char:'🤮',fitzpatrick_scale:false,category:"people"},mask:{keywords:["face","sick","ill","disease"],char:'😷',fitzpatrick_scale:false,category:"people"},face_with_thermometer:{keywords:["sick","temperature","thermometer","cold","fever"],char:'🤒',fitzpatrick_scale:false,category:"people"},face_with_head_bandage:{keywords:["injured","clumsy","bandage","hurt"],char:'🤕',fitzpatrick_scale:false,category:"people"},woozy:{keywords:["face","dizzy","intoxicated","tipsy","wavy"],char:'🥴',fitzpatrick_scale:false,category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],char:'😴',fitzpatrick_scale:false,category:"people"},zzz:{keywords:["sleepy","tired","dream"],char:'💤',fitzpatrick_scale:false,category:"people"},poop:{keywords:["hankey","shitface","fail","turd","shit"],char:'💩',fitzpatrick_scale:false,category:"people"},smiling_imp:{keywords:["devil","horns"],char:'😈',fitzpatrick_scale:false,category:"people"},imp:{keywords:["devil","angry","horns"],char:'👿',fitzpatrick_scale:false,category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],char:'👹',fitzpatrick_scale:false,category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],char:'👺',fitzpatrick_scale:false,category:"people"},skull:{keywords:["dead","skeleton","creepy","death"],char:'💀',fitzpatrick_scale:false,category:"people"},ghost:{keywords:["halloween","spooky","scary"],char:'👻',fitzpatrick_scale:false,category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],char:'👽',fitzpatrick_scale:false,category:"people"},robot:{keywords:["computer","machine","bot"],char:'🤖',fitzpatrick_scale:false,category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],char:'😺',fitzpatrick_scale:false,category:"people"},smile_cat:{keywords:["animal","cats","smile"],char:'😸',fitzpatrick_scale:false,category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],char:'😹',fitzpatrick_scale:false,category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],char:'😻',fitzpatrick_scale:false,category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],char:'😼',fitzpatrick_scale:false,category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],char:'😽',fitzpatrick_scale:false,category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],char:'🙀',fitzpatrick_scale:false,category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],char:'😿',fitzpatrick_scale:false,category:"people"},pouting_cat:{keywords:["animal","cats"],char:'😾',fitzpatrick_scale:false,category:"people"},palms_up:{keywords:["hands","gesture","cupped","prayer"],char:'🤲',fitzpatrick_scale:true,category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],char:'🙌',fitzpatrick_scale:true,category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],char:'ðŸ‘',fitzpatrick_scale:true,category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","hi","palm"],char:'👋',fitzpatrick_scale:true,category:"people"},call_me_hand:{keywords:["hands","gesture"],char:'🤙',fitzpatrick_scale:true,category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],char:'ðŸ‘',fitzpatrick_scale:true,category:"people"},"-1":{keywords:["thumbsdown","no","dislike","hand"],char:'👎',fitzpatrick_scale:true,category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],char:'👊',fitzpatrick_scale:true,category:"people"},fist:{keywords:["fingers","hand","grasp"],char:'✊',fitzpatrick_scale:true,category:"people"},fist_left:{keywords:["hand","fistbump"],char:'🤛',fitzpatrick_scale:true,category:"people"},fist_right:{keywords:["hand","fistbump"],char:'🤜',fitzpatrick_scale:true,category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],char:'✌',fitzpatrick_scale:true,category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok","okay"],char:'👌',fitzpatrick_scale:true,category:"people"},raised_hand:{keywords:["fingers","stop","highfive","palm","ban"],char:'✋',fitzpatrick_scale:true,category:"people"},raised_back_of_hand:{keywords:["fingers","raised","backhand"],char:'🤚',fitzpatrick_scale:true,category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],char:'ðŸ‘',fitzpatrick_scale:true,category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],char:'💪',fitzpatrick_scale:true,category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],char:'ðŸ™',fitzpatrick_scale:true,category:"people"},foot:{keywords:["kick","stomp"],char:'🦶',fitzpatrick_scale:true,category:"people"},leg:{keywords:["kick","limb"],char:'🦵',fitzpatrick_scale:true,category:"people"},handshake:{keywords:["agreement","shake"],char:'ðŸ¤',fitzpatrick_scale:false,category:"people"},point_up:{keywords:["hand","fingers","direction","up"],char:'â˜',fitzpatrick_scale:true,category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],char:'👆',fitzpatrick_scale:true,category:"people"},point_down:{keywords:["fingers","hand","direction","down"],char:'👇',fitzpatrick_scale:true,category:"people"},point_left:{keywords:["direction","fingers","hand","left"],char:'👈',fitzpatrick_scale:true,category:"people"},point_right:{keywords:["fingers","hand","direction","right"],char:'👉',fitzpatrick_scale:true,category:"people"},fu:{keywords:["hand","fingers","rude","middle","flipping"],char:'🖕',fitzpatrick_scale:true,category:"people"},raised_hand_with_fingers_splayed:{keywords:["hand","fingers","palm"],char:'ðŸ–',fitzpatrick_scale:true,category:"people"},love_you:{keywords:["hand","fingers","gesture"],char:'🤟',fitzpatrick_scale:true,category:"people"},metal:{keywords:["hand","fingers","evil_eye","sign_of_horns","rock_on"],char:'🤘',fitzpatrick_scale:true,category:"people"},crossed_fingers:{keywords:["good","lucky"],char:'🤞',fitzpatrick_scale:true,category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],char:'🖖',fitzpatrick_scale:true,category:"people"},writing_hand:{keywords:["lower_left_ballpoint_pen","stationery","write","compose"],char:'âœ',fitzpatrick_scale:true,category:"people"},selfie:{keywords:["camera","phone"],char:'🤳',fitzpatrick_scale:true,category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],char:'💅',fitzpatrick_scale:true,category:"people"},lips:{keywords:["mouth","kiss"],char:'👄',fitzpatrick_scale:false,category:"people"},tooth:{keywords:["teeth","dentist"],char:'🦷',fitzpatrick_scale:false,category:"people"},tongue:{keywords:["mouth","playful"],char:'👅',fitzpatrick_scale:false,category:"people"},ear:{keywords:["face","hear","sound","listen"],char:'👂',fitzpatrick_scale:true,category:"people"},nose:{keywords:["smell","sniff"],char:'👃',fitzpatrick_scale:true,category:"people"},eye:{keywords:["face","look","see","watch","stare"],char:'ðŸ‘',fitzpatrick_scale:false,category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],char:'👀',fitzpatrick_scale:false,category:"people"},brain:{keywords:["smart","intelligent"],char:'🧠',fitzpatrick_scale:false,category:"people"},bust_in_silhouette:{keywords:["user","person","human"],char:'👤',fitzpatrick_scale:false,category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],char:'👥',fitzpatrick_scale:false,category:"people"},speaking_head:{keywords:["user","person","human","sing","say","talk"],char:'🗣',fitzpatrick_scale:false,category:"people"},baby:{keywords:["child","boy","girl","toddler"],char:'👶',fitzpatrick_scale:true,category:"people"},child:{keywords:["gender-neutral","young"],char:'🧒',fitzpatrick_scale:true,category:"people"},boy:{keywords:["man","male","guy","teenager"],char:'👦',fitzpatrick_scale:true,category:"people"},girl:{keywords:["female","woman","teenager"],char:'👧',fitzpatrick_scale:true,category:"people"},adult:{keywords:["gender-neutral","person"],char:'🧑',fitzpatrick_scale:true,category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],char:'👨',fitzpatrick_scale:true,category:"people"},woman:{keywords:["female","girls","lady"],char:'👩',fitzpatrick_scale:true,category:"people"},blonde_woman:{keywords:["woman","female","girl","blonde","person"],char:'👱â€â™€ï¸',fitzpatrick_scale:true,category:"people"},blonde_man:{keywords:["man","male","boy","blonde","guy","person"],char:'👱',fitzpatrick_scale:true,category:"people"},bearded_person:{keywords:["person","bewhiskered"],char:'🧔',fitzpatrick_scale:true,category:"people"},older_adult:{keywords:["human","elder","senior","gender-neutral"],char:'🧓',fitzpatrick_scale:true,category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],char:'👴',fitzpatrick_scale:true,category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],char:'👵',fitzpatrick_scale:true,category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],char:'👲',fitzpatrick_scale:true,category:"people"},woman_with_headscarf:{keywords:["female","hijab","mantilla","tichel"],char:'🧕',fitzpatrick_scale:true,category:"people"},woman_with_turban:{keywords:["female","indian","hinduism","arabs","woman"],char:'👳â€â™€ï¸',fitzpatrick_scale:true,category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],char:'👳',fitzpatrick_scale:true,category:"people"},policewoman:{keywords:["woman","police","law","legal","enforcement","arrest","911","female"],char:'👮â€â™€ï¸',fitzpatrick_scale:true,category:"people"},policeman:{keywords:["man","police","law","legal","enforcement","arrest","911"],char:'👮',fitzpatrick_scale:true,category:"people"},construction_worker_woman:{keywords:["female","human","wip","build","construction","worker","labor","woman"],char:'👷â€â™€ï¸',fitzpatrick_scale:true,category:"people"},construction_worker_man:{keywords:["male","human","wip","guy","build","construction","worker","labor"],char:'👷',fitzpatrick_scale:true,category:"people"},guardswoman:{keywords:["uk","gb","british","female","royal","woman"],char:'💂â€â™€ï¸',fitzpatrick_scale:true,category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],char:'💂',fitzpatrick_scale:true,category:"people"},female_detective:{keywords:["human","spy","detective","female","woman"],char:'🕵ï¸â€â™€ï¸',fitzpatrick_scale:true,category:"people"},male_detective:{keywords:["human","spy","detective"],char:'🕵',fitzpatrick_scale:true,category:"people"},woman_health_worker:{keywords:["doctor","nurse","therapist","healthcare","woman","human"],char:'👩â€âš•ï¸',fitzpatrick_scale:true,category:"people"},man_health_worker:{keywords:["doctor","nurse","therapist","healthcare","man","human"],char:'👨â€âš•ï¸',fitzpatrick_scale:true,category:"people"},woman_farmer:{keywords:["rancher","gardener","woman","human"],char:'👩â€ðŸŒ¾',fitzpatrick_scale:true,category:"people"},man_farmer:{keywords:["rancher","gardener","man","human"],char:'👨â€ðŸŒ¾',fitzpatrick_scale:true,category:"people"},woman_cook:{keywords:["chef","woman","human"],char:'👩â€ðŸ³',fitzpatrick_scale:true,category:"people"},man_cook:{keywords:["chef","man","human"],char:'👨â€ðŸ³',fitzpatrick_scale:true,category:"people"},woman_student:{keywords:["graduate","woman","human"],char:'👩â€ðŸŽ“',fitzpatrick_scale:true,category:"people"},man_student:{keywords:["graduate","man","human"],char:'👨â€ðŸŽ“',fitzpatrick_scale:true,category:"people"},woman_singer:{keywords:["rockstar","entertainer","woman","human"],char:'👩â€ðŸŽ¤',fitzpatrick_scale:true,category:"people"},man_singer:{keywords:["rockstar","entertainer","man","human"],char:'👨â€ðŸŽ¤',fitzpatrick_scale:true,category:"people"},woman_teacher:{keywords:["instructor","professor","woman","human"],char:'👩â€ðŸ«',fitzpatrick_scale:true,category:"people"},man_teacher:{keywords:["instructor","professor","man","human"],char:'👨â€ðŸ«',fitzpatrick_scale:true,category:"people"},woman_factory_worker:{keywords:["assembly","industrial","woman","human"],char:'👩â€ðŸ­',fitzpatrick_scale:true,category:"people"},man_factory_worker:{keywords:["assembly","industrial","man","human"],char:'👨â€ðŸ­',fitzpatrick_scale:true,category:"people"},woman_technologist:{keywords:["coder","developer","engineer","programmer","software","woman","human","laptop","computer"],char:'👩â€ðŸ’»',fitzpatrick_scale:true,category:"people"},man_technologist:{keywords:["coder","developer","engineer","programmer","software","man","human","laptop","computer"],char:'👨â€ðŸ’»',fitzpatrick_scale:true,category:"people"},woman_office_worker:{keywords:["business","manager","woman","human"],char:'👩â€ðŸ’¼',fitzpatrick_scale:true,category:"people"},man_office_worker:{keywords:["business","manager","man","human"],char:'👨â€ðŸ’¼',fitzpatrick_scale:true,category:"people"},woman_mechanic:{keywords:["plumber","woman","human","wrench"],char:'👩â€ðŸ”§',fitzpatrick_scale:true,category:"people"},man_mechanic:{keywords:["plumber","man","human","wrench"],char:'👨â€ðŸ”§',fitzpatrick_scale:true,category:"people"},woman_scientist:{keywords:["biologist","chemist","engineer","physicist","woman","human"],char:'👩â€ðŸ”¬',fitzpatrick_scale:true,category:"people"},man_scientist:{keywords:["biologist","chemist","engineer","physicist","man","human"],char:'👨â€ðŸ”¬',fitzpatrick_scale:true,category:"people"},woman_artist:{keywords:["painter","woman","human"],char:'👩â€ðŸŽ¨',fitzpatrick_scale:true,category:"people"},man_artist:{keywords:["painter","man","human"],char:'👨â€ðŸŽ¨',fitzpatrick_scale:true,category:"people"},woman_firefighter:{keywords:["fireman","woman","human"],char:'👩â€ðŸš’',fitzpatrick_scale:true,category:"people"},man_firefighter:{keywords:["fireman","man","human"],char:'👨â€ðŸš’',fitzpatrick_scale:true,category:"people"},woman_pilot:{keywords:["aviator","plane","woman","human"],char:'👩â€âœˆï¸',fitzpatrick_scale:true,category:"people"},man_pilot:{keywords:["aviator","plane","man","human"],char:'👨â€âœˆï¸',fitzpatrick_scale:true,category:"people"},woman_astronaut:{keywords:["space","rocket","woman","human"],char:'👩â€ðŸš€',fitzpatrick_scale:true,category:"people"},man_astronaut:{keywords:["space","rocket","man","human"],char:'👨â€ðŸš€',fitzpatrick_scale:true,category:"people"},woman_judge:{keywords:["justice","court","woman","human"],char:'👩â€âš–ï¸',fitzpatrick_scale:true,category:"people"},man_judge:{keywords:["justice","court","man","human"],char:'👨â€âš–ï¸',fitzpatrick_scale:true,category:"people"},woman_superhero:{keywords:["woman","female","good","heroine","superpowers"],char:'🦸â€â™€ï¸',fitzpatrick_scale:true,category:"people"},man_superhero:{keywords:["man","male","good","hero","superpowers"],char:'🦸â€â™‚ï¸',fitzpatrick_scale:true,category:"people"},woman_supervillain:{keywords:["woman","female","evil","bad","criminal","heroine","superpowers"],char:'🦹â€â™€ï¸',fitzpatrick_scale:true,category:"people"},man_supervillain:{keywords:["man","male","evil","bad","criminal","hero","superpowers"],char:'🦹â€â™‚ï¸',fitzpatrick_scale:true,category:"people"},mrs_claus:{keywords:["woman","female","xmas","mother christmas"],char:'🤶',fitzpatrick_scale:true,category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],char:'🎅',fitzpatrick_scale:true,category:"people"},sorceress:{keywords:["woman","female","mage","witch"],char:'🧙â€â™€ï¸',fitzpatrick_scale:true,category:"people"},wizard:{keywords:["man","male","mage","sorcerer"],char:'🧙â€â™‚ï¸',fitzpatrick_scale:true,category:"people"},woman_elf:{keywords:["woman","female"],char:'ðŸ§â€â™€ï¸',fitzpatrick_scale:true,category:"people"},man_elf:{keywords:["man","male"],char:'ðŸ§â€â™‚ï¸',fitzpatrick_scale:true,category:"people"},woman_vampire:{keywords:["woman","female"],char:'🧛â€â™€ï¸',fitzpatrick_scale:true,category:"people"},man_vampire:{keywords:["man","male","dracula"],char:'🧛â€â™‚ï¸',fitzpatrick_scale:true,category:"people"},woman_zombie:{keywords:["woman","female","undead","walking dead"],char:'🧟â€â™€ï¸',fitzpatrick_scale:false,category:"people"},man_zombie:{keywords:["man","male","dracula","undead","walking dead"],char:'🧟â€â™‚ï¸',fitzpatrick_scale:false,category:"people"},woman_genie:{keywords:["woman","female"],char:'🧞â€â™€ï¸',fitzpatrick_scale:false,category:"people"},man_genie:{keywords:["man","male"],char:'🧞â€â™‚ï¸',fitzpatrick_scale:false,category:"people"},mermaid:{keywords:["woman","female","merwoman","ariel"],char:'🧜â€â™€ï¸',fitzpatrick_scale:true,category:"people"},merman:{keywords:["man","male","triton"],char:'🧜â€â™‚ï¸',fitzpatrick_scale:true,category:"people"},woman_fairy:{keywords:["woman","female"],char:'🧚â€â™€ï¸',fitzpatrick_scale:true,category:"people"},man_fairy:{keywords:["man","male"],char:'🧚â€â™‚ï¸',fitzpatrick_scale:true,category:"people"},angel:{keywords:["heaven","wings","halo"],char:'👼',fitzpatrick_scale:true,category:"people"},pregnant_woman:{keywords:["baby"],char:'🤰',fitzpatrick_scale:true,category:"people"},breastfeeding:{keywords:["nursing","baby"],char:'🤱',fitzpatrick_scale:true,category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],char:'👸',fitzpatrick_scale:true,category:"people"},prince:{keywords:["boy","man","male","crown","royal","king"],char:'🤴',fitzpatrick_scale:true,category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],char:'👰',fitzpatrick_scale:true,category:"people"},man_in_tuxedo:{keywords:["couple","marriage","wedding","groom"],char:'🤵',fitzpatrick_scale:true,category:"people"},running_woman:{keywords:["woman","walking","exercise","race","running","female"],char:'ðŸƒâ€â™€ï¸',fitzpatrick_scale:true,category:"people"},running_man:{keywords:["man","walking","exercise","race","running"],char:'ðŸƒ',fitzpatrick_scale:true,category:"people"},walking_woman:{keywords:["human","feet","steps","woman","female"],char:'🚶â€â™€ï¸',fitzpatrick_scale:true,category:"people"},walking_man:{keywords:["human","feet","steps"],char:'🚶',fitzpatrick_scale:true,category:"people"},dancer:{keywords:["female","girl","woman","fun"],char:'💃',fitzpatrick_scale:true,category:"people"},man_dancing:{keywords:["male","boy","fun","dancer"],char:'🕺',fitzpatrick_scale:true,category:"people"},dancing_women:{keywords:["female","bunny","women","girls"],char:'👯',fitzpatrick_scale:false,category:"people"},dancing_men:{keywords:["male","bunny","men","boys"],char:'👯â€â™‚ï¸',fitzpatrick_scale:false,category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],char:'👫',fitzpatrick_scale:false,category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],char:'👬',fitzpatrick_scale:false,category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],char:'👭',fitzpatrick_scale:false,category:"people"},bowing_woman:{keywords:["woman","female","girl"],char:'🙇â€â™€ï¸',fitzpatrick_scale:true,category:"people"},bowing_man:{keywords:["man","male","boy"],char:'🙇',fitzpatrick_scale:true,category:"people"},man_facepalming:{keywords:["man","male","boy","disbelief"],char:'🤦â€â™‚ï¸',fitzpatrick_scale:true,category:"people"},woman_facepalming:{keywords:["woman","female","girl","disbelief"],char:'🤦â€â™€ï¸',fitzpatrick_scale:true,category:"people"},woman_shrugging:{keywords:["woman","female","girl","confused","indifferent","doubt"],char:'🤷',fitzpatrick_scale:true,category:"people"},man_shrugging:{keywords:["man","male","boy","confused","indifferent","doubt"],char:'🤷â€â™‚ï¸',fitzpatrick_scale:true,category:"people"},tipping_hand_woman:{keywords:["female","girl","woman","human","information"],char:'ðŸ’',fitzpatrick_scale:true,category:"people"},tipping_hand_man:{keywords:["male","boy","man","human","information"],char:'ðŸ’â€â™‚ï¸',fitzpatrick_scale:true,category:"people"},no_good_woman:{keywords:["female","girl","woman","nope"],char:'🙅',fitzpatrick_scale:true,category:"people"},no_good_man:{keywords:["male","boy","man","nope"],char:'🙅â€â™‚ï¸',fitzpatrick_scale:true,category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],char:'🙆',fitzpatrick_scale:true,category:"people"},ok_man:{keywords:["men","boy","male","blue","human","man"],char:'🙆â€â™‚ï¸',fitzpatrick_scale:true,category:"people"},raising_hand_woman:{keywords:["female","girl","woman"],char:'🙋',fitzpatrick_scale:true,category:"people"},raising_hand_man:{keywords:["male","boy","man"],char:'🙋â€â™‚ï¸',fitzpatrick_scale:true,category:"people"},pouting_woman:{keywords:["female","girl","woman"],char:'🙎',fitzpatrick_scale:true,category:"people"},pouting_man:{keywords:["male","boy","man"],char:'🙎â€â™‚ï¸',fitzpatrick_scale:true,category:"people"},frowning_woman:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],char:'ðŸ™',fitzpatrick_scale:true,category:"people"},frowning_man:{keywords:["male","boy","man","sad","depressed","discouraged","unhappy"],char:'ðŸ™â€â™‚ï¸',fitzpatrick_scale:true,category:"people"},haircut_woman:{keywords:["female","girl","woman"],char:'💇',fitzpatrick_scale:true,category:"people"},haircut_man:{keywords:["male","boy","man"],char:'💇â€â™‚ï¸',fitzpatrick_scale:true,category:"people"},massage_woman:{keywords:["female","girl","woman","head"],char:'💆',fitzpatrick_scale:true,category:"people"},massage_man:{keywords:["male","boy","man","head"],char:'💆â€â™‚ï¸',fitzpatrick_scale:true,category:"people"},woman_in_steamy_room:{keywords:["female","woman","spa","steamroom","sauna"],char:'🧖â€â™€ï¸',fitzpatrick_scale:true,category:"people"},man_in_steamy_room:{keywords:["male","man","spa","steamroom","sauna"],char:'🧖â€â™‚ï¸',fitzpatrick_scale:true,category:"people"},couple_with_heart_woman_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'💑',fitzpatrick_scale:false,category:"people"},couple_with_heart_woman_woman:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'👩â€â¤ï¸â€ðŸ‘©',fitzpatrick_scale:false,category:"people"},couple_with_heart_man_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'👨â€â¤ï¸â€ðŸ‘¨',fitzpatrick_scale:false,category:"people"},couplekiss_man_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:'ðŸ’',fitzpatrick_scale:false,category:"people"},couplekiss_woman_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:'👩â€â¤ï¸â€ðŸ’‹â€ðŸ‘©',fitzpatrick_scale:false,category:"people"},couplekiss_man_man:{keywords:["pair","valentines","love","like","dating","marriage"],char:'👨â€â¤ï¸â€ðŸ’‹â€ðŸ‘¨',fitzpatrick_scale:false,category:"people"},family_man_woman_boy:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],char:'👪',fitzpatrick_scale:false,category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],char:'👨â€ðŸ‘©â€ðŸ‘§',fitzpatrick_scale:false,category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:'👨â€ðŸ‘©â€ðŸ‘§â€ðŸ‘¦',fitzpatrick_scale:false,category:"people"},family_man_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:'👨â€ðŸ‘©â€ðŸ‘¦â€ðŸ‘¦',fitzpatrick_scale:false,category:"people"},family_man_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:'👨â€ðŸ‘©â€ðŸ‘§â€ðŸ‘§',fitzpatrick_scale:false,category:"people"},family_woman_woman_boy:{keywords:["home","parents","people","human","children"],char:'👩â€ðŸ‘©â€ðŸ‘¦',fitzpatrick_scale:false,category:"people"},family_woman_woman_girl:{keywords:["home","parents","people","human","children"],char:'👩â€ðŸ‘©â€ðŸ‘§',fitzpatrick_scale:false,category:"people"},family_woman_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:'👩â€ðŸ‘©â€ðŸ‘§â€ðŸ‘¦',fitzpatrick_scale:false,category:"people"},family_woman_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:'👩â€ðŸ‘©â€ðŸ‘¦â€ðŸ‘¦',fitzpatrick_scale:false,category:"people"},family_woman_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:'👩â€ðŸ‘©â€ðŸ‘§â€ðŸ‘§',fitzpatrick_scale:false,category:"people"},family_man_man_boy:{keywords:["home","parents","people","human","children"],char:'👨â€ðŸ‘¨â€ðŸ‘¦',fitzpatrick_scale:false,category:"people"},family_man_man_girl:{keywords:["home","parents","people","human","children"],char:'👨â€ðŸ‘¨â€ðŸ‘§',fitzpatrick_scale:false,category:"people"},family_man_man_girl_boy:{keywords:["home","parents","people","human","children"],char:'👨â€ðŸ‘¨â€ðŸ‘§â€ðŸ‘¦',fitzpatrick_scale:false,category:"people"},family_man_man_boy_boy:{keywords:["home","parents","people","human","children"],char:'👨â€ðŸ‘¨â€ðŸ‘¦â€ðŸ‘¦',fitzpatrick_scale:false,category:"people"},family_man_man_girl_girl:{keywords:["home","parents","people","human","children"],char:'👨â€ðŸ‘¨â€ðŸ‘§â€ðŸ‘§',fitzpatrick_scale:false,category:"people"},family_woman_boy:{keywords:["home","parent","people","human","child"],char:'👩â€ðŸ‘¦',fitzpatrick_scale:false,category:"people"},family_woman_girl:{keywords:["home","parent","people","human","child"],char:'👩â€ðŸ‘§',fitzpatrick_scale:false,category:"people"},family_woman_girl_boy:{keywords:["home","parent","people","human","children"],char:'👩â€ðŸ‘§â€ðŸ‘¦',fitzpatrick_scale:false,category:"people"},family_woman_boy_boy:{keywords:["home","parent","people","human","children"],char:'👩â€ðŸ‘¦â€ðŸ‘¦',fitzpatrick_scale:false,category:"people"},family_woman_girl_girl:{keywords:["home","parent","people","human","children"],char:'👩â€ðŸ‘§â€ðŸ‘§',fitzpatrick_scale:false,category:"people"},family_man_boy:{keywords:["home","parent","people","human","child"],char:'👨â€ðŸ‘¦',fitzpatrick_scale:false,category:"people"},family_man_girl:{keywords:["home","parent","people","human","child"],char:'👨â€ðŸ‘§',fitzpatrick_scale:false,category:"people"},family_man_girl_boy:{keywords:["home","parent","people","human","children"],char:'👨â€ðŸ‘§â€ðŸ‘¦',fitzpatrick_scale:false,category:"people"},family_man_boy_boy:{keywords:["home","parent","people","human","children"],char:'👨â€ðŸ‘¦â€ðŸ‘¦',fitzpatrick_scale:false,category:"people"},family_man_girl_girl:{keywords:["home","parent","people","human","children"],char:'👨â€ðŸ‘§â€ðŸ‘§',fitzpatrick_scale:false,category:"people"},yarn:{keywords:["ball","crochet","knit"],char:'🧶',fitzpatrick_scale:false,category:"people"},thread:{keywords:["needle","sewing","spool","string"],char:'🧵',fitzpatrick_scale:false,category:"people"},coat:{keywords:["jacket"],char:'🧥',fitzpatrick_scale:false,category:"people"},labcoat:{keywords:["doctor","experiment","scientist","chemist"],char:'🥼',fitzpatrick_scale:false,category:"people"},womans_clothes:{keywords:["fashion","shopping_bags","female"],char:'👚',fitzpatrick_scale:false,category:"people"},tshirt:{keywords:["fashion","cloth","casual","shirt","tee"],char:'👕',fitzpatrick_scale:false,category:"people"},jeans:{keywords:["fashion","shopping"],char:'👖',fitzpatrick_scale:false,category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],char:'👔',fitzpatrick_scale:false,category:"people"},dress:{keywords:["clothes","fashion","shopping"],char:'👗',fitzpatrick_scale:false,category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],char:'👙',fitzpatrick_scale:false,category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],char:'👘',fitzpatrick_scale:false,category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],char:'💄',fitzpatrick_scale:false,category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],char:'💋',fitzpatrick_scale:false,category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],char:'👣',fitzpatrick_scale:false,category:"people"},flat_shoe:{keywords:["ballet","slip-on","slipper"],char:'🥿',fitzpatrick_scale:false,category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],char:'👠',fitzpatrick_scale:false,category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],char:'👡',fitzpatrick_scale:false,category:"people"},boot:{keywords:["shoes","fashion"],char:'👢',fitzpatrick_scale:false,category:"people"},mans_shoe:{keywords:["fashion","male"],char:'👞',fitzpatrick_scale:false,category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],char:'👟',fitzpatrick_scale:false,category:"people"},hiking_boot:{keywords:["backpacking","camping","hiking"],char:'🥾',fitzpatrick_scale:false,category:"people"},socks:{keywords:["stockings","clothes"],char:'🧦',fitzpatrick_scale:false,category:"people"},gloves:{keywords:["hands","winter","clothes"],char:'🧤',fitzpatrick_scale:false,category:"people"},scarf:{keywords:["neck","winter","clothes"],char:'🧣',fitzpatrick_scale:false,category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],char:'👒',fitzpatrick_scale:false,category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],char:'🎩',fitzpatrick_scale:false,category:"people"},billed_hat:{keywords:["cap","baseball"],char:'🧢',fitzpatrick_scale:false,category:"people"},rescue_worker_helmet:{keywords:["construction","build"],char:'⛑',fitzpatrick_scale:false,category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],char:'🎓',fitzpatrick_scale:false,category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],char:'👑',fitzpatrick_scale:false,category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],char:'🎒',fitzpatrick_scale:false,category:"people"},luggage:{keywords:["packing","travel"],char:'🧳',fitzpatrick_scale:false,category:"people"},pouch:{keywords:["bag","accessories","shopping"],char:'ðŸ‘',fitzpatrick_scale:false,category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],char:'👛',fitzpatrick_scale:false,category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],char:'👜',fitzpatrick_scale:false,category:"people"},briefcase:{keywords:["business","documents","work","law","legal","job","career"],char:'💼',fitzpatrick_scale:false,category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],char:'👓',fitzpatrick_scale:false,category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],char:'🕶',fitzpatrick_scale:false,category:"people"},goggles:{keywords:["eyes","protection","safety"],char:'🥽',fitzpatrick_scale:false,category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],char:'ðŸ’',fitzpatrick_scale:false,category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],char:'🌂',fitzpatrick_scale:false,category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],char:'ðŸ¶',fitzpatrick_scale:false,category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],char:'ðŸ±',fitzpatrick_scale:false,category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese_wedge","rodent"],char:'ðŸ­',fitzpatrick_scale:false,category:"animals_and_nature"},hamster:{keywords:["animal","nature"],char:'ðŸ¹',fitzpatrick_scale:false,category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],char:'ðŸ°',fitzpatrick_scale:false,category:"animals_and_nature"},fox_face:{keywords:["animal","nature","face"],char:'🦊',fitzpatrick_scale:false,category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],char:'ðŸ»',fitzpatrick_scale:false,category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],char:'ðŸ¼',fitzpatrick_scale:false,category:"animals_and_nature"},koala:{keywords:["animal","nature"],char:'ðŸ¨',fitzpatrick_scale:false,category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],char:'ðŸ¯',fitzpatrick_scale:false,category:"animals_and_nature"},lion:{keywords:["animal","nature"],char:'ðŸ¦',fitzpatrick_scale:false,category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],char:'ðŸ®',fitzpatrick_scale:false,category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],char:'ðŸ·',fitzpatrick_scale:false,category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],char:'ðŸ½',fitzpatrick_scale:false,category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],char:'ðŸ¸',fitzpatrick_scale:false,category:"animals_and_nature"},squid:{keywords:["animal","nature","ocean","sea"],char:'🦑',fitzpatrick_scale:false,category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],char:'ðŸ™',fitzpatrick_scale:false,category:"animals_and_nature"},shrimp:{keywords:["animal","ocean","nature","seafood"],char:'ðŸ¦',fitzpatrick_scale:false,category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],char:'ðŸµ',fitzpatrick_scale:false,category:"animals_and_nature"},gorilla:{keywords:["animal","nature","circus"],char:'ðŸ¦',fitzpatrick_scale:false,category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],char:'🙈',fitzpatrick_scale:false,category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],char:'🙉',fitzpatrick_scale:false,category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],char:'🙊',fitzpatrick_scale:false,category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],char:'ðŸ’',fitzpatrick_scale:false,category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],char:'ðŸ”',fitzpatrick_scale:false,category:"animals_and_nature"},penguin:{keywords:["animal","nature"],char:'ðŸ§',fitzpatrick_scale:false,category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],char:'ðŸ¦',fitzpatrick_scale:false,category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],char:'ðŸ¤',fitzpatrick_scale:false,category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],char:'ðŸ£',fitzpatrick_scale:false,category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],char:'ðŸ¥',fitzpatrick_scale:false,category:"animals_and_nature"},duck:{keywords:["animal","nature","bird","mallard"],char:'🦆',fitzpatrick_scale:false,category:"animals_and_nature"},eagle:{keywords:["animal","nature","bird"],char:'🦅',fitzpatrick_scale:false,category:"animals_and_nature"},owl:{keywords:["animal","nature","bird","hoot"],char:'🦉',fitzpatrick_scale:false,category:"animals_and_nature"},bat:{keywords:["animal","nature","blind","vampire"],char:'🦇',fitzpatrick_scale:false,category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],char:'ðŸº',fitzpatrick_scale:false,category:"animals_and_nature"},boar:{keywords:["animal","nature"],char:'ðŸ—',fitzpatrick_scale:false,category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],char:'ðŸ´',fitzpatrick_scale:false,category:"animals_and_nature"},unicorn:{keywords:["animal","nature","mystical"],char:'🦄',fitzpatrick_scale:false,category:"animals_and_nature"},honeybee:{keywords:["animal","insect","nature","bug","spring","honey"],char:'ðŸ',fitzpatrick_scale:false,category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],char:'ðŸ›',fitzpatrick_scale:false,category:"animals_and_nature"},butterfly:{keywords:["animal","insect","nature","caterpillar"],char:'🦋',fitzpatrick_scale:false,category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],char:'ðŸŒ',fitzpatrick_scale:false,category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],char:'ðŸž',fitzpatrick_scale:false,category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],char:'ðŸœ',fitzpatrick_scale:false,category:"animals_and_nature"},grasshopper:{keywords:["animal","cricket","chirp"],char:'🦗',fitzpatrick_scale:false,category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],char:'🕷',fitzpatrick_scale:false,category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],char:'🦂',fitzpatrick_scale:false,category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],char:'🦀',fitzpatrick_scale:false,category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],char:'ðŸ',fitzpatrick_scale:false,category:"animals_and_nature"},lizard:{keywords:["animal","nature","reptile"],char:'🦎',fitzpatrick_scale:false,category:"animals_and_nature"},"t-rex":{keywords:["animal","nature","dinosaur","tyrannosaurus","extinct"],char:'🦖',fitzpatrick_scale:false,category:"animals_and_nature"},sauropod:{keywords:["animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"],char:'🦕',fitzpatrick_scale:false,category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],char:'ðŸ¢',fitzpatrick_scale:false,category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],char:'ðŸ ',fitzpatrick_scale:false,category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],char:'ðŸŸ',fitzpatrick_scale:false,category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],char:'ðŸ¡',fitzpatrick_scale:false,category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],char:'ðŸ¬',fitzpatrick_scale:false,category:"animals_and_nature"},shark:{keywords:["animal","nature","fish","sea","ocean","jaws","fins","beach"],char:'🦈',fitzpatrick_scale:false,category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],char:'ðŸ³',fitzpatrick_scale:false,category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],char:'ðŸ‹',fitzpatrick_scale:false,category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],char:'ðŸŠ',fitzpatrick_scale:false,category:"animals_and_nature"},leopard:{keywords:["animal","nature"],char:'ðŸ†',fitzpatrick_scale:false,category:"animals_and_nature"},zebra:{keywords:["animal","nature","stripes","safari"],char:'🦓',fitzpatrick_scale:false,category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],char:'ðŸ…',fitzpatrick_scale:false,category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],char:'ðŸƒ',fitzpatrick_scale:false,category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],char:'ðŸ‚',fitzpatrick_scale:false,category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],char:'ðŸ„',fitzpatrick_scale:false,category:"animals_and_nature"},deer:{keywords:["animal","nature","horns","venison"],char:'🦌',fitzpatrick_scale:false,category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],char:'ðŸª',fitzpatrick_scale:false,category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],char:'ðŸ«',fitzpatrick_scale:false,category:"animals_and_nature"},giraffe:{keywords:["animal","nature","spots","safari"],char:'🦒',fitzpatrick_scale:false,category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","th","circus"],char:'ðŸ˜',fitzpatrick_scale:false,category:"animals_and_nature"},rhinoceros:{keywords:["animal","nature","horn"],char:'ðŸ¦',fitzpatrick_scale:false,category:"animals_and_nature"},goat:{keywords:["animal","nature"],char:'ðŸ',fitzpatrick_scale:false,category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],char:'ðŸ',fitzpatrick_scale:false,category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],char:'ðŸ‘',fitzpatrick_scale:false,category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],char:'ðŸŽ',fitzpatrick_scale:false,category:"animals_and_nature"},pig2:{keywords:["animal","nature"],char:'ðŸ–',fitzpatrick_scale:false,category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],char:'ðŸ€',fitzpatrick_scale:false,category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],char:'ðŸ',fitzpatrick_scale:false,category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],char:'ðŸ“',fitzpatrick_scale:false,category:"animals_and_nature"},turkey:{keywords:["animal","bird"],char:'🦃',fitzpatrick_scale:false,category:"animals_and_nature"},dove:{keywords:["animal","bird"],char:'🕊',fitzpatrick_scale:false,category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],char:'ðŸ•',fitzpatrick_scale:false,category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],char:'ðŸ©',fitzpatrick_scale:false,category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],char:'ðŸˆ',fitzpatrick_scale:false,category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],char:'ðŸ‡',fitzpatrick_scale:false,category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],char:'ðŸ¿',fitzpatrick_scale:false,category:"animals_and_nature"},hedgehog:{keywords:["animal","nature","spiny"],char:'🦔',fitzpatrick_scale:false,category:"animals_and_nature"},raccoon:{keywords:["animal","nature"],char:'ðŸ¦',fitzpatrick_scale:false,category:"animals_and_nature"},llama:{keywords:["animal","nature","alpaca"],char:'🦙',fitzpatrick_scale:false,category:"animals_and_nature"},hippopotamus:{keywords:["animal","nature"],char:'🦛',fitzpatrick_scale:false,category:"animals_and_nature"},kangaroo:{keywords:["animal","nature","australia","joey","hop","marsupial"],char:'🦘',fitzpatrick_scale:false,category:"animals_and_nature"},badger:{keywords:["animal","nature","honey"],char:'🦡',fitzpatrick_scale:false,category:"animals_and_nature"},swan:{keywords:["animal","nature","bird"],char:'🦢',fitzpatrick_scale:false,category:"animals_and_nature"},peacock:{keywords:["animal","nature","peahen","bird"],char:'🦚',fitzpatrick_scale:false,category:"animals_and_nature"},parrot:{keywords:["animal","nature","bird","pirate","talk"],char:'🦜',fitzpatrick_scale:false,category:"animals_and_nature"},lobster:{keywords:["animal","nature","bisque","claws","seafood"],char:'🦞',fitzpatrick_scale:false,category:"animals_and_nature"},mosquito:{keywords:["animal","nature","insect","malaria"],char:'🦟',fitzpatrick_scale:false,category:"animals_and_nature"},paw_prints:{keywords:["animal","tracking","footprints","dog","cat","pet","feet"],char:'ðŸ¾',fitzpatrick_scale:false,category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],char:'ðŸ‰',fitzpatrick_scale:false,category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],char:'ðŸ²',fitzpatrick_scale:false,category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],char:'🌵',fitzpatrick_scale:false,category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],char:'🎄',fitzpatrick_scale:false,category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],char:'🌲',fitzpatrick_scale:false,category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],char:'🌳',fitzpatrick_scale:false,category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],char:'🌴',fitzpatrick_scale:false,category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],char:'🌱',fitzpatrick_scale:false,category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],char:'🌿',fitzpatrick_scale:false,category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],char:'☘',fitzpatrick_scale:false,category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],char:'ðŸ€',fitzpatrick_scale:false,category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],char:'ðŸŽ',fitzpatrick_scale:false,category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],char:'🎋',fitzpatrick_scale:false,category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],char:'ðŸƒ',fitzpatrick_scale:false,category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],char:'ðŸ‚',fitzpatrick_scale:false,category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","ca","fall"],char:'ðŸ',fitzpatrick_scale:false,category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],char:'🌾',fitzpatrick_scale:false,category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],char:'🌺',fitzpatrick_scale:false,category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],char:'🌻',fitzpatrick_scale:false,category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],char:'🌹',fitzpatrick_scale:false,category:"animals_and_nature"},wilted_flower:{keywords:["plant","nature","flower"],char:'🥀',fitzpatrick_scale:false,category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],char:'🌷',fitzpatrick_scale:false,category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],char:'🌼',fitzpatrick_scale:false,category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],char:'🌸',fitzpatrick_scale:false,category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],char:'ðŸ’',fitzpatrick_scale:false,category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],char:'ðŸ„',fitzpatrick_scale:false,category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],char:'🌰',fitzpatrick_scale:false,category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],char:'🎃',fitzpatrick_scale:false,category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],char:'ðŸš',fitzpatrick_scale:false,category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],char:'🕸',fitzpatrick_scale:false,category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],char:'🌎',fitzpatrick_scale:false,category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],char:'ðŸŒ',fitzpatrick_scale:false,category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],char:'ðŸŒ',fitzpatrick_scale:false,category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],char:'🌕',fitzpatrick_scale:false,category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],char:'🌖',fitzpatrick_scale:false,category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'🌗',fitzpatrick_scale:false,category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'🌘',fitzpatrick_scale:false,category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'🌑',fitzpatrick_scale:false,category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'🌒',fitzpatrick_scale:false,category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'🌓',fitzpatrick_scale:false,category:"animals_and_nature"},waxing_gibbous_moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],char:'🌔',fitzpatrick_scale:false,category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'🌚',fitzpatrick_scale:false,category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'ðŸŒ',fitzpatrick_scale:false,category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'🌛',fitzpatrick_scale:false,category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'🌜',fitzpatrick_scale:false,category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],char:'🌞',fitzpatrick_scale:false,category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],char:'🌙',fitzpatrick_scale:false,category:"animals_and_nature"},star:{keywords:["night","yellow"],char:'â­',fitzpatrick_scale:false,category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],char:'🌟',fitzpatrick_scale:false,category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],char:'💫',fitzpatrick_scale:false,category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],char:'✨',fitzpatrick_scale:false,category:"animals_and_nature"},comet:{keywords:["space"],char:'☄',fitzpatrick_scale:false,category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],char:'☀ï¸',fitzpatrick_scale:false,category:"animals_and_nature"},sun_behind_small_cloud:{keywords:["weather"],char:'🌤',fitzpatrick_scale:false,category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],char:'â›…',fitzpatrick_scale:false,category:"animals_and_nature"},sun_behind_large_cloud:{keywords:["weather"],char:'🌥',fitzpatrick_scale:false,category:"animals_and_nature"},sun_behind_rain_cloud:{keywords:["weather"],char:'🌦',fitzpatrick_scale:false,category:"animals_and_nature"},cloud:{keywords:["weather","sky"],char:'â˜ï¸',fitzpatrick_scale:false,category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],char:'🌧',fitzpatrick_scale:false,category:"animals_and_nature"},cloud_with_lightning_and_rain:{keywords:["weather","lightning"],char:'⛈',fitzpatrick_scale:false,category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],char:'🌩',fitzpatrick_scale:false,category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],char:'âš¡',fitzpatrick_scale:false,category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],char:'🔥',fitzpatrick_scale:false,category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],char:'💥',fitzpatrick_scale:false,category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],char:'â„ï¸',fitzpatrick_scale:false,category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],char:'🌨',fitzpatrick_scale:false,category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],char:'⛄',fitzpatrick_scale:false,category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],char:'☃',fitzpatrick_scale:false,category:"animals_and_nature"},wind_face:{keywords:["gust","air"],char:'🌬',fitzpatrick_scale:false,category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],char:'💨',fitzpatrick_scale:false,category:"animals_and_nature"},tornado:{keywords:["weather","cyclone","twister"],char:'🌪',fitzpatrick_scale:false,category:"animals_and_nature"},fog:{keywords:["weather"],char:'🌫',fitzpatrick_scale:false,category:"animals_and_nature"},open_umbrella:{keywords:["weather","spring"],char:'☂',fitzpatrick_scale:false,category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],char:'☔',fitzpatrick_scale:false,category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],char:'💧',fitzpatrick_scale:false,category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],char:'💦',fitzpatrick_scale:false,category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],char:'🌊',fitzpatrick_scale:false,category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],char:'ðŸ',fitzpatrick_scale:false,category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],char:'ðŸŽ',fitzpatrick_scale:false,category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],char:'ðŸ',fitzpatrick_scale:false,category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],char:'ðŸŠ',fitzpatrick_scale:false,category:"food_and_drink"},lemon:{keywords:["fruit","nature"],char:'ðŸ‹',fitzpatrick_scale:false,category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],char:'ðŸŒ',fitzpatrick_scale:false,category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],char:'ðŸ‰',fitzpatrick_scale:false,category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],char:'ðŸ‡',fitzpatrick_scale:false,category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],char:'ðŸ“',fitzpatrick_scale:false,category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],char:'ðŸˆ',fitzpatrick_scale:false,category:"food_and_drink"},cherries:{keywords:["food","fruit"],char:'ðŸ’',fitzpatrick_scale:false,category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],char:'ðŸ‘',fitzpatrick_scale:false,category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],char:'ðŸ',fitzpatrick_scale:false,category:"food_and_drink"},coconut:{keywords:["fruit","nature","food","palm"],char:'🥥',fitzpatrick_scale:false,category:"food_and_drink"},kiwi_fruit:{keywords:["fruit","food"],char:'ðŸ¥',fitzpatrick_scale:false,category:"food_and_drink"},mango:{keywords:["fruit","food","tropical"],char:'🥭',fitzpatrick_scale:false,category:"food_and_drink"},avocado:{keywords:["fruit","food"],char:'🥑',fitzpatrick_scale:false,category:"food_and_drink"},broccoli:{keywords:["fruit","food","vegetable"],char:'🥦',fitzpatrick_scale:false,category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],char:'ðŸ…',fitzpatrick_scale:false,category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],char:'ðŸ†',fitzpatrick_scale:false,category:"food_and_drink"},cucumber:{keywords:["fruit","food","pickle"],char:'🥒',fitzpatrick_scale:false,category:"food_and_drink"},carrot:{keywords:["vegetable","food","orange"],char:'🥕',fitzpatrick_scale:false,category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],char:'🌶',fitzpatrick_scale:false,category:"food_and_drink"},potato:{keywords:["food","tuber","vegatable","starch"],char:'🥔',fitzpatrick_scale:false,category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],char:'🌽',fitzpatrick_scale:false,category:"food_and_drink"},leafy_greens:{keywords:["food","vegetable","plant","bok choy","cabbage","kale","lettuce"],char:'🥬',fitzpatrick_scale:false,category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],char:'ðŸ ',fitzpatrick_scale:false,category:"food_and_drink"},peanuts:{keywords:["food","nut"],char:'🥜',fitzpatrick_scale:false,category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],char:'ðŸ¯',fitzpatrick_scale:false,category:"food_and_drink"},croissant:{keywords:["food","bread","french"],char:'ðŸ¥',fitzpatrick_scale:false,category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],char:'ðŸž',fitzpatrick_scale:false,category:"food_and_drink"},baguette_bread:{keywords:["food","bread","french"],char:'🥖',fitzpatrick_scale:false,category:"food_and_drink"},bagel:{keywords:["food","bread","bakery","schmear"],char:'🥯',fitzpatrick_scale:false,category:"food_and_drink"},pretzel:{keywords:["food","bread","twisted"],char:'🥨',fitzpatrick_scale:false,category:"food_and_drink"},cheese:{keywords:["food","chadder"],char:'🧀',fitzpatrick_scale:false,category:"food_and_drink"},egg:{keywords:["food","chicken","breakfast"],char:'🥚',fitzpatrick_scale:false,category:"food_and_drink"},bacon:{keywords:["food","breakfast","pork","pig","meat"],char:'🥓',fitzpatrick_scale:false,category:"food_and_drink"},steak:{keywords:["food","cow","meat","cut","chop","lambchop","porkchop"],char:'🥩',fitzpatrick_scale:false,category:"food_and_drink"},pancakes:{keywords:["food","breakfast","flapjacks","hotcakes"],char:'🥞',fitzpatrick_scale:false,category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],char:'ðŸ—',fitzpatrick_scale:false,category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],char:'ðŸ–',fitzpatrick_scale:false,category:"food_and_drink"},bone:{keywords:["skeleton"],char:'🦴',fitzpatrick_scale:false,category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],char:'ðŸ¤',fitzpatrick_scale:false,category:"food_and_drink"},fried_egg:{keywords:["food","breakfast","kitchen","egg"],char:'ðŸ³',fitzpatrick_scale:false,category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],char:'ðŸ”',fitzpatrick_scale:false,category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],char:'ðŸŸ',fitzpatrick_scale:false,category:"food_and_drink"},stuffed_flatbread:{keywords:["food","flatbread","stuffed","gyro"],char:'🥙',fitzpatrick_scale:false,category:"food_and_drink"},hotdog:{keywords:["food","frankfurter"],char:'🌭',fitzpatrick_scale:false,category:"food_and_drink"},pizza:{keywords:["food","party"],char:'ðŸ•',fitzpatrick_scale:false,category:"food_and_drink"},sandwich:{keywords:["food","lunch","bread"],char:'🥪',fitzpatrick_scale:false,category:"food_and_drink"},canned_food:{keywords:["food","soup"],char:'🥫',fitzpatrick_scale:false,category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],char:'ðŸ',fitzpatrick_scale:false,category:"food_and_drink"},taco:{keywords:["food","mexican"],char:'🌮',fitzpatrick_scale:false,category:"food_and_drink"},burrito:{keywords:["food","mexican"],char:'🌯',fitzpatrick_scale:false,category:"food_and_drink"},green_salad:{keywords:["food","healthy","lettuce"],char:'🥗',fitzpatrick_scale:false,category:"food_and_drink"},shallow_pan_of_food:{keywords:["food","cooking","casserole","paella"],char:'🥘',fitzpatrick_scale:false,category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],char:'ðŸœ',fitzpatrick_scale:false,category:"food_and_drink"},stew:{keywords:["food","meat","soup"],char:'ðŸ²',fitzpatrick_scale:false,category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"],char:'ðŸ¥',fitzpatrick_scale:false,category:"food_and_drink"},fortune_cookie:{keywords:["food","prophecy"],char:'🥠',fitzpatrick_scale:false,category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],char:'ðŸ£',fitzpatrick_scale:false,category:"food_and_drink"},bento:{keywords:["food","japanese","box"],char:'ðŸ±',fitzpatrick_scale:false,category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],char:'ðŸ›',fitzpatrick_scale:false,category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],char:'ðŸ™',fitzpatrick_scale:false,category:"food_and_drink"},rice:{keywords:["food","china","asian"],char:'ðŸš',fitzpatrick_scale:false,category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],char:'ðŸ˜',fitzpatrick_scale:false,category:"food_and_drink"},oden:{keywords:["food","japanese"],char:'ðŸ¢',fitzpatrick_scale:false,category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],char:'ðŸ¡',fitzpatrick_scale:false,category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],char:'ðŸ§',fitzpatrick_scale:false,category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],char:'ðŸ¨',fitzpatrick_scale:false,category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],char:'ðŸ¦',fitzpatrick_scale:false,category:"food_and_drink"},pie:{keywords:["food","dessert","pastry"],char:'🥧',fitzpatrick_scale:false,category:"food_and_drink"},cake:{keywords:["food","dessert"],char:'ðŸ°',fitzpatrick_scale:false,category:"food_and_drink"},cupcake:{keywords:["food","dessert","bakery","sweet"],char:'ðŸ§',fitzpatrick_scale:false,category:"food_and_drink"},moon_cake:{keywords:["food","autumn"],char:'🥮',fitzpatrick_scale:false,category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],char:'🎂',fitzpatrick_scale:false,category:"food_and_drink"},custard:{keywords:["dessert","food"],char:'ðŸ®',fitzpatrick_scale:false,category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],char:'ðŸ¬',fitzpatrick_scale:false,category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],char:'ðŸ­',fitzpatrick_scale:false,category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],char:'ðŸ«',fitzpatrick_scale:false,category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],char:'ðŸ¿',fitzpatrick_scale:false,category:"food_and_drink"},dumpling:{keywords:["food","empanada","pierogi","potsticker"],char:'🥟',fitzpatrick_scale:false,category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],char:'ðŸ©',fitzpatrick_scale:false,category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],char:'ðŸª',fitzpatrick_scale:false,category:"food_and_drink"},milk_glass:{keywords:["beverage","drink","cow"],char:'🥛',fitzpatrick_scale:false,category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:'ðŸº',fitzpatrick_scale:false,category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:'ðŸ»',fitzpatrick_scale:false,category:"food_and_drink"},clinking_glasses:{keywords:["beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"],char:'🥂',fitzpatrick_scale:false,category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],char:'ðŸ·',fitzpatrick_scale:false,category:"food_and_drink"},tumbler_glass:{keywords:["drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"],char:'🥃',fitzpatrick_scale:false,category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],char:'ðŸ¸',fitzpatrick_scale:false,category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],char:'ðŸ¹',fitzpatrick_scale:false,category:"food_and_drink"},champagne:{keywords:["drink","wine","bottle","celebration"],char:'ðŸ¾',fitzpatrick_scale:false,category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],char:'ðŸ¶',fitzpatrick_scale:false,category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],char:'ðŸµ',fitzpatrick_scale:false,category:"food_and_drink"},cup_with_straw:{keywords:["drink","soda"],char:'🥤',fitzpatrick_scale:false,category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],char:'☕',fitzpatrick_scale:false,category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],char:'ðŸ¼',fitzpatrick_scale:false,category:"food_and_drink"},salt:{keywords:["condiment","shaker"],char:'🧂',fitzpatrick_scale:false,category:"food_and_drink"},spoon:{keywords:["cutlery","kitchen","tableware"],char:'🥄',fitzpatrick_scale:false,category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],char:'ðŸ´',fitzpatrick_scale:false,category:"food_and_drink"},plate_with_cutlery:{keywords:["food","eat","meal","lunch","dinner","restaurant"],char:'ðŸ½',fitzpatrick_scale:false,category:"food_and_drink"},bowl_with_spoon:{keywords:["food","breakfast","cereal","oatmeal","porridge"],char:'🥣',fitzpatrick_scale:false,category:"food_and_drink"},takeout_box:{keywords:["food","leftovers"],char:'🥡',fitzpatrick_scale:false,category:"food_and_drink"},chopsticks:{keywords:["food"],char:'🥢',fitzpatrick_scale:false,category:"food_and_drink"},soccer:{keywords:["sports","football"],char:'âš½',fitzpatrick_scale:false,category:"activity"},basketball:{keywords:["sports","balls","NBA"],char:'ðŸ€',fitzpatrick_scale:false,category:"activity"},football:{keywords:["sports","balls","NFL"],char:'ðŸˆ',fitzpatrick_scale:false,category:"activity"},baseball:{keywords:["sports","balls"],char:'âš¾',fitzpatrick_scale:false,category:"activity"},softball:{keywords:["sports","balls"],char:'🥎',fitzpatrick_scale:false,category:"activity"},tennis:{keywords:["sports","balls","green"],char:'🎾',fitzpatrick_scale:false,category:"activity"},volleyball:{keywords:["sports","balls"],char:'ðŸ',fitzpatrick_scale:false,category:"activity"},rugby_football:{keywords:["sports","team"],char:'ðŸ‰',fitzpatrick_scale:false,category:"activity"},flying_disc:{keywords:["sports","frisbee","ultimate"],char:'ðŸ¥',fitzpatrick_scale:false,category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],char:'🎱',fitzpatrick_scale:false,category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],char:'⛳',fitzpatrick_scale:false,category:"activity"},golfing_woman:{keywords:["sports","business","woman","female"],char:'ðŸŒï¸â€â™€ï¸',fitzpatrick_scale:false,category:"activity"},golfing_man:{keywords:["sports","business"],char:'ðŸŒ',fitzpatrick_scale:true,category:"activity"},ping_pong:{keywords:["sports","pingpong"],char:'ðŸ“',fitzpatrick_scale:false,category:"activity"},badminton:{keywords:["sports"],char:'ðŸ¸',fitzpatrick_scale:false,category:"activity"},goal_net:{keywords:["sports"],char:'🥅',fitzpatrick_scale:false,category:"activity"},ice_hockey:{keywords:["sports"],char:'ðŸ’',fitzpatrick_scale:false,category:"activity"},field_hockey:{keywords:["sports"],char:'ðŸ‘',fitzpatrick_scale:false,category:"activity"},lacrosse:{keywords:["sports","ball","stick"],char:'ðŸ¥',fitzpatrick_scale:false,category:"activity"},cricket:{keywords:["sports"],char:'ðŸ',fitzpatrick_scale:false,category:"activity"},ski:{keywords:["sports","winter","cold","snow"],char:'🎿',fitzpatrick_scale:false,category:"activity"},skier:{keywords:["sports","winter","snow"],char:'â›·',fitzpatrick_scale:false,category:"activity"},snowboarder:{keywords:["sports","winter"],char:'ðŸ‚',fitzpatrick_scale:true,category:"activity"},person_fencing:{keywords:["sports","fencing","sword"],char:'🤺',fitzpatrick_scale:false,category:"activity"},women_wrestling:{keywords:["sports","wrestlers"],char:'🤼â€â™€ï¸',fitzpatrick_scale:false,category:"activity"},men_wrestling:{keywords:["sports","wrestlers"],char:'🤼â€â™‚ï¸',fitzpatrick_scale:false,category:"activity"},woman_cartwheeling:{keywords:["gymnastics"],char:'🤸â€â™€ï¸',fitzpatrick_scale:true,category:"activity"},man_cartwheeling:{keywords:["gymnastics"],char:'🤸â€â™‚ï¸',fitzpatrick_scale:true,category:"activity"},woman_playing_handball:{keywords:["sports"],char:'🤾â€â™€ï¸',fitzpatrick_scale:true,category:"activity"},man_playing_handball:{keywords:["sports"],char:'🤾â€â™‚ï¸',fitzpatrick_scale:true,category:"activity"},ice_skate:{keywords:["sports"],char:'⛸',fitzpatrick_scale:false,category:"activity"},curling_stone:{keywords:["sports"],char:'🥌',fitzpatrick_scale:false,category:"activity"},skateboard:{keywords:["board"],char:'🛹',fitzpatrick_scale:false,category:"activity"},sled:{keywords:["sleigh","luge","toboggan"],char:'🛷',fitzpatrick_scale:false,category:"activity"},bow_and_arrow:{keywords:["sports"],char:'ðŸ¹',fitzpatrick_scale:false,category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],char:'🎣',fitzpatrick_scale:false,category:"activity"},boxing_glove:{keywords:["sports","fighting"],char:'🥊',fitzpatrick_scale:false,category:"activity"},martial_arts_uniform:{keywords:["judo","karate","taekwondo"],char:'🥋',fitzpatrick_scale:false,category:"activity"},rowing_woman:{keywords:["sports","hobby","water","ship","woman","female"],char:'🚣â€â™€ï¸',fitzpatrick_scale:true,category:"activity"},rowing_man:{keywords:["sports","hobby","water","ship"],char:'🚣',fitzpatrick_scale:true,category:"activity"},climbing_woman:{keywords:["sports","hobby","woman","female","rock"],char:'🧗â€â™€ï¸',fitzpatrick_scale:true,category:"activity"},climbing_man:{keywords:["sports","hobby","man","male","rock"],char:'🧗â€â™‚ï¸',fitzpatrick_scale:true,category:"activity"},swimming_woman:{keywords:["sports","exercise","human","athlete","water","summer","woman","female"],char:'ðŸŠâ€â™€ï¸',fitzpatrick_scale:true,category:"activity"},swimming_man:{keywords:["sports","exercise","human","athlete","water","summer"],char:'ðŸŠ',fitzpatrick_scale:true,category:"activity"},woman_playing_water_polo:{keywords:["sports","pool"],char:'🤽â€â™€ï¸',fitzpatrick_scale:true,category:"activity"},man_playing_water_polo:{keywords:["sports","pool"],char:'🤽â€â™‚ï¸',fitzpatrick_scale:true,category:"activity"},woman_in_lotus_position:{keywords:["woman","female","meditation","yoga","serenity","zen","mindfulness"],char:'🧘â€â™€ï¸',fitzpatrick_scale:true,category:"activity"},man_in_lotus_position:{keywords:["man","male","meditation","yoga","serenity","zen","mindfulness"],char:'🧘â€â™‚ï¸',fitzpatrick_scale:true,category:"activity"},surfing_woman:{keywords:["sports","ocean","sea","summer","beach","woman","female"],char:'ðŸ„â€â™€ï¸',fitzpatrick_scale:true,category:"activity"},surfing_man:{keywords:["sports","ocean","sea","summer","beach"],char:'ðŸ„',fitzpatrick_scale:true,category:"activity"},bath:{keywords:["clean","shower","bathroom"],char:'🛀',fitzpatrick_scale:true,category:"activity"},basketball_woman:{keywords:["sports","human","woman","female"],char:'⛹ï¸â€â™€ï¸',fitzpatrick_scale:true,category:"activity"},basketball_man:{keywords:["sports","human"],char:'⛹',fitzpatrick_scale:true,category:"activity"},weight_lifting_woman:{keywords:["sports","training","exercise","woman","female"],char:'ðŸ‹ï¸â€â™€ï¸',fitzpatrick_scale:true,category:"activity"},weight_lifting_man:{keywords:["sports","training","exercise"],char:'ðŸ‹',fitzpatrick_scale:true,category:"activity"},biking_woman:{keywords:["sports","bike","exercise","hipster","woman","female"],char:'🚴â€â™€ï¸',fitzpatrick_scale:true,category:"activity"},biking_man:{keywords:["sports","bike","exercise","hipster"],char:'🚴',fitzpatrick_scale:true,category:"activity"},mountain_biking_woman:{keywords:["transportation","sports","human","race","bike","woman","female"],char:'🚵â€â™€ï¸',fitzpatrick_scale:true,category:"activity"},mountain_biking_man:{keywords:["transportation","sports","human","race","bike"],char:'🚵',fitzpatrick_scale:true,category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],char:'ðŸ‡',fitzpatrick_scale:true,category:"activity"},business_suit_levitating:{keywords:["suit","business","levitate","hover","jump"],char:'🕴',fitzpatrick_scale:true,category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],char:'ðŸ†',fitzpatrick_scale:false,category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],char:'🎽',fitzpatrick_scale:false,category:"activity"},medal_sports:{keywords:["award","winning"],char:'ðŸ…',fitzpatrick_scale:false,category:"activity"},medal_military:{keywords:["award","winning","army"],char:'🎖',fitzpatrick_scale:false,category:"activity"},"1st_place_medal":{keywords:["award","winning","first"],char:'🥇',fitzpatrick_scale:false,category:"activity"},"2nd_place_medal":{keywords:["award","second"],char:'🥈',fitzpatrick_scale:false,category:"activity"},"3rd_place_medal":{keywords:["award","third"],char:'🥉',fitzpatrick_scale:false,category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],char:'🎗',fitzpatrick_scale:false,category:"activity"},rosette:{keywords:["flower","decoration","military"],char:'ðŸµ',fitzpatrick_scale:false,category:"activity"},ticket:{keywords:["event","concert","pass"],char:'🎫',fitzpatrick_scale:false,category:"activity"},tickets:{keywords:["sports","concert","entrance"],char:'🎟',fitzpatrick_scale:false,category:"activity"},performing_arts:{keywords:["acting","theater","drama"],char:'🎭',fitzpatrick_scale:false,category:"activity"},art:{keywords:["design","paint","draw","colors"],char:'🎨',fitzpatrick_scale:false,category:"activity"},circus_tent:{keywords:["festival","carnival","party"],char:'🎪',fitzpatrick_scale:false,category:"activity"},woman_juggling:{keywords:["juggle","balance","skill","multitask"],char:'🤹â€â™€ï¸',fitzpatrick_scale:true,category:"activity"},man_juggling:{keywords:["juggle","balance","skill","multitask"],char:'🤹â€â™‚ï¸',fitzpatrick_scale:true,category:"activity"},microphone:{keywords:["sound","music","PA","sing","talkshow"],char:'🎤',fitzpatrick_scale:false,category:"activity"},headphones:{keywords:["music","score","gadgets"],char:'🎧',fitzpatrick_scale:false,category:"activity"},musical_score:{keywords:["treble","clef","compose"],char:'🎼',fitzpatrick_scale:false,category:"activity"},musical_keyboard:{keywords:["piano","instrument","compose"],char:'🎹',fitzpatrick_scale:false,category:"activity"},drum:{keywords:["music","instrument","drumsticks","snare"],char:'ðŸ¥',fitzpatrick_scale:false,category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],char:'🎷',fitzpatrick_scale:false,category:"activity"},trumpet:{keywords:["music","brass"],char:'🎺',fitzpatrick_scale:false,category:"activity"},guitar:{keywords:["music","instrument"],char:'🎸',fitzpatrick_scale:false,category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],char:'🎻',fitzpatrick_scale:false,category:"activity"},clapper:{keywords:["movie","film","record"],char:'🎬',fitzpatrick_scale:false,category:"activity"},video_game:{keywords:["play","console","PS4","controller"],char:'🎮',fitzpatrick_scale:false,category:"activity"},space_invader:{keywords:["game","arcade","play"],char:'👾',fitzpatrick_scale:false,category:"activity"},dart:{keywords:["game","play","bar","target","bullseye"],char:'🎯',fitzpatrick_scale:false,category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],char:'🎲',fitzpatrick_scale:false,category:"activity"},chess_pawn:{keywords:["expendable"],char:"♟",fitzpatrick_scale:false,category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],char:'🎰',fitzpatrick_scale:false,category:"activity"},jigsaw:{keywords:["interlocking","puzzle","piece"],char:'🧩',fitzpatrick_scale:false,category:"activity"},bowling:{keywords:["sports","fun","play"],char:'🎳',fitzpatrick_scale:false,category:"activity"},red_car:{keywords:["red","transportation","vehicle"],char:'🚗',fitzpatrick_scale:false,category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],char:'🚕',fitzpatrick_scale:false,category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],char:'🚙',fitzpatrick_scale:false,category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],char:'🚌',fitzpatrick_scale:false,category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],char:'🚎',fitzpatrick_scale:false,category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],char:'ðŸŽ',fitzpatrick_scale:false,category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],char:'🚓',fitzpatrick_scale:false,category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],char:'🚑',fitzpatrick_scale:false,category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],char:'🚒',fitzpatrick_scale:false,category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],char:'ðŸš',fitzpatrick_scale:false,category:"travel_and_places"},truck:{keywords:["cars","transportation"],char:'🚚',fitzpatrick_scale:false,category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],char:'🚛',fitzpatrick_scale:false,category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],char:'🚜',fitzpatrick_scale:false,category:"travel_and_places"},kick_scooter:{keywords:["vehicle","kick","razor"],char:'🛴',fitzpatrick_scale:false,category:"travel_and_places"},motorcycle:{keywords:["race","sports","fast"],char:'ðŸ',fitzpatrick_scale:false,category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],char:'🚲',fitzpatrick_scale:false,category:"travel_and_places"},motor_scooter:{keywords:["vehicle","vespa","sasha"],char:'🛵',fitzpatrick_scale:false,category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],char:'🚨',fitzpatrick_scale:false,category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],char:'🚔',fitzpatrick_scale:false,category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],char:'ðŸš',fitzpatrick_scale:false,category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],char:'🚘',fitzpatrick_scale:false,category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],char:'🚖',fitzpatrick_scale:false,category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],char:'🚡',fitzpatrick_scale:false,category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],char:'🚠',fitzpatrick_scale:false,category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],char:'🚟',fitzpatrick_scale:false,category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],char:'🚃',fitzpatrick_scale:false,category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],char:'🚋',fitzpatrick_scale:false,category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],char:'ðŸš',fitzpatrick_scale:false,category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],char:'🚄',fitzpatrick_scale:false,category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],char:'🚅',fitzpatrick_scale:false,category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],char:'🚈',fitzpatrick_scale:false,category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],char:'🚞',fitzpatrick_scale:false,category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],char:'🚂',fitzpatrick_scale:false,category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],char:'🚆',fitzpatrick_scale:false,category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],char:'🚇',fitzpatrick_scale:false,category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],char:'🚊',fitzpatrick_scale:false,category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],char:'🚉',fitzpatrick_scale:false,category:"travel_and_places"},flying_saucer:{keywords:["transportation","vehicle","ufo"],char:'🛸',fitzpatrick_scale:false,category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],char:'ðŸš',fitzpatrick_scale:false,category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],char:'🛩',fitzpatrick_scale:false,category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],char:'✈ï¸',fitzpatrick_scale:false,category:"travel_and_places"},flight_departure:{keywords:["airport","flight","landing"],char:'🛫',fitzpatrick_scale:false,category:"travel_and_places"},flight_arrival:{keywords:["airport","flight","boarding"],char:'🛬',fitzpatrick_scale:false,category:"travel_and_places"},sailboat:{keywords:["ship","summer","transportation","water","sailing"],char:'⛵',fitzpatrick_scale:false,category:"travel_and_places"},motor_boat:{keywords:["ship"],char:'🛥',fitzpatrick_scale:false,category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],char:'🚤',fitzpatrick_scale:false,category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],char:'â›´',fitzpatrick_scale:false,category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],char:'🛳',fitzpatrick_scale:false,category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],char:'🚀',fitzpatrick_scale:false,category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],char:'🛰',fitzpatrick_scale:false,category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],char:'💺',fitzpatrick_scale:false,category:"travel_and_places"},canoe:{keywords:["boat","paddle","water","ship"],char:'🛶',fitzpatrick_scale:false,category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],char:'âš“',fitzpatrick_scale:false,category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],char:'🚧',fitzpatrick_scale:false,category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],char:'⛽',fitzpatrick_scale:false,category:"travel_and_places"},busstop:{keywords:["transportation","wait"],char:'ðŸš',fitzpatrick_scale:false,category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],char:'🚦',fitzpatrick_scale:false,category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],char:'🚥',fitzpatrick_scale:false,category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],char:'ðŸ',fitzpatrick_scale:false,category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],char:'🚢',fitzpatrick_scale:false,category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],char:'🎡',fitzpatrick_scale:false,category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],char:'🎢',fitzpatrick_scale:false,category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],char:'🎠',fitzpatrick_scale:false,category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],char:'ðŸ—',fitzpatrick_scale:false,category:"travel_and_places"},foggy:{keywords:["photo","mountain"],char:'ðŸŒ',fitzpatrick_scale:false,category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],char:'🗼',fitzpatrick_scale:false,category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],char:'ðŸ­',fitzpatrick_scale:false,category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],char:'⛲',fitzpatrick_scale:false,category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],char:'🎑',fitzpatrick_scale:false,category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],char:'â›°',fitzpatrick_scale:false,category:"travel_and_places"},mountain_snow:{keywords:["photo","nature","environment","winter","cold"],char:'ðŸ”',fitzpatrick_scale:false,category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],char:'🗻',fitzpatrick_scale:false,category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],char:'🌋',fitzpatrick_scale:false,category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],char:'🗾',fitzpatrick_scale:false,category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],char:'ðŸ•',fitzpatrick_scale:false,category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],char:'⛺',fitzpatrick_scale:false,category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],char:'ðŸž',fitzpatrick_scale:false,category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],char:'🛣',fitzpatrick_scale:false,category:"travel_and_places"},railway_track:{keywords:["train","transportation"],char:'🛤',fitzpatrick_scale:false,category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],char:'🌅',fitzpatrick_scale:false,category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],char:'🌄',fitzpatrick_scale:false,category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],char:'ðŸœ',fitzpatrick_scale:false,category:"travel_and_places"},beach_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],char:'ðŸ–',fitzpatrick_scale:false,category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],char:'ðŸ',fitzpatrick_scale:false,category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],char:'🌇',fitzpatrick_scale:false,category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],char:'🌆',fitzpatrick_scale:false,category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],char:'ðŸ™',fitzpatrick_scale:false,category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],char:'🌃',fitzpatrick_scale:false,category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],char:'🌉',fitzpatrick_scale:false,category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],char:'🌌',fitzpatrick_scale:false,category:"travel_and_places"},stars:{keywords:["night","photo"],char:'🌠',fitzpatrick_scale:false,category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],char:'🎇',fitzpatrick_scale:false,category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],char:'🎆',fitzpatrick_scale:false,category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn_face","photo","sky","spring"],char:'🌈',fitzpatrick_scale:false,category:"travel_and_places"},houses:{keywords:["buildings","photo"],char:'ðŸ˜',fitzpatrick_scale:false,category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],char:'ðŸ°',fitzpatrick_scale:false,category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],char:'ðŸ¯',fitzpatrick_scale:false,category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],char:'ðŸŸ',fitzpatrick_scale:false,category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],char:'🗽',fitzpatrick_scale:false,category:"travel_and_places"},house:{keywords:["building","home"],char:'ðŸ ',fitzpatrick_scale:false,category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],char:'ðŸ¡',fitzpatrick_scale:false,category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],char:'ðŸš',fitzpatrick_scale:false,category:"travel_and_places"},office:{keywords:["building","bureau","work"],char:'ðŸ¢',fitzpatrick_scale:false,category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],char:'ðŸ¬',fitzpatrick_scale:false,category:"travel_and_places"},post_office:{keywords:["building","envelope","communication"],char:'ðŸ£',fitzpatrick_scale:false,category:"travel_and_places"},european_post_office:{keywords:["building","email"],char:'ðŸ¤',fitzpatrick_scale:false,category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],char:'ðŸ¥',fitzpatrick_scale:false,category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],char:'ðŸ¦',fitzpatrick_scale:false,category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],char:'ðŸ¨',fitzpatrick_scale:false,category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],char:'ðŸª',fitzpatrick_scale:false,category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],char:'ðŸ«',fitzpatrick_scale:false,category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],char:'ðŸ©',fitzpatrick_scale:false,category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],char:'💒',fitzpatrick_scale:false,category:"travel_and_places"},classical_building:{keywords:["art","culture","history"],char:'ðŸ›',fitzpatrick_scale:false,category:"travel_and_places"},church:{keywords:["building","religion","christ"],char:'⛪',fitzpatrick_scale:false,category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],char:'🕌',fitzpatrick_scale:false,category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],char:'ðŸ•',fitzpatrick_scale:false,category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],char:'🕋',fitzpatrick_scale:false,category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],char:'⛩',fitzpatrick_scale:false,category:"travel_and_places"},watch:{keywords:["time","accessories"],char:'⌚',fitzpatrick_scale:false,category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],char:'📱',fitzpatrick_scale:false,category:"objects"},calling:{keywords:["iphone","incoming"],char:'📲',fitzpatrick_scale:false,category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],char:'💻',fitzpatrick_scale:false,category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],char:'⌨',fitzpatrick_scale:false,category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],char:'🖥',fitzpatrick_scale:false,category:"objects"},printer:{keywords:["paper","ink"],char:'🖨',fitzpatrick_scale:false,category:"objects"},computer_mouse:{keywords:["click"],char:'🖱',fitzpatrick_scale:false,category:"objects"},trackball:{keywords:["technology","trackpad"],char:'🖲',fitzpatrick_scale:false,category:"objects"},joystick:{keywords:["game","play"],char:'🕹',fitzpatrick_scale:false,category:"objects"},clamp:{keywords:["tool"],char:'🗜',fitzpatrick_scale:false,category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],char:'💽',fitzpatrick_scale:false,category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],char:'💾',fitzpatrick_scale:false,category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],char:'💿',fitzpatrick_scale:false,category:"objects"},dvd:{keywords:["cd","disk","disc"],char:'📀',fitzpatrick_scale:false,category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],char:'📼',fitzpatrick_scale:false,category:"objects"},camera:{keywords:["gadgets","photography"],char:'📷',fitzpatrick_scale:false,category:"objects"},camera_flash:{keywords:["photography","gadgets"],char:'📸',fitzpatrick_scale:false,category:"objects"},video_camera:{keywords:["film","record"],char:'📹',fitzpatrick_scale:false,category:"objects"},movie_camera:{keywords:["film","record"],char:'🎥',fitzpatrick_scale:false,category:"objects"},film_projector:{keywords:["video","tape","record","movie"],char:'📽',fitzpatrick_scale:false,category:"objects"},film_strip:{keywords:["movie"],char:'🎞',fitzpatrick_scale:false,category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],char:'📞',fitzpatrick_scale:false,category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],char:'☎ï¸',fitzpatrick_scale:false,category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],char:'📟',fitzpatrick_scale:false,category:"objects"},fax:{keywords:["communication","technology"],char:'📠',fitzpatrick_scale:false,category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],char:'📺',fitzpatrick_scale:false,category:"objects"},radio:{keywords:["communication","music","podcast","program"],char:'📻',fitzpatrick_scale:false,category:"objects"},studio_microphone:{keywords:["sing","recording","artist","talkshow"],char:'🎙',fitzpatrick_scale:false,category:"objects"},level_slider:{keywords:["scale"],char:'🎚',fitzpatrick_scale:false,category:"objects"},control_knobs:{keywords:["dial"],char:'🎛',fitzpatrick_scale:false,category:"objects"},compass:{keywords:["magnetic","navigation","orienteering"],char:'🧭',fitzpatrick_scale:false,category:"objects"},stopwatch:{keywords:["time","deadline"],char:'â±',fitzpatrick_scale:false,category:"objects"},timer_clock:{keywords:["alarm"],char:'â²',fitzpatrick_scale:false,category:"objects"},alarm_clock:{keywords:["time","wake"],char:'â°',fitzpatrick_scale:false,category:"objects"},mantelpiece_clock:{keywords:["time"],char:'🕰',fitzpatrick_scale:false,category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],char:'â³',fitzpatrick_scale:false,category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],char:'⌛',fitzpatrick_scale:false,category:"objects"},satellite:{keywords:["communication","future","radio","space"],char:'📡',fitzpatrick_scale:false,category:"objects"},battery:{keywords:["power","energy","sustain"],char:'🔋',fitzpatrick_scale:false,category:"objects"},electric_plug:{keywords:["charger","power"],char:'🔌',fitzpatrick_scale:false,category:"objects"},bulb:{keywords:["light","electricity","idea"],char:'💡',fitzpatrick_scale:false,category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],char:'🔦',fitzpatrick_scale:false,category:"objects"},candle:{keywords:["fire","wax"],char:'🕯',fitzpatrick_scale:false,category:"objects"},fire_extinguisher:{keywords:["quench"],char:'🧯',fitzpatrick_scale:false,category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],char:'🗑',fitzpatrick_scale:false,category:"objects"},oil_drum:{keywords:["barrell"],char:'🛢',fitzpatrick_scale:false,category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],char:'💸',fitzpatrick_scale:false,category:"objects"},dollar:{keywords:["money","sales","bill","currency"],char:'💵',fitzpatrick_scale:false,category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],char:'💴',fitzpatrick_scale:false,category:"objects"},euro:{keywords:["money","sales","dollar","currency"],char:'💶',fitzpatrick_scale:false,category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],char:'💷',fitzpatrick_scale:false,category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],char:'💰',fitzpatrick_scale:false,category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],char:'💳',fitzpatrick_scale:false,category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],char:'💎',fitzpatrick_scale:false,category:"objects"},balance_scale:{keywords:["law","fairness","weight"],char:'âš–',fitzpatrick_scale:false,category:"objects"},toolbox:{keywords:["tools","diy","fix","maintainer","mechanic"],char:'🧰',fitzpatrick_scale:false,category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],char:'🔧',fitzpatrick_scale:false,category:"objects"},hammer:{keywords:["tools","build","create"],char:'🔨',fitzpatrick_scale:false,category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],char:'âš’',fitzpatrick_scale:false,category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],char:'🛠',fitzpatrick_scale:false,category:"objects"},pick:{keywords:["tools","dig"],char:'â›',fitzpatrick_scale:false,category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],char:'🔩',fitzpatrick_scale:false,category:"objects"},gear:{keywords:["cog"],char:'âš™',fitzpatrick_scale:false,category:"objects"},brick:{keywords:["bricks"],char:'🧱',fitzpatrick_scale:false,category:"objects"},chains:{keywords:["lock","arrest"],char:'⛓',fitzpatrick_scale:false,category:"objects"},magnet:{keywords:["attraction","magnetic"],char:'🧲',fitzpatrick_scale:false,category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],char:'🔫',fitzpatrick_scale:false,category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],char:'💣',fitzpatrick_scale:false,category:"objects"},firecracker:{keywords:["dynamite","boom","explode","explosion","explosive"],char:'🧨',fitzpatrick_scale:false,category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],char:'🔪',fitzpatrick_scale:false,category:"objects"},dagger:{keywords:["weapon"],char:'🗡',fitzpatrick_scale:false,category:"objects"},crossed_swords:{keywords:["weapon"],char:'âš”',fitzpatrick_scale:false,category:"objects"},shield:{keywords:["protection","security"],char:'🛡',fitzpatrick_scale:false,category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],char:'🚬',fitzpatrick_scale:false,category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary","death","pirate","evil"],char:'☠',fitzpatrick_scale:false,category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],char:'âš°',fitzpatrick_scale:false,category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],char:'âš±',fitzpatrick_scale:false,category:"objects"},amphora:{keywords:["vase","jar"],char:'ðŸº',fitzpatrick_scale:false,category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],char:'🔮',fitzpatrick_scale:false,category:"objects"},prayer_beads:{keywords:["dhikr","religious"],char:'📿',fitzpatrick_scale:false,category:"objects"},nazar_amulet:{keywords:["bead","charm"],char:'🧿',fitzpatrick_scale:false,category:"objects"},barber:{keywords:["hair","salon","style"],char:'💈',fitzpatrick_scale:false,category:"objects"},alembic:{keywords:["distilling","science","experiment","chemistry"],char:'âš—',fitzpatrick_scale:false,category:"objects"},telescope:{keywords:["stars","space","zoom","science","astronomy"],char:'🔭',fitzpatrick_scale:false,category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],char:'🔬',fitzpatrick_scale:false,category:"objects"},hole:{keywords:["embarrassing"],char:'🕳',fitzpatrick_scale:false,category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],char:'💊',fitzpatrick_scale:false,category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],char:'💉',fitzpatrick_scale:false,category:"objects"},dna:{keywords:["biologist","genetics","life"],char:'🧬',fitzpatrick_scale:false,category:"objects"},microbe:{keywords:["amoeba","bacteria","germs"],char:'🦠',fitzpatrick_scale:false,category:"objects"},petri_dish:{keywords:["bacteria","biology","culture","lab"],char:'🧫',fitzpatrick_scale:false,category:"objects"},test_tube:{keywords:["chemistry","experiment","lab","science"],char:'🧪',fitzpatrick_scale:false,category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],char:'🌡',fitzpatrick_scale:false,category:"objects"},broom:{keywords:["cleaning","sweeping","witch"],char:'🧹',fitzpatrick_scale:false,category:"objects"},basket:{keywords:["laundry"],char:'🧺',fitzpatrick_scale:false,category:"objects"},toilet_paper:{keywords:["roll"],char:'🧻',fitzpatrick_scale:false,category:"objects"},label:{keywords:["sale","tag"],char:'ðŸ·',fitzpatrick_scale:false,category:"objects"},bookmark:{keywords:["favorite","label","save"],char:'🔖',fitzpatrick_scale:false,category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],char:'🚽',fitzpatrick_scale:false,category:"objects"},shower:{keywords:["clean","water","bathroom"],char:'🚿',fitzpatrick_scale:false,category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],char:'ðŸ›',fitzpatrick_scale:false,category:"objects"},soap:{keywords:["bar","bathing","cleaning","lather"],char:'🧼',fitzpatrick_scale:false,category:"objects"},sponge:{keywords:["absorbing","cleaning","porous"],char:'🧽',fitzpatrick_scale:false,category:"objects"},lotion_bottle:{keywords:["moisturizer","sunscreen"],char:'🧴',fitzpatrick_scale:false,category:"objects"},key:{keywords:["lock","door","password"],char:'🔑',fitzpatrick_scale:false,category:"objects"},old_key:{keywords:["lock","door","password"],char:'ðŸ—',fitzpatrick_scale:false,category:"objects"},couch_and_lamp:{keywords:["read","chill"],char:'🛋',fitzpatrick_scale:false,category:"objects"},sleeping_bed:{keywords:["bed","rest"],char:'🛌',fitzpatrick_scale:true,category:"objects"},bed:{keywords:["sleep","rest"],char:'ðŸ›',fitzpatrick_scale:false,category:"objects"},door:{keywords:["house","entry","exit"],char:'🚪',fitzpatrick_scale:false,category:"objects"},bellhop_bell:{keywords:["service"],char:'🛎',fitzpatrick_scale:false,category:"objects"},teddy_bear:{keywords:["plush","stuffed"],char:'🧸',fitzpatrick_scale:false,category:"objects"},framed_picture:{keywords:["photography"],char:'🖼',fitzpatrick_scale:false,category:"objects"},world_map:{keywords:["location","direction"],char:'🗺',fitzpatrick_scale:false,category:"objects"},parasol_on_ground:{keywords:["weather","summer"],char:'â›±',fitzpatrick_scale:false,category:"objects"},moyai:{keywords:["rock","easter island","moai"],char:'🗿',fitzpatrick_scale:false,category:"objects"},shopping:{keywords:["mall","buy","purchase"],char:'ðŸ›',fitzpatrick_scale:false,category:"objects"},shopping_cart:{keywords:["trolley"],char:'🛒',fitzpatrick_scale:false,category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],char:'🎈',fitzpatrick_scale:false,category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],char:'ðŸŽ',fitzpatrick_scale:false,category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],char:'🎀',fitzpatrick_scale:false,category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],char:'ðŸŽ',fitzpatrick_scale:false,category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],char:'🎊',fitzpatrick_scale:false,category:"objects"},tada:{keywords:["party","congratulations","birthday","magic","circus","celebration"],char:'🎉',fitzpatrick_scale:false,category:"objects"},dolls:{keywords:["japanese","toy","kimono"],char:'🎎',fitzpatrick_scale:false,category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],char:'ðŸŽ',fitzpatrick_scale:false,category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],char:'🎌',fitzpatrick_scale:false,category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],char:'ðŸ®',fitzpatrick_scale:false,category:"objects"},red_envelope:{keywords:["gift"],char:'🧧',fitzpatrick_scale:false,category:"objects"},email:{keywords:["letter","postal","inbox","communication"],char:'✉ï¸',fitzpatrick_scale:false,category:"objects"},envelope_with_arrow:{keywords:["email","communication"],char:'📩',fitzpatrick_scale:false,category:"objects"},incoming_envelope:{keywords:["email","inbox"],char:'📨',fitzpatrick_scale:false,category:"objects"},"e-mail":{keywords:["communication","inbox"],char:'📧',fitzpatrick_scale:false,category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],char:'💌',fitzpatrick_scale:false,category:"objects"},postbox:{keywords:["email","letter","envelope"],char:'📮',fitzpatrick_scale:false,category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],char:'📪',fitzpatrick_scale:false,category:"objects"},mailbox:{keywords:["email","inbox","communication"],char:'📫',fitzpatrick_scale:false,category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],char:'📬',fitzpatrick_scale:false,category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],char:'📭',fitzpatrick_scale:false,category:"objects"},package:{keywords:["mail","gift","cardboard","box","moving"],char:'📦',fitzpatrick_scale:false,category:"objects"},postal_horn:{keywords:["instrument","music"],char:'📯',fitzpatrick_scale:false,category:"objects"},inbox_tray:{keywords:["email","documents"],char:'📥',fitzpatrick_scale:false,category:"objects"},outbox_tray:{keywords:["inbox","email"],char:'📤',fitzpatrick_scale:false,category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],char:'📜',fitzpatrick_scale:false,category:"objects"},page_with_curl:{keywords:["documents","office","paper"],char:'📃',fitzpatrick_scale:false,category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],char:'📑',fitzpatrick_scale:false,category:"objects"},receipt:{keywords:["accounting","expenses"],char:'🧾',fitzpatrick_scale:false,category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],char:'📊',fitzpatrick_scale:false,category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],char:'📈',fitzpatrick_scale:false,category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],char:'📉',fitzpatrick_scale:false,category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],char:'📄',fitzpatrick_scale:false,category:"objects"},date:{keywords:["calendar","schedule"],char:'📅',fitzpatrick_scale:false,category:"objects"},calendar:{keywords:["schedule","date","planning"],char:'📆',fitzpatrick_scale:false,category:"objects"},spiral_calendar:{keywords:["date","schedule","planning"],char:'🗓',fitzpatrick_scale:false,category:"objects"},card_index:{keywords:["business","stationery"],char:'📇',fitzpatrick_scale:false,category:"objects"},card_file_box:{keywords:["business","stationery"],char:'🗃',fitzpatrick_scale:false,category:"objects"},ballot_box:{keywords:["election","vote"],char:'🗳',fitzpatrick_scale:false,category:"objects"},file_cabinet:{keywords:["filing","organizing"],char:'🗄',fitzpatrick_scale:false,category:"objects"},clipboard:{keywords:["stationery","documents"],char:'📋',fitzpatrick_scale:false,category:"objects"},spiral_notepad:{keywords:["memo","stationery"],char:'🗒',fitzpatrick_scale:false,category:"objects"},file_folder:{keywords:["documents","business","office"],char:'ðŸ“',fitzpatrick_scale:false,category:"objects"},open_file_folder:{keywords:["documents","load"],char:'📂',fitzpatrick_scale:false,category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],char:'🗂',fitzpatrick_scale:false,category:"objects"},newspaper_roll:{keywords:["press","headline"],char:'🗞',fitzpatrick_scale:false,category:"objects"},newspaper:{keywords:["press","headline"],char:'📰',fitzpatrick_scale:false,category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],char:'📓',fitzpatrick_scale:false,category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],char:'📕',fitzpatrick_scale:false,category:"objects"},green_book:{keywords:["read","library","knowledge","study"],char:'📗',fitzpatrick_scale:false,category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],char:'📘',fitzpatrick_scale:false,category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],char:'📙',fitzpatrick_scale:false,category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],char:'📔',fitzpatrick_scale:false,category:"objects"},ledger:{keywords:["notes","paper"],char:'📒',fitzpatrick_scale:false,category:"objects"},books:{keywords:["literature","library","study"],char:'📚',fitzpatrick_scale:false,category:"objects"},open_book:{keywords:["book","read","library","knowledge","literature","learn","study"],char:'📖',fitzpatrick_scale:false,category:"objects"},safety_pin:{keywords:["diaper"],char:'🧷',fitzpatrick_scale:false,category:"objects"},link:{keywords:["rings","url"],char:'🔗',fitzpatrick_scale:false,category:"objects"},paperclip:{keywords:["documents","stationery"],char:'📎',fitzpatrick_scale:false,category:"objects"},paperclips:{keywords:["documents","stationery"],char:'🖇',fitzpatrick_scale:false,category:"objects"},scissors:{keywords:["stationery","cut"],char:'✂ï¸',fitzpatrick_scale:false,category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],char:'ðŸ“',fitzpatrick_scale:false,category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],char:'ðŸ“',fitzpatrick_scale:false,category:"objects"},abacus:{keywords:["calculation"],char:'🧮',fitzpatrick_scale:false,category:"objects"},pushpin:{keywords:["stationery","mark","here"],char:'📌',fitzpatrick_scale:false,category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],char:'ðŸ“',fitzpatrick_scale:false,category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],char:'🚩',fitzpatrick_scale:false,category:"objects"},white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],char:'ðŸ³',fitzpatrick_scale:false,category:"objects"},black_flag:{keywords:["pirate"],char:'ðŸ´',fitzpatrick_scale:false,category:"objects"},rainbow_flag:{keywords:["flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"],char:'ðŸ³ï¸â€ðŸŒˆ',fitzpatrick_scale:false,category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],char:'ðŸ”',fitzpatrick_scale:false,category:"objects"},lock:{keywords:["security","password","padlock"],char:'🔒',fitzpatrick_scale:false,category:"objects"},unlock:{keywords:["privacy","security"],char:'🔓',fitzpatrick_scale:false,category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],char:'ðŸ”',fitzpatrick_scale:false,category:"objects"},pen:{keywords:["stationery","writing","write"],char:'🖊',fitzpatrick_scale:false,category:"objects"},fountain_pen:{keywords:["stationery","writing","write"],char:'🖋',fitzpatrick_scale:false,category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],char:'✒ï¸',fitzpatrick_scale:false,category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"],char:'ðŸ“',fitzpatrick_scale:false,category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],char:'âœï¸',fitzpatrick_scale:false,category:"objects"},crayon:{keywords:["drawing","creativity"],char:'ðŸ–',fitzpatrick_scale:false,category:"objects"},paintbrush:{keywords:["drawing","creativity","art"],char:'🖌',fitzpatrick_scale:false,category:"objects"},mag:{keywords:["search","zoom","find","detective"],char:'ðŸ”',fitzpatrick_scale:false,category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],char:'🔎',fitzpatrick_scale:false,category:"objects"},heart:{keywords:["love","like","valentines"],char:'â¤ï¸',fitzpatrick_scale:false,category:"symbols"},orange_heart:{keywords:["love","like","affection","valentines"],char:'🧡',fitzpatrick_scale:false,category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],char:'💛',fitzpatrick_scale:false,category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],char:'💚',fitzpatrick_scale:false,category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],char:'💙',fitzpatrick_scale:false,category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],char:'💜',fitzpatrick_scale:false,category:"symbols"},black_heart:{keywords:["evil"],char:'🖤',fitzpatrick_scale:false,category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],char:'💔',fitzpatrick_scale:false,category:"symbols"},heavy_heart_exclamation:{keywords:["decoration","love"],char:'â£',fitzpatrick_scale:false,category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],char:'💕',fitzpatrick_scale:false,category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],char:'💞',fitzpatrick_scale:false,category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],char:'💓',fitzpatrick_scale:false,category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],char:'💗',fitzpatrick_scale:false,category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],char:'💖',fitzpatrick_scale:false,category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],char:'💘',fitzpatrick_scale:false,category:"symbols"},gift_heart:{keywords:["love","valentines"],char:'ðŸ’',fitzpatrick_scale:false,category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],char:'💟',fitzpatrick_scale:false,category:"symbols"},peace_symbol:{keywords:["hippie"],char:'☮',fitzpatrick_scale:false,category:"symbols"},latin_cross:{keywords:["christianity"],char:'âœ',fitzpatrick_scale:false,category:"symbols"},star_and_crescent:{keywords:["islam"],char:'☪',fitzpatrick_scale:false,category:"symbols"},om:{keywords:["hinduism","buddhism","sikhism","jainism"],char:'🕉',fitzpatrick_scale:false,category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],char:'☸',fitzpatrick_scale:false,category:"symbols"},star_of_david:{keywords:["judaism"],char:'✡',fitzpatrick_scale:false,category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],char:'🔯',fitzpatrick_scale:false,category:"symbols"},menorah:{keywords:["hanukkah","candles","jewish"],char:'🕎',fitzpatrick_scale:false,category:"symbols"},yin_yang:{keywords:["balance"],char:'☯',fitzpatrick_scale:false,category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],char:'☦',fitzpatrick_scale:false,category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],char:'ðŸ›',fitzpatrick_scale:false,category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],char:'⛎',fitzpatrick_scale:false,category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],char:'♈',fitzpatrick_scale:false,category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],char:'♉',fitzpatrick_scale:false,category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],char:'♊',fitzpatrick_scale:false,category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],char:'♋',fitzpatrick_scale:false,category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],char:'♌',fitzpatrick_scale:false,category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],char:'â™',fitzpatrick_scale:false,category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],char:'♎',fitzpatrick_scale:false,category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],char:'â™',fitzpatrick_scale:false,category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],char:'â™',fitzpatrick_scale:false,category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],char:'♑',fitzpatrick_scale:false,category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],char:'â™’',fitzpatrick_scale:false,category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],char:'♓',fitzpatrick_scale:false,category:"symbols"},id:{keywords:["purple-square","words"],char:'🆔',fitzpatrick_scale:false,category:"symbols"},atom_symbol:{keywords:["science","physics","chemistry"],char:'âš›',fitzpatrick_scale:false,category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],char:'🈳',fitzpatrick_scale:false,category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],char:'🈹',fitzpatrick_scale:false,category:"symbols"},radioactive:{keywords:["nuclear","danger"],char:'☢',fitzpatrick_scale:false,category:"symbols"},biohazard:{keywords:["danger"],char:'☣',fitzpatrick_scale:false,category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],char:'📴',fitzpatrick_scale:false,category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],char:'📳',fitzpatrick_scale:false,category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],char:'🈶',fitzpatrick_scale:false,category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],char:'🈚',fitzpatrick_scale:false,category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],char:'🈸',fitzpatrick_scale:false,category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],char:'🈺',fitzpatrick_scale:false,category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],char:'🈷ï¸',fitzpatrick_scale:false,category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],char:'✴ï¸',fitzpatrick_scale:false,category:"symbols"},vs:{keywords:["words","orange-square"],char:'🆚',fitzpatrick_scale:false,category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],char:'🉑',fitzpatrick_scale:false,category:"symbols"},white_flower:{keywords:["japanese","spring"],char:'💮',fitzpatrick_scale:false,category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],char:'ðŸ‰',fitzpatrick_scale:false,category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],char:'㊙ï¸',fitzpatrick_scale:false,category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],char:'㊗ï¸',fitzpatrick_scale:false,category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],char:'🈴',fitzpatrick_scale:false,category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],char:'🈵',fitzpatrick_scale:false,category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],char:'🈲',fitzpatrick_scale:false,category:"symbols"},a:{keywords:["red-square","alphabet","letter"],char:'🅰ï¸',fitzpatrick_scale:false,category:"symbols"},b:{keywords:["red-square","alphabet","letter"],char:'🅱ï¸',fitzpatrick_scale:false,category:"symbols"},ab:{keywords:["red-square","alphabet"],char:'🆎',fitzpatrick_scale:false,category:"symbols"},cl:{keywords:["alphabet","words","red-square"],char:'🆑',fitzpatrick_scale:false,category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],char:'🅾ï¸',fitzpatrick_scale:false,category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],char:'🆘',fitzpatrick_scale:false,category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],char:'â›”',fitzpatrick_scale:false,category:"symbols"},name_badge:{keywords:["fire","forbid"],char:'📛',fitzpatrick_scale:false,category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],char:'🚫',fitzpatrick_scale:false,category:"symbols"},x:{keywords:["no","delete","remove","cancel","red"],char:'âŒ',fitzpatrick_scale:false,category:"symbols"},o:{keywords:["circle","round"],char:'â­•',fitzpatrick_scale:false,category:"symbols"},stop_sign:{keywords:["stop"],char:'🛑',fitzpatrick_scale:false,category:"symbols"},anger:{keywords:["angry","mad"],char:'💢',fitzpatrick_scale:false,category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],char:'♨ï¸',fitzpatrick_scale:false,category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],char:'🚷',fitzpatrick_scale:false,category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],char:'🚯',fitzpatrick_scale:false,category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],char:'🚳',fitzpatrick_scale:false,category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],char:'🚱',fitzpatrick_scale:false,category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],char:'🔞',fitzpatrick_scale:false,category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],char:'📵',fitzpatrick_scale:false,category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],char:'â—',fitzpatrick_scale:false,category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],char:'â•',fitzpatrick_scale:false,category:"symbols"},question:{keywords:["doubt","confused"],char:'â“',fitzpatrick_scale:false,category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],char:'â”',fitzpatrick_scale:false,category:"symbols"},bangbang:{keywords:["exclamation","surprise"],char:'‼ï¸',fitzpatrick_scale:false,category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],char:'â‰ï¸',fitzpatrick_scale:false,category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],char:'🔅',fitzpatrick_scale:false,category:"symbols"},high_brightness:{keywords:["sun","light"],char:'🔆',fitzpatrick_scale:false,category:"symbols"},trident:{keywords:["weapon","spear"],char:'🔱',fitzpatrick_scale:false,category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],char:'âšœ',fitzpatrick_scale:false,category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],char:'〽ï¸',fitzpatrick_scale:false,category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],char:'âš ï¸',fitzpatrick_scale:false,category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],char:'🚸',fitzpatrick_scale:false,category:"symbols"},beginner:{keywords:["badge","shield"],char:'🔰',fitzpatrick_scale:false,category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],char:'â™»ï¸',fitzpatrick_scale:false,category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],char:'🈯',fitzpatrick_scale:false,category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],char:'💹',fitzpatrick_scale:false,category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],char:'â‡ï¸',fitzpatrick_scale:false,category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],char:'✳ï¸',fitzpatrick_scale:false,category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],char:'âŽ',fitzpatrick_scale:false,category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer","tick"],char:'✅',fitzpatrick_scale:false,category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],char:'💠',fitzpatrick_scale:false,category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],char:'🌀',fitzpatrick_scale:false,category:"symbols"},loop:{keywords:["tape","cassette"],char:'âž¿',fitzpatrick_scale:false,category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],char:'ðŸŒ',fitzpatrick_scale:false,category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],char:'â“‚ï¸',fitzpatrick_scale:false,category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],char:'ðŸ§',fitzpatrick_scale:false,category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],char:'🈂ï¸',fitzpatrick_scale:false,category:"symbols"},passport_control:{keywords:["custom","blue-square"],char:'🛂',fitzpatrick_scale:false,category:"symbols"},customs:{keywords:["passport","border","blue-square"],char:'🛃',fitzpatrick_scale:false,category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],char:'🛄',fitzpatrick_scale:false,category:"symbols"},left_luggage:{keywords:["blue-square","travel"],char:'🛅',fitzpatrick_scale:false,category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],char:'♿',fitzpatrick_scale:false,category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],char:'🚭',fitzpatrick_scale:false,category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],char:'🚾',fitzpatrick_scale:false,category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],char:'🅿ï¸',fitzpatrick_scale:false,category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],char:'🚰',fitzpatrick_scale:false,category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],char:'🚹',fitzpatrick_scale:false,category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],char:'🚺',fitzpatrick_scale:false,category:"symbols"},baby_symbol:{keywords:["orange-square","child"],char:'🚼',fitzpatrick_scale:false,category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],char:'🚻',fitzpatrick_scale:false,category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],char:'🚮',fitzpatrick_scale:false,category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],char:'🎦',fitzpatrick_scale:false,category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],char:'📶',fitzpatrick_scale:false,category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],char:'ðŸˆ',fitzpatrick_scale:false,category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],char:'🆖',fitzpatrick_scale:false,category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],char:'🆗',fitzpatrick_scale:false,category:"symbols"},up:{keywords:["blue-square","above","high"],char:'🆙',fitzpatrick_scale:false,category:"symbols"},cool:{keywords:["words","blue-square"],char:'🆒',fitzpatrick_scale:false,category:"symbols"},new:{keywords:["blue-square","words","start"],char:'🆕',fitzpatrick_scale:false,category:"symbols"},free:{keywords:["blue-square","words"],char:'🆓',fitzpatrick_scale:false,category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],char:'0ï¸âƒ£',fitzpatrick_scale:false,category:"symbols"},one:{keywords:["blue-square","numbers","1"],char:'1ï¸âƒ£',fitzpatrick_scale:false,category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],char:'2ï¸âƒ£',fitzpatrick_scale:false,category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],char:'3ï¸âƒ£',fitzpatrick_scale:false,category:"symbols"},four:{keywords:["4","numbers","blue-square"],char:'4ï¸âƒ£',fitzpatrick_scale:false,category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],char:'5ï¸âƒ£',fitzpatrick_scale:false,category:"symbols"},six:{keywords:["6","numbers","blue-square"],char:'6ï¸âƒ£',fitzpatrick_scale:false,category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],char:'7ï¸âƒ£',fitzpatrick_scale:false,category:"symbols"},eight:{keywords:["8","blue-square","numbers"],char:'8ï¸âƒ£',fitzpatrick_scale:false,category:"symbols"},nine:{keywords:["blue-square","numbers","9"],char:'9ï¸âƒ£',fitzpatrick_scale:false,category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],char:'🔟',fitzpatrick_scale:false,category:"symbols"},asterisk:{keywords:["star","keycap"],char:'*⃣',fitzpatrick_scale:false,category:"symbols"},eject_button:{keywords:["blue-square"],char:'âï¸',fitzpatrick_scale:false,category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],char:'â–¶ï¸',fitzpatrick_scale:false,category:"symbols"},pause_button:{keywords:["pause","blue-square"],char:'â¸',fitzpatrick_scale:false,category:"symbols"},next_track_button:{keywords:["forward","next","blue-square"],char:'â­',fitzpatrick_scale:false,category:"symbols"},stop_button:{keywords:["blue-square"],char:'â¹',fitzpatrick_scale:false,category:"symbols"},record_button:{keywords:["blue-square"],char:'âº',fitzpatrick_scale:false,category:"symbols"},play_or_pause_button:{keywords:["blue-square","play","pause"],char:'â¯',fitzpatrick_scale:false,category:"symbols"},previous_track_button:{keywords:["backward"],char:'â®',fitzpatrick_scale:false,category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],char:'â©',fitzpatrick_scale:false,category:"symbols"},rewind:{keywords:["play","blue-square"],char:'âª',fitzpatrick_scale:false,category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],char:'🔀',fitzpatrick_scale:false,category:"symbols"},repeat:{keywords:["loop","record"],char:'ðŸ”',fitzpatrick_scale:false,category:"symbols"},repeat_one:{keywords:["blue-square","loop"],char:'🔂',fitzpatrick_scale:false,category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],char:'â—€ï¸',fitzpatrick_scale:false,category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],char:'🔼',fitzpatrick_scale:false,category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],char:'🔽',fitzpatrick_scale:false,category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],char:'â«',fitzpatrick_scale:false,category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],char:'â¬',fitzpatrick_scale:false,category:"symbols"},arrow_right:{keywords:["blue-square","next"],char:'âž¡ï¸',fitzpatrick_scale:false,category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],char:'⬅ï¸',fitzpatrick_scale:false,category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],char:'⬆ï¸',fitzpatrick_scale:false,category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],char:'⬇ï¸',fitzpatrick_scale:false,category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],char:'↗ï¸',fitzpatrick_scale:false,category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],char:'↘ï¸',fitzpatrick_scale:false,category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],char:'↙ï¸',fitzpatrick_scale:false,category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],char:'↖ï¸',fitzpatrick_scale:false,category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],char:'↕ï¸',fitzpatrick_scale:false,category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],char:'↔ï¸',fitzpatrick_scale:false,category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],char:'🔄',fitzpatrick_scale:false,category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],char:'↪ï¸',fitzpatrick_scale:false,category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],char:'↩ï¸',fitzpatrick_scale:false,category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],char:'⤴ï¸',fitzpatrick_scale:false,category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],char:'⤵ï¸',fitzpatrick_scale:false,category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],char:'#ï¸âƒ£',fitzpatrick_scale:false,category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],char:'ℹï¸',fitzpatrick_scale:false,category:"symbols"},abc:{keywords:["blue-square","alphabet"],char:'🔤',fitzpatrick_scale:false,category:"symbols"},abcd:{keywords:["blue-square","alphabet"],char:'🔡',fitzpatrick_scale:false,category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],char:'🔠',fitzpatrick_scale:false,category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],char:'🔣',fitzpatrick_scale:false,category:"symbols"},musical_note:{keywords:["score","tone","sound"],char:'🎵',fitzpatrick_scale:false,category:"symbols"},notes:{keywords:["music","score"],char:'🎶',fitzpatrick_scale:false,category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],char:'〰ï¸',fitzpatrick_scale:false,category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],char:'âž°',fitzpatrick_scale:false,category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],char:'✔ï¸',fitzpatrick_scale:false,category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],char:'🔃',fitzpatrick_scale:false,category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],char:'âž•',fitzpatrick_scale:false,category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],char:'âž–',fitzpatrick_scale:false,category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],char:'âž—',fitzpatrick_scale:false,category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],char:'✖ï¸',fitzpatrick_scale:false,category:"symbols"},infinity:{keywords:["forever"],char:'♾',fitzpatrick_scale:false,category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],char:'💲',fitzpatrick_scale:false,category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],char:'💱',fitzpatrick_scale:false,category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],char:'©ï¸',fitzpatrick_scale:false,category:"symbols"},registered:{keywords:["alphabet","circle"],char:'®ï¸',fitzpatrick_scale:false,category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],char:'â„¢ï¸',fitzpatrick_scale:false,category:"symbols"},end:{keywords:["words","arrow"],char:'🔚',fitzpatrick_scale:false,category:"symbols"},back:{keywords:["arrow","words","return"],char:'🔙',fitzpatrick_scale:false,category:"symbols"},on:{keywords:["arrow","words"],char:'🔛',fitzpatrick_scale:false,category:"symbols"},top:{keywords:["words","blue-square"],char:'ðŸ”',fitzpatrick_scale:false,category:"symbols"},soon:{keywords:["arrow","words"],char:'🔜',fitzpatrick_scale:false,category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes","tick"],char:'☑ï¸',fitzpatrick_scale:false,category:"symbols"},radio_button:{keywords:["input","old","music","circle"],char:'🔘',fitzpatrick_scale:false,category:"symbols"},white_circle:{keywords:["shape","round"],char:'⚪',fitzpatrick_scale:false,category:"symbols"},black_circle:{keywords:["shape","button","round"],char:'âš«',fitzpatrick_scale:false,category:"symbols"},red_circle:{keywords:["shape","error","danger"],char:'🔴',fitzpatrick_scale:false,category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],char:'🔵',fitzpatrick_scale:false,category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],char:'🔸',fitzpatrick_scale:false,category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],char:'🔹',fitzpatrick_scale:false,category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],char:'🔶',fitzpatrick_scale:false,category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],char:'🔷',fitzpatrick_scale:false,category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],char:'🔺',fitzpatrick_scale:false,category:"symbols"},black_small_square:{keywords:["shape","icon"],char:'â–ªï¸',fitzpatrick_scale:false,category:"symbols"},white_small_square:{keywords:["shape","icon"],char:'â–«ï¸',fitzpatrick_scale:false,category:"symbols"},black_large_square:{keywords:["shape","icon","button"],char:'⬛',fitzpatrick_scale:false,category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],char:'⬜',fitzpatrick_scale:false,category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],char:'🔻',fitzpatrick_scale:false,category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],char:'â—¼ï¸',fitzpatrick_scale:false,category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],char:'â—»ï¸',fitzpatrick_scale:false,category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],char:'â—¾',fitzpatrick_scale:false,category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],char:'â—½',fitzpatrick_scale:false,category:"symbols"},black_square_button:{keywords:["shape","input","frame"],char:'🔲',fitzpatrick_scale:false,category:"symbols"},white_square_button:{keywords:["shape","input"],char:'🔳',fitzpatrick_scale:false,category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],char:'🔈',fitzpatrick_scale:false,category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],char:'🔉',fitzpatrick_scale:false,category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],char:'🔊',fitzpatrick_scale:false,category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],char:'🔇',fitzpatrick_scale:false,category:"symbols"},mega:{keywords:["sound","speaker","volume"],char:'📣',fitzpatrick_scale:false,category:"symbols"},loudspeaker:{keywords:["volume","sound"],char:'📢',fitzpatrick_scale:false,category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],char:'🔔',fitzpatrick_scale:false,category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],char:'🔕',fitzpatrick_scale:false,category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],char:'ðŸƒ',fitzpatrick_scale:false,category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],char:'🀄',fitzpatrick_scale:false,category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],char:'â™ ï¸',fitzpatrick_scale:false,category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],char:'♣ï¸',fitzpatrick_scale:false,category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],char:'♥ï¸',fitzpatrick_scale:false,category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],char:'♦ï¸',fitzpatrick_scale:false,category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],char:'🎴',fitzpatrick_scale:false,category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking","dream"],char:'💭',fitzpatrick_scale:false,category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],char:'🗯',fitzpatrick_scale:false,category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],char:'💬',fitzpatrick_scale:false,category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],char:'🗨',fitzpatrick_scale:false,category:"symbols"},clock1:{keywords:["time","late","early","schedule"],char:'ðŸ•',fitzpatrick_scale:false,category:"symbols"},clock2:{keywords:["time","late","early","schedule"],char:'🕑',fitzpatrick_scale:false,category:"symbols"},clock3:{keywords:["time","late","early","schedule"],char:'🕒',fitzpatrick_scale:false,category:"symbols"},clock4:{keywords:["time","late","early","schedule"],char:'🕓',fitzpatrick_scale:false,category:"symbols"},clock5:{keywords:["time","late","early","schedule"],char:'🕔',fitzpatrick_scale:false,category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],char:'🕕',fitzpatrick_scale:false,category:"symbols"},clock7:{keywords:["time","late","early","schedule"],char:'🕖',fitzpatrick_scale:false,category:"symbols"},clock8:{keywords:["time","late","early","schedule"],char:'🕗',fitzpatrick_scale:false,category:"symbols"},clock9:{keywords:["time","late","early","schedule"],char:'🕘',fitzpatrick_scale:false,category:"symbols"},clock10:{keywords:["time","late","early","schedule"],char:'🕙',fitzpatrick_scale:false,category:"symbols"},clock11:{keywords:["time","late","early","schedule"],char:'🕚',fitzpatrick_scale:false,category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],char:'🕛',fitzpatrick_scale:false,category:"symbols"},clock130:{keywords:["time","late","early","schedule"],char:'🕜',fitzpatrick_scale:false,category:"symbols"},clock230:{keywords:["time","late","early","schedule"],char:'ðŸ•',fitzpatrick_scale:false,category:"symbols"},clock330:{keywords:["time","late","early","schedule"],char:'🕞',fitzpatrick_scale:false,category:"symbols"},clock430:{keywords:["time","late","early","schedule"],char:'🕟',fitzpatrick_scale:false,category:"symbols"},clock530:{keywords:["time","late","early","schedule"],char:'🕠',fitzpatrick_scale:false,category:"symbols"},clock630:{keywords:["time","late","early","schedule"],char:'🕡',fitzpatrick_scale:false,category:"symbols"},clock730:{keywords:["time","late","early","schedule"],char:'🕢',fitzpatrick_scale:false,category:"symbols"},clock830:{keywords:["time","late","early","schedule"],char:'🕣',fitzpatrick_scale:false,category:"symbols"},clock930:{keywords:["time","late","early","schedule"],char:'🕤',fitzpatrick_scale:false,category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],char:'🕥',fitzpatrick_scale:false,category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],char:'🕦',fitzpatrick_scale:false,category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],char:'🕧',fitzpatrick_scale:false,category:"symbols"},afghanistan:{keywords:["af","flag","nation","country","banner"],char:'🇦🇫',fitzpatrick_scale:false,category:"flags"},aland_islands:{keywords:["Ã…land","islands","flag","nation","country","banner"],char:'🇦🇽',fitzpatrick_scale:false,category:"flags"},albania:{keywords:["al","flag","nation","country","banner"],char:'🇦🇱',fitzpatrick_scale:false,category:"flags"},algeria:{keywords:["dz","flag","nation","country","banner"],char:'🇩🇿',fitzpatrick_scale:false,category:"flags"},american_samoa:{keywords:["american","ws","flag","nation","country","banner"],char:'🇦🇸',fitzpatrick_scale:false,category:"flags"},andorra:{keywords:["ad","flag","nation","country","banner"],char:'🇦🇩',fitzpatrick_scale:false,category:"flags"},angola:{keywords:["ao","flag","nation","country","banner"],char:'🇦🇴',fitzpatrick_scale:false,category:"flags"},anguilla:{keywords:["ai","flag","nation","country","banner"],char:'🇦🇮',fitzpatrick_scale:false,category:"flags"},antarctica:{keywords:["aq","flag","nation","country","banner"],char:'🇦🇶',fitzpatrick_scale:false,category:"flags"},antigua_barbuda:{keywords:["antigua","barbuda","flag","nation","country","banner"],char:'🇦🇬',fitzpatrick_scale:false,category:"flags"},argentina:{keywords:["ar","flag","nation","country","banner"],char:'🇦🇷',fitzpatrick_scale:false,category:"flags"},armenia:{keywords:["am","flag","nation","country","banner"],char:'🇦🇲',fitzpatrick_scale:false,category:"flags"},aruba:{keywords:["aw","flag","nation","country","banner"],char:'🇦🇼',fitzpatrick_scale:false,category:"flags"},australia:{keywords:["au","flag","nation","country","banner"],char:'🇦🇺',fitzpatrick_scale:false,category:"flags"},austria:{keywords:["at","flag","nation","country","banner"],char:'🇦🇹',fitzpatrick_scale:false,category:"flags"},azerbaijan:{keywords:["az","flag","nation","country","banner"],char:'🇦🇿',fitzpatrick_scale:false,category:"flags"},bahamas:{keywords:["bs","flag","nation","country","banner"],char:'🇧🇸',fitzpatrick_scale:false,category:"flags"},bahrain:{keywords:["bh","flag","nation","country","banner"],char:'🇧🇭',fitzpatrick_scale:false,category:"flags"},bangladesh:{keywords:["bd","flag","nation","country","banner"],char:'🇧🇩',fitzpatrick_scale:false,category:"flags"},barbados:{keywords:["bb","flag","nation","country","banner"],char:'🇧🇧',fitzpatrick_scale:false,category:"flags"},belarus:{keywords:["by","flag","nation","country","banner"],char:'🇧🇾',fitzpatrick_scale:false,category:"flags"},belgium:{keywords:["be","flag","nation","country","banner"],char:'🇧🇪',fitzpatrick_scale:false,category:"flags"},belize:{keywords:["bz","flag","nation","country","banner"],char:'🇧🇿',fitzpatrick_scale:false,category:"flags"},benin:{keywords:["bj","flag","nation","country","banner"],char:'🇧🇯',fitzpatrick_scale:false,category:"flags"},bermuda:{keywords:["bm","flag","nation","country","banner"],char:'🇧🇲',fitzpatrick_scale:false,category:"flags"},bhutan:{keywords:["bt","flag","nation","country","banner"],char:'🇧🇹',fitzpatrick_scale:false,category:"flags"},bolivia:{keywords:["bo","flag","nation","country","banner"],char:'🇧🇴',fitzpatrick_scale:false,category:"flags"},caribbean_netherlands:{keywords:["bonaire","flag","nation","country","banner"],char:'🇧🇶',fitzpatrick_scale:false,category:"flags"},bosnia_herzegovina:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],char:'🇧🇦',fitzpatrick_scale:false,category:"flags"},botswana:{keywords:["bw","flag","nation","country","banner"],char:'🇧🇼',fitzpatrick_scale:false,category:"flags"},brazil:{keywords:["br","flag","nation","country","banner"],char:'🇧🇷',fitzpatrick_scale:false,category:"flags"},british_indian_ocean_territory:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],char:'🇮🇴',fitzpatrick_scale:false,category:"flags"},british_virgin_islands:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],char:'🇻🇬',fitzpatrick_scale:false,category:"flags"},brunei:{keywords:["bn","darussalam","flag","nation","country","banner"],char:'🇧🇳',fitzpatrick_scale:false,category:"flags"},bulgaria:{keywords:["bg","flag","nation","country","banner"],char:'🇧🇬',fitzpatrick_scale:false,category:"flags"},burkina_faso:{keywords:["burkina","faso","flag","nation","country","banner"],char:'🇧🇫',fitzpatrick_scale:false,category:"flags"},burundi:{keywords:["bi","flag","nation","country","banner"],char:'🇧🇮',fitzpatrick_scale:false,category:"flags"},cape_verde:{keywords:["cabo","verde","flag","nation","country","banner"],char:'🇨🇻',fitzpatrick_scale:false,category:"flags"},cambodia:{keywords:["kh","flag","nation","country","banner"],char:'🇰🇭',fitzpatrick_scale:false,category:"flags"},cameroon:{keywords:["cm","flag","nation","country","banner"],char:'🇨🇲',fitzpatrick_scale:false,category:"flags"},canada:{keywords:["ca","flag","nation","country","banner"],char:'🇨🇦',fitzpatrick_scale:false,category:"flags"},canary_islands:{keywords:["canary","islands","flag","nation","country","banner"],char:'🇮🇨',fitzpatrick_scale:false,category:"flags"},cayman_islands:{keywords:["cayman","islands","flag","nation","country","banner"],char:'🇰🇾',fitzpatrick_scale:false,category:"flags"},central_african_republic:{keywords:["central","african","republic","flag","nation","country","banner"],char:'🇨🇫',fitzpatrick_scale:false,category:"flags"},chad:{keywords:["td","flag","nation","country","banner"],char:'🇹🇩',fitzpatrick_scale:false,category:"flags"},chile:{keywords:["flag","nation","country","banner"],char:'🇨🇱',fitzpatrick_scale:false,category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],char:'🇨🇳',fitzpatrick_scale:false,category:"flags"},christmas_island:{keywords:["christmas","island","flag","nation","country","banner"],char:'🇨🇽',fitzpatrick_scale:false,category:"flags"},cocos_islands:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],char:'🇨🇨',fitzpatrick_scale:false,category:"flags"},colombia:{keywords:["co","flag","nation","country","banner"],char:'🇨🇴',fitzpatrick_scale:false,category:"flags"},comoros:{keywords:["km","flag","nation","country","banner"],char:'🇰🇲',fitzpatrick_scale:false,category:"flags"},congo_brazzaville:{keywords:["congo","flag","nation","country","banner"],char:'🇨🇬',fitzpatrick_scale:false,category:"flags"},congo_kinshasa:{keywords:["congo","democratic","republic","flag","nation","country","banner"],char:'🇨🇩',fitzpatrick_scale:false,category:"flags"},cook_islands:{keywords:["cook","islands","flag","nation","country","banner"],char:'🇨🇰',fitzpatrick_scale:false,category:"flags"},costa_rica:{keywords:["costa","rica","flag","nation","country","banner"],char:'🇨🇷',fitzpatrick_scale:false,category:"flags"},croatia:{keywords:["hr","flag","nation","country","banner"],char:'🇭🇷',fitzpatrick_scale:false,category:"flags"},cuba:{keywords:["cu","flag","nation","country","banner"],char:'🇨🇺',fitzpatrick_scale:false,category:"flags"},curacao:{keywords:["curaçao","flag","nation","country","banner"],char:'🇨🇼',fitzpatrick_scale:false,category:"flags"},cyprus:{keywords:["cy","flag","nation","country","banner"],char:'🇨🇾',fitzpatrick_scale:false,category:"flags"},czech_republic:{keywords:["cz","flag","nation","country","banner"],char:'🇨🇿',fitzpatrick_scale:false,category:"flags"},denmark:{keywords:["dk","flag","nation","country","banner"],char:'🇩🇰',fitzpatrick_scale:false,category:"flags"},djibouti:{keywords:["dj","flag","nation","country","banner"],char:'🇩🇯',fitzpatrick_scale:false,category:"flags"},dominica:{keywords:["dm","flag","nation","country","banner"],char:'🇩🇲',fitzpatrick_scale:false,category:"flags"},dominican_republic:{keywords:["dominican","republic","flag","nation","country","banner"],char:'🇩🇴',fitzpatrick_scale:false,category:"flags"},ecuador:{keywords:["ec","flag","nation","country","banner"],char:'🇪🇨',fitzpatrick_scale:false,category:"flags"},egypt:{keywords:["eg","flag","nation","country","banner"],char:'🇪🇬',fitzpatrick_scale:false,category:"flags"},el_salvador:{keywords:["el","salvador","flag","nation","country","banner"],char:'🇸🇻',fitzpatrick_scale:false,category:"flags"},equatorial_guinea:{keywords:["equatorial","gn","flag","nation","country","banner"],char:'🇬🇶',fitzpatrick_scale:false,category:"flags"},eritrea:{keywords:["er","flag","nation","country","banner"],char:'🇪🇷',fitzpatrick_scale:false,category:"flags"},estonia:{keywords:["ee","flag","nation","country","banner"],char:'🇪🇪',fitzpatrick_scale:false,category:"flags"},ethiopia:{keywords:["et","flag","nation","country","banner"],char:'🇪🇹',fitzpatrick_scale:false,category:"flags"},eu:{keywords:["european","union","flag","banner"],char:'🇪🇺',fitzpatrick_scale:false,category:"flags"},falkland_islands:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],char:'🇫🇰',fitzpatrick_scale:false,category:"flags"},faroe_islands:{keywords:["faroe","islands","flag","nation","country","banner"],char:'🇫🇴',fitzpatrick_scale:false,category:"flags"},fiji:{keywords:["fj","flag","nation","country","banner"],char:'🇫🇯',fitzpatrick_scale:false,category:"flags"},finland:{keywords:["fi","flag","nation","country","banner"],char:'🇫🇮',fitzpatrick_scale:false,category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],char:'🇫🇷',fitzpatrick_scale:false,category:"flags"},french_guiana:{keywords:["french","guiana","flag","nation","country","banner"],char:'🇬🇫',fitzpatrick_scale:false,category:"flags"},french_polynesia:{keywords:["french","polynesia","flag","nation","country","banner"],char:'🇵🇫',fitzpatrick_scale:false,category:"flags"},french_southern_territories:{keywords:["french","southern","territories","flag","nation","country","banner"],char:'🇹🇫',fitzpatrick_scale:false,category:"flags"},gabon:{keywords:["ga","flag","nation","country","banner"],char:'🇬🇦',fitzpatrick_scale:false,category:"flags"},gambia:{keywords:["gm","flag","nation","country","banner"],char:'🇬🇲',fitzpatrick_scale:false,category:"flags"},georgia:{keywords:["ge","flag","nation","country","banner"],char:'🇬🇪',fitzpatrick_scale:false,category:"flags"},de:{keywords:["german","nation","flag","country","banner"],char:'🇩🇪',fitzpatrick_scale:false,category:"flags"},ghana:{keywords:["gh","flag","nation","country","banner"],char:'🇬🇭',fitzpatrick_scale:false,category:"flags"},gibraltar:{keywords:["gi","flag","nation","country","banner"],char:'🇬🇮',fitzpatrick_scale:false,category:"flags"},greece:{keywords:["gr","flag","nation","country","banner"],char:'🇬🇷',fitzpatrick_scale:false,category:"flags"},greenland:{keywords:["gl","flag","nation","country","banner"],char:'🇬🇱',fitzpatrick_scale:false,category:"flags"},grenada:{keywords:["gd","flag","nation","country","banner"],char:'🇬🇩',fitzpatrick_scale:false,category:"flags"},guadeloupe:{keywords:["gp","flag","nation","country","banner"],char:'🇬🇵',fitzpatrick_scale:false,category:"flags"},guam:{keywords:["gu","flag","nation","country","banner"],char:'🇬🇺',fitzpatrick_scale:false,category:"flags"},guatemala:{keywords:["gt","flag","nation","country","banner"],char:'🇬🇹',fitzpatrick_scale:false,category:"flags"},guernsey:{keywords:["gg","flag","nation","country","banner"],char:'🇬🇬',fitzpatrick_scale:false,category:"flags"},guinea:{keywords:["gn","flag","nation","country","banner"],char:'🇬🇳',fitzpatrick_scale:false,category:"flags"},guinea_bissau:{keywords:["gw","bissau","flag","nation","country","banner"],char:'🇬🇼',fitzpatrick_scale:false,category:"flags"},guyana:{keywords:["gy","flag","nation","country","banner"],char:'🇬🇾',fitzpatrick_scale:false,category:"flags"},haiti:{keywords:["ht","flag","nation","country","banner"],char:'🇭🇹',fitzpatrick_scale:false,category:"flags"},honduras:{keywords:["hn","flag","nation","country","banner"],char:'🇭🇳',fitzpatrick_scale:false,category:"flags"},hong_kong:{keywords:["hong","kong","flag","nation","country","banner"],char:'🇭🇰',fitzpatrick_scale:false,category:"flags"},hungary:{keywords:["hu","flag","nation","country","banner"],char:'🇭🇺',fitzpatrick_scale:false,category:"flags"},iceland:{keywords:["is","flag","nation","country","banner"],char:'🇮🇸',fitzpatrick_scale:false,category:"flags"},india:{keywords:["in","flag","nation","country","banner"],char:'🇮🇳',fitzpatrick_scale:false,category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],char:'🇮🇩',fitzpatrick_scale:false,category:"flags"},iran:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],char:'🇮🇷',fitzpatrick_scale:false,category:"flags"},iraq:{keywords:["iq","flag","nation","country","banner"],char:'🇮🇶',fitzpatrick_scale:false,category:"flags"},ireland:{keywords:["ie","flag","nation","country","banner"],char:'🇮🇪',fitzpatrick_scale:false,category:"flags"},isle_of_man:{keywords:["isle","man","flag","nation","country","banner"],char:'🇮🇲',fitzpatrick_scale:false,category:"flags"},israel:{keywords:["il","flag","nation","country","banner"],char:'🇮🇱',fitzpatrick_scale:false,category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],char:'🇮🇹',fitzpatrick_scale:false,category:"flags"},cote_divoire:{keywords:["ivory","coast","flag","nation","country","banner"],char:'🇨🇮',fitzpatrick_scale:false,category:"flags"},jamaica:{keywords:["jm","flag","nation","country","banner"],char:'🇯🇲',fitzpatrick_scale:false,category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],char:'🇯🇵',fitzpatrick_scale:false,category:"flags"},jersey:{keywords:["je","flag","nation","country","banner"],char:'🇯🇪',fitzpatrick_scale:false,category:"flags"},jordan:{keywords:["jo","flag","nation","country","banner"],char:'🇯🇴',fitzpatrick_scale:false,category:"flags"},kazakhstan:{keywords:["kz","flag","nation","country","banner"],char:'🇰🇿',fitzpatrick_scale:false,category:"flags"},kenya:{keywords:["ke","flag","nation","country","banner"],char:'🇰🇪',fitzpatrick_scale:false,category:"flags"},kiribati:{keywords:["ki","flag","nation","country","banner"],char:'🇰🇮',fitzpatrick_scale:false,category:"flags"},kosovo:{keywords:["xk","flag","nation","country","banner"],char:'🇽🇰',fitzpatrick_scale:false,category:"flags"},kuwait:{keywords:["kw","flag","nation","country","banner"],char:'🇰🇼',fitzpatrick_scale:false,category:"flags"},kyrgyzstan:{keywords:["kg","flag","nation","country","banner"],char:'🇰🇬',fitzpatrick_scale:false,category:"flags"},laos:{keywords:["lao","democratic","republic","flag","nation","country","banner"],char:'🇱🇦',fitzpatrick_scale:false,category:"flags"},latvia:{keywords:["lv","flag","nation","country","banner"],char:'🇱🇻',fitzpatrick_scale:false,category:"flags"},lebanon:{keywords:["lb","flag","nation","country","banner"],char:'🇱🇧',fitzpatrick_scale:false,category:"flags"},lesotho:{keywords:["ls","flag","nation","country","banner"],char:'🇱🇸',fitzpatrick_scale:false,category:"flags"},liberia:{keywords:["lr","flag","nation","country","banner"],char:'🇱🇷',fitzpatrick_scale:false,category:"flags"},libya:{keywords:["ly","flag","nation","country","banner"],char:'🇱🇾',fitzpatrick_scale:false,category:"flags"},liechtenstein:{keywords:["li","flag","nation","country","banner"],char:'🇱🇮',fitzpatrick_scale:false,category:"flags"},lithuania:{keywords:["lt","flag","nation","country","banner"],char:'🇱🇹',fitzpatrick_scale:false,category:"flags"},luxembourg:{keywords:["lu","flag","nation","country","banner"],char:'🇱🇺',fitzpatrick_scale:false,category:"flags"},macau:{keywords:["macao","flag","nation","country","banner"],char:'🇲🇴',fitzpatrick_scale:false,category:"flags"},macedonia:{keywords:["macedonia,","flag","nation","country","banner"],char:'🇲🇰',fitzpatrick_scale:false,category:"flags"},madagascar:{keywords:["mg","flag","nation","country","banner"],char:'🇲🇬',fitzpatrick_scale:false,category:"flags"},malawi:{keywords:["mw","flag","nation","country","banner"],char:'🇲🇼',fitzpatrick_scale:false,category:"flags"},malaysia:{keywords:["my","flag","nation","country","banner"],char:'🇲🇾',fitzpatrick_scale:false,category:"flags"},maldives:{keywords:["mv","flag","nation","country","banner"],char:'🇲🇻',fitzpatrick_scale:false,category:"flags"},mali:{keywords:["ml","flag","nation","country","banner"],char:'🇲🇱',fitzpatrick_scale:false,category:"flags"},malta:{keywords:["mt","flag","nation","country","banner"],char:'🇲🇹',fitzpatrick_scale:false,category:"flags"},marshall_islands:{keywords:["marshall","islands","flag","nation","country","banner"],char:'🇲🇭',fitzpatrick_scale:false,category:"flags"},martinique:{keywords:["mq","flag","nation","country","banner"],char:'🇲🇶',fitzpatrick_scale:false,category:"flags"},mauritania:{keywords:["mr","flag","nation","country","banner"],char:'🇲🇷',fitzpatrick_scale:false,category:"flags"},mauritius:{keywords:["mu","flag","nation","country","banner"],char:'🇲🇺',fitzpatrick_scale:false,category:"flags"},mayotte:{keywords:["yt","flag","nation","country","banner"],char:'🇾🇹',fitzpatrick_scale:false,category:"flags"},mexico:{keywords:["mx","flag","nation","country","banner"],char:'🇲🇽',fitzpatrick_scale:false,category:"flags"},micronesia:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],char:'🇫🇲',fitzpatrick_scale:false,category:"flags"},moldova:{keywords:["moldova,","republic","flag","nation","country","banner"],char:'🇲🇩',fitzpatrick_scale:false,category:"flags"},monaco:{keywords:["mc","flag","nation","country","banner"],char:'🇲🇨',fitzpatrick_scale:false,category:"flags"},mongolia:{keywords:["mn","flag","nation","country","banner"],char:'🇲🇳',fitzpatrick_scale:false,category:"flags"},montenegro:{keywords:["me","flag","nation","country","banner"],char:'🇲🇪',fitzpatrick_scale:false,category:"flags"},montserrat:{keywords:["ms","flag","nation","country","banner"],char:'🇲🇸',fitzpatrick_scale:false,category:"flags"},morocco:{keywords:["ma","flag","nation","country","banner"],char:'🇲🇦',fitzpatrick_scale:false,category:"flags"},mozambique:{keywords:["mz","flag","nation","country","banner"],char:'🇲🇿',fitzpatrick_scale:false,category:"flags"},myanmar:{keywords:["mm","flag","nation","country","banner"],char:'🇲🇲',fitzpatrick_scale:false,category:"flags"},namibia:{keywords:["na","flag","nation","country","banner"],char:'🇳🇦',fitzpatrick_scale:false,category:"flags"},nauru:{keywords:["nr","flag","nation","country","banner"],char:'🇳🇷',fitzpatrick_scale:false,category:"flags"},nepal:{keywords:["np","flag","nation","country","banner"],char:'🇳🇵',fitzpatrick_scale:false,category:"flags"},netherlands:{keywords:["nl","flag","nation","country","banner"],char:'🇳🇱',fitzpatrick_scale:false,category:"flags"},new_caledonia:{keywords:["new","caledonia","flag","nation","country","banner"],char:'🇳🇨',fitzpatrick_scale:false,category:"flags"},new_zealand:{keywords:["new","zealand","flag","nation","country","banner"],char:'🇳🇿',fitzpatrick_scale:false,category:"flags"},nicaragua:{keywords:["ni","flag","nation","country","banner"],char:'🇳🇮',fitzpatrick_scale:false,category:"flags"},niger:{keywords:["ne","flag","nation","country","banner"],char:'🇳🇪',fitzpatrick_scale:false,category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],char:'🇳🇬',fitzpatrick_scale:false,category:"flags"},niue:{keywords:["nu","flag","nation","country","banner"],char:'🇳🇺',fitzpatrick_scale:false,category:"flags"},norfolk_island:{keywords:["norfolk","island","flag","nation","country","banner"],char:'🇳🇫',fitzpatrick_scale:false,category:"flags"},northern_mariana_islands:{keywords:["northern","mariana","islands","flag","nation","country","banner"],char:'🇲🇵',fitzpatrick_scale:false,category:"flags"},north_korea:{keywords:["north","korea","nation","flag","country","banner"],char:'🇰🇵',fitzpatrick_scale:false,category:"flags"},norway:{keywords:["no","flag","nation","country","banner"],char:'🇳🇴',fitzpatrick_scale:false,category:"flags"},oman:{keywords:["om_symbol","flag","nation","country","banner"],char:'🇴🇲',fitzpatrick_scale:false,category:"flags"},pakistan:{keywords:["pk","flag","nation","country","banner"],char:'🇵🇰',fitzpatrick_scale:false,category:"flags"},palau:{keywords:["pw","flag","nation","country","banner"],char:'🇵🇼',fitzpatrick_scale:false,category:"flags"},palestinian_territories:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],char:'🇵🇸',fitzpatrick_scale:false,category:"flags"},panama:{keywords:["pa","flag","nation","country","banner"],char:'🇵🇦',fitzpatrick_scale:false,category:"flags"},papua_new_guinea:{keywords:["papua","new","guinea","flag","nation","country","banner"],char:'🇵🇬',fitzpatrick_scale:false,category:"flags"},paraguay:{keywords:["py","flag","nation","country","banner"],char:'🇵🇾',fitzpatrick_scale:false,category:"flags"},peru:{keywords:["pe","flag","nation","country","banner"],char:'🇵🇪',fitzpatrick_scale:false,category:"flags"},philippines:{keywords:["ph","flag","nation","country","banner"],char:'🇵🇭',fitzpatrick_scale:false,category:"flags"},pitcairn_islands:{keywords:["pitcairn","flag","nation","country","banner"],char:'🇵🇳',fitzpatrick_scale:false,category:"flags"},poland:{keywords:["pl","flag","nation","country","banner"],char:'🇵🇱',fitzpatrick_scale:false,category:"flags"},portugal:{keywords:["pt","flag","nation","country","banner"],char:'🇵🇹',fitzpatrick_scale:false,category:"flags"},puerto_rico:{keywords:["puerto","rico","flag","nation","country","banner"],char:'🇵🇷',fitzpatrick_scale:false,category:"flags"},qatar:{keywords:["qa","flag","nation","country","banner"],char:'🇶🇦',fitzpatrick_scale:false,category:"flags"},reunion:{keywords:["réunion","flag","nation","country","banner"],char:'🇷🇪',fitzpatrick_scale:false,category:"flags"},romania:{keywords:["ro","flag","nation","country","banner"],char:'🇷🇴',fitzpatrick_scale:false,category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],char:'🇷🇺',fitzpatrick_scale:false,category:"flags"},rwanda:{keywords:["rw","flag","nation","country","banner"],char:'🇷🇼',fitzpatrick_scale:false,category:"flags"},st_barthelemy:{keywords:["saint","barthélemy","flag","nation","country","banner"],char:'🇧🇱',fitzpatrick_scale:false,category:"flags"},st_helena:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],char:'🇸🇭',fitzpatrick_scale:false,category:"flags"},st_kitts_nevis:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],char:'🇰🇳',fitzpatrick_scale:false,category:"flags"},st_lucia:{keywords:["saint","lucia","flag","nation","country","banner"],char:'🇱🇨',fitzpatrick_scale:false,category:"flags"},st_pierre_miquelon:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],char:'🇵🇲',fitzpatrick_scale:false,category:"flags"},st_vincent_grenadines:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],char:'🇻🇨',fitzpatrick_scale:false,category:"flags"},samoa:{keywords:["ws","flag","nation","country","banner"],char:'🇼🇸',fitzpatrick_scale:false,category:"flags"},san_marino:{keywords:["san","marino","flag","nation","country","banner"],char:'🇸🇲',fitzpatrick_scale:false,category:"flags"},sao_tome_principe:{keywords:["sao","tome","principe","flag","nation","country","banner"],char:'🇸🇹',fitzpatrick_scale:false,category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],char:'🇸🇦',fitzpatrick_scale:false,category:"flags"},senegal:{keywords:["sn","flag","nation","country","banner"],char:'🇸🇳',fitzpatrick_scale:false,category:"flags"},serbia:{keywords:["rs","flag","nation","country","banner"],char:'🇷🇸',fitzpatrick_scale:false,category:"flags"},seychelles:{keywords:["sc","flag","nation","country","banner"],char:'🇸🇨',fitzpatrick_scale:false,category:"flags"},sierra_leone:{keywords:["sierra","leone","flag","nation","country","banner"],char:'🇸🇱',fitzpatrick_scale:false,category:"flags"},singapore:{keywords:["sg","flag","nation","country","banner"],char:'🇸🇬',fitzpatrick_scale:false,category:"flags"},sint_maarten:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],char:'🇸🇽',fitzpatrick_scale:false,category:"flags"},slovakia:{keywords:["sk","flag","nation","country","banner"],char:'🇸🇰',fitzpatrick_scale:false,category:"flags"},slovenia:{keywords:["si","flag","nation","country","banner"],char:'🇸🇮',fitzpatrick_scale:false,category:"flags"},solomon_islands:{keywords:["solomon","islands","flag","nation","country","banner"],char:'🇸🇧',fitzpatrick_scale:false,category:"flags"},somalia:{keywords:["so","flag","nation","country","banner"],char:'🇸🇴',fitzpatrick_scale:false,category:"flags"},south_africa:{keywords:["south","africa","flag","nation","country","banner"],char:'🇿🇦',fitzpatrick_scale:false,category:"flags"},south_georgia_south_sandwich_islands:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],char:'🇬🇸',fitzpatrick_scale:false,category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],char:'🇰🇷',fitzpatrick_scale:false,category:"flags"},south_sudan:{keywords:["south","sd","flag","nation","country","banner"],char:'🇸🇸',fitzpatrick_scale:false,category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],char:'🇪🇸',fitzpatrick_scale:false,category:"flags"},sri_lanka:{keywords:["sri","lanka","flag","nation","country","banner"],char:'🇱🇰',fitzpatrick_scale:false,category:"flags"},sudan:{keywords:["sd","flag","nation","country","banner"],char:'🇸🇩',fitzpatrick_scale:false,category:"flags"},suriname:{keywords:["sr","flag","nation","country","banner"],char:'🇸🇷',fitzpatrick_scale:false,category:"flags"},swaziland:{keywords:["sz","flag","nation","country","banner"],char:'🇸🇿',fitzpatrick_scale:false,category:"flags"},sweden:{keywords:["se","flag","nation","country","banner"],char:'🇸🇪',fitzpatrick_scale:false,category:"flags"},switzerland:{keywords:["ch","flag","nation","country","banner"],char:'🇨🇭',fitzpatrick_scale:false,category:"flags"},syria:{keywords:["syrian","arab","republic","flag","nation","country","banner"],char:'🇸🇾',fitzpatrick_scale:false,category:"flags"},taiwan:{keywords:["tw","flag","nation","country","banner"],char:'🇹🇼',fitzpatrick_scale:false,category:"flags"},tajikistan:{keywords:["tj","flag","nation","country","banner"],char:'🇹🇯',fitzpatrick_scale:false,category:"flags"},tanzania:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],char:'🇹🇿',fitzpatrick_scale:false,category:"flags"},thailand:{keywords:["th","flag","nation","country","banner"],char:'🇹🇭',fitzpatrick_scale:false,category:"flags"},timor_leste:{keywords:["timor","leste","flag","nation","country","banner"],char:'🇹🇱',fitzpatrick_scale:false,category:"flags"},togo:{keywords:["tg","flag","nation","country","banner"],char:'🇹🇬',fitzpatrick_scale:false,category:"flags"},tokelau:{keywords:["tk","flag","nation","country","banner"],char:'🇹🇰',fitzpatrick_scale:false,category:"flags"},tonga:{keywords:["to","flag","nation","country","banner"],char:'🇹🇴',fitzpatrick_scale:false,category:"flags"},trinidad_tobago:{keywords:["trinidad","tobago","flag","nation","country","banner"],char:'🇹🇹',fitzpatrick_scale:false,category:"flags"},tunisia:{keywords:["tn","flag","nation","country","banner"],char:'🇹🇳',fitzpatrick_scale:false,category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],char:'🇹🇷',fitzpatrick_scale:false,category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],char:'🇹🇲',fitzpatrick_scale:false,category:"flags"},turks_caicos_islands:{keywords:["turks","caicos","islands","flag","nation","country","banner"],char:'🇹🇨',fitzpatrick_scale:false,category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],char:'🇹🇻',fitzpatrick_scale:false,category:"flags"},uganda:{keywords:["ug","flag","nation","country","banner"],char:'🇺🇬',fitzpatrick_scale:false,category:"flags"},ukraine:{keywords:["ua","flag","nation","country","banner"],char:'🇺🇦',fitzpatrick_scale:false,category:"flags"},united_arab_emirates:{keywords:["united","arab","emirates","flag","nation","country","banner"],char:'🇦🇪',fitzpatrick_scale:false,category:"flags"},uk:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],char:'🇬🇧',fitzpatrick_scale:false,category:"flags"},england:{keywords:["flag","english"],char:'ðŸ´ó §ó ¢ó ¥ó ®ó §ó ¿',fitzpatrick_scale:false,category:"flags"},scotland:{keywords:["flag","scottish"],char:'ðŸ´ó §ó ¢ó ³ó £ó ´ó ¿',fitzpatrick_scale:false,category:"flags"},wales:{keywords:["flag","welsh"],char:'ðŸ´ó §ó ¢ó ·ó ¬ó ³ó ¿',fitzpatrick_scale:false,category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],char:'🇺🇸',fitzpatrick_scale:false,category:"flags"},us_virgin_islands:{keywords:["virgin","islands","us","flag","nation","country","banner"],char:'🇻🇮',fitzpatrick_scale:false,category:"flags"},uruguay:{keywords:["uy","flag","nation","country","banner"],char:'🇺🇾',fitzpatrick_scale:false,category:"flags"},uzbekistan:{keywords:["uz","flag","nation","country","banner"],char:'🇺🇿',fitzpatrick_scale:false,category:"flags"},vanuatu:{keywords:["vu","flag","nation","country","banner"],char:'🇻🇺',fitzpatrick_scale:false,category:"flags"},vatican_city:{keywords:["vatican","city","flag","nation","country","banner"],char:'🇻🇦',fitzpatrick_scale:false,category:"flags"},venezuela:{keywords:["ve","bolivarian","republic","flag","nation","country","banner"],char:'🇻🇪',fitzpatrick_scale:false,category:"flags"},vietnam:{keywords:["viet","nam","flag","nation","country","banner"],char:'🇻🇳',fitzpatrick_scale:false,category:"flags"},wallis_futuna:{keywords:["wallis","futuna","flag","nation","country","banner"],char:'🇼🇫',fitzpatrick_scale:false,category:"flags"},western_sahara:{keywords:["western","sahara","flag","nation","country","banner"],char:'🇪🇭',fitzpatrick_scale:false,category:"flags"},yemen:{keywords:["ye","flag","nation","country","banner"],char:'🇾🇪',fitzpatrick_scale:false,category:"flags"},zambia:{keywords:["zm","flag","nation","country","banner"],char:'🇿🇲',fitzpatrick_scale:false,category:"flags"},zimbabwe:{keywords:["zw","flag","nation","country","banner"],char:'🇿🇼',fitzpatrick_scale:false,category:"flags"},united_nations:{keywords:["un","flag","banner"],char:'🇺🇳',fitzpatrick_scale:false,category:"flags"},pirate_flag:{keywords:["skull","crossbones","flag","banner"],char:'ðŸ´â€â˜ ï¸',fitzpatrick_scale:false,category:"flags"}}); \ No newline at end of file diff --git a/static/js/tinymce/plugins/emoticons/js/emojiimages.min.js b/static/js/tinymce/plugins/emoticons/js/emojiimages.min.js new file mode 100644 index 0000000..37f3bcf --- /dev/null +++ b/static/js/tinymce/plugins/emoticons/js/emojiimages.min.js @@ -0,0 +1,3 @@ +// Source: npm package: emojilib +// Images provided by twemoji: https://github.com/twitter/twemoji +window.tinymce.Resource.add("tinymce.plugins.emoticons",{100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],char:'\u{1f4af}',fitzpatrick_scale:!1,category:"symbols"},1234:{keywords:["numbers","blue-square"],char:'\u{1f522}',fitzpatrick_scale:!1,category:"symbols"},grinning:{keywords:["face","smile","happy","joy",":D","grin"],char:'\u{1f600}',fitzpatrick_scale:!1,category:"people"},grimacing:{keywords:["face","grimace","teeth"],char:'\u{1f62c}',fitzpatrick_scale:!1,category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],char:'\u{1f601}',fitzpatrick_scale:!1,category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],char:'\u{1f602}',fitzpatrick_scale:!1,category:"people"},rofl:{keywords:["face","rolling","floor","laughing","lol","haha"],char:'\u{1f923}',fitzpatrick_scale:!1,category:"people"},partying:{keywords:["face","celebration","woohoo"],char:'\u{1f973}',fitzpatrick_scale:!1,category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],char:'\u{1f603}',fitzpatrick_scale:!1,category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],char:'\u{1f604}',fitzpatrick_scale:!1,category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],char:'\u{1f605}',fitzpatrick_scale:!1,category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],char:'\u{1f606}',fitzpatrick_scale:!1,category:"people"},innocent:{keywords:["face","angel","heaven","halo"],char:'\u{1f607}',fitzpatrick_scale:!1,category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile","eye"],char:'\u{1f609}',fitzpatrick_scale:!1,category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],char:'\u{1f60a}',fitzpatrick_scale:!1,category:"people"},slightly_smiling_face:{keywords:["face","smile"],char:'\u{1f642}',fitzpatrick_scale:!1,category:"people"},upside_down_face:{keywords:["face","flipped","silly","smile"],char:'\u{1f643}',fitzpatrick_scale:!1,category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],char:'\u263a\ufe0f',fitzpatrick_scale:!1,category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"],char:'\u{1f60b}',fitzpatrick_scale:!1,category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],char:'\u{1f60c}',fitzpatrick_scale:!1,category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],char:'\u{1f60d}',fitzpatrick_scale:!1,category:"people"},smiling_face_with_three_hearts:{keywords:["face","love","like","affection","valentines","infatuation","crush","hearts","adore"],char:'\u{1f970}',fitzpatrick_scale:!1,category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:'\u{1f618}',fitzpatrick_scale:!1,category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],char:'\u{1f617}',fitzpatrick_scale:!1,category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],char:'\u{1f619}',fitzpatrick_scale:!1,category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:'\u{1f61a}',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],char:'\u{1f61c}',fitzpatrick_scale:!1,category:"people"},zany:{keywords:["face","goofy","crazy"],char:'\u{1f92a}',fitzpatrick_scale:!1,category:"people"},raised_eyebrow:{keywords:["face","distrust","scepticism","disapproval","disbelief","surprise"],char:'\u{1f928}',fitzpatrick_scale:!1,category:"people"},monocle:{keywords:["face","stuffy","wealthy"],char:'\u{1f9d0}',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],char:'\u{1f61d}',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],char:'\u{1f61b}',fitzpatrick_scale:!1,category:"people"},money_mouth_face:{keywords:["face","rich","dollar","money"],char:'\u{1f911}',fitzpatrick_scale:!1,category:"people"},nerd_face:{keywords:["face","nerdy","geek","dork"],char:'\u{1f913}',fitzpatrick_scale:!1,category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],char:'\u{1f60e}',fitzpatrick_scale:!1,category:"people"},star_struck:{keywords:["face","smile","starry","eyes","grinning"],char:'\u{1f929}',fitzpatrick_scale:!1,category:"people"},clown_face:{keywords:["face"],char:'\u{1f921}',fitzpatrick_scale:!1,category:"people"},cowboy_hat_face:{keywords:["face","cowgirl","hat"],char:'\u{1f920}',fitzpatrick_scale:!1,category:"people"},hugs:{keywords:["face","smile","hug"],char:'\u{1f917}',fitzpatrick_scale:!1,category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],char:'\u{1f60f}',fitzpatrick_scale:!1,category:"people"},no_mouth:{keywords:["face","hellokitty"],char:'\u{1f636}',fitzpatrick_scale:!1,category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],char:'\u{1f610}',fitzpatrick_scale:!1,category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],char:'\u{1f611}',fitzpatrick_scale:!1,category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"],char:'\u{1f612}',fitzpatrick_scale:!1,category:"people"},roll_eyes:{keywords:["face","eyeroll","frustrated"],char:'\u{1f644}',fitzpatrick_scale:!1,category:"people"},thinking:{keywords:["face","hmmm","think","consider"],char:'\u{1f914}',fitzpatrick_scale:!1,category:"people"},lying_face:{keywords:["face","lie","pinocchio"],char:'\u{1f925}',fitzpatrick_scale:!1,category:"people"},hand_over_mouth:{keywords:["face","whoops","shock","surprise"],char:'\u{1f92d}',fitzpatrick_scale:!1,category:"people"},shushing:{keywords:["face","quiet","shhh"],char:'\u{1f92b}',fitzpatrick_scale:!1,category:"people"},symbols_over_mouth:{keywords:["face","swearing","cursing","cussing","profanity","expletive"],char:'\u{1f92c}',fitzpatrick_scale:!1,category:"people"},exploding_head:{keywords:["face","shocked","mind","blown"],char:'\u{1f92f}',fitzpatrick_scale:!1,category:"people"},flushed:{keywords:["face","blush","shy","flattered"],char:'\u{1f633}',fitzpatrick_scale:!1,category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],char:'\u{1f61e}',fitzpatrick_scale:!1,category:"people"},worried:{keywords:["face","concern","nervous",":("],char:'\u{1f61f}',fitzpatrick_scale:!1,category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],char:'\u{1f620}',fitzpatrick_scale:!1,category:"people"},rage:{keywords:["angry","mad","hate","despise"],char:'\u{1f621}',fitzpatrick_scale:!1,category:"people"},pensive:{keywords:["face","sad","depressed","upset"],char:'\u{1f614}',fitzpatrick_scale:!1,category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],char:'\u{1f615}',fitzpatrick_scale:!1,category:"people"},slightly_frowning_face:{keywords:["face","frowning","disappointed","sad","upset"],char:'\u{1f641}',fitzpatrick_scale:!1,category:"people"},frowning_face:{keywords:["face","sad","upset","frown"],char:'\u2639',fitzpatrick_scale:!1,category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],char:'\u{1f623}',fitzpatrick_scale:!1,category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],char:'\u{1f616}',fitzpatrick_scale:!1,category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],char:'\u{1f62b}',fitzpatrick_scale:!1,category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],char:'\u{1f629}',fitzpatrick_scale:!1,category:"people"},pleading:{keywords:["face","begging","mercy"],char:'\u{1f97a}',fitzpatrick_scale:!1,category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],char:'\u{1f624}',fitzpatrick_scale:!1,category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],char:'\u{1f62e}',fitzpatrick_scale:!1,category:"people"},scream:{keywords:["face","munch","scared","omg"],char:'\u{1f631}',fitzpatrick_scale:!1,category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],char:'\u{1f628}',fitzpatrick_scale:!1,category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],char:'\u{1f630}',fitzpatrick_scale:!1,category:"people"},hushed:{keywords:["face","woo","shh"],char:'\u{1f62f}',fitzpatrick_scale:!1,category:"people"},frowning:{keywords:["face","aw","what"],char:'\u{1f626}',fitzpatrick_scale:!1,category:"people"},anguished:{keywords:["face","stunned","nervous"],char:'\u{1f627}',fitzpatrick_scale:!1,category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],char:'\u{1f622}',fitzpatrick_scale:!1,category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],char:'\u{1f625}',fitzpatrick_scale:!1,category:"people"},drooling_face:{keywords:["face"],char:'\u{1f924}',fitzpatrick_scale:!1,category:"people"},sleepy:{keywords:["face","tired","rest","nap"],char:'\u{1f62a}',fitzpatrick_scale:!1,category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],char:'\u{1f613}',fitzpatrick_scale:!1,category:"people"},hot:{keywords:["face","feverish","heat","red","sweating"],char:'\u{1f975}',fitzpatrick_scale:!1,category:"people"},cold:{keywords:["face","blue","freezing","frozen","frostbite","icicles"],char:'\u{1f976}',fitzpatrick_scale:!1,category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],char:'\u{1f62d}',fitzpatrick_scale:!1,category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],char:'\u{1f635}',fitzpatrick_scale:!1,category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],char:'\u{1f632}',fitzpatrick_scale:!1,category:"people"},zipper_mouth_face:{keywords:["face","sealed","zipper","secret"],char:'\u{1f910}',fitzpatrick_scale:!1,category:"people"},nauseated_face:{keywords:["face","vomit","gross","green","sick","throw up","ill"],char:'\u{1f922}',fitzpatrick_scale:!1,category:"people"},sneezing_face:{keywords:["face","gesundheit","sneeze","sick","allergy"],char:'\u{1f927}',fitzpatrick_scale:!1,category:"people"},vomiting:{keywords:["face","sick"],char:'\u{1f92e}',fitzpatrick_scale:!1,category:"people"},mask:{keywords:["face","sick","ill","disease"],char:'\u{1f637}',fitzpatrick_scale:!1,category:"people"},face_with_thermometer:{keywords:["sick","temperature","thermometer","cold","fever"],char:'\u{1f912}',fitzpatrick_scale:!1,category:"people"},face_with_head_bandage:{keywords:["injured","clumsy","bandage","hurt"],char:'\u{1f915}',fitzpatrick_scale:!1,category:"people"},woozy:{keywords:["face","dizzy","intoxicated","tipsy","wavy"],char:'\u{1f974}',fitzpatrick_scale:!1,category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],char:'\u{1f634}',fitzpatrick_scale:!1,category:"people"},zzz:{keywords:["sleepy","tired","dream"],char:'\u{1f4a4}',fitzpatrick_scale:!1,category:"people"},poop:{keywords:["hankey","shitface","fail","turd","shit"],char:'\u{1f4a9}',fitzpatrick_scale:!1,category:"people"},smiling_imp:{keywords:["devil","horns"],char:'\u{1f608}',fitzpatrick_scale:!1,category:"people"},imp:{keywords:["devil","angry","horns"],char:'\u{1f47f}',fitzpatrick_scale:!1,category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],char:'\u{1f479}',fitzpatrick_scale:!1,category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],char:'\u{1f47a}',fitzpatrick_scale:!1,category:"people"},skull:{keywords:["dead","skeleton","creepy","death"],char:'\u{1f480}',fitzpatrick_scale:!1,category:"people"},ghost:{keywords:["halloween","spooky","scary"],char:'\u{1f47b}',fitzpatrick_scale:!1,category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],char:'\u{1f47d}',fitzpatrick_scale:!1,category:"people"},robot:{keywords:["computer","machine","bot"],char:'\u{1f916}',fitzpatrick_scale:!1,category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],char:'\u{1f63a}',fitzpatrick_scale:!1,category:"people"},smile_cat:{keywords:["animal","cats","smile"],char:'\u{1f638}',fitzpatrick_scale:!1,category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],char:'\u{1f639}',fitzpatrick_scale:!1,category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],char:'\u{1f63b}',fitzpatrick_scale:!1,category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],char:'\u{1f63c}',fitzpatrick_scale:!1,category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],char:'\u{1f63d}',fitzpatrick_scale:!1,category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],char:'\u{1f640}',fitzpatrick_scale:!1,category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],char:'\u{1f63f}',fitzpatrick_scale:!1,category:"people"},pouting_cat:{keywords:["animal","cats"],char:'\u{1f63e}',fitzpatrick_scale:!1,category:"people"},palms_up:{keywords:["hands","gesture","cupped","prayer"],char:'\u{1f932}',fitzpatrick_scale:!0,category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],char:'\u{1f64c}',fitzpatrick_scale:!0,category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],char:'\u{1f44f}',fitzpatrick_scale:!0,category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","hi","palm"],char:'\u{1f44b}',fitzpatrick_scale:!0,category:"people"},call_me_hand:{keywords:["hands","gesture"],char:'\u{1f919}',fitzpatrick_scale:!0,category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],char:'\u{1f44d}',fitzpatrick_scale:!0,category:"people"},"-1":{keywords:["thumbsdown","no","dislike","hand"],char:'\u{1f44e}',fitzpatrick_scale:!0,category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],char:'\u{1f44a}',fitzpatrick_scale:!0,category:"people"},fist:{keywords:["fingers","hand","grasp"],char:'\u270a',fitzpatrick_scale:!0,category:"people"},fist_left:{keywords:["hand","fistbump"],char:'\u{1f91b}',fitzpatrick_scale:!0,category:"people"},fist_right:{keywords:["hand","fistbump"],char:'\u{1f91c}',fitzpatrick_scale:!0,category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],char:'\u270c',fitzpatrick_scale:!0,category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok","okay"],char:'\u{1f44c}',fitzpatrick_scale:!0,category:"people"},raised_hand:{keywords:["fingers","stop","highfive","palm","ban"],char:'\u270b',fitzpatrick_scale:!0,category:"people"},raised_back_of_hand:{keywords:["fingers","raised","backhand"],char:'\u{1f91a}',fitzpatrick_scale:!0,category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],char:'\u{1f450}',fitzpatrick_scale:!0,category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],char:'\u{1f4aa}',fitzpatrick_scale:!0,category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],char:'\u{1f64f}',fitzpatrick_scale:!0,category:"people"},foot:{keywords:["kick","stomp"],char:'\u{1f9b6}',fitzpatrick_scale:!0,category:"people"},leg:{keywords:["kick","limb"],char:'\u{1f9b5}',fitzpatrick_scale:!0,category:"people"},handshake:{keywords:["agreement","shake"],char:'\u{1f91d}',fitzpatrick_scale:!1,category:"people"},point_up:{keywords:["hand","fingers","direction","up"],char:'\u261d',fitzpatrick_scale:!0,category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],char:'\u{1f446}',fitzpatrick_scale:!0,category:"people"},point_down:{keywords:["fingers","hand","direction","down"],char:'\u{1f447}',fitzpatrick_scale:!0,category:"people"},point_left:{keywords:["direction","fingers","hand","left"],char:'\u{1f448}',fitzpatrick_scale:!0,category:"people"},point_right:{keywords:["fingers","hand","direction","right"],char:'\u{1f449}',fitzpatrick_scale:!0,category:"people"},fu:{keywords:["hand","fingers","rude","middle","flipping"],char:'\u{1f595}',fitzpatrick_scale:!0,category:"people"},raised_hand_with_fingers_splayed:{keywords:["hand","fingers","palm"],char:'\u{1f590}',fitzpatrick_scale:!0,category:"people"},love_you:{keywords:["hand","fingers","gesture"],char:'\u{1f91f}',fitzpatrick_scale:!0,category:"people"},metal:{keywords:["hand","fingers","evil_eye","sign_of_horns","rock_on"],char:'\u{1f918}',fitzpatrick_scale:!0,category:"people"},crossed_fingers:{keywords:["good","lucky"],char:'\u{1f91e}',fitzpatrick_scale:!0,category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],char:'\u{1f596}',fitzpatrick_scale:!0,category:"people"},writing_hand:{keywords:["lower_left_ballpoint_pen","stationery","write","compose"],char:'\u270d',fitzpatrick_scale:!0,category:"people"},selfie:{keywords:["camera","phone"],char:'\u{1f933}',fitzpatrick_scale:!0,category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],char:'\u{1f485}',fitzpatrick_scale:!0,category:"people"},lips:{keywords:["mouth","kiss"],char:'\u{1f444}',fitzpatrick_scale:!1,category:"people"},tooth:{keywords:["teeth","dentist"],char:'\u{1f9b7}',fitzpatrick_scale:!1,category:"people"},tongue:{keywords:["mouth","playful"],char:'\u{1f445}',fitzpatrick_scale:!1,category:"people"},ear:{keywords:["face","hear","sound","listen"],char:'\u{1f442}',fitzpatrick_scale:!0,category:"people"},nose:{keywords:["smell","sniff"],char:'\u{1f443}',fitzpatrick_scale:!0,category:"people"},eye:{keywords:["face","look","see","watch","stare"],char:'\u{1f441}',fitzpatrick_scale:!1,category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],char:'\u{1f440}',fitzpatrick_scale:!1,category:"people"},brain:{keywords:["smart","intelligent"],char:'\u{1f9e0}',fitzpatrick_scale:!1,category:"people"},bust_in_silhouette:{keywords:["user","person","human"],char:'\u{1f464}',fitzpatrick_scale:!1,category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],char:'\u{1f465}',fitzpatrick_scale:!1,category:"people"},speaking_head:{keywords:["user","person","human","sing","say","talk"],char:'\u{1f5e3}',fitzpatrick_scale:!1,category:"people"},baby:{keywords:["child","boy","girl","toddler"],char:'\u{1f476}',fitzpatrick_scale:!0,category:"people"},child:{keywords:["gender-neutral","young"],char:'\u{1f9d2}',fitzpatrick_scale:!0,category:"people"},boy:{keywords:["man","male","guy","teenager"],char:'\u{1f466}',fitzpatrick_scale:!0,category:"people"},girl:{keywords:["female","woman","teenager"],char:'\u{1f467}',fitzpatrick_scale:!0,category:"people"},adult:{keywords:["gender-neutral","person"],char:'\u{1f9d1}',fitzpatrick_scale:!0,category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],char:'\u{1f468}',fitzpatrick_scale:!0,category:"people"},woman:{keywords:["female","girls","lady"],char:'\u{1f469}',fitzpatrick_scale:!0,category:"people"},blonde_woman:{keywords:["woman","female","girl","blonde","person"],char:'\u{1f471}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},blonde_man:{keywords:["man","male","boy","blonde","guy","person"],char:'\u{1f471}',fitzpatrick_scale:!0,category:"people"},bearded_person:{keywords:["person","bewhiskered"],char:'\u{1f9d4}',fitzpatrick_scale:!0,category:"people"},older_adult:{keywords:["human","elder","senior","gender-neutral"],char:'\u{1f9d3}',fitzpatrick_scale:!0,category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],char:'\u{1f474}',fitzpatrick_scale:!0,category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],char:'\u{1f475}',fitzpatrick_scale:!0,category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],char:'\u{1f472}',fitzpatrick_scale:!0,category:"people"},woman_with_headscarf:{keywords:["female","hijab","mantilla","tichel"],char:'\u{1f9d5}',fitzpatrick_scale:!0,category:"people"},woman_with_turban:{keywords:["female","indian","hinduism","arabs","woman"],char:'\u{1f473}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],char:'\u{1f473}',fitzpatrick_scale:!0,category:"people"},policewoman:{keywords:["woman","police","law","legal","enforcement","arrest","911","female"],char:'\u{1f46e}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},policeman:{keywords:["man","police","law","legal","enforcement","arrest","911"],char:'\u{1f46e}',fitzpatrick_scale:!0,category:"people"},construction_worker_woman:{keywords:["female","human","wip","build","construction","worker","labor","woman"],char:'\u{1f477}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},construction_worker_man:{keywords:["male","human","wip","guy","build","construction","worker","labor"],char:'\u{1f477}',fitzpatrick_scale:!0,category:"people"},guardswoman:{keywords:["uk","gb","british","female","royal","woman"],char:'\u{1f482}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],char:'\u{1f482}',fitzpatrick_scale:!0,category:"people"},female_detective:{keywords:["human","spy","detective","female","woman"],char:'\u{1f575}\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},male_detective:{keywords:["human","spy","detective"],char:'\u{1f575}',fitzpatrick_scale:!0,category:"people"},woman_health_worker:{keywords:["doctor","nurse","therapist","healthcare","woman","human"],char:'\u{1f469}\u200d\u2695\ufe0f',fitzpatrick_scale:!0,category:"people"},man_health_worker:{keywords:["doctor","nurse","therapist","healthcare","man","human"],char:'\u{1f468}\u200d\u2695\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_farmer:{keywords:["rancher","gardener","woman","human"],char:'\u{1f469}\u200d\u{1f33e}',fitzpatrick_scale:!0,category:"people"},man_farmer:{keywords:["rancher","gardener","man","human"],char:'\u{1f468}\u200d\u{1f33e}',fitzpatrick_scale:!0,category:"people"},woman_cook:{keywords:["chef","woman","human"],char:'\u{1f469}\u200d\u{1f373}',fitzpatrick_scale:!0,category:"people"},man_cook:{keywords:["chef","man","human"],char:'\u{1f468}\u200d\u{1f373}',fitzpatrick_scale:!0,category:"people"},woman_student:{keywords:["graduate","woman","human"],char:'\u{1f469}\u200d\u{1f393}',fitzpatrick_scale:!0,category:"people"},man_student:{keywords:["graduate","man","human"],char:'\u{1f468}\u200d\u{1f393}',fitzpatrick_scale:!0,category:"people"},woman_singer:{keywords:["rockstar","entertainer","woman","human"],char:'\u{1f469}\u200d\u{1f3a4}',fitzpatrick_scale:!0,category:"people"},man_singer:{keywords:["rockstar","entertainer","man","human"],char:'\u{1f468}\u200d\u{1f3a4}',fitzpatrick_scale:!0,category:"people"},woman_teacher:{keywords:["instructor","professor","woman","human"],char:'\u{1f469}\u200d\u{1f3eb}',fitzpatrick_scale:!0,category:"people"},man_teacher:{keywords:["instructor","professor","man","human"],char:'\u{1f468}\u200d\u{1f3eb}',fitzpatrick_scale:!0,category:"people"},woman_factory_worker:{keywords:["assembly","industrial","woman","human"],char:'\u{1f469}\u200d\u{1f3ed}',fitzpatrick_scale:!0,category:"people"},man_factory_worker:{keywords:["assembly","industrial","man","human"],char:'\u{1f468}\u200d\u{1f3ed}',fitzpatrick_scale:!0,category:"people"},woman_technologist:{keywords:["coder","developer","engineer","programmer","software","woman","human","laptop","computer"],char:'\u{1f469}\u200d\u{1f4bb}',fitzpatrick_scale:!0,category:"people"},man_technologist:{keywords:["coder","developer","engineer","programmer","software","man","human","laptop","computer"],char:'\u{1f468}\u200d\u{1f4bb}',fitzpatrick_scale:!0,category:"people"},woman_office_worker:{keywords:["business","manager","woman","human"],char:'\u{1f469}\u200d\u{1f4bc}',fitzpatrick_scale:!0,category:"people"},man_office_worker:{keywords:["business","manager","man","human"],char:'\u{1f468}\u200d\u{1f4bc}',fitzpatrick_scale:!0,category:"people"},woman_mechanic:{keywords:["plumber","woman","human","wrench"],char:'\u{1f469}\u200d\u{1f527}',fitzpatrick_scale:!0,category:"people"},man_mechanic:{keywords:["plumber","man","human","wrench"],char:'\u{1f468}\u200d\u{1f527}',fitzpatrick_scale:!0,category:"people"},woman_scientist:{keywords:["biologist","chemist","engineer","physicist","woman","human"],char:'\u{1f469}\u200d\u{1f52c}',fitzpatrick_scale:!0,category:"people"},man_scientist:{keywords:["biologist","chemist","engineer","physicist","man","human"],char:'\u{1f468}\u200d\u{1f52c}',fitzpatrick_scale:!0,category:"people"},woman_artist:{keywords:["painter","woman","human"],char:'\u{1f469}\u200d\u{1f3a8}',fitzpatrick_scale:!0,category:"people"},man_artist:{keywords:["painter","man","human"],char:'\u{1f468}\u200d\u{1f3a8}',fitzpatrick_scale:!0,category:"people"},woman_firefighter:{keywords:["fireman","woman","human"],char:'\u{1f469}\u200d\u{1f692}',fitzpatrick_scale:!0,category:"people"},man_firefighter:{keywords:["fireman","man","human"],char:'\u{1f468}\u200d\u{1f692}',fitzpatrick_scale:!0,category:"people"},woman_pilot:{keywords:["aviator","plane","woman","human"],char:'\u{1f469}\u200d\u2708\ufe0f',fitzpatrick_scale:!0,category:"people"},man_pilot:{keywords:["aviator","plane","man","human"],char:'\u{1f468}\u200d\u2708\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_astronaut:{keywords:["space","rocket","woman","human"],char:'\u{1f469}\u200d\u{1f680}',fitzpatrick_scale:!0,category:"people"},man_astronaut:{keywords:["space","rocket","man","human"],char:'\u{1f468}\u200d\u{1f680}',fitzpatrick_scale:!0,category:"people"},woman_judge:{keywords:["justice","court","woman","human"],char:'\u{1f469}\u200d\u2696\ufe0f',fitzpatrick_scale:!0,category:"people"},man_judge:{keywords:["justice","court","man","human"],char:'\u{1f468}\u200d\u2696\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_superhero:{keywords:["woman","female","good","heroine","superpowers"],char:'\u{1f9b8}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_superhero:{keywords:["man","male","good","hero","superpowers"],char:'\u{1f9b8}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_supervillain:{keywords:["woman","female","evil","bad","criminal","heroine","superpowers"],char:'\u{1f9b9}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_supervillain:{keywords:["man","male","evil","bad","criminal","hero","superpowers"],char:'\u{1f9b9}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},mrs_claus:{keywords:["woman","female","xmas","mother christmas"],char:'\u{1f936}',fitzpatrick_scale:!0,category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],char:'\u{1f385}',fitzpatrick_scale:!0,category:"people"},sorceress:{keywords:["woman","female","mage","witch"],char:'\u{1f9d9}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},wizard:{keywords:["man","male","mage","sorcerer"],char:'\u{1f9d9}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_elf:{keywords:["woman","female"],char:'\u{1f9dd}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_elf:{keywords:["man","male"],char:'\u{1f9dd}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_vampire:{keywords:["woman","female"],char:'\u{1f9db}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_vampire:{keywords:["man","male","dracula"],char:'\u{1f9db}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_zombie:{keywords:["woman","female","undead","walking dead"],char:'\u{1f9df}\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"people"},man_zombie:{keywords:["man","male","dracula","undead","walking dead"],char:'\u{1f9df}\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"people"},woman_genie:{keywords:["woman","female"],char:'\u{1f9de}\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"people"},man_genie:{keywords:["man","male"],char:'\u{1f9de}\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"people"},mermaid:{keywords:["woman","female","merwoman","ariel"],char:'\u{1f9dc}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},merman:{keywords:["man","male","triton"],char:'\u{1f9dc}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_fairy:{keywords:["woman","female"],char:'\u{1f9da}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_fairy:{keywords:["man","male"],char:'\u{1f9da}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},angel:{keywords:["heaven","wings","halo"],char:'\u{1f47c}',fitzpatrick_scale:!0,category:"people"},pregnant_woman:{keywords:["baby"],char:'\u{1f930}',fitzpatrick_scale:!0,category:"people"},breastfeeding:{keywords:["nursing","baby"],char:'\u{1f931}',fitzpatrick_scale:!0,category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],char:'\u{1f478}',fitzpatrick_scale:!0,category:"people"},prince:{keywords:["boy","man","male","crown","royal","king"],char:'\u{1f934}',fitzpatrick_scale:!0,category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],char:'\u{1f470}',fitzpatrick_scale:!0,category:"people"},man_in_tuxedo:{keywords:["couple","marriage","wedding","groom"],char:'\u{1f935}',fitzpatrick_scale:!0,category:"people"},running_woman:{keywords:["woman","walking","exercise","race","running","female"],char:'\u{1f3c3}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},running_man:{keywords:["man","walking","exercise","race","running"],char:'\u{1f3c3}',fitzpatrick_scale:!0,category:"people"},walking_woman:{keywords:["human","feet","steps","woman","female"],char:'\u{1f6b6}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},walking_man:{keywords:["human","feet","steps"],char:'\u{1f6b6}',fitzpatrick_scale:!0,category:"people"},dancer:{keywords:["female","girl","woman","fun"],char:'\u{1f483}',fitzpatrick_scale:!0,category:"people"},man_dancing:{keywords:["male","boy","fun","dancer"],char:'\u{1f57a}',fitzpatrick_scale:!0,category:"people"},dancing_women:{keywords:["female","bunny","women","girls"],char:'\u{1f46f}',fitzpatrick_scale:!1,category:"people"},dancing_men:{keywords:["male","bunny","men","boys"],char:'\u{1f46f}\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],char:'\u{1f46b}',fitzpatrick_scale:!1,category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],char:'\u{1f46c}',fitzpatrick_scale:!1,category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],char:'\u{1f46d}',fitzpatrick_scale:!1,category:"people"},bowing_woman:{keywords:["woman","female","girl"],char:'\u{1f647}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},bowing_man:{keywords:["man","male","boy"],char:'\u{1f647}',fitzpatrick_scale:!0,category:"people"},man_facepalming:{keywords:["man","male","boy","disbelief"],char:'\u{1f926}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_facepalming:{keywords:["woman","female","girl","disbelief"],char:'\u{1f926}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_shrugging:{keywords:["woman","female","girl","confused","indifferent","doubt"],char:'\u{1f937}',fitzpatrick_scale:!0,category:"people"},man_shrugging:{keywords:["man","male","boy","confused","indifferent","doubt"],char:'\u{1f937}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},tipping_hand_woman:{keywords:["female","girl","woman","human","information"],char:'\u{1f481}',fitzpatrick_scale:!0,category:"people"},tipping_hand_man:{keywords:["male","boy","man","human","information"],char:'\u{1f481}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},no_good_woman:{keywords:["female","girl","woman","nope"],char:'\u{1f645}',fitzpatrick_scale:!0,category:"people"},no_good_man:{keywords:["male","boy","man","nope"],char:'\u{1f645}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],char:'\u{1f646}',fitzpatrick_scale:!0,category:"people"},ok_man:{keywords:["men","boy","male","blue","human","man"],char:'\u{1f646}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},raising_hand_woman:{keywords:["female","girl","woman"],char:'\u{1f64b}',fitzpatrick_scale:!0,category:"people"},raising_hand_man:{keywords:["male","boy","man"],char:'\u{1f64b}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},pouting_woman:{keywords:["female","girl","woman"],char:'\u{1f64e}',fitzpatrick_scale:!0,category:"people"},pouting_man:{keywords:["male","boy","man"],char:'\u{1f64e}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},frowning_woman:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],char:'\u{1f64d}',fitzpatrick_scale:!0,category:"people"},frowning_man:{keywords:["male","boy","man","sad","depressed","discouraged","unhappy"],char:'\u{1f64d}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},haircut_woman:{keywords:["female","girl","woman"],char:'\u{1f487}',fitzpatrick_scale:!0,category:"people"},haircut_man:{keywords:["male","boy","man"],char:'\u{1f487}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},massage_woman:{keywords:["female","girl","woman","head"],char:'\u{1f486}',fitzpatrick_scale:!0,category:"people"},massage_man:{keywords:["male","boy","man","head"],char:'\u{1f486}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_in_steamy_room:{keywords:["female","woman","spa","steamroom","sauna"],char:'\u{1f9d6}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_in_steamy_room:{keywords:["male","man","spa","steamroom","sauna"],char:'\u{1f9d6}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},couple_with_heart_woman_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'\u{1f491}',fitzpatrick_scale:!1,category:"people"},couple_with_heart_woman_woman:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'\u{1f469}\u200d\u2764\ufe0f\u200d\u{1f469}',fitzpatrick_scale:!1,category:"people"},couple_with_heart_man_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'\u{1f468}\u200d\u2764\ufe0f\u200d\u{1f468}',fitzpatrick_scale:!1,category:"people"},couplekiss_man_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:'\u{1f48f}',fitzpatrick_scale:!1,category:"people"},couplekiss_woman_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:'\u{1f469}\u200d\u2764\ufe0f\u200d\u{1f48b}\u200d\u{1f469}',fitzpatrick_scale:!1,category:"people"},couplekiss_man_man:{keywords:["pair","valentines","love","like","dating","marriage"],char:'\u{1f468}\u200d\u2764\ufe0f\u200d\u{1f48b}\u200d\u{1f468}',fitzpatrick_scale:!1,category:"people"},family_man_woman_boy:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],char:'\u{1f46a}',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],char:'\u{1f468}\u200d\u{1f469}\u200d\u{1f467}',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:'\u{1f468}\u200d\u{1f469}\u200d\u{1f467}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_man_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:'\u{1f468}\u200d\u{1f469}\u200d\u{1f466}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:'\u{1f468}\u200d\u{1f469}\u200d\u{1f467}\u200d\u{1f467}',fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy:{keywords:["home","parents","people","human","children"],char:'\u{1f469}\u200d\u{1f469}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl:{keywords:["home","parents","people","human","children"],char:'\u{1f469}\u200d\u{1f469}\u200d\u{1f467}',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:'\u{1f469}\u200d\u{1f469}\u200d\u{1f467}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:'\u{1f469}\u200d\u{1f469}\u200d\u{1f466}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:'\u{1f469}\u200d\u{1f469}\u200d\u{1f467}\u200d\u{1f467}',fitzpatrick_scale:!1,category:"people"},family_man_man_boy:{keywords:["home","parents","people","human","children"],char:'\u{1f468}\u200d\u{1f468}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_man_man_girl:{keywords:["home","parents","people","human","children"],char:'\u{1f468}\u200d\u{1f468}\u200d\u{1f467}',fitzpatrick_scale:!1,category:"people"},family_man_man_girl_boy:{keywords:["home","parents","people","human","children"],char:'\u{1f468}\u200d\u{1f468}\u200d\u{1f467}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_man_man_boy_boy:{keywords:["home","parents","people","human","children"],char:'\u{1f468}\u200d\u{1f468}\u200d\u{1f466}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_man_man_girl_girl:{keywords:["home","parents","people","human","children"],char:'\u{1f468}\u200d\u{1f468}\u200d\u{1f467}\u200d\u{1f467}',fitzpatrick_scale:!1,category:"people"},family_woman_boy:{keywords:["home","parent","people","human","child"],char:'\u{1f469}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_woman_girl:{keywords:["home","parent","people","human","child"],char:'\u{1f469}\u200d\u{1f467}',fitzpatrick_scale:!1,category:"people"},family_woman_girl_boy:{keywords:["home","parent","people","human","children"],char:'\u{1f469}\u200d\u{1f467}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_woman_boy_boy:{keywords:["home","parent","people","human","children"],char:'\u{1f469}\u200d\u{1f466}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_woman_girl_girl:{keywords:["home","parent","people","human","children"],char:'\u{1f469}\u200d\u{1f467}\u200d\u{1f467}',fitzpatrick_scale:!1,category:"people"},family_man_boy:{keywords:["home","parent","people","human","child"],char:'\u{1f468}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_man_girl:{keywords:["home","parent","people","human","child"],char:'\u{1f468}\u200d\u{1f467}',fitzpatrick_scale:!1,category:"people"},family_man_girl_boy:{keywords:["home","parent","people","human","children"],char:'\u{1f468}\u200d\u{1f467}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_man_boy_boy:{keywords:["home","parent","people","human","children"],char:'\u{1f468}\u200d\u{1f466}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_man_girl_girl:{keywords:["home","parent","people","human","children"],char:'\u{1f468}\u200d\u{1f467}\u200d\u{1f467}',fitzpatrick_scale:!1,category:"people"},yarn:{keywords:["ball","crochet","knit"],char:'\u{1f9f6}',fitzpatrick_scale:!1,category:"people"},thread:{keywords:["needle","sewing","spool","string"],char:'\u{1f9f5}',fitzpatrick_scale:!1,category:"people"},coat:{keywords:["jacket"],char:'\u{1f9e5}',fitzpatrick_scale:!1,category:"people"},labcoat:{keywords:["doctor","experiment","scientist","chemist"],char:'\u{1f97c}',fitzpatrick_scale:!1,category:"people"},womans_clothes:{keywords:["fashion","shopping_bags","female"],char:'\u{1f45a}',fitzpatrick_scale:!1,category:"people"},tshirt:{keywords:["fashion","cloth","casual","shirt","tee"],char:'\u{1f455}',fitzpatrick_scale:!1,category:"people"},jeans:{keywords:["fashion","shopping"],char:'\u{1f456}',fitzpatrick_scale:!1,category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],char:'\u{1f454}',fitzpatrick_scale:!1,category:"people"},dress:{keywords:["clothes","fashion","shopping"],char:'\u{1f457}',fitzpatrick_scale:!1,category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],char:'\u{1f459}',fitzpatrick_scale:!1,category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],char:'\u{1f458}',fitzpatrick_scale:!1,category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],char:'\u{1f484}',fitzpatrick_scale:!1,category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],char:'\u{1f48b}',fitzpatrick_scale:!1,category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],char:'\u{1f463}',fitzpatrick_scale:!1,category:"people"},flat_shoe:{keywords:["ballet","slip-on","slipper"],char:'\u{1f97f}',fitzpatrick_scale:!1,category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],char:'\u{1f460}',fitzpatrick_scale:!1,category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],char:'\u{1f461}',fitzpatrick_scale:!1,category:"people"},boot:{keywords:["shoes","fashion"],char:'\u{1f462}',fitzpatrick_scale:!1,category:"people"},mans_shoe:{keywords:["fashion","male"],char:'\u{1f45e}',fitzpatrick_scale:!1,category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],char:'\u{1f45f}',fitzpatrick_scale:!1,category:"people"},hiking_boot:{keywords:["backpacking","camping","hiking"],char:'\u{1f97e}',fitzpatrick_scale:!1,category:"people"},socks:{keywords:["stockings","clothes"],char:'\u{1f9e6}',fitzpatrick_scale:!1,category:"people"},gloves:{keywords:["hands","winter","clothes"],char:'\u{1f9e4}',fitzpatrick_scale:!1,category:"people"},scarf:{keywords:["neck","winter","clothes"],char:'\u{1f9e3}',fitzpatrick_scale:!1,category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],char:'\u{1f452}',fitzpatrick_scale:!1,category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],char:'\u{1f3a9}',fitzpatrick_scale:!1,category:"people"},billed_hat:{keywords:["cap","baseball"],char:'\u{1f9e2}',fitzpatrick_scale:!1,category:"people"},rescue_worker_helmet:{keywords:["construction","build"],char:'\u26d1',fitzpatrick_scale:!1,category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],char:'\u{1f393}',fitzpatrick_scale:!1,category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],char:'\u{1f451}',fitzpatrick_scale:!1,category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],char:'\u{1f392}',fitzpatrick_scale:!1,category:"people"},luggage:{keywords:["packing","travel"],char:'\u{1f9f3}',fitzpatrick_scale:!1,category:"people"},pouch:{keywords:["bag","accessories","shopping"],char:'\u{1f45d}',fitzpatrick_scale:!1,category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],char:'\u{1f45b}',fitzpatrick_scale:!1,category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],char:'\u{1f45c}',fitzpatrick_scale:!1,category:"people"},briefcase:{keywords:["business","documents","work","law","legal","job","career"],char:'\u{1f4bc}',fitzpatrick_scale:!1,category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],char:'\u{1f453}',fitzpatrick_scale:!1,category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],char:'\u{1f576}',fitzpatrick_scale:!1,category:"people"},goggles:{keywords:["eyes","protection","safety"],char:'\u{1f97d}',fitzpatrick_scale:!1,category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],char:'\u{1f48d}',fitzpatrick_scale:!1,category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],char:'\u{1f302}',fitzpatrick_scale:!1,category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],char:'\u{1f436}',fitzpatrick_scale:!1,category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],char:'\u{1f431}',fitzpatrick_scale:!1,category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese_wedge","rodent"],char:'\u{1f42d}',fitzpatrick_scale:!1,category:"animals_and_nature"},hamster:{keywords:["animal","nature"],char:'\u{1f439}',fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],char:'\u{1f430}',fitzpatrick_scale:!1,category:"animals_and_nature"},fox_face:{keywords:["animal","nature","face"],char:'\u{1f98a}',fitzpatrick_scale:!1,category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],char:'\u{1f43b}',fitzpatrick_scale:!1,category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],char:'\u{1f43c}',fitzpatrick_scale:!1,category:"animals_and_nature"},koala:{keywords:["animal","nature"],char:'\u{1f428}',fitzpatrick_scale:!1,category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],char:'\u{1f42f}',fitzpatrick_scale:!1,category:"animals_and_nature"},lion:{keywords:["animal","nature"],char:'\u{1f981}',fitzpatrick_scale:!1,category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],char:'\u{1f42e}',fitzpatrick_scale:!1,category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],char:'\u{1f437}',fitzpatrick_scale:!1,category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],char:'\u{1f43d}',fitzpatrick_scale:!1,category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],char:'\u{1f438}',fitzpatrick_scale:!1,category:"animals_and_nature"},squid:{keywords:["animal","nature","ocean","sea"],char:'\u{1f991}',fitzpatrick_scale:!1,category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],char:'\u{1f419}',fitzpatrick_scale:!1,category:"animals_and_nature"},shrimp:{keywords:["animal","ocean","nature","seafood"],char:'\u{1f990}',fitzpatrick_scale:!1,category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],char:'\u{1f435}',fitzpatrick_scale:!1,category:"animals_and_nature"},gorilla:{keywords:["animal","nature","circus"],char:'\u{1f98d}',fitzpatrick_scale:!1,category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],char:'\u{1f648}',fitzpatrick_scale:!1,category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],char:'\u{1f649}',fitzpatrick_scale:!1,category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],char:'\u{1f64a}',fitzpatrick_scale:!1,category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],char:'\u{1f412}',fitzpatrick_scale:!1,category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],char:'\u{1f414}',fitzpatrick_scale:!1,category:"animals_and_nature"},penguin:{keywords:["animal","nature"],char:'\u{1f427}',fitzpatrick_scale:!1,category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],char:'\u{1f426}',fitzpatrick_scale:!1,category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],char:'\u{1f424}',fitzpatrick_scale:!1,category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],char:'\u{1f423}',fitzpatrick_scale:!1,category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],char:'\u{1f425}',fitzpatrick_scale:!1,category:"animals_and_nature"},duck:{keywords:["animal","nature","bird","mallard"],char:'\u{1f986}',fitzpatrick_scale:!1,category:"animals_and_nature"},eagle:{keywords:["animal","nature","bird"],char:'\u{1f985}',fitzpatrick_scale:!1,category:"animals_and_nature"},owl:{keywords:["animal","nature","bird","hoot"],char:'\u{1f989}',fitzpatrick_scale:!1,category:"animals_and_nature"},bat:{keywords:["animal","nature","blind","vampire"],char:'\u{1f987}',fitzpatrick_scale:!1,category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],char:'\u{1f43a}',fitzpatrick_scale:!1,category:"animals_and_nature"},boar:{keywords:["animal","nature"],char:'\u{1f417}',fitzpatrick_scale:!1,category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],char:'\u{1f434}',fitzpatrick_scale:!1,category:"animals_and_nature"},unicorn:{keywords:["animal","nature","mystical"],char:'\u{1f984}',fitzpatrick_scale:!1,category:"animals_and_nature"},honeybee:{keywords:["animal","insect","nature","bug","spring","honey"],char:'\u{1f41d}',fitzpatrick_scale:!1,category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],char:'\u{1f41b}',fitzpatrick_scale:!1,category:"animals_and_nature"},butterfly:{keywords:["animal","insect","nature","caterpillar"],char:'\u{1f98b}',fitzpatrick_scale:!1,category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],char:'\u{1f40c}',fitzpatrick_scale:!1,category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],char:'\u{1f41e}',fitzpatrick_scale:!1,category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],char:'\u{1f41c}',fitzpatrick_scale:!1,category:"animals_and_nature"},grasshopper:{keywords:["animal","cricket","chirp"],char:'\u{1f997}',fitzpatrick_scale:!1,category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],char:'\u{1f577}',fitzpatrick_scale:!1,category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],char:'\u{1f982}',fitzpatrick_scale:!1,category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],char:'\u{1f980}',fitzpatrick_scale:!1,category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],char:'\u{1f40d}',fitzpatrick_scale:!1,category:"animals_and_nature"},lizard:{keywords:["animal","nature","reptile"],char:'\u{1f98e}',fitzpatrick_scale:!1,category:"animals_and_nature"},"t-rex":{keywords:["animal","nature","dinosaur","tyrannosaurus","extinct"],char:'\u{1f996}',fitzpatrick_scale:!1,category:"animals_and_nature"},sauropod:{keywords:["animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"],char:'\u{1f995}',fitzpatrick_scale:!1,category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],char:'\u{1f422}',fitzpatrick_scale:!1,category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],char:'\u{1f420}',fitzpatrick_scale:!1,category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],char:'\u{1f41f}',fitzpatrick_scale:!1,category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],char:'\u{1f421}',fitzpatrick_scale:!1,category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],char:'\u{1f42c}',fitzpatrick_scale:!1,category:"animals_and_nature"},shark:{keywords:["animal","nature","fish","sea","ocean","jaws","fins","beach"],char:'\u{1f988}',fitzpatrick_scale:!1,category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],char:'\u{1f433}',fitzpatrick_scale:!1,category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],char:'\u{1f40b}',fitzpatrick_scale:!1,category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],char:'\u{1f40a}',fitzpatrick_scale:!1,category:"animals_and_nature"},leopard:{keywords:["animal","nature"],char:'\u{1f406}',fitzpatrick_scale:!1,category:"animals_and_nature"},zebra:{keywords:["animal","nature","stripes","safari"],char:'\u{1f993}',fitzpatrick_scale:!1,category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],char:'\u{1f405}',fitzpatrick_scale:!1,category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],char:'\u{1f403}',fitzpatrick_scale:!1,category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],char:'\u{1f402}',fitzpatrick_scale:!1,category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],char:'\u{1f404}',fitzpatrick_scale:!1,category:"animals_and_nature"},deer:{keywords:["animal","nature","horns","venison"],char:'\u{1f98c}',fitzpatrick_scale:!1,category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],char:'\u{1f42a}',fitzpatrick_scale:!1,category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],char:'\u{1f42b}',fitzpatrick_scale:!1,category:"animals_and_nature"},giraffe:{keywords:["animal","nature","spots","safari"],char:'\u{1f992}',fitzpatrick_scale:!1,category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","th","circus"],char:'\u{1f418}',fitzpatrick_scale:!1,category:"animals_and_nature"},rhinoceros:{keywords:["animal","nature","horn"],char:'\u{1f98f}',fitzpatrick_scale:!1,category:"animals_and_nature"},goat:{keywords:["animal","nature"],char:'\u{1f410}',fitzpatrick_scale:!1,category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],char:'\u{1f40f}',fitzpatrick_scale:!1,category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],char:'\u{1f411}',fitzpatrick_scale:!1,category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],char:'\u{1f40e}',fitzpatrick_scale:!1,category:"animals_and_nature"},pig2:{keywords:["animal","nature"],char:'\u{1f416}',fitzpatrick_scale:!1,category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],char:'\u{1f400}',fitzpatrick_scale:!1,category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],char:'\u{1f401}',fitzpatrick_scale:!1,category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],char:'\u{1f413}',fitzpatrick_scale:!1,category:"animals_and_nature"},turkey:{keywords:["animal","bird"],char:'\u{1f983}',fitzpatrick_scale:!1,category:"animals_and_nature"},dove:{keywords:["animal","bird"],char:'\u{1f54a}',fitzpatrick_scale:!1,category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],char:'\u{1f415}',fitzpatrick_scale:!1,category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],char:'\u{1f429}',fitzpatrick_scale:!1,category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],char:'\u{1f408}',fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],char:'\u{1f407}',fitzpatrick_scale:!1,category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],char:'\u{1f43f}',fitzpatrick_scale:!1,category:"animals_and_nature"},hedgehog:{keywords:["animal","nature","spiny"],char:'\u{1f994}',fitzpatrick_scale:!1,category:"animals_and_nature"},raccoon:{keywords:["animal","nature"],char:'\u{1f99d}',fitzpatrick_scale:!1,category:"animals_and_nature"},llama:{keywords:["animal","nature","alpaca"],char:'\u{1f999}',fitzpatrick_scale:!1,category:"animals_and_nature"},hippopotamus:{keywords:["animal","nature"],char:'\u{1f99b}',fitzpatrick_scale:!1,category:"animals_and_nature"},kangaroo:{keywords:["animal","nature","australia","joey","hop","marsupial"],char:'\u{1f998}',fitzpatrick_scale:!1,category:"animals_and_nature"},badger:{keywords:["animal","nature","honey"],char:'\u{1f9a1}',fitzpatrick_scale:!1,category:"animals_and_nature"},swan:{keywords:["animal","nature","bird"],char:'\u{1f9a2}',fitzpatrick_scale:!1,category:"animals_and_nature"},peacock:{keywords:["animal","nature","peahen","bird"],char:'\u{1f99a}',fitzpatrick_scale:!1,category:"animals_and_nature"},parrot:{keywords:["animal","nature","bird","pirate","talk"],char:'\u{1f99c}',fitzpatrick_scale:!1,category:"animals_and_nature"},lobster:{keywords:["animal","nature","bisque","claws","seafood"],char:'\u{1f99e}',fitzpatrick_scale:!1,category:"animals_and_nature"},mosquito:{keywords:["animal","nature","insect","malaria"],char:'\u{1f99f}',fitzpatrick_scale:!1,category:"animals_and_nature"},paw_prints:{keywords:["animal","tracking","footprints","dog","cat","pet","feet"],char:'\u{1f43e}',fitzpatrick_scale:!1,category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],char:'\u{1f409}',fitzpatrick_scale:!1,category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],char:'\u{1f432}',fitzpatrick_scale:!1,category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],char:'\u{1f335}',fitzpatrick_scale:!1,category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],char:'\u{1f384}',fitzpatrick_scale:!1,category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],char:'\u{1f332}',fitzpatrick_scale:!1,category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],char:'\u{1f333}',fitzpatrick_scale:!1,category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],char:'\u{1f334}',fitzpatrick_scale:!1,category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],char:'\u{1f331}',fitzpatrick_scale:!1,category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],char:'\u{1f33f}',fitzpatrick_scale:!1,category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],char:'\u2618',fitzpatrick_scale:!1,category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],char:'\u{1f340}',fitzpatrick_scale:!1,category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],char:'\u{1f38d}',fitzpatrick_scale:!1,category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],char:'\u{1f38b}',fitzpatrick_scale:!1,category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],char:'\u{1f343}',fitzpatrick_scale:!1,category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],char:'\u{1f342}',fitzpatrick_scale:!1,category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","ca","fall"],char:'\u{1f341}',fitzpatrick_scale:!1,category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],char:'\u{1f33e}',fitzpatrick_scale:!1,category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],char:'\u{1f33a}',fitzpatrick_scale:!1,category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],char:'\u{1f33b}',fitzpatrick_scale:!1,category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],char:'\u{1f339}',fitzpatrick_scale:!1,category:"animals_and_nature"},wilted_flower:{keywords:["plant","nature","flower"],char:'\u{1f940}',fitzpatrick_scale:!1,category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],char:'\u{1f337}',fitzpatrick_scale:!1,category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],char:'\u{1f33c}',fitzpatrick_scale:!1,category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],char:'\u{1f338}',fitzpatrick_scale:!1,category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],char:'\u{1f490}',fitzpatrick_scale:!1,category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],char:'\u{1f344}',fitzpatrick_scale:!1,category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],char:'\u{1f330}',fitzpatrick_scale:!1,category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],char:'\u{1f383}',fitzpatrick_scale:!1,category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],char:'\u{1f41a}',fitzpatrick_scale:!1,category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],char:'\u{1f578}',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],char:'\u{1f30e}',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],char:'\u{1f30d}',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],char:'\u{1f30f}',fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],char:'\u{1f315}',fitzpatrick_scale:!1,category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],char:'\u{1f316}',fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\u{1f317}',fitzpatrick_scale:!1,category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\u{1f318}',fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\u{1f311}',fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\u{1f312}',fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\u{1f313}',fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_gibbous_moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],char:'\u{1f314}',fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\u{1f31a}',fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\u{1f31d}',fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\u{1f31b}',fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\u{1f31c}',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],char:'\u{1f31e}',fitzpatrick_scale:!1,category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],char:'\u{1f319}',fitzpatrick_scale:!1,category:"animals_and_nature"},star:{keywords:["night","yellow"],char:'\u2b50',fitzpatrick_scale:!1,category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],char:'\u{1f31f}',fitzpatrick_scale:!1,category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],char:'\u{1f4ab}',fitzpatrick_scale:!1,category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],char:'\u2728',fitzpatrick_scale:!1,category:"animals_and_nature"},comet:{keywords:["space"],char:'\u2604',fitzpatrick_scale:!1,category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],char:'\u2600\ufe0f',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_small_cloud:{keywords:["weather"],char:'\u{1f324}',fitzpatrick_scale:!1,category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],char:'\u26c5',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_large_cloud:{keywords:["weather"],char:'\u{1f325}',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_rain_cloud:{keywords:["weather"],char:'\u{1f326}',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud:{keywords:["weather","sky"],char:'\u2601\ufe0f',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],char:'\u{1f327}',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning_and_rain:{keywords:["weather","lightning"],char:'\u26c8',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],char:'\u{1f329}',fitzpatrick_scale:!1,category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],char:'\u26a1',fitzpatrick_scale:!1,category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],char:'\u{1f525}',fitzpatrick_scale:!1,category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],char:'\u{1f4a5}',fitzpatrick_scale:!1,category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],char:'\u2744\ufe0f',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],char:'\u{1f328}',fitzpatrick_scale:!1,category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],char:'\u26c4',fitzpatrick_scale:!1,category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],char:'\u2603',fitzpatrick_scale:!1,category:"animals_and_nature"},wind_face:{keywords:["gust","air"],char:'\u{1f32c}',fitzpatrick_scale:!1,category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],char:'\u{1f4a8}',fitzpatrick_scale:!1,category:"animals_and_nature"},tornado:{keywords:["weather","cyclone","twister"],char:'\u{1f32a}',fitzpatrick_scale:!1,category:"animals_and_nature"},fog:{keywords:["weather"],char:'\u{1f32b}',fitzpatrick_scale:!1,category:"animals_and_nature"},open_umbrella:{keywords:["weather","spring"],char:'\u2602',fitzpatrick_scale:!1,category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],char:'\u2614',fitzpatrick_scale:!1,category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],char:'\u{1f4a7}',fitzpatrick_scale:!1,category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],char:'\u{1f4a6}',fitzpatrick_scale:!1,category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],char:'\u{1f30a}',fitzpatrick_scale:!1,category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],char:'\u{1f34f}',fitzpatrick_scale:!1,category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],char:'\u{1f34e}',fitzpatrick_scale:!1,category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],char:'\u{1f350}',fitzpatrick_scale:!1,category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],char:'\u{1f34a}',fitzpatrick_scale:!1,category:"food_and_drink"},lemon:{keywords:["fruit","nature"],char:'\u{1f34b}',fitzpatrick_scale:!1,category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],char:'\u{1f34c}',fitzpatrick_scale:!1,category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],char:'\u{1f349}',fitzpatrick_scale:!1,category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],char:'\u{1f347}',fitzpatrick_scale:!1,category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],char:'\u{1f353}',fitzpatrick_scale:!1,category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],char:'\u{1f348}',fitzpatrick_scale:!1,category:"food_and_drink"},cherries:{keywords:["food","fruit"],char:'\u{1f352}',fitzpatrick_scale:!1,category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],char:'\u{1f351}',fitzpatrick_scale:!1,category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],char:'\u{1f34d}',fitzpatrick_scale:!1,category:"food_and_drink"},coconut:{keywords:["fruit","nature","food","palm"],char:'\u{1f965}',fitzpatrick_scale:!1,category:"food_and_drink"},kiwi_fruit:{keywords:["fruit","food"],char:'\u{1f95d}',fitzpatrick_scale:!1,category:"food_and_drink"},mango:{keywords:["fruit","food","tropical"],char:'\u{1f96d}',fitzpatrick_scale:!1,category:"food_and_drink"},avocado:{keywords:["fruit","food"],char:'\u{1f951}',fitzpatrick_scale:!1,category:"food_and_drink"},broccoli:{keywords:["fruit","food","vegetable"],char:'\u{1f966}',fitzpatrick_scale:!1,category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],char:'\u{1f345}',fitzpatrick_scale:!1,category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],char:'\u{1f346}',fitzpatrick_scale:!1,category:"food_and_drink"},cucumber:{keywords:["fruit","food","pickle"],char:'\u{1f952}',fitzpatrick_scale:!1,category:"food_and_drink"},carrot:{keywords:["vegetable","food","orange"],char:'\u{1f955}',fitzpatrick_scale:!1,category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],char:'\u{1f336}',fitzpatrick_scale:!1,category:"food_and_drink"},potato:{keywords:["food","tuber","vegatable","starch"],char:'\u{1f954}',fitzpatrick_scale:!1,category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],char:'\u{1f33d}',fitzpatrick_scale:!1,category:"food_and_drink"},leafy_greens:{keywords:["food","vegetable","plant","bok choy","cabbage","kale","lettuce"],char:'\u{1f96c}',fitzpatrick_scale:!1,category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],char:'\u{1f360}',fitzpatrick_scale:!1,category:"food_and_drink"},peanuts:{keywords:["food","nut"],char:'\u{1f95c}',fitzpatrick_scale:!1,category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],char:'\u{1f36f}',fitzpatrick_scale:!1,category:"food_and_drink"},croissant:{keywords:["food","bread","french"],char:'\u{1f950}',fitzpatrick_scale:!1,category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],char:'\u{1f35e}',fitzpatrick_scale:!1,category:"food_and_drink"},baguette_bread:{keywords:["food","bread","french"],char:'\u{1f956}',fitzpatrick_scale:!1,category:"food_and_drink"},bagel:{keywords:["food","bread","bakery","schmear"],char:'\u{1f96f}',fitzpatrick_scale:!1,category:"food_and_drink"},pretzel:{keywords:["food","bread","twisted"],char:'\u{1f968}',fitzpatrick_scale:!1,category:"food_and_drink"},cheese:{keywords:["food","chadder"],char:'\u{1f9c0}',fitzpatrick_scale:!1,category:"food_and_drink"},egg:{keywords:["food","chicken","breakfast"],char:'\u{1f95a}',fitzpatrick_scale:!1,category:"food_and_drink"},bacon:{keywords:["food","breakfast","pork","pig","meat"],char:'\u{1f953}',fitzpatrick_scale:!1,category:"food_and_drink"},steak:{keywords:["food","cow","meat","cut","chop","lambchop","porkchop"],char:'\u{1f969}',fitzpatrick_scale:!1,category:"food_and_drink"},pancakes:{keywords:["food","breakfast","flapjacks","hotcakes"],char:'\u{1f95e}',fitzpatrick_scale:!1,category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],char:'\u{1f357}',fitzpatrick_scale:!1,category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],char:'\u{1f356}',fitzpatrick_scale:!1,category:"food_and_drink"},bone:{keywords:["skeleton"],char:'\u{1f9b4}',fitzpatrick_scale:!1,category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],char:'\u{1f364}',fitzpatrick_scale:!1,category:"food_and_drink"},fried_egg:{keywords:["food","breakfast","kitchen","egg"],char:'\u{1f373}',fitzpatrick_scale:!1,category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],char:'\u{1f354}',fitzpatrick_scale:!1,category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],char:'\u{1f35f}',fitzpatrick_scale:!1,category:"food_and_drink"},stuffed_flatbread:{keywords:["food","flatbread","stuffed","gyro"],char:'\u{1f959}',fitzpatrick_scale:!1,category:"food_and_drink"},hotdog:{keywords:["food","frankfurter"],char:'\u{1f32d}',fitzpatrick_scale:!1,category:"food_and_drink"},pizza:{keywords:["food","party"],char:'\u{1f355}',fitzpatrick_scale:!1,category:"food_and_drink"},sandwich:{keywords:["food","lunch","bread"],char:'\u{1f96a}',fitzpatrick_scale:!1,category:"food_and_drink"},canned_food:{keywords:["food","soup"],char:'\u{1f96b}',fitzpatrick_scale:!1,category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],char:'\u{1f35d}',fitzpatrick_scale:!1,category:"food_and_drink"},taco:{keywords:["food","mexican"],char:'\u{1f32e}',fitzpatrick_scale:!1,category:"food_and_drink"},burrito:{keywords:["food","mexican"],char:'\u{1f32f}',fitzpatrick_scale:!1,category:"food_and_drink"},green_salad:{keywords:["food","healthy","lettuce"],char:'\u{1f957}',fitzpatrick_scale:!1,category:"food_and_drink"},shallow_pan_of_food:{keywords:["food","cooking","casserole","paella"],char:'\u{1f958}',fitzpatrick_scale:!1,category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],char:'\u{1f35c}',fitzpatrick_scale:!1,category:"food_and_drink"},stew:{keywords:["food","meat","soup"],char:'\u{1f372}',fitzpatrick_scale:!1,category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"],char:'\u{1f365}',fitzpatrick_scale:!1,category:"food_and_drink"},fortune_cookie:{keywords:["food","prophecy"],char:'\u{1f960}',fitzpatrick_scale:!1,category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],char:'\u{1f363}',fitzpatrick_scale:!1,category:"food_and_drink"},bento:{keywords:["food","japanese","box"],char:'\u{1f371}',fitzpatrick_scale:!1,category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],char:'\u{1f35b}',fitzpatrick_scale:!1,category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],char:'\u{1f359}',fitzpatrick_scale:!1,category:"food_and_drink"},rice:{keywords:["food","china","asian"],char:'\u{1f35a}',fitzpatrick_scale:!1,category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],char:'\u{1f358}',fitzpatrick_scale:!1,category:"food_and_drink"},oden:{keywords:["food","japanese"],char:'\u{1f362}',fitzpatrick_scale:!1,category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],char:'\u{1f361}',fitzpatrick_scale:!1,category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],char:'\u{1f367}',fitzpatrick_scale:!1,category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],char:'\u{1f368}',fitzpatrick_scale:!1,category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],char:'\u{1f366}',fitzpatrick_scale:!1,category:"food_and_drink"},pie:{keywords:["food","dessert","pastry"],char:'\u{1f967}',fitzpatrick_scale:!1,category:"food_and_drink"},cake:{keywords:["food","dessert"],char:'\u{1f370}',fitzpatrick_scale:!1,category:"food_and_drink"},cupcake:{keywords:["food","dessert","bakery","sweet"],char:'\u{1f9c1}',fitzpatrick_scale:!1,category:"food_and_drink"},moon_cake:{keywords:["food","autumn"],char:'\u{1f96e}',fitzpatrick_scale:!1,category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],char:'\u{1f382}',fitzpatrick_scale:!1,category:"food_and_drink"},custard:{keywords:["dessert","food"],char:'\u{1f36e}',fitzpatrick_scale:!1,category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],char:'\u{1f36c}',fitzpatrick_scale:!1,category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],char:'\u{1f36d}',fitzpatrick_scale:!1,category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],char:'\u{1f36b}',fitzpatrick_scale:!1,category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],char:'\u{1f37f}',fitzpatrick_scale:!1,category:"food_and_drink"},dumpling:{keywords:["food","empanada","pierogi","potsticker"],char:'\u{1f95f}',fitzpatrick_scale:!1,category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],char:'\u{1f369}',fitzpatrick_scale:!1,category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],char:'\u{1f36a}',fitzpatrick_scale:!1,category:"food_and_drink"},milk_glass:{keywords:["beverage","drink","cow"],char:'\u{1f95b}',fitzpatrick_scale:!1,category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:'\u{1f37a}',fitzpatrick_scale:!1,category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:'\u{1f37b}',fitzpatrick_scale:!1,category:"food_and_drink"},clinking_glasses:{keywords:["beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"],char:'\u{1f942}',fitzpatrick_scale:!1,category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],char:'\u{1f377}',fitzpatrick_scale:!1,category:"food_and_drink"},tumbler_glass:{keywords:["drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"],char:'\u{1f943}',fitzpatrick_scale:!1,category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],char:'\u{1f378}',fitzpatrick_scale:!1,category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],char:'\u{1f379}',fitzpatrick_scale:!1,category:"food_and_drink"},champagne:{keywords:["drink","wine","bottle","celebration"],char:'\u{1f37e}',fitzpatrick_scale:!1,category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],char:'\u{1f376}',fitzpatrick_scale:!1,category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],char:'\u{1f375}',fitzpatrick_scale:!1,category:"food_and_drink"},cup_with_straw:{keywords:["drink","soda"],char:'\u{1f964}',fitzpatrick_scale:!1,category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],char:'\u2615',fitzpatrick_scale:!1,category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],char:'\u{1f37c}',fitzpatrick_scale:!1,category:"food_and_drink"},salt:{keywords:["condiment","shaker"],char:'\u{1f9c2}',fitzpatrick_scale:!1,category:"food_and_drink"},spoon:{keywords:["cutlery","kitchen","tableware"],char:'\u{1f944}',fitzpatrick_scale:!1,category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],char:'\u{1f374}',fitzpatrick_scale:!1,category:"food_and_drink"},plate_with_cutlery:{keywords:["food","eat","meal","lunch","dinner","restaurant"],char:'\u{1f37d}',fitzpatrick_scale:!1,category:"food_and_drink"},bowl_with_spoon:{keywords:["food","breakfast","cereal","oatmeal","porridge"],char:'\u{1f963}',fitzpatrick_scale:!1,category:"food_and_drink"},takeout_box:{keywords:["food","leftovers"],char:'\u{1f961}',fitzpatrick_scale:!1,category:"food_and_drink"},chopsticks:{keywords:["food"],char:'\u{1f962}',fitzpatrick_scale:!1,category:"food_and_drink"},soccer:{keywords:["sports","football"],char:'\u26bd',fitzpatrick_scale:!1,category:"activity"},basketball:{keywords:["sports","balls","NBA"],char:'\u{1f3c0}',fitzpatrick_scale:!1,category:"activity"},football:{keywords:["sports","balls","NFL"],char:'\u{1f3c8}',fitzpatrick_scale:!1,category:"activity"},baseball:{keywords:["sports","balls"],char:'\u26be',fitzpatrick_scale:!1,category:"activity"},softball:{keywords:["sports","balls"],char:'\u{1f94e}',fitzpatrick_scale:!1,category:"activity"},tennis:{keywords:["sports","balls","green"],char:'\u{1f3be}',fitzpatrick_scale:!1,category:"activity"},volleyball:{keywords:["sports","balls"],char:'\u{1f3d0}',fitzpatrick_scale:!1,category:"activity"},rugby_football:{keywords:["sports","team"],char:'\u{1f3c9}',fitzpatrick_scale:!1,category:"activity"},flying_disc:{keywords:["sports","frisbee","ultimate"],char:'\u{1f94f}',fitzpatrick_scale:!1,category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],char:'\u{1f3b1}',fitzpatrick_scale:!1,category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],char:'\u26f3',fitzpatrick_scale:!1,category:"activity"},golfing_woman:{keywords:["sports","business","woman","female"],char:'\u{1f3cc}\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"activity"},golfing_man:{keywords:["sports","business"],char:'\u{1f3cc}',fitzpatrick_scale:!0,category:"activity"},ping_pong:{keywords:["sports","pingpong"],char:'\u{1f3d3}',fitzpatrick_scale:!1,category:"activity"},badminton:{keywords:["sports"],char:'\u{1f3f8}',fitzpatrick_scale:!1,category:"activity"},goal_net:{keywords:["sports"],char:'\u{1f945}',fitzpatrick_scale:!1,category:"activity"},ice_hockey:{keywords:["sports"],char:'\u{1f3d2}',fitzpatrick_scale:!1,category:"activity"},field_hockey:{keywords:["sports"],char:'\u{1f3d1}',fitzpatrick_scale:!1,category:"activity"},lacrosse:{keywords:["sports","ball","stick"],char:'\u{1f94d}',fitzpatrick_scale:!1,category:"activity"},cricket:{keywords:["sports"],char:'\u{1f3cf}',fitzpatrick_scale:!1,category:"activity"},ski:{keywords:["sports","winter","cold","snow"],char:'\u{1f3bf}',fitzpatrick_scale:!1,category:"activity"},skier:{keywords:["sports","winter","snow"],char:'\u26f7',fitzpatrick_scale:!1,category:"activity"},snowboarder:{keywords:["sports","winter"],char:'\u{1f3c2}',fitzpatrick_scale:!0,category:"activity"},person_fencing:{keywords:["sports","fencing","sword"],char:'\u{1f93a}',fitzpatrick_scale:!1,category:"activity"},women_wrestling:{keywords:["sports","wrestlers"],char:'\u{1f93c}\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"activity"},men_wrestling:{keywords:["sports","wrestlers"],char:'\u{1f93c}\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"activity"},woman_cartwheeling:{keywords:["gymnastics"],char:'\u{1f938}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_cartwheeling:{keywords:["gymnastics"],char:'\u{1f938}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},woman_playing_handball:{keywords:["sports"],char:'\u{1f93e}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_playing_handball:{keywords:["sports"],char:'\u{1f93e}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},ice_skate:{keywords:["sports"],char:'\u26f8',fitzpatrick_scale:!1,category:"activity"},curling_stone:{keywords:["sports"],char:'\u{1f94c}',fitzpatrick_scale:!1,category:"activity"},skateboard:{keywords:["board"],char:'\u{1f6f9}',fitzpatrick_scale:!1,category:"activity"},sled:{keywords:["sleigh","luge","toboggan"],char:'\u{1f6f7}',fitzpatrick_scale:!1,category:"activity"},bow_and_arrow:{keywords:["sports"],char:'\u{1f3f9}',fitzpatrick_scale:!1,category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],char:'\u{1f3a3}',fitzpatrick_scale:!1,category:"activity"},boxing_glove:{keywords:["sports","fighting"],char:'\u{1f94a}',fitzpatrick_scale:!1,category:"activity"},martial_arts_uniform:{keywords:["judo","karate","taekwondo"],char:'\u{1f94b}',fitzpatrick_scale:!1,category:"activity"},rowing_woman:{keywords:["sports","hobby","water","ship","woman","female"],char:'\u{1f6a3}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},rowing_man:{keywords:["sports","hobby","water","ship"],char:'\u{1f6a3}',fitzpatrick_scale:!0,category:"activity"},climbing_woman:{keywords:["sports","hobby","woman","female","rock"],char:'\u{1f9d7}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},climbing_man:{keywords:["sports","hobby","man","male","rock"],char:'\u{1f9d7}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},swimming_woman:{keywords:["sports","exercise","human","athlete","water","summer","woman","female"],char:'\u{1f3ca}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},swimming_man:{keywords:["sports","exercise","human","athlete","water","summer"],char:'\u{1f3ca}',fitzpatrick_scale:!0,category:"activity"},woman_playing_water_polo:{keywords:["sports","pool"],char:'\u{1f93d}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_playing_water_polo:{keywords:["sports","pool"],char:'\u{1f93d}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},woman_in_lotus_position:{keywords:["woman","female","meditation","yoga","serenity","zen","mindfulness"],char:'\u{1f9d8}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_in_lotus_position:{keywords:["man","male","meditation","yoga","serenity","zen","mindfulness"],char:'\u{1f9d8}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},surfing_woman:{keywords:["sports","ocean","sea","summer","beach","woman","female"],char:'\u{1f3c4}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},surfing_man:{keywords:["sports","ocean","sea","summer","beach"],char:'\u{1f3c4}',fitzpatrick_scale:!0,category:"activity"},bath:{keywords:["clean","shower","bathroom"],char:'\u{1f6c0}',fitzpatrick_scale:!0,category:"activity"},basketball_woman:{keywords:["sports","human","woman","female"],char:'\u26f9\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},basketball_man:{keywords:["sports","human"],char:'\u26f9',fitzpatrick_scale:!0,category:"activity"},weight_lifting_woman:{keywords:["sports","training","exercise","woman","female"],char:'\u{1f3cb}\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},weight_lifting_man:{keywords:["sports","training","exercise"],char:'\u{1f3cb}',fitzpatrick_scale:!0,category:"activity"},biking_woman:{keywords:["sports","bike","exercise","hipster","woman","female"],char:'\u{1f6b4}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},biking_man:{keywords:["sports","bike","exercise","hipster"],char:'\u{1f6b4}',fitzpatrick_scale:!0,category:"activity"},mountain_biking_woman:{keywords:["transportation","sports","human","race","bike","woman","female"],char:'\u{1f6b5}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},mountain_biking_man:{keywords:["transportation","sports","human","race","bike"],char:'\u{1f6b5}',fitzpatrick_scale:!0,category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],char:'\u{1f3c7}',fitzpatrick_scale:!0,category:"activity"},business_suit_levitating:{keywords:["suit","business","levitate","hover","jump"],char:'\u{1f574}',fitzpatrick_scale:!0,category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],char:'\u{1f3c6}',fitzpatrick_scale:!1,category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],char:'\u{1f3bd}',fitzpatrick_scale:!1,category:"activity"},medal_sports:{keywords:["award","winning"],char:'\u{1f3c5}',fitzpatrick_scale:!1,category:"activity"},medal_military:{keywords:["award","winning","army"],char:'\u{1f396}',fitzpatrick_scale:!1,category:"activity"},"1st_place_medal":{keywords:["award","winning","first"],char:'\u{1f947}',fitzpatrick_scale:!1,category:"activity"},"2nd_place_medal":{keywords:["award","second"],char:'\u{1f948}',fitzpatrick_scale:!1,category:"activity"},"3rd_place_medal":{keywords:["award","third"],char:'\u{1f949}',fitzpatrick_scale:!1,category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],char:'\u{1f397}',fitzpatrick_scale:!1,category:"activity"},rosette:{keywords:["flower","decoration","military"],char:'\u{1f3f5}',fitzpatrick_scale:!1,category:"activity"},ticket:{keywords:["event","concert","pass"],char:'\u{1f3ab}',fitzpatrick_scale:!1,category:"activity"},tickets:{keywords:["sports","concert","entrance"],char:'\u{1f39f}',fitzpatrick_scale:!1,category:"activity"},performing_arts:{keywords:["acting","theater","drama"],char:'\u{1f3ad}',fitzpatrick_scale:!1,category:"activity"},art:{keywords:["design","paint","draw","colors"],char:'\u{1f3a8}',fitzpatrick_scale:!1,category:"activity"},circus_tent:{keywords:["festival","carnival","party"],char:'\u{1f3aa}',fitzpatrick_scale:!1,category:"activity"},woman_juggling:{keywords:["juggle","balance","skill","multitask"],char:'\u{1f939}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_juggling:{keywords:["juggle","balance","skill","multitask"],char:'\u{1f939}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},microphone:{keywords:["sound","music","PA","sing","talkshow"],char:'\u{1f3a4}',fitzpatrick_scale:!1,category:"activity"},headphones:{keywords:["music","score","gadgets"],char:'\u{1f3a7}',fitzpatrick_scale:!1,category:"activity"},musical_score:{keywords:["treble","clef","compose"],char:'\u{1f3bc}',fitzpatrick_scale:!1,category:"activity"},musical_keyboard:{keywords:["piano","instrument","compose"],char:'\u{1f3b9}',fitzpatrick_scale:!1,category:"activity"},drum:{keywords:["music","instrument","drumsticks","snare"],char:'\u{1f941}',fitzpatrick_scale:!1,category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],char:'\u{1f3b7}',fitzpatrick_scale:!1,category:"activity"},trumpet:{keywords:["music","brass"],char:'\u{1f3ba}',fitzpatrick_scale:!1,category:"activity"},guitar:{keywords:["music","instrument"],char:'\u{1f3b8}',fitzpatrick_scale:!1,category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],char:'\u{1f3bb}',fitzpatrick_scale:!1,category:"activity"},clapper:{keywords:["movie","film","record"],char:'\u{1f3ac}',fitzpatrick_scale:!1,category:"activity"},video_game:{keywords:["play","console","PS4","controller"],char:'\u{1f3ae}',fitzpatrick_scale:!1,category:"activity"},space_invader:{keywords:["game","arcade","play"],char:'\u{1f47e}',fitzpatrick_scale:!1,category:"activity"},dart:{keywords:["game","play","bar","target","bullseye"],char:'\u{1f3af}',fitzpatrick_scale:!1,category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],char:'\u{1f3b2}',fitzpatrick_scale:!1,category:"activity"},chess_pawn:{keywords:["expendable"],char:"\u265f",fitzpatrick_scale:!1,category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],char:'\u{1f3b0}',fitzpatrick_scale:!1,category:"activity"},jigsaw:{keywords:["interlocking","puzzle","piece"],char:'\u{1f9e9}',fitzpatrick_scale:!1,category:"activity"},bowling:{keywords:["sports","fun","play"],char:'\u{1f3b3}',fitzpatrick_scale:!1,category:"activity"},red_car:{keywords:["red","transportation","vehicle"],char:'\u{1f697}',fitzpatrick_scale:!1,category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],char:'\u{1f695}',fitzpatrick_scale:!1,category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],char:'\u{1f699}',fitzpatrick_scale:!1,category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],char:'\u{1f68c}',fitzpatrick_scale:!1,category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],char:'\u{1f68e}',fitzpatrick_scale:!1,category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],char:'\u{1f3ce}',fitzpatrick_scale:!1,category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],char:'\u{1f693}',fitzpatrick_scale:!1,category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],char:'\u{1f691}',fitzpatrick_scale:!1,category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],char:'\u{1f692}',fitzpatrick_scale:!1,category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],char:'\u{1f690}',fitzpatrick_scale:!1,category:"travel_and_places"},truck:{keywords:["cars","transportation"],char:'\u{1f69a}',fitzpatrick_scale:!1,category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],char:'\u{1f69b}',fitzpatrick_scale:!1,category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],char:'\u{1f69c}',fitzpatrick_scale:!1,category:"travel_and_places"},kick_scooter:{keywords:["vehicle","kick","razor"],char:'\u{1f6f4}',fitzpatrick_scale:!1,category:"travel_and_places"},motorcycle:{keywords:["race","sports","fast"],char:'\u{1f3cd}',fitzpatrick_scale:!1,category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],char:'\u{1f6b2}',fitzpatrick_scale:!1,category:"travel_and_places"},motor_scooter:{keywords:["vehicle","vespa","sasha"],char:'\u{1f6f5}',fitzpatrick_scale:!1,category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],char:'\u{1f6a8}',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],char:'\u{1f694}',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],char:'\u{1f68d}',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],char:'\u{1f698}',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],char:'\u{1f696}',fitzpatrick_scale:!1,category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],char:'\u{1f6a1}',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],char:'\u{1f6a0}',fitzpatrick_scale:!1,category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],char:'\u{1f69f}',fitzpatrick_scale:!1,category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],char:'\u{1f683}',fitzpatrick_scale:!1,category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],char:'\u{1f68b}',fitzpatrick_scale:!1,category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],char:'\u{1f69d}',fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],char:'\u{1f684}',fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],char:'\u{1f685}',fitzpatrick_scale:!1,category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],char:'\u{1f688}',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],char:'\u{1f69e}',fitzpatrick_scale:!1,category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],char:'\u{1f682}',fitzpatrick_scale:!1,category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],char:'\u{1f686}',fitzpatrick_scale:!1,category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],char:'\u{1f687}',fitzpatrick_scale:!1,category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],char:'\u{1f68a}',fitzpatrick_scale:!1,category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],char:'\u{1f689}',fitzpatrick_scale:!1,category:"travel_and_places"},flying_saucer:{keywords:["transportation","vehicle","ufo"],char:'\u{1f6f8}',fitzpatrick_scale:!1,category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],char:'\u{1f681}',fitzpatrick_scale:!1,category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],char:'\u{1f6e9}',fitzpatrick_scale:!1,category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],char:'\u2708\ufe0f',fitzpatrick_scale:!1,category:"travel_and_places"},flight_departure:{keywords:["airport","flight","landing"],char:'\u{1f6eb}',fitzpatrick_scale:!1,category:"travel_and_places"},flight_arrival:{keywords:["airport","flight","boarding"],char:'\u{1f6ec}',fitzpatrick_scale:!1,category:"travel_and_places"},sailboat:{keywords:["ship","summer","transportation","water","sailing"],char:'\u26f5',fitzpatrick_scale:!1,category:"travel_and_places"},motor_boat:{keywords:["ship"],char:'\u{1f6e5}',fitzpatrick_scale:!1,category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],char:'\u{1f6a4}',fitzpatrick_scale:!1,category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],char:'\u26f4',fitzpatrick_scale:!1,category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],char:'\u{1f6f3}',fitzpatrick_scale:!1,category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],char:'\u{1f680}',fitzpatrick_scale:!1,category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],char:'\u{1f6f0}',fitzpatrick_scale:!1,category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],char:'\u{1f4ba}',fitzpatrick_scale:!1,category:"travel_and_places"},canoe:{keywords:["boat","paddle","water","ship"],char:'\u{1f6f6}',fitzpatrick_scale:!1,category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],char:'\u2693',fitzpatrick_scale:!1,category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],char:'\u{1f6a7}',fitzpatrick_scale:!1,category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],char:'\u26fd',fitzpatrick_scale:!1,category:"travel_and_places"},busstop:{keywords:["transportation","wait"],char:'\u{1f68f}',fitzpatrick_scale:!1,category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],char:'\u{1f6a6}',fitzpatrick_scale:!1,category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],char:'\u{1f6a5}',fitzpatrick_scale:!1,category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],char:'\u{1f3c1}',fitzpatrick_scale:!1,category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],char:'\u{1f6a2}',fitzpatrick_scale:!1,category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],char:'\u{1f3a1}',fitzpatrick_scale:!1,category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],char:'\u{1f3a2}',fitzpatrick_scale:!1,category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],char:'\u{1f3a0}',fitzpatrick_scale:!1,category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],char:'\u{1f3d7}',fitzpatrick_scale:!1,category:"travel_and_places"},foggy:{keywords:["photo","mountain"],char:'\u{1f301}',fitzpatrick_scale:!1,category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],char:'\u{1f5fc}',fitzpatrick_scale:!1,category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],char:'\u{1f3ed}',fitzpatrick_scale:!1,category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],char:'\u26f2',fitzpatrick_scale:!1,category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],char:'\u{1f391}',fitzpatrick_scale:!1,category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],char:'\u26f0',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_snow:{keywords:["photo","nature","environment","winter","cold"],char:'\u{1f3d4}',fitzpatrick_scale:!1,category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],char:'\u{1f5fb}',fitzpatrick_scale:!1,category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],char:'\u{1f30b}',fitzpatrick_scale:!1,category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],char:'\u{1f5fe}',fitzpatrick_scale:!1,category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],char:'\u{1f3d5}',fitzpatrick_scale:!1,category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],char:'\u26fa',fitzpatrick_scale:!1,category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],char:'\u{1f3de}',fitzpatrick_scale:!1,category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],char:'\u{1f6e3}',fitzpatrick_scale:!1,category:"travel_and_places"},railway_track:{keywords:["train","transportation"],char:'\u{1f6e4}',fitzpatrick_scale:!1,category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],char:'\u{1f305}',fitzpatrick_scale:!1,category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],char:'\u{1f304}',fitzpatrick_scale:!1,category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],char:'\u{1f3dc}',fitzpatrick_scale:!1,category:"travel_and_places"},beach_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],char:'\u{1f3d6}',fitzpatrick_scale:!1,category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],char:'\u{1f3dd}',fitzpatrick_scale:!1,category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],char:'\u{1f307}',fitzpatrick_scale:!1,category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],char:'\u{1f306}',fitzpatrick_scale:!1,category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],char:'\u{1f3d9}',fitzpatrick_scale:!1,category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],char:'\u{1f303}',fitzpatrick_scale:!1,category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],char:'\u{1f309}',fitzpatrick_scale:!1,category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],char:'\u{1f30c}',fitzpatrick_scale:!1,category:"travel_and_places"},stars:{keywords:["night","photo"],char:'\u{1f320}',fitzpatrick_scale:!1,category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],char:'\u{1f387}',fitzpatrick_scale:!1,category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],char:'\u{1f386}',fitzpatrick_scale:!1,category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn_face","photo","sky","spring"],char:'\u{1f308}',fitzpatrick_scale:!1,category:"travel_and_places"},houses:{keywords:["buildings","photo"],char:'\u{1f3d8}',fitzpatrick_scale:!1,category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],char:'\u{1f3f0}',fitzpatrick_scale:!1,category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],char:'\u{1f3ef}',fitzpatrick_scale:!1,category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],char:'\u{1f3df}',fitzpatrick_scale:!1,category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],char:'\u{1f5fd}',fitzpatrick_scale:!1,category:"travel_and_places"},house:{keywords:["building","home"],char:'\u{1f3e0}',fitzpatrick_scale:!1,category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],char:'\u{1f3e1}',fitzpatrick_scale:!1,category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],char:'\u{1f3da}',fitzpatrick_scale:!1,category:"travel_and_places"},office:{keywords:["building","bureau","work"],char:'\u{1f3e2}',fitzpatrick_scale:!1,category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],char:'\u{1f3ec}',fitzpatrick_scale:!1,category:"travel_and_places"},post_office:{keywords:["building","envelope","communication"],char:'\u{1f3e3}',fitzpatrick_scale:!1,category:"travel_and_places"},european_post_office:{keywords:["building","email"],char:'\u{1f3e4}',fitzpatrick_scale:!1,category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],char:'\u{1f3e5}',fitzpatrick_scale:!1,category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],char:'\u{1f3e6}',fitzpatrick_scale:!1,category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],char:'\u{1f3e8}',fitzpatrick_scale:!1,category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],char:'\u{1f3ea}',fitzpatrick_scale:!1,category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],char:'\u{1f3eb}',fitzpatrick_scale:!1,category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],char:'\u{1f3e9}',fitzpatrick_scale:!1,category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],char:'\u{1f492}',fitzpatrick_scale:!1,category:"travel_and_places"},classical_building:{keywords:["art","culture","history"],char:'\u{1f3db}',fitzpatrick_scale:!1,category:"travel_and_places"},church:{keywords:["building","religion","christ"],char:'\u26ea',fitzpatrick_scale:!1,category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],char:'\u{1f54c}',fitzpatrick_scale:!1,category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],char:'\u{1f54d}',fitzpatrick_scale:!1,category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],char:'\u{1f54b}',fitzpatrick_scale:!1,category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],char:'\u26e9',fitzpatrick_scale:!1,category:"travel_and_places"},watch:{keywords:["time","accessories"],char:'\u231a',fitzpatrick_scale:!1,category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],char:'\u{1f4f1}',fitzpatrick_scale:!1,category:"objects"},calling:{keywords:["iphone","incoming"],char:'\u{1f4f2}',fitzpatrick_scale:!1,category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],char:'\u{1f4bb}',fitzpatrick_scale:!1,category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],char:'\u2328',fitzpatrick_scale:!1,category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],char:'\u{1f5a5}',fitzpatrick_scale:!1,category:"objects"},printer:{keywords:["paper","ink"],char:'\u{1f5a8}',fitzpatrick_scale:!1,category:"objects"},computer_mouse:{keywords:["click"],char:'\u{1f5b1}',fitzpatrick_scale:!1,category:"objects"},trackball:{keywords:["technology","trackpad"],char:'\u{1f5b2}',fitzpatrick_scale:!1,category:"objects"},joystick:{keywords:["game","play"],char:'\u{1f579}',fitzpatrick_scale:!1,category:"objects"},clamp:{keywords:["tool"],char:'\u{1f5dc}',fitzpatrick_scale:!1,category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],char:'\u{1f4bd}',fitzpatrick_scale:!1,category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],char:'\u{1f4be}',fitzpatrick_scale:!1,category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],char:'\u{1f4bf}',fitzpatrick_scale:!1,category:"objects"},dvd:{keywords:["cd","disk","disc"],char:'\u{1f4c0}',fitzpatrick_scale:!1,category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],char:'\u{1f4fc}',fitzpatrick_scale:!1,category:"objects"},camera:{keywords:["gadgets","photography"],char:'\u{1f4f7}',fitzpatrick_scale:!1,category:"objects"},camera_flash:{keywords:["photography","gadgets"],char:'\u{1f4f8}',fitzpatrick_scale:!1,category:"objects"},video_camera:{keywords:["film","record"],char:'\u{1f4f9}',fitzpatrick_scale:!1,category:"objects"},movie_camera:{keywords:["film","record"],char:'\u{1f3a5}',fitzpatrick_scale:!1,category:"objects"},film_projector:{keywords:["video","tape","record","movie"],char:'\u{1f4fd}',fitzpatrick_scale:!1,category:"objects"},film_strip:{keywords:["movie"],char:'\u{1f39e}',fitzpatrick_scale:!1,category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],char:'\u{1f4de}',fitzpatrick_scale:!1,category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],char:'\u260e\ufe0f',fitzpatrick_scale:!1,category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],char:'\u{1f4df}',fitzpatrick_scale:!1,category:"objects"},fax:{keywords:["communication","technology"],char:'\u{1f4e0}',fitzpatrick_scale:!1,category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],char:'\u{1f4fa}',fitzpatrick_scale:!1,category:"objects"},radio:{keywords:["communication","music","podcast","program"],char:'\u{1f4fb}',fitzpatrick_scale:!1,category:"objects"},studio_microphone:{keywords:["sing","recording","artist","talkshow"],char:'\u{1f399}',fitzpatrick_scale:!1,category:"objects"},level_slider:{keywords:["scale"],char:'\u{1f39a}',fitzpatrick_scale:!1,category:"objects"},control_knobs:{keywords:["dial"],char:'\u{1f39b}',fitzpatrick_scale:!1,category:"objects"},compass:{keywords:["magnetic","navigation","orienteering"],char:'\u{1f9ed}',fitzpatrick_scale:!1,category:"objects"},stopwatch:{keywords:["time","deadline"],char:'\u23f1',fitzpatrick_scale:!1,category:"objects"},timer_clock:{keywords:["alarm"],char:'\u23f2',fitzpatrick_scale:!1,category:"objects"},alarm_clock:{keywords:["time","wake"],char:'\u23f0',fitzpatrick_scale:!1,category:"objects"},mantelpiece_clock:{keywords:["time"],char:'\u{1f570}',fitzpatrick_scale:!1,category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],char:'\u23f3',fitzpatrick_scale:!1,category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],char:'\u231b',fitzpatrick_scale:!1,category:"objects"},satellite:{keywords:["communication","future","radio","space"],char:'\u{1f4e1}',fitzpatrick_scale:!1,category:"objects"},battery:{keywords:["power","energy","sustain"],char:'\u{1f50b}',fitzpatrick_scale:!1,category:"objects"},electric_plug:{keywords:["charger","power"],char:'\u{1f50c}',fitzpatrick_scale:!1,category:"objects"},bulb:{keywords:["light","electricity","idea"],char:'\u{1f4a1}',fitzpatrick_scale:!1,category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],char:'\u{1f526}',fitzpatrick_scale:!1,category:"objects"},candle:{keywords:["fire","wax"],char:'\u{1f56f}',fitzpatrick_scale:!1,category:"objects"},fire_extinguisher:{keywords:["quench"],char:'\u{1f9ef}',fitzpatrick_scale:!1,category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],char:'\u{1f5d1}',fitzpatrick_scale:!1,category:"objects"},oil_drum:{keywords:["barrell"],char:'\u{1f6e2}',fitzpatrick_scale:!1,category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],char:'\u{1f4b8}',fitzpatrick_scale:!1,category:"objects"},dollar:{keywords:["money","sales","bill","currency"],char:'\u{1f4b5}',fitzpatrick_scale:!1,category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],char:'\u{1f4b4}',fitzpatrick_scale:!1,category:"objects"},euro:{keywords:["money","sales","dollar","currency"],char:'\u{1f4b6}',fitzpatrick_scale:!1,category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],char:'\u{1f4b7}',fitzpatrick_scale:!1,category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],char:'\u{1f4b0}',fitzpatrick_scale:!1,category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],char:'\u{1f4b3}',fitzpatrick_scale:!1,category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],char:'\u{1f48e}',fitzpatrick_scale:!1,category:"objects"},balance_scale:{keywords:["law","fairness","weight"],char:'\u2696',fitzpatrick_scale:!1,category:"objects"},toolbox:{keywords:["tools","diy","fix","maintainer","mechanic"],char:'\u{1f9f0}',fitzpatrick_scale:!1,category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],char:'\u{1f527}',fitzpatrick_scale:!1,category:"objects"},hammer:{keywords:["tools","build","create"],char:'\u{1f528}',fitzpatrick_scale:!1,category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],char:'\u2692',fitzpatrick_scale:!1,category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],char:'\u{1f6e0}',fitzpatrick_scale:!1,category:"objects"},pick:{keywords:["tools","dig"],char:'\u26cf',fitzpatrick_scale:!1,category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],char:'\u{1f529}',fitzpatrick_scale:!1,category:"objects"},gear:{keywords:["cog"],char:'\u2699',fitzpatrick_scale:!1,category:"objects"},brick:{keywords:["bricks"],char:'\u{1f9f1}',fitzpatrick_scale:!1,category:"objects"},chains:{keywords:["lock","arrest"],char:'\u26d3',fitzpatrick_scale:!1,category:"objects"},magnet:{keywords:["attraction","magnetic"],char:'\u{1f9f2}',fitzpatrick_scale:!1,category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],char:'\u{1f52b}',fitzpatrick_scale:!1,category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],char:'\u{1f4a3}',fitzpatrick_scale:!1,category:"objects"},firecracker:{keywords:["dynamite","boom","explode","explosion","explosive"],char:'\u{1f9e8}',fitzpatrick_scale:!1,category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],char:'\u{1f52a}',fitzpatrick_scale:!1,category:"objects"},dagger:{keywords:["weapon"],char:'\u{1f5e1}',fitzpatrick_scale:!1,category:"objects"},crossed_swords:{keywords:["weapon"],char:'\u2694',fitzpatrick_scale:!1,category:"objects"},shield:{keywords:["protection","security"],char:'\u{1f6e1}',fitzpatrick_scale:!1,category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],char:'\u{1f6ac}',fitzpatrick_scale:!1,category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary","death","pirate","evil"],char:'\u2620',fitzpatrick_scale:!1,category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],char:'\u26b0',fitzpatrick_scale:!1,category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],char:'\u26b1',fitzpatrick_scale:!1,category:"objects"},amphora:{keywords:["vase","jar"],char:'\u{1f3fa}',fitzpatrick_scale:!1,category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],char:'\u{1f52e}',fitzpatrick_scale:!1,category:"objects"},prayer_beads:{keywords:["dhikr","religious"],char:'\u{1f4ff}',fitzpatrick_scale:!1,category:"objects"},nazar_amulet:{keywords:["bead","charm"],char:'\u{1f9ff}',fitzpatrick_scale:!1,category:"objects"},barber:{keywords:["hair","salon","style"],char:'\u{1f488}',fitzpatrick_scale:!1,category:"objects"},alembic:{keywords:["distilling","science","experiment","chemistry"],char:'\u2697',fitzpatrick_scale:!1,category:"objects"},telescope:{keywords:["stars","space","zoom","science","astronomy"],char:'\u{1f52d}',fitzpatrick_scale:!1,category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],char:'\u{1f52c}',fitzpatrick_scale:!1,category:"objects"},hole:{keywords:["embarrassing"],char:'\u{1f573}',fitzpatrick_scale:!1,category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],char:'\u{1f48a}',fitzpatrick_scale:!1,category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],char:'\u{1f489}',fitzpatrick_scale:!1,category:"objects"},dna:{keywords:["biologist","genetics","life"],char:'\u{1f9ec}',fitzpatrick_scale:!1,category:"objects"},microbe:{keywords:["amoeba","bacteria","germs"],char:'\u{1f9a0}',fitzpatrick_scale:!1,category:"objects"},petri_dish:{keywords:["bacteria","biology","culture","lab"],char:'\u{1f9eb}',fitzpatrick_scale:!1,category:"objects"},test_tube:{keywords:["chemistry","experiment","lab","science"],char:'\u{1f9ea}',fitzpatrick_scale:!1,category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],char:'\u{1f321}',fitzpatrick_scale:!1,category:"objects"},broom:{keywords:["cleaning","sweeping","witch"],char:'\u{1f9f9}',fitzpatrick_scale:!1,category:"objects"},basket:{keywords:["laundry"],char:'\u{1f9fa}',fitzpatrick_scale:!1,category:"objects"},toilet_paper:{keywords:["roll"],char:'\u{1f9fb}',fitzpatrick_scale:!1,category:"objects"},label:{keywords:["sale","tag"],char:'\u{1f3f7}',fitzpatrick_scale:!1,category:"objects"},bookmark:{keywords:["favorite","label","save"],char:'\u{1f516}',fitzpatrick_scale:!1,category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],char:'\u{1f6bd}',fitzpatrick_scale:!1,category:"objects"},shower:{keywords:["clean","water","bathroom"],char:'\u{1f6bf}',fitzpatrick_scale:!1,category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],char:'\u{1f6c1}',fitzpatrick_scale:!1,category:"objects"},soap:{keywords:["bar","bathing","cleaning","lather"],char:'\u{1f9fc}',fitzpatrick_scale:!1,category:"objects"},sponge:{keywords:["absorbing","cleaning","porous"],char:'\u{1f9fd}',fitzpatrick_scale:!1,category:"objects"},lotion_bottle:{keywords:["moisturizer","sunscreen"],char:'\u{1f9f4}',fitzpatrick_scale:!1,category:"objects"},key:{keywords:["lock","door","password"],char:'\u{1f511}',fitzpatrick_scale:!1,category:"objects"},old_key:{keywords:["lock","door","password"],char:'\u{1f5dd}',fitzpatrick_scale:!1,category:"objects"},couch_and_lamp:{keywords:["read","chill"],char:'\u{1f6cb}',fitzpatrick_scale:!1,category:"objects"},sleeping_bed:{keywords:["bed","rest"],char:'\u{1f6cc}',fitzpatrick_scale:!0,category:"objects"},bed:{keywords:["sleep","rest"],char:'\u{1f6cf}',fitzpatrick_scale:!1,category:"objects"},door:{keywords:["house","entry","exit"],char:'\u{1f6aa}',fitzpatrick_scale:!1,category:"objects"},bellhop_bell:{keywords:["service"],char:'\u{1f6ce}',fitzpatrick_scale:!1,category:"objects"},teddy_bear:{keywords:["plush","stuffed"],char:'\u{1f9f8}',fitzpatrick_scale:!1,category:"objects"},framed_picture:{keywords:["photography"],char:'\u{1f5bc}',fitzpatrick_scale:!1,category:"objects"},world_map:{keywords:["location","direction"],char:'\u{1f5fa}',fitzpatrick_scale:!1,category:"objects"},parasol_on_ground:{keywords:["weather","summer"],char:'\u26f1',fitzpatrick_scale:!1,category:"objects"},moyai:{keywords:["rock","easter island","moai"],char:'\u{1f5ff}',fitzpatrick_scale:!1,category:"objects"},shopping:{keywords:["mall","buy","purchase"],char:'\u{1f6cd}',fitzpatrick_scale:!1,category:"objects"},shopping_cart:{keywords:["trolley"],char:'\u{1f6d2}',fitzpatrick_scale:!1,category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],char:'\u{1f388}',fitzpatrick_scale:!1,category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],char:'\u{1f38f}',fitzpatrick_scale:!1,category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],char:'\u{1f380}',fitzpatrick_scale:!1,category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],char:'\u{1f381}',fitzpatrick_scale:!1,category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],char:'\u{1f38a}',fitzpatrick_scale:!1,category:"objects"},tada:{keywords:["party","congratulations","birthday","magic","circus","celebration"],char:'\u{1f389}',fitzpatrick_scale:!1,category:"objects"},dolls:{keywords:["japanese","toy","kimono"],char:'\u{1f38e}',fitzpatrick_scale:!1,category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],char:'\u{1f390}',fitzpatrick_scale:!1,category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],char:'\u{1f38c}',fitzpatrick_scale:!1,category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],char:'\u{1f3ee}',fitzpatrick_scale:!1,category:"objects"},red_envelope:{keywords:["gift"],char:'\u{1f9e7}',fitzpatrick_scale:!1,category:"objects"},email:{keywords:["letter","postal","inbox","communication"],char:'\u2709\ufe0f',fitzpatrick_scale:!1,category:"objects"},envelope_with_arrow:{keywords:["email","communication"],char:'\u{1f4e9}',fitzpatrick_scale:!1,category:"objects"},incoming_envelope:{keywords:["email","inbox"],char:'\u{1f4e8}',fitzpatrick_scale:!1,category:"objects"},"e-mail":{keywords:["communication","inbox"],char:'\u{1f4e7}',fitzpatrick_scale:!1,category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],char:'\u{1f48c}',fitzpatrick_scale:!1,category:"objects"},postbox:{keywords:["email","letter","envelope"],char:'\u{1f4ee}',fitzpatrick_scale:!1,category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],char:'\u{1f4ea}',fitzpatrick_scale:!1,category:"objects"},mailbox:{keywords:["email","inbox","communication"],char:'\u{1f4eb}',fitzpatrick_scale:!1,category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],char:'\u{1f4ec}',fitzpatrick_scale:!1,category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],char:'\u{1f4ed}',fitzpatrick_scale:!1,category:"objects"},package:{keywords:["mail","gift","cardboard","box","moving"],char:'\u{1f4e6}',fitzpatrick_scale:!1,category:"objects"},postal_horn:{keywords:["instrument","music"],char:'\u{1f4ef}',fitzpatrick_scale:!1,category:"objects"},inbox_tray:{keywords:["email","documents"],char:'\u{1f4e5}',fitzpatrick_scale:!1,category:"objects"},outbox_tray:{keywords:["inbox","email"],char:'\u{1f4e4}',fitzpatrick_scale:!1,category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],char:'\u{1f4dc}',fitzpatrick_scale:!1,category:"objects"},page_with_curl:{keywords:["documents","office","paper"],char:'\u{1f4c3}',fitzpatrick_scale:!1,category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],char:'\u{1f4d1}',fitzpatrick_scale:!1,category:"objects"},receipt:{keywords:["accounting","expenses"],char:'\u{1f9fe}',fitzpatrick_scale:!1,category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],char:'\u{1f4ca}',fitzpatrick_scale:!1,category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],char:'\u{1f4c8}',fitzpatrick_scale:!1,category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],char:'\u{1f4c9}',fitzpatrick_scale:!1,category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],char:'\u{1f4c4}',fitzpatrick_scale:!1,category:"objects"},date:{keywords:["calendar","schedule"],char:'\u{1f4c5}',fitzpatrick_scale:!1,category:"objects"},calendar:{keywords:["schedule","date","planning"],char:'\u{1f4c6}',fitzpatrick_scale:!1,category:"objects"},spiral_calendar:{keywords:["date","schedule","planning"],char:'\u{1f5d3}',fitzpatrick_scale:!1,category:"objects"},card_index:{keywords:["business","stationery"],char:'\u{1f4c7}',fitzpatrick_scale:!1,category:"objects"},card_file_box:{keywords:["business","stationery"],char:'\u{1f5c3}',fitzpatrick_scale:!1,category:"objects"},ballot_box:{keywords:["election","vote"],char:'\u{1f5f3}',fitzpatrick_scale:!1,category:"objects"},file_cabinet:{keywords:["filing","organizing"],char:'\u{1f5c4}',fitzpatrick_scale:!1,category:"objects"},clipboard:{keywords:["stationery","documents"],char:'\u{1f4cb}',fitzpatrick_scale:!1,category:"objects"},spiral_notepad:{keywords:["memo","stationery"],char:'\u{1f5d2}',fitzpatrick_scale:!1,category:"objects"},file_folder:{keywords:["documents","business","office"],char:'\u{1f4c1}',fitzpatrick_scale:!1,category:"objects"},open_file_folder:{keywords:["documents","load"],char:'\u{1f4c2}',fitzpatrick_scale:!1,category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],char:'\u{1f5c2}',fitzpatrick_scale:!1,category:"objects"},newspaper_roll:{keywords:["press","headline"],char:'\u{1f5de}',fitzpatrick_scale:!1,category:"objects"},newspaper:{keywords:["press","headline"],char:'\u{1f4f0}',fitzpatrick_scale:!1,category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],char:'\u{1f4d3}',fitzpatrick_scale:!1,category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],char:'\u{1f4d5}',fitzpatrick_scale:!1,category:"objects"},green_book:{keywords:["read","library","knowledge","study"],char:'\u{1f4d7}',fitzpatrick_scale:!1,category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],char:'\u{1f4d8}',fitzpatrick_scale:!1,category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],char:'\u{1f4d9}',fitzpatrick_scale:!1,category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],char:'\u{1f4d4}',fitzpatrick_scale:!1,category:"objects"},ledger:{keywords:["notes","paper"],char:'\u{1f4d2}',fitzpatrick_scale:!1,category:"objects"},books:{keywords:["literature","library","study"],char:'\u{1f4da}',fitzpatrick_scale:!1,category:"objects"},open_book:{keywords:["book","read","library","knowledge","literature","learn","study"],char:'\u{1f4d6}',fitzpatrick_scale:!1,category:"objects"},safety_pin:{keywords:["diaper"],char:'\u{1f9f7}',fitzpatrick_scale:!1,category:"objects"},link:{keywords:["rings","url"],char:'\u{1f517}',fitzpatrick_scale:!1,category:"objects"},paperclip:{keywords:["documents","stationery"],char:'\u{1f4ce}',fitzpatrick_scale:!1,category:"objects"},paperclips:{keywords:["documents","stationery"],char:'\u{1f587}',fitzpatrick_scale:!1,category:"objects"},scissors:{keywords:["stationery","cut"],char:'\u2702\ufe0f',fitzpatrick_scale:!1,category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],char:'\u{1f4d0}',fitzpatrick_scale:!1,category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],char:'\u{1f4cf}',fitzpatrick_scale:!1,category:"objects"},abacus:{keywords:["calculation"],char:'\u{1f9ee}',fitzpatrick_scale:!1,category:"objects"},pushpin:{keywords:["stationery","mark","here"],char:'\u{1f4cc}',fitzpatrick_scale:!1,category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],char:'\u{1f4cd}',fitzpatrick_scale:!1,category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],char:'\u{1f6a9}',fitzpatrick_scale:!1,category:"objects"},white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],char:'\u{1f3f3}',fitzpatrick_scale:!1,category:"objects"},black_flag:{keywords:["pirate"],char:'\u{1f3f4}',fitzpatrick_scale:!1,category:"objects"},rainbow_flag:{keywords:["flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"],char:'\u{1f3f3}\ufe0f\u200d\u{1f308}',fitzpatrick_scale:!1,category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],char:'\u{1f510}',fitzpatrick_scale:!1,category:"objects"},lock:{keywords:["security","password","padlock"],char:'\u{1f512}',fitzpatrick_scale:!1,category:"objects"},unlock:{keywords:["privacy","security"],char:'\u{1f513}',fitzpatrick_scale:!1,category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],char:'\u{1f50f}',fitzpatrick_scale:!1,category:"objects"},pen:{keywords:["stationery","writing","write"],char:'\u{1f58a}',fitzpatrick_scale:!1,category:"objects"},fountain_pen:{keywords:["stationery","writing","write"],char:'\u{1f58b}',fitzpatrick_scale:!1,category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],char:'\u2712\ufe0f',fitzpatrick_scale:!1,category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"],char:'\u{1f4dd}',fitzpatrick_scale:!1,category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],char:'\u270f\ufe0f',fitzpatrick_scale:!1,category:"objects"},crayon:{keywords:["drawing","creativity"],char:'\u{1f58d}',fitzpatrick_scale:!1,category:"objects"},paintbrush:{keywords:["drawing","creativity","art"],char:'\u{1f58c}',fitzpatrick_scale:!1,category:"objects"},mag:{keywords:["search","zoom","find","detective"],char:'\u{1f50d}',fitzpatrick_scale:!1,category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],char:'\u{1f50e}',fitzpatrick_scale:!1,category:"objects"},heart:{keywords:["love","like","valentines"],char:'\u2764\ufe0f',fitzpatrick_scale:!1,category:"symbols"},orange_heart:{keywords:["love","like","affection","valentines"],char:'\u{1f9e1}',fitzpatrick_scale:!1,category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],char:'\u{1f49b}',fitzpatrick_scale:!1,category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],char:'\u{1f49a}',fitzpatrick_scale:!1,category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],char:'\u{1f499}',fitzpatrick_scale:!1,category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],char:'\u{1f49c}',fitzpatrick_scale:!1,category:"symbols"},black_heart:{keywords:["evil"],char:'\u{1f5a4}',fitzpatrick_scale:!1,category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],char:'\u{1f494}',fitzpatrick_scale:!1,category:"symbols"},heavy_heart_exclamation:{keywords:["decoration","love"],char:'\u2763',fitzpatrick_scale:!1,category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],char:'\u{1f495}',fitzpatrick_scale:!1,category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],char:'\u{1f49e}',fitzpatrick_scale:!1,category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],char:'\u{1f493}',fitzpatrick_scale:!1,category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],char:'\u{1f497}',fitzpatrick_scale:!1,category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],char:'\u{1f496}',fitzpatrick_scale:!1,category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],char:'\u{1f498}',fitzpatrick_scale:!1,category:"symbols"},gift_heart:{keywords:["love","valentines"],char:'\u{1f49d}',fitzpatrick_scale:!1,category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],char:'\u{1f49f}',fitzpatrick_scale:!1,category:"symbols"},peace_symbol:{keywords:["hippie"],char:'\u262e',fitzpatrick_scale:!1,category:"symbols"},latin_cross:{keywords:["christianity"],char:'\u271d',fitzpatrick_scale:!1,category:"symbols"},star_and_crescent:{keywords:["islam"],char:'\u262a',fitzpatrick_scale:!1,category:"symbols"},om:{keywords:["hinduism","buddhism","sikhism","jainism"],char:'\u{1f549}',fitzpatrick_scale:!1,category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],char:'\u2638',fitzpatrick_scale:!1,category:"symbols"},star_of_david:{keywords:["judaism"],char:'\u2721',fitzpatrick_scale:!1,category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],char:'\u{1f52f}',fitzpatrick_scale:!1,category:"symbols"},menorah:{keywords:["hanukkah","candles","jewish"],char:'\u{1f54e}',fitzpatrick_scale:!1,category:"symbols"},yin_yang:{keywords:["balance"],char:'\u262f',fitzpatrick_scale:!1,category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],char:'\u2626',fitzpatrick_scale:!1,category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],char:'\u{1f6d0}',fitzpatrick_scale:!1,category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],char:'\u26ce',fitzpatrick_scale:!1,category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],char:'\u2648',fitzpatrick_scale:!1,category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],char:'\u2649',fitzpatrick_scale:!1,category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u264a',fitzpatrick_scale:!1,category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u264b',fitzpatrick_scale:!1,category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],char:'\u264c',fitzpatrick_scale:!1,category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u264d',fitzpatrick_scale:!1,category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],char:'\u264e',fitzpatrick_scale:!1,category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],char:'\u264f',fitzpatrick_scale:!1,category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u2650',fitzpatrick_scale:!1,category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u2651',fitzpatrick_scale:!1,category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],char:'\u2652',fitzpatrick_scale:!1,category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],char:'\u2653',fitzpatrick_scale:!1,category:"symbols"},id:{keywords:["purple-square","words"],char:'\u{1f194}',fitzpatrick_scale:!1,category:"symbols"},atom_symbol:{keywords:["science","physics","chemistry"],char:'\u269b',fitzpatrick_scale:!1,category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],char:'\u{1f233}',fitzpatrick_scale:!1,category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],char:'\u{1f239}',fitzpatrick_scale:!1,category:"symbols"},radioactive:{keywords:["nuclear","danger"],char:'\u2622',fitzpatrick_scale:!1,category:"symbols"},biohazard:{keywords:["danger"],char:'\u2623',fitzpatrick_scale:!1,category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],char:'\u{1f4f4}',fitzpatrick_scale:!1,category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],char:'\u{1f4f3}',fitzpatrick_scale:!1,category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],char:'\u{1f236}',fitzpatrick_scale:!1,category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],char:'\u{1f21a}',fitzpatrick_scale:!1,category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],char:'\u{1f238}',fitzpatrick_scale:!1,category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],char:'\u{1f23a}',fitzpatrick_scale:!1,category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],char:'\u{1f237}\ufe0f',fitzpatrick_scale:!1,category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],char:'\u2734\ufe0f',fitzpatrick_scale:!1,category:"symbols"},vs:{keywords:["words","orange-square"],char:'\u{1f19a}',fitzpatrick_scale:!1,category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],char:'\u{1f251}',fitzpatrick_scale:!1,category:"symbols"},white_flower:{keywords:["japanese","spring"],char:'\u{1f4ae}',fitzpatrick_scale:!1,category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],char:'\u{1f250}',fitzpatrick_scale:!1,category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],char:'\u3299\ufe0f',fitzpatrick_scale:!1,category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],char:'\u3297\ufe0f',fitzpatrick_scale:!1,category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],char:'\u{1f234}',fitzpatrick_scale:!1,category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],char:'\u{1f235}',fitzpatrick_scale:!1,category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],char:'\u{1f232}',fitzpatrick_scale:!1,category:"symbols"},a:{keywords:["red-square","alphabet","letter"],char:'\u{1f170}\ufe0f',fitzpatrick_scale:!1,category:"symbols"},b:{keywords:["red-square","alphabet","letter"],char:'\u{1f171}\ufe0f',fitzpatrick_scale:!1,category:"symbols"},ab:{keywords:["red-square","alphabet"],char:'\u{1f18e}',fitzpatrick_scale:!1,category:"symbols"},cl:{keywords:["alphabet","words","red-square"],char:'\u{1f191}',fitzpatrick_scale:!1,category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],char:'\u{1f17e}\ufe0f',fitzpatrick_scale:!1,category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],char:'\u{1f198}',fitzpatrick_scale:!1,category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],char:'\u26d4',fitzpatrick_scale:!1,category:"symbols"},name_badge:{keywords:["fire","forbid"],char:'\u{1f4db}',fitzpatrick_scale:!1,category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],char:'\u{1f6ab}',fitzpatrick_scale:!1,category:"symbols"},x:{keywords:["no","delete","remove","cancel","red"],char:'\u274c',fitzpatrick_scale:!1,category:"symbols"},o:{keywords:["circle","round"],char:'\u2b55',fitzpatrick_scale:!1,category:"symbols"},stop_sign:{keywords:["stop"],char:'\u{1f6d1}',fitzpatrick_scale:!1,category:"symbols"},anger:{keywords:["angry","mad"],char:'\u{1f4a2}',fitzpatrick_scale:!1,category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],char:'\u2668\ufe0f',fitzpatrick_scale:!1,category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],char:'\u{1f6b7}',fitzpatrick_scale:!1,category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],char:'\u{1f6af}',fitzpatrick_scale:!1,category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],char:'\u{1f6b3}',fitzpatrick_scale:!1,category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],char:'\u{1f6b1}',fitzpatrick_scale:!1,category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],char:'\u{1f51e}',fitzpatrick_scale:!1,category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],char:'\u{1f4f5}',fitzpatrick_scale:!1,category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],char:'\u2757',fitzpatrick_scale:!1,category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],char:'\u2755',fitzpatrick_scale:!1,category:"symbols"},question:{keywords:["doubt","confused"],char:'\u2753',fitzpatrick_scale:!1,category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],char:'\u2754',fitzpatrick_scale:!1,category:"symbols"},bangbang:{keywords:["exclamation","surprise"],char:'\u203c\ufe0f',fitzpatrick_scale:!1,category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],char:'\u2049\ufe0f',fitzpatrick_scale:!1,category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],char:'\u{1f505}',fitzpatrick_scale:!1,category:"symbols"},high_brightness:{keywords:["sun","light"],char:'\u{1f506}',fitzpatrick_scale:!1,category:"symbols"},trident:{keywords:["weapon","spear"],char:'\u{1f531}',fitzpatrick_scale:!1,category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],char:'\u269c',fitzpatrick_scale:!1,category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],char:'\u303d\ufe0f',fitzpatrick_scale:!1,category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],char:'\u26a0\ufe0f',fitzpatrick_scale:!1,category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],char:'\u{1f6b8}',fitzpatrick_scale:!1,category:"symbols"},beginner:{keywords:["badge","shield"],char:'\u{1f530}',fitzpatrick_scale:!1,category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],char:'\u267b\ufe0f',fitzpatrick_scale:!1,category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],char:'\u{1f22f}',fitzpatrick_scale:!1,category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],char:'\u{1f4b9}',fitzpatrick_scale:!1,category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],char:'\u2747\ufe0f',fitzpatrick_scale:!1,category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],char:'\u2733\ufe0f',fitzpatrick_scale:!1,category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],char:'\u274e',fitzpatrick_scale:!1,category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer","tick"],char:'\u2705',fitzpatrick_scale:!1,category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],char:'\u{1f4a0}',fitzpatrick_scale:!1,category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],char:'\u{1f300}',fitzpatrick_scale:!1,category:"symbols"},loop:{keywords:["tape","cassette"],char:'\u27bf',fitzpatrick_scale:!1,category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],char:'\u{1f310}',fitzpatrick_scale:!1,category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],char:'\u24c2\ufe0f',fitzpatrick_scale:!1,category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],char:'\u{1f3e7}',fitzpatrick_scale:!1,category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],char:'\u{1f202}\ufe0f',fitzpatrick_scale:!1,category:"symbols"},passport_control:{keywords:["custom","blue-square"],char:'\u{1f6c2}',fitzpatrick_scale:!1,category:"symbols"},customs:{keywords:["passport","border","blue-square"],char:'\u{1f6c3}',fitzpatrick_scale:!1,category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],char:'\u{1f6c4}',fitzpatrick_scale:!1,category:"symbols"},left_luggage:{keywords:["blue-square","travel"],char:'\u{1f6c5}',fitzpatrick_scale:!1,category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],char:'\u267f',fitzpatrick_scale:!1,category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],char:'\u{1f6ad}',fitzpatrick_scale:!1,category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],char:'\u{1f6be}',fitzpatrick_scale:!1,category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],char:'\u{1f17f}\ufe0f',fitzpatrick_scale:!1,category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],char:'\u{1f6b0}',fitzpatrick_scale:!1,category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],char:'\u{1f6b9}',fitzpatrick_scale:!1,category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],char:'\u{1f6ba}',fitzpatrick_scale:!1,category:"symbols"},baby_symbol:{keywords:["orange-square","child"],char:'\u{1f6bc}',fitzpatrick_scale:!1,category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],char:'\u{1f6bb}',fitzpatrick_scale:!1,category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],char:'\u{1f6ae}',fitzpatrick_scale:!1,category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],char:'\u{1f3a6}',fitzpatrick_scale:!1,category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],char:'\u{1f4f6}',fitzpatrick_scale:!1,category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],char:'\u{1f201}',fitzpatrick_scale:!1,category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],char:'\u{1f196}',fitzpatrick_scale:!1,category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],char:'\u{1f197}',fitzpatrick_scale:!1,category:"symbols"},up:{keywords:["blue-square","above","high"],char:'\u{1f199}',fitzpatrick_scale:!1,category:"symbols"},cool:{keywords:["words","blue-square"],char:'\u{1f192}',fitzpatrick_scale:!1,category:"symbols"},new:{keywords:["blue-square","words","start"],char:'\u{1f195}',fitzpatrick_scale:!1,category:"symbols"},free:{keywords:["blue-square","words"],char:'\u{1f193}',fitzpatrick_scale:!1,category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],char:'0\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},one:{keywords:["blue-square","numbers","1"],char:'1\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],char:'2\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],char:'3\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},four:{keywords:["4","numbers","blue-square"],char:'4\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],char:'5\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},six:{keywords:["6","numbers","blue-square"],char:'6\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],char:'7\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},eight:{keywords:["8","blue-square","numbers"],char:'8\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},nine:{keywords:["blue-square","numbers","9"],char:'9\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],char:'\u{1f51f}',fitzpatrick_scale:!1,category:"symbols"},asterisk:{keywords:["star","keycap"],char:'*\u20e3',fitzpatrick_scale:!1,category:"symbols"},eject_button:{keywords:["blue-square"],char:'\u23cf\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],char:'\u25b6\ufe0f',fitzpatrick_scale:!1,category:"symbols"},pause_button:{keywords:["pause","blue-square"],char:'\u23f8',fitzpatrick_scale:!1,category:"symbols"},next_track_button:{keywords:["forward","next","blue-square"],char:'\u23ed',fitzpatrick_scale:!1,category:"symbols"},stop_button:{keywords:["blue-square"],char:'\u23f9',fitzpatrick_scale:!1,category:"symbols"},record_button:{keywords:["blue-square"],char:'\u23fa',fitzpatrick_scale:!1,category:"symbols"},play_or_pause_button:{keywords:["blue-square","play","pause"],char:'\u23ef',fitzpatrick_scale:!1,category:"symbols"},previous_track_button:{keywords:["backward"],char:'\u23ee',fitzpatrick_scale:!1,category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],char:'\u23e9',fitzpatrick_scale:!1,category:"symbols"},rewind:{keywords:["play","blue-square"],char:'\u23ea',fitzpatrick_scale:!1,category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],char:'\u{1f500}',fitzpatrick_scale:!1,category:"symbols"},repeat:{keywords:["loop","record"],char:'\u{1f501}',fitzpatrick_scale:!1,category:"symbols"},repeat_one:{keywords:["blue-square","loop"],char:'\u{1f502}',fitzpatrick_scale:!1,category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],char:'\u25c0\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],char:'\u{1f53c}',fitzpatrick_scale:!1,category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],char:'\u{1f53d}',fitzpatrick_scale:!1,category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],char:'\u23eb',fitzpatrick_scale:!1,category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],char:'\u23ec',fitzpatrick_scale:!1,category:"symbols"},arrow_right:{keywords:["blue-square","next"],char:'\u27a1\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],char:'\u2b05\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],char:'\u2b06\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],char:'\u2b07\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],char:'\u2197\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],char:'\u2198\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],char:'\u2199\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],char:'\u2196\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],char:'\u2195\ufe0f',fitzpatrick_scale:!1,category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],char:'\u2194\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],char:'\u{1f504}',fitzpatrick_scale:!1,category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],char:'\u21aa\ufe0f',fitzpatrick_scale:!1,category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],char:'\u21a9\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],char:'\u2934\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],char:'\u2935\ufe0f',fitzpatrick_scale:!1,category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],char:'#\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],char:'\u2139\ufe0f',fitzpatrick_scale:!1,category:"symbols"},abc:{keywords:["blue-square","alphabet"],char:'\u{1f524}',fitzpatrick_scale:!1,category:"symbols"},abcd:{keywords:["blue-square","alphabet"],char:'\u{1f521}',fitzpatrick_scale:!1,category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],char:'\u{1f520}',fitzpatrick_scale:!1,category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],char:'\u{1f523}',fitzpatrick_scale:!1,category:"symbols"},musical_note:{keywords:["score","tone","sound"],char:'\u{1f3b5}',fitzpatrick_scale:!1,category:"symbols"},notes:{keywords:["music","score"],char:'\u{1f3b6}',fitzpatrick_scale:!1,category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],char:'\u3030\ufe0f',fitzpatrick_scale:!1,category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],char:'\u27b0',fitzpatrick_scale:!1,category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],char:'\u2714\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],char:'\u{1f503}',fitzpatrick_scale:!1,category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],char:'\u2795',fitzpatrick_scale:!1,category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],char:'\u2796',fitzpatrick_scale:!1,category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],char:'\u2797',fitzpatrick_scale:!1,category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],char:'\u2716\ufe0f',fitzpatrick_scale:!1,category:"symbols"},infinity:{keywords:["forever"],char:'\u267e',fitzpatrick_scale:!1,category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],char:'\u{1f4b2}',fitzpatrick_scale:!1,category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],char:'\u{1f4b1}',fitzpatrick_scale:!1,category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],char:'\xa9\ufe0f',fitzpatrick_scale:!1,category:"symbols"},registered:{keywords:["alphabet","circle"],char:'\xae\ufe0f',fitzpatrick_scale:!1,category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],char:'\u2122\ufe0f',fitzpatrick_scale:!1,category:"symbols"},end:{keywords:["words","arrow"],char:'\u{1f51a}',fitzpatrick_scale:!1,category:"symbols"},back:{keywords:["arrow","words","return"],char:'\u{1f519}',fitzpatrick_scale:!1,category:"symbols"},on:{keywords:["arrow","words"],char:'\u{1f51b}',fitzpatrick_scale:!1,category:"symbols"},top:{keywords:["words","blue-square"],char:'\u{1f51d}',fitzpatrick_scale:!1,category:"symbols"},soon:{keywords:["arrow","words"],char:'\u{1f51c}',fitzpatrick_scale:!1,category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes","tick"],char:'\u2611\ufe0f',fitzpatrick_scale:!1,category:"symbols"},radio_button:{keywords:["input","old","music","circle"],char:'\u{1f518}',fitzpatrick_scale:!1,category:"symbols"},white_circle:{keywords:["shape","round"],char:'\u26aa',fitzpatrick_scale:!1,category:"symbols"},black_circle:{keywords:["shape","button","round"],char:'\u26ab',fitzpatrick_scale:!1,category:"symbols"},red_circle:{keywords:["shape","error","danger"],char:'\u{1f534}',fitzpatrick_scale:!1,category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],char:'\u{1f535}',fitzpatrick_scale:!1,category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],char:'\u{1f538}',fitzpatrick_scale:!1,category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],char:'\u{1f539}',fitzpatrick_scale:!1,category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],char:'\u{1f536}',fitzpatrick_scale:!1,category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],char:'\u{1f537}',fitzpatrick_scale:!1,category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],char:'\u{1f53a}',fitzpatrick_scale:!1,category:"symbols"},black_small_square:{keywords:["shape","icon"],char:'\u25aa\ufe0f',fitzpatrick_scale:!1,category:"symbols"},white_small_square:{keywords:["shape","icon"],char:'\u25ab\ufe0f',fitzpatrick_scale:!1,category:"symbols"},black_large_square:{keywords:["shape","icon","button"],char:'\u2b1b',fitzpatrick_scale:!1,category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],char:'\u2b1c',fitzpatrick_scale:!1,category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],char:'\u{1f53b}',fitzpatrick_scale:!1,category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],char:'\u25fc\ufe0f',fitzpatrick_scale:!1,category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],char:'\u25fb\ufe0f',fitzpatrick_scale:!1,category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],char:'\u25fe',fitzpatrick_scale:!1,category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],char:'\u25fd',fitzpatrick_scale:!1,category:"symbols"},black_square_button:{keywords:["shape","input","frame"],char:'\u{1f532}',fitzpatrick_scale:!1,category:"symbols"},white_square_button:{keywords:["shape","input"],char:'\u{1f533}',fitzpatrick_scale:!1,category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],char:'\u{1f508}',fitzpatrick_scale:!1,category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],char:'\u{1f509}',fitzpatrick_scale:!1,category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],char:'\u{1f50a}',fitzpatrick_scale:!1,category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],char:'\u{1f507}',fitzpatrick_scale:!1,category:"symbols"},mega:{keywords:["sound","speaker","volume"],char:'\u{1f4e3}',fitzpatrick_scale:!1,category:"symbols"},loudspeaker:{keywords:["volume","sound"],char:'\u{1f4e2}',fitzpatrick_scale:!1,category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],char:'\u{1f514}',fitzpatrick_scale:!1,category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],char:'\u{1f515}',fitzpatrick_scale:!1,category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],char:'\u{1f0cf}',fitzpatrick_scale:!1,category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],char:'\u{1f004}',fitzpatrick_scale:!1,category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],char:'\u2660\ufe0f',fitzpatrick_scale:!1,category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],char:'\u2663\ufe0f',fitzpatrick_scale:!1,category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],char:'\u2665\ufe0f',fitzpatrick_scale:!1,category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],char:'\u2666\ufe0f',fitzpatrick_scale:!1,category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],char:'\u{1f3b4}',fitzpatrick_scale:!1,category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking","dream"],char:'\u{1f4ad}',fitzpatrick_scale:!1,category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],char:'\u{1f5ef}',fitzpatrick_scale:!1,category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],char:'\u{1f4ac}',fitzpatrick_scale:!1,category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],char:'\u{1f5e8}',fitzpatrick_scale:!1,category:"symbols"},clock1:{keywords:["time","late","early","schedule"],char:'\u{1f550}',fitzpatrick_scale:!1,category:"symbols"},clock2:{keywords:["time","late","early","schedule"],char:'\u{1f551}',fitzpatrick_scale:!1,category:"symbols"},clock3:{keywords:["time","late","early","schedule"],char:'\u{1f552}',fitzpatrick_scale:!1,category:"symbols"},clock4:{keywords:["time","late","early","schedule"],char:'\u{1f553}',fitzpatrick_scale:!1,category:"symbols"},clock5:{keywords:["time","late","early","schedule"],char:'\u{1f554}',fitzpatrick_scale:!1,category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],char:'\u{1f555}',fitzpatrick_scale:!1,category:"symbols"},clock7:{keywords:["time","late","early","schedule"],char:'\u{1f556}',fitzpatrick_scale:!1,category:"symbols"},clock8:{keywords:["time","late","early","schedule"],char:'\u{1f557}',fitzpatrick_scale:!1,category:"symbols"},clock9:{keywords:["time","late","early","schedule"],char:'\u{1f558}',fitzpatrick_scale:!1,category:"symbols"},clock10:{keywords:["time","late","early","schedule"],char:'\u{1f559}',fitzpatrick_scale:!1,category:"symbols"},clock11:{keywords:["time","late","early","schedule"],char:'\u{1f55a}',fitzpatrick_scale:!1,category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],char:'\u{1f55b}',fitzpatrick_scale:!1,category:"symbols"},clock130:{keywords:["time","late","early","schedule"],char:'\u{1f55c}',fitzpatrick_scale:!1,category:"symbols"},clock230:{keywords:["time","late","early","schedule"],char:'\u{1f55d}',fitzpatrick_scale:!1,category:"symbols"},clock330:{keywords:["time","late","early","schedule"],char:'\u{1f55e}',fitzpatrick_scale:!1,category:"symbols"},clock430:{keywords:["time","late","early","schedule"],char:'\u{1f55f}',fitzpatrick_scale:!1,category:"symbols"},clock530:{keywords:["time","late","early","schedule"],char:'\u{1f560}',fitzpatrick_scale:!1,category:"symbols"},clock630:{keywords:["time","late","early","schedule"],char:'\u{1f561}',fitzpatrick_scale:!1,category:"symbols"},clock730:{keywords:["time","late","early","schedule"],char:'\u{1f562}',fitzpatrick_scale:!1,category:"symbols"},clock830:{keywords:["time","late","early","schedule"],char:'\u{1f563}',fitzpatrick_scale:!1,category:"symbols"},clock930:{keywords:["time","late","early","schedule"],char:'\u{1f564}',fitzpatrick_scale:!1,category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],char:'\u{1f565}',fitzpatrick_scale:!1,category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],char:'\u{1f566}',fitzpatrick_scale:!1,category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],char:'\u{1f567}',fitzpatrick_scale:!1,category:"symbols"},afghanistan:{keywords:["af","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1eb}',fitzpatrick_scale:!1,category:"flags"},aland_islands:{keywords:["\xc5land","islands","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1fd}',fitzpatrick_scale:!1,category:"flags"},albania:{keywords:["al","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1f1}',fitzpatrick_scale:!1,category:"flags"},algeria:{keywords:["dz","flag","nation","country","banner"],char:'\u{1f1e9}\u{1f1ff}',fitzpatrick_scale:!1,category:"flags"},american_samoa:{keywords:["american","ws","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},andorra:{keywords:["ad","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1e9}',fitzpatrick_scale:!1,category:"flags"},angola:{keywords:["ao","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},anguilla:{keywords:["ai","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1ee}',fitzpatrick_scale:!1,category:"flags"},antarctica:{keywords:["aq","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1f6}',fitzpatrick_scale:!1,category:"flags"},antigua_barbuda:{keywords:["antigua","barbuda","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},argentina:{keywords:["ar","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},armenia:{keywords:["am","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},aruba:{keywords:["aw","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1fc}',fitzpatrick_scale:!1,category:"flags"},australia:{keywords:["au","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1fa}',fitzpatrick_scale:!1,category:"flags"},austria:{keywords:["at","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},azerbaijan:{keywords:["az","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1ff}',fitzpatrick_scale:!1,category:"flags"},bahamas:{keywords:["bs","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},bahrain:{keywords:["bh","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1ed}',fitzpatrick_scale:!1,category:"flags"},bangladesh:{keywords:["bd","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1e9}',fitzpatrick_scale:!1,category:"flags"},barbados:{keywords:["bb","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1e7}',fitzpatrick_scale:!1,category:"flags"},belarus:{keywords:["by","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1fe}',fitzpatrick_scale:!1,category:"flags"},belgium:{keywords:["be","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},belize:{keywords:["bz","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1ff}',fitzpatrick_scale:!1,category:"flags"},benin:{keywords:["bj","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1ef}',fitzpatrick_scale:!1,category:"flags"},bermuda:{keywords:["bm","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},bhutan:{keywords:["bt","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},bolivia:{keywords:["bo","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},caribbean_netherlands:{keywords:["bonaire","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1f6}',fitzpatrick_scale:!1,category:"flags"},bosnia_herzegovina:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},botswana:{keywords:["bw","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1fc}',fitzpatrick_scale:!1,category:"flags"},brazil:{keywords:["br","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},british_indian_ocean_territory:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},british_virgin_islands:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],char:'\u{1f1fb}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},brunei:{keywords:["bn","darussalam","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},bulgaria:{keywords:["bg","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},burkina_faso:{keywords:["burkina","faso","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1eb}',fitzpatrick_scale:!1,category:"flags"},burundi:{keywords:["bi","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1ee}',fitzpatrick_scale:!1,category:"flags"},cape_verde:{keywords:["cabo","verde","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1fb}',fitzpatrick_scale:!1,category:"flags"},cambodia:{keywords:["kh","flag","nation","country","banner"],char:'\u{1f1f0}\u{1f1ed}',fitzpatrick_scale:!1,category:"flags"},cameroon:{keywords:["cm","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},canada:{keywords:["ca","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},canary_islands:{keywords:["canary","islands","flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1e8}',fitzpatrick_scale:!1,category:"flags"},cayman_islands:{keywords:["cayman","islands","flag","nation","country","banner"],char:'\u{1f1f0}\u{1f1fe}',fitzpatrick_scale:!1,category:"flags"},central_african_republic:{keywords:["central","african","republic","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1eb}',fitzpatrick_scale:!1,category:"flags"},chad:{keywords:["td","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1e9}',fitzpatrick_scale:!1,category:"flags"},chile:{keywords:["flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1f1}',fitzpatrick_scale:!1,category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],char:'\u{1f1e8}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},christmas_island:{keywords:["christmas","island","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1fd}',fitzpatrick_scale:!1,category:"flags"},cocos_islands:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1e8}',fitzpatrick_scale:!1,category:"flags"},colombia:{keywords:["co","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},comoros:{keywords:["km","flag","nation","country","banner"],char:'\u{1f1f0}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},congo_brazzaville:{keywords:["congo","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},congo_kinshasa:{keywords:["congo","democratic","republic","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1e9}',fitzpatrick_scale:!1,category:"flags"},cook_islands:{keywords:["cook","islands","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1f0}',fitzpatrick_scale:!1,category:"flags"},costa_rica:{keywords:["costa","rica","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},croatia:{keywords:["hr","flag","nation","country","banner"],char:'\u{1f1ed}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},cuba:{keywords:["cu","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1fa}',fitzpatrick_scale:!1,category:"flags"},curacao:{keywords:["cura\xe7ao","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1fc}',fitzpatrick_scale:!1,category:"flags"},cyprus:{keywords:["cy","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1fe}',fitzpatrick_scale:!1,category:"flags"},czech_republic:{keywords:["cz","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1ff}',fitzpatrick_scale:!1,category:"flags"},denmark:{keywords:["dk","flag","nation","country","banner"],char:'\u{1f1e9}\u{1f1f0}',fitzpatrick_scale:!1,category:"flags"},djibouti:{keywords:["dj","flag","nation","country","banner"],char:'\u{1f1e9}\u{1f1ef}',fitzpatrick_scale:!1,category:"flags"},dominica:{keywords:["dm","flag","nation","country","banner"],char:'\u{1f1e9}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},dominican_republic:{keywords:["dominican","republic","flag","nation","country","banner"],char:'\u{1f1e9}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},ecuador:{keywords:["ec","flag","nation","country","banner"],char:'\u{1f1ea}\u{1f1e8}',fitzpatrick_scale:!1,category:"flags"},egypt:{keywords:["eg","flag","nation","country","banner"],char:'\u{1f1ea}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},el_salvador:{keywords:["el","salvador","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1fb}',fitzpatrick_scale:!1,category:"flags"},equatorial_guinea:{keywords:["equatorial","gn","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1f6}',fitzpatrick_scale:!1,category:"flags"},eritrea:{keywords:["er","flag","nation","country","banner"],char:'\u{1f1ea}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},estonia:{keywords:["ee","flag","nation","country","banner"],char:'\u{1f1ea}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},ethiopia:{keywords:["et","flag","nation","country","banner"],char:'\u{1f1ea}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},eu:{keywords:["european","union","flag","banner"],char:'\u{1f1ea}\u{1f1fa}',fitzpatrick_scale:!1,category:"flags"},falkland_islands:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],char:'\u{1f1eb}\u{1f1f0}',fitzpatrick_scale:!1,category:"flags"},faroe_islands:{keywords:["faroe","islands","flag","nation","country","banner"],char:'\u{1f1eb}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},fiji:{keywords:["fj","flag","nation","country","banner"],char:'\u{1f1eb}\u{1f1ef}',fitzpatrick_scale:!1,category:"flags"},finland:{keywords:["fi","flag","nation","country","banner"],char:'\u{1f1eb}\u{1f1ee}',fitzpatrick_scale:!1,category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],char:'\u{1f1eb}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},french_guiana:{keywords:["french","guiana","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1eb}',fitzpatrick_scale:!1,category:"flags"},french_polynesia:{keywords:["french","polynesia","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1eb}',fitzpatrick_scale:!1,category:"flags"},french_southern_territories:{keywords:["french","southern","territories","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1eb}',fitzpatrick_scale:!1,category:"flags"},gabon:{keywords:["ga","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},gambia:{keywords:["gm","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},georgia:{keywords:["ge","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},de:{keywords:["german","nation","flag","country","banner"],char:'\u{1f1e9}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},ghana:{keywords:["gh","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1ed}',fitzpatrick_scale:!1,category:"flags"},gibraltar:{keywords:["gi","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1ee}',fitzpatrick_scale:!1,category:"flags"},greece:{keywords:["gr","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},greenland:{keywords:["gl","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1f1}',fitzpatrick_scale:!1,category:"flags"},grenada:{keywords:["gd","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1e9}',fitzpatrick_scale:!1,category:"flags"},guadeloupe:{keywords:["gp","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1f5}',fitzpatrick_scale:!1,category:"flags"},guam:{keywords:["gu","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1fa}',fitzpatrick_scale:!1,category:"flags"},guatemala:{keywords:["gt","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},guernsey:{keywords:["gg","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},guinea:{keywords:["gn","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},guinea_bissau:{keywords:["gw","bissau","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1fc}',fitzpatrick_scale:!1,category:"flags"},guyana:{keywords:["gy","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1fe}',fitzpatrick_scale:!1,category:"flags"},haiti:{keywords:["ht","flag","nation","country","banner"],char:'\u{1f1ed}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},honduras:{keywords:["hn","flag","nation","country","banner"],char:'\u{1f1ed}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},hong_kong:{keywords:["hong","kong","flag","nation","country","banner"],char:'\u{1f1ed}\u{1f1f0}',fitzpatrick_scale:!1,category:"flags"},hungary:{keywords:["hu","flag","nation","country","banner"],char:'\u{1f1ed}\u{1f1fa}',fitzpatrick_scale:!1,category:"flags"},iceland:{keywords:["is","flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},india:{keywords:["in","flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1e9}',fitzpatrick_scale:!1,category:"flags"},iran:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},iraq:{keywords:["iq","flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1f6}',fitzpatrick_scale:!1,category:"flags"},ireland:{keywords:["ie","flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},isle_of_man:{keywords:["isle","man","flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},israel:{keywords:["il","flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1f1}',fitzpatrick_scale:!1,category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},cote_divoire:{keywords:["ivory","coast","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1ee}',fitzpatrick_scale:!1,category:"flags"},jamaica:{keywords:["jm","flag","nation","country","banner"],char:'\u{1f1ef}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],char:'\u{1f1ef}\u{1f1f5}',fitzpatrick_scale:!1,category:"flags"},jersey:{keywords:["je","flag","nation","country","banner"],char:'\u{1f1ef}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},jordan:{keywords:["jo","flag","nation","country","banner"],char:'\u{1f1ef}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},kazakhstan:{keywords:["kz","flag","nation","country","banner"],char:'\u{1f1f0}\u{1f1ff}',fitzpatrick_scale:!1,category:"flags"},kenya:{keywords:["ke","flag","nation","country","banner"],char:'\u{1f1f0}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},kiribati:{keywords:["ki","flag","nation","country","banner"],char:'\u{1f1f0}\u{1f1ee}',fitzpatrick_scale:!1,category:"flags"},kosovo:{keywords:["xk","flag","nation","country","banner"],char:'\u{1f1fd}\u{1f1f0}',fitzpatrick_scale:!1,category:"flags"},kuwait:{keywords:["kw","flag","nation","country","banner"],char:'\u{1f1f0}\u{1f1fc}',fitzpatrick_scale:!1,category:"flags"},kyrgyzstan:{keywords:["kg","flag","nation","country","banner"],char:'\u{1f1f0}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},laos:{keywords:["lao","democratic","republic","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},latvia:{keywords:["lv","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1fb}',fitzpatrick_scale:!1,category:"flags"},lebanon:{keywords:["lb","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1e7}',fitzpatrick_scale:!1,category:"flags"},lesotho:{keywords:["ls","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},liberia:{keywords:["lr","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},libya:{keywords:["ly","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1fe}',fitzpatrick_scale:!1,category:"flags"},liechtenstein:{keywords:["li","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1ee}',fitzpatrick_scale:!1,category:"flags"},lithuania:{keywords:["lt","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},luxembourg:{keywords:["lu","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1fa}',fitzpatrick_scale:!1,category:"flags"},macau:{keywords:["macao","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},macedonia:{keywords:["macedonia,","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1f0}',fitzpatrick_scale:!1,category:"flags"},madagascar:{keywords:["mg","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},malawi:{keywords:["mw","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1fc}',fitzpatrick_scale:!1,category:"flags"},malaysia:{keywords:["my","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1fe}',fitzpatrick_scale:!1,category:"flags"},maldives:{keywords:["mv","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1fb}',fitzpatrick_scale:!1,category:"flags"},mali:{keywords:["ml","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1f1}',fitzpatrick_scale:!1,category:"flags"},malta:{keywords:["mt","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},marshall_islands:{keywords:["marshall","islands","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1ed}',fitzpatrick_scale:!1,category:"flags"},martinique:{keywords:["mq","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1f6}',fitzpatrick_scale:!1,category:"flags"},mauritania:{keywords:["mr","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},mauritius:{keywords:["mu","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1fa}',fitzpatrick_scale:!1,category:"flags"},mayotte:{keywords:["yt","flag","nation","country","banner"],char:'\u{1f1fe}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},mexico:{keywords:["mx","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1fd}',fitzpatrick_scale:!1,category:"flags"},micronesia:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],char:'\u{1f1eb}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},moldova:{keywords:["moldova,","republic","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1e9}',fitzpatrick_scale:!1,category:"flags"},monaco:{keywords:["mc","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1e8}',fitzpatrick_scale:!1,category:"flags"},mongolia:{keywords:["mn","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},montenegro:{keywords:["me","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},montserrat:{keywords:["ms","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},morocco:{keywords:["ma","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},mozambique:{keywords:["mz","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1ff}',fitzpatrick_scale:!1,category:"flags"},myanmar:{keywords:["mm","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},namibia:{keywords:["na","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},nauru:{keywords:["nr","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},nepal:{keywords:["np","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1f5}',fitzpatrick_scale:!1,category:"flags"},netherlands:{keywords:["nl","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1f1}',fitzpatrick_scale:!1,category:"flags"},new_caledonia:{keywords:["new","caledonia","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1e8}',fitzpatrick_scale:!1,category:"flags"},new_zealand:{keywords:["new","zealand","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1ff}',fitzpatrick_scale:!1,category:"flags"},nicaragua:{keywords:["ni","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1ee}',fitzpatrick_scale:!1,category:"flags"},niger:{keywords:["ne","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},niue:{keywords:["nu","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1fa}',fitzpatrick_scale:!1,category:"flags"},norfolk_island:{keywords:["norfolk","island","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1eb}',fitzpatrick_scale:!1,category:"flags"},northern_mariana_islands:{keywords:["northern","mariana","islands","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1f5}',fitzpatrick_scale:!1,category:"flags"},north_korea:{keywords:["north","korea","nation","flag","country","banner"],char:'\u{1f1f0}\u{1f1f5}',fitzpatrick_scale:!1,category:"flags"},norway:{keywords:["no","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},oman:{keywords:["om_symbol","flag","nation","country","banner"],char:'\u{1f1f4}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},pakistan:{keywords:["pk","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1f0}',fitzpatrick_scale:!1,category:"flags"},palau:{keywords:["pw","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1fc}',fitzpatrick_scale:!1,category:"flags"},palestinian_territories:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},panama:{keywords:["pa","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},papua_new_guinea:{keywords:["papua","new","guinea","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},paraguay:{keywords:["py","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1fe}',fitzpatrick_scale:!1,category:"flags"},peru:{keywords:["pe","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},philippines:{keywords:["ph","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1ed}',fitzpatrick_scale:!1,category:"flags"},pitcairn_islands:{keywords:["pitcairn","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},poland:{keywords:["pl","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1f1}',fitzpatrick_scale:!1,category:"flags"},portugal:{keywords:["pt","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},puerto_rico:{keywords:["puerto","rico","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},qatar:{keywords:["qa","flag","nation","country","banner"],char:'\u{1f1f6}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},reunion:{keywords:["r\xe9union","flag","nation","country","banner"],char:'\u{1f1f7}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},romania:{keywords:["ro","flag","nation","country","banner"],char:'\u{1f1f7}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],char:'\u{1f1f7}\u{1f1fa}',fitzpatrick_scale:!1,category:"flags"},rwanda:{keywords:["rw","flag","nation","country","banner"],char:'\u{1f1f7}\u{1f1fc}',fitzpatrick_scale:!1,category:"flags"},st_barthelemy:{keywords:["saint","barth\xe9lemy","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1f1}',fitzpatrick_scale:!1,category:"flags"},st_helena:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1ed}',fitzpatrick_scale:!1,category:"flags"},st_kitts_nevis:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],char:'\u{1f1f0}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},st_lucia:{keywords:["saint","lucia","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1e8}',fitzpatrick_scale:!1,category:"flags"},st_pierre_miquelon:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},st_vincent_grenadines:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],char:'\u{1f1fb}\u{1f1e8}',fitzpatrick_scale:!1,category:"flags"},samoa:{keywords:["ws","flag","nation","country","banner"],char:'\u{1f1fc}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},san_marino:{keywords:["san","marino","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},sao_tome_principe:{keywords:["sao","tome","principe","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},senegal:{keywords:["sn","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},serbia:{keywords:["rs","flag","nation","country","banner"],char:'\u{1f1f7}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},seychelles:{keywords:["sc","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1e8}',fitzpatrick_scale:!1,category:"flags"},sierra_leone:{keywords:["sierra","leone","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1f1}',fitzpatrick_scale:!1,category:"flags"},singapore:{keywords:["sg","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},sint_maarten:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1fd}',fitzpatrick_scale:!1,category:"flags"},slovakia:{keywords:["sk","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1f0}',fitzpatrick_scale:!1,category:"flags"},slovenia:{keywords:["si","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1ee}',fitzpatrick_scale:!1,category:"flags"},solomon_islands:{keywords:["solomon","islands","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1e7}',fitzpatrick_scale:!1,category:"flags"},somalia:{keywords:["so","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},south_africa:{keywords:["south","africa","flag","nation","country","banner"],char:'\u{1f1ff}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},south_georgia_south_sandwich_islands:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],char:'\u{1f1f0}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},south_sudan:{keywords:["south","sd","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],char:'\u{1f1ea}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},sri_lanka:{keywords:["sri","lanka","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1f0}',fitzpatrick_scale:!1,category:"flags"},sudan:{keywords:["sd","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1e9}',fitzpatrick_scale:!1,category:"flags"},suriname:{keywords:["sr","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},swaziland:{keywords:["sz","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1ff}',fitzpatrick_scale:!1,category:"flags"},sweden:{keywords:["se","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},switzerland:{keywords:["ch","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1ed}',fitzpatrick_scale:!1,category:"flags"},syria:{keywords:["syrian","arab","republic","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1fe}',fitzpatrick_scale:!1,category:"flags"},taiwan:{keywords:["tw","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1fc}',fitzpatrick_scale:!1,category:"flags"},tajikistan:{keywords:["tj","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1ef}',fitzpatrick_scale:!1,category:"flags"},tanzania:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1ff}',fitzpatrick_scale:!1,category:"flags"},thailand:{keywords:["th","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1ed}',fitzpatrick_scale:!1,category:"flags"},timor_leste:{keywords:["timor","leste","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1f1}',fitzpatrick_scale:!1,category:"flags"},togo:{keywords:["tg","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},tokelau:{keywords:["tk","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1f0}',fitzpatrick_scale:!1,category:"flags"},tonga:{keywords:["to","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},trinidad_tobago:{keywords:["trinidad","tobago","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},tunisia:{keywords:["tn","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},turks_caicos_islands:{keywords:["turks","caicos","islands","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1e8}',fitzpatrick_scale:!1,category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1fb}',fitzpatrick_scale:!1,category:"flags"},uganda:{keywords:["ug","flag","nation","country","banner"],char:'\u{1f1fa}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},ukraine:{keywords:["ua","flag","nation","country","banner"],char:'\u{1f1fa}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},united_arab_emirates:{keywords:["united","arab","emirates","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},uk:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],char:'\u{1f1ec}\u{1f1e7}',fitzpatrick_scale:!1,category:"flags"},england:{keywords:["flag","english"],char:'\u{1f3f4}\u{e0067}\u{e0062}\u{e0065}\u{e006e}\u{e0067}\u{e007f}',fitzpatrick_scale:!1,category:"flags"},scotland:{keywords:["flag","scottish"],char:'\u{1f3f4}\u{e0067}\u{e0062}\u{e0073}\u{e0063}\u{e0074}\u{e007f}',fitzpatrick_scale:!1,category:"flags"},wales:{keywords:["flag","welsh"],char:'\u{1f3f4}\u{e0067}\u{e0062}\u{e0077}\u{e006c}\u{e0073}\u{e007f}',fitzpatrick_scale:!1,category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],char:'\u{1f1fa}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},us_virgin_islands:{keywords:["virgin","islands","us","flag","nation","country","banner"],char:'\u{1f1fb}\u{1f1ee}',fitzpatrick_scale:!1,category:"flags"},uruguay:{keywords:["uy","flag","nation","country","banner"],char:'\u{1f1fa}\u{1f1fe}',fitzpatrick_scale:!1,category:"flags"},uzbekistan:{keywords:["uz","flag","nation","country","banner"],char:'\u{1f1fa}\u{1f1ff}',fitzpatrick_scale:!1,category:"flags"},vanuatu:{keywords:["vu","flag","nation","country","banner"],char:'\u{1f1fb}\u{1f1fa}',fitzpatrick_scale:!1,category:"flags"},vatican_city:{keywords:["vatican","city","flag","nation","country","banner"],char:'\u{1f1fb}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},venezuela:{keywords:["ve","bolivarian","republic","flag","nation","country","banner"],char:'\u{1f1fb}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},vietnam:{keywords:["viet","nam","flag","nation","country","banner"],char:'\u{1f1fb}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},wallis_futuna:{keywords:["wallis","futuna","flag","nation","country","banner"],char:'\u{1f1fc}\u{1f1eb}',fitzpatrick_scale:!1,category:"flags"},western_sahara:{keywords:["western","sahara","flag","nation","country","banner"],char:'\u{1f1ea}\u{1f1ed}',fitzpatrick_scale:!1,category:"flags"},yemen:{keywords:["ye","flag","nation","country","banner"],char:'\u{1f1fe}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},zambia:{keywords:["zm","flag","nation","country","banner"],char:'\u{1f1ff}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},zimbabwe:{keywords:["zw","flag","nation","country","banner"],char:'\u{1f1ff}\u{1f1fc}',fitzpatrick_scale:!1,category:"flags"},united_nations:{keywords:["un","flag","banner"],char:'\u{1f1fa}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},pirate_flag:{keywords:["skull","crossbones","flag","banner"],char:'\u{1f3f4}\u200d\u2620\ufe0f',fitzpatrick_scale:!1,category:"flags"}}); \ No newline at end of file diff --git a/static/js/tinymce/plugins/emoticons/js/emojis.js b/static/js/tinymce/plugins/emoticons/js/emojis.js new file mode 100644 index 0000000..88455e9 --- /dev/null +++ b/static/js/tinymce/plugins/emoticons/js/emojis.js @@ -0,0 +1 @@ +window.tinymce.Resource.add("tinymce.plugins.emoticons",{grinning:{keywords:["face","smile","happy","joy",":D","grin"],char:"😀",fitzpatrick_scale:false,category:"people"},grimacing:{keywords:["face","grimace","teeth"],char:"😬",fitzpatrick_scale:false,category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],char:"ðŸ˜",fitzpatrick_scale:false,category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],char:"😂",fitzpatrick_scale:false,category:"people"},rofl:{keywords:["face","rolling","floor","laughing","lol","haha"],char:"🤣",fitzpatrick_scale:false,category:"people"},partying:{keywords:["face","celebration","woohoo"],char:"🥳",fitzpatrick_scale:false,category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],char:"😃",fitzpatrick_scale:false,category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],char:"😄",fitzpatrick_scale:false,category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],char:"😅",fitzpatrick_scale:false,category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],char:"😆",fitzpatrick_scale:false,category:"people"},innocent:{keywords:["face","angel","heaven","halo"],char:"😇",fitzpatrick_scale:false,category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile","eye"],char:"😉",fitzpatrick_scale:false,category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],char:"😊",fitzpatrick_scale:false,category:"people"},slightly_smiling_face:{keywords:["face","smile"],char:"🙂",fitzpatrick_scale:false,category:"people"},upside_down_face:{keywords:["face","flipped","silly","smile"],char:"🙃",fitzpatrick_scale:false,category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],char:"☺ï¸",fitzpatrick_scale:false,category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"],char:"😋",fitzpatrick_scale:false,category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],char:"😌",fitzpatrick_scale:false,category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],char:"ðŸ˜",fitzpatrick_scale:false,category:"people"},smiling_face_with_three_hearts:{keywords:["face","love","like","affection","valentines","infatuation","crush","hearts","adore"],char:"🥰",fitzpatrick_scale:false,category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:"😘",fitzpatrick_scale:false,category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],char:"😗",fitzpatrick_scale:false,category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],char:"😙",fitzpatrick_scale:false,category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:"😚",fitzpatrick_scale:false,category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],char:"😜",fitzpatrick_scale:false,category:"people"},zany:{keywords:["face","goofy","crazy"],char:"🤪",fitzpatrick_scale:false,category:"people"},raised_eyebrow:{keywords:["face","distrust","scepticism","disapproval","disbelief","surprise"],char:"🤨",fitzpatrick_scale:false,category:"people"},monocle:{keywords:["face","stuffy","wealthy"],char:"ðŸ§",fitzpatrick_scale:false,category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],char:"ðŸ˜",fitzpatrick_scale:false,category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],char:"😛",fitzpatrick_scale:false,category:"people"},money_mouth_face:{keywords:["face","rich","dollar","money"],char:"🤑",fitzpatrick_scale:false,category:"people"},nerd_face:{keywords:["face","nerdy","geek","dork"],char:"🤓",fitzpatrick_scale:false,category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],char:"😎",fitzpatrick_scale:false,category:"people"},star_struck:{keywords:["face","smile","starry","eyes","grinning"],char:"🤩",fitzpatrick_scale:false,category:"people"},clown_face:{keywords:["face"],char:"🤡",fitzpatrick_scale:false,category:"people"},cowboy_hat_face:{keywords:["face","cowgirl","hat"],char:"🤠",fitzpatrick_scale:false,category:"people"},hugs:{keywords:["face","smile","hug"],char:"🤗",fitzpatrick_scale:false,category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],char:"ðŸ˜",fitzpatrick_scale:false,category:"people"},no_mouth:{keywords:["face","hellokitty"],char:"😶",fitzpatrick_scale:false,category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],char:"ðŸ˜",fitzpatrick_scale:false,category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],char:"😑",fitzpatrick_scale:false,category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"],char:"😒",fitzpatrick_scale:false,category:"people"},roll_eyes:{keywords:["face","eyeroll","frustrated"],char:"🙄",fitzpatrick_scale:false,category:"people"},thinking:{keywords:["face","hmmm","think","consider"],char:"🤔",fitzpatrick_scale:false,category:"people"},lying_face:{keywords:["face","lie","pinocchio"],char:"🤥",fitzpatrick_scale:false,category:"people"},hand_over_mouth:{keywords:["face","whoops","shock","surprise"],char:"🤭",fitzpatrick_scale:false,category:"people"},shushing:{keywords:["face","quiet","shhh"],char:"🤫",fitzpatrick_scale:false,category:"people"},symbols_over_mouth:{keywords:["face","swearing","cursing","cussing","profanity","expletive"],char:"🤬",fitzpatrick_scale:false,category:"people"},exploding_head:{keywords:["face","shocked","mind","blown"],char:"🤯",fitzpatrick_scale:false,category:"people"},flushed:{keywords:["face","blush","shy","flattered"],char:"😳",fitzpatrick_scale:false,category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],char:"😞",fitzpatrick_scale:false,category:"people"},worried:{keywords:["face","concern","nervous",":("],char:"😟",fitzpatrick_scale:false,category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],char:"😠",fitzpatrick_scale:false,category:"people"},rage:{keywords:["angry","mad","hate","despise"],char:"😡",fitzpatrick_scale:false,category:"people"},pensive:{keywords:["face","sad","depressed","upset"],char:"😔",fitzpatrick_scale:false,category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],char:"😕",fitzpatrick_scale:false,category:"people"},slightly_frowning_face:{keywords:["face","frowning","disappointed","sad","upset"],char:"ðŸ™",fitzpatrick_scale:false,category:"people"},frowning_face:{keywords:["face","sad","upset","frown"],char:"☹",fitzpatrick_scale:false,category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],char:"😣",fitzpatrick_scale:false,category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],char:"😖",fitzpatrick_scale:false,category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],char:"😫",fitzpatrick_scale:false,category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],char:"😩",fitzpatrick_scale:false,category:"people"},pleading:{keywords:["face","begging","mercy"],char:"🥺",fitzpatrick_scale:false,category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],char:"😤",fitzpatrick_scale:false,category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],char:"😮",fitzpatrick_scale:false,category:"people"},scream:{keywords:["face","munch","scared","omg"],char:"😱",fitzpatrick_scale:false,category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],char:"😨",fitzpatrick_scale:false,category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],char:"😰",fitzpatrick_scale:false,category:"people"},hushed:{keywords:["face","woo","shh"],char:"😯",fitzpatrick_scale:false,category:"people"},frowning:{keywords:["face","aw","what"],char:"😦",fitzpatrick_scale:false,category:"people"},anguished:{keywords:["face","stunned","nervous"],char:"😧",fitzpatrick_scale:false,category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],char:"😢",fitzpatrick_scale:false,category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],char:"😥",fitzpatrick_scale:false,category:"people"},drooling_face:{keywords:["face"],char:"🤤",fitzpatrick_scale:false,category:"people"},sleepy:{keywords:["face","tired","rest","nap"],char:"😪",fitzpatrick_scale:false,category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],char:"😓",fitzpatrick_scale:false,category:"people"},hot:{keywords:["face","feverish","heat","red","sweating"],char:"🥵",fitzpatrick_scale:false,category:"people"},cold:{keywords:["face","blue","freezing","frozen","frostbite","icicles"],char:"🥶",fitzpatrick_scale:false,category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],char:"😭",fitzpatrick_scale:false,category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],char:"😵",fitzpatrick_scale:false,category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],char:"😲",fitzpatrick_scale:false,category:"people"},zipper_mouth_face:{keywords:["face","sealed","zipper","secret"],char:"ðŸ¤",fitzpatrick_scale:false,category:"people"},nauseated_face:{keywords:["face","vomit","gross","green","sick","throw up","ill"],char:"🤢",fitzpatrick_scale:false,category:"people"},sneezing_face:{keywords:["face","gesundheit","sneeze","sick","allergy"],char:"🤧",fitzpatrick_scale:false,category:"people"},vomiting:{keywords:["face","sick"],char:"🤮",fitzpatrick_scale:false,category:"people"},mask:{keywords:["face","sick","ill","disease"],char:"😷",fitzpatrick_scale:false,category:"people"},face_with_thermometer:{keywords:["sick","temperature","thermometer","cold","fever"],char:"🤒",fitzpatrick_scale:false,category:"people"},face_with_head_bandage:{keywords:["injured","clumsy","bandage","hurt"],char:"🤕",fitzpatrick_scale:false,category:"people"},woozy:{keywords:["face","dizzy","intoxicated","tipsy","wavy"],char:"🥴",fitzpatrick_scale:false,category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],char:"😴",fitzpatrick_scale:false,category:"people"},zzz:{keywords:["sleepy","tired","dream"],char:"💤",fitzpatrick_scale:false,category:"people"},poop:{keywords:["hankey","shitface","fail","turd","shit"],char:"💩",fitzpatrick_scale:false,category:"people"},smiling_imp:{keywords:["devil","horns"],char:"😈",fitzpatrick_scale:false,category:"people"},imp:{keywords:["devil","angry","horns"],char:"👿",fitzpatrick_scale:false,category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],char:"👹",fitzpatrick_scale:false,category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],char:"👺",fitzpatrick_scale:false,category:"people"},skull:{keywords:["dead","skeleton","creepy","death"],char:"💀",fitzpatrick_scale:false,category:"people"},ghost:{keywords:["halloween","spooky","scary"],char:"👻",fitzpatrick_scale:false,category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],char:"👽",fitzpatrick_scale:false,category:"people"},robot:{keywords:["computer","machine","bot"],char:"🤖",fitzpatrick_scale:false,category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],char:"😺",fitzpatrick_scale:false,category:"people"},smile_cat:{keywords:["animal","cats","smile"],char:"😸",fitzpatrick_scale:false,category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],char:"😹",fitzpatrick_scale:false,category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],char:"😻",fitzpatrick_scale:false,category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],char:"😼",fitzpatrick_scale:false,category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],char:"😽",fitzpatrick_scale:false,category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],char:"🙀",fitzpatrick_scale:false,category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],char:"😿",fitzpatrick_scale:false,category:"people"},pouting_cat:{keywords:["animal","cats"],char:"😾",fitzpatrick_scale:false,category:"people"},palms_up:{keywords:["hands","gesture","cupped","prayer"],char:"🤲",fitzpatrick_scale:true,category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],char:"🙌",fitzpatrick_scale:true,category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],char:"ðŸ‘",fitzpatrick_scale:true,category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","hi","palm"],char:"👋",fitzpatrick_scale:true,category:"people"},call_me_hand:{keywords:["hands","gesture"],char:"🤙",fitzpatrick_scale:true,category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],char:"ðŸ‘",fitzpatrick_scale:true,category:"people"},"-1":{keywords:["thumbsdown","no","dislike","hand"],char:"👎",fitzpatrick_scale:true,category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],char:"👊",fitzpatrick_scale:true,category:"people"},fist:{keywords:["fingers","hand","grasp"],char:"✊",fitzpatrick_scale:true,category:"people"},fist_left:{keywords:["hand","fistbump"],char:"🤛",fitzpatrick_scale:true,category:"people"},fist_right:{keywords:["hand","fistbump"],char:"🤜",fitzpatrick_scale:true,category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],char:"✌",fitzpatrick_scale:true,category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok","okay"],char:"👌",fitzpatrick_scale:true,category:"people"},raised_hand:{keywords:["fingers","stop","highfive","palm","ban"],char:"✋",fitzpatrick_scale:true,category:"people"},raised_back_of_hand:{keywords:["fingers","raised","backhand"],char:"🤚",fitzpatrick_scale:true,category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],char:"ðŸ‘",fitzpatrick_scale:true,category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],char:"💪",fitzpatrick_scale:true,category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],char:"ðŸ™",fitzpatrick_scale:true,category:"people"},foot:{keywords:["kick","stomp"],char:"🦶",fitzpatrick_scale:true,category:"people"},leg:{keywords:["kick","limb"],char:"🦵",fitzpatrick_scale:true,category:"people"},handshake:{keywords:["agreement","shake"],char:"ðŸ¤",fitzpatrick_scale:false,category:"people"},point_up:{keywords:["hand","fingers","direction","up"],char:"â˜",fitzpatrick_scale:true,category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],char:"👆",fitzpatrick_scale:true,category:"people"},point_down:{keywords:["fingers","hand","direction","down"],char:"👇",fitzpatrick_scale:true,category:"people"},point_left:{keywords:["direction","fingers","hand","left"],char:"👈",fitzpatrick_scale:true,category:"people"},point_right:{keywords:["fingers","hand","direction","right"],char:"👉",fitzpatrick_scale:true,category:"people"},fu:{keywords:["hand","fingers","rude","middle","flipping"],char:"🖕",fitzpatrick_scale:true,category:"people"},raised_hand_with_fingers_splayed:{keywords:["hand","fingers","palm"],char:"ðŸ–",fitzpatrick_scale:true,category:"people"},love_you:{keywords:["hand","fingers","gesture"],char:"🤟",fitzpatrick_scale:true,category:"people"},metal:{keywords:["hand","fingers","evil_eye","sign_of_horns","rock_on"],char:"🤘",fitzpatrick_scale:true,category:"people"},crossed_fingers:{keywords:["good","lucky"],char:"🤞",fitzpatrick_scale:true,category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],char:"🖖",fitzpatrick_scale:true,category:"people"},writing_hand:{keywords:["lower_left_ballpoint_pen","stationery","write","compose"],char:"âœ",fitzpatrick_scale:true,category:"people"},selfie:{keywords:["camera","phone"],char:"🤳",fitzpatrick_scale:true,category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],char:"💅",fitzpatrick_scale:true,category:"people"},lips:{keywords:["mouth","kiss"],char:"👄",fitzpatrick_scale:false,category:"people"},tooth:{keywords:["teeth","dentist"],char:"🦷",fitzpatrick_scale:false,category:"people"},tongue:{keywords:["mouth","playful"],char:"👅",fitzpatrick_scale:false,category:"people"},ear:{keywords:["face","hear","sound","listen"],char:"👂",fitzpatrick_scale:true,category:"people"},nose:{keywords:["smell","sniff"],char:"👃",fitzpatrick_scale:true,category:"people"},eye:{keywords:["face","look","see","watch","stare"],char:"ðŸ‘",fitzpatrick_scale:false,category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],char:"👀",fitzpatrick_scale:false,category:"people"},brain:{keywords:["smart","intelligent"],char:"🧠",fitzpatrick_scale:false,category:"people"},bust_in_silhouette:{keywords:["user","person","human"],char:"👤",fitzpatrick_scale:false,category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],char:"👥",fitzpatrick_scale:false,category:"people"},speaking_head:{keywords:["user","person","human","sing","say","talk"],char:"🗣",fitzpatrick_scale:false,category:"people"},baby:{keywords:["child","boy","girl","toddler"],char:"👶",fitzpatrick_scale:true,category:"people"},child:{keywords:["gender-neutral","young"],char:"🧒",fitzpatrick_scale:true,category:"people"},boy:{keywords:["man","male","guy","teenager"],char:"👦",fitzpatrick_scale:true,category:"people"},girl:{keywords:["female","woman","teenager"],char:"👧",fitzpatrick_scale:true,category:"people"},adult:{keywords:["gender-neutral","person"],char:"🧑",fitzpatrick_scale:true,category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],char:"👨",fitzpatrick_scale:true,category:"people"},woman:{keywords:["female","girls","lady"],char:"👩",fitzpatrick_scale:true,category:"people"},blonde_woman:{keywords:["woman","female","girl","blonde","person"],char:"👱â€â™€ï¸",fitzpatrick_scale:true,category:"people"},blonde_man:{keywords:["man","male","boy","blonde","guy","person"],char:"👱",fitzpatrick_scale:true,category:"people"},bearded_person:{keywords:["person","bewhiskered"],char:"🧔",fitzpatrick_scale:true,category:"people"},older_adult:{keywords:["human","elder","senior","gender-neutral"],char:"🧓",fitzpatrick_scale:true,category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],char:"👴",fitzpatrick_scale:true,category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],char:"👵",fitzpatrick_scale:true,category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],char:"👲",fitzpatrick_scale:true,category:"people"},woman_with_headscarf:{keywords:["female","hijab","mantilla","tichel"],char:"🧕",fitzpatrick_scale:true,category:"people"},woman_with_turban:{keywords:["female","indian","hinduism","arabs","woman"],char:"👳â€â™€ï¸",fitzpatrick_scale:true,category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],char:"👳",fitzpatrick_scale:true,category:"people"},policewoman:{keywords:["woman","police","law","legal","enforcement","arrest","911","female"],char:"👮â€â™€ï¸",fitzpatrick_scale:true,category:"people"},policeman:{keywords:["man","police","law","legal","enforcement","arrest","911"],char:"👮",fitzpatrick_scale:true,category:"people"},construction_worker_woman:{keywords:["female","human","wip","build","construction","worker","labor","woman"],char:"👷â€â™€ï¸",fitzpatrick_scale:true,category:"people"},construction_worker_man:{keywords:["male","human","wip","guy","build","construction","worker","labor"],char:"👷",fitzpatrick_scale:true,category:"people"},guardswoman:{keywords:["uk","gb","british","female","royal","woman"],char:"💂â€â™€ï¸",fitzpatrick_scale:true,category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],char:"💂",fitzpatrick_scale:true,category:"people"},female_detective:{keywords:["human","spy","detective","female","woman"],char:"🕵ï¸â€â™€ï¸",fitzpatrick_scale:true,category:"people"},male_detective:{keywords:["human","spy","detective"],char:"🕵",fitzpatrick_scale:true,category:"people"},woman_health_worker:{keywords:["doctor","nurse","therapist","healthcare","woman","human"],char:"👩â€âš•ï¸",fitzpatrick_scale:true,category:"people"},man_health_worker:{keywords:["doctor","nurse","therapist","healthcare","man","human"],char:"👨â€âš•ï¸",fitzpatrick_scale:true,category:"people"},woman_farmer:{keywords:["rancher","gardener","woman","human"],char:"👩â€ðŸŒ¾",fitzpatrick_scale:true,category:"people"},man_farmer:{keywords:["rancher","gardener","man","human"],char:"👨â€ðŸŒ¾",fitzpatrick_scale:true,category:"people"},woman_cook:{keywords:["chef","woman","human"],char:"👩â€ðŸ³",fitzpatrick_scale:true,category:"people"},man_cook:{keywords:["chef","man","human"],char:"👨â€ðŸ³",fitzpatrick_scale:true,category:"people"},woman_student:{keywords:["graduate","woman","human"],char:"👩â€ðŸŽ“",fitzpatrick_scale:true,category:"people"},man_student:{keywords:["graduate","man","human"],char:"👨â€ðŸŽ“",fitzpatrick_scale:true,category:"people"},woman_singer:{keywords:["rockstar","entertainer","woman","human"],char:"👩â€ðŸŽ¤",fitzpatrick_scale:true,category:"people"},man_singer:{keywords:["rockstar","entertainer","man","human"],char:"👨â€ðŸŽ¤",fitzpatrick_scale:true,category:"people"},woman_teacher:{keywords:["instructor","professor","woman","human"],char:"👩â€ðŸ«",fitzpatrick_scale:true,category:"people"},man_teacher:{keywords:["instructor","professor","man","human"],char:"👨â€ðŸ«",fitzpatrick_scale:true,category:"people"},woman_factory_worker:{keywords:["assembly","industrial","woman","human"],char:"👩â€ðŸ­",fitzpatrick_scale:true,category:"people"},man_factory_worker:{keywords:["assembly","industrial","man","human"],char:"👨â€ðŸ­",fitzpatrick_scale:true,category:"people"},woman_technologist:{keywords:["coder","developer","engineer","programmer","software","woman","human","laptop","computer"],char:"👩â€ðŸ’»",fitzpatrick_scale:true,category:"people"},man_technologist:{keywords:["coder","developer","engineer","programmer","software","man","human","laptop","computer"],char:"👨â€ðŸ’»",fitzpatrick_scale:true,category:"people"},woman_office_worker:{keywords:["business","manager","woman","human"],char:"👩â€ðŸ’¼",fitzpatrick_scale:true,category:"people"},man_office_worker:{keywords:["business","manager","man","human"],char:"👨â€ðŸ’¼",fitzpatrick_scale:true,category:"people"},woman_mechanic:{keywords:["plumber","woman","human","wrench"],char:"👩â€ðŸ”§",fitzpatrick_scale:true,category:"people"},man_mechanic:{keywords:["plumber","man","human","wrench"],char:"👨â€ðŸ”§",fitzpatrick_scale:true,category:"people"},woman_scientist:{keywords:["biologist","chemist","engineer","physicist","woman","human"],char:"👩â€ðŸ”¬",fitzpatrick_scale:true,category:"people"},man_scientist:{keywords:["biologist","chemist","engineer","physicist","man","human"],char:"👨â€ðŸ”¬",fitzpatrick_scale:true,category:"people"},woman_artist:{keywords:["painter","woman","human"],char:"👩â€ðŸŽ¨",fitzpatrick_scale:true,category:"people"},man_artist:{keywords:["painter","man","human"],char:"👨â€ðŸŽ¨",fitzpatrick_scale:true,category:"people"},woman_firefighter:{keywords:["fireman","woman","human"],char:"👩â€ðŸš’",fitzpatrick_scale:true,category:"people"},man_firefighter:{keywords:["fireman","man","human"],char:"👨â€ðŸš’",fitzpatrick_scale:true,category:"people"},woman_pilot:{keywords:["aviator","plane","woman","human"],char:"👩â€âœˆï¸",fitzpatrick_scale:true,category:"people"},man_pilot:{keywords:["aviator","plane","man","human"],char:"👨â€âœˆï¸",fitzpatrick_scale:true,category:"people"},woman_astronaut:{keywords:["space","rocket","woman","human"],char:"👩â€ðŸš€",fitzpatrick_scale:true,category:"people"},man_astronaut:{keywords:["space","rocket","man","human"],char:"👨â€ðŸš€",fitzpatrick_scale:true,category:"people"},woman_judge:{keywords:["justice","court","woman","human"],char:"👩â€âš–ï¸",fitzpatrick_scale:true,category:"people"},man_judge:{keywords:["justice","court","man","human"],char:"👨â€âš–ï¸",fitzpatrick_scale:true,category:"people"},woman_superhero:{keywords:["woman","female","good","heroine","superpowers"],char:"🦸â€â™€ï¸",fitzpatrick_scale:true,category:"people"},man_superhero:{keywords:["man","male","good","hero","superpowers"],char:"🦸â€â™‚ï¸",fitzpatrick_scale:true,category:"people"},woman_supervillain:{keywords:["woman","female","evil","bad","criminal","heroine","superpowers"],char:"🦹â€â™€ï¸",fitzpatrick_scale:true,category:"people"},man_supervillain:{keywords:["man","male","evil","bad","criminal","hero","superpowers"],char:"🦹â€â™‚ï¸",fitzpatrick_scale:true,category:"people"},mrs_claus:{keywords:["woman","female","xmas","mother christmas"],char:"🤶",fitzpatrick_scale:true,category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],char:"🎅",fitzpatrick_scale:true,category:"people"},sorceress:{keywords:["woman","female","mage","witch"],char:"🧙â€â™€ï¸",fitzpatrick_scale:true,category:"people"},wizard:{keywords:["man","male","mage","sorcerer"],char:"🧙â€â™‚ï¸",fitzpatrick_scale:true,category:"people"},woman_elf:{keywords:["woman","female"],char:"ðŸ§â€â™€ï¸",fitzpatrick_scale:true,category:"people"},man_elf:{keywords:["man","male"],char:"ðŸ§â€â™‚ï¸",fitzpatrick_scale:true,category:"people"},woman_vampire:{keywords:["woman","female"],char:"🧛â€â™€ï¸",fitzpatrick_scale:true,category:"people"},man_vampire:{keywords:["man","male","dracula"],char:"🧛â€â™‚ï¸",fitzpatrick_scale:true,category:"people"},woman_zombie:{keywords:["woman","female","undead","walking dead"],char:"🧟â€â™€ï¸",fitzpatrick_scale:false,category:"people"},man_zombie:{keywords:["man","male","dracula","undead","walking dead"],char:"🧟â€â™‚ï¸",fitzpatrick_scale:false,category:"people"},woman_genie:{keywords:["woman","female"],char:"🧞â€â™€ï¸",fitzpatrick_scale:false,category:"people"},man_genie:{keywords:["man","male"],char:"🧞â€â™‚ï¸",fitzpatrick_scale:false,category:"people"},mermaid:{keywords:["woman","female","merwoman","ariel"],char:"🧜â€â™€ï¸",fitzpatrick_scale:true,category:"people"},merman:{keywords:["man","male","triton"],char:"🧜â€â™‚ï¸",fitzpatrick_scale:true,category:"people"},woman_fairy:{keywords:["woman","female"],char:"🧚â€â™€ï¸",fitzpatrick_scale:true,category:"people"},man_fairy:{keywords:["man","male"],char:"🧚â€â™‚ï¸",fitzpatrick_scale:true,category:"people"},angel:{keywords:["heaven","wings","halo"],char:"👼",fitzpatrick_scale:true,category:"people"},pregnant_woman:{keywords:["baby"],char:"🤰",fitzpatrick_scale:true,category:"people"},breastfeeding:{keywords:["nursing","baby"],char:"🤱",fitzpatrick_scale:true,category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],char:"👸",fitzpatrick_scale:true,category:"people"},prince:{keywords:["boy","man","male","crown","royal","king"],char:"🤴",fitzpatrick_scale:true,category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],char:"👰",fitzpatrick_scale:true,category:"people"},man_in_tuxedo:{keywords:["couple","marriage","wedding","groom"],char:"🤵",fitzpatrick_scale:true,category:"people"},running_woman:{keywords:["woman","walking","exercise","race","running","female"],char:"ðŸƒâ€â™€ï¸",fitzpatrick_scale:true,category:"people"},running_man:{keywords:["man","walking","exercise","race","running"],char:"ðŸƒ",fitzpatrick_scale:true,category:"people"},walking_woman:{keywords:["human","feet","steps","woman","female"],char:"🚶â€â™€ï¸",fitzpatrick_scale:true,category:"people"},walking_man:{keywords:["human","feet","steps"],char:"🚶",fitzpatrick_scale:true,category:"people"},dancer:{keywords:["female","girl","woman","fun"],char:"💃",fitzpatrick_scale:true,category:"people"},man_dancing:{keywords:["male","boy","fun","dancer"],char:"🕺",fitzpatrick_scale:true,category:"people"},dancing_women:{keywords:["female","bunny","women","girls"],char:"👯",fitzpatrick_scale:false,category:"people"},dancing_men:{keywords:["male","bunny","men","boys"],char:"👯â€â™‚ï¸",fitzpatrick_scale:false,category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],char:"👫",fitzpatrick_scale:false,category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],char:"👬",fitzpatrick_scale:false,category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],char:"👭",fitzpatrick_scale:false,category:"people"},bowing_woman:{keywords:["woman","female","girl"],char:"🙇â€â™€ï¸",fitzpatrick_scale:true,category:"people"},bowing_man:{keywords:["man","male","boy"],char:"🙇",fitzpatrick_scale:true,category:"people"},man_facepalming:{keywords:["man","male","boy","disbelief"],char:"🤦â€â™‚ï¸",fitzpatrick_scale:true,category:"people"},woman_facepalming:{keywords:["woman","female","girl","disbelief"],char:"🤦â€â™€ï¸",fitzpatrick_scale:true,category:"people"},woman_shrugging:{keywords:["woman","female","girl","confused","indifferent","doubt"],char:"🤷",fitzpatrick_scale:true,category:"people"},man_shrugging:{keywords:["man","male","boy","confused","indifferent","doubt"],char:"🤷â€â™‚ï¸",fitzpatrick_scale:true,category:"people"},tipping_hand_woman:{keywords:["female","girl","woman","human","information"],char:"ðŸ’",fitzpatrick_scale:true,category:"people"},tipping_hand_man:{keywords:["male","boy","man","human","information"],char:"ðŸ’â€â™‚ï¸",fitzpatrick_scale:true,category:"people"},no_good_woman:{keywords:["female","girl","woman","nope"],char:"🙅",fitzpatrick_scale:true,category:"people"},no_good_man:{keywords:["male","boy","man","nope"],char:"🙅â€â™‚ï¸",fitzpatrick_scale:true,category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],char:"🙆",fitzpatrick_scale:true,category:"people"},ok_man:{keywords:["men","boy","male","blue","human","man"],char:"🙆â€â™‚ï¸",fitzpatrick_scale:true,category:"people"},raising_hand_woman:{keywords:["female","girl","woman"],char:"🙋",fitzpatrick_scale:true,category:"people"},raising_hand_man:{keywords:["male","boy","man"],char:"🙋â€â™‚ï¸",fitzpatrick_scale:true,category:"people"},pouting_woman:{keywords:["female","girl","woman"],char:"🙎",fitzpatrick_scale:true,category:"people"},pouting_man:{keywords:["male","boy","man"],char:"🙎â€â™‚ï¸",fitzpatrick_scale:true,category:"people"},frowning_woman:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],char:"ðŸ™",fitzpatrick_scale:true,category:"people"},frowning_man:{keywords:["male","boy","man","sad","depressed","discouraged","unhappy"],char:"ðŸ™â€â™‚ï¸",fitzpatrick_scale:true,category:"people"},haircut_woman:{keywords:["female","girl","woman"],char:"💇",fitzpatrick_scale:true,category:"people"},haircut_man:{keywords:["male","boy","man"],char:"💇â€â™‚ï¸",fitzpatrick_scale:true,category:"people"},massage_woman:{keywords:["female","girl","woman","head"],char:"💆",fitzpatrick_scale:true,category:"people"},massage_man:{keywords:["male","boy","man","head"],char:"💆â€â™‚ï¸",fitzpatrick_scale:true,category:"people"},woman_in_steamy_room:{keywords:["female","woman","spa","steamroom","sauna"],char:"🧖â€â™€ï¸",fitzpatrick_scale:true,category:"people"},man_in_steamy_room:{keywords:["male","man","spa","steamroom","sauna"],char:"🧖â€â™‚ï¸",fitzpatrick_scale:true,category:"people"},couple_with_heart_woman_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"💑",fitzpatrick_scale:false,category:"people"},couple_with_heart_woman_woman:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"👩â€â¤ï¸â€ðŸ‘©",fitzpatrick_scale:false,category:"people"},couple_with_heart_man_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"👨â€â¤ï¸â€ðŸ‘¨",fitzpatrick_scale:false,category:"people"},couplekiss_man_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:"ðŸ’",fitzpatrick_scale:false,category:"people"},couplekiss_woman_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:"👩â€â¤ï¸â€ðŸ’‹â€ðŸ‘©",fitzpatrick_scale:false,category:"people"},couplekiss_man_man:{keywords:["pair","valentines","love","like","dating","marriage"],char:"👨â€â¤ï¸â€ðŸ’‹â€ðŸ‘¨",fitzpatrick_scale:false,category:"people"},family_man_woman_boy:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],char:"👪",fitzpatrick_scale:false,category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],char:"👨â€ðŸ‘©â€ðŸ‘§",fitzpatrick_scale:false,category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:"👨â€ðŸ‘©â€ðŸ‘§â€ðŸ‘¦",fitzpatrick_scale:false,category:"people"},family_man_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:"👨â€ðŸ‘©â€ðŸ‘¦â€ðŸ‘¦",fitzpatrick_scale:false,category:"people"},family_man_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:"👨â€ðŸ‘©â€ðŸ‘§â€ðŸ‘§",fitzpatrick_scale:false,category:"people"},family_woman_woman_boy:{keywords:["home","parents","people","human","children"],char:"👩â€ðŸ‘©â€ðŸ‘¦",fitzpatrick_scale:false,category:"people"},family_woman_woman_girl:{keywords:["home","parents","people","human","children"],char:"👩â€ðŸ‘©â€ðŸ‘§",fitzpatrick_scale:false,category:"people"},family_woman_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:"👩â€ðŸ‘©â€ðŸ‘§â€ðŸ‘¦",fitzpatrick_scale:false,category:"people"},family_woman_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:"👩â€ðŸ‘©â€ðŸ‘¦â€ðŸ‘¦",fitzpatrick_scale:false,category:"people"},family_woman_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:"👩â€ðŸ‘©â€ðŸ‘§â€ðŸ‘§",fitzpatrick_scale:false,category:"people"},family_man_man_boy:{keywords:["home","parents","people","human","children"],char:"👨â€ðŸ‘¨â€ðŸ‘¦",fitzpatrick_scale:false,category:"people"},family_man_man_girl:{keywords:["home","parents","people","human","children"],char:"👨â€ðŸ‘¨â€ðŸ‘§",fitzpatrick_scale:false,category:"people"},family_man_man_girl_boy:{keywords:["home","parents","people","human","children"],char:"👨â€ðŸ‘¨â€ðŸ‘§â€ðŸ‘¦",fitzpatrick_scale:false,category:"people"},family_man_man_boy_boy:{keywords:["home","parents","people","human","children"],char:"👨â€ðŸ‘¨â€ðŸ‘¦â€ðŸ‘¦",fitzpatrick_scale:false,category:"people"},family_man_man_girl_girl:{keywords:["home","parents","people","human","children"],char:"👨â€ðŸ‘¨â€ðŸ‘§â€ðŸ‘§",fitzpatrick_scale:false,category:"people"},family_woman_boy:{keywords:["home","parent","people","human","child"],char:"👩â€ðŸ‘¦",fitzpatrick_scale:false,category:"people"},family_woman_girl:{keywords:["home","parent","people","human","child"],char:"👩â€ðŸ‘§",fitzpatrick_scale:false,category:"people"},family_woman_girl_boy:{keywords:["home","parent","people","human","children"],char:"👩â€ðŸ‘§â€ðŸ‘¦",fitzpatrick_scale:false,category:"people"},family_woman_boy_boy:{keywords:["home","parent","people","human","children"],char:"👩â€ðŸ‘¦â€ðŸ‘¦",fitzpatrick_scale:false,category:"people"},family_woman_girl_girl:{keywords:["home","parent","people","human","children"],char:"👩â€ðŸ‘§â€ðŸ‘§",fitzpatrick_scale:false,category:"people"},family_man_boy:{keywords:["home","parent","people","human","child"],char:"👨â€ðŸ‘¦",fitzpatrick_scale:false,category:"people"},family_man_girl:{keywords:["home","parent","people","human","child"],char:"👨â€ðŸ‘§",fitzpatrick_scale:false,category:"people"},family_man_girl_boy:{keywords:["home","parent","people","human","children"],char:"👨â€ðŸ‘§â€ðŸ‘¦",fitzpatrick_scale:false,category:"people"},family_man_boy_boy:{keywords:["home","parent","people","human","children"],char:"👨â€ðŸ‘¦â€ðŸ‘¦",fitzpatrick_scale:false,category:"people"},family_man_girl_girl:{keywords:["home","parent","people","human","children"],char:"👨â€ðŸ‘§â€ðŸ‘§",fitzpatrick_scale:false,category:"people"},yarn:{keywords:["ball","crochet","knit"],char:"🧶",fitzpatrick_scale:false,category:"people"},thread:{keywords:["needle","sewing","spool","string"],char:"🧵",fitzpatrick_scale:false,category:"people"},coat:{keywords:["jacket"],char:"🧥",fitzpatrick_scale:false,category:"people"},labcoat:{keywords:["doctor","experiment","scientist","chemist"],char:"🥼",fitzpatrick_scale:false,category:"people"},womans_clothes:{keywords:["fashion","shopping_bags","female"],char:"👚",fitzpatrick_scale:false,category:"people"},tshirt:{keywords:["fashion","cloth","casual","shirt","tee"],char:"👕",fitzpatrick_scale:false,category:"people"},jeans:{keywords:["fashion","shopping"],char:"👖",fitzpatrick_scale:false,category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],char:"👔",fitzpatrick_scale:false,category:"people"},dress:{keywords:["clothes","fashion","shopping"],char:"👗",fitzpatrick_scale:false,category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],char:"👙",fitzpatrick_scale:false,category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],char:"👘",fitzpatrick_scale:false,category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],char:"💄",fitzpatrick_scale:false,category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],char:"💋",fitzpatrick_scale:false,category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],char:"👣",fitzpatrick_scale:false,category:"people"},flat_shoe:{keywords:["ballet","slip-on","slipper"],char:"🥿",fitzpatrick_scale:false,category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],char:"👠",fitzpatrick_scale:false,category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],char:"👡",fitzpatrick_scale:false,category:"people"},boot:{keywords:["shoes","fashion"],char:"👢",fitzpatrick_scale:false,category:"people"},mans_shoe:{keywords:["fashion","male"],char:"👞",fitzpatrick_scale:false,category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],char:"👟",fitzpatrick_scale:false,category:"people"},hiking_boot:{keywords:["backpacking","camping","hiking"],char:"🥾",fitzpatrick_scale:false,category:"people"},socks:{keywords:["stockings","clothes"],char:"🧦",fitzpatrick_scale:false,category:"people"},gloves:{keywords:["hands","winter","clothes"],char:"🧤",fitzpatrick_scale:false,category:"people"},scarf:{keywords:["neck","winter","clothes"],char:"🧣",fitzpatrick_scale:false,category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],char:"👒",fitzpatrick_scale:false,category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],char:"🎩",fitzpatrick_scale:false,category:"people"},billed_hat:{keywords:["cap","baseball"],char:"🧢",fitzpatrick_scale:false,category:"people"},rescue_worker_helmet:{keywords:["construction","build"],char:"⛑",fitzpatrick_scale:false,category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],char:"🎓",fitzpatrick_scale:false,category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],char:"👑",fitzpatrick_scale:false,category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],char:"🎒",fitzpatrick_scale:false,category:"people"},luggage:{keywords:["packing","travel"],char:"🧳",fitzpatrick_scale:false,category:"people"},pouch:{keywords:["bag","accessories","shopping"],char:"ðŸ‘",fitzpatrick_scale:false,category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],char:"👛",fitzpatrick_scale:false,category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],char:"👜",fitzpatrick_scale:false,category:"people"},briefcase:{keywords:["business","documents","work","law","legal","job","career"],char:"💼",fitzpatrick_scale:false,category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],char:"👓",fitzpatrick_scale:false,category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],char:"🕶",fitzpatrick_scale:false,category:"people"},goggles:{keywords:["eyes","protection","safety"],char:"🥽",fitzpatrick_scale:false,category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],char:"ðŸ’",fitzpatrick_scale:false,category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],char:"🌂",fitzpatrick_scale:false,category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],char:"ðŸ¶",fitzpatrick_scale:false,category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],char:"ðŸ±",fitzpatrick_scale:false,category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese_wedge","rodent"],char:"ðŸ­",fitzpatrick_scale:false,category:"animals_and_nature"},hamster:{keywords:["animal","nature"],char:"ðŸ¹",fitzpatrick_scale:false,category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],char:"ðŸ°",fitzpatrick_scale:false,category:"animals_and_nature"},fox_face:{keywords:["animal","nature","face"],char:"🦊",fitzpatrick_scale:false,category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],char:"ðŸ»",fitzpatrick_scale:false,category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],char:"ðŸ¼",fitzpatrick_scale:false,category:"animals_and_nature"},koala:{keywords:["animal","nature"],char:"ðŸ¨",fitzpatrick_scale:false,category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],char:"ðŸ¯",fitzpatrick_scale:false,category:"animals_and_nature"},lion:{keywords:["animal","nature"],char:"ðŸ¦",fitzpatrick_scale:false,category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],char:"ðŸ®",fitzpatrick_scale:false,category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],char:"ðŸ·",fitzpatrick_scale:false,category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],char:"ðŸ½",fitzpatrick_scale:false,category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],char:"ðŸ¸",fitzpatrick_scale:false,category:"animals_and_nature"},squid:{keywords:["animal","nature","ocean","sea"],char:"🦑",fitzpatrick_scale:false,category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],char:"ðŸ™",fitzpatrick_scale:false,category:"animals_and_nature"},shrimp:{keywords:["animal","ocean","nature","seafood"],char:"ðŸ¦",fitzpatrick_scale:false,category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],char:"ðŸµ",fitzpatrick_scale:false,category:"animals_and_nature"},gorilla:{keywords:["animal","nature","circus"],char:"ðŸ¦",fitzpatrick_scale:false,category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],char:"🙈",fitzpatrick_scale:false,category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],char:"🙉",fitzpatrick_scale:false,category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],char:"🙊",fitzpatrick_scale:false,category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],char:"ðŸ’",fitzpatrick_scale:false,category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],char:"ðŸ”",fitzpatrick_scale:false,category:"animals_and_nature"},penguin:{keywords:["animal","nature"],char:"ðŸ§",fitzpatrick_scale:false,category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],char:"ðŸ¦",fitzpatrick_scale:false,category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],char:"ðŸ¤",fitzpatrick_scale:false,category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],char:"ðŸ£",fitzpatrick_scale:false,category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],char:"ðŸ¥",fitzpatrick_scale:false,category:"animals_and_nature"},duck:{keywords:["animal","nature","bird","mallard"],char:"🦆",fitzpatrick_scale:false,category:"animals_and_nature"},eagle:{keywords:["animal","nature","bird"],char:"🦅",fitzpatrick_scale:false,category:"animals_and_nature"},owl:{keywords:["animal","nature","bird","hoot"],char:"🦉",fitzpatrick_scale:false,category:"animals_and_nature"},bat:{keywords:["animal","nature","blind","vampire"],char:"🦇",fitzpatrick_scale:false,category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],char:"ðŸº",fitzpatrick_scale:false,category:"animals_and_nature"},boar:{keywords:["animal","nature"],char:"ðŸ—",fitzpatrick_scale:false,category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],char:"ðŸ´",fitzpatrick_scale:false,category:"animals_and_nature"},unicorn:{keywords:["animal","nature","mystical"],char:"🦄",fitzpatrick_scale:false,category:"animals_and_nature"},honeybee:{keywords:["animal","insect","nature","bug","spring","honey"],char:"ðŸ",fitzpatrick_scale:false,category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],char:"ðŸ›",fitzpatrick_scale:false,category:"animals_and_nature"},butterfly:{keywords:["animal","insect","nature","caterpillar"],char:"🦋",fitzpatrick_scale:false,category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],char:"ðŸŒ",fitzpatrick_scale:false,category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],char:"ðŸž",fitzpatrick_scale:false,category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],char:"ðŸœ",fitzpatrick_scale:false,category:"animals_and_nature"},grasshopper:{keywords:["animal","cricket","chirp"],char:"🦗",fitzpatrick_scale:false,category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],char:"🕷",fitzpatrick_scale:false,category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],char:"🦂",fitzpatrick_scale:false,category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],char:"🦀",fitzpatrick_scale:false,category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],char:"ðŸ",fitzpatrick_scale:false,category:"animals_and_nature"},lizard:{keywords:["animal","nature","reptile"],char:"🦎",fitzpatrick_scale:false,category:"animals_and_nature"},"t-rex":{keywords:["animal","nature","dinosaur","tyrannosaurus","extinct"],char:"🦖",fitzpatrick_scale:false,category:"animals_and_nature"},sauropod:{keywords:["animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"],char:"🦕",fitzpatrick_scale:false,category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],char:"ðŸ¢",fitzpatrick_scale:false,category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],char:"ðŸ ",fitzpatrick_scale:false,category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],char:"ðŸŸ",fitzpatrick_scale:false,category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],char:"ðŸ¡",fitzpatrick_scale:false,category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],char:"ðŸ¬",fitzpatrick_scale:false,category:"animals_and_nature"},shark:{keywords:["animal","nature","fish","sea","ocean","jaws","fins","beach"],char:"🦈",fitzpatrick_scale:false,category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],char:"ðŸ³",fitzpatrick_scale:false,category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],char:"ðŸ‹",fitzpatrick_scale:false,category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],char:"ðŸŠ",fitzpatrick_scale:false,category:"animals_and_nature"},leopard:{keywords:["animal","nature"],char:"ðŸ†",fitzpatrick_scale:false,category:"animals_and_nature"},zebra:{keywords:["animal","nature","stripes","safari"],char:"🦓",fitzpatrick_scale:false,category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],char:"ðŸ…",fitzpatrick_scale:false,category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],char:"ðŸƒ",fitzpatrick_scale:false,category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],char:"ðŸ‚",fitzpatrick_scale:false,category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],char:"ðŸ„",fitzpatrick_scale:false,category:"animals_and_nature"},deer:{keywords:["animal","nature","horns","venison"],char:"🦌",fitzpatrick_scale:false,category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],char:"ðŸª",fitzpatrick_scale:false,category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],char:"ðŸ«",fitzpatrick_scale:false,category:"animals_and_nature"},giraffe:{keywords:["animal","nature","spots","safari"],char:"🦒",fitzpatrick_scale:false,category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","th","circus"],char:"ðŸ˜",fitzpatrick_scale:false,category:"animals_and_nature"},rhinoceros:{keywords:["animal","nature","horn"],char:"ðŸ¦",fitzpatrick_scale:false,category:"animals_and_nature"},goat:{keywords:["animal","nature"],char:"ðŸ",fitzpatrick_scale:false,category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],char:"ðŸ",fitzpatrick_scale:false,category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],char:"ðŸ‘",fitzpatrick_scale:false,category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],char:"ðŸŽ",fitzpatrick_scale:false,category:"animals_and_nature"},pig2:{keywords:["animal","nature"],char:"ðŸ–",fitzpatrick_scale:false,category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],char:"ðŸ€",fitzpatrick_scale:false,category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],char:"ðŸ",fitzpatrick_scale:false,category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],char:"ðŸ“",fitzpatrick_scale:false,category:"animals_and_nature"},turkey:{keywords:["animal","bird"],char:"🦃",fitzpatrick_scale:false,category:"animals_and_nature"},dove:{keywords:["animal","bird"],char:"🕊",fitzpatrick_scale:false,category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],char:"ðŸ•",fitzpatrick_scale:false,category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],char:"ðŸ©",fitzpatrick_scale:false,category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],char:"ðŸˆ",fitzpatrick_scale:false,category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],char:"ðŸ‡",fitzpatrick_scale:false,category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],char:"ðŸ¿",fitzpatrick_scale:false,category:"animals_and_nature"},hedgehog:{keywords:["animal","nature","spiny"],char:"🦔",fitzpatrick_scale:false,category:"animals_and_nature"},raccoon:{keywords:["animal","nature"],char:"ðŸ¦",fitzpatrick_scale:false,category:"animals_and_nature"},llama:{keywords:["animal","nature","alpaca"],char:"🦙",fitzpatrick_scale:false,category:"animals_and_nature"},hippopotamus:{keywords:["animal","nature"],char:"🦛",fitzpatrick_scale:false,category:"animals_and_nature"},kangaroo:{keywords:["animal","nature","australia","joey","hop","marsupial"],char:"🦘",fitzpatrick_scale:false,category:"animals_and_nature"},badger:{keywords:["animal","nature","honey"],char:"🦡",fitzpatrick_scale:false,category:"animals_and_nature"},swan:{keywords:["animal","nature","bird"],char:"🦢",fitzpatrick_scale:false,category:"animals_and_nature"},peacock:{keywords:["animal","nature","peahen","bird"],char:"🦚",fitzpatrick_scale:false,category:"animals_and_nature"},parrot:{keywords:["animal","nature","bird","pirate","talk"],char:"🦜",fitzpatrick_scale:false,category:"animals_and_nature"},lobster:{keywords:["animal","nature","bisque","claws","seafood"],char:"🦞",fitzpatrick_scale:false,category:"animals_and_nature"},mosquito:{keywords:["animal","nature","insect","malaria"],char:"🦟",fitzpatrick_scale:false,category:"animals_and_nature"},paw_prints:{keywords:["animal","tracking","footprints","dog","cat","pet","feet"],char:"ðŸ¾",fitzpatrick_scale:false,category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],char:"ðŸ‰",fitzpatrick_scale:false,category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],char:"ðŸ²",fitzpatrick_scale:false,category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],char:"🌵",fitzpatrick_scale:false,category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],char:"🎄",fitzpatrick_scale:false,category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],char:"🌲",fitzpatrick_scale:false,category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],char:"🌳",fitzpatrick_scale:false,category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],char:"🌴",fitzpatrick_scale:false,category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],char:"🌱",fitzpatrick_scale:false,category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],char:"🌿",fitzpatrick_scale:false,category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],char:"☘",fitzpatrick_scale:false,category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],char:"ðŸ€",fitzpatrick_scale:false,category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],char:"ðŸŽ",fitzpatrick_scale:false,category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],char:"🎋",fitzpatrick_scale:false,category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],char:"ðŸƒ",fitzpatrick_scale:false,category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],char:"ðŸ‚",fitzpatrick_scale:false,category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","ca","fall"],char:"ðŸ",fitzpatrick_scale:false,category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],char:"🌾",fitzpatrick_scale:false,category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],char:"🌺",fitzpatrick_scale:false,category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],char:"🌻",fitzpatrick_scale:false,category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],char:"🌹",fitzpatrick_scale:false,category:"animals_and_nature"},wilted_flower:{keywords:["plant","nature","flower"],char:"🥀",fitzpatrick_scale:false,category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],char:"🌷",fitzpatrick_scale:false,category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],char:"🌼",fitzpatrick_scale:false,category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],char:"🌸",fitzpatrick_scale:false,category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],char:"ðŸ’",fitzpatrick_scale:false,category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],char:"ðŸ„",fitzpatrick_scale:false,category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],char:"🌰",fitzpatrick_scale:false,category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],char:"🎃",fitzpatrick_scale:false,category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],char:"ðŸš",fitzpatrick_scale:false,category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],char:"🕸",fitzpatrick_scale:false,category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],char:"🌎",fitzpatrick_scale:false,category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],char:"ðŸŒ",fitzpatrick_scale:false,category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],char:"ðŸŒ",fitzpatrick_scale:false,category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],char:"🌕",fitzpatrick_scale:false,category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],char:"🌖",fitzpatrick_scale:false,category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"🌗",fitzpatrick_scale:false,category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"🌘",fitzpatrick_scale:false,category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"🌑",fitzpatrick_scale:false,category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"🌒",fitzpatrick_scale:false,category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"🌓",fitzpatrick_scale:false,category:"animals_and_nature"},waxing_gibbous_moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],char:"🌔",fitzpatrick_scale:false,category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"🌚",fitzpatrick_scale:false,category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"ðŸŒ",fitzpatrick_scale:false,category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"🌛",fitzpatrick_scale:false,category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"🌜",fitzpatrick_scale:false,category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],char:"🌞",fitzpatrick_scale:false,category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],char:"🌙",fitzpatrick_scale:false,category:"animals_and_nature"},star:{keywords:["night","yellow"],char:"â­",fitzpatrick_scale:false,category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],char:"🌟",fitzpatrick_scale:false,category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],char:"💫",fitzpatrick_scale:false,category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],char:"✨",fitzpatrick_scale:false,category:"animals_and_nature"},comet:{keywords:["space"],char:"☄",fitzpatrick_scale:false,category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],char:"☀ï¸",fitzpatrick_scale:false,category:"animals_and_nature"},sun_behind_small_cloud:{keywords:["weather"],char:"🌤",fitzpatrick_scale:false,category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],char:"â›…",fitzpatrick_scale:false,category:"animals_and_nature"},sun_behind_large_cloud:{keywords:["weather"],char:"🌥",fitzpatrick_scale:false,category:"animals_and_nature"},sun_behind_rain_cloud:{keywords:["weather"],char:"🌦",fitzpatrick_scale:false,category:"animals_and_nature"},cloud:{keywords:["weather","sky"],char:"â˜ï¸",fitzpatrick_scale:false,category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],char:"🌧",fitzpatrick_scale:false,category:"animals_and_nature"},cloud_with_lightning_and_rain:{keywords:["weather","lightning"],char:"⛈",fitzpatrick_scale:false,category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],char:"🌩",fitzpatrick_scale:false,category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],char:"âš¡",fitzpatrick_scale:false,category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],char:"🔥",fitzpatrick_scale:false,category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],char:"💥",fitzpatrick_scale:false,category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],char:"â„ï¸",fitzpatrick_scale:false,category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],char:"🌨",fitzpatrick_scale:false,category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],char:"⛄",fitzpatrick_scale:false,category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],char:"☃",fitzpatrick_scale:false,category:"animals_and_nature"},wind_face:{keywords:["gust","air"],char:"🌬",fitzpatrick_scale:false,category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],char:"💨",fitzpatrick_scale:false,category:"animals_and_nature"},tornado:{keywords:["weather","cyclone","twister"],char:"🌪",fitzpatrick_scale:false,category:"animals_and_nature"},fog:{keywords:["weather"],char:"🌫",fitzpatrick_scale:false,category:"animals_and_nature"},open_umbrella:{keywords:["weather","spring"],char:"☂",fitzpatrick_scale:false,category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],char:"☔",fitzpatrick_scale:false,category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],char:"💧",fitzpatrick_scale:false,category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],char:"💦",fitzpatrick_scale:false,category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],char:"🌊",fitzpatrick_scale:false,category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],char:"ðŸ",fitzpatrick_scale:false,category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],char:"ðŸŽ",fitzpatrick_scale:false,category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],char:"ðŸ",fitzpatrick_scale:false,category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],char:"ðŸŠ",fitzpatrick_scale:false,category:"food_and_drink"},lemon:{keywords:["fruit","nature"],char:"ðŸ‹",fitzpatrick_scale:false,category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],char:"ðŸŒ",fitzpatrick_scale:false,category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],char:"ðŸ‰",fitzpatrick_scale:false,category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],char:"ðŸ‡",fitzpatrick_scale:false,category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],char:"ðŸ“",fitzpatrick_scale:false,category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],char:"ðŸˆ",fitzpatrick_scale:false,category:"food_and_drink"},cherries:{keywords:["food","fruit"],char:"ðŸ’",fitzpatrick_scale:false,category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],char:"ðŸ‘",fitzpatrick_scale:false,category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],char:"ðŸ",fitzpatrick_scale:false,category:"food_and_drink"},coconut:{keywords:["fruit","nature","food","palm"],char:"🥥",fitzpatrick_scale:false,category:"food_and_drink"},kiwi_fruit:{keywords:["fruit","food"],char:"ðŸ¥",fitzpatrick_scale:false,category:"food_and_drink"},mango:{keywords:["fruit","food","tropical"],char:"🥭",fitzpatrick_scale:false,category:"food_and_drink"},avocado:{keywords:["fruit","food"],char:"🥑",fitzpatrick_scale:false,category:"food_and_drink"},broccoli:{keywords:["fruit","food","vegetable"],char:"🥦",fitzpatrick_scale:false,category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],char:"ðŸ…",fitzpatrick_scale:false,category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],char:"ðŸ†",fitzpatrick_scale:false,category:"food_and_drink"},cucumber:{keywords:["fruit","food","pickle"],char:"🥒",fitzpatrick_scale:false,category:"food_and_drink"},carrot:{keywords:["vegetable","food","orange"],char:"🥕",fitzpatrick_scale:false,category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],char:"🌶",fitzpatrick_scale:false,category:"food_and_drink"},potato:{keywords:["food","tuber","vegatable","starch"],char:"🥔",fitzpatrick_scale:false,category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],char:"🌽",fitzpatrick_scale:false,category:"food_and_drink"},leafy_greens:{keywords:["food","vegetable","plant","bok choy","cabbage","kale","lettuce"],char:"🥬",fitzpatrick_scale:false,category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],char:"ðŸ ",fitzpatrick_scale:false,category:"food_and_drink"},peanuts:{keywords:["food","nut"],char:"🥜",fitzpatrick_scale:false,category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],char:"ðŸ¯",fitzpatrick_scale:false,category:"food_and_drink"},croissant:{keywords:["food","bread","french"],char:"ðŸ¥",fitzpatrick_scale:false,category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],char:"ðŸž",fitzpatrick_scale:false,category:"food_and_drink"},baguette_bread:{keywords:["food","bread","french"],char:"🥖",fitzpatrick_scale:false,category:"food_and_drink"},bagel:{keywords:["food","bread","bakery","schmear"],char:"🥯",fitzpatrick_scale:false,category:"food_and_drink"},pretzel:{keywords:["food","bread","twisted"],char:"🥨",fitzpatrick_scale:false,category:"food_and_drink"},cheese:{keywords:["food","chadder"],char:"🧀",fitzpatrick_scale:false,category:"food_and_drink"},egg:{keywords:["food","chicken","breakfast"],char:"🥚",fitzpatrick_scale:false,category:"food_and_drink"},bacon:{keywords:["food","breakfast","pork","pig","meat"],char:"🥓",fitzpatrick_scale:false,category:"food_and_drink"},steak:{keywords:["food","cow","meat","cut","chop","lambchop","porkchop"],char:"🥩",fitzpatrick_scale:false,category:"food_and_drink"},pancakes:{keywords:["food","breakfast","flapjacks","hotcakes"],char:"🥞",fitzpatrick_scale:false,category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],char:"ðŸ—",fitzpatrick_scale:false,category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],char:"ðŸ–",fitzpatrick_scale:false,category:"food_and_drink"},bone:{keywords:["skeleton"],char:"🦴",fitzpatrick_scale:false,category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],char:"ðŸ¤",fitzpatrick_scale:false,category:"food_and_drink"},fried_egg:{keywords:["food","breakfast","kitchen","egg"],char:"ðŸ³",fitzpatrick_scale:false,category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],char:"ðŸ”",fitzpatrick_scale:false,category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],char:"ðŸŸ",fitzpatrick_scale:false,category:"food_and_drink"},stuffed_flatbread:{keywords:["food","flatbread","stuffed","gyro"],char:"🥙",fitzpatrick_scale:false,category:"food_and_drink"},hotdog:{keywords:["food","frankfurter"],char:"🌭",fitzpatrick_scale:false,category:"food_and_drink"},pizza:{keywords:["food","party"],char:"ðŸ•",fitzpatrick_scale:false,category:"food_and_drink"},sandwich:{keywords:["food","lunch","bread"],char:"🥪",fitzpatrick_scale:false,category:"food_and_drink"},canned_food:{keywords:["food","soup"],char:"🥫",fitzpatrick_scale:false,category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],char:"ðŸ",fitzpatrick_scale:false,category:"food_and_drink"},taco:{keywords:["food","mexican"],char:"🌮",fitzpatrick_scale:false,category:"food_and_drink"},burrito:{keywords:["food","mexican"],char:"🌯",fitzpatrick_scale:false,category:"food_and_drink"},green_salad:{keywords:["food","healthy","lettuce"],char:"🥗",fitzpatrick_scale:false,category:"food_and_drink"},shallow_pan_of_food:{keywords:["food","cooking","casserole","paella"],char:"🥘",fitzpatrick_scale:false,category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],char:"ðŸœ",fitzpatrick_scale:false,category:"food_and_drink"},stew:{keywords:["food","meat","soup"],char:"ðŸ²",fitzpatrick_scale:false,category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"],char:"ðŸ¥",fitzpatrick_scale:false,category:"food_and_drink"},fortune_cookie:{keywords:["food","prophecy"],char:"🥠",fitzpatrick_scale:false,category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],char:"ðŸ£",fitzpatrick_scale:false,category:"food_and_drink"},bento:{keywords:["food","japanese","box"],char:"ðŸ±",fitzpatrick_scale:false,category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],char:"ðŸ›",fitzpatrick_scale:false,category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],char:"ðŸ™",fitzpatrick_scale:false,category:"food_and_drink"},rice:{keywords:["food","china","asian"],char:"ðŸš",fitzpatrick_scale:false,category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],char:"ðŸ˜",fitzpatrick_scale:false,category:"food_and_drink"},oden:{keywords:["food","japanese"],char:"ðŸ¢",fitzpatrick_scale:false,category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],char:"ðŸ¡",fitzpatrick_scale:false,category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],char:"ðŸ§",fitzpatrick_scale:false,category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],char:"ðŸ¨",fitzpatrick_scale:false,category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],char:"ðŸ¦",fitzpatrick_scale:false,category:"food_and_drink"},pie:{keywords:["food","dessert","pastry"],char:"🥧",fitzpatrick_scale:false,category:"food_and_drink"},cake:{keywords:["food","dessert"],char:"ðŸ°",fitzpatrick_scale:false,category:"food_and_drink"},cupcake:{keywords:["food","dessert","bakery","sweet"],char:"ðŸ§",fitzpatrick_scale:false,category:"food_and_drink"},moon_cake:{keywords:["food","autumn"],char:"🥮",fitzpatrick_scale:false,category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],char:"🎂",fitzpatrick_scale:false,category:"food_and_drink"},custard:{keywords:["dessert","food"],char:"ðŸ®",fitzpatrick_scale:false,category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],char:"ðŸ¬",fitzpatrick_scale:false,category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],char:"ðŸ­",fitzpatrick_scale:false,category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],char:"ðŸ«",fitzpatrick_scale:false,category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],char:"ðŸ¿",fitzpatrick_scale:false,category:"food_and_drink"},dumpling:{keywords:["food","empanada","pierogi","potsticker"],char:"🥟",fitzpatrick_scale:false,category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],char:"ðŸ©",fitzpatrick_scale:false,category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],char:"ðŸª",fitzpatrick_scale:false,category:"food_and_drink"},milk_glass:{keywords:["beverage","drink","cow"],char:"🥛",fitzpatrick_scale:false,category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:"ðŸº",fitzpatrick_scale:false,category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:"ðŸ»",fitzpatrick_scale:false,category:"food_and_drink"},clinking_glasses:{keywords:["beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"],char:"🥂",fitzpatrick_scale:false,category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],char:"ðŸ·",fitzpatrick_scale:false,category:"food_and_drink"},tumbler_glass:{keywords:["drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"],char:"🥃",fitzpatrick_scale:false,category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],char:"ðŸ¸",fitzpatrick_scale:false,category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],char:"ðŸ¹",fitzpatrick_scale:false,category:"food_and_drink"},champagne:{keywords:["drink","wine","bottle","celebration"],char:"ðŸ¾",fitzpatrick_scale:false,category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],char:"ðŸ¶",fitzpatrick_scale:false,category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],char:"ðŸµ",fitzpatrick_scale:false,category:"food_and_drink"},cup_with_straw:{keywords:["drink","soda"],char:"🥤",fitzpatrick_scale:false,category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],char:"☕",fitzpatrick_scale:false,category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],char:"ðŸ¼",fitzpatrick_scale:false,category:"food_and_drink"},salt:{keywords:["condiment","shaker"],char:"🧂",fitzpatrick_scale:false,category:"food_and_drink"},spoon:{keywords:["cutlery","kitchen","tableware"],char:"🥄",fitzpatrick_scale:false,category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],char:"ðŸ´",fitzpatrick_scale:false,category:"food_and_drink"},plate_with_cutlery:{keywords:["food","eat","meal","lunch","dinner","restaurant"],char:"ðŸ½",fitzpatrick_scale:false,category:"food_and_drink"},bowl_with_spoon:{keywords:["food","breakfast","cereal","oatmeal","porridge"],char:"🥣",fitzpatrick_scale:false,category:"food_and_drink"},takeout_box:{keywords:["food","leftovers"],char:"🥡",fitzpatrick_scale:false,category:"food_and_drink"},chopsticks:{keywords:["food"],char:"🥢",fitzpatrick_scale:false,category:"food_and_drink"},soccer:{keywords:["sports","football"],char:"âš½",fitzpatrick_scale:false,category:"activity"},basketball:{keywords:["sports","balls","NBA"],char:"ðŸ€",fitzpatrick_scale:false,category:"activity"},football:{keywords:["sports","balls","NFL"],char:"ðŸˆ",fitzpatrick_scale:false,category:"activity"},baseball:{keywords:["sports","balls"],char:"âš¾",fitzpatrick_scale:false,category:"activity"},softball:{keywords:["sports","balls"],char:"🥎",fitzpatrick_scale:false,category:"activity"},tennis:{keywords:["sports","balls","green"],char:"🎾",fitzpatrick_scale:false,category:"activity"},volleyball:{keywords:["sports","balls"],char:"ðŸ",fitzpatrick_scale:false,category:"activity"},rugby_football:{keywords:["sports","team"],char:"ðŸ‰",fitzpatrick_scale:false,category:"activity"},flying_disc:{keywords:["sports","frisbee","ultimate"],char:"ðŸ¥",fitzpatrick_scale:false,category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],char:"🎱",fitzpatrick_scale:false,category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],char:"⛳",fitzpatrick_scale:false,category:"activity"},golfing_woman:{keywords:["sports","business","woman","female"],char:"ðŸŒï¸â€â™€ï¸",fitzpatrick_scale:false,category:"activity"},golfing_man:{keywords:["sports","business"],char:"ðŸŒ",fitzpatrick_scale:true,category:"activity"},ping_pong:{keywords:["sports","pingpong"],char:"ðŸ“",fitzpatrick_scale:false,category:"activity"},badminton:{keywords:["sports"],char:"ðŸ¸",fitzpatrick_scale:false,category:"activity"},goal_net:{keywords:["sports"],char:"🥅",fitzpatrick_scale:false,category:"activity"},ice_hockey:{keywords:["sports"],char:"ðŸ’",fitzpatrick_scale:false,category:"activity"},field_hockey:{keywords:["sports"],char:"ðŸ‘",fitzpatrick_scale:false,category:"activity"},lacrosse:{keywords:["sports","ball","stick"],char:"ðŸ¥",fitzpatrick_scale:false,category:"activity"},cricket:{keywords:["sports"],char:"ðŸ",fitzpatrick_scale:false,category:"activity"},ski:{keywords:["sports","winter","cold","snow"],char:"🎿",fitzpatrick_scale:false,category:"activity"},skier:{keywords:["sports","winter","snow"],char:"â›·",fitzpatrick_scale:false,category:"activity"},snowboarder:{keywords:["sports","winter"],char:"ðŸ‚",fitzpatrick_scale:true,category:"activity"},person_fencing:{keywords:["sports","fencing","sword"],char:"🤺",fitzpatrick_scale:false,category:"activity"},women_wrestling:{keywords:["sports","wrestlers"],char:"🤼â€â™€ï¸",fitzpatrick_scale:false,category:"activity"},men_wrestling:{keywords:["sports","wrestlers"],char:"🤼â€â™‚ï¸",fitzpatrick_scale:false,category:"activity"},woman_cartwheeling:{keywords:["gymnastics"],char:"🤸â€â™€ï¸",fitzpatrick_scale:true,category:"activity"},man_cartwheeling:{keywords:["gymnastics"],char:"🤸â€â™‚ï¸",fitzpatrick_scale:true,category:"activity"},woman_playing_handball:{keywords:["sports"],char:"🤾â€â™€ï¸",fitzpatrick_scale:true,category:"activity"},man_playing_handball:{keywords:["sports"],char:"🤾â€â™‚ï¸",fitzpatrick_scale:true,category:"activity"},ice_skate:{keywords:["sports"],char:"⛸",fitzpatrick_scale:false,category:"activity"},curling_stone:{keywords:["sports"],char:"🥌",fitzpatrick_scale:false,category:"activity"},skateboard:{keywords:["board"],char:"🛹",fitzpatrick_scale:false,category:"activity"},sled:{keywords:["sleigh","luge","toboggan"],char:"🛷",fitzpatrick_scale:false,category:"activity"},bow_and_arrow:{keywords:["sports"],char:"ðŸ¹",fitzpatrick_scale:false,category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],char:"🎣",fitzpatrick_scale:false,category:"activity"},boxing_glove:{keywords:["sports","fighting"],char:"🥊",fitzpatrick_scale:false,category:"activity"},martial_arts_uniform:{keywords:["judo","karate","taekwondo"],char:"🥋",fitzpatrick_scale:false,category:"activity"},rowing_woman:{keywords:["sports","hobby","water","ship","woman","female"],char:"🚣â€â™€ï¸",fitzpatrick_scale:true,category:"activity"},rowing_man:{keywords:["sports","hobby","water","ship"],char:"🚣",fitzpatrick_scale:true,category:"activity"},climbing_woman:{keywords:["sports","hobby","woman","female","rock"],char:"🧗â€â™€ï¸",fitzpatrick_scale:true,category:"activity"},climbing_man:{keywords:["sports","hobby","man","male","rock"],char:"🧗â€â™‚ï¸",fitzpatrick_scale:true,category:"activity"},swimming_woman:{keywords:["sports","exercise","human","athlete","water","summer","woman","female"],char:"ðŸŠâ€â™€ï¸",fitzpatrick_scale:true,category:"activity"},swimming_man:{keywords:["sports","exercise","human","athlete","water","summer"],char:"ðŸŠ",fitzpatrick_scale:true,category:"activity"},woman_playing_water_polo:{keywords:["sports","pool"],char:"🤽â€â™€ï¸",fitzpatrick_scale:true,category:"activity"},man_playing_water_polo:{keywords:["sports","pool"],char:"🤽â€â™‚ï¸",fitzpatrick_scale:true,category:"activity"},woman_in_lotus_position:{keywords:["woman","female","meditation","yoga","serenity","zen","mindfulness"],char:"🧘â€â™€ï¸",fitzpatrick_scale:true,category:"activity"},man_in_lotus_position:{keywords:["man","male","meditation","yoga","serenity","zen","mindfulness"],char:"🧘â€â™‚ï¸",fitzpatrick_scale:true,category:"activity"},surfing_woman:{keywords:["sports","ocean","sea","summer","beach","woman","female"],char:"ðŸ„â€â™€ï¸",fitzpatrick_scale:true,category:"activity"},surfing_man:{keywords:["sports","ocean","sea","summer","beach"],char:"ðŸ„",fitzpatrick_scale:true,category:"activity"},bath:{keywords:["clean","shower","bathroom"],char:"🛀",fitzpatrick_scale:true,category:"activity"},basketball_woman:{keywords:["sports","human","woman","female"],char:"⛹ï¸â€â™€ï¸",fitzpatrick_scale:true,category:"activity"},basketball_man:{keywords:["sports","human"],char:"⛹",fitzpatrick_scale:true,category:"activity"},weight_lifting_woman:{keywords:["sports","training","exercise","woman","female"],char:"ðŸ‹ï¸â€â™€ï¸",fitzpatrick_scale:true,category:"activity"},weight_lifting_man:{keywords:["sports","training","exercise"],char:"ðŸ‹",fitzpatrick_scale:true,category:"activity"},biking_woman:{keywords:["sports","bike","exercise","hipster","woman","female"],char:"🚴â€â™€ï¸",fitzpatrick_scale:true,category:"activity"},biking_man:{keywords:["sports","bike","exercise","hipster"],char:"🚴",fitzpatrick_scale:true,category:"activity"},mountain_biking_woman:{keywords:["transportation","sports","human","race","bike","woman","female"],char:"🚵â€â™€ï¸",fitzpatrick_scale:true,category:"activity"},mountain_biking_man:{keywords:["transportation","sports","human","race","bike"],char:"🚵",fitzpatrick_scale:true,category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],char:"ðŸ‡",fitzpatrick_scale:true,category:"activity"},business_suit_levitating:{keywords:["suit","business","levitate","hover","jump"],char:"🕴",fitzpatrick_scale:true,category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],char:"ðŸ†",fitzpatrick_scale:false,category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],char:"🎽",fitzpatrick_scale:false,category:"activity"},medal_sports:{keywords:["award","winning"],char:"ðŸ…",fitzpatrick_scale:false,category:"activity"},medal_military:{keywords:["award","winning","army"],char:"🎖",fitzpatrick_scale:false,category:"activity"},"1st_place_medal":{keywords:["award","winning","first"],char:"🥇",fitzpatrick_scale:false,category:"activity"},"2nd_place_medal":{keywords:["award","second"],char:"🥈",fitzpatrick_scale:false,category:"activity"},"3rd_place_medal":{keywords:["award","third"],char:"🥉",fitzpatrick_scale:false,category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],char:"🎗",fitzpatrick_scale:false,category:"activity"},rosette:{keywords:["flower","decoration","military"],char:"ðŸµ",fitzpatrick_scale:false,category:"activity"},ticket:{keywords:["event","concert","pass"],char:"🎫",fitzpatrick_scale:false,category:"activity"},tickets:{keywords:["sports","concert","entrance"],char:"🎟",fitzpatrick_scale:false,category:"activity"},performing_arts:{keywords:["acting","theater","drama"],char:"🎭",fitzpatrick_scale:false,category:"activity"},art:{keywords:["design","paint","draw","colors"],char:"🎨",fitzpatrick_scale:false,category:"activity"},circus_tent:{keywords:["festival","carnival","party"],char:"🎪",fitzpatrick_scale:false,category:"activity"},woman_juggling:{keywords:["juggle","balance","skill","multitask"],char:"🤹â€â™€ï¸",fitzpatrick_scale:true,category:"activity"},man_juggling:{keywords:["juggle","balance","skill","multitask"],char:"🤹â€â™‚ï¸",fitzpatrick_scale:true,category:"activity"},microphone:{keywords:["sound","music","PA","sing","talkshow"],char:"🎤",fitzpatrick_scale:false,category:"activity"},headphones:{keywords:["music","score","gadgets"],char:"🎧",fitzpatrick_scale:false,category:"activity"},musical_score:{keywords:["treble","clef","compose"],char:"🎼",fitzpatrick_scale:false,category:"activity"},musical_keyboard:{keywords:["piano","instrument","compose"],char:"🎹",fitzpatrick_scale:false,category:"activity"},drum:{keywords:["music","instrument","drumsticks","snare"],char:"ðŸ¥",fitzpatrick_scale:false,category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],char:"🎷",fitzpatrick_scale:false,category:"activity"},trumpet:{keywords:["music","brass"],char:"🎺",fitzpatrick_scale:false,category:"activity"},guitar:{keywords:["music","instrument"],char:"🎸",fitzpatrick_scale:false,category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],char:"🎻",fitzpatrick_scale:false,category:"activity"},clapper:{keywords:["movie","film","record"],char:"🎬",fitzpatrick_scale:false,category:"activity"},video_game:{keywords:["play","console","PS4","controller"],char:"🎮",fitzpatrick_scale:false,category:"activity"},space_invader:{keywords:["game","arcade","play"],char:"👾",fitzpatrick_scale:false,category:"activity"},dart:{keywords:["game","play","bar","target","bullseye"],char:"🎯",fitzpatrick_scale:false,category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],char:"🎲",fitzpatrick_scale:false,category:"activity"},chess_pawn:{keywords:["expendable"],char:"♟",fitzpatrick_scale:false,category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],char:"🎰",fitzpatrick_scale:false,category:"activity"},jigsaw:{keywords:["interlocking","puzzle","piece"],char:"🧩",fitzpatrick_scale:false,category:"activity"},bowling:{keywords:["sports","fun","play"],char:"🎳",fitzpatrick_scale:false,category:"activity"},red_car:{keywords:["red","transportation","vehicle"],char:"🚗",fitzpatrick_scale:false,category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],char:"🚕",fitzpatrick_scale:false,category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],char:"🚙",fitzpatrick_scale:false,category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],char:"🚌",fitzpatrick_scale:false,category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],char:"🚎",fitzpatrick_scale:false,category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],char:"ðŸŽ",fitzpatrick_scale:false,category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],char:"🚓",fitzpatrick_scale:false,category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],char:"🚑",fitzpatrick_scale:false,category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],char:"🚒",fitzpatrick_scale:false,category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],char:"ðŸš",fitzpatrick_scale:false,category:"travel_and_places"},truck:{keywords:["cars","transportation"],char:"🚚",fitzpatrick_scale:false,category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],char:"🚛",fitzpatrick_scale:false,category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],char:"🚜",fitzpatrick_scale:false,category:"travel_and_places"},kick_scooter:{keywords:["vehicle","kick","razor"],char:"🛴",fitzpatrick_scale:false,category:"travel_and_places"},motorcycle:{keywords:["race","sports","fast"],char:"ðŸ",fitzpatrick_scale:false,category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],char:"🚲",fitzpatrick_scale:false,category:"travel_and_places"},motor_scooter:{keywords:["vehicle","vespa","sasha"],char:"🛵",fitzpatrick_scale:false,category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],char:"🚨",fitzpatrick_scale:false,category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],char:"🚔",fitzpatrick_scale:false,category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],char:"ðŸš",fitzpatrick_scale:false,category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],char:"🚘",fitzpatrick_scale:false,category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],char:"🚖",fitzpatrick_scale:false,category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],char:"🚡",fitzpatrick_scale:false,category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],char:"🚠",fitzpatrick_scale:false,category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],char:"🚟",fitzpatrick_scale:false,category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],char:"🚃",fitzpatrick_scale:false,category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],char:"🚋",fitzpatrick_scale:false,category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],char:"ðŸš",fitzpatrick_scale:false,category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],char:"🚄",fitzpatrick_scale:false,category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],char:"🚅",fitzpatrick_scale:false,category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],char:"🚈",fitzpatrick_scale:false,category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],char:"🚞",fitzpatrick_scale:false,category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],char:"🚂",fitzpatrick_scale:false,category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],char:"🚆",fitzpatrick_scale:false,category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],char:"🚇",fitzpatrick_scale:false,category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],char:"🚊",fitzpatrick_scale:false,category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],char:"🚉",fitzpatrick_scale:false,category:"travel_and_places"},flying_saucer:{keywords:["transportation","vehicle","ufo"],char:"🛸",fitzpatrick_scale:false,category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],char:"ðŸš",fitzpatrick_scale:false,category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],char:"🛩",fitzpatrick_scale:false,category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],char:"✈ï¸",fitzpatrick_scale:false,category:"travel_and_places"},flight_departure:{keywords:["airport","flight","landing"],char:"🛫",fitzpatrick_scale:false,category:"travel_and_places"},flight_arrival:{keywords:["airport","flight","boarding"],char:"🛬",fitzpatrick_scale:false,category:"travel_and_places"},sailboat:{keywords:["ship","summer","transportation","water","sailing"],char:"⛵",fitzpatrick_scale:false,category:"travel_and_places"},motor_boat:{keywords:["ship"],char:"🛥",fitzpatrick_scale:false,category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],char:"🚤",fitzpatrick_scale:false,category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],char:"â›´",fitzpatrick_scale:false,category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],char:"🛳",fitzpatrick_scale:false,category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],char:"🚀",fitzpatrick_scale:false,category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],char:"🛰",fitzpatrick_scale:false,category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],char:"💺",fitzpatrick_scale:false,category:"travel_and_places"},canoe:{keywords:["boat","paddle","water","ship"],char:"🛶",fitzpatrick_scale:false,category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],char:"âš“",fitzpatrick_scale:false,category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],char:"🚧",fitzpatrick_scale:false,category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],char:"⛽",fitzpatrick_scale:false,category:"travel_and_places"},busstop:{keywords:["transportation","wait"],char:"ðŸš",fitzpatrick_scale:false,category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],char:"🚦",fitzpatrick_scale:false,category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],char:"🚥",fitzpatrick_scale:false,category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],char:"ðŸ",fitzpatrick_scale:false,category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],char:"🚢",fitzpatrick_scale:false,category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],char:"🎡",fitzpatrick_scale:false,category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],char:"🎢",fitzpatrick_scale:false,category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],char:"🎠",fitzpatrick_scale:false,category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],char:"ðŸ—",fitzpatrick_scale:false,category:"travel_and_places"},foggy:{keywords:["photo","mountain"],char:"ðŸŒ",fitzpatrick_scale:false,category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],char:"🗼",fitzpatrick_scale:false,category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],char:"ðŸ­",fitzpatrick_scale:false,category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],char:"⛲",fitzpatrick_scale:false,category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],char:"🎑",fitzpatrick_scale:false,category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],char:"â›°",fitzpatrick_scale:false,category:"travel_and_places"},mountain_snow:{keywords:["photo","nature","environment","winter","cold"],char:"ðŸ”",fitzpatrick_scale:false,category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],char:"🗻",fitzpatrick_scale:false,category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],char:"🌋",fitzpatrick_scale:false,category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],char:"🗾",fitzpatrick_scale:false,category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],char:"ðŸ•",fitzpatrick_scale:false,category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],char:"⛺",fitzpatrick_scale:false,category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],char:"ðŸž",fitzpatrick_scale:false,category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],char:"🛣",fitzpatrick_scale:false,category:"travel_and_places"},railway_track:{keywords:["train","transportation"],char:"🛤",fitzpatrick_scale:false,category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],char:"🌅",fitzpatrick_scale:false,category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],char:"🌄",fitzpatrick_scale:false,category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],char:"ðŸœ",fitzpatrick_scale:false,category:"travel_and_places"},beach_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],char:"ðŸ–",fitzpatrick_scale:false,category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],char:"ðŸ",fitzpatrick_scale:false,category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],char:"🌇",fitzpatrick_scale:false,category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],char:"🌆",fitzpatrick_scale:false,category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],char:"ðŸ™",fitzpatrick_scale:false,category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],char:"🌃",fitzpatrick_scale:false,category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],char:"🌉",fitzpatrick_scale:false,category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],char:"🌌",fitzpatrick_scale:false,category:"travel_and_places"},stars:{keywords:["night","photo"],char:"🌠",fitzpatrick_scale:false,category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],char:"🎇",fitzpatrick_scale:false,category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],char:"🎆",fitzpatrick_scale:false,category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn_face","photo","sky","spring"],char:"🌈",fitzpatrick_scale:false,category:"travel_and_places"},houses:{keywords:["buildings","photo"],char:"ðŸ˜",fitzpatrick_scale:false,category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],char:"ðŸ°",fitzpatrick_scale:false,category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],char:"ðŸ¯",fitzpatrick_scale:false,category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],char:"ðŸŸ",fitzpatrick_scale:false,category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],char:"🗽",fitzpatrick_scale:false,category:"travel_and_places"},house:{keywords:["building","home"],char:"ðŸ ",fitzpatrick_scale:false,category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],char:"ðŸ¡",fitzpatrick_scale:false,category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],char:"ðŸš",fitzpatrick_scale:false,category:"travel_and_places"},office:{keywords:["building","bureau","work"],char:"ðŸ¢",fitzpatrick_scale:false,category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],char:"ðŸ¬",fitzpatrick_scale:false,category:"travel_and_places"},post_office:{keywords:["building","envelope","communication"],char:"ðŸ£",fitzpatrick_scale:false,category:"travel_and_places"},european_post_office:{keywords:["building","email"],char:"ðŸ¤",fitzpatrick_scale:false,category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],char:"ðŸ¥",fitzpatrick_scale:false,category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],char:"ðŸ¦",fitzpatrick_scale:false,category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],char:"ðŸ¨",fitzpatrick_scale:false,category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],char:"ðŸª",fitzpatrick_scale:false,category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],char:"ðŸ«",fitzpatrick_scale:false,category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],char:"ðŸ©",fitzpatrick_scale:false,category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],char:"💒",fitzpatrick_scale:false,category:"travel_and_places"},classical_building:{keywords:["art","culture","history"],char:"ðŸ›",fitzpatrick_scale:false,category:"travel_and_places"},church:{keywords:["building","religion","christ"],char:"⛪",fitzpatrick_scale:false,category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],char:"🕌",fitzpatrick_scale:false,category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],char:"ðŸ•",fitzpatrick_scale:false,category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],char:"🕋",fitzpatrick_scale:false,category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],char:"⛩",fitzpatrick_scale:false,category:"travel_and_places"},watch:{keywords:["time","accessories"],char:"⌚",fitzpatrick_scale:false,category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],char:"📱",fitzpatrick_scale:false,category:"objects"},calling:{keywords:["iphone","incoming"],char:"📲",fitzpatrick_scale:false,category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],char:"💻",fitzpatrick_scale:false,category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],char:"⌨",fitzpatrick_scale:false,category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],char:"🖥",fitzpatrick_scale:false,category:"objects"},printer:{keywords:["paper","ink"],char:"🖨",fitzpatrick_scale:false,category:"objects"},computer_mouse:{keywords:["click"],char:"🖱",fitzpatrick_scale:false,category:"objects"},trackball:{keywords:["technology","trackpad"],char:"🖲",fitzpatrick_scale:false,category:"objects"},joystick:{keywords:["game","play"],char:"🕹",fitzpatrick_scale:false,category:"objects"},clamp:{keywords:["tool"],char:"🗜",fitzpatrick_scale:false,category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],char:"💽",fitzpatrick_scale:false,category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],char:"💾",fitzpatrick_scale:false,category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],char:"💿",fitzpatrick_scale:false,category:"objects"},dvd:{keywords:["cd","disk","disc"],char:"📀",fitzpatrick_scale:false,category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],char:"📼",fitzpatrick_scale:false,category:"objects"},camera:{keywords:["gadgets","photography"],char:"📷",fitzpatrick_scale:false,category:"objects"},camera_flash:{keywords:["photography","gadgets"],char:"📸",fitzpatrick_scale:false,category:"objects"},video_camera:{keywords:["film","record"],char:"📹",fitzpatrick_scale:false,category:"objects"},movie_camera:{keywords:["film","record"],char:"🎥",fitzpatrick_scale:false,category:"objects"},film_projector:{keywords:["video","tape","record","movie"],char:"📽",fitzpatrick_scale:false,category:"objects"},film_strip:{keywords:["movie"],char:"🎞",fitzpatrick_scale:false,category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],char:"📞",fitzpatrick_scale:false,category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],char:"☎ï¸",fitzpatrick_scale:false,category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],char:"📟",fitzpatrick_scale:false,category:"objects"},fax:{keywords:["communication","technology"],char:"📠",fitzpatrick_scale:false,category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],char:"📺",fitzpatrick_scale:false,category:"objects"},radio:{keywords:["communication","music","podcast","program"],char:"📻",fitzpatrick_scale:false,category:"objects"},studio_microphone:{keywords:["sing","recording","artist","talkshow"],char:"🎙",fitzpatrick_scale:false,category:"objects"},level_slider:{keywords:["scale"],char:"🎚",fitzpatrick_scale:false,category:"objects"},control_knobs:{keywords:["dial"],char:"🎛",fitzpatrick_scale:false,category:"objects"},compass:{keywords:["magnetic","navigation","orienteering"],char:"🧭",fitzpatrick_scale:false,category:"objects"},stopwatch:{keywords:["time","deadline"],char:"â±",fitzpatrick_scale:false,category:"objects"},timer_clock:{keywords:["alarm"],char:"â²",fitzpatrick_scale:false,category:"objects"},alarm_clock:{keywords:["time","wake"],char:"â°",fitzpatrick_scale:false,category:"objects"},mantelpiece_clock:{keywords:["time"],char:"🕰",fitzpatrick_scale:false,category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],char:"â³",fitzpatrick_scale:false,category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],char:"⌛",fitzpatrick_scale:false,category:"objects"},satellite:{keywords:["communication","future","radio","space"],char:"📡",fitzpatrick_scale:false,category:"objects"},battery:{keywords:["power","energy","sustain"],char:"🔋",fitzpatrick_scale:false,category:"objects"},electric_plug:{keywords:["charger","power"],char:"🔌",fitzpatrick_scale:false,category:"objects"},bulb:{keywords:["light","electricity","idea"],char:"💡",fitzpatrick_scale:false,category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],char:"🔦",fitzpatrick_scale:false,category:"objects"},candle:{keywords:["fire","wax"],char:"🕯",fitzpatrick_scale:false,category:"objects"},fire_extinguisher:{keywords:["quench"],char:"🧯",fitzpatrick_scale:false,category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],char:"🗑",fitzpatrick_scale:false,category:"objects"},oil_drum:{keywords:["barrell"],char:"🛢",fitzpatrick_scale:false,category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],char:"💸",fitzpatrick_scale:false,category:"objects"},dollar:{keywords:["money","sales","bill","currency"],char:"💵",fitzpatrick_scale:false,category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],char:"💴",fitzpatrick_scale:false,category:"objects"},euro:{keywords:["money","sales","dollar","currency"],char:"💶",fitzpatrick_scale:false,category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],char:"💷",fitzpatrick_scale:false,category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],char:"💰",fitzpatrick_scale:false,category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],char:"💳",fitzpatrick_scale:false,category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],char:"💎",fitzpatrick_scale:false,category:"objects"},balance_scale:{keywords:["law","fairness","weight"],char:"âš–",fitzpatrick_scale:false,category:"objects"},toolbox:{keywords:["tools","diy","fix","maintainer","mechanic"],char:"🧰",fitzpatrick_scale:false,category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],char:"🔧",fitzpatrick_scale:false,category:"objects"},hammer:{keywords:["tools","build","create"],char:"🔨",fitzpatrick_scale:false,category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],char:"âš’",fitzpatrick_scale:false,category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],char:"🛠",fitzpatrick_scale:false,category:"objects"},pick:{keywords:["tools","dig"],char:"â›",fitzpatrick_scale:false,category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],char:"🔩",fitzpatrick_scale:false,category:"objects"},gear:{keywords:["cog"],char:"âš™",fitzpatrick_scale:false,category:"objects"},brick:{keywords:["bricks"],char:"🧱",fitzpatrick_scale:false,category:"objects"},chains:{keywords:["lock","arrest"],char:"⛓",fitzpatrick_scale:false,category:"objects"},magnet:{keywords:["attraction","magnetic"],char:"🧲",fitzpatrick_scale:false,category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],char:"🔫",fitzpatrick_scale:false,category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],char:"💣",fitzpatrick_scale:false,category:"objects"},firecracker:{keywords:["dynamite","boom","explode","explosion","explosive"],char:"🧨",fitzpatrick_scale:false,category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],char:"🔪",fitzpatrick_scale:false,category:"objects"},dagger:{keywords:["weapon"],char:"🗡",fitzpatrick_scale:false,category:"objects"},crossed_swords:{keywords:["weapon"],char:"âš”",fitzpatrick_scale:false,category:"objects"},shield:{keywords:["protection","security"],char:"🛡",fitzpatrick_scale:false,category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],char:"🚬",fitzpatrick_scale:false,category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary","death","pirate","evil"],char:"☠",fitzpatrick_scale:false,category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],char:"âš°",fitzpatrick_scale:false,category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],char:"âš±",fitzpatrick_scale:false,category:"objects"},amphora:{keywords:["vase","jar"],char:"ðŸº",fitzpatrick_scale:false,category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],char:"🔮",fitzpatrick_scale:false,category:"objects"},prayer_beads:{keywords:["dhikr","religious"],char:"📿",fitzpatrick_scale:false,category:"objects"},nazar_amulet:{keywords:["bead","charm"],char:"🧿",fitzpatrick_scale:false,category:"objects"},barber:{keywords:["hair","salon","style"],char:"💈",fitzpatrick_scale:false,category:"objects"},alembic:{keywords:["distilling","science","experiment","chemistry"],char:"âš—",fitzpatrick_scale:false,category:"objects"},telescope:{keywords:["stars","space","zoom","science","astronomy"],char:"🔭",fitzpatrick_scale:false,category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],char:"🔬",fitzpatrick_scale:false,category:"objects"},hole:{keywords:["embarrassing"],char:"🕳",fitzpatrick_scale:false,category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],char:"💊",fitzpatrick_scale:false,category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],char:"💉",fitzpatrick_scale:false,category:"objects"},dna:{keywords:["biologist","genetics","life"],char:"🧬",fitzpatrick_scale:false,category:"objects"},microbe:{keywords:["amoeba","bacteria","germs"],char:"🦠",fitzpatrick_scale:false,category:"objects"},petri_dish:{keywords:["bacteria","biology","culture","lab"],char:"🧫",fitzpatrick_scale:false,category:"objects"},test_tube:{keywords:["chemistry","experiment","lab","science"],char:"🧪",fitzpatrick_scale:false,category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],char:"🌡",fitzpatrick_scale:false,category:"objects"},broom:{keywords:["cleaning","sweeping","witch"],char:"🧹",fitzpatrick_scale:false,category:"objects"},basket:{keywords:["laundry"],char:"🧺",fitzpatrick_scale:false,category:"objects"},toilet_paper:{keywords:["roll"],char:"🧻",fitzpatrick_scale:false,category:"objects"},label:{keywords:["sale","tag"],char:"ðŸ·",fitzpatrick_scale:false,category:"objects"},bookmark:{keywords:["favorite","label","save"],char:"🔖",fitzpatrick_scale:false,category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],char:"🚽",fitzpatrick_scale:false,category:"objects"},shower:{keywords:["clean","water","bathroom"],char:"🚿",fitzpatrick_scale:false,category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],char:"ðŸ›",fitzpatrick_scale:false,category:"objects"},soap:{keywords:["bar","bathing","cleaning","lather"],char:"🧼",fitzpatrick_scale:false,category:"objects"},sponge:{keywords:["absorbing","cleaning","porous"],char:"🧽",fitzpatrick_scale:false,category:"objects"},lotion_bottle:{keywords:["moisturizer","sunscreen"],char:"🧴",fitzpatrick_scale:false,category:"objects"},key:{keywords:["lock","door","password"],char:"🔑",fitzpatrick_scale:false,category:"objects"},old_key:{keywords:["lock","door","password"],char:"ðŸ—",fitzpatrick_scale:false,category:"objects"},couch_and_lamp:{keywords:["read","chill"],char:"🛋",fitzpatrick_scale:false,category:"objects"},sleeping_bed:{keywords:["bed","rest"],char:"🛌",fitzpatrick_scale:true,category:"objects"},bed:{keywords:["sleep","rest"],char:"ðŸ›",fitzpatrick_scale:false,category:"objects"},door:{keywords:["house","entry","exit"],char:"🚪",fitzpatrick_scale:false,category:"objects"},bellhop_bell:{keywords:["service"],char:"🛎",fitzpatrick_scale:false,category:"objects"},teddy_bear:{keywords:["plush","stuffed"],char:"🧸",fitzpatrick_scale:false,category:"objects"},framed_picture:{keywords:["photography"],char:"🖼",fitzpatrick_scale:false,category:"objects"},world_map:{keywords:["location","direction"],char:"🗺",fitzpatrick_scale:false,category:"objects"},parasol_on_ground:{keywords:["weather","summer"],char:"â›±",fitzpatrick_scale:false,category:"objects"},moyai:{keywords:["rock","easter island","moai"],char:"🗿",fitzpatrick_scale:false,category:"objects"},shopping:{keywords:["mall","buy","purchase"],char:"ðŸ›",fitzpatrick_scale:false,category:"objects"},shopping_cart:{keywords:["trolley"],char:"🛒",fitzpatrick_scale:false,category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],char:"🎈",fitzpatrick_scale:false,category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],char:"ðŸŽ",fitzpatrick_scale:false,category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],char:"🎀",fitzpatrick_scale:false,category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],char:"ðŸŽ",fitzpatrick_scale:false,category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],char:"🎊",fitzpatrick_scale:false,category:"objects"},tada:{keywords:["party","congratulations","birthday","magic","circus","celebration"],char:"🎉",fitzpatrick_scale:false,category:"objects"},dolls:{keywords:["japanese","toy","kimono"],char:"🎎",fitzpatrick_scale:false,category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],char:"ðŸŽ",fitzpatrick_scale:false,category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],char:"🎌",fitzpatrick_scale:false,category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],char:"ðŸ®",fitzpatrick_scale:false,category:"objects"},red_envelope:{keywords:["gift"],char:"🧧",fitzpatrick_scale:false,category:"objects"},email:{keywords:["letter","postal","inbox","communication"],char:"✉ï¸",fitzpatrick_scale:false,category:"objects"},envelope_with_arrow:{keywords:["email","communication"],char:"📩",fitzpatrick_scale:false,category:"objects"},incoming_envelope:{keywords:["email","inbox"],char:"📨",fitzpatrick_scale:false,category:"objects"},"e-mail":{keywords:["communication","inbox"],char:"📧",fitzpatrick_scale:false,category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],char:"💌",fitzpatrick_scale:false,category:"objects"},postbox:{keywords:["email","letter","envelope"],char:"📮",fitzpatrick_scale:false,category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],char:"📪",fitzpatrick_scale:false,category:"objects"},mailbox:{keywords:["email","inbox","communication"],char:"📫",fitzpatrick_scale:false,category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],char:"📬",fitzpatrick_scale:false,category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],char:"📭",fitzpatrick_scale:false,category:"objects"},package:{keywords:["mail","gift","cardboard","box","moving"],char:"📦",fitzpatrick_scale:false,category:"objects"},postal_horn:{keywords:["instrument","music"],char:"📯",fitzpatrick_scale:false,category:"objects"},inbox_tray:{keywords:["email","documents"],char:"📥",fitzpatrick_scale:false,category:"objects"},outbox_tray:{keywords:["inbox","email"],char:"📤",fitzpatrick_scale:false,category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],char:"📜",fitzpatrick_scale:false,category:"objects"},page_with_curl:{keywords:["documents","office","paper"],char:"📃",fitzpatrick_scale:false,category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],char:"📑",fitzpatrick_scale:false,category:"objects"},receipt:{keywords:["accounting","expenses"],char:"🧾",fitzpatrick_scale:false,category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],char:"📊",fitzpatrick_scale:false,category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],char:"📈",fitzpatrick_scale:false,category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],char:"📉",fitzpatrick_scale:false,category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],char:"📄",fitzpatrick_scale:false,category:"objects"},date:{keywords:["calendar","schedule"],char:"📅",fitzpatrick_scale:false,category:"objects"},calendar:{keywords:["schedule","date","planning"],char:"📆",fitzpatrick_scale:false,category:"objects"},spiral_calendar:{keywords:["date","schedule","planning"],char:"🗓",fitzpatrick_scale:false,category:"objects"},card_index:{keywords:["business","stationery"],char:"📇",fitzpatrick_scale:false,category:"objects"},card_file_box:{keywords:["business","stationery"],char:"🗃",fitzpatrick_scale:false,category:"objects"},ballot_box:{keywords:["election","vote"],char:"🗳",fitzpatrick_scale:false,category:"objects"},file_cabinet:{keywords:["filing","organizing"],char:"🗄",fitzpatrick_scale:false,category:"objects"},clipboard:{keywords:["stationery","documents"],char:"📋",fitzpatrick_scale:false,category:"objects"},spiral_notepad:{keywords:["memo","stationery"],char:"🗒",fitzpatrick_scale:false,category:"objects"},file_folder:{keywords:["documents","business","office"],char:"ðŸ“",fitzpatrick_scale:false,category:"objects"},open_file_folder:{keywords:["documents","load"],char:"📂",fitzpatrick_scale:false,category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],char:"🗂",fitzpatrick_scale:false,category:"objects"},newspaper_roll:{keywords:["press","headline"],char:"🗞",fitzpatrick_scale:false,category:"objects"},newspaper:{keywords:["press","headline"],char:"📰",fitzpatrick_scale:false,category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],char:"📓",fitzpatrick_scale:false,category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],char:"📕",fitzpatrick_scale:false,category:"objects"},green_book:{keywords:["read","library","knowledge","study"],char:"📗",fitzpatrick_scale:false,category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],char:"📘",fitzpatrick_scale:false,category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],char:"📙",fitzpatrick_scale:false,category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],char:"📔",fitzpatrick_scale:false,category:"objects"},ledger:{keywords:["notes","paper"],char:"📒",fitzpatrick_scale:false,category:"objects"},books:{keywords:["literature","library","study"],char:"📚",fitzpatrick_scale:false,category:"objects"},open_book:{keywords:["book","read","library","knowledge","literature","learn","study"],char:"📖",fitzpatrick_scale:false,category:"objects"},safety_pin:{keywords:["diaper"],char:"🧷",fitzpatrick_scale:false,category:"objects"},link:{keywords:["rings","url"],char:"🔗",fitzpatrick_scale:false,category:"objects"},paperclip:{keywords:["documents","stationery"],char:"📎",fitzpatrick_scale:false,category:"objects"},paperclips:{keywords:["documents","stationery"],char:"🖇",fitzpatrick_scale:false,category:"objects"},scissors:{keywords:["stationery","cut"],char:"✂ï¸",fitzpatrick_scale:false,category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],char:"ðŸ“",fitzpatrick_scale:false,category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],char:"ðŸ“",fitzpatrick_scale:false,category:"objects"},abacus:{keywords:["calculation"],char:"🧮",fitzpatrick_scale:false,category:"objects"},pushpin:{keywords:["stationery","mark","here"],char:"📌",fitzpatrick_scale:false,category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],char:"ðŸ“",fitzpatrick_scale:false,category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],char:"🚩",fitzpatrick_scale:false,category:"objects"},white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],char:"ðŸ³",fitzpatrick_scale:false,category:"objects"},black_flag:{keywords:["pirate"],char:"ðŸ´",fitzpatrick_scale:false,category:"objects"},rainbow_flag:{keywords:["flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"],char:"ðŸ³ï¸â€ðŸŒˆ",fitzpatrick_scale:false,category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],char:"ðŸ”",fitzpatrick_scale:false,category:"objects"},lock:{keywords:["security","password","padlock"],char:"🔒",fitzpatrick_scale:false,category:"objects"},unlock:{keywords:["privacy","security"],char:"🔓",fitzpatrick_scale:false,category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],char:"ðŸ”",fitzpatrick_scale:false,category:"objects"},pen:{keywords:["stationery","writing","write"],char:"🖊",fitzpatrick_scale:false,category:"objects"},fountain_pen:{keywords:["stationery","writing","write"],char:"🖋",fitzpatrick_scale:false,category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],char:"✒ï¸",fitzpatrick_scale:false,category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"],char:"ðŸ“",fitzpatrick_scale:false,category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],char:"âœï¸",fitzpatrick_scale:false,category:"objects"},crayon:{keywords:["drawing","creativity"],char:"ðŸ–",fitzpatrick_scale:false,category:"objects"},paintbrush:{keywords:["drawing","creativity","art"],char:"🖌",fitzpatrick_scale:false,category:"objects"},mag:{keywords:["search","zoom","find","detective"],char:"ðŸ”",fitzpatrick_scale:false,category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],char:"🔎",fitzpatrick_scale:false,category:"objects"},heart:{keywords:["love","like","valentines"],char:"â¤ï¸",fitzpatrick_scale:false,category:"symbols"},orange_heart:{keywords:["love","like","affection","valentines"],char:"🧡",fitzpatrick_scale:false,category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],char:"💛",fitzpatrick_scale:false,category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],char:"💚",fitzpatrick_scale:false,category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],char:"💙",fitzpatrick_scale:false,category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],char:"💜",fitzpatrick_scale:false,category:"symbols"},black_heart:{keywords:["evil"],char:"🖤",fitzpatrick_scale:false,category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],char:"💔",fitzpatrick_scale:false,category:"symbols"},heavy_heart_exclamation:{keywords:["decoration","love"],char:"â£",fitzpatrick_scale:false,category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],char:"💕",fitzpatrick_scale:false,category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],char:"💞",fitzpatrick_scale:false,category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],char:"💓",fitzpatrick_scale:false,category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],char:"💗",fitzpatrick_scale:false,category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],char:"💖",fitzpatrick_scale:false,category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],char:"💘",fitzpatrick_scale:false,category:"symbols"},gift_heart:{keywords:["love","valentines"],char:"ðŸ’",fitzpatrick_scale:false,category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],char:"💟",fitzpatrick_scale:false,category:"symbols"},peace_symbol:{keywords:["hippie"],char:"☮",fitzpatrick_scale:false,category:"symbols"},latin_cross:{keywords:["christianity"],char:"âœ",fitzpatrick_scale:false,category:"symbols"},star_and_crescent:{keywords:["islam"],char:"☪",fitzpatrick_scale:false,category:"symbols"},om:{keywords:["hinduism","buddhism","sikhism","jainism"],char:"🕉",fitzpatrick_scale:false,category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],char:"☸",fitzpatrick_scale:false,category:"symbols"},star_of_david:{keywords:["judaism"],char:"✡",fitzpatrick_scale:false,category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],char:"🔯",fitzpatrick_scale:false,category:"symbols"},menorah:{keywords:["hanukkah","candles","jewish"],char:"🕎",fitzpatrick_scale:false,category:"symbols"},yin_yang:{keywords:["balance"],char:"☯",fitzpatrick_scale:false,category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],char:"☦",fitzpatrick_scale:false,category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],char:"ðŸ›",fitzpatrick_scale:false,category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],char:"⛎",fitzpatrick_scale:false,category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],char:"♈",fitzpatrick_scale:false,category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],char:"♉",fitzpatrick_scale:false,category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],char:"♊",fitzpatrick_scale:false,category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],char:"♋",fitzpatrick_scale:false,category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],char:"♌",fitzpatrick_scale:false,category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],char:"â™",fitzpatrick_scale:false,category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],char:"♎",fitzpatrick_scale:false,category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],char:"â™",fitzpatrick_scale:false,category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],char:"â™",fitzpatrick_scale:false,category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],char:"♑",fitzpatrick_scale:false,category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],char:"â™’",fitzpatrick_scale:false,category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],char:"♓",fitzpatrick_scale:false,category:"symbols"},id:{keywords:["purple-square","words"],char:"🆔",fitzpatrick_scale:false,category:"symbols"},atom_symbol:{keywords:["science","physics","chemistry"],char:"âš›",fitzpatrick_scale:false,category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],char:"🈳",fitzpatrick_scale:false,category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],char:"🈹",fitzpatrick_scale:false,category:"symbols"},radioactive:{keywords:["nuclear","danger"],char:"☢",fitzpatrick_scale:false,category:"symbols"},biohazard:{keywords:["danger"],char:"☣",fitzpatrick_scale:false,category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],char:"📴",fitzpatrick_scale:false,category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],char:"📳",fitzpatrick_scale:false,category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],char:"🈶",fitzpatrick_scale:false,category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],char:"🈚",fitzpatrick_scale:false,category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],char:"🈸",fitzpatrick_scale:false,category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],char:"🈺",fitzpatrick_scale:false,category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],char:"🈷ï¸",fitzpatrick_scale:false,category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],char:"✴ï¸",fitzpatrick_scale:false,category:"symbols"},vs:{keywords:["words","orange-square"],char:"🆚",fitzpatrick_scale:false,category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],char:"🉑",fitzpatrick_scale:false,category:"symbols"},white_flower:{keywords:["japanese","spring"],char:"💮",fitzpatrick_scale:false,category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],char:"ðŸ‰",fitzpatrick_scale:false,category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],char:"㊙ï¸",fitzpatrick_scale:false,category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],char:"㊗ï¸",fitzpatrick_scale:false,category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],char:"🈴",fitzpatrick_scale:false,category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],char:"🈵",fitzpatrick_scale:false,category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],char:"🈲",fitzpatrick_scale:false,category:"symbols"},a:{keywords:["red-square","alphabet","letter"],char:"🅰ï¸",fitzpatrick_scale:false,category:"symbols"},b:{keywords:["red-square","alphabet","letter"],char:"🅱ï¸",fitzpatrick_scale:false,category:"symbols"},ab:{keywords:["red-square","alphabet"],char:"🆎",fitzpatrick_scale:false,category:"symbols"},cl:{keywords:["alphabet","words","red-square"],char:"🆑",fitzpatrick_scale:false,category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],char:"🅾ï¸",fitzpatrick_scale:false,category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],char:"🆘",fitzpatrick_scale:false,category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],char:"â›”",fitzpatrick_scale:false,category:"symbols"},name_badge:{keywords:["fire","forbid"],char:"📛",fitzpatrick_scale:false,category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],char:"🚫",fitzpatrick_scale:false,category:"symbols"},x:{keywords:["no","delete","remove","cancel","red"],char:"âŒ",fitzpatrick_scale:false,category:"symbols"},o:{keywords:["circle","round"],char:"â­•",fitzpatrick_scale:false,category:"symbols"},stop_sign:{keywords:["stop"],char:"🛑",fitzpatrick_scale:false,category:"symbols"},anger:{keywords:["angry","mad"],char:"💢",fitzpatrick_scale:false,category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],char:"♨ï¸",fitzpatrick_scale:false,category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],char:"🚷",fitzpatrick_scale:false,category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],char:"🚯",fitzpatrick_scale:false,category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],char:"🚳",fitzpatrick_scale:false,category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],char:"🚱",fitzpatrick_scale:false,category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],char:"🔞",fitzpatrick_scale:false,category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],char:"📵",fitzpatrick_scale:false,category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],char:"â—",fitzpatrick_scale:false,category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],char:"â•",fitzpatrick_scale:false,category:"symbols"},question:{keywords:["doubt","confused"],char:"â“",fitzpatrick_scale:false,category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],char:"â”",fitzpatrick_scale:false,category:"symbols"},bangbang:{keywords:["exclamation","surprise"],char:"‼ï¸",fitzpatrick_scale:false,category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],char:"â‰ï¸",fitzpatrick_scale:false,category:"symbols"},100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],char:"💯",fitzpatrick_scale:false,category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],char:"🔅",fitzpatrick_scale:false,category:"symbols"},high_brightness:{keywords:["sun","light"],char:"🔆",fitzpatrick_scale:false,category:"symbols"},trident:{keywords:["weapon","spear"],char:"🔱",fitzpatrick_scale:false,category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],char:"âšœ",fitzpatrick_scale:false,category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],char:"〽ï¸",fitzpatrick_scale:false,category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],char:"âš ï¸",fitzpatrick_scale:false,category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],char:"🚸",fitzpatrick_scale:false,category:"symbols"},beginner:{keywords:["badge","shield"],char:"🔰",fitzpatrick_scale:false,category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],char:"â™»ï¸",fitzpatrick_scale:false,category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],char:"🈯",fitzpatrick_scale:false,category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],char:"💹",fitzpatrick_scale:false,category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],char:"â‡ï¸",fitzpatrick_scale:false,category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],char:"✳ï¸",fitzpatrick_scale:false,category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],char:"âŽ",fitzpatrick_scale:false,category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer","tick"],char:"✅",fitzpatrick_scale:false,category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],char:"💠",fitzpatrick_scale:false,category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],char:"🌀",fitzpatrick_scale:false,category:"symbols"},loop:{keywords:["tape","cassette"],char:"âž¿",fitzpatrick_scale:false,category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],char:"ðŸŒ",fitzpatrick_scale:false,category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],char:"â“‚ï¸",fitzpatrick_scale:false,category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],char:"ðŸ§",fitzpatrick_scale:false,category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],char:"🈂ï¸",fitzpatrick_scale:false,category:"symbols"},passport_control:{keywords:["custom","blue-square"],char:"🛂",fitzpatrick_scale:false,category:"symbols"},customs:{keywords:["passport","border","blue-square"],char:"🛃",fitzpatrick_scale:false,category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],char:"🛄",fitzpatrick_scale:false,category:"symbols"},left_luggage:{keywords:["blue-square","travel"],char:"🛅",fitzpatrick_scale:false,category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],char:"♿",fitzpatrick_scale:false,category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],char:"🚭",fitzpatrick_scale:false,category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],char:"🚾",fitzpatrick_scale:false,category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],char:"🅿ï¸",fitzpatrick_scale:false,category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],char:"🚰",fitzpatrick_scale:false,category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],char:"🚹",fitzpatrick_scale:false,category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],char:"🚺",fitzpatrick_scale:false,category:"symbols"},baby_symbol:{keywords:["orange-square","child"],char:"🚼",fitzpatrick_scale:false,category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],char:"🚻",fitzpatrick_scale:false,category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],char:"🚮",fitzpatrick_scale:false,category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],char:"🎦",fitzpatrick_scale:false,category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],char:"📶",fitzpatrick_scale:false,category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],char:"ðŸˆ",fitzpatrick_scale:false,category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],char:"🆖",fitzpatrick_scale:false,category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],char:"🆗",fitzpatrick_scale:false,category:"symbols"},up:{keywords:["blue-square","above","high"],char:"🆙",fitzpatrick_scale:false,category:"symbols"},cool:{keywords:["words","blue-square"],char:"🆒",fitzpatrick_scale:false,category:"symbols"},new:{keywords:["blue-square","words","start"],char:"🆕",fitzpatrick_scale:false,category:"symbols"},free:{keywords:["blue-square","words"],char:"🆓",fitzpatrick_scale:false,category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],char:"0ï¸âƒ£",fitzpatrick_scale:false,category:"symbols"},one:{keywords:["blue-square","numbers","1"],char:"1ï¸âƒ£",fitzpatrick_scale:false,category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],char:"2ï¸âƒ£",fitzpatrick_scale:false,category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],char:"3ï¸âƒ£",fitzpatrick_scale:false,category:"symbols"},four:{keywords:["4","numbers","blue-square"],char:"4ï¸âƒ£",fitzpatrick_scale:false,category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],char:"5ï¸âƒ£",fitzpatrick_scale:false,category:"symbols"},six:{keywords:["6","numbers","blue-square"],char:"6ï¸âƒ£",fitzpatrick_scale:false,category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],char:"7ï¸âƒ£",fitzpatrick_scale:false,category:"symbols"},eight:{keywords:["8","blue-square","numbers"],char:"8ï¸âƒ£",fitzpatrick_scale:false,category:"symbols"},nine:{keywords:["blue-square","numbers","9"],char:"9ï¸âƒ£",fitzpatrick_scale:false,category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],char:"🔟",fitzpatrick_scale:false,category:"symbols"},asterisk:{keywords:["star","keycap"],char:"*⃣",fitzpatrick_scale:false,category:"symbols"},1234:{keywords:["numbers","blue-square"],char:"🔢",fitzpatrick_scale:false,category:"symbols"},eject_button:{keywords:["blue-square"],char:"âï¸",fitzpatrick_scale:false,category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],char:"â–¶ï¸",fitzpatrick_scale:false,category:"symbols"},pause_button:{keywords:["pause","blue-square"],char:"â¸",fitzpatrick_scale:false,category:"symbols"},next_track_button:{keywords:["forward","next","blue-square"],char:"â­",fitzpatrick_scale:false,category:"symbols"},stop_button:{keywords:["blue-square"],char:"â¹",fitzpatrick_scale:false,category:"symbols"},record_button:{keywords:["blue-square"],char:"âº",fitzpatrick_scale:false,category:"symbols"},play_or_pause_button:{keywords:["blue-square","play","pause"],char:"â¯",fitzpatrick_scale:false,category:"symbols"},previous_track_button:{keywords:["backward"],char:"â®",fitzpatrick_scale:false,category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],char:"â©",fitzpatrick_scale:false,category:"symbols"},rewind:{keywords:["play","blue-square"],char:"âª",fitzpatrick_scale:false,category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],char:"🔀",fitzpatrick_scale:false,category:"symbols"},repeat:{keywords:["loop","record"],char:"ðŸ”",fitzpatrick_scale:false,category:"symbols"},repeat_one:{keywords:["blue-square","loop"],char:"🔂",fitzpatrick_scale:false,category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],char:"â—€ï¸",fitzpatrick_scale:false,category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],char:"🔼",fitzpatrick_scale:false,category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],char:"🔽",fitzpatrick_scale:false,category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],char:"â«",fitzpatrick_scale:false,category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],char:"â¬",fitzpatrick_scale:false,category:"symbols"},arrow_right:{keywords:["blue-square","next"],char:"âž¡ï¸",fitzpatrick_scale:false,category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],char:"⬅ï¸",fitzpatrick_scale:false,category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],char:"⬆ï¸",fitzpatrick_scale:false,category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],char:"⬇ï¸",fitzpatrick_scale:false,category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],char:"↗ï¸",fitzpatrick_scale:false,category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],char:"↘ï¸",fitzpatrick_scale:false,category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],char:"↙ï¸",fitzpatrick_scale:false,category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],char:"↖ï¸",fitzpatrick_scale:false,category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],char:"↕ï¸",fitzpatrick_scale:false,category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],char:"↔ï¸",fitzpatrick_scale:false,category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],char:"🔄",fitzpatrick_scale:false,category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],char:"↪ï¸",fitzpatrick_scale:false,category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],char:"↩ï¸",fitzpatrick_scale:false,category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],char:"⤴ï¸",fitzpatrick_scale:false,category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],char:"⤵ï¸",fitzpatrick_scale:false,category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],char:"#ï¸âƒ£",fitzpatrick_scale:false,category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],char:"ℹï¸",fitzpatrick_scale:false,category:"symbols"},abc:{keywords:["blue-square","alphabet"],char:"🔤",fitzpatrick_scale:false,category:"symbols"},abcd:{keywords:["blue-square","alphabet"],char:"🔡",fitzpatrick_scale:false,category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],char:"🔠",fitzpatrick_scale:false,category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],char:"🔣",fitzpatrick_scale:false,category:"symbols"},musical_note:{keywords:["score","tone","sound"],char:"🎵",fitzpatrick_scale:false,category:"symbols"},notes:{keywords:["music","score"],char:"🎶",fitzpatrick_scale:false,category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],char:"〰ï¸",fitzpatrick_scale:false,category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],char:"âž°",fitzpatrick_scale:false,category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],char:"✔ï¸",fitzpatrick_scale:false,category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],char:"🔃",fitzpatrick_scale:false,category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],char:"âž•",fitzpatrick_scale:false,category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],char:"âž–",fitzpatrick_scale:false,category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],char:"âž—",fitzpatrick_scale:false,category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],char:"✖ï¸",fitzpatrick_scale:false,category:"symbols"},infinity:{keywords:["forever"],char:"♾",fitzpatrick_scale:false,category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],char:"💲",fitzpatrick_scale:false,category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],char:"💱",fitzpatrick_scale:false,category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],char:"©ï¸",fitzpatrick_scale:false,category:"symbols"},registered:{keywords:["alphabet","circle"],char:"®ï¸",fitzpatrick_scale:false,category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],char:"â„¢ï¸",fitzpatrick_scale:false,category:"symbols"},end:{keywords:["words","arrow"],char:"🔚",fitzpatrick_scale:false,category:"symbols"},back:{keywords:["arrow","words","return"],char:"🔙",fitzpatrick_scale:false,category:"symbols"},on:{keywords:["arrow","words"],char:"🔛",fitzpatrick_scale:false,category:"symbols"},top:{keywords:["words","blue-square"],char:"ðŸ”",fitzpatrick_scale:false,category:"symbols"},soon:{keywords:["arrow","words"],char:"🔜",fitzpatrick_scale:false,category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes","tick"],char:"☑ï¸",fitzpatrick_scale:false,category:"symbols"},radio_button:{keywords:["input","old","music","circle"],char:"🔘",fitzpatrick_scale:false,category:"symbols"},white_circle:{keywords:["shape","round"],char:"⚪",fitzpatrick_scale:false,category:"symbols"},black_circle:{keywords:["shape","button","round"],char:"âš«",fitzpatrick_scale:false,category:"symbols"},red_circle:{keywords:["shape","error","danger"],char:"🔴",fitzpatrick_scale:false,category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],char:"🔵",fitzpatrick_scale:false,category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],char:"🔸",fitzpatrick_scale:false,category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],char:"🔹",fitzpatrick_scale:false,category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],char:"🔶",fitzpatrick_scale:false,category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],char:"🔷",fitzpatrick_scale:false,category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],char:"🔺",fitzpatrick_scale:false,category:"symbols"},black_small_square:{keywords:["shape","icon"],char:"â–ªï¸",fitzpatrick_scale:false,category:"symbols"},white_small_square:{keywords:["shape","icon"],char:"â–«ï¸",fitzpatrick_scale:false,category:"symbols"},black_large_square:{keywords:["shape","icon","button"],char:"⬛",fitzpatrick_scale:false,category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],char:"⬜",fitzpatrick_scale:false,category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],char:"🔻",fitzpatrick_scale:false,category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],char:"â—¼ï¸",fitzpatrick_scale:false,category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],char:"â—»ï¸",fitzpatrick_scale:false,category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],char:"â—¾",fitzpatrick_scale:false,category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],char:"â—½",fitzpatrick_scale:false,category:"symbols"},black_square_button:{keywords:["shape","input","frame"],char:"🔲",fitzpatrick_scale:false,category:"symbols"},white_square_button:{keywords:["shape","input"],char:"🔳",fitzpatrick_scale:false,category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],char:"🔈",fitzpatrick_scale:false,category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],char:"🔉",fitzpatrick_scale:false,category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],char:"🔊",fitzpatrick_scale:false,category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],char:"🔇",fitzpatrick_scale:false,category:"symbols"},mega:{keywords:["sound","speaker","volume"],char:"📣",fitzpatrick_scale:false,category:"symbols"},loudspeaker:{keywords:["volume","sound"],char:"📢",fitzpatrick_scale:false,category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],char:"🔔",fitzpatrick_scale:false,category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],char:"🔕",fitzpatrick_scale:false,category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],char:"ðŸƒ",fitzpatrick_scale:false,category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],char:"🀄",fitzpatrick_scale:false,category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],char:"â™ ï¸",fitzpatrick_scale:false,category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],char:"♣ï¸",fitzpatrick_scale:false,category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],char:"♥ï¸",fitzpatrick_scale:false,category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],char:"♦ï¸",fitzpatrick_scale:false,category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],char:"🎴",fitzpatrick_scale:false,category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking","dream"],char:"💭",fitzpatrick_scale:false,category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],char:"🗯",fitzpatrick_scale:false,category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],char:"💬",fitzpatrick_scale:false,category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],char:"🗨",fitzpatrick_scale:false,category:"symbols"},clock1:{keywords:["time","late","early","schedule"],char:"ðŸ•",fitzpatrick_scale:false,category:"symbols"},clock2:{keywords:["time","late","early","schedule"],char:"🕑",fitzpatrick_scale:false,category:"symbols"},clock3:{keywords:["time","late","early","schedule"],char:"🕒",fitzpatrick_scale:false,category:"symbols"},clock4:{keywords:["time","late","early","schedule"],char:"🕓",fitzpatrick_scale:false,category:"symbols"},clock5:{keywords:["time","late","early","schedule"],char:"🕔",fitzpatrick_scale:false,category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],char:"🕕",fitzpatrick_scale:false,category:"symbols"},clock7:{keywords:["time","late","early","schedule"],char:"🕖",fitzpatrick_scale:false,category:"symbols"},clock8:{keywords:["time","late","early","schedule"],char:"🕗",fitzpatrick_scale:false,category:"symbols"},clock9:{keywords:["time","late","early","schedule"],char:"🕘",fitzpatrick_scale:false,category:"symbols"},clock10:{keywords:["time","late","early","schedule"],char:"🕙",fitzpatrick_scale:false,category:"symbols"},clock11:{keywords:["time","late","early","schedule"],char:"🕚",fitzpatrick_scale:false,category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],char:"🕛",fitzpatrick_scale:false,category:"symbols"},clock130:{keywords:["time","late","early","schedule"],char:"🕜",fitzpatrick_scale:false,category:"symbols"},clock230:{keywords:["time","late","early","schedule"],char:"ðŸ•",fitzpatrick_scale:false,category:"symbols"},clock330:{keywords:["time","late","early","schedule"],char:"🕞",fitzpatrick_scale:false,category:"symbols"},clock430:{keywords:["time","late","early","schedule"],char:"🕟",fitzpatrick_scale:false,category:"symbols"},clock530:{keywords:["time","late","early","schedule"],char:"🕠",fitzpatrick_scale:false,category:"symbols"},clock630:{keywords:["time","late","early","schedule"],char:"🕡",fitzpatrick_scale:false,category:"symbols"},clock730:{keywords:["time","late","early","schedule"],char:"🕢",fitzpatrick_scale:false,category:"symbols"},clock830:{keywords:["time","late","early","schedule"],char:"🕣",fitzpatrick_scale:false,category:"symbols"},clock930:{keywords:["time","late","early","schedule"],char:"🕤",fitzpatrick_scale:false,category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],char:"🕥",fitzpatrick_scale:false,category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],char:"🕦",fitzpatrick_scale:false,category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],char:"🕧",fitzpatrick_scale:false,category:"symbols"},afghanistan:{keywords:["af","flag","nation","country","banner"],char:"🇦🇫",fitzpatrick_scale:false,category:"flags"},aland_islands:{keywords:["Ã…land","islands","flag","nation","country","banner"],char:"🇦🇽",fitzpatrick_scale:false,category:"flags"},albania:{keywords:["al","flag","nation","country","banner"],char:"🇦🇱",fitzpatrick_scale:false,category:"flags"},algeria:{keywords:["dz","flag","nation","country","banner"],char:"🇩🇿",fitzpatrick_scale:false,category:"flags"},american_samoa:{keywords:["american","ws","flag","nation","country","banner"],char:"🇦🇸",fitzpatrick_scale:false,category:"flags"},andorra:{keywords:["ad","flag","nation","country","banner"],char:"🇦🇩",fitzpatrick_scale:false,category:"flags"},angola:{keywords:["ao","flag","nation","country","banner"],char:"🇦🇴",fitzpatrick_scale:false,category:"flags"},anguilla:{keywords:["ai","flag","nation","country","banner"],char:"🇦🇮",fitzpatrick_scale:false,category:"flags"},antarctica:{keywords:["aq","flag","nation","country","banner"],char:"🇦🇶",fitzpatrick_scale:false,category:"flags"},antigua_barbuda:{keywords:["antigua","barbuda","flag","nation","country","banner"],char:"🇦🇬",fitzpatrick_scale:false,category:"flags"},argentina:{keywords:["ar","flag","nation","country","banner"],char:"🇦🇷",fitzpatrick_scale:false,category:"flags"},armenia:{keywords:["am","flag","nation","country","banner"],char:"🇦🇲",fitzpatrick_scale:false,category:"flags"},aruba:{keywords:["aw","flag","nation","country","banner"],char:"🇦🇼",fitzpatrick_scale:false,category:"flags"},australia:{keywords:["au","flag","nation","country","banner"],char:"🇦🇺",fitzpatrick_scale:false,category:"flags"},austria:{keywords:["at","flag","nation","country","banner"],char:"🇦🇹",fitzpatrick_scale:false,category:"flags"},azerbaijan:{keywords:["az","flag","nation","country","banner"],char:"🇦🇿",fitzpatrick_scale:false,category:"flags"},bahamas:{keywords:["bs","flag","nation","country","banner"],char:"🇧🇸",fitzpatrick_scale:false,category:"flags"},bahrain:{keywords:["bh","flag","nation","country","banner"],char:"🇧🇭",fitzpatrick_scale:false,category:"flags"},bangladesh:{keywords:["bd","flag","nation","country","banner"],char:"🇧🇩",fitzpatrick_scale:false,category:"flags"},barbados:{keywords:["bb","flag","nation","country","banner"],char:"🇧🇧",fitzpatrick_scale:false,category:"flags"},belarus:{keywords:["by","flag","nation","country","banner"],char:"🇧🇾",fitzpatrick_scale:false,category:"flags"},belgium:{keywords:["be","flag","nation","country","banner"],char:"🇧🇪",fitzpatrick_scale:false,category:"flags"},belize:{keywords:["bz","flag","nation","country","banner"],char:"🇧🇿",fitzpatrick_scale:false,category:"flags"},benin:{keywords:["bj","flag","nation","country","banner"],char:"🇧🇯",fitzpatrick_scale:false,category:"flags"},bermuda:{keywords:["bm","flag","nation","country","banner"],char:"🇧🇲",fitzpatrick_scale:false,category:"flags"},bhutan:{keywords:["bt","flag","nation","country","banner"],char:"🇧🇹",fitzpatrick_scale:false,category:"flags"},bolivia:{keywords:["bo","flag","nation","country","banner"],char:"🇧🇴",fitzpatrick_scale:false,category:"flags"},caribbean_netherlands:{keywords:["bonaire","flag","nation","country","banner"],char:"🇧🇶",fitzpatrick_scale:false,category:"flags"},bosnia_herzegovina:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],char:"🇧🇦",fitzpatrick_scale:false,category:"flags"},botswana:{keywords:["bw","flag","nation","country","banner"],char:"🇧🇼",fitzpatrick_scale:false,category:"flags"},brazil:{keywords:["br","flag","nation","country","banner"],char:"🇧🇷",fitzpatrick_scale:false,category:"flags"},british_indian_ocean_territory:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],char:"🇮🇴",fitzpatrick_scale:false,category:"flags"},british_virgin_islands:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],char:"🇻🇬",fitzpatrick_scale:false,category:"flags"},brunei:{keywords:["bn","darussalam","flag","nation","country","banner"],char:"🇧🇳",fitzpatrick_scale:false,category:"flags"},bulgaria:{keywords:["bg","flag","nation","country","banner"],char:"🇧🇬",fitzpatrick_scale:false,category:"flags"},burkina_faso:{keywords:["burkina","faso","flag","nation","country","banner"],char:"🇧🇫",fitzpatrick_scale:false,category:"flags"},burundi:{keywords:["bi","flag","nation","country","banner"],char:"🇧🇮",fitzpatrick_scale:false,category:"flags"},cape_verde:{keywords:["cabo","verde","flag","nation","country","banner"],char:"🇨🇻",fitzpatrick_scale:false,category:"flags"},cambodia:{keywords:["kh","flag","nation","country","banner"],char:"🇰🇭",fitzpatrick_scale:false,category:"flags"},cameroon:{keywords:["cm","flag","nation","country","banner"],char:"🇨🇲",fitzpatrick_scale:false,category:"flags"},canada:{keywords:["ca","flag","nation","country","banner"],char:"🇨🇦",fitzpatrick_scale:false,category:"flags"},canary_islands:{keywords:["canary","islands","flag","nation","country","banner"],char:"🇮🇨",fitzpatrick_scale:false,category:"flags"},cayman_islands:{keywords:["cayman","islands","flag","nation","country","banner"],char:"🇰🇾",fitzpatrick_scale:false,category:"flags"},central_african_republic:{keywords:["central","african","republic","flag","nation","country","banner"],char:"🇨🇫",fitzpatrick_scale:false,category:"flags"},chad:{keywords:["td","flag","nation","country","banner"],char:"🇹🇩",fitzpatrick_scale:false,category:"flags"},chile:{keywords:["flag","nation","country","banner"],char:"🇨🇱",fitzpatrick_scale:false,category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],char:"🇨🇳",fitzpatrick_scale:false,category:"flags"},christmas_island:{keywords:["christmas","island","flag","nation","country","banner"],char:"🇨🇽",fitzpatrick_scale:false,category:"flags"},cocos_islands:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],char:"🇨🇨",fitzpatrick_scale:false,category:"flags"},colombia:{keywords:["co","flag","nation","country","banner"],char:"🇨🇴",fitzpatrick_scale:false,category:"flags"},comoros:{keywords:["km","flag","nation","country","banner"],char:"🇰🇲",fitzpatrick_scale:false,category:"flags"},congo_brazzaville:{keywords:["congo","flag","nation","country","banner"],char:"🇨🇬",fitzpatrick_scale:false,category:"flags"},congo_kinshasa:{keywords:["congo","democratic","republic","flag","nation","country","banner"],char:"🇨🇩",fitzpatrick_scale:false,category:"flags"},cook_islands:{keywords:["cook","islands","flag","nation","country","banner"],char:"🇨🇰",fitzpatrick_scale:false,category:"flags"},costa_rica:{keywords:["costa","rica","flag","nation","country","banner"],char:"🇨🇷",fitzpatrick_scale:false,category:"flags"},croatia:{keywords:["hr","flag","nation","country","banner"],char:"🇭🇷",fitzpatrick_scale:false,category:"flags"},cuba:{keywords:["cu","flag","nation","country","banner"],char:"🇨🇺",fitzpatrick_scale:false,category:"flags"},curacao:{keywords:["curaçao","flag","nation","country","banner"],char:"🇨🇼",fitzpatrick_scale:false,category:"flags"},cyprus:{keywords:["cy","flag","nation","country","banner"],char:"🇨🇾",fitzpatrick_scale:false,category:"flags"},czech_republic:{keywords:["cz","flag","nation","country","banner"],char:"🇨🇿",fitzpatrick_scale:false,category:"flags"},denmark:{keywords:["dk","flag","nation","country","banner"],char:"🇩🇰",fitzpatrick_scale:false,category:"flags"},djibouti:{keywords:["dj","flag","nation","country","banner"],char:"🇩🇯",fitzpatrick_scale:false,category:"flags"},dominica:{keywords:["dm","flag","nation","country","banner"],char:"🇩🇲",fitzpatrick_scale:false,category:"flags"},dominican_republic:{keywords:["dominican","republic","flag","nation","country","banner"],char:"🇩🇴",fitzpatrick_scale:false,category:"flags"},ecuador:{keywords:["ec","flag","nation","country","banner"],char:"🇪🇨",fitzpatrick_scale:false,category:"flags"},egypt:{keywords:["eg","flag","nation","country","banner"],char:"🇪🇬",fitzpatrick_scale:false,category:"flags"},el_salvador:{keywords:["el","salvador","flag","nation","country","banner"],char:"🇸🇻",fitzpatrick_scale:false,category:"flags"},equatorial_guinea:{keywords:["equatorial","gn","flag","nation","country","banner"],char:"🇬🇶",fitzpatrick_scale:false,category:"flags"},eritrea:{keywords:["er","flag","nation","country","banner"],char:"🇪🇷",fitzpatrick_scale:false,category:"flags"},estonia:{keywords:["ee","flag","nation","country","banner"],char:"🇪🇪",fitzpatrick_scale:false,category:"flags"},ethiopia:{keywords:["et","flag","nation","country","banner"],char:"🇪🇹",fitzpatrick_scale:false,category:"flags"},eu:{keywords:["european","union","flag","banner"],char:"🇪🇺",fitzpatrick_scale:false,category:"flags"},falkland_islands:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],char:"🇫🇰",fitzpatrick_scale:false,category:"flags"},faroe_islands:{keywords:["faroe","islands","flag","nation","country","banner"],char:"🇫🇴",fitzpatrick_scale:false,category:"flags"},fiji:{keywords:["fj","flag","nation","country","banner"],char:"🇫🇯",fitzpatrick_scale:false,category:"flags"},finland:{keywords:["fi","flag","nation","country","banner"],char:"🇫🇮",fitzpatrick_scale:false,category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],char:"🇫🇷",fitzpatrick_scale:false,category:"flags"},french_guiana:{keywords:["french","guiana","flag","nation","country","banner"],char:"🇬🇫",fitzpatrick_scale:false,category:"flags"},french_polynesia:{keywords:["french","polynesia","flag","nation","country","banner"],char:"🇵🇫",fitzpatrick_scale:false,category:"flags"},french_southern_territories:{keywords:["french","southern","territories","flag","nation","country","banner"],char:"🇹🇫",fitzpatrick_scale:false,category:"flags"},gabon:{keywords:["ga","flag","nation","country","banner"],char:"🇬🇦",fitzpatrick_scale:false,category:"flags"},gambia:{keywords:["gm","flag","nation","country","banner"],char:"🇬🇲",fitzpatrick_scale:false,category:"flags"},georgia:{keywords:["ge","flag","nation","country","banner"],char:"🇬🇪",fitzpatrick_scale:false,category:"flags"},de:{keywords:["german","nation","flag","country","banner"],char:"🇩🇪",fitzpatrick_scale:false,category:"flags"},ghana:{keywords:["gh","flag","nation","country","banner"],char:"🇬🇭",fitzpatrick_scale:false,category:"flags"},gibraltar:{keywords:["gi","flag","nation","country","banner"],char:"🇬🇮",fitzpatrick_scale:false,category:"flags"},greece:{keywords:["gr","flag","nation","country","banner"],char:"🇬🇷",fitzpatrick_scale:false,category:"flags"},greenland:{keywords:["gl","flag","nation","country","banner"],char:"🇬🇱",fitzpatrick_scale:false,category:"flags"},grenada:{keywords:["gd","flag","nation","country","banner"],char:"🇬🇩",fitzpatrick_scale:false,category:"flags"},guadeloupe:{keywords:["gp","flag","nation","country","banner"],char:"🇬🇵",fitzpatrick_scale:false,category:"flags"},guam:{keywords:["gu","flag","nation","country","banner"],char:"🇬🇺",fitzpatrick_scale:false,category:"flags"},guatemala:{keywords:["gt","flag","nation","country","banner"],char:"🇬🇹",fitzpatrick_scale:false,category:"flags"},guernsey:{keywords:["gg","flag","nation","country","banner"],char:"🇬🇬",fitzpatrick_scale:false,category:"flags"},guinea:{keywords:["gn","flag","nation","country","banner"],char:"🇬🇳",fitzpatrick_scale:false,category:"flags"},guinea_bissau:{keywords:["gw","bissau","flag","nation","country","banner"],char:"🇬🇼",fitzpatrick_scale:false,category:"flags"},guyana:{keywords:["gy","flag","nation","country","banner"],char:"🇬🇾",fitzpatrick_scale:false,category:"flags"},haiti:{keywords:["ht","flag","nation","country","banner"],char:"🇭🇹",fitzpatrick_scale:false,category:"flags"},honduras:{keywords:["hn","flag","nation","country","banner"],char:"🇭🇳",fitzpatrick_scale:false,category:"flags"},hong_kong:{keywords:["hong","kong","flag","nation","country","banner"],char:"🇭🇰",fitzpatrick_scale:false,category:"flags"},hungary:{keywords:["hu","flag","nation","country","banner"],char:"🇭🇺",fitzpatrick_scale:false,category:"flags"},iceland:{keywords:["is","flag","nation","country","banner"],char:"🇮🇸",fitzpatrick_scale:false,category:"flags"},india:{keywords:["in","flag","nation","country","banner"],char:"🇮🇳",fitzpatrick_scale:false,category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],char:"🇮🇩",fitzpatrick_scale:false,category:"flags"},iran:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],char:"🇮🇷",fitzpatrick_scale:false,category:"flags"},iraq:{keywords:["iq","flag","nation","country","banner"],char:"🇮🇶",fitzpatrick_scale:false,category:"flags"},ireland:{keywords:["ie","flag","nation","country","banner"],char:"🇮🇪",fitzpatrick_scale:false,category:"flags"},isle_of_man:{keywords:["isle","man","flag","nation","country","banner"],char:"🇮🇲",fitzpatrick_scale:false,category:"flags"},israel:{keywords:["il","flag","nation","country","banner"],char:"🇮🇱",fitzpatrick_scale:false,category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],char:"🇮🇹",fitzpatrick_scale:false,category:"flags"},cote_divoire:{keywords:["ivory","coast","flag","nation","country","banner"],char:"🇨🇮",fitzpatrick_scale:false,category:"flags"},jamaica:{keywords:["jm","flag","nation","country","banner"],char:"🇯🇲",fitzpatrick_scale:false,category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],char:"🇯🇵",fitzpatrick_scale:false,category:"flags"},jersey:{keywords:["je","flag","nation","country","banner"],char:"🇯🇪",fitzpatrick_scale:false,category:"flags"},jordan:{keywords:["jo","flag","nation","country","banner"],char:"🇯🇴",fitzpatrick_scale:false,category:"flags"},kazakhstan:{keywords:["kz","flag","nation","country","banner"],char:"🇰🇿",fitzpatrick_scale:false,category:"flags"},kenya:{keywords:["ke","flag","nation","country","banner"],char:"🇰🇪",fitzpatrick_scale:false,category:"flags"},kiribati:{keywords:["ki","flag","nation","country","banner"],char:"🇰🇮",fitzpatrick_scale:false,category:"flags"},kosovo:{keywords:["xk","flag","nation","country","banner"],char:"🇽🇰",fitzpatrick_scale:false,category:"flags"},kuwait:{keywords:["kw","flag","nation","country","banner"],char:"🇰🇼",fitzpatrick_scale:false,category:"flags"},kyrgyzstan:{keywords:["kg","flag","nation","country","banner"],char:"🇰🇬",fitzpatrick_scale:false,category:"flags"},laos:{keywords:["lao","democratic","republic","flag","nation","country","banner"],char:"🇱🇦",fitzpatrick_scale:false,category:"flags"},latvia:{keywords:["lv","flag","nation","country","banner"],char:"🇱🇻",fitzpatrick_scale:false,category:"flags"},lebanon:{keywords:["lb","flag","nation","country","banner"],char:"🇱🇧",fitzpatrick_scale:false,category:"flags"},lesotho:{keywords:["ls","flag","nation","country","banner"],char:"🇱🇸",fitzpatrick_scale:false,category:"flags"},liberia:{keywords:["lr","flag","nation","country","banner"],char:"🇱🇷",fitzpatrick_scale:false,category:"flags"},libya:{keywords:["ly","flag","nation","country","banner"],char:"🇱🇾",fitzpatrick_scale:false,category:"flags"},liechtenstein:{keywords:["li","flag","nation","country","banner"],char:"🇱🇮",fitzpatrick_scale:false,category:"flags"},lithuania:{keywords:["lt","flag","nation","country","banner"],char:"🇱🇹",fitzpatrick_scale:false,category:"flags"},luxembourg:{keywords:["lu","flag","nation","country","banner"],char:"🇱🇺",fitzpatrick_scale:false,category:"flags"},macau:{keywords:["macao","flag","nation","country","banner"],char:"🇲🇴",fitzpatrick_scale:false,category:"flags"},macedonia:{keywords:["macedonia,","flag","nation","country","banner"],char:"🇲🇰",fitzpatrick_scale:false,category:"flags"},madagascar:{keywords:["mg","flag","nation","country","banner"],char:"🇲🇬",fitzpatrick_scale:false,category:"flags"},malawi:{keywords:["mw","flag","nation","country","banner"],char:"🇲🇼",fitzpatrick_scale:false,category:"flags"},malaysia:{keywords:["my","flag","nation","country","banner"],char:"🇲🇾",fitzpatrick_scale:false,category:"flags"},maldives:{keywords:["mv","flag","nation","country","banner"],char:"🇲🇻",fitzpatrick_scale:false,category:"flags"},mali:{keywords:["ml","flag","nation","country","banner"],char:"🇲🇱",fitzpatrick_scale:false,category:"flags"},malta:{keywords:["mt","flag","nation","country","banner"],char:"🇲🇹",fitzpatrick_scale:false,category:"flags"},marshall_islands:{keywords:["marshall","islands","flag","nation","country","banner"],char:"🇲🇭",fitzpatrick_scale:false,category:"flags"},martinique:{keywords:["mq","flag","nation","country","banner"],char:"🇲🇶",fitzpatrick_scale:false,category:"flags"},mauritania:{keywords:["mr","flag","nation","country","banner"],char:"🇲🇷",fitzpatrick_scale:false,category:"flags"},mauritius:{keywords:["mu","flag","nation","country","banner"],char:"🇲🇺",fitzpatrick_scale:false,category:"flags"},mayotte:{keywords:["yt","flag","nation","country","banner"],char:"🇾🇹",fitzpatrick_scale:false,category:"flags"},mexico:{keywords:["mx","flag","nation","country","banner"],char:"🇲🇽",fitzpatrick_scale:false,category:"flags"},micronesia:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],char:"🇫🇲",fitzpatrick_scale:false,category:"flags"},moldova:{keywords:["moldova,","republic","flag","nation","country","banner"],char:"🇲🇩",fitzpatrick_scale:false,category:"flags"},monaco:{keywords:["mc","flag","nation","country","banner"],char:"🇲🇨",fitzpatrick_scale:false,category:"flags"},mongolia:{keywords:["mn","flag","nation","country","banner"],char:"🇲🇳",fitzpatrick_scale:false,category:"flags"},montenegro:{keywords:["me","flag","nation","country","banner"],char:"🇲🇪",fitzpatrick_scale:false,category:"flags"},montserrat:{keywords:["ms","flag","nation","country","banner"],char:"🇲🇸",fitzpatrick_scale:false,category:"flags"},morocco:{keywords:["ma","flag","nation","country","banner"],char:"🇲🇦",fitzpatrick_scale:false,category:"flags"},mozambique:{keywords:["mz","flag","nation","country","banner"],char:"🇲🇿",fitzpatrick_scale:false,category:"flags"},myanmar:{keywords:["mm","flag","nation","country","banner"],char:"🇲🇲",fitzpatrick_scale:false,category:"flags"},namibia:{keywords:["na","flag","nation","country","banner"],char:"🇳🇦",fitzpatrick_scale:false,category:"flags"},nauru:{keywords:["nr","flag","nation","country","banner"],char:"🇳🇷",fitzpatrick_scale:false,category:"flags"},nepal:{keywords:["np","flag","nation","country","banner"],char:"🇳🇵",fitzpatrick_scale:false,category:"flags"},netherlands:{keywords:["nl","flag","nation","country","banner"],char:"🇳🇱",fitzpatrick_scale:false,category:"flags"},new_caledonia:{keywords:["new","caledonia","flag","nation","country","banner"],char:"🇳🇨",fitzpatrick_scale:false,category:"flags"},new_zealand:{keywords:["new","zealand","flag","nation","country","banner"],char:"🇳🇿",fitzpatrick_scale:false,category:"flags"},nicaragua:{keywords:["ni","flag","nation","country","banner"],char:"🇳🇮",fitzpatrick_scale:false,category:"flags"},niger:{keywords:["ne","flag","nation","country","banner"],char:"🇳🇪",fitzpatrick_scale:false,category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],char:"🇳🇬",fitzpatrick_scale:false,category:"flags"},niue:{keywords:["nu","flag","nation","country","banner"],char:"🇳🇺",fitzpatrick_scale:false,category:"flags"},norfolk_island:{keywords:["norfolk","island","flag","nation","country","banner"],char:"🇳🇫",fitzpatrick_scale:false,category:"flags"},northern_mariana_islands:{keywords:["northern","mariana","islands","flag","nation","country","banner"],char:"🇲🇵",fitzpatrick_scale:false,category:"flags"},north_korea:{keywords:["north","korea","nation","flag","country","banner"],char:"🇰🇵",fitzpatrick_scale:false,category:"flags"},norway:{keywords:["no","flag","nation","country","banner"],char:"🇳🇴",fitzpatrick_scale:false,category:"flags"},oman:{keywords:["om_symbol","flag","nation","country","banner"],char:"🇴🇲",fitzpatrick_scale:false,category:"flags"},pakistan:{keywords:["pk","flag","nation","country","banner"],char:"🇵🇰",fitzpatrick_scale:false,category:"flags"},palau:{keywords:["pw","flag","nation","country","banner"],char:"🇵🇼",fitzpatrick_scale:false,category:"flags"},palestinian_territories:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],char:"🇵🇸",fitzpatrick_scale:false,category:"flags"},panama:{keywords:["pa","flag","nation","country","banner"],char:"🇵🇦",fitzpatrick_scale:false,category:"flags"},papua_new_guinea:{keywords:["papua","new","guinea","flag","nation","country","banner"],char:"🇵🇬",fitzpatrick_scale:false,category:"flags"},paraguay:{keywords:["py","flag","nation","country","banner"],char:"🇵🇾",fitzpatrick_scale:false,category:"flags"},peru:{keywords:["pe","flag","nation","country","banner"],char:"🇵🇪",fitzpatrick_scale:false,category:"flags"},philippines:{keywords:["ph","flag","nation","country","banner"],char:"🇵🇭",fitzpatrick_scale:false,category:"flags"},pitcairn_islands:{keywords:["pitcairn","flag","nation","country","banner"],char:"🇵🇳",fitzpatrick_scale:false,category:"flags"},poland:{keywords:["pl","flag","nation","country","banner"],char:"🇵🇱",fitzpatrick_scale:false,category:"flags"},portugal:{keywords:["pt","flag","nation","country","banner"],char:"🇵🇹",fitzpatrick_scale:false,category:"flags"},puerto_rico:{keywords:["puerto","rico","flag","nation","country","banner"],char:"🇵🇷",fitzpatrick_scale:false,category:"flags"},qatar:{keywords:["qa","flag","nation","country","banner"],char:"🇶🇦",fitzpatrick_scale:false,category:"flags"},reunion:{keywords:["réunion","flag","nation","country","banner"],char:"🇷🇪",fitzpatrick_scale:false,category:"flags"},romania:{keywords:["ro","flag","nation","country","banner"],char:"🇷🇴",fitzpatrick_scale:false,category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],char:"🇷🇺",fitzpatrick_scale:false,category:"flags"},rwanda:{keywords:["rw","flag","nation","country","banner"],char:"🇷🇼",fitzpatrick_scale:false,category:"flags"},st_barthelemy:{keywords:["saint","barthélemy","flag","nation","country","banner"],char:"🇧🇱",fitzpatrick_scale:false,category:"flags"},st_helena:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],char:"🇸🇭",fitzpatrick_scale:false,category:"flags"},st_kitts_nevis:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],char:"🇰🇳",fitzpatrick_scale:false,category:"flags"},st_lucia:{keywords:["saint","lucia","flag","nation","country","banner"],char:"🇱🇨",fitzpatrick_scale:false,category:"flags"},st_pierre_miquelon:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],char:"🇵🇲",fitzpatrick_scale:false,category:"flags"},st_vincent_grenadines:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],char:"🇻🇨",fitzpatrick_scale:false,category:"flags"},samoa:{keywords:["ws","flag","nation","country","banner"],char:"🇼🇸",fitzpatrick_scale:false,category:"flags"},san_marino:{keywords:["san","marino","flag","nation","country","banner"],char:"🇸🇲",fitzpatrick_scale:false,category:"flags"},sao_tome_principe:{keywords:["sao","tome","principe","flag","nation","country","banner"],char:"🇸🇹",fitzpatrick_scale:false,category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],char:"🇸🇦",fitzpatrick_scale:false,category:"flags"},senegal:{keywords:["sn","flag","nation","country","banner"],char:"🇸🇳",fitzpatrick_scale:false,category:"flags"},serbia:{keywords:["rs","flag","nation","country","banner"],char:"🇷🇸",fitzpatrick_scale:false,category:"flags"},seychelles:{keywords:["sc","flag","nation","country","banner"],char:"🇸🇨",fitzpatrick_scale:false,category:"flags"},sierra_leone:{keywords:["sierra","leone","flag","nation","country","banner"],char:"🇸🇱",fitzpatrick_scale:false,category:"flags"},singapore:{keywords:["sg","flag","nation","country","banner"],char:"🇸🇬",fitzpatrick_scale:false,category:"flags"},sint_maarten:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],char:"🇸🇽",fitzpatrick_scale:false,category:"flags"},slovakia:{keywords:["sk","flag","nation","country","banner"],char:"🇸🇰",fitzpatrick_scale:false,category:"flags"},slovenia:{keywords:["si","flag","nation","country","banner"],char:"🇸🇮",fitzpatrick_scale:false,category:"flags"},solomon_islands:{keywords:["solomon","islands","flag","nation","country","banner"],char:"🇸🇧",fitzpatrick_scale:false,category:"flags"},somalia:{keywords:["so","flag","nation","country","banner"],char:"🇸🇴",fitzpatrick_scale:false,category:"flags"},south_africa:{keywords:["south","africa","flag","nation","country","banner"],char:"🇿🇦",fitzpatrick_scale:false,category:"flags"},south_georgia_south_sandwich_islands:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],char:"🇬🇸",fitzpatrick_scale:false,category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],char:"🇰🇷",fitzpatrick_scale:false,category:"flags"},south_sudan:{keywords:["south","sd","flag","nation","country","banner"],char:"🇸🇸",fitzpatrick_scale:false,category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],char:"🇪🇸",fitzpatrick_scale:false,category:"flags"},sri_lanka:{keywords:["sri","lanka","flag","nation","country","banner"],char:"🇱🇰",fitzpatrick_scale:false,category:"flags"},sudan:{keywords:["sd","flag","nation","country","banner"],char:"🇸🇩",fitzpatrick_scale:false,category:"flags"},suriname:{keywords:["sr","flag","nation","country","banner"],char:"🇸🇷",fitzpatrick_scale:false,category:"flags"},swaziland:{keywords:["sz","flag","nation","country","banner"],char:"🇸🇿",fitzpatrick_scale:false,category:"flags"},sweden:{keywords:["se","flag","nation","country","banner"],char:"🇸🇪",fitzpatrick_scale:false,category:"flags"},switzerland:{keywords:["ch","flag","nation","country","banner"],char:"🇨🇭",fitzpatrick_scale:false,category:"flags"},syria:{keywords:["syrian","arab","republic","flag","nation","country","banner"],char:"🇸🇾",fitzpatrick_scale:false,category:"flags"},taiwan:{keywords:["tw","flag","nation","country","banner"],char:"🇹🇼",fitzpatrick_scale:false,category:"flags"},tajikistan:{keywords:["tj","flag","nation","country","banner"],char:"🇹🇯",fitzpatrick_scale:false,category:"flags"},tanzania:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],char:"🇹🇿",fitzpatrick_scale:false,category:"flags"},thailand:{keywords:["th","flag","nation","country","banner"],char:"🇹🇭",fitzpatrick_scale:false,category:"flags"},timor_leste:{keywords:["timor","leste","flag","nation","country","banner"],char:"🇹🇱",fitzpatrick_scale:false,category:"flags"},togo:{keywords:["tg","flag","nation","country","banner"],char:"🇹🇬",fitzpatrick_scale:false,category:"flags"},tokelau:{keywords:["tk","flag","nation","country","banner"],char:"🇹🇰",fitzpatrick_scale:false,category:"flags"},tonga:{keywords:["to","flag","nation","country","banner"],char:"🇹🇴",fitzpatrick_scale:false,category:"flags"},trinidad_tobago:{keywords:["trinidad","tobago","flag","nation","country","banner"],char:"🇹🇹",fitzpatrick_scale:false,category:"flags"},tunisia:{keywords:["tn","flag","nation","country","banner"],char:"🇹🇳",fitzpatrick_scale:false,category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],char:"🇹🇷",fitzpatrick_scale:false,category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],char:"🇹🇲",fitzpatrick_scale:false,category:"flags"},turks_caicos_islands:{keywords:["turks","caicos","islands","flag","nation","country","banner"],char:"🇹🇨",fitzpatrick_scale:false,category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],char:"🇹🇻",fitzpatrick_scale:false,category:"flags"},uganda:{keywords:["ug","flag","nation","country","banner"],char:"🇺🇬",fitzpatrick_scale:false,category:"flags"},ukraine:{keywords:["ua","flag","nation","country","banner"],char:"🇺🇦",fitzpatrick_scale:false,category:"flags"},united_arab_emirates:{keywords:["united","arab","emirates","flag","nation","country","banner"],char:"🇦🇪",fitzpatrick_scale:false,category:"flags"},uk:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],char:"🇬🇧",fitzpatrick_scale:false,category:"flags"},england:{keywords:["flag","english"],char:"ðŸ´ó §ó ¢ó ¥ó ®ó §ó ¿",fitzpatrick_scale:false,category:"flags"},scotland:{keywords:["flag","scottish"],char:"ðŸ´ó §ó ¢ó ³ó £ó ´ó ¿",fitzpatrick_scale:false,category:"flags"},wales:{keywords:["flag","welsh"],char:"ðŸ´ó §ó ¢ó ·ó ¬ó ³ó ¿",fitzpatrick_scale:false,category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],char:"🇺🇸",fitzpatrick_scale:false,category:"flags"},us_virgin_islands:{keywords:["virgin","islands","us","flag","nation","country","banner"],char:"🇻🇮",fitzpatrick_scale:false,category:"flags"},uruguay:{keywords:["uy","flag","nation","country","banner"],char:"🇺🇾",fitzpatrick_scale:false,category:"flags"},uzbekistan:{keywords:["uz","flag","nation","country","banner"],char:"🇺🇿",fitzpatrick_scale:false,category:"flags"},vanuatu:{keywords:["vu","flag","nation","country","banner"],char:"🇻🇺",fitzpatrick_scale:false,category:"flags"},vatican_city:{keywords:["vatican","city","flag","nation","country","banner"],char:"🇻🇦",fitzpatrick_scale:false,category:"flags"},venezuela:{keywords:["ve","bolivarian","republic","flag","nation","country","banner"],char:"🇻🇪",fitzpatrick_scale:false,category:"flags"},vietnam:{keywords:["viet","nam","flag","nation","country","banner"],char:"🇻🇳",fitzpatrick_scale:false,category:"flags"},wallis_futuna:{keywords:["wallis","futuna","flag","nation","country","banner"],char:"🇼🇫",fitzpatrick_scale:false,category:"flags"},western_sahara:{keywords:["western","sahara","flag","nation","country","banner"],char:"🇪🇭",fitzpatrick_scale:false,category:"flags"},yemen:{keywords:["ye","flag","nation","country","banner"],char:"🇾🇪",fitzpatrick_scale:false,category:"flags"},zambia:{keywords:["zm","flag","nation","country","banner"],char:"🇿🇲",fitzpatrick_scale:false,category:"flags"},zimbabwe:{keywords:["zw","flag","nation","country","banner"],char:"🇿🇼",fitzpatrick_scale:false,category:"flags"},united_nations:{keywords:["un","flag","banner"],char:"🇺🇳",fitzpatrick_scale:false,category:"flags"},pirate_flag:{keywords:["skull","crossbones","flag","banner"],char:"ðŸ´â€â˜ ï¸",fitzpatrick_scale:false,category:"flags"}}); \ No newline at end of file diff --git a/static/js/tinymce/plugins/emoticons/js/emojis.min.js b/static/js/tinymce/plugins/emoticons/js/emojis.min.js new file mode 100644 index 0000000..5a1c491 --- /dev/null +++ b/static/js/tinymce/plugins/emoticons/js/emojis.min.js @@ -0,0 +1,2 @@ +// Source: npm package: emojilib, file:emojis.json +window.tinymce.Resource.add("tinymce.plugins.emoticons",{grinning:{keywords:["face","smile","happy","joy",":D","grin"],char:"\u{1f600}",fitzpatrick_scale:!1,category:"people"},grimacing:{keywords:["face","grimace","teeth"],char:"\u{1f62c}",fitzpatrick_scale:!1,category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],char:"\u{1f601}",fitzpatrick_scale:!1,category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],char:"\u{1f602}",fitzpatrick_scale:!1,category:"people"},rofl:{keywords:["face","rolling","floor","laughing","lol","haha"],char:"\u{1f923}",fitzpatrick_scale:!1,category:"people"},partying:{keywords:["face","celebration","woohoo"],char:"\u{1f973}",fitzpatrick_scale:!1,category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],char:"\u{1f603}",fitzpatrick_scale:!1,category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],char:"\u{1f604}",fitzpatrick_scale:!1,category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],char:"\u{1f605}",fitzpatrick_scale:!1,category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],char:"\u{1f606}",fitzpatrick_scale:!1,category:"people"},innocent:{keywords:["face","angel","heaven","halo"],char:"\u{1f607}",fitzpatrick_scale:!1,category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile","eye"],char:"\u{1f609}",fitzpatrick_scale:!1,category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],char:"\u{1f60a}",fitzpatrick_scale:!1,category:"people"},slightly_smiling_face:{keywords:["face","smile"],char:"\u{1f642}",fitzpatrick_scale:!1,category:"people"},upside_down_face:{keywords:["face","flipped","silly","smile"],char:"\u{1f643}",fitzpatrick_scale:!1,category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],char:"\u263a\ufe0f",fitzpatrick_scale:!1,category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"],char:"\u{1f60b}",fitzpatrick_scale:!1,category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],char:"\u{1f60c}",fitzpatrick_scale:!1,category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],char:"\u{1f60d}",fitzpatrick_scale:!1,category:"people"},smiling_face_with_three_hearts:{keywords:["face","love","like","affection","valentines","infatuation","crush","hearts","adore"],char:"\u{1f970}",fitzpatrick_scale:!1,category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:"\u{1f618}",fitzpatrick_scale:!1,category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],char:"\u{1f617}",fitzpatrick_scale:!1,category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],char:"\u{1f619}",fitzpatrick_scale:!1,category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:"\u{1f61a}",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],char:"\u{1f61c}",fitzpatrick_scale:!1,category:"people"},zany:{keywords:["face","goofy","crazy"],char:"\u{1f92a}",fitzpatrick_scale:!1,category:"people"},raised_eyebrow:{keywords:["face","distrust","scepticism","disapproval","disbelief","surprise"],char:"\u{1f928}",fitzpatrick_scale:!1,category:"people"},monocle:{keywords:["face","stuffy","wealthy"],char:"\u{1f9d0}",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],char:"\u{1f61d}",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],char:"\u{1f61b}",fitzpatrick_scale:!1,category:"people"},money_mouth_face:{keywords:["face","rich","dollar","money"],char:"\u{1f911}",fitzpatrick_scale:!1,category:"people"},nerd_face:{keywords:["face","nerdy","geek","dork"],char:"\u{1f913}",fitzpatrick_scale:!1,category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],char:"\u{1f60e}",fitzpatrick_scale:!1,category:"people"},star_struck:{keywords:["face","smile","starry","eyes","grinning"],char:"\u{1f929}",fitzpatrick_scale:!1,category:"people"},clown_face:{keywords:["face"],char:"\u{1f921}",fitzpatrick_scale:!1,category:"people"},cowboy_hat_face:{keywords:["face","cowgirl","hat"],char:"\u{1f920}",fitzpatrick_scale:!1,category:"people"},hugs:{keywords:["face","smile","hug"],char:"\u{1f917}",fitzpatrick_scale:!1,category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],char:"\u{1f60f}",fitzpatrick_scale:!1,category:"people"},no_mouth:{keywords:["face","hellokitty"],char:"\u{1f636}",fitzpatrick_scale:!1,category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],char:"\u{1f610}",fitzpatrick_scale:!1,category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],char:"\u{1f611}",fitzpatrick_scale:!1,category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"],char:"\u{1f612}",fitzpatrick_scale:!1,category:"people"},roll_eyes:{keywords:["face","eyeroll","frustrated"],char:"\u{1f644}",fitzpatrick_scale:!1,category:"people"},thinking:{keywords:["face","hmmm","think","consider"],char:"\u{1f914}",fitzpatrick_scale:!1,category:"people"},lying_face:{keywords:["face","lie","pinocchio"],char:"\u{1f925}",fitzpatrick_scale:!1,category:"people"},hand_over_mouth:{keywords:["face","whoops","shock","surprise"],char:"\u{1f92d}",fitzpatrick_scale:!1,category:"people"},shushing:{keywords:["face","quiet","shhh"],char:"\u{1f92b}",fitzpatrick_scale:!1,category:"people"},symbols_over_mouth:{keywords:["face","swearing","cursing","cussing","profanity","expletive"],char:"\u{1f92c}",fitzpatrick_scale:!1,category:"people"},exploding_head:{keywords:["face","shocked","mind","blown"],char:"\u{1f92f}",fitzpatrick_scale:!1,category:"people"},flushed:{keywords:["face","blush","shy","flattered"],char:"\u{1f633}",fitzpatrick_scale:!1,category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],char:"\u{1f61e}",fitzpatrick_scale:!1,category:"people"},worried:{keywords:["face","concern","nervous",":("],char:"\u{1f61f}",fitzpatrick_scale:!1,category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],char:"\u{1f620}",fitzpatrick_scale:!1,category:"people"},rage:{keywords:["angry","mad","hate","despise"],char:"\u{1f621}",fitzpatrick_scale:!1,category:"people"},pensive:{keywords:["face","sad","depressed","upset"],char:"\u{1f614}",fitzpatrick_scale:!1,category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],char:"\u{1f615}",fitzpatrick_scale:!1,category:"people"},slightly_frowning_face:{keywords:["face","frowning","disappointed","sad","upset"],char:"\u{1f641}",fitzpatrick_scale:!1,category:"people"},frowning_face:{keywords:["face","sad","upset","frown"],char:"\u2639",fitzpatrick_scale:!1,category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],char:"\u{1f623}",fitzpatrick_scale:!1,category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],char:"\u{1f616}",fitzpatrick_scale:!1,category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],char:"\u{1f62b}",fitzpatrick_scale:!1,category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],char:"\u{1f629}",fitzpatrick_scale:!1,category:"people"},pleading:{keywords:["face","begging","mercy"],char:"\u{1f97a}",fitzpatrick_scale:!1,category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],char:"\u{1f624}",fitzpatrick_scale:!1,category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],char:"\u{1f62e}",fitzpatrick_scale:!1,category:"people"},scream:{keywords:["face","munch","scared","omg"],char:"\u{1f631}",fitzpatrick_scale:!1,category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],char:"\u{1f628}",fitzpatrick_scale:!1,category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],char:"\u{1f630}",fitzpatrick_scale:!1,category:"people"},hushed:{keywords:["face","woo","shh"],char:"\u{1f62f}",fitzpatrick_scale:!1,category:"people"},frowning:{keywords:["face","aw","what"],char:"\u{1f626}",fitzpatrick_scale:!1,category:"people"},anguished:{keywords:["face","stunned","nervous"],char:"\u{1f627}",fitzpatrick_scale:!1,category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],char:"\u{1f622}",fitzpatrick_scale:!1,category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],char:"\u{1f625}",fitzpatrick_scale:!1,category:"people"},drooling_face:{keywords:["face"],char:"\u{1f924}",fitzpatrick_scale:!1,category:"people"},sleepy:{keywords:["face","tired","rest","nap"],char:"\u{1f62a}",fitzpatrick_scale:!1,category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],char:"\u{1f613}",fitzpatrick_scale:!1,category:"people"},hot:{keywords:["face","feverish","heat","red","sweating"],char:"\u{1f975}",fitzpatrick_scale:!1,category:"people"},cold:{keywords:["face","blue","freezing","frozen","frostbite","icicles"],char:"\u{1f976}",fitzpatrick_scale:!1,category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],char:"\u{1f62d}",fitzpatrick_scale:!1,category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],char:"\u{1f635}",fitzpatrick_scale:!1,category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],char:"\u{1f632}",fitzpatrick_scale:!1,category:"people"},zipper_mouth_face:{keywords:["face","sealed","zipper","secret"],char:"\u{1f910}",fitzpatrick_scale:!1,category:"people"},nauseated_face:{keywords:["face","vomit","gross","green","sick","throw up","ill"],char:"\u{1f922}",fitzpatrick_scale:!1,category:"people"},sneezing_face:{keywords:["face","gesundheit","sneeze","sick","allergy"],char:"\u{1f927}",fitzpatrick_scale:!1,category:"people"},vomiting:{keywords:["face","sick"],char:"\u{1f92e}",fitzpatrick_scale:!1,category:"people"},mask:{keywords:["face","sick","ill","disease"],char:"\u{1f637}",fitzpatrick_scale:!1,category:"people"},face_with_thermometer:{keywords:["sick","temperature","thermometer","cold","fever"],char:"\u{1f912}",fitzpatrick_scale:!1,category:"people"},face_with_head_bandage:{keywords:["injured","clumsy","bandage","hurt"],char:"\u{1f915}",fitzpatrick_scale:!1,category:"people"},woozy:{keywords:["face","dizzy","intoxicated","tipsy","wavy"],char:"\u{1f974}",fitzpatrick_scale:!1,category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],char:"\u{1f634}",fitzpatrick_scale:!1,category:"people"},zzz:{keywords:["sleepy","tired","dream"],char:"\u{1f4a4}",fitzpatrick_scale:!1,category:"people"},poop:{keywords:["hankey","shitface","fail","turd","shit"],char:"\u{1f4a9}",fitzpatrick_scale:!1,category:"people"},smiling_imp:{keywords:["devil","horns"],char:"\u{1f608}",fitzpatrick_scale:!1,category:"people"},imp:{keywords:["devil","angry","horns"],char:"\u{1f47f}",fitzpatrick_scale:!1,category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],char:"\u{1f479}",fitzpatrick_scale:!1,category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],char:"\u{1f47a}",fitzpatrick_scale:!1,category:"people"},skull:{keywords:["dead","skeleton","creepy","death"],char:"\u{1f480}",fitzpatrick_scale:!1,category:"people"},ghost:{keywords:["halloween","spooky","scary"],char:"\u{1f47b}",fitzpatrick_scale:!1,category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],char:"\u{1f47d}",fitzpatrick_scale:!1,category:"people"},robot:{keywords:["computer","machine","bot"],char:"\u{1f916}",fitzpatrick_scale:!1,category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],char:"\u{1f63a}",fitzpatrick_scale:!1,category:"people"},smile_cat:{keywords:["animal","cats","smile"],char:"\u{1f638}",fitzpatrick_scale:!1,category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],char:"\u{1f639}",fitzpatrick_scale:!1,category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],char:"\u{1f63b}",fitzpatrick_scale:!1,category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],char:"\u{1f63c}",fitzpatrick_scale:!1,category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],char:"\u{1f63d}",fitzpatrick_scale:!1,category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],char:"\u{1f640}",fitzpatrick_scale:!1,category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],char:"\u{1f63f}",fitzpatrick_scale:!1,category:"people"},pouting_cat:{keywords:["animal","cats"],char:"\u{1f63e}",fitzpatrick_scale:!1,category:"people"},palms_up:{keywords:["hands","gesture","cupped","prayer"],char:"\u{1f932}",fitzpatrick_scale:!0,category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],char:"\u{1f64c}",fitzpatrick_scale:!0,category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],char:"\u{1f44f}",fitzpatrick_scale:!0,category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","hi","palm"],char:"\u{1f44b}",fitzpatrick_scale:!0,category:"people"},call_me_hand:{keywords:["hands","gesture"],char:"\u{1f919}",fitzpatrick_scale:!0,category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],char:"\u{1f44d}",fitzpatrick_scale:!0,category:"people"},"-1":{keywords:["thumbsdown","no","dislike","hand"],char:"\u{1f44e}",fitzpatrick_scale:!0,category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],char:"\u{1f44a}",fitzpatrick_scale:!0,category:"people"},fist:{keywords:["fingers","hand","grasp"],char:"\u270a",fitzpatrick_scale:!0,category:"people"},fist_left:{keywords:["hand","fistbump"],char:"\u{1f91b}",fitzpatrick_scale:!0,category:"people"},fist_right:{keywords:["hand","fistbump"],char:"\u{1f91c}",fitzpatrick_scale:!0,category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],char:"\u270c",fitzpatrick_scale:!0,category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok","okay"],char:"\u{1f44c}",fitzpatrick_scale:!0,category:"people"},raised_hand:{keywords:["fingers","stop","highfive","palm","ban"],char:"\u270b",fitzpatrick_scale:!0,category:"people"},raised_back_of_hand:{keywords:["fingers","raised","backhand"],char:"\u{1f91a}",fitzpatrick_scale:!0,category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],char:"\u{1f450}",fitzpatrick_scale:!0,category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],char:"\u{1f4aa}",fitzpatrick_scale:!0,category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],char:"\u{1f64f}",fitzpatrick_scale:!0,category:"people"},foot:{keywords:["kick","stomp"],char:"\u{1f9b6}",fitzpatrick_scale:!0,category:"people"},leg:{keywords:["kick","limb"],char:"\u{1f9b5}",fitzpatrick_scale:!0,category:"people"},handshake:{keywords:["agreement","shake"],char:"\u{1f91d}",fitzpatrick_scale:!1,category:"people"},point_up:{keywords:["hand","fingers","direction","up"],char:"\u261d",fitzpatrick_scale:!0,category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],char:"\u{1f446}",fitzpatrick_scale:!0,category:"people"},point_down:{keywords:["fingers","hand","direction","down"],char:"\u{1f447}",fitzpatrick_scale:!0,category:"people"},point_left:{keywords:["direction","fingers","hand","left"],char:"\u{1f448}",fitzpatrick_scale:!0,category:"people"},point_right:{keywords:["fingers","hand","direction","right"],char:"\u{1f449}",fitzpatrick_scale:!0,category:"people"},fu:{keywords:["hand","fingers","rude","middle","flipping"],char:"\u{1f595}",fitzpatrick_scale:!0,category:"people"},raised_hand_with_fingers_splayed:{keywords:["hand","fingers","palm"],char:"\u{1f590}",fitzpatrick_scale:!0,category:"people"},love_you:{keywords:["hand","fingers","gesture"],char:"\u{1f91f}",fitzpatrick_scale:!0,category:"people"},metal:{keywords:["hand","fingers","evil_eye","sign_of_horns","rock_on"],char:"\u{1f918}",fitzpatrick_scale:!0,category:"people"},crossed_fingers:{keywords:["good","lucky"],char:"\u{1f91e}",fitzpatrick_scale:!0,category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],char:"\u{1f596}",fitzpatrick_scale:!0,category:"people"},writing_hand:{keywords:["lower_left_ballpoint_pen","stationery","write","compose"],char:"\u270d",fitzpatrick_scale:!0,category:"people"},selfie:{keywords:["camera","phone"],char:"\u{1f933}",fitzpatrick_scale:!0,category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],char:"\u{1f485}",fitzpatrick_scale:!0,category:"people"},lips:{keywords:["mouth","kiss"],char:"\u{1f444}",fitzpatrick_scale:!1,category:"people"},tooth:{keywords:["teeth","dentist"],char:"\u{1f9b7}",fitzpatrick_scale:!1,category:"people"},tongue:{keywords:["mouth","playful"],char:"\u{1f445}",fitzpatrick_scale:!1,category:"people"},ear:{keywords:["face","hear","sound","listen"],char:"\u{1f442}",fitzpatrick_scale:!0,category:"people"},nose:{keywords:["smell","sniff"],char:"\u{1f443}",fitzpatrick_scale:!0,category:"people"},eye:{keywords:["face","look","see","watch","stare"],char:"\u{1f441}",fitzpatrick_scale:!1,category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],char:"\u{1f440}",fitzpatrick_scale:!1,category:"people"},brain:{keywords:["smart","intelligent"],char:"\u{1f9e0}",fitzpatrick_scale:!1,category:"people"},bust_in_silhouette:{keywords:["user","person","human"],char:"\u{1f464}",fitzpatrick_scale:!1,category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],char:"\u{1f465}",fitzpatrick_scale:!1,category:"people"},speaking_head:{keywords:["user","person","human","sing","say","talk"],char:"\u{1f5e3}",fitzpatrick_scale:!1,category:"people"},baby:{keywords:["child","boy","girl","toddler"],char:"\u{1f476}",fitzpatrick_scale:!0,category:"people"},child:{keywords:["gender-neutral","young"],char:"\u{1f9d2}",fitzpatrick_scale:!0,category:"people"},boy:{keywords:["man","male","guy","teenager"],char:"\u{1f466}",fitzpatrick_scale:!0,category:"people"},girl:{keywords:["female","woman","teenager"],char:"\u{1f467}",fitzpatrick_scale:!0,category:"people"},adult:{keywords:["gender-neutral","person"],char:"\u{1f9d1}",fitzpatrick_scale:!0,category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],char:"\u{1f468}",fitzpatrick_scale:!0,category:"people"},woman:{keywords:["female","girls","lady"],char:"\u{1f469}",fitzpatrick_scale:!0,category:"people"},blonde_woman:{keywords:["woman","female","girl","blonde","person"],char:"\u{1f471}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},blonde_man:{keywords:["man","male","boy","blonde","guy","person"],char:"\u{1f471}",fitzpatrick_scale:!0,category:"people"},bearded_person:{keywords:["person","bewhiskered"],char:"\u{1f9d4}",fitzpatrick_scale:!0,category:"people"},older_adult:{keywords:["human","elder","senior","gender-neutral"],char:"\u{1f9d3}",fitzpatrick_scale:!0,category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],char:"\u{1f474}",fitzpatrick_scale:!0,category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],char:"\u{1f475}",fitzpatrick_scale:!0,category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],char:"\u{1f472}",fitzpatrick_scale:!0,category:"people"},woman_with_headscarf:{keywords:["female","hijab","mantilla","tichel"],char:"\u{1f9d5}",fitzpatrick_scale:!0,category:"people"},woman_with_turban:{keywords:["female","indian","hinduism","arabs","woman"],char:"\u{1f473}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],char:"\u{1f473}",fitzpatrick_scale:!0,category:"people"},policewoman:{keywords:["woman","police","law","legal","enforcement","arrest","911","female"],char:"\u{1f46e}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},policeman:{keywords:["man","police","law","legal","enforcement","arrest","911"],char:"\u{1f46e}",fitzpatrick_scale:!0,category:"people"},construction_worker_woman:{keywords:["female","human","wip","build","construction","worker","labor","woman"],char:"\u{1f477}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},construction_worker_man:{keywords:["male","human","wip","guy","build","construction","worker","labor"],char:"\u{1f477}",fitzpatrick_scale:!0,category:"people"},guardswoman:{keywords:["uk","gb","british","female","royal","woman"],char:"\u{1f482}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],char:"\u{1f482}",fitzpatrick_scale:!0,category:"people"},female_detective:{keywords:["human","spy","detective","female","woman"],char:"\u{1f575}\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},male_detective:{keywords:["human","spy","detective"],char:"\u{1f575}",fitzpatrick_scale:!0,category:"people"},woman_health_worker:{keywords:["doctor","nurse","therapist","healthcare","woman","human"],char:"\u{1f469}\u200d\u2695\ufe0f",fitzpatrick_scale:!0,category:"people"},man_health_worker:{keywords:["doctor","nurse","therapist","healthcare","man","human"],char:"\u{1f468}\u200d\u2695\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_farmer:{keywords:["rancher","gardener","woman","human"],char:"\u{1f469}\u200d\u{1f33e}",fitzpatrick_scale:!0,category:"people"},man_farmer:{keywords:["rancher","gardener","man","human"],char:"\u{1f468}\u200d\u{1f33e}",fitzpatrick_scale:!0,category:"people"},woman_cook:{keywords:["chef","woman","human"],char:"\u{1f469}\u200d\u{1f373}",fitzpatrick_scale:!0,category:"people"},man_cook:{keywords:["chef","man","human"],char:"\u{1f468}\u200d\u{1f373}",fitzpatrick_scale:!0,category:"people"},woman_student:{keywords:["graduate","woman","human"],char:"\u{1f469}\u200d\u{1f393}",fitzpatrick_scale:!0,category:"people"},man_student:{keywords:["graduate","man","human"],char:"\u{1f468}\u200d\u{1f393}",fitzpatrick_scale:!0,category:"people"},woman_singer:{keywords:["rockstar","entertainer","woman","human"],char:"\u{1f469}\u200d\u{1f3a4}",fitzpatrick_scale:!0,category:"people"},man_singer:{keywords:["rockstar","entertainer","man","human"],char:"\u{1f468}\u200d\u{1f3a4}",fitzpatrick_scale:!0,category:"people"},woman_teacher:{keywords:["instructor","professor","woman","human"],char:"\u{1f469}\u200d\u{1f3eb}",fitzpatrick_scale:!0,category:"people"},man_teacher:{keywords:["instructor","professor","man","human"],char:"\u{1f468}\u200d\u{1f3eb}",fitzpatrick_scale:!0,category:"people"},woman_factory_worker:{keywords:["assembly","industrial","woman","human"],char:"\u{1f469}\u200d\u{1f3ed}",fitzpatrick_scale:!0,category:"people"},man_factory_worker:{keywords:["assembly","industrial","man","human"],char:"\u{1f468}\u200d\u{1f3ed}",fitzpatrick_scale:!0,category:"people"},woman_technologist:{keywords:["coder","developer","engineer","programmer","software","woman","human","laptop","computer"],char:"\u{1f469}\u200d\u{1f4bb}",fitzpatrick_scale:!0,category:"people"},man_technologist:{keywords:["coder","developer","engineer","programmer","software","man","human","laptop","computer"],char:"\u{1f468}\u200d\u{1f4bb}",fitzpatrick_scale:!0,category:"people"},woman_office_worker:{keywords:["business","manager","woman","human"],char:"\u{1f469}\u200d\u{1f4bc}",fitzpatrick_scale:!0,category:"people"},man_office_worker:{keywords:["business","manager","man","human"],char:"\u{1f468}\u200d\u{1f4bc}",fitzpatrick_scale:!0,category:"people"},woman_mechanic:{keywords:["plumber","woman","human","wrench"],char:"\u{1f469}\u200d\u{1f527}",fitzpatrick_scale:!0,category:"people"},man_mechanic:{keywords:["plumber","man","human","wrench"],char:"\u{1f468}\u200d\u{1f527}",fitzpatrick_scale:!0,category:"people"},woman_scientist:{keywords:["biologist","chemist","engineer","physicist","woman","human"],char:"\u{1f469}\u200d\u{1f52c}",fitzpatrick_scale:!0,category:"people"},man_scientist:{keywords:["biologist","chemist","engineer","physicist","man","human"],char:"\u{1f468}\u200d\u{1f52c}",fitzpatrick_scale:!0,category:"people"},woman_artist:{keywords:["painter","woman","human"],char:"\u{1f469}\u200d\u{1f3a8}",fitzpatrick_scale:!0,category:"people"},man_artist:{keywords:["painter","man","human"],char:"\u{1f468}\u200d\u{1f3a8}",fitzpatrick_scale:!0,category:"people"},woman_firefighter:{keywords:["fireman","woman","human"],char:"\u{1f469}\u200d\u{1f692}",fitzpatrick_scale:!0,category:"people"},man_firefighter:{keywords:["fireman","man","human"],char:"\u{1f468}\u200d\u{1f692}",fitzpatrick_scale:!0,category:"people"},woman_pilot:{keywords:["aviator","plane","woman","human"],char:"\u{1f469}\u200d\u2708\ufe0f",fitzpatrick_scale:!0,category:"people"},man_pilot:{keywords:["aviator","plane","man","human"],char:"\u{1f468}\u200d\u2708\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_astronaut:{keywords:["space","rocket","woman","human"],char:"\u{1f469}\u200d\u{1f680}",fitzpatrick_scale:!0,category:"people"},man_astronaut:{keywords:["space","rocket","man","human"],char:"\u{1f468}\u200d\u{1f680}",fitzpatrick_scale:!0,category:"people"},woman_judge:{keywords:["justice","court","woman","human"],char:"\u{1f469}\u200d\u2696\ufe0f",fitzpatrick_scale:!0,category:"people"},man_judge:{keywords:["justice","court","man","human"],char:"\u{1f468}\u200d\u2696\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_superhero:{keywords:["woman","female","good","heroine","superpowers"],char:"\u{1f9b8}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_superhero:{keywords:["man","male","good","hero","superpowers"],char:"\u{1f9b8}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_supervillain:{keywords:["woman","female","evil","bad","criminal","heroine","superpowers"],char:"\u{1f9b9}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_supervillain:{keywords:["man","male","evil","bad","criminal","hero","superpowers"],char:"\u{1f9b9}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},mrs_claus:{keywords:["woman","female","xmas","mother christmas"],char:"\u{1f936}",fitzpatrick_scale:!0,category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],char:"\u{1f385}",fitzpatrick_scale:!0,category:"people"},sorceress:{keywords:["woman","female","mage","witch"],char:"\u{1f9d9}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},wizard:{keywords:["man","male","mage","sorcerer"],char:"\u{1f9d9}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_elf:{keywords:["woman","female"],char:"\u{1f9dd}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_elf:{keywords:["man","male"],char:"\u{1f9dd}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_vampire:{keywords:["woman","female"],char:"\u{1f9db}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_vampire:{keywords:["man","male","dracula"],char:"\u{1f9db}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_zombie:{keywords:["woman","female","undead","walking dead"],char:"\u{1f9df}\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"people"},man_zombie:{keywords:["man","male","dracula","undead","walking dead"],char:"\u{1f9df}\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},woman_genie:{keywords:["woman","female"],char:"\u{1f9de}\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"people"},man_genie:{keywords:["man","male"],char:"\u{1f9de}\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},mermaid:{keywords:["woman","female","merwoman","ariel"],char:"\u{1f9dc}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},merman:{keywords:["man","male","triton"],char:"\u{1f9dc}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_fairy:{keywords:["woman","female"],char:"\u{1f9da}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_fairy:{keywords:["man","male"],char:"\u{1f9da}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},angel:{keywords:["heaven","wings","halo"],char:"\u{1f47c}",fitzpatrick_scale:!0,category:"people"},pregnant_woman:{keywords:["baby"],char:"\u{1f930}",fitzpatrick_scale:!0,category:"people"},breastfeeding:{keywords:["nursing","baby"],char:"\u{1f931}",fitzpatrick_scale:!0,category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],char:"\u{1f478}",fitzpatrick_scale:!0,category:"people"},prince:{keywords:["boy","man","male","crown","royal","king"],char:"\u{1f934}",fitzpatrick_scale:!0,category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],char:"\u{1f470}",fitzpatrick_scale:!0,category:"people"},man_in_tuxedo:{keywords:["couple","marriage","wedding","groom"],char:"\u{1f935}",fitzpatrick_scale:!0,category:"people"},running_woman:{keywords:["woman","walking","exercise","race","running","female"],char:"\u{1f3c3}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},running_man:{keywords:["man","walking","exercise","race","running"],char:"\u{1f3c3}",fitzpatrick_scale:!0,category:"people"},walking_woman:{keywords:["human","feet","steps","woman","female"],char:"\u{1f6b6}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},walking_man:{keywords:["human","feet","steps"],char:"\u{1f6b6}",fitzpatrick_scale:!0,category:"people"},dancer:{keywords:["female","girl","woman","fun"],char:"\u{1f483}",fitzpatrick_scale:!0,category:"people"},man_dancing:{keywords:["male","boy","fun","dancer"],char:"\u{1f57a}",fitzpatrick_scale:!0,category:"people"},dancing_women:{keywords:["female","bunny","women","girls"],char:"\u{1f46f}",fitzpatrick_scale:!1,category:"people"},dancing_men:{keywords:["male","bunny","men","boys"],char:"\u{1f46f}\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],char:"\u{1f46b}",fitzpatrick_scale:!1,category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],char:"\u{1f46c}",fitzpatrick_scale:!1,category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],char:"\u{1f46d}",fitzpatrick_scale:!1,category:"people"},bowing_woman:{keywords:["woman","female","girl"],char:"\u{1f647}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},bowing_man:{keywords:["man","male","boy"],char:"\u{1f647}",fitzpatrick_scale:!0,category:"people"},man_facepalming:{keywords:["man","male","boy","disbelief"],char:"\u{1f926}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_facepalming:{keywords:["woman","female","girl","disbelief"],char:"\u{1f926}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_shrugging:{keywords:["woman","female","girl","confused","indifferent","doubt"],char:"\u{1f937}",fitzpatrick_scale:!0,category:"people"},man_shrugging:{keywords:["man","male","boy","confused","indifferent","doubt"],char:"\u{1f937}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},tipping_hand_woman:{keywords:["female","girl","woman","human","information"],char:"\u{1f481}",fitzpatrick_scale:!0,category:"people"},tipping_hand_man:{keywords:["male","boy","man","human","information"],char:"\u{1f481}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},no_good_woman:{keywords:["female","girl","woman","nope"],char:"\u{1f645}",fitzpatrick_scale:!0,category:"people"},no_good_man:{keywords:["male","boy","man","nope"],char:"\u{1f645}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],char:"\u{1f646}",fitzpatrick_scale:!0,category:"people"},ok_man:{keywords:["men","boy","male","blue","human","man"],char:"\u{1f646}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},raising_hand_woman:{keywords:["female","girl","woman"],char:"\u{1f64b}",fitzpatrick_scale:!0,category:"people"},raising_hand_man:{keywords:["male","boy","man"],char:"\u{1f64b}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},pouting_woman:{keywords:["female","girl","woman"],char:"\u{1f64e}",fitzpatrick_scale:!0,category:"people"},pouting_man:{keywords:["male","boy","man"],char:"\u{1f64e}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},frowning_woman:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],char:"\u{1f64d}",fitzpatrick_scale:!0,category:"people"},frowning_man:{keywords:["male","boy","man","sad","depressed","discouraged","unhappy"],char:"\u{1f64d}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},haircut_woman:{keywords:["female","girl","woman"],char:"\u{1f487}",fitzpatrick_scale:!0,category:"people"},haircut_man:{keywords:["male","boy","man"],char:"\u{1f487}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},massage_woman:{keywords:["female","girl","woman","head"],char:"\u{1f486}",fitzpatrick_scale:!0,category:"people"},massage_man:{keywords:["male","boy","man","head"],char:"\u{1f486}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_in_steamy_room:{keywords:["female","woman","spa","steamroom","sauna"],char:"\u{1f9d6}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_in_steamy_room:{keywords:["male","man","spa","steamroom","sauna"],char:"\u{1f9d6}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},couple_with_heart_woman_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"\u{1f491}",fitzpatrick_scale:!1,category:"people"},couple_with_heart_woman_woman:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"\u{1f469}\u200d\u2764\ufe0f\u200d\u{1f469}",fitzpatrick_scale:!1,category:"people"},couple_with_heart_man_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"\u{1f468}\u200d\u2764\ufe0f\u200d\u{1f468}",fitzpatrick_scale:!1,category:"people"},couplekiss_man_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:"\u{1f48f}",fitzpatrick_scale:!1,category:"people"},couplekiss_woman_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:"\u{1f469}\u200d\u2764\ufe0f\u200d\u{1f48b}\u200d\u{1f469}",fitzpatrick_scale:!1,category:"people"},couplekiss_man_man:{keywords:["pair","valentines","love","like","dating","marriage"],char:"\u{1f468}\u200d\u2764\ufe0f\u200d\u{1f48b}\u200d\u{1f468}",fitzpatrick_scale:!1,category:"people"},family_man_woman_boy:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],char:"\u{1f46a}",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],char:"\u{1f468}\u200d\u{1f469}\u200d\u{1f467}",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:"\u{1f468}\u200d\u{1f469}\u200d\u{1f467}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_man_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:"\u{1f468}\u200d\u{1f469}\u200d\u{1f466}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:"\u{1f468}\u200d\u{1f469}\u200d\u{1f467}\u200d\u{1f467}",fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy:{keywords:["home","parents","people","human","children"],char:"\u{1f469}\u200d\u{1f469}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl:{keywords:["home","parents","people","human","children"],char:"\u{1f469}\u200d\u{1f469}\u200d\u{1f467}",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:"\u{1f469}\u200d\u{1f469}\u200d\u{1f467}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:"\u{1f469}\u200d\u{1f469}\u200d\u{1f466}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:"\u{1f469}\u200d\u{1f469}\u200d\u{1f467}\u200d\u{1f467}",fitzpatrick_scale:!1,category:"people"},family_man_man_boy:{keywords:["home","parents","people","human","children"],char:"\u{1f468}\u200d\u{1f468}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_man_man_girl:{keywords:["home","parents","people","human","children"],char:"\u{1f468}\u200d\u{1f468}\u200d\u{1f467}",fitzpatrick_scale:!1,category:"people"},family_man_man_girl_boy:{keywords:["home","parents","people","human","children"],char:"\u{1f468}\u200d\u{1f468}\u200d\u{1f467}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_man_man_boy_boy:{keywords:["home","parents","people","human","children"],char:"\u{1f468}\u200d\u{1f468}\u200d\u{1f466}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_man_man_girl_girl:{keywords:["home","parents","people","human","children"],char:"\u{1f468}\u200d\u{1f468}\u200d\u{1f467}\u200d\u{1f467}",fitzpatrick_scale:!1,category:"people"},family_woman_boy:{keywords:["home","parent","people","human","child"],char:"\u{1f469}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_woman_girl:{keywords:["home","parent","people","human","child"],char:"\u{1f469}\u200d\u{1f467}",fitzpatrick_scale:!1,category:"people"},family_woman_girl_boy:{keywords:["home","parent","people","human","children"],char:"\u{1f469}\u200d\u{1f467}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_woman_boy_boy:{keywords:["home","parent","people","human","children"],char:"\u{1f469}\u200d\u{1f466}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_woman_girl_girl:{keywords:["home","parent","people","human","children"],char:"\u{1f469}\u200d\u{1f467}\u200d\u{1f467}",fitzpatrick_scale:!1,category:"people"},family_man_boy:{keywords:["home","parent","people","human","child"],char:"\u{1f468}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_man_girl:{keywords:["home","parent","people","human","child"],char:"\u{1f468}\u200d\u{1f467}",fitzpatrick_scale:!1,category:"people"},family_man_girl_boy:{keywords:["home","parent","people","human","children"],char:"\u{1f468}\u200d\u{1f467}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_man_boy_boy:{keywords:["home","parent","people","human","children"],char:"\u{1f468}\u200d\u{1f466}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_man_girl_girl:{keywords:["home","parent","people","human","children"],char:"\u{1f468}\u200d\u{1f467}\u200d\u{1f467}",fitzpatrick_scale:!1,category:"people"},yarn:{keywords:["ball","crochet","knit"],char:"\u{1f9f6}",fitzpatrick_scale:!1,category:"people"},thread:{keywords:["needle","sewing","spool","string"],char:"\u{1f9f5}",fitzpatrick_scale:!1,category:"people"},coat:{keywords:["jacket"],char:"\u{1f9e5}",fitzpatrick_scale:!1,category:"people"},labcoat:{keywords:["doctor","experiment","scientist","chemist"],char:"\u{1f97c}",fitzpatrick_scale:!1,category:"people"},womans_clothes:{keywords:["fashion","shopping_bags","female"],char:"\u{1f45a}",fitzpatrick_scale:!1,category:"people"},tshirt:{keywords:["fashion","cloth","casual","shirt","tee"],char:"\u{1f455}",fitzpatrick_scale:!1,category:"people"},jeans:{keywords:["fashion","shopping"],char:"\u{1f456}",fitzpatrick_scale:!1,category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],char:"\u{1f454}",fitzpatrick_scale:!1,category:"people"},dress:{keywords:["clothes","fashion","shopping"],char:"\u{1f457}",fitzpatrick_scale:!1,category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],char:"\u{1f459}",fitzpatrick_scale:!1,category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],char:"\u{1f458}",fitzpatrick_scale:!1,category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],char:"\u{1f484}",fitzpatrick_scale:!1,category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],char:"\u{1f48b}",fitzpatrick_scale:!1,category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],char:"\u{1f463}",fitzpatrick_scale:!1,category:"people"},flat_shoe:{keywords:["ballet","slip-on","slipper"],char:"\u{1f97f}",fitzpatrick_scale:!1,category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],char:"\u{1f460}",fitzpatrick_scale:!1,category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],char:"\u{1f461}",fitzpatrick_scale:!1,category:"people"},boot:{keywords:["shoes","fashion"],char:"\u{1f462}",fitzpatrick_scale:!1,category:"people"},mans_shoe:{keywords:["fashion","male"],char:"\u{1f45e}",fitzpatrick_scale:!1,category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],char:"\u{1f45f}",fitzpatrick_scale:!1,category:"people"},hiking_boot:{keywords:["backpacking","camping","hiking"],char:"\u{1f97e}",fitzpatrick_scale:!1,category:"people"},socks:{keywords:["stockings","clothes"],char:"\u{1f9e6}",fitzpatrick_scale:!1,category:"people"},gloves:{keywords:["hands","winter","clothes"],char:"\u{1f9e4}",fitzpatrick_scale:!1,category:"people"},scarf:{keywords:["neck","winter","clothes"],char:"\u{1f9e3}",fitzpatrick_scale:!1,category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],char:"\u{1f452}",fitzpatrick_scale:!1,category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],char:"\u{1f3a9}",fitzpatrick_scale:!1,category:"people"},billed_hat:{keywords:["cap","baseball"],char:"\u{1f9e2}",fitzpatrick_scale:!1,category:"people"},rescue_worker_helmet:{keywords:["construction","build"],char:"\u26d1",fitzpatrick_scale:!1,category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],char:"\u{1f393}",fitzpatrick_scale:!1,category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],char:"\u{1f451}",fitzpatrick_scale:!1,category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],char:"\u{1f392}",fitzpatrick_scale:!1,category:"people"},luggage:{keywords:["packing","travel"],char:"\u{1f9f3}",fitzpatrick_scale:!1,category:"people"},pouch:{keywords:["bag","accessories","shopping"],char:"\u{1f45d}",fitzpatrick_scale:!1,category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],char:"\u{1f45b}",fitzpatrick_scale:!1,category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],char:"\u{1f45c}",fitzpatrick_scale:!1,category:"people"},briefcase:{keywords:["business","documents","work","law","legal","job","career"],char:"\u{1f4bc}",fitzpatrick_scale:!1,category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],char:"\u{1f453}",fitzpatrick_scale:!1,category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],char:"\u{1f576}",fitzpatrick_scale:!1,category:"people"},goggles:{keywords:["eyes","protection","safety"],char:"\u{1f97d}",fitzpatrick_scale:!1,category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],char:"\u{1f48d}",fitzpatrick_scale:!1,category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],char:"\u{1f302}",fitzpatrick_scale:!1,category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],char:"\u{1f436}",fitzpatrick_scale:!1,category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],char:"\u{1f431}",fitzpatrick_scale:!1,category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese_wedge","rodent"],char:"\u{1f42d}",fitzpatrick_scale:!1,category:"animals_and_nature"},hamster:{keywords:["animal","nature"],char:"\u{1f439}",fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],char:"\u{1f430}",fitzpatrick_scale:!1,category:"animals_and_nature"},fox_face:{keywords:["animal","nature","face"],char:"\u{1f98a}",fitzpatrick_scale:!1,category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],char:"\u{1f43b}",fitzpatrick_scale:!1,category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],char:"\u{1f43c}",fitzpatrick_scale:!1,category:"animals_and_nature"},koala:{keywords:["animal","nature"],char:"\u{1f428}",fitzpatrick_scale:!1,category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],char:"\u{1f42f}",fitzpatrick_scale:!1,category:"animals_and_nature"},lion:{keywords:["animal","nature"],char:"\u{1f981}",fitzpatrick_scale:!1,category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],char:"\u{1f42e}",fitzpatrick_scale:!1,category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],char:"\u{1f437}",fitzpatrick_scale:!1,category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],char:"\u{1f43d}",fitzpatrick_scale:!1,category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],char:"\u{1f438}",fitzpatrick_scale:!1,category:"animals_and_nature"},squid:{keywords:["animal","nature","ocean","sea"],char:"\u{1f991}",fitzpatrick_scale:!1,category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],char:"\u{1f419}",fitzpatrick_scale:!1,category:"animals_and_nature"},shrimp:{keywords:["animal","ocean","nature","seafood"],char:"\u{1f990}",fitzpatrick_scale:!1,category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],char:"\u{1f435}",fitzpatrick_scale:!1,category:"animals_and_nature"},gorilla:{keywords:["animal","nature","circus"],char:"\u{1f98d}",fitzpatrick_scale:!1,category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],char:"\u{1f648}",fitzpatrick_scale:!1,category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],char:"\u{1f649}",fitzpatrick_scale:!1,category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],char:"\u{1f64a}",fitzpatrick_scale:!1,category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],char:"\u{1f412}",fitzpatrick_scale:!1,category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],char:"\u{1f414}",fitzpatrick_scale:!1,category:"animals_and_nature"},penguin:{keywords:["animal","nature"],char:"\u{1f427}",fitzpatrick_scale:!1,category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],char:"\u{1f426}",fitzpatrick_scale:!1,category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],char:"\u{1f424}",fitzpatrick_scale:!1,category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],char:"\u{1f423}",fitzpatrick_scale:!1,category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],char:"\u{1f425}",fitzpatrick_scale:!1,category:"animals_and_nature"},duck:{keywords:["animal","nature","bird","mallard"],char:"\u{1f986}",fitzpatrick_scale:!1,category:"animals_and_nature"},eagle:{keywords:["animal","nature","bird"],char:"\u{1f985}",fitzpatrick_scale:!1,category:"animals_and_nature"},owl:{keywords:["animal","nature","bird","hoot"],char:"\u{1f989}",fitzpatrick_scale:!1,category:"animals_and_nature"},bat:{keywords:["animal","nature","blind","vampire"],char:"\u{1f987}",fitzpatrick_scale:!1,category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],char:"\u{1f43a}",fitzpatrick_scale:!1,category:"animals_and_nature"},boar:{keywords:["animal","nature"],char:"\u{1f417}",fitzpatrick_scale:!1,category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],char:"\u{1f434}",fitzpatrick_scale:!1,category:"animals_and_nature"},unicorn:{keywords:["animal","nature","mystical"],char:"\u{1f984}",fitzpatrick_scale:!1,category:"animals_and_nature"},honeybee:{keywords:["animal","insect","nature","bug","spring","honey"],char:"\u{1f41d}",fitzpatrick_scale:!1,category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],char:"\u{1f41b}",fitzpatrick_scale:!1,category:"animals_and_nature"},butterfly:{keywords:["animal","insect","nature","caterpillar"],char:"\u{1f98b}",fitzpatrick_scale:!1,category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],char:"\u{1f40c}",fitzpatrick_scale:!1,category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],char:"\u{1f41e}",fitzpatrick_scale:!1,category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],char:"\u{1f41c}",fitzpatrick_scale:!1,category:"animals_and_nature"},grasshopper:{keywords:["animal","cricket","chirp"],char:"\u{1f997}",fitzpatrick_scale:!1,category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],char:"\u{1f577}",fitzpatrick_scale:!1,category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],char:"\u{1f982}",fitzpatrick_scale:!1,category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],char:"\u{1f980}",fitzpatrick_scale:!1,category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],char:"\u{1f40d}",fitzpatrick_scale:!1,category:"animals_and_nature"},lizard:{keywords:["animal","nature","reptile"],char:"\u{1f98e}",fitzpatrick_scale:!1,category:"animals_and_nature"},"t-rex":{keywords:["animal","nature","dinosaur","tyrannosaurus","extinct"],char:"\u{1f996}",fitzpatrick_scale:!1,category:"animals_and_nature"},sauropod:{keywords:["animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"],char:"\u{1f995}",fitzpatrick_scale:!1,category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],char:"\u{1f422}",fitzpatrick_scale:!1,category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],char:"\u{1f420}",fitzpatrick_scale:!1,category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],char:"\u{1f41f}",fitzpatrick_scale:!1,category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],char:"\u{1f421}",fitzpatrick_scale:!1,category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],char:"\u{1f42c}",fitzpatrick_scale:!1,category:"animals_and_nature"},shark:{keywords:["animal","nature","fish","sea","ocean","jaws","fins","beach"],char:"\u{1f988}",fitzpatrick_scale:!1,category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],char:"\u{1f433}",fitzpatrick_scale:!1,category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],char:"\u{1f40b}",fitzpatrick_scale:!1,category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],char:"\u{1f40a}",fitzpatrick_scale:!1,category:"animals_and_nature"},leopard:{keywords:["animal","nature"],char:"\u{1f406}",fitzpatrick_scale:!1,category:"animals_and_nature"},zebra:{keywords:["animal","nature","stripes","safari"],char:"\u{1f993}",fitzpatrick_scale:!1,category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],char:"\u{1f405}",fitzpatrick_scale:!1,category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],char:"\u{1f403}",fitzpatrick_scale:!1,category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],char:"\u{1f402}",fitzpatrick_scale:!1,category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],char:"\u{1f404}",fitzpatrick_scale:!1,category:"animals_and_nature"},deer:{keywords:["animal","nature","horns","venison"],char:"\u{1f98c}",fitzpatrick_scale:!1,category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],char:"\u{1f42a}",fitzpatrick_scale:!1,category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],char:"\u{1f42b}",fitzpatrick_scale:!1,category:"animals_and_nature"},giraffe:{keywords:["animal","nature","spots","safari"],char:"\u{1f992}",fitzpatrick_scale:!1,category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","th","circus"],char:"\u{1f418}",fitzpatrick_scale:!1,category:"animals_and_nature"},rhinoceros:{keywords:["animal","nature","horn"],char:"\u{1f98f}",fitzpatrick_scale:!1,category:"animals_and_nature"},goat:{keywords:["animal","nature"],char:"\u{1f410}",fitzpatrick_scale:!1,category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],char:"\u{1f40f}",fitzpatrick_scale:!1,category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],char:"\u{1f411}",fitzpatrick_scale:!1,category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],char:"\u{1f40e}",fitzpatrick_scale:!1,category:"animals_and_nature"},pig2:{keywords:["animal","nature"],char:"\u{1f416}",fitzpatrick_scale:!1,category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],char:"\u{1f400}",fitzpatrick_scale:!1,category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],char:"\u{1f401}",fitzpatrick_scale:!1,category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],char:"\u{1f413}",fitzpatrick_scale:!1,category:"animals_and_nature"},turkey:{keywords:["animal","bird"],char:"\u{1f983}",fitzpatrick_scale:!1,category:"animals_and_nature"},dove:{keywords:["animal","bird"],char:"\u{1f54a}",fitzpatrick_scale:!1,category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],char:"\u{1f415}",fitzpatrick_scale:!1,category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],char:"\u{1f429}",fitzpatrick_scale:!1,category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],char:"\u{1f408}",fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],char:"\u{1f407}",fitzpatrick_scale:!1,category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],char:"\u{1f43f}",fitzpatrick_scale:!1,category:"animals_and_nature"},hedgehog:{keywords:["animal","nature","spiny"],char:"\u{1f994}",fitzpatrick_scale:!1,category:"animals_and_nature"},raccoon:{keywords:["animal","nature"],char:"\u{1f99d}",fitzpatrick_scale:!1,category:"animals_and_nature"},llama:{keywords:["animal","nature","alpaca"],char:"\u{1f999}",fitzpatrick_scale:!1,category:"animals_and_nature"},hippopotamus:{keywords:["animal","nature"],char:"\u{1f99b}",fitzpatrick_scale:!1,category:"animals_and_nature"},kangaroo:{keywords:["animal","nature","australia","joey","hop","marsupial"],char:"\u{1f998}",fitzpatrick_scale:!1,category:"animals_and_nature"},badger:{keywords:["animal","nature","honey"],char:"\u{1f9a1}",fitzpatrick_scale:!1,category:"animals_and_nature"},swan:{keywords:["animal","nature","bird"],char:"\u{1f9a2}",fitzpatrick_scale:!1,category:"animals_and_nature"},peacock:{keywords:["animal","nature","peahen","bird"],char:"\u{1f99a}",fitzpatrick_scale:!1,category:"animals_and_nature"},parrot:{keywords:["animal","nature","bird","pirate","talk"],char:"\u{1f99c}",fitzpatrick_scale:!1,category:"animals_and_nature"},lobster:{keywords:["animal","nature","bisque","claws","seafood"],char:"\u{1f99e}",fitzpatrick_scale:!1,category:"animals_and_nature"},mosquito:{keywords:["animal","nature","insect","malaria"],char:"\u{1f99f}",fitzpatrick_scale:!1,category:"animals_and_nature"},paw_prints:{keywords:["animal","tracking","footprints","dog","cat","pet","feet"],char:"\u{1f43e}",fitzpatrick_scale:!1,category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],char:"\u{1f409}",fitzpatrick_scale:!1,category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],char:"\u{1f432}",fitzpatrick_scale:!1,category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],char:"\u{1f335}",fitzpatrick_scale:!1,category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],char:"\u{1f384}",fitzpatrick_scale:!1,category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],char:"\u{1f332}",fitzpatrick_scale:!1,category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],char:"\u{1f333}",fitzpatrick_scale:!1,category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],char:"\u{1f334}",fitzpatrick_scale:!1,category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],char:"\u{1f331}",fitzpatrick_scale:!1,category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],char:"\u{1f33f}",fitzpatrick_scale:!1,category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],char:"\u2618",fitzpatrick_scale:!1,category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],char:"\u{1f340}",fitzpatrick_scale:!1,category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],char:"\u{1f38d}",fitzpatrick_scale:!1,category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],char:"\u{1f38b}",fitzpatrick_scale:!1,category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],char:"\u{1f343}",fitzpatrick_scale:!1,category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],char:"\u{1f342}",fitzpatrick_scale:!1,category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","ca","fall"],char:"\u{1f341}",fitzpatrick_scale:!1,category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],char:"\u{1f33e}",fitzpatrick_scale:!1,category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],char:"\u{1f33a}",fitzpatrick_scale:!1,category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],char:"\u{1f33b}",fitzpatrick_scale:!1,category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],char:"\u{1f339}",fitzpatrick_scale:!1,category:"animals_and_nature"},wilted_flower:{keywords:["plant","nature","flower"],char:"\u{1f940}",fitzpatrick_scale:!1,category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],char:"\u{1f337}",fitzpatrick_scale:!1,category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],char:"\u{1f33c}",fitzpatrick_scale:!1,category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],char:"\u{1f338}",fitzpatrick_scale:!1,category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],char:"\u{1f490}",fitzpatrick_scale:!1,category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],char:"\u{1f344}",fitzpatrick_scale:!1,category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],char:"\u{1f330}",fitzpatrick_scale:!1,category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],char:"\u{1f383}",fitzpatrick_scale:!1,category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],char:"\u{1f41a}",fitzpatrick_scale:!1,category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],char:"\u{1f578}",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],char:"\u{1f30e}",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],char:"\u{1f30d}",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],char:"\u{1f30f}",fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],char:"\u{1f315}",fitzpatrick_scale:!1,category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],char:"\u{1f316}",fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\u{1f317}",fitzpatrick_scale:!1,category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\u{1f318}",fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\u{1f311}",fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\u{1f312}",fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\u{1f313}",fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_gibbous_moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],char:"\u{1f314}",fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\u{1f31a}",fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\u{1f31d}",fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\u{1f31b}",fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\u{1f31c}",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],char:"\u{1f31e}",fitzpatrick_scale:!1,category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],char:"\u{1f319}",fitzpatrick_scale:!1,category:"animals_and_nature"},star:{keywords:["night","yellow"],char:"\u2b50",fitzpatrick_scale:!1,category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],char:"\u{1f31f}",fitzpatrick_scale:!1,category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],char:"\u{1f4ab}",fitzpatrick_scale:!1,category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],char:"\u2728",fitzpatrick_scale:!1,category:"animals_and_nature"},comet:{keywords:["space"],char:"\u2604",fitzpatrick_scale:!1,category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],char:"\u2600\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_small_cloud:{keywords:["weather"],char:"\u{1f324}",fitzpatrick_scale:!1,category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],char:"\u26c5",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_large_cloud:{keywords:["weather"],char:"\u{1f325}",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_rain_cloud:{keywords:["weather"],char:"\u{1f326}",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud:{keywords:["weather","sky"],char:"\u2601\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],char:"\u{1f327}",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning_and_rain:{keywords:["weather","lightning"],char:"\u26c8",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],char:"\u{1f329}",fitzpatrick_scale:!1,category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],char:"\u26a1",fitzpatrick_scale:!1,category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],char:"\u{1f525}",fitzpatrick_scale:!1,category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],char:"\u{1f4a5}",fitzpatrick_scale:!1,category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],char:"\u2744\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],char:"\u{1f328}",fitzpatrick_scale:!1,category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],char:"\u26c4",fitzpatrick_scale:!1,category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],char:"\u2603",fitzpatrick_scale:!1,category:"animals_and_nature"},wind_face:{keywords:["gust","air"],char:"\u{1f32c}",fitzpatrick_scale:!1,category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],char:"\u{1f4a8}",fitzpatrick_scale:!1,category:"animals_and_nature"},tornado:{keywords:["weather","cyclone","twister"],char:"\u{1f32a}",fitzpatrick_scale:!1,category:"animals_and_nature"},fog:{keywords:["weather"],char:"\u{1f32b}",fitzpatrick_scale:!1,category:"animals_and_nature"},open_umbrella:{keywords:["weather","spring"],char:"\u2602",fitzpatrick_scale:!1,category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],char:"\u2614",fitzpatrick_scale:!1,category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],char:"\u{1f4a7}",fitzpatrick_scale:!1,category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],char:"\u{1f4a6}",fitzpatrick_scale:!1,category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],char:"\u{1f30a}",fitzpatrick_scale:!1,category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],char:"\u{1f34f}",fitzpatrick_scale:!1,category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],char:"\u{1f34e}",fitzpatrick_scale:!1,category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],char:"\u{1f350}",fitzpatrick_scale:!1,category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],char:"\u{1f34a}",fitzpatrick_scale:!1,category:"food_and_drink"},lemon:{keywords:["fruit","nature"],char:"\u{1f34b}",fitzpatrick_scale:!1,category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],char:"\u{1f34c}",fitzpatrick_scale:!1,category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],char:"\u{1f349}",fitzpatrick_scale:!1,category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],char:"\u{1f347}",fitzpatrick_scale:!1,category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],char:"\u{1f353}",fitzpatrick_scale:!1,category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],char:"\u{1f348}",fitzpatrick_scale:!1,category:"food_and_drink"},cherries:{keywords:["food","fruit"],char:"\u{1f352}",fitzpatrick_scale:!1,category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],char:"\u{1f351}",fitzpatrick_scale:!1,category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],char:"\u{1f34d}",fitzpatrick_scale:!1,category:"food_and_drink"},coconut:{keywords:["fruit","nature","food","palm"],char:"\u{1f965}",fitzpatrick_scale:!1,category:"food_and_drink"},kiwi_fruit:{keywords:["fruit","food"],char:"\u{1f95d}",fitzpatrick_scale:!1,category:"food_and_drink"},mango:{keywords:["fruit","food","tropical"],char:"\u{1f96d}",fitzpatrick_scale:!1,category:"food_and_drink"},avocado:{keywords:["fruit","food"],char:"\u{1f951}",fitzpatrick_scale:!1,category:"food_and_drink"},broccoli:{keywords:["fruit","food","vegetable"],char:"\u{1f966}",fitzpatrick_scale:!1,category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],char:"\u{1f345}",fitzpatrick_scale:!1,category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],char:"\u{1f346}",fitzpatrick_scale:!1,category:"food_and_drink"},cucumber:{keywords:["fruit","food","pickle"],char:"\u{1f952}",fitzpatrick_scale:!1,category:"food_and_drink"},carrot:{keywords:["vegetable","food","orange"],char:"\u{1f955}",fitzpatrick_scale:!1,category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],char:"\u{1f336}",fitzpatrick_scale:!1,category:"food_and_drink"},potato:{keywords:["food","tuber","vegatable","starch"],char:"\u{1f954}",fitzpatrick_scale:!1,category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],char:"\u{1f33d}",fitzpatrick_scale:!1,category:"food_and_drink"},leafy_greens:{keywords:["food","vegetable","plant","bok choy","cabbage","kale","lettuce"],char:"\u{1f96c}",fitzpatrick_scale:!1,category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],char:"\u{1f360}",fitzpatrick_scale:!1,category:"food_and_drink"},peanuts:{keywords:["food","nut"],char:"\u{1f95c}",fitzpatrick_scale:!1,category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],char:"\u{1f36f}",fitzpatrick_scale:!1,category:"food_and_drink"},croissant:{keywords:["food","bread","french"],char:"\u{1f950}",fitzpatrick_scale:!1,category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],char:"\u{1f35e}",fitzpatrick_scale:!1,category:"food_and_drink"},baguette_bread:{keywords:["food","bread","french"],char:"\u{1f956}",fitzpatrick_scale:!1,category:"food_and_drink"},bagel:{keywords:["food","bread","bakery","schmear"],char:"\u{1f96f}",fitzpatrick_scale:!1,category:"food_and_drink"},pretzel:{keywords:["food","bread","twisted"],char:"\u{1f968}",fitzpatrick_scale:!1,category:"food_and_drink"},cheese:{keywords:["food","chadder"],char:"\u{1f9c0}",fitzpatrick_scale:!1,category:"food_and_drink"},egg:{keywords:["food","chicken","breakfast"],char:"\u{1f95a}",fitzpatrick_scale:!1,category:"food_and_drink"},bacon:{keywords:["food","breakfast","pork","pig","meat"],char:"\u{1f953}",fitzpatrick_scale:!1,category:"food_and_drink"},steak:{keywords:["food","cow","meat","cut","chop","lambchop","porkchop"],char:"\u{1f969}",fitzpatrick_scale:!1,category:"food_and_drink"},pancakes:{keywords:["food","breakfast","flapjacks","hotcakes"],char:"\u{1f95e}",fitzpatrick_scale:!1,category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],char:"\u{1f357}",fitzpatrick_scale:!1,category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],char:"\u{1f356}",fitzpatrick_scale:!1,category:"food_and_drink"},bone:{keywords:["skeleton"],char:"\u{1f9b4}",fitzpatrick_scale:!1,category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],char:"\u{1f364}",fitzpatrick_scale:!1,category:"food_and_drink"},fried_egg:{keywords:["food","breakfast","kitchen","egg"],char:"\u{1f373}",fitzpatrick_scale:!1,category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],char:"\u{1f354}",fitzpatrick_scale:!1,category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],char:"\u{1f35f}",fitzpatrick_scale:!1,category:"food_and_drink"},stuffed_flatbread:{keywords:["food","flatbread","stuffed","gyro"],char:"\u{1f959}",fitzpatrick_scale:!1,category:"food_and_drink"},hotdog:{keywords:["food","frankfurter"],char:"\u{1f32d}",fitzpatrick_scale:!1,category:"food_and_drink"},pizza:{keywords:["food","party"],char:"\u{1f355}",fitzpatrick_scale:!1,category:"food_and_drink"},sandwich:{keywords:["food","lunch","bread"],char:"\u{1f96a}",fitzpatrick_scale:!1,category:"food_and_drink"},canned_food:{keywords:["food","soup"],char:"\u{1f96b}",fitzpatrick_scale:!1,category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],char:"\u{1f35d}",fitzpatrick_scale:!1,category:"food_and_drink"},taco:{keywords:["food","mexican"],char:"\u{1f32e}",fitzpatrick_scale:!1,category:"food_and_drink"},burrito:{keywords:["food","mexican"],char:"\u{1f32f}",fitzpatrick_scale:!1,category:"food_and_drink"},green_salad:{keywords:["food","healthy","lettuce"],char:"\u{1f957}",fitzpatrick_scale:!1,category:"food_and_drink"},shallow_pan_of_food:{keywords:["food","cooking","casserole","paella"],char:"\u{1f958}",fitzpatrick_scale:!1,category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],char:"\u{1f35c}",fitzpatrick_scale:!1,category:"food_and_drink"},stew:{keywords:["food","meat","soup"],char:"\u{1f372}",fitzpatrick_scale:!1,category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"],char:"\u{1f365}",fitzpatrick_scale:!1,category:"food_and_drink"},fortune_cookie:{keywords:["food","prophecy"],char:"\u{1f960}",fitzpatrick_scale:!1,category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],char:"\u{1f363}",fitzpatrick_scale:!1,category:"food_and_drink"},bento:{keywords:["food","japanese","box"],char:"\u{1f371}",fitzpatrick_scale:!1,category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],char:"\u{1f35b}",fitzpatrick_scale:!1,category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],char:"\u{1f359}",fitzpatrick_scale:!1,category:"food_and_drink"},rice:{keywords:["food","china","asian"],char:"\u{1f35a}",fitzpatrick_scale:!1,category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],char:"\u{1f358}",fitzpatrick_scale:!1,category:"food_and_drink"},oden:{keywords:["food","japanese"],char:"\u{1f362}",fitzpatrick_scale:!1,category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],char:"\u{1f361}",fitzpatrick_scale:!1,category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],char:"\u{1f367}",fitzpatrick_scale:!1,category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],char:"\u{1f368}",fitzpatrick_scale:!1,category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],char:"\u{1f366}",fitzpatrick_scale:!1,category:"food_and_drink"},pie:{keywords:["food","dessert","pastry"],char:"\u{1f967}",fitzpatrick_scale:!1,category:"food_and_drink"},cake:{keywords:["food","dessert"],char:"\u{1f370}",fitzpatrick_scale:!1,category:"food_and_drink"},cupcake:{keywords:["food","dessert","bakery","sweet"],char:"\u{1f9c1}",fitzpatrick_scale:!1,category:"food_and_drink"},moon_cake:{keywords:["food","autumn"],char:"\u{1f96e}",fitzpatrick_scale:!1,category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],char:"\u{1f382}",fitzpatrick_scale:!1,category:"food_and_drink"},custard:{keywords:["dessert","food"],char:"\u{1f36e}",fitzpatrick_scale:!1,category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],char:"\u{1f36c}",fitzpatrick_scale:!1,category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],char:"\u{1f36d}",fitzpatrick_scale:!1,category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],char:"\u{1f36b}",fitzpatrick_scale:!1,category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],char:"\u{1f37f}",fitzpatrick_scale:!1,category:"food_and_drink"},dumpling:{keywords:["food","empanada","pierogi","potsticker"],char:"\u{1f95f}",fitzpatrick_scale:!1,category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],char:"\u{1f369}",fitzpatrick_scale:!1,category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],char:"\u{1f36a}",fitzpatrick_scale:!1,category:"food_and_drink"},milk_glass:{keywords:["beverage","drink","cow"],char:"\u{1f95b}",fitzpatrick_scale:!1,category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:"\u{1f37a}",fitzpatrick_scale:!1,category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:"\u{1f37b}",fitzpatrick_scale:!1,category:"food_and_drink"},clinking_glasses:{keywords:["beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"],char:"\u{1f942}",fitzpatrick_scale:!1,category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],char:"\u{1f377}",fitzpatrick_scale:!1,category:"food_and_drink"},tumbler_glass:{keywords:["drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"],char:"\u{1f943}",fitzpatrick_scale:!1,category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],char:"\u{1f378}",fitzpatrick_scale:!1,category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],char:"\u{1f379}",fitzpatrick_scale:!1,category:"food_and_drink"},champagne:{keywords:["drink","wine","bottle","celebration"],char:"\u{1f37e}",fitzpatrick_scale:!1,category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],char:"\u{1f376}",fitzpatrick_scale:!1,category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],char:"\u{1f375}",fitzpatrick_scale:!1,category:"food_and_drink"},cup_with_straw:{keywords:["drink","soda"],char:"\u{1f964}",fitzpatrick_scale:!1,category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],char:"\u2615",fitzpatrick_scale:!1,category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],char:"\u{1f37c}",fitzpatrick_scale:!1,category:"food_and_drink"},salt:{keywords:["condiment","shaker"],char:"\u{1f9c2}",fitzpatrick_scale:!1,category:"food_and_drink"},spoon:{keywords:["cutlery","kitchen","tableware"],char:"\u{1f944}",fitzpatrick_scale:!1,category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],char:"\u{1f374}",fitzpatrick_scale:!1,category:"food_and_drink"},plate_with_cutlery:{keywords:["food","eat","meal","lunch","dinner","restaurant"],char:"\u{1f37d}",fitzpatrick_scale:!1,category:"food_and_drink"},bowl_with_spoon:{keywords:["food","breakfast","cereal","oatmeal","porridge"],char:"\u{1f963}",fitzpatrick_scale:!1,category:"food_and_drink"},takeout_box:{keywords:["food","leftovers"],char:"\u{1f961}",fitzpatrick_scale:!1,category:"food_and_drink"},chopsticks:{keywords:["food"],char:"\u{1f962}",fitzpatrick_scale:!1,category:"food_and_drink"},soccer:{keywords:["sports","football"],char:"\u26bd",fitzpatrick_scale:!1,category:"activity"},basketball:{keywords:["sports","balls","NBA"],char:"\u{1f3c0}",fitzpatrick_scale:!1,category:"activity"},football:{keywords:["sports","balls","NFL"],char:"\u{1f3c8}",fitzpatrick_scale:!1,category:"activity"},baseball:{keywords:["sports","balls"],char:"\u26be",fitzpatrick_scale:!1,category:"activity"},softball:{keywords:["sports","balls"],char:"\u{1f94e}",fitzpatrick_scale:!1,category:"activity"},tennis:{keywords:["sports","balls","green"],char:"\u{1f3be}",fitzpatrick_scale:!1,category:"activity"},volleyball:{keywords:["sports","balls"],char:"\u{1f3d0}",fitzpatrick_scale:!1,category:"activity"},rugby_football:{keywords:["sports","team"],char:"\u{1f3c9}",fitzpatrick_scale:!1,category:"activity"},flying_disc:{keywords:["sports","frisbee","ultimate"],char:"\u{1f94f}",fitzpatrick_scale:!1,category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],char:"\u{1f3b1}",fitzpatrick_scale:!1,category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],char:"\u26f3",fitzpatrick_scale:!1,category:"activity"},golfing_woman:{keywords:["sports","business","woman","female"],char:"\u{1f3cc}\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"activity"},golfing_man:{keywords:["sports","business"],char:"\u{1f3cc}",fitzpatrick_scale:!0,category:"activity"},ping_pong:{keywords:["sports","pingpong"],char:"\u{1f3d3}",fitzpatrick_scale:!1,category:"activity"},badminton:{keywords:["sports"],char:"\u{1f3f8}",fitzpatrick_scale:!1,category:"activity"},goal_net:{keywords:["sports"],char:"\u{1f945}",fitzpatrick_scale:!1,category:"activity"},ice_hockey:{keywords:["sports"],char:"\u{1f3d2}",fitzpatrick_scale:!1,category:"activity"},field_hockey:{keywords:["sports"],char:"\u{1f3d1}",fitzpatrick_scale:!1,category:"activity"},lacrosse:{keywords:["sports","ball","stick"],char:"\u{1f94d}",fitzpatrick_scale:!1,category:"activity"},cricket:{keywords:["sports"],char:"\u{1f3cf}",fitzpatrick_scale:!1,category:"activity"},ski:{keywords:["sports","winter","cold","snow"],char:"\u{1f3bf}",fitzpatrick_scale:!1,category:"activity"},skier:{keywords:["sports","winter","snow"],char:"\u26f7",fitzpatrick_scale:!1,category:"activity"},snowboarder:{keywords:["sports","winter"],char:"\u{1f3c2}",fitzpatrick_scale:!0,category:"activity"},person_fencing:{keywords:["sports","fencing","sword"],char:"\u{1f93a}",fitzpatrick_scale:!1,category:"activity"},women_wrestling:{keywords:["sports","wrestlers"],char:"\u{1f93c}\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"activity"},men_wrestling:{keywords:["sports","wrestlers"],char:"\u{1f93c}\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"activity"},woman_cartwheeling:{keywords:["gymnastics"],char:"\u{1f938}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_cartwheeling:{keywords:["gymnastics"],char:"\u{1f938}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},woman_playing_handball:{keywords:["sports"],char:"\u{1f93e}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_playing_handball:{keywords:["sports"],char:"\u{1f93e}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},ice_skate:{keywords:["sports"],char:"\u26f8",fitzpatrick_scale:!1,category:"activity"},curling_stone:{keywords:["sports"],char:"\u{1f94c}",fitzpatrick_scale:!1,category:"activity"},skateboard:{keywords:["board"],char:"\u{1f6f9}",fitzpatrick_scale:!1,category:"activity"},sled:{keywords:["sleigh","luge","toboggan"],char:"\u{1f6f7}",fitzpatrick_scale:!1,category:"activity"},bow_and_arrow:{keywords:["sports"],char:"\u{1f3f9}",fitzpatrick_scale:!1,category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],char:"\u{1f3a3}",fitzpatrick_scale:!1,category:"activity"},boxing_glove:{keywords:["sports","fighting"],char:"\u{1f94a}",fitzpatrick_scale:!1,category:"activity"},martial_arts_uniform:{keywords:["judo","karate","taekwondo"],char:"\u{1f94b}",fitzpatrick_scale:!1,category:"activity"},rowing_woman:{keywords:["sports","hobby","water","ship","woman","female"],char:"\u{1f6a3}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},rowing_man:{keywords:["sports","hobby","water","ship"],char:"\u{1f6a3}",fitzpatrick_scale:!0,category:"activity"},climbing_woman:{keywords:["sports","hobby","woman","female","rock"],char:"\u{1f9d7}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},climbing_man:{keywords:["sports","hobby","man","male","rock"],char:"\u{1f9d7}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},swimming_woman:{keywords:["sports","exercise","human","athlete","water","summer","woman","female"],char:"\u{1f3ca}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},swimming_man:{keywords:["sports","exercise","human","athlete","water","summer"],char:"\u{1f3ca}",fitzpatrick_scale:!0,category:"activity"},woman_playing_water_polo:{keywords:["sports","pool"],char:"\u{1f93d}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_playing_water_polo:{keywords:["sports","pool"],char:"\u{1f93d}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},woman_in_lotus_position:{keywords:["woman","female","meditation","yoga","serenity","zen","mindfulness"],char:"\u{1f9d8}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_in_lotus_position:{keywords:["man","male","meditation","yoga","serenity","zen","mindfulness"],char:"\u{1f9d8}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},surfing_woman:{keywords:["sports","ocean","sea","summer","beach","woman","female"],char:"\u{1f3c4}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},surfing_man:{keywords:["sports","ocean","sea","summer","beach"],char:"\u{1f3c4}",fitzpatrick_scale:!0,category:"activity"},bath:{keywords:["clean","shower","bathroom"],char:"\u{1f6c0}",fitzpatrick_scale:!0,category:"activity"},basketball_woman:{keywords:["sports","human","woman","female"],char:"\u26f9\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},basketball_man:{keywords:["sports","human"],char:"\u26f9",fitzpatrick_scale:!0,category:"activity"},weight_lifting_woman:{keywords:["sports","training","exercise","woman","female"],char:"\u{1f3cb}\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},weight_lifting_man:{keywords:["sports","training","exercise"],char:"\u{1f3cb}",fitzpatrick_scale:!0,category:"activity"},biking_woman:{keywords:["sports","bike","exercise","hipster","woman","female"],char:"\u{1f6b4}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},biking_man:{keywords:["sports","bike","exercise","hipster"],char:"\u{1f6b4}",fitzpatrick_scale:!0,category:"activity"},mountain_biking_woman:{keywords:["transportation","sports","human","race","bike","woman","female"],char:"\u{1f6b5}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},mountain_biking_man:{keywords:["transportation","sports","human","race","bike"],char:"\u{1f6b5}",fitzpatrick_scale:!0,category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],char:"\u{1f3c7}",fitzpatrick_scale:!0,category:"activity"},business_suit_levitating:{keywords:["suit","business","levitate","hover","jump"],char:"\u{1f574}",fitzpatrick_scale:!0,category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],char:"\u{1f3c6}",fitzpatrick_scale:!1,category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],char:"\u{1f3bd}",fitzpatrick_scale:!1,category:"activity"},medal_sports:{keywords:["award","winning"],char:"\u{1f3c5}",fitzpatrick_scale:!1,category:"activity"},medal_military:{keywords:["award","winning","army"],char:"\u{1f396}",fitzpatrick_scale:!1,category:"activity"},"1st_place_medal":{keywords:["award","winning","first"],char:"\u{1f947}",fitzpatrick_scale:!1,category:"activity"},"2nd_place_medal":{keywords:["award","second"],char:"\u{1f948}",fitzpatrick_scale:!1,category:"activity"},"3rd_place_medal":{keywords:["award","third"],char:"\u{1f949}",fitzpatrick_scale:!1,category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],char:"\u{1f397}",fitzpatrick_scale:!1,category:"activity"},rosette:{keywords:["flower","decoration","military"],char:"\u{1f3f5}",fitzpatrick_scale:!1,category:"activity"},ticket:{keywords:["event","concert","pass"],char:"\u{1f3ab}",fitzpatrick_scale:!1,category:"activity"},tickets:{keywords:["sports","concert","entrance"],char:"\u{1f39f}",fitzpatrick_scale:!1,category:"activity"},performing_arts:{keywords:["acting","theater","drama"],char:"\u{1f3ad}",fitzpatrick_scale:!1,category:"activity"},art:{keywords:["design","paint","draw","colors"],char:"\u{1f3a8}",fitzpatrick_scale:!1,category:"activity"},circus_tent:{keywords:["festival","carnival","party"],char:"\u{1f3aa}",fitzpatrick_scale:!1,category:"activity"},woman_juggling:{keywords:["juggle","balance","skill","multitask"],char:"\u{1f939}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_juggling:{keywords:["juggle","balance","skill","multitask"],char:"\u{1f939}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},microphone:{keywords:["sound","music","PA","sing","talkshow"],char:"\u{1f3a4}",fitzpatrick_scale:!1,category:"activity"},headphones:{keywords:["music","score","gadgets"],char:"\u{1f3a7}",fitzpatrick_scale:!1,category:"activity"},musical_score:{keywords:["treble","clef","compose"],char:"\u{1f3bc}",fitzpatrick_scale:!1,category:"activity"},musical_keyboard:{keywords:["piano","instrument","compose"],char:"\u{1f3b9}",fitzpatrick_scale:!1,category:"activity"},drum:{keywords:["music","instrument","drumsticks","snare"],char:"\u{1f941}",fitzpatrick_scale:!1,category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],char:"\u{1f3b7}",fitzpatrick_scale:!1,category:"activity"},trumpet:{keywords:["music","brass"],char:"\u{1f3ba}",fitzpatrick_scale:!1,category:"activity"},guitar:{keywords:["music","instrument"],char:"\u{1f3b8}",fitzpatrick_scale:!1,category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],char:"\u{1f3bb}",fitzpatrick_scale:!1,category:"activity"},clapper:{keywords:["movie","film","record"],char:"\u{1f3ac}",fitzpatrick_scale:!1,category:"activity"},video_game:{keywords:["play","console","PS4","controller"],char:"\u{1f3ae}",fitzpatrick_scale:!1,category:"activity"},space_invader:{keywords:["game","arcade","play"],char:"\u{1f47e}",fitzpatrick_scale:!1,category:"activity"},dart:{keywords:["game","play","bar","target","bullseye"],char:"\u{1f3af}",fitzpatrick_scale:!1,category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],char:"\u{1f3b2}",fitzpatrick_scale:!1,category:"activity"},chess_pawn:{keywords:["expendable"],char:"\u265f",fitzpatrick_scale:!1,category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],char:"\u{1f3b0}",fitzpatrick_scale:!1,category:"activity"},jigsaw:{keywords:["interlocking","puzzle","piece"],char:"\u{1f9e9}",fitzpatrick_scale:!1,category:"activity"},bowling:{keywords:["sports","fun","play"],char:"\u{1f3b3}",fitzpatrick_scale:!1,category:"activity"},red_car:{keywords:["red","transportation","vehicle"],char:"\u{1f697}",fitzpatrick_scale:!1,category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],char:"\u{1f695}",fitzpatrick_scale:!1,category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],char:"\u{1f699}",fitzpatrick_scale:!1,category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],char:"\u{1f68c}",fitzpatrick_scale:!1,category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],char:"\u{1f68e}",fitzpatrick_scale:!1,category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],char:"\u{1f3ce}",fitzpatrick_scale:!1,category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],char:"\u{1f693}",fitzpatrick_scale:!1,category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],char:"\u{1f691}",fitzpatrick_scale:!1,category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],char:"\u{1f692}",fitzpatrick_scale:!1,category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],char:"\u{1f690}",fitzpatrick_scale:!1,category:"travel_and_places"},truck:{keywords:["cars","transportation"],char:"\u{1f69a}",fitzpatrick_scale:!1,category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],char:"\u{1f69b}",fitzpatrick_scale:!1,category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],char:"\u{1f69c}",fitzpatrick_scale:!1,category:"travel_and_places"},kick_scooter:{keywords:["vehicle","kick","razor"],char:"\u{1f6f4}",fitzpatrick_scale:!1,category:"travel_and_places"},motorcycle:{keywords:["race","sports","fast"],char:"\u{1f3cd}",fitzpatrick_scale:!1,category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],char:"\u{1f6b2}",fitzpatrick_scale:!1,category:"travel_and_places"},motor_scooter:{keywords:["vehicle","vespa","sasha"],char:"\u{1f6f5}",fitzpatrick_scale:!1,category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],char:"\u{1f6a8}",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],char:"\u{1f694}",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],char:"\u{1f68d}",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],char:"\u{1f698}",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],char:"\u{1f696}",fitzpatrick_scale:!1,category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],char:"\u{1f6a1}",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],char:"\u{1f6a0}",fitzpatrick_scale:!1,category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],char:"\u{1f69f}",fitzpatrick_scale:!1,category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],char:"\u{1f683}",fitzpatrick_scale:!1,category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],char:"\u{1f68b}",fitzpatrick_scale:!1,category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],char:"\u{1f69d}",fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],char:"\u{1f684}",fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],char:"\u{1f685}",fitzpatrick_scale:!1,category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],char:"\u{1f688}",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],char:"\u{1f69e}",fitzpatrick_scale:!1,category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],char:"\u{1f682}",fitzpatrick_scale:!1,category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],char:"\u{1f686}",fitzpatrick_scale:!1,category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],char:"\u{1f687}",fitzpatrick_scale:!1,category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],char:"\u{1f68a}",fitzpatrick_scale:!1,category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],char:"\u{1f689}",fitzpatrick_scale:!1,category:"travel_and_places"},flying_saucer:{keywords:["transportation","vehicle","ufo"],char:"\u{1f6f8}",fitzpatrick_scale:!1,category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],char:"\u{1f681}",fitzpatrick_scale:!1,category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],char:"\u{1f6e9}",fitzpatrick_scale:!1,category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],char:"\u2708\ufe0f",fitzpatrick_scale:!1,category:"travel_and_places"},flight_departure:{keywords:["airport","flight","landing"],char:"\u{1f6eb}",fitzpatrick_scale:!1,category:"travel_and_places"},flight_arrival:{keywords:["airport","flight","boarding"],char:"\u{1f6ec}",fitzpatrick_scale:!1,category:"travel_and_places"},sailboat:{keywords:["ship","summer","transportation","water","sailing"],char:"\u26f5",fitzpatrick_scale:!1,category:"travel_and_places"},motor_boat:{keywords:["ship"],char:"\u{1f6e5}",fitzpatrick_scale:!1,category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],char:"\u{1f6a4}",fitzpatrick_scale:!1,category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],char:"\u26f4",fitzpatrick_scale:!1,category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],char:"\u{1f6f3}",fitzpatrick_scale:!1,category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],char:"\u{1f680}",fitzpatrick_scale:!1,category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],char:"\u{1f6f0}",fitzpatrick_scale:!1,category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],char:"\u{1f4ba}",fitzpatrick_scale:!1,category:"travel_and_places"},canoe:{keywords:["boat","paddle","water","ship"],char:"\u{1f6f6}",fitzpatrick_scale:!1,category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],char:"\u2693",fitzpatrick_scale:!1,category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],char:"\u{1f6a7}",fitzpatrick_scale:!1,category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],char:"\u26fd",fitzpatrick_scale:!1,category:"travel_and_places"},busstop:{keywords:["transportation","wait"],char:"\u{1f68f}",fitzpatrick_scale:!1,category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],char:"\u{1f6a6}",fitzpatrick_scale:!1,category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],char:"\u{1f6a5}",fitzpatrick_scale:!1,category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],char:"\u{1f3c1}",fitzpatrick_scale:!1,category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],char:"\u{1f6a2}",fitzpatrick_scale:!1,category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],char:"\u{1f3a1}",fitzpatrick_scale:!1,category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],char:"\u{1f3a2}",fitzpatrick_scale:!1,category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],char:"\u{1f3a0}",fitzpatrick_scale:!1,category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],char:"\u{1f3d7}",fitzpatrick_scale:!1,category:"travel_and_places"},foggy:{keywords:["photo","mountain"],char:"\u{1f301}",fitzpatrick_scale:!1,category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],char:"\u{1f5fc}",fitzpatrick_scale:!1,category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],char:"\u{1f3ed}",fitzpatrick_scale:!1,category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],char:"\u26f2",fitzpatrick_scale:!1,category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],char:"\u{1f391}",fitzpatrick_scale:!1,category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],char:"\u26f0",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_snow:{keywords:["photo","nature","environment","winter","cold"],char:"\u{1f3d4}",fitzpatrick_scale:!1,category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],char:"\u{1f5fb}",fitzpatrick_scale:!1,category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],char:"\u{1f30b}",fitzpatrick_scale:!1,category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],char:"\u{1f5fe}",fitzpatrick_scale:!1,category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],char:"\u{1f3d5}",fitzpatrick_scale:!1,category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],char:"\u26fa",fitzpatrick_scale:!1,category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],char:"\u{1f3de}",fitzpatrick_scale:!1,category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],char:"\u{1f6e3}",fitzpatrick_scale:!1,category:"travel_and_places"},railway_track:{keywords:["train","transportation"],char:"\u{1f6e4}",fitzpatrick_scale:!1,category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],char:"\u{1f305}",fitzpatrick_scale:!1,category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],char:"\u{1f304}",fitzpatrick_scale:!1,category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],char:"\u{1f3dc}",fitzpatrick_scale:!1,category:"travel_and_places"},beach_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],char:"\u{1f3d6}",fitzpatrick_scale:!1,category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],char:"\u{1f3dd}",fitzpatrick_scale:!1,category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],char:"\u{1f307}",fitzpatrick_scale:!1,category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],char:"\u{1f306}",fitzpatrick_scale:!1,category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],char:"\u{1f3d9}",fitzpatrick_scale:!1,category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],char:"\u{1f303}",fitzpatrick_scale:!1,category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],char:"\u{1f309}",fitzpatrick_scale:!1,category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],char:"\u{1f30c}",fitzpatrick_scale:!1,category:"travel_and_places"},stars:{keywords:["night","photo"],char:"\u{1f320}",fitzpatrick_scale:!1,category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],char:"\u{1f387}",fitzpatrick_scale:!1,category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],char:"\u{1f386}",fitzpatrick_scale:!1,category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn_face","photo","sky","spring"],char:"\u{1f308}",fitzpatrick_scale:!1,category:"travel_and_places"},houses:{keywords:["buildings","photo"],char:"\u{1f3d8}",fitzpatrick_scale:!1,category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],char:"\u{1f3f0}",fitzpatrick_scale:!1,category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],char:"\u{1f3ef}",fitzpatrick_scale:!1,category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],char:"\u{1f3df}",fitzpatrick_scale:!1,category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],char:"\u{1f5fd}",fitzpatrick_scale:!1,category:"travel_and_places"},house:{keywords:["building","home"],char:"\u{1f3e0}",fitzpatrick_scale:!1,category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],char:"\u{1f3e1}",fitzpatrick_scale:!1,category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],char:"\u{1f3da}",fitzpatrick_scale:!1,category:"travel_and_places"},office:{keywords:["building","bureau","work"],char:"\u{1f3e2}",fitzpatrick_scale:!1,category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],char:"\u{1f3ec}",fitzpatrick_scale:!1,category:"travel_and_places"},post_office:{keywords:["building","envelope","communication"],char:"\u{1f3e3}",fitzpatrick_scale:!1,category:"travel_and_places"},european_post_office:{keywords:["building","email"],char:"\u{1f3e4}",fitzpatrick_scale:!1,category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],char:"\u{1f3e5}",fitzpatrick_scale:!1,category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],char:"\u{1f3e6}",fitzpatrick_scale:!1,category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],char:"\u{1f3e8}",fitzpatrick_scale:!1,category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],char:"\u{1f3ea}",fitzpatrick_scale:!1,category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],char:"\u{1f3eb}",fitzpatrick_scale:!1,category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],char:"\u{1f3e9}",fitzpatrick_scale:!1,category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],char:"\u{1f492}",fitzpatrick_scale:!1,category:"travel_and_places"},classical_building:{keywords:["art","culture","history"],char:"\u{1f3db}",fitzpatrick_scale:!1,category:"travel_and_places"},church:{keywords:["building","religion","christ"],char:"\u26ea",fitzpatrick_scale:!1,category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],char:"\u{1f54c}",fitzpatrick_scale:!1,category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],char:"\u{1f54d}",fitzpatrick_scale:!1,category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],char:"\u{1f54b}",fitzpatrick_scale:!1,category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],char:"\u26e9",fitzpatrick_scale:!1,category:"travel_and_places"},watch:{keywords:["time","accessories"],char:"\u231a",fitzpatrick_scale:!1,category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],char:"\u{1f4f1}",fitzpatrick_scale:!1,category:"objects"},calling:{keywords:["iphone","incoming"],char:"\u{1f4f2}",fitzpatrick_scale:!1,category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],char:"\u{1f4bb}",fitzpatrick_scale:!1,category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],char:"\u2328",fitzpatrick_scale:!1,category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],char:"\u{1f5a5}",fitzpatrick_scale:!1,category:"objects"},printer:{keywords:["paper","ink"],char:"\u{1f5a8}",fitzpatrick_scale:!1,category:"objects"},computer_mouse:{keywords:["click"],char:"\u{1f5b1}",fitzpatrick_scale:!1,category:"objects"},trackball:{keywords:["technology","trackpad"],char:"\u{1f5b2}",fitzpatrick_scale:!1,category:"objects"},joystick:{keywords:["game","play"],char:"\u{1f579}",fitzpatrick_scale:!1,category:"objects"},clamp:{keywords:["tool"],char:"\u{1f5dc}",fitzpatrick_scale:!1,category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],char:"\u{1f4bd}",fitzpatrick_scale:!1,category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],char:"\u{1f4be}",fitzpatrick_scale:!1,category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],char:"\u{1f4bf}",fitzpatrick_scale:!1,category:"objects"},dvd:{keywords:["cd","disk","disc"],char:"\u{1f4c0}",fitzpatrick_scale:!1,category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],char:"\u{1f4fc}",fitzpatrick_scale:!1,category:"objects"},camera:{keywords:["gadgets","photography"],char:"\u{1f4f7}",fitzpatrick_scale:!1,category:"objects"},camera_flash:{keywords:["photography","gadgets"],char:"\u{1f4f8}",fitzpatrick_scale:!1,category:"objects"},video_camera:{keywords:["film","record"],char:"\u{1f4f9}",fitzpatrick_scale:!1,category:"objects"},movie_camera:{keywords:["film","record"],char:"\u{1f3a5}",fitzpatrick_scale:!1,category:"objects"},film_projector:{keywords:["video","tape","record","movie"],char:"\u{1f4fd}",fitzpatrick_scale:!1,category:"objects"},film_strip:{keywords:["movie"],char:"\u{1f39e}",fitzpatrick_scale:!1,category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],char:"\u{1f4de}",fitzpatrick_scale:!1,category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],char:"\u260e\ufe0f",fitzpatrick_scale:!1,category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],char:"\u{1f4df}",fitzpatrick_scale:!1,category:"objects"},fax:{keywords:["communication","technology"],char:"\u{1f4e0}",fitzpatrick_scale:!1,category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],char:"\u{1f4fa}",fitzpatrick_scale:!1,category:"objects"},radio:{keywords:["communication","music","podcast","program"],char:"\u{1f4fb}",fitzpatrick_scale:!1,category:"objects"},studio_microphone:{keywords:["sing","recording","artist","talkshow"],char:"\u{1f399}",fitzpatrick_scale:!1,category:"objects"},level_slider:{keywords:["scale"],char:"\u{1f39a}",fitzpatrick_scale:!1,category:"objects"},control_knobs:{keywords:["dial"],char:"\u{1f39b}",fitzpatrick_scale:!1,category:"objects"},compass:{keywords:["magnetic","navigation","orienteering"],char:"\u{1f9ed}",fitzpatrick_scale:!1,category:"objects"},stopwatch:{keywords:["time","deadline"],char:"\u23f1",fitzpatrick_scale:!1,category:"objects"},timer_clock:{keywords:["alarm"],char:"\u23f2",fitzpatrick_scale:!1,category:"objects"},alarm_clock:{keywords:["time","wake"],char:"\u23f0",fitzpatrick_scale:!1,category:"objects"},mantelpiece_clock:{keywords:["time"],char:"\u{1f570}",fitzpatrick_scale:!1,category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],char:"\u23f3",fitzpatrick_scale:!1,category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],char:"\u231b",fitzpatrick_scale:!1,category:"objects"},satellite:{keywords:["communication","future","radio","space"],char:"\u{1f4e1}",fitzpatrick_scale:!1,category:"objects"},battery:{keywords:["power","energy","sustain"],char:"\u{1f50b}",fitzpatrick_scale:!1,category:"objects"},electric_plug:{keywords:["charger","power"],char:"\u{1f50c}",fitzpatrick_scale:!1,category:"objects"},bulb:{keywords:["light","electricity","idea"],char:"\u{1f4a1}",fitzpatrick_scale:!1,category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],char:"\u{1f526}",fitzpatrick_scale:!1,category:"objects"},candle:{keywords:["fire","wax"],char:"\u{1f56f}",fitzpatrick_scale:!1,category:"objects"},fire_extinguisher:{keywords:["quench"],char:"\u{1f9ef}",fitzpatrick_scale:!1,category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],char:"\u{1f5d1}",fitzpatrick_scale:!1,category:"objects"},oil_drum:{keywords:["barrell"],char:"\u{1f6e2}",fitzpatrick_scale:!1,category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],char:"\u{1f4b8}",fitzpatrick_scale:!1,category:"objects"},dollar:{keywords:["money","sales","bill","currency"],char:"\u{1f4b5}",fitzpatrick_scale:!1,category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],char:"\u{1f4b4}",fitzpatrick_scale:!1,category:"objects"},euro:{keywords:["money","sales","dollar","currency"],char:"\u{1f4b6}",fitzpatrick_scale:!1,category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],char:"\u{1f4b7}",fitzpatrick_scale:!1,category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],char:"\u{1f4b0}",fitzpatrick_scale:!1,category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],char:"\u{1f4b3}",fitzpatrick_scale:!1,category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],char:"\u{1f48e}",fitzpatrick_scale:!1,category:"objects"},balance_scale:{keywords:["law","fairness","weight"],char:"\u2696",fitzpatrick_scale:!1,category:"objects"},toolbox:{keywords:["tools","diy","fix","maintainer","mechanic"],char:"\u{1f9f0}",fitzpatrick_scale:!1,category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],char:"\u{1f527}",fitzpatrick_scale:!1,category:"objects"},hammer:{keywords:["tools","build","create"],char:"\u{1f528}",fitzpatrick_scale:!1,category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],char:"\u2692",fitzpatrick_scale:!1,category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],char:"\u{1f6e0}",fitzpatrick_scale:!1,category:"objects"},pick:{keywords:["tools","dig"],char:"\u26cf",fitzpatrick_scale:!1,category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],char:"\u{1f529}",fitzpatrick_scale:!1,category:"objects"},gear:{keywords:["cog"],char:"\u2699",fitzpatrick_scale:!1,category:"objects"},brick:{keywords:["bricks"],char:"\u{1f9f1}",fitzpatrick_scale:!1,category:"objects"},chains:{keywords:["lock","arrest"],char:"\u26d3",fitzpatrick_scale:!1,category:"objects"},magnet:{keywords:["attraction","magnetic"],char:"\u{1f9f2}",fitzpatrick_scale:!1,category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],char:"\u{1f52b}",fitzpatrick_scale:!1,category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],char:"\u{1f4a3}",fitzpatrick_scale:!1,category:"objects"},firecracker:{keywords:["dynamite","boom","explode","explosion","explosive"],char:"\u{1f9e8}",fitzpatrick_scale:!1,category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],char:"\u{1f52a}",fitzpatrick_scale:!1,category:"objects"},dagger:{keywords:["weapon"],char:"\u{1f5e1}",fitzpatrick_scale:!1,category:"objects"},crossed_swords:{keywords:["weapon"],char:"\u2694",fitzpatrick_scale:!1,category:"objects"},shield:{keywords:["protection","security"],char:"\u{1f6e1}",fitzpatrick_scale:!1,category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],char:"\u{1f6ac}",fitzpatrick_scale:!1,category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary","death","pirate","evil"],char:"\u2620",fitzpatrick_scale:!1,category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],char:"\u26b0",fitzpatrick_scale:!1,category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],char:"\u26b1",fitzpatrick_scale:!1,category:"objects"},amphora:{keywords:["vase","jar"],char:"\u{1f3fa}",fitzpatrick_scale:!1,category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],char:"\u{1f52e}",fitzpatrick_scale:!1,category:"objects"},prayer_beads:{keywords:["dhikr","religious"],char:"\u{1f4ff}",fitzpatrick_scale:!1,category:"objects"},nazar_amulet:{keywords:["bead","charm"],char:"\u{1f9ff}",fitzpatrick_scale:!1,category:"objects"},barber:{keywords:["hair","salon","style"],char:"\u{1f488}",fitzpatrick_scale:!1,category:"objects"},alembic:{keywords:["distilling","science","experiment","chemistry"],char:"\u2697",fitzpatrick_scale:!1,category:"objects"},telescope:{keywords:["stars","space","zoom","science","astronomy"],char:"\u{1f52d}",fitzpatrick_scale:!1,category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],char:"\u{1f52c}",fitzpatrick_scale:!1,category:"objects"},hole:{keywords:["embarrassing"],char:"\u{1f573}",fitzpatrick_scale:!1,category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],char:"\u{1f48a}",fitzpatrick_scale:!1,category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],char:"\u{1f489}",fitzpatrick_scale:!1,category:"objects"},dna:{keywords:["biologist","genetics","life"],char:"\u{1f9ec}",fitzpatrick_scale:!1,category:"objects"},microbe:{keywords:["amoeba","bacteria","germs"],char:"\u{1f9a0}",fitzpatrick_scale:!1,category:"objects"},petri_dish:{keywords:["bacteria","biology","culture","lab"],char:"\u{1f9eb}",fitzpatrick_scale:!1,category:"objects"},test_tube:{keywords:["chemistry","experiment","lab","science"],char:"\u{1f9ea}",fitzpatrick_scale:!1,category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],char:"\u{1f321}",fitzpatrick_scale:!1,category:"objects"},broom:{keywords:["cleaning","sweeping","witch"],char:"\u{1f9f9}",fitzpatrick_scale:!1,category:"objects"},basket:{keywords:["laundry"],char:"\u{1f9fa}",fitzpatrick_scale:!1,category:"objects"},toilet_paper:{keywords:["roll"],char:"\u{1f9fb}",fitzpatrick_scale:!1,category:"objects"},label:{keywords:["sale","tag"],char:"\u{1f3f7}",fitzpatrick_scale:!1,category:"objects"},bookmark:{keywords:["favorite","label","save"],char:"\u{1f516}",fitzpatrick_scale:!1,category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],char:"\u{1f6bd}",fitzpatrick_scale:!1,category:"objects"},shower:{keywords:["clean","water","bathroom"],char:"\u{1f6bf}",fitzpatrick_scale:!1,category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],char:"\u{1f6c1}",fitzpatrick_scale:!1,category:"objects"},soap:{keywords:["bar","bathing","cleaning","lather"],char:"\u{1f9fc}",fitzpatrick_scale:!1,category:"objects"},sponge:{keywords:["absorbing","cleaning","porous"],char:"\u{1f9fd}",fitzpatrick_scale:!1,category:"objects"},lotion_bottle:{keywords:["moisturizer","sunscreen"],char:"\u{1f9f4}",fitzpatrick_scale:!1,category:"objects"},key:{keywords:["lock","door","password"],char:"\u{1f511}",fitzpatrick_scale:!1,category:"objects"},old_key:{keywords:["lock","door","password"],char:"\u{1f5dd}",fitzpatrick_scale:!1,category:"objects"},couch_and_lamp:{keywords:["read","chill"],char:"\u{1f6cb}",fitzpatrick_scale:!1,category:"objects"},sleeping_bed:{keywords:["bed","rest"],char:"\u{1f6cc}",fitzpatrick_scale:!0,category:"objects"},bed:{keywords:["sleep","rest"],char:"\u{1f6cf}",fitzpatrick_scale:!1,category:"objects"},door:{keywords:["house","entry","exit"],char:"\u{1f6aa}",fitzpatrick_scale:!1,category:"objects"},bellhop_bell:{keywords:["service"],char:"\u{1f6ce}",fitzpatrick_scale:!1,category:"objects"},teddy_bear:{keywords:["plush","stuffed"],char:"\u{1f9f8}",fitzpatrick_scale:!1,category:"objects"},framed_picture:{keywords:["photography"],char:"\u{1f5bc}",fitzpatrick_scale:!1,category:"objects"},world_map:{keywords:["location","direction"],char:"\u{1f5fa}",fitzpatrick_scale:!1,category:"objects"},parasol_on_ground:{keywords:["weather","summer"],char:"\u26f1",fitzpatrick_scale:!1,category:"objects"},moyai:{keywords:["rock","easter island","moai"],char:"\u{1f5ff}",fitzpatrick_scale:!1,category:"objects"},shopping:{keywords:["mall","buy","purchase"],char:"\u{1f6cd}",fitzpatrick_scale:!1,category:"objects"},shopping_cart:{keywords:["trolley"],char:"\u{1f6d2}",fitzpatrick_scale:!1,category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],char:"\u{1f388}",fitzpatrick_scale:!1,category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],char:"\u{1f38f}",fitzpatrick_scale:!1,category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],char:"\u{1f380}",fitzpatrick_scale:!1,category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],char:"\u{1f381}",fitzpatrick_scale:!1,category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],char:"\u{1f38a}",fitzpatrick_scale:!1,category:"objects"},tada:{keywords:["party","congratulations","birthday","magic","circus","celebration"],char:"\u{1f389}",fitzpatrick_scale:!1,category:"objects"},dolls:{keywords:["japanese","toy","kimono"],char:"\u{1f38e}",fitzpatrick_scale:!1,category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],char:"\u{1f390}",fitzpatrick_scale:!1,category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],char:"\u{1f38c}",fitzpatrick_scale:!1,category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],char:"\u{1f3ee}",fitzpatrick_scale:!1,category:"objects"},red_envelope:{keywords:["gift"],char:"\u{1f9e7}",fitzpatrick_scale:!1,category:"objects"},email:{keywords:["letter","postal","inbox","communication"],char:"\u2709\ufe0f",fitzpatrick_scale:!1,category:"objects"},envelope_with_arrow:{keywords:["email","communication"],char:"\u{1f4e9}",fitzpatrick_scale:!1,category:"objects"},incoming_envelope:{keywords:["email","inbox"],char:"\u{1f4e8}",fitzpatrick_scale:!1,category:"objects"},"e-mail":{keywords:["communication","inbox"],char:"\u{1f4e7}",fitzpatrick_scale:!1,category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],char:"\u{1f48c}",fitzpatrick_scale:!1,category:"objects"},postbox:{keywords:["email","letter","envelope"],char:"\u{1f4ee}",fitzpatrick_scale:!1,category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],char:"\u{1f4ea}",fitzpatrick_scale:!1,category:"objects"},mailbox:{keywords:["email","inbox","communication"],char:"\u{1f4eb}",fitzpatrick_scale:!1,category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],char:"\u{1f4ec}",fitzpatrick_scale:!1,category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],char:"\u{1f4ed}",fitzpatrick_scale:!1,category:"objects"},package:{keywords:["mail","gift","cardboard","box","moving"],char:"\u{1f4e6}",fitzpatrick_scale:!1,category:"objects"},postal_horn:{keywords:["instrument","music"],char:"\u{1f4ef}",fitzpatrick_scale:!1,category:"objects"},inbox_tray:{keywords:["email","documents"],char:"\u{1f4e5}",fitzpatrick_scale:!1,category:"objects"},outbox_tray:{keywords:["inbox","email"],char:"\u{1f4e4}",fitzpatrick_scale:!1,category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],char:"\u{1f4dc}",fitzpatrick_scale:!1,category:"objects"},page_with_curl:{keywords:["documents","office","paper"],char:"\u{1f4c3}",fitzpatrick_scale:!1,category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],char:"\u{1f4d1}",fitzpatrick_scale:!1,category:"objects"},receipt:{keywords:["accounting","expenses"],char:"\u{1f9fe}",fitzpatrick_scale:!1,category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],char:"\u{1f4ca}",fitzpatrick_scale:!1,category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],char:"\u{1f4c8}",fitzpatrick_scale:!1,category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],char:"\u{1f4c9}",fitzpatrick_scale:!1,category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],char:"\u{1f4c4}",fitzpatrick_scale:!1,category:"objects"},date:{keywords:["calendar","schedule"],char:"\u{1f4c5}",fitzpatrick_scale:!1,category:"objects"},calendar:{keywords:["schedule","date","planning"],char:"\u{1f4c6}",fitzpatrick_scale:!1,category:"objects"},spiral_calendar:{keywords:["date","schedule","planning"],char:"\u{1f5d3}",fitzpatrick_scale:!1,category:"objects"},card_index:{keywords:["business","stationery"],char:"\u{1f4c7}",fitzpatrick_scale:!1,category:"objects"},card_file_box:{keywords:["business","stationery"],char:"\u{1f5c3}",fitzpatrick_scale:!1,category:"objects"},ballot_box:{keywords:["election","vote"],char:"\u{1f5f3}",fitzpatrick_scale:!1,category:"objects"},file_cabinet:{keywords:["filing","organizing"],char:"\u{1f5c4}",fitzpatrick_scale:!1,category:"objects"},clipboard:{keywords:["stationery","documents"],char:"\u{1f4cb}",fitzpatrick_scale:!1,category:"objects"},spiral_notepad:{keywords:["memo","stationery"],char:"\u{1f5d2}",fitzpatrick_scale:!1,category:"objects"},file_folder:{keywords:["documents","business","office"],char:"\u{1f4c1}",fitzpatrick_scale:!1,category:"objects"},open_file_folder:{keywords:["documents","load"],char:"\u{1f4c2}",fitzpatrick_scale:!1,category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],char:"\u{1f5c2}",fitzpatrick_scale:!1,category:"objects"},newspaper_roll:{keywords:["press","headline"],char:"\u{1f5de}",fitzpatrick_scale:!1,category:"objects"},newspaper:{keywords:["press","headline"],char:"\u{1f4f0}",fitzpatrick_scale:!1,category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],char:"\u{1f4d3}",fitzpatrick_scale:!1,category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],char:"\u{1f4d5}",fitzpatrick_scale:!1,category:"objects"},green_book:{keywords:["read","library","knowledge","study"],char:"\u{1f4d7}",fitzpatrick_scale:!1,category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],char:"\u{1f4d8}",fitzpatrick_scale:!1,category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],char:"\u{1f4d9}",fitzpatrick_scale:!1,category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],char:"\u{1f4d4}",fitzpatrick_scale:!1,category:"objects"},ledger:{keywords:["notes","paper"],char:"\u{1f4d2}",fitzpatrick_scale:!1,category:"objects"},books:{keywords:["literature","library","study"],char:"\u{1f4da}",fitzpatrick_scale:!1,category:"objects"},open_book:{keywords:["book","read","library","knowledge","literature","learn","study"],char:"\u{1f4d6}",fitzpatrick_scale:!1,category:"objects"},safety_pin:{keywords:["diaper"],char:"\u{1f9f7}",fitzpatrick_scale:!1,category:"objects"},link:{keywords:["rings","url"],char:"\u{1f517}",fitzpatrick_scale:!1,category:"objects"},paperclip:{keywords:["documents","stationery"],char:"\u{1f4ce}",fitzpatrick_scale:!1,category:"objects"},paperclips:{keywords:["documents","stationery"],char:"\u{1f587}",fitzpatrick_scale:!1,category:"objects"},scissors:{keywords:["stationery","cut"],char:"\u2702\ufe0f",fitzpatrick_scale:!1,category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],char:"\u{1f4d0}",fitzpatrick_scale:!1,category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],char:"\u{1f4cf}",fitzpatrick_scale:!1,category:"objects"},abacus:{keywords:["calculation"],char:"\u{1f9ee}",fitzpatrick_scale:!1,category:"objects"},pushpin:{keywords:["stationery","mark","here"],char:"\u{1f4cc}",fitzpatrick_scale:!1,category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],char:"\u{1f4cd}",fitzpatrick_scale:!1,category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],char:"\u{1f6a9}",fitzpatrick_scale:!1,category:"objects"},white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],char:"\u{1f3f3}",fitzpatrick_scale:!1,category:"objects"},black_flag:{keywords:["pirate"],char:"\u{1f3f4}",fitzpatrick_scale:!1,category:"objects"},rainbow_flag:{keywords:["flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"],char:"\u{1f3f3}\ufe0f\u200d\u{1f308}",fitzpatrick_scale:!1,category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],char:"\u{1f510}",fitzpatrick_scale:!1,category:"objects"},lock:{keywords:["security","password","padlock"],char:"\u{1f512}",fitzpatrick_scale:!1,category:"objects"},unlock:{keywords:["privacy","security"],char:"\u{1f513}",fitzpatrick_scale:!1,category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],char:"\u{1f50f}",fitzpatrick_scale:!1,category:"objects"},pen:{keywords:["stationery","writing","write"],char:"\u{1f58a}",fitzpatrick_scale:!1,category:"objects"},fountain_pen:{keywords:["stationery","writing","write"],char:"\u{1f58b}",fitzpatrick_scale:!1,category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],char:"\u2712\ufe0f",fitzpatrick_scale:!1,category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"],char:"\u{1f4dd}",fitzpatrick_scale:!1,category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],char:"\u270f\ufe0f",fitzpatrick_scale:!1,category:"objects"},crayon:{keywords:["drawing","creativity"],char:"\u{1f58d}",fitzpatrick_scale:!1,category:"objects"},paintbrush:{keywords:["drawing","creativity","art"],char:"\u{1f58c}",fitzpatrick_scale:!1,category:"objects"},mag:{keywords:["search","zoom","find","detective"],char:"\u{1f50d}",fitzpatrick_scale:!1,category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],char:"\u{1f50e}",fitzpatrick_scale:!1,category:"objects"},heart:{keywords:["love","like","valentines"],char:"\u2764\ufe0f",fitzpatrick_scale:!1,category:"symbols"},orange_heart:{keywords:["love","like","affection","valentines"],char:"\u{1f9e1}",fitzpatrick_scale:!1,category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],char:"\u{1f49b}",fitzpatrick_scale:!1,category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],char:"\u{1f49a}",fitzpatrick_scale:!1,category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],char:"\u{1f499}",fitzpatrick_scale:!1,category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],char:"\u{1f49c}",fitzpatrick_scale:!1,category:"symbols"},black_heart:{keywords:["evil"],char:"\u{1f5a4}",fitzpatrick_scale:!1,category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],char:"\u{1f494}",fitzpatrick_scale:!1,category:"symbols"},heavy_heart_exclamation:{keywords:["decoration","love"],char:"\u2763",fitzpatrick_scale:!1,category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],char:"\u{1f495}",fitzpatrick_scale:!1,category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],char:"\u{1f49e}",fitzpatrick_scale:!1,category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],char:"\u{1f493}",fitzpatrick_scale:!1,category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],char:"\u{1f497}",fitzpatrick_scale:!1,category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],char:"\u{1f496}",fitzpatrick_scale:!1,category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],char:"\u{1f498}",fitzpatrick_scale:!1,category:"symbols"},gift_heart:{keywords:["love","valentines"],char:"\u{1f49d}",fitzpatrick_scale:!1,category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],char:"\u{1f49f}",fitzpatrick_scale:!1,category:"symbols"},peace_symbol:{keywords:["hippie"],char:"\u262e",fitzpatrick_scale:!1,category:"symbols"},latin_cross:{keywords:["christianity"],char:"\u271d",fitzpatrick_scale:!1,category:"symbols"},star_and_crescent:{keywords:["islam"],char:"\u262a",fitzpatrick_scale:!1,category:"symbols"},om:{keywords:["hinduism","buddhism","sikhism","jainism"],char:"\u{1f549}",fitzpatrick_scale:!1,category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],char:"\u2638",fitzpatrick_scale:!1,category:"symbols"},star_of_david:{keywords:["judaism"],char:"\u2721",fitzpatrick_scale:!1,category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],char:"\u{1f52f}",fitzpatrick_scale:!1,category:"symbols"},menorah:{keywords:["hanukkah","candles","jewish"],char:"\u{1f54e}",fitzpatrick_scale:!1,category:"symbols"},yin_yang:{keywords:["balance"],char:"\u262f",fitzpatrick_scale:!1,category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],char:"\u2626",fitzpatrick_scale:!1,category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],char:"\u{1f6d0}",fitzpatrick_scale:!1,category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],char:"\u26ce",fitzpatrick_scale:!1,category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u2648",fitzpatrick_scale:!1,category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],char:"\u2649",fitzpatrick_scale:!1,category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u264a",fitzpatrick_scale:!1,category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u264b",fitzpatrick_scale:!1,category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u264c",fitzpatrick_scale:!1,category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u264d",fitzpatrick_scale:!1,category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u264e",fitzpatrick_scale:!1,category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],char:"\u264f",fitzpatrick_scale:!1,category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u2650",fitzpatrick_scale:!1,category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u2651",fitzpatrick_scale:!1,category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u2652",fitzpatrick_scale:!1,category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],char:"\u2653",fitzpatrick_scale:!1,category:"symbols"},id:{keywords:["purple-square","words"],char:"\u{1f194}",fitzpatrick_scale:!1,category:"symbols"},atom_symbol:{keywords:["science","physics","chemistry"],char:"\u269b",fitzpatrick_scale:!1,category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],char:"\u{1f233}",fitzpatrick_scale:!1,category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],char:"\u{1f239}",fitzpatrick_scale:!1,category:"symbols"},radioactive:{keywords:["nuclear","danger"],char:"\u2622",fitzpatrick_scale:!1,category:"symbols"},biohazard:{keywords:["danger"],char:"\u2623",fitzpatrick_scale:!1,category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],char:"\u{1f4f4}",fitzpatrick_scale:!1,category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],char:"\u{1f4f3}",fitzpatrick_scale:!1,category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],char:"\u{1f236}",fitzpatrick_scale:!1,category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],char:"\u{1f21a}",fitzpatrick_scale:!1,category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],char:"\u{1f238}",fitzpatrick_scale:!1,category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],char:"\u{1f23a}",fitzpatrick_scale:!1,category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],char:"\u{1f237}\ufe0f",fitzpatrick_scale:!1,category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],char:"\u2734\ufe0f",fitzpatrick_scale:!1,category:"symbols"},vs:{keywords:["words","orange-square"],char:"\u{1f19a}",fitzpatrick_scale:!1,category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],char:"\u{1f251}",fitzpatrick_scale:!1,category:"symbols"},white_flower:{keywords:["japanese","spring"],char:"\u{1f4ae}",fitzpatrick_scale:!1,category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],char:"\u{1f250}",fitzpatrick_scale:!1,category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],char:"\u3299\ufe0f",fitzpatrick_scale:!1,category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],char:"\u3297\ufe0f",fitzpatrick_scale:!1,category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],char:"\u{1f234}",fitzpatrick_scale:!1,category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],char:"\u{1f235}",fitzpatrick_scale:!1,category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],char:"\u{1f232}",fitzpatrick_scale:!1,category:"symbols"},a:{keywords:["red-square","alphabet","letter"],char:"\u{1f170}\ufe0f",fitzpatrick_scale:!1,category:"symbols"},b:{keywords:["red-square","alphabet","letter"],char:"\u{1f171}\ufe0f",fitzpatrick_scale:!1,category:"symbols"},ab:{keywords:["red-square","alphabet"],char:"\u{1f18e}",fitzpatrick_scale:!1,category:"symbols"},cl:{keywords:["alphabet","words","red-square"],char:"\u{1f191}",fitzpatrick_scale:!1,category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],char:"\u{1f17e}\ufe0f",fitzpatrick_scale:!1,category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],char:"\u{1f198}",fitzpatrick_scale:!1,category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],char:"\u26d4",fitzpatrick_scale:!1,category:"symbols"},name_badge:{keywords:["fire","forbid"],char:"\u{1f4db}",fitzpatrick_scale:!1,category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],char:"\u{1f6ab}",fitzpatrick_scale:!1,category:"symbols"},x:{keywords:["no","delete","remove","cancel","red"],char:"\u274c",fitzpatrick_scale:!1,category:"symbols"},o:{keywords:["circle","round"],char:"\u2b55",fitzpatrick_scale:!1,category:"symbols"},stop_sign:{keywords:["stop"],char:"\u{1f6d1}",fitzpatrick_scale:!1,category:"symbols"},anger:{keywords:["angry","mad"],char:"\u{1f4a2}",fitzpatrick_scale:!1,category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],char:"\u2668\ufe0f",fitzpatrick_scale:!1,category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],char:"\u{1f6b7}",fitzpatrick_scale:!1,category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],char:"\u{1f6af}",fitzpatrick_scale:!1,category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],char:"\u{1f6b3}",fitzpatrick_scale:!1,category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],char:"\u{1f6b1}",fitzpatrick_scale:!1,category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],char:"\u{1f51e}",fitzpatrick_scale:!1,category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],char:"\u{1f4f5}",fitzpatrick_scale:!1,category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],char:"\u2757",fitzpatrick_scale:!1,category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],char:"\u2755",fitzpatrick_scale:!1,category:"symbols"},question:{keywords:["doubt","confused"],char:"\u2753",fitzpatrick_scale:!1,category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],char:"\u2754",fitzpatrick_scale:!1,category:"symbols"},bangbang:{keywords:["exclamation","surprise"],char:"\u203c\ufe0f",fitzpatrick_scale:!1,category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],char:"\u2049\ufe0f",fitzpatrick_scale:!1,category:"symbols"},100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],char:"\u{1f4af}",fitzpatrick_scale:!1,category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],char:"\u{1f505}",fitzpatrick_scale:!1,category:"symbols"},high_brightness:{keywords:["sun","light"],char:"\u{1f506}",fitzpatrick_scale:!1,category:"symbols"},trident:{keywords:["weapon","spear"],char:"\u{1f531}",fitzpatrick_scale:!1,category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],char:"\u269c",fitzpatrick_scale:!1,category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],char:"\u303d\ufe0f",fitzpatrick_scale:!1,category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],char:"\u26a0\ufe0f",fitzpatrick_scale:!1,category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],char:"\u{1f6b8}",fitzpatrick_scale:!1,category:"symbols"},beginner:{keywords:["badge","shield"],char:"\u{1f530}",fitzpatrick_scale:!1,category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],char:"\u267b\ufe0f",fitzpatrick_scale:!1,category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],char:"\u{1f22f}",fitzpatrick_scale:!1,category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],char:"\u{1f4b9}",fitzpatrick_scale:!1,category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],char:"\u2747\ufe0f",fitzpatrick_scale:!1,category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],char:"\u2733\ufe0f",fitzpatrick_scale:!1,category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],char:"\u274e",fitzpatrick_scale:!1,category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer","tick"],char:"\u2705",fitzpatrick_scale:!1,category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],char:"\u{1f4a0}",fitzpatrick_scale:!1,category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],char:"\u{1f300}",fitzpatrick_scale:!1,category:"symbols"},loop:{keywords:["tape","cassette"],char:"\u27bf",fitzpatrick_scale:!1,category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],char:"\u{1f310}",fitzpatrick_scale:!1,category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],char:"\u24c2\ufe0f",fitzpatrick_scale:!1,category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],char:"\u{1f3e7}",fitzpatrick_scale:!1,category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],char:"\u{1f202}\ufe0f",fitzpatrick_scale:!1,category:"symbols"},passport_control:{keywords:["custom","blue-square"],char:"\u{1f6c2}",fitzpatrick_scale:!1,category:"symbols"},customs:{keywords:["passport","border","blue-square"],char:"\u{1f6c3}",fitzpatrick_scale:!1,category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],char:"\u{1f6c4}",fitzpatrick_scale:!1,category:"symbols"},left_luggage:{keywords:["blue-square","travel"],char:"\u{1f6c5}",fitzpatrick_scale:!1,category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],char:"\u267f",fitzpatrick_scale:!1,category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],char:"\u{1f6ad}",fitzpatrick_scale:!1,category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],char:"\u{1f6be}",fitzpatrick_scale:!1,category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],char:"\u{1f17f}\ufe0f",fitzpatrick_scale:!1,category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],char:"\u{1f6b0}",fitzpatrick_scale:!1,category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],char:"\u{1f6b9}",fitzpatrick_scale:!1,category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],char:"\u{1f6ba}",fitzpatrick_scale:!1,category:"symbols"},baby_symbol:{keywords:["orange-square","child"],char:"\u{1f6bc}",fitzpatrick_scale:!1,category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],char:"\u{1f6bb}",fitzpatrick_scale:!1,category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],char:"\u{1f6ae}",fitzpatrick_scale:!1,category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],char:"\u{1f3a6}",fitzpatrick_scale:!1,category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],char:"\u{1f4f6}",fitzpatrick_scale:!1,category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],char:"\u{1f201}",fitzpatrick_scale:!1,category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],char:"\u{1f196}",fitzpatrick_scale:!1,category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],char:"\u{1f197}",fitzpatrick_scale:!1,category:"symbols"},up:{keywords:["blue-square","above","high"],char:"\u{1f199}",fitzpatrick_scale:!1,category:"symbols"},cool:{keywords:["words","blue-square"],char:"\u{1f192}",fitzpatrick_scale:!1,category:"symbols"},new:{keywords:["blue-square","words","start"],char:"\u{1f195}",fitzpatrick_scale:!1,category:"symbols"},free:{keywords:["blue-square","words"],char:"\u{1f193}",fitzpatrick_scale:!1,category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],char:"0\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},one:{keywords:["blue-square","numbers","1"],char:"1\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],char:"2\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],char:"3\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},four:{keywords:["4","numbers","blue-square"],char:"4\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],char:"5\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},six:{keywords:["6","numbers","blue-square"],char:"6\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],char:"7\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},eight:{keywords:["8","blue-square","numbers"],char:"8\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},nine:{keywords:["blue-square","numbers","9"],char:"9\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],char:"\u{1f51f}",fitzpatrick_scale:!1,category:"symbols"},asterisk:{keywords:["star","keycap"],char:"*\u20e3",fitzpatrick_scale:!1,category:"symbols"},1234:{keywords:["numbers","blue-square"],char:"\u{1f522}",fitzpatrick_scale:!1,category:"symbols"},eject_button:{keywords:["blue-square"],char:"\u23cf\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],char:"\u25b6\ufe0f",fitzpatrick_scale:!1,category:"symbols"},pause_button:{keywords:["pause","blue-square"],char:"\u23f8",fitzpatrick_scale:!1,category:"symbols"},next_track_button:{keywords:["forward","next","blue-square"],char:"\u23ed",fitzpatrick_scale:!1,category:"symbols"},stop_button:{keywords:["blue-square"],char:"\u23f9",fitzpatrick_scale:!1,category:"symbols"},record_button:{keywords:["blue-square"],char:"\u23fa",fitzpatrick_scale:!1,category:"symbols"},play_or_pause_button:{keywords:["blue-square","play","pause"],char:"\u23ef",fitzpatrick_scale:!1,category:"symbols"},previous_track_button:{keywords:["backward"],char:"\u23ee",fitzpatrick_scale:!1,category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],char:"\u23e9",fitzpatrick_scale:!1,category:"symbols"},rewind:{keywords:["play","blue-square"],char:"\u23ea",fitzpatrick_scale:!1,category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],char:"\u{1f500}",fitzpatrick_scale:!1,category:"symbols"},repeat:{keywords:["loop","record"],char:"\u{1f501}",fitzpatrick_scale:!1,category:"symbols"},repeat_one:{keywords:["blue-square","loop"],char:"\u{1f502}",fitzpatrick_scale:!1,category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],char:"\u25c0\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],char:"\u{1f53c}",fitzpatrick_scale:!1,category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],char:"\u{1f53d}",fitzpatrick_scale:!1,category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],char:"\u23eb",fitzpatrick_scale:!1,category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],char:"\u23ec",fitzpatrick_scale:!1,category:"symbols"},arrow_right:{keywords:["blue-square","next"],char:"\u27a1\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],char:"\u2b05\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],char:"\u2b06\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],char:"\u2b07\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],char:"\u2197\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],char:"\u2198\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],char:"\u2199\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],char:"\u2196\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],char:"\u2195\ufe0f",fitzpatrick_scale:!1,category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],char:"\u2194\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],char:"\u{1f504}",fitzpatrick_scale:!1,category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],char:"\u21aa\ufe0f",fitzpatrick_scale:!1,category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],char:"\u21a9\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],char:"\u2934\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],char:"\u2935\ufe0f",fitzpatrick_scale:!1,category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],char:"#\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],char:"\u2139\ufe0f",fitzpatrick_scale:!1,category:"symbols"},abc:{keywords:["blue-square","alphabet"],char:"\u{1f524}",fitzpatrick_scale:!1,category:"symbols"},abcd:{keywords:["blue-square","alphabet"],char:"\u{1f521}",fitzpatrick_scale:!1,category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],char:"\u{1f520}",fitzpatrick_scale:!1,category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],char:"\u{1f523}",fitzpatrick_scale:!1,category:"symbols"},musical_note:{keywords:["score","tone","sound"],char:"\u{1f3b5}",fitzpatrick_scale:!1,category:"symbols"},notes:{keywords:["music","score"],char:"\u{1f3b6}",fitzpatrick_scale:!1,category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],char:"\u3030\ufe0f",fitzpatrick_scale:!1,category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],char:"\u27b0",fitzpatrick_scale:!1,category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],char:"\u2714\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],char:"\u{1f503}",fitzpatrick_scale:!1,category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],char:"\u2795",fitzpatrick_scale:!1,category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],char:"\u2796",fitzpatrick_scale:!1,category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],char:"\u2797",fitzpatrick_scale:!1,category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],char:"\u2716\ufe0f",fitzpatrick_scale:!1,category:"symbols"},infinity:{keywords:["forever"],char:"\u267e",fitzpatrick_scale:!1,category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],char:"\u{1f4b2}",fitzpatrick_scale:!1,category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],char:"\u{1f4b1}",fitzpatrick_scale:!1,category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],char:"\xa9\ufe0f",fitzpatrick_scale:!1,category:"symbols"},registered:{keywords:["alphabet","circle"],char:"\xae\ufe0f",fitzpatrick_scale:!1,category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],char:"\u2122\ufe0f",fitzpatrick_scale:!1,category:"symbols"},end:{keywords:["words","arrow"],char:"\u{1f51a}",fitzpatrick_scale:!1,category:"symbols"},back:{keywords:["arrow","words","return"],char:"\u{1f519}",fitzpatrick_scale:!1,category:"symbols"},on:{keywords:["arrow","words"],char:"\u{1f51b}",fitzpatrick_scale:!1,category:"symbols"},top:{keywords:["words","blue-square"],char:"\u{1f51d}",fitzpatrick_scale:!1,category:"symbols"},soon:{keywords:["arrow","words"],char:"\u{1f51c}",fitzpatrick_scale:!1,category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes","tick"],char:"\u2611\ufe0f",fitzpatrick_scale:!1,category:"symbols"},radio_button:{keywords:["input","old","music","circle"],char:"\u{1f518}",fitzpatrick_scale:!1,category:"symbols"},white_circle:{keywords:["shape","round"],char:"\u26aa",fitzpatrick_scale:!1,category:"symbols"},black_circle:{keywords:["shape","button","round"],char:"\u26ab",fitzpatrick_scale:!1,category:"symbols"},red_circle:{keywords:["shape","error","danger"],char:"\u{1f534}",fitzpatrick_scale:!1,category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],char:"\u{1f535}",fitzpatrick_scale:!1,category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],char:"\u{1f538}",fitzpatrick_scale:!1,category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],char:"\u{1f539}",fitzpatrick_scale:!1,category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],char:"\u{1f536}",fitzpatrick_scale:!1,category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],char:"\u{1f537}",fitzpatrick_scale:!1,category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],char:"\u{1f53a}",fitzpatrick_scale:!1,category:"symbols"},black_small_square:{keywords:["shape","icon"],char:"\u25aa\ufe0f",fitzpatrick_scale:!1,category:"symbols"},white_small_square:{keywords:["shape","icon"],char:"\u25ab\ufe0f",fitzpatrick_scale:!1,category:"symbols"},black_large_square:{keywords:["shape","icon","button"],char:"\u2b1b",fitzpatrick_scale:!1,category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],char:"\u2b1c",fitzpatrick_scale:!1,category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],char:"\u{1f53b}",fitzpatrick_scale:!1,category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],char:"\u25fc\ufe0f",fitzpatrick_scale:!1,category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],char:"\u25fb\ufe0f",fitzpatrick_scale:!1,category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],char:"\u25fe",fitzpatrick_scale:!1,category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],char:"\u25fd",fitzpatrick_scale:!1,category:"symbols"},black_square_button:{keywords:["shape","input","frame"],char:"\u{1f532}",fitzpatrick_scale:!1,category:"symbols"},white_square_button:{keywords:["shape","input"],char:"\u{1f533}",fitzpatrick_scale:!1,category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],char:"\u{1f508}",fitzpatrick_scale:!1,category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],char:"\u{1f509}",fitzpatrick_scale:!1,category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],char:"\u{1f50a}",fitzpatrick_scale:!1,category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],char:"\u{1f507}",fitzpatrick_scale:!1,category:"symbols"},mega:{keywords:["sound","speaker","volume"],char:"\u{1f4e3}",fitzpatrick_scale:!1,category:"symbols"},loudspeaker:{keywords:["volume","sound"],char:"\u{1f4e2}",fitzpatrick_scale:!1,category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],char:"\u{1f514}",fitzpatrick_scale:!1,category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],char:"\u{1f515}",fitzpatrick_scale:!1,category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],char:"\u{1f0cf}",fitzpatrick_scale:!1,category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],char:"\u{1f004}",fitzpatrick_scale:!1,category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],char:"\u2660\ufe0f",fitzpatrick_scale:!1,category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],char:"\u2663\ufe0f",fitzpatrick_scale:!1,category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],char:"\u2665\ufe0f",fitzpatrick_scale:!1,category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],char:"\u2666\ufe0f",fitzpatrick_scale:!1,category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],char:"\u{1f3b4}",fitzpatrick_scale:!1,category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking","dream"],char:"\u{1f4ad}",fitzpatrick_scale:!1,category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],char:"\u{1f5ef}",fitzpatrick_scale:!1,category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],char:"\u{1f4ac}",fitzpatrick_scale:!1,category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],char:"\u{1f5e8}",fitzpatrick_scale:!1,category:"symbols"},clock1:{keywords:["time","late","early","schedule"],char:"\u{1f550}",fitzpatrick_scale:!1,category:"symbols"},clock2:{keywords:["time","late","early","schedule"],char:"\u{1f551}",fitzpatrick_scale:!1,category:"symbols"},clock3:{keywords:["time","late","early","schedule"],char:"\u{1f552}",fitzpatrick_scale:!1,category:"symbols"},clock4:{keywords:["time","late","early","schedule"],char:"\u{1f553}",fitzpatrick_scale:!1,category:"symbols"},clock5:{keywords:["time","late","early","schedule"],char:"\u{1f554}",fitzpatrick_scale:!1,category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],char:"\u{1f555}",fitzpatrick_scale:!1,category:"symbols"},clock7:{keywords:["time","late","early","schedule"],char:"\u{1f556}",fitzpatrick_scale:!1,category:"symbols"},clock8:{keywords:["time","late","early","schedule"],char:"\u{1f557}",fitzpatrick_scale:!1,category:"symbols"},clock9:{keywords:["time","late","early","schedule"],char:"\u{1f558}",fitzpatrick_scale:!1,category:"symbols"},clock10:{keywords:["time","late","early","schedule"],char:"\u{1f559}",fitzpatrick_scale:!1,category:"symbols"},clock11:{keywords:["time","late","early","schedule"],char:"\u{1f55a}",fitzpatrick_scale:!1,category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],char:"\u{1f55b}",fitzpatrick_scale:!1,category:"symbols"},clock130:{keywords:["time","late","early","schedule"],char:"\u{1f55c}",fitzpatrick_scale:!1,category:"symbols"},clock230:{keywords:["time","late","early","schedule"],char:"\u{1f55d}",fitzpatrick_scale:!1,category:"symbols"},clock330:{keywords:["time","late","early","schedule"],char:"\u{1f55e}",fitzpatrick_scale:!1,category:"symbols"},clock430:{keywords:["time","late","early","schedule"],char:"\u{1f55f}",fitzpatrick_scale:!1,category:"symbols"},clock530:{keywords:["time","late","early","schedule"],char:"\u{1f560}",fitzpatrick_scale:!1,category:"symbols"},clock630:{keywords:["time","late","early","schedule"],char:"\u{1f561}",fitzpatrick_scale:!1,category:"symbols"},clock730:{keywords:["time","late","early","schedule"],char:"\u{1f562}",fitzpatrick_scale:!1,category:"symbols"},clock830:{keywords:["time","late","early","schedule"],char:"\u{1f563}",fitzpatrick_scale:!1,category:"symbols"},clock930:{keywords:["time","late","early","schedule"],char:"\u{1f564}",fitzpatrick_scale:!1,category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],char:"\u{1f565}",fitzpatrick_scale:!1,category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],char:"\u{1f566}",fitzpatrick_scale:!1,category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],char:"\u{1f567}",fitzpatrick_scale:!1,category:"symbols"},afghanistan:{keywords:["af","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1eb}",fitzpatrick_scale:!1,category:"flags"},aland_islands:{keywords:["\xc5land","islands","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1fd}",fitzpatrick_scale:!1,category:"flags"},albania:{keywords:["al","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1f1}",fitzpatrick_scale:!1,category:"flags"},algeria:{keywords:["dz","flag","nation","country","banner"],char:"\u{1f1e9}\u{1f1ff}",fitzpatrick_scale:!1,category:"flags"},american_samoa:{keywords:["american","ws","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},andorra:{keywords:["ad","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1e9}",fitzpatrick_scale:!1,category:"flags"},angola:{keywords:["ao","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},anguilla:{keywords:["ai","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1ee}",fitzpatrick_scale:!1,category:"flags"},antarctica:{keywords:["aq","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1f6}",fitzpatrick_scale:!1,category:"flags"},antigua_barbuda:{keywords:["antigua","barbuda","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},argentina:{keywords:["ar","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},armenia:{keywords:["am","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},aruba:{keywords:["aw","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1fc}",fitzpatrick_scale:!1,category:"flags"},australia:{keywords:["au","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1fa}",fitzpatrick_scale:!1,category:"flags"},austria:{keywords:["at","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},azerbaijan:{keywords:["az","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1ff}",fitzpatrick_scale:!1,category:"flags"},bahamas:{keywords:["bs","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},bahrain:{keywords:["bh","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1ed}",fitzpatrick_scale:!1,category:"flags"},bangladesh:{keywords:["bd","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1e9}",fitzpatrick_scale:!1,category:"flags"},barbados:{keywords:["bb","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1e7}",fitzpatrick_scale:!1,category:"flags"},belarus:{keywords:["by","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1fe}",fitzpatrick_scale:!1,category:"flags"},belgium:{keywords:["be","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},belize:{keywords:["bz","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1ff}",fitzpatrick_scale:!1,category:"flags"},benin:{keywords:["bj","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1ef}",fitzpatrick_scale:!1,category:"flags"},bermuda:{keywords:["bm","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},bhutan:{keywords:["bt","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},bolivia:{keywords:["bo","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},caribbean_netherlands:{keywords:["bonaire","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1f6}",fitzpatrick_scale:!1,category:"flags"},bosnia_herzegovina:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},botswana:{keywords:["bw","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1fc}",fitzpatrick_scale:!1,category:"flags"},brazil:{keywords:["br","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},british_indian_ocean_territory:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},british_virgin_islands:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],char:"\u{1f1fb}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},brunei:{keywords:["bn","darussalam","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},bulgaria:{keywords:["bg","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},burkina_faso:{keywords:["burkina","faso","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1eb}",fitzpatrick_scale:!1,category:"flags"},burundi:{keywords:["bi","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1ee}",fitzpatrick_scale:!1,category:"flags"},cape_verde:{keywords:["cabo","verde","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1fb}",fitzpatrick_scale:!1,category:"flags"},cambodia:{keywords:["kh","flag","nation","country","banner"],char:"\u{1f1f0}\u{1f1ed}",fitzpatrick_scale:!1,category:"flags"},cameroon:{keywords:["cm","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},canada:{keywords:["ca","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},canary_islands:{keywords:["canary","islands","flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1e8}",fitzpatrick_scale:!1,category:"flags"},cayman_islands:{keywords:["cayman","islands","flag","nation","country","banner"],char:"\u{1f1f0}\u{1f1fe}",fitzpatrick_scale:!1,category:"flags"},central_african_republic:{keywords:["central","african","republic","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1eb}",fitzpatrick_scale:!1,category:"flags"},chad:{keywords:["td","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1e9}",fitzpatrick_scale:!1,category:"flags"},chile:{keywords:["flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1f1}",fitzpatrick_scale:!1,category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],char:"\u{1f1e8}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},christmas_island:{keywords:["christmas","island","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1fd}",fitzpatrick_scale:!1,category:"flags"},cocos_islands:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1e8}",fitzpatrick_scale:!1,category:"flags"},colombia:{keywords:["co","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},comoros:{keywords:["km","flag","nation","country","banner"],char:"\u{1f1f0}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},congo_brazzaville:{keywords:["congo","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},congo_kinshasa:{keywords:["congo","democratic","republic","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1e9}",fitzpatrick_scale:!1,category:"flags"},cook_islands:{keywords:["cook","islands","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1f0}",fitzpatrick_scale:!1,category:"flags"},costa_rica:{keywords:["costa","rica","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},croatia:{keywords:["hr","flag","nation","country","banner"],char:"\u{1f1ed}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},cuba:{keywords:["cu","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1fa}",fitzpatrick_scale:!1,category:"flags"},curacao:{keywords:["cura\xe7ao","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1fc}",fitzpatrick_scale:!1,category:"flags"},cyprus:{keywords:["cy","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1fe}",fitzpatrick_scale:!1,category:"flags"},czech_republic:{keywords:["cz","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1ff}",fitzpatrick_scale:!1,category:"flags"},denmark:{keywords:["dk","flag","nation","country","banner"],char:"\u{1f1e9}\u{1f1f0}",fitzpatrick_scale:!1,category:"flags"},djibouti:{keywords:["dj","flag","nation","country","banner"],char:"\u{1f1e9}\u{1f1ef}",fitzpatrick_scale:!1,category:"flags"},dominica:{keywords:["dm","flag","nation","country","banner"],char:"\u{1f1e9}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},dominican_republic:{keywords:["dominican","republic","flag","nation","country","banner"],char:"\u{1f1e9}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},ecuador:{keywords:["ec","flag","nation","country","banner"],char:"\u{1f1ea}\u{1f1e8}",fitzpatrick_scale:!1,category:"flags"},egypt:{keywords:["eg","flag","nation","country","banner"],char:"\u{1f1ea}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},el_salvador:{keywords:["el","salvador","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1fb}",fitzpatrick_scale:!1,category:"flags"},equatorial_guinea:{keywords:["equatorial","gn","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1f6}",fitzpatrick_scale:!1,category:"flags"},eritrea:{keywords:["er","flag","nation","country","banner"],char:"\u{1f1ea}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},estonia:{keywords:["ee","flag","nation","country","banner"],char:"\u{1f1ea}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},ethiopia:{keywords:["et","flag","nation","country","banner"],char:"\u{1f1ea}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},eu:{keywords:["european","union","flag","banner"],char:"\u{1f1ea}\u{1f1fa}",fitzpatrick_scale:!1,category:"flags"},falkland_islands:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],char:"\u{1f1eb}\u{1f1f0}",fitzpatrick_scale:!1,category:"flags"},faroe_islands:{keywords:["faroe","islands","flag","nation","country","banner"],char:"\u{1f1eb}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},fiji:{keywords:["fj","flag","nation","country","banner"],char:"\u{1f1eb}\u{1f1ef}",fitzpatrick_scale:!1,category:"flags"},finland:{keywords:["fi","flag","nation","country","banner"],char:"\u{1f1eb}\u{1f1ee}",fitzpatrick_scale:!1,category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],char:"\u{1f1eb}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},french_guiana:{keywords:["french","guiana","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1eb}",fitzpatrick_scale:!1,category:"flags"},french_polynesia:{keywords:["french","polynesia","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1eb}",fitzpatrick_scale:!1,category:"flags"},french_southern_territories:{keywords:["french","southern","territories","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1eb}",fitzpatrick_scale:!1,category:"flags"},gabon:{keywords:["ga","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},gambia:{keywords:["gm","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},georgia:{keywords:["ge","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},de:{keywords:["german","nation","flag","country","banner"],char:"\u{1f1e9}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},ghana:{keywords:["gh","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1ed}",fitzpatrick_scale:!1,category:"flags"},gibraltar:{keywords:["gi","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1ee}",fitzpatrick_scale:!1,category:"flags"},greece:{keywords:["gr","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},greenland:{keywords:["gl","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1f1}",fitzpatrick_scale:!1,category:"flags"},grenada:{keywords:["gd","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1e9}",fitzpatrick_scale:!1,category:"flags"},guadeloupe:{keywords:["gp","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1f5}",fitzpatrick_scale:!1,category:"flags"},guam:{keywords:["gu","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1fa}",fitzpatrick_scale:!1,category:"flags"},guatemala:{keywords:["gt","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},guernsey:{keywords:["gg","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},guinea:{keywords:["gn","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},guinea_bissau:{keywords:["gw","bissau","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1fc}",fitzpatrick_scale:!1,category:"flags"},guyana:{keywords:["gy","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1fe}",fitzpatrick_scale:!1,category:"flags"},haiti:{keywords:["ht","flag","nation","country","banner"],char:"\u{1f1ed}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},honduras:{keywords:["hn","flag","nation","country","banner"],char:"\u{1f1ed}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},hong_kong:{keywords:["hong","kong","flag","nation","country","banner"],char:"\u{1f1ed}\u{1f1f0}",fitzpatrick_scale:!1,category:"flags"},hungary:{keywords:["hu","flag","nation","country","banner"],char:"\u{1f1ed}\u{1f1fa}",fitzpatrick_scale:!1,category:"flags"},iceland:{keywords:["is","flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},india:{keywords:["in","flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1e9}",fitzpatrick_scale:!1,category:"flags"},iran:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},iraq:{keywords:["iq","flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1f6}",fitzpatrick_scale:!1,category:"flags"},ireland:{keywords:["ie","flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},isle_of_man:{keywords:["isle","man","flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},israel:{keywords:["il","flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1f1}",fitzpatrick_scale:!1,category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},cote_divoire:{keywords:["ivory","coast","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1ee}",fitzpatrick_scale:!1,category:"flags"},jamaica:{keywords:["jm","flag","nation","country","banner"],char:"\u{1f1ef}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],char:"\u{1f1ef}\u{1f1f5}",fitzpatrick_scale:!1,category:"flags"},jersey:{keywords:["je","flag","nation","country","banner"],char:"\u{1f1ef}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},jordan:{keywords:["jo","flag","nation","country","banner"],char:"\u{1f1ef}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},kazakhstan:{keywords:["kz","flag","nation","country","banner"],char:"\u{1f1f0}\u{1f1ff}",fitzpatrick_scale:!1,category:"flags"},kenya:{keywords:["ke","flag","nation","country","banner"],char:"\u{1f1f0}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},kiribati:{keywords:["ki","flag","nation","country","banner"],char:"\u{1f1f0}\u{1f1ee}",fitzpatrick_scale:!1,category:"flags"},kosovo:{keywords:["xk","flag","nation","country","banner"],char:"\u{1f1fd}\u{1f1f0}",fitzpatrick_scale:!1,category:"flags"},kuwait:{keywords:["kw","flag","nation","country","banner"],char:"\u{1f1f0}\u{1f1fc}",fitzpatrick_scale:!1,category:"flags"},kyrgyzstan:{keywords:["kg","flag","nation","country","banner"],char:"\u{1f1f0}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},laos:{keywords:["lao","democratic","republic","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},latvia:{keywords:["lv","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1fb}",fitzpatrick_scale:!1,category:"flags"},lebanon:{keywords:["lb","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1e7}",fitzpatrick_scale:!1,category:"flags"},lesotho:{keywords:["ls","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},liberia:{keywords:["lr","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},libya:{keywords:["ly","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1fe}",fitzpatrick_scale:!1,category:"flags"},liechtenstein:{keywords:["li","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1ee}",fitzpatrick_scale:!1,category:"flags"},lithuania:{keywords:["lt","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},luxembourg:{keywords:["lu","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1fa}",fitzpatrick_scale:!1,category:"flags"},macau:{keywords:["macao","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},macedonia:{keywords:["macedonia,","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1f0}",fitzpatrick_scale:!1,category:"flags"},madagascar:{keywords:["mg","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},malawi:{keywords:["mw","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1fc}",fitzpatrick_scale:!1,category:"flags"},malaysia:{keywords:["my","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1fe}",fitzpatrick_scale:!1,category:"flags"},maldives:{keywords:["mv","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1fb}",fitzpatrick_scale:!1,category:"flags"},mali:{keywords:["ml","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1f1}",fitzpatrick_scale:!1,category:"flags"},malta:{keywords:["mt","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},marshall_islands:{keywords:["marshall","islands","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1ed}",fitzpatrick_scale:!1,category:"flags"},martinique:{keywords:["mq","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1f6}",fitzpatrick_scale:!1,category:"flags"},mauritania:{keywords:["mr","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},mauritius:{keywords:["mu","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1fa}",fitzpatrick_scale:!1,category:"flags"},mayotte:{keywords:["yt","flag","nation","country","banner"],char:"\u{1f1fe}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},mexico:{keywords:["mx","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1fd}",fitzpatrick_scale:!1,category:"flags"},micronesia:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],char:"\u{1f1eb}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},moldova:{keywords:["moldova,","republic","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1e9}",fitzpatrick_scale:!1,category:"flags"},monaco:{keywords:["mc","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1e8}",fitzpatrick_scale:!1,category:"flags"},mongolia:{keywords:["mn","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},montenegro:{keywords:["me","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},montserrat:{keywords:["ms","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},morocco:{keywords:["ma","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},mozambique:{keywords:["mz","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1ff}",fitzpatrick_scale:!1,category:"flags"},myanmar:{keywords:["mm","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},namibia:{keywords:["na","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},nauru:{keywords:["nr","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},nepal:{keywords:["np","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1f5}",fitzpatrick_scale:!1,category:"flags"},netherlands:{keywords:["nl","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1f1}",fitzpatrick_scale:!1,category:"flags"},new_caledonia:{keywords:["new","caledonia","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1e8}",fitzpatrick_scale:!1,category:"flags"},new_zealand:{keywords:["new","zealand","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1ff}",fitzpatrick_scale:!1,category:"flags"},nicaragua:{keywords:["ni","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1ee}",fitzpatrick_scale:!1,category:"flags"},niger:{keywords:["ne","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},niue:{keywords:["nu","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1fa}",fitzpatrick_scale:!1,category:"flags"},norfolk_island:{keywords:["norfolk","island","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1eb}",fitzpatrick_scale:!1,category:"flags"},northern_mariana_islands:{keywords:["northern","mariana","islands","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1f5}",fitzpatrick_scale:!1,category:"flags"},north_korea:{keywords:["north","korea","nation","flag","country","banner"],char:"\u{1f1f0}\u{1f1f5}",fitzpatrick_scale:!1,category:"flags"},norway:{keywords:["no","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},oman:{keywords:["om_symbol","flag","nation","country","banner"],char:"\u{1f1f4}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},pakistan:{keywords:["pk","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1f0}",fitzpatrick_scale:!1,category:"flags"},palau:{keywords:["pw","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1fc}",fitzpatrick_scale:!1,category:"flags"},palestinian_territories:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},panama:{keywords:["pa","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},papua_new_guinea:{keywords:["papua","new","guinea","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},paraguay:{keywords:["py","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1fe}",fitzpatrick_scale:!1,category:"flags"},peru:{keywords:["pe","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},philippines:{keywords:["ph","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1ed}",fitzpatrick_scale:!1,category:"flags"},pitcairn_islands:{keywords:["pitcairn","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},poland:{keywords:["pl","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1f1}",fitzpatrick_scale:!1,category:"flags"},portugal:{keywords:["pt","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},puerto_rico:{keywords:["puerto","rico","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},qatar:{keywords:["qa","flag","nation","country","banner"],char:"\u{1f1f6}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},reunion:{keywords:["r\xe9union","flag","nation","country","banner"],char:"\u{1f1f7}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},romania:{keywords:["ro","flag","nation","country","banner"],char:"\u{1f1f7}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],char:"\u{1f1f7}\u{1f1fa}",fitzpatrick_scale:!1,category:"flags"},rwanda:{keywords:["rw","flag","nation","country","banner"],char:"\u{1f1f7}\u{1f1fc}",fitzpatrick_scale:!1,category:"flags"},st_barthelemy:{keywords:["saint","barth\xe9lemy","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1f1}",fitzpatrick_scale:!1,category:"flags"},st_helena:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1ed}",fitzpatrick_scale:!1,category:"flags"},st_kitts_nevis:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],char:"\u{1f1f0}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},st_lucia:{keywords:["saint","lucia","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1e8}",fitzpatrick_scale:!1,category:"flags"},st_pierre_miquelon:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},st_vincent_grenadines:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],char:"\u{1f1fb}\u{1f1e8}",fitzpatrick_scale:!1,category:"flags"},samoa:{keywords:["ws","flag","nation","country","banner"],char:"\u{1f1fc}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},san_marino:{keywords:["san","marino","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},sao_tome_principe:{keywords:["sao","tome","principe","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},senegal:{keywords:["sn","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},serbia:{keywords:["rs","flag","nation","country","banner"],char:"\u{1f1f7}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},seychelles:{keywords:["sc","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1e8}",fitzpatrick_scale:!1,category:"flags"},sierra_leone:{keywords:["sierra","leone","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1f1}",fitzpatrick_scale:!1,category:"flags"},singapore:{keywords:["sg","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},sint_maarten:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1fd}",fitzpatrick_scale:!1,category:"flags"},slovakia:{keywords:["sk","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1f0}",fitzpatrick_scale:!1,category:"flags"},slovenia:{keywords:["si","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1ee}",fitzpatrick_scale:!1,category:"flags"},solomon_islands:{keywords:["solomon","islands","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1e7}",fitzpatrick_scale:!1,category:"flags"},somalia:{keywords:["so","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},south_africa:{keywords:["south","africa","flag","nation","country","banner"],char:"\u{1f1ff}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},south_georgia_south_sandwich_islands:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],char:"\u{1f1f0}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},south_sudan:{keywords:["south","sd","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],char:"\u{1f1ea}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},sri_lanka:{keywords:["sri","lanka","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1f0}",fitzpatrick_scale:!1,category:"flags"},sudan:{keywords:["sd","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1e9}",fitzpatrick_scale:!1,category:"flags"},suriname:{keywords:["sr","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},swaziland:{keywords:["sz","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1ff}",fitzpatrick_scale:!1,category:"flags"},sweden:{keywords:["se","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},switzerland:{keywords:["ch","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1ed}",fitzpatrick_scale:!1,category:"flags"},syria:{keywords:["syrian","arab","republic","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1fe}",fitzpatrick_scale:!1,category:"flags"},taiwan:{keywords:["tw","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1fc}",fitzpatrick_scale:!1,category:"flags"},tajikistan:{keywords:["tj","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1ef}",fitzpatrick_scale:!1,category:"flags"},tanzania:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1ff}",fitzpatrick_scale:!1,category:"flags"},thailand:{keywords:["th","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1ed}",fitzpatrick_scale:!1,category:"flags"},timor_leste:{keywords:["timor","leste","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1f1}",fitzpatrick_scale:!1,category:"flags"},togo:{keywords:["tg","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},tokelau:{keywords:["tk","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1f0}",fitzpatrick_scale:!1,category:"flags"},tonga:{keywords:["to","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},trinidad_tobago:{keywords:["trinidad","tobago","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},tunisia:{keywords:["tn","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},turks_caicos_islands:{keywords:["turks","caicos","islands","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1e8}",fitzpatrick_scale:!1,category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1fb}",fitzpatrick_scale:!1,category:"flags"},uganda:{keywords:["ug","flag","nation","country","banner"],char:"\u{1f1fa}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},ukraine:{keywords:["ua","flag","nation","country","banner"],char:"\u{1f1fa}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},united_arab_emirates:{keywords:["united","arab","emirates","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},uk:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],char:"\u{1f1ec}\u{1f1e7}",fitzpatrick_scale:!1,category:"flags"},england:{keywords:["flag","english"],char:"\u{1f3f4}\u{e0067}\u{e0062}\u{e0065}\u{e006e}\u{e0067}\u{e007f}",fitzpatrick_scale:!1,category:"flags"},scotland:{keywords:["flag","scottish"],char:"\u{1f3f4}\u{e0067}\u{e0062}\u{e0073}\u{e0063}\u{e0074}\u{e007f}",fitzpatrick_scale:!1,category:"flags"},wales:{keywords:["flag","welsh"],char:"\u{1f3f4}\u{e0067}\u{e0062}\u{e0077}\u{e006c}\u{e0073}\u{e007f}",fitzpatrick_scale:!1,category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],char:"\u{1f1fa}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},us_virgin_islands:{keywords:["virgin","islands","us","flag","nation","country","banner"],char:"\u{1f1fb}\u{1f1ee}",fitzpatrick_scale:!1,category:"flags"},uruguay:{keywords:["uy","flag","nation","country","banner"],char:"\u{1f1fa}\u{1f1fe}",fitzpatrick_scale:!1,category:"flags"},uzbekistan:{keywords:["uz","flag","nation","country","banner"],char:"\u{1f1fa}\u{1f1ff}",fitzpatrick_scale:!1,category:"flags"},vanuatu:{keywords:["vu","flag","nation","country","banner"],char:"\u{1f1fb}\u{1f1fa}",fitzpatrick_scale:!1,category:"flags"},vatican_city:{keywords:["vatican","city","flag","nation","country","banner"],char:"\u{1f1fb}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},venezuela:{keywords:["ve","bolivarian","republic","flag","nation","country","banner"],char:"\u{1f1fb}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},vietnam:{keywords:["viet","nam","flag","nation","country","banner"],char:"\u{1f1fb}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},wallis_futuna:{keywords:["wallis","futuna","flag","nation","country","banner"],char:"\u{1f1fc}\u{1f1eb}",fitzpatrick_scale:!1,category:"flags"},western_sahara:{keywords:["western","sahara","flag","nation","country","banner"],char:"\u{1f1ea}\u{1f1ed}",fitzpatrick_scale:!1,category:"flags"},yemen:{keywords:["ye","flag","nation","country","banner"],char:"\u{1f1fe}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},zambia:{keywords:["zm","flag","nation","country","banner"],char:"\u{1f1ff}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},zimbabwe:{keywords:["zw","flag","nation","country","banner"],char:"\u{1f1ff}\u{1f1fc}",fitzpatrick_scale:!1,category:"flags"},united_nations:{keywords:["un","flag","banner"],char:"\u{1f1fa}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},pirate_flag:{keywords:["skull","crossbones","flag","banner"],char:"\u{1f3f4}\u200d\u2620\ufe0f",fitzpatrick_scale:!1,category:"flags"}}); \ No newline at end of file diff --git a/static/js/tinymce/plugins/emoticons/plugin.min.js b/static/js/tinymce/plugins/emoticons/plugin.min.js new file mode 100644 index 0000000..f47f5f2 --- /dev/null +++ b/static/js/tinymce/plugins/emoticons/plugin.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.7.2 (2023-10-25) + */ +!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=t=>e=>t===e,o=e(null),n=e(void 0),s=()=>{},r=()=>!1;class a{constructor(t,e){this.tag=t,this.value=e}static some(t){return new a(!0,t)}static none(){return a.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?a.some(t(this.value)):a.none()}bind(t){return this.tag?t(this.value):a.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:a.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(null!=t?t:"Called getOrDie on None")}static from(t){return null==t?a.none():a.some(t)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}a.singletonNone=new a(!1);const i=(t,e)=>{const o=t.length,n=new Array(o);for(let s=0;s{let e=t;return{get:()=>e,set:t=>{e=t}}},c=Object.keys,u=Object.hasOwnProperty,g=(t,e)=>{const o=c(t);for(let n=0,s=o.length;nu.call(t,e),d=(h=(t,e)=>e,(...t)=>{if(0===t.length)throw new Error("Can't merge zero objects");const e={};for(let o=0;o{const t=(t=>{const e=l(a.none()),o=()=>e.get().each(t);return{clear:()=>{o(),e.set(a.none())},isSet:()=>e.get().isSome(),get:()=>e.get(),set:t=>{o(),e.set(a.some(t))}}})(s);return{...t,on:e=>t.get().each(e)}},v=(t,e,o=0,s)=>{const r=t.indexOf(e,o);return-1!==r&&(!!n(s)||r+e.length<=s)};var y=tinymce.util.Tools.resolve("tinymce.Resource");const f=t=>e=>e.options.get(t),b=f("emoticons_database"),w=f("emoticons_database_url"),C=f("emoticons_database_id"),_=f("emoticons_append"),j=f("emoticons_images_url"),k="All",A={symbols:"Symbols",people:"People",animals_and_nature:"Animals and Nature",food_and_drink:"Food and Drink",activity:"Activity",travel_and_places:"Travel and Places",objects:"Objects",flags:"Flags",user:"User Defined"},O=(t,e)=>m(t,e)?t[e]:e,x=t=>{const e=_(t);return o=t=>({keywords:[],category:"user",...t}),((t,e)=>{const o={};return g(t,((t,n)=>{const s=e(t,n);o[s.k]=s.v})),o})(e,((t,e)=>({k:e,v:o(t)})));var o},E=(t,e)=>v(t.title.toLowerCase(),e)||((t,o)=>{for(let o=0,s=t.length;o{const n=[],s=e.toLowerCase(),a=o.fold((()=>r),(t=>e=>e>=t));for(let o=0;o{const n={pattern:"",results:S(e.listAll(),"",a.some(300))},s=l(k),r=((t,e)=>{let n=null;const s=()=>{o(n)||(clearTimeout(n),n=null)};return{cancel:s,throttle:(...e)=>{s(),n=setTimeout((()=>{n=null,t.apply(null,e)}),200)}}})((t=>{(t=>{const o=t.getData(),n=s.get(),r=e.listCategory(n),i=S(r,o[L],n===k?a.some(300):a.none());t.setData({results:i})})(t)})),c={label:"Search",type:"input",name:L},u={type:"collection",name:"results"},g=()=>({title:"Emojis",size:"normal",body:{type:"tabpanel",tabs:i(e.listCategories(),(t=>({title:t,name:t,items:[c,u]})))},initialData:n,onTabChange:(t,e)=>{s.set(e.newTabName),r.throttle(t)},onChange:r.throttle,onAction:(e,o)=>{"results"===o.name&&(((t,e)=>{t.insertContent(e)})(t,o.value),e.close())},buttons:[{type:"cancel",text:"Close",primary:!0}]}),m=t.windowManager.open(g());m.focus(L),e.hasLoaded()||(m.block("Loading emojis..."),e.waitForLoad().then((()=>{m.redial(g()),r.throttle(m),m.focus(L),m.unblock()})).catch((t=>{m.redial({title:"Emojis",body:{type:"panel",items:[{type:"alertbanner",level:"error",icon:"warning",text:"Could not load emojis"}]},buttons:[{type:"cancel",text:"Close",primary:!0}],initialData:{pattern:"",results:[]}}),m.focus(L),m.unblock()})))},T=t=>e=>{const o=()=>{e.setEnabled(t.selection.isEditable())};return t.on("NodeChange",o),o(),()=>{t.off("NodeChange",o)}};t.add("emoticons",((t,e)=>{((t,e)=>{const o=t.options.register;o("emoticons_database",{processor:"string",default:"emojis"}),o("emoticons_database_url",{processor:"string",default:`${e}/js/${b(t)}${t.suffix}.js`}),o("emoticons_database_id",{processor:"string",default:"tinymce.plugins.emoticons"}),o("emoticons_append",{processor:"object",default:{}}),o("emoticons_images_url",{processor:"string",default:"https://twemoji.maxcdn.com/v/13.0.1/72x72/"})})(t,e);const o=((t,e,o)=>{const n=p(),s=p(),r=j(t),i=t=>{return o="=4&&e.substr(0,4)===o?t.char.replace(/src="([^"]+)"/,((t,e)=>`src="${r}${e}"`)):t.char;var e,o};t.on("init",(()=>{y.load(o,e).then((e=>{const o=x(t);(t=>{const e={},o=[];g(t,((t,n)=>{const s={title:n,keywords:t.keywords,char:i(t),category:O(A,t.category)},r=void 0!==e[s.category]?e[s.category]:[];e[s.category]=r.concat([s]),o.push(s)})),n.set(e),s.set(o)})(d(e,o))}),(t=>{console.log(`Failed to load emojis: ${t}`),n.set({}),s.set([])}))}));const l=()=>s.get().getOr([]),u=()=>n.isSet()&&s.isSet();return{listCategories:()=>[k].concat(c(n.get().getOr({}))),hasLoaded:u,waitForLoad:()=>u()?Promise.resolve(!0):new Promise(((t,o)=>{let n=15;const s=setInterval((()=>{u()?(clearInterval(s),t(!0)):(n--,n<0&&(console.log("Could not load emojis from url: "+e),clearInterval(s),o(!1)))}),100)})),listAll:l,listCategory:t=>t===k?l():n.get().bind((e=>a.from(e[t]))).getOr([])}})(t,w(t),C(t));((t,e)=>{t.addCommand("mceEmoticons",(()=>N(t,e)))})(t,o),(t=>{const e=()=>t.execCommand("mceEmoticons");t.ui.registry.addButton("emoticons",{tooltip:"Emojis",icon:"emoji",onAction:e,onSetup:T(t)}),t.ui.registry.addMenuItem("emoticons",{text:"Emojis...",icon:"emoji",onAction:e,onSetup:T(t)})})(t),((t,e)=>{t.ui.registry.addAutocompleter("emoticons",{trigger:":",columns:"auto",minChars:2,fetch:(t,o)=>e.waitForLoad().then((()=>{const n=e.listAll();return S(n,t,a.some(o))})),onAction:(e,o,n)=>{t.selection.setRng(o),t.insertContent(n),e.hide()}})})(t,o),(t=>{t.on("PreInit",(()=>{t.parser.addAttributeFilter("data-emoticon",(t=>{((t,e)=>{for(let e=0,n=t.length;e{let t=e;return{get:()=>t,set:e=>{t=e}}};var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const n=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=r=e,(o=String).prototype.isPrototypeOf(n)||(null===(s=r.constructor)||void 0===s?void 0:s.name)===o.name)?"string":t;var n,r,o,s})(t)===e,r=e=>t=>typeof t===e,o=e=>t=>e===t,s=n("string"),i=n("array"),l=o(null),a=r("boolean"),c=o(void 0),u=e=>!(e=>null==e)(e),d=r("function"),m=r("number"),h=()=>{},g=e=>()=>e;function p(e,...t){return(...n)=>{const r=t.concat(n);return e.apply(null,r)}}const f=g(!1),v=g(!0);class w{constructor(e,t){this.tag=e,this.value=t}static some(e){return new w(!0,e)}static none(){return w.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?w.some(e(this.value)):w.none()}bind(e){return this.tag?e(this.value):w.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:w.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return u(e)?w.some(e):w.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}w.singletonNone=new w(!1);const y=t=>{const n=e(w.none()),r=()=>n.get().each(t);return{clear:()=>{r(),n.set(w.none())},isSet:()=>n.get().isSome(),get:()=>n.get(),set:e=>{r(),n.set(w.some(e))}}},b=()=>y((e=>e.unbind())),S=Array.prototype.push,x=(e,t)=>{const n=e.length,r=new Array(n);for(let o=0;o{for(let n=0,r=e.length;n{const n=[];for(let r=0,o=e.length;r((e,t,n)=>{for(let r=0,o=e.length;r{const o=e.indexOf(t,n);return-1!==o&&(!!c(r)||o+t.length<=r)},C=e=>void 0!==e.style&&d(e.style.getPropertyValue),A=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},R=A;"undefined"!=typeof window?window:Function("return this;")();const L=e=>t=>(e=>e.dom.nodeType)(t)===e,M=L(1),N=L(3),P=L(9),D=L(11),W=(e,t)=>{const n=e.dom;if(1!==n.nodeType)return!1;{const e=n;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}},q=e=>R(e.dom.ownerDocument),H=e=>x(e.dom.childNodes,R),I=d(Element.prototype.attachShadow)&&d(Node.prototype.getRootNode),B=g(I),V=I?e=>R(e.dom.getRootNode()):e=>P(e)?e:q(e),_=e=>{const t=V(e);return D(n=t)&&u(n.dom.host)?w.some(t):w.none();var n},j=e=>R(e.dom.host),z=e=>{const t=N(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;const n=t.ownerDocument;return _(R(t)).fold((()=>n.body.contains(t)),(r=z,o=j,e=>r(o(e))));var r,o},$=(e,t)=>{const n=e.dom.getAttribute(t);return null===n?void 0:n},U=(e,t)=>{e.dom.removeAttribute(t)},K=(e,t)=>{const n=e.dom;((e,t)=>{const n=T(e);for(let r=0,o=n.length;r{((e,t,n)=>{if(!s(n))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",n,":: Element ",e),new Error("CSS value must be a string: "+n);C(e)&&e.style.setProperty(t,n)})(n,t,e)}))},X=e=>{const t=R((e=>{if(B()&&u(e.target)){const t=R(e.target);if(M(t)&&u(t.dom.shadowRoot)&&e.composed&&e.composedPath){const t=e.composedPath();if(t)return((e,t)=>0e.stopPropagation(),r=()=>e.preventDefault(),o=(s=r,i=n,(...e)=>s(i.apply(null,e)));var s,i;return((e,t,n,r,o,s,i)=>({target:e,x:t,y:n,stop:r,prevent:o,kill:s,raw:i}))(t,e.clientX,e.clientY,n,r,o,e)},Y=(e,t,n,r)=>{e.dom.removeEventListener(t,n,r)},G=v,J=(e,t,n)=>((e,t,n,r)=>((e,t,n,r,o)=>{const s=((e,t)=>n=>{e(n)&&t(X(n))})(n,r);return e.dom.addEventListener(t,s,o),{unbind:p(Y,e,t,s,o)}})(e,t,n,r,!1))(e,t,G,n),Q=()=>Z(0,0),Z=(e,t)=>({major:e,minor:t}),ee={nu:Z,detect:(e,t)=>{const n=String(t).toLowerCase();return 0===e.length?Q():((e,t)=>{const n=((e,t)=>{for(let n=0;nNumber(t.replace(n,"$"+e));return Z(r(1),r(2))})(e,n)},unknown:Q},te=(e,t)=>{const n=String(t).toLowerCase();return O(e,(e=>e.search(n)))},ne=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,re=e=>t=>k(t,e),oe=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:e=>k(e,"edge/")&&k(e,"chrome")&&k(e,"safari")&&k(e,"applewebkit")},{name:"Chromium",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,ne],search:e=>k(e,"chrome")&&!k(e,"chromeframe")},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:e=>k(e,"msie")||k(e,"trident")},{name:"Opera",versionRegexes:[ne,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:re("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:re("firefox")},{name:"Safari",versionRegexes:[ne,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:e=>(k(e,"safari")||k(e,"mobile/"))&&k(e,"applewebkit")}],se=[{name:"Windows",search:re("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:e=>k(e,"iphone")||k(e,"ipad"),versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:re("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"macOS",search:re("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:re("linux"),versionRegexes:[]},{name:"Solaris",search:re("sunos"),versionRegexes:[]},{name:"FreeBSD",search:re("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:re("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}],ie={browsers:g(oe),oses:g(se)},le="Edge",ae="Chromium",ce="Opera",ue="Firefox",de="Safari",me=e=>{const t=e.current,n=e.version,r=e=>()=>t===e;return{current:t,version:n,isEdge:r(le),isChromium:r(ae),isIE:r("IE"),isOpera:r(ce),isFirefox:r(ue),isSafari:r(de)}},he=()=>me({current:void 0,version:ee.unknown()}),ge=me,pe=(g(le),g(ae),g("IE"),g(ce),g(ue),g(de),"Windows"),fe="Android",ve="Linux",we="macOS",ye="Solaris",be="FreeBSD",Se="ChromeOS",xe=e=>{const t=e.current,n=e.version,r=e=>()=>t===e;return{current:t,version:n,isWindows:r(pe),isiOS:r("iOS"),isAndroid:r(fe),isMacOS:r(we),isLinux:r(ve),isSolaris:r(ye),isFreeBSD:r(be),isChromeOS:r(Se)}},Ee=()=>xe({current:void 0,version:ee.unknown()}),Fe=xe,Oe=(g(pe),g("iOS"),g(fe),g(ve),g(we),g(ye),g(be),g(Se),(e,t,n)=>{const r=ie.browsers(),o=ie.oses(),s=t.bind((e=>((e,t)=>((e,t)=>{for(let n=0;n{const n=t.brand.toLowerCase();return O(e,(e=>{var t;return n===(null===(t=e.brand)||void 0===t?void 0:t.toLowerCase())})).map((e=>({current:e.name,version:ee.nu(parseInt(t.version,10),0)})))})))(r,e))).orThunk((()=>((e,t)=>te(e,t).map((e=>{const n=ee.detect(e.versionRegexes,t);return{current:e.name,version:n}})))(r,e))).fold(he,ge),i=((e,t)=>te(e,t).map((e=>{const n=ee.detect(e.versionRegexes,t);return{current:e.name,version:n}})))(o,e).fold(Ee,Fe),l=((e,t,n,r)=>{const o=e.isiOS()&&!0===/ipad/i.test(n),s=e.isiOS()&&!o,i=e.isiOS()||e.isAndroid(),l=i||r("(pointer:coarse)"),a=o||!s&&i&&r("(min-device-width:768px)"),c=s||i&&!a,u=t.isSafari()&&e.isiOS()&&!1===/safari/i.test(n),d=!c&&!a&&!u;return{isiPad:g(o),isiPhone:g(s),isTablet:g(a),isPhone:g(c),isTouch:g(l),isAndroid:e.isAndroid,isiOS:e.isiOS,isWebView:g(u),isDesktop:g(d)}})(i,s,e,n);return{browser:s,os:i,deviceType:l}}),Te=e=>window.matchMedia(e).matches;let ke=(e=>{let t,n=!1;return(...r)=>(n||(n=!0,t=e.apply(null,r)),t)})((()=>Oe(navigator.userAgent,w.from(navigator.userAgentData),Te)));const Ce=(e,t)=>({left:e,top:t,translate:(n,r)=>Ce(e+n,t+r)}),Ae=Ce,Re=e=>{const t=void 0===e?window:e;return ke().browser.isFirefox()?w.none():w.from(t.visualViewport)},Le=(e,t,n,r)=>({x:e,y:t,width:n,height:r,right:e+n,bottom:t+r}),Me=e=>{const t=void 0===e?window:e,n=t.document,r=(e=>{const t=void 0!==e?e.dom:document,n=t.body.scrollLeft||t.documentElement.scrollLeft,r=t.body.scrollTop||t.documentElement.scrollTop;return Ae(n,r)})(R(n));return Re(t).fold((()=>{const e=t.document.documentElement,n=e.clientWidth,o=e.clientHeight;return Le(r.left,r.top,n,o)}),(e=>Le(Math.max(e.pageLeft,r.left),Math.max(e.pageTop,r.top),e.width,e.height)))},Ne=(e,t,n)=>Re(n).map((n=>{const r=e=>t(X(e));return n.addEventListener(e,r),{unbind:()=>n.removeEventListener(e,r)}})).getOrThunk((()=>({unbind:h})));var Pe=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),De=tinymce.util.Tools.resolve("tinymce.Env");const We=(e,t)=>{e.dispatch("FullscreenStateChanged",{state:t}),e.dispatch("ResizeEditor")},qe=("fullscreen_native",e=>e.options.get("fullscreen_native"));const He=e=>{return e.dom===(void 0!==(t=q(e).dom).fullscreenElement?t.fullscreenElement:void 0!==t.msFullscreenElement?t.msFullscreenElement:void 0!==t.webkitFullscreenElement?t.webkitFullscreenElement:null);var t},Ie=(e,t,n)=>((e,t,n)=>F(((e,t)=>{const n=d(t)?t:f;let r=e.dom;const o=[];for(;null!==r.parentNode&&void 0!==r.parentNode;){const e=r.parentNode,t=R(e);if(o.push(t),!0===n(t))break;r=e}return o})(e,n),t))(e,(e=>W(e,t)),n),Be=(e,t)=>((e,n)=>{return F((e=>w.from(e.dom.parentNode).map(R))(r=e).map(H).map((e=>F(e,(e=>{return t=e,!(r.dom===t.dom);var t})))).getOr([]),(e=>W(e,t)));var r})(e),Ve="data-ephox-mobile-fullscreen-style",_e="position:absolute!important;",je="top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;",ze=De.os.isAndroid(),$e=e=>{const t=((e,t)=>{const n=e.dom,r=window.getComputedStyle(n).getPropertyValue(t);return""!==r||z(e)?r:((e,t)=>C(e)?e.style.getPropertyValue(t):"")(n,t)})(e,"background-color");return void 0!==t&&""!==t?"background-color:"+t+"!important":"background-color:rgb(255,255,255)!important;"},Ue=Pe.DOM,Ke=Re().fold((()=>({bind:h,unbind:h})),(e=>{const t=(()=>{const e=y(h);return{...e,on:t=>e.get().each(t)}})(),n=b(),r=b(),o=((e,t)=>{let n=null;return{cancel:()=>{l(n)||(clearTimeout(n),n=null)},throttle:(...t)=>{l(n)&&(n=setTimeout((()=>{n=null,e.apply(null,t)}),50))}}})((()=>{document.body.scrollTop=0,document.documentElement.scrollTop=0,window.requestAnimationFrame((()=>{t.on((t=>K(t,{top:e.offsetTop+"px",left:e.offsetLeft+"px",height:e.height+"px",width:e.width+"px"})))}))}));return{bind:e=>{t.set(e),o.throttle(),n.set(Ne("resize",o.throttle)),r.set(Ne("scroll",o.throttle))},unbind:()=>{t.on((()=>{n.clear(),r.clear()})),t.clear()}}})),Xe=(e,t)=>{const n=document.body,r=document.documentElement,o=e.getContainer(),l=R(o),c=(e=>{const t=R(e.getElement());return _(t).map(j).getOrThunk((()=>(e=>{const t=e.dom.body;if(null==t)throw new Error("Body is not available yet");return R(t)})(q(t))))})(e),u=t.get(),d=R(e.getBody()),h=De.deviceType.isTouch(),g=o.style,p=e.iframeElement,f=null==p?void 0:p.style,v=e=>{e(n,"tox-fullscreen"),e(r,"tox-fullscreen"),e(o,"tox-fullscreen"),_(l).map((e=>j(e).dom)).each((t=>{e(t,"tox-fullscreen"),e(t,"tox-shadowhost")}))},y=()=>{h&&(e=>{const t=((e,t)=>{const n=document;return 1!==(r=n).nodeType&&9!==r.nodeType&&11!==r.nodeType||0===r.childElementCount?[]:x(n.querySelectorAll(e),R);var r})("["+Ve+"]");E(t,(t=>{const n=$(t,Ve);n&&"no-styles"!==n?K(t,e.parseStyle(n)):U(t,"style"),U(t,Ve)}))})(e.dom),v(Ue.removeClass),Ke.unbind(),w.from(t.get()).each((e=>e.fullscreenChangeHandler.unbind()))};if(u)u.fullscreenChangeHandler.unbind(),qe(e)&&He(c)&&(e=>{const t=e.dom;t.exitFullscreen?t.exitFullscreen():t.msExitFullscreen?t.msExitFullscreen():t.webkitCancelFullScreen&&t.webkitCancelFullScreen()})(q(c)),f.width=u.iframeWidth,f.height=u.iframeHeight,g.width=u.containerWidth,g.height=u.containerHeight,g.top=u.containerTop,g.left=u.containerLeft,y(),b=u.scrollPos,window.scrollTo(b.x,b.y),t.set(null),We(e,!1),e.off("remove",y);else{const n=J(q(c),void 0!==document.fullscreenElement?"fullscreenchange":void 0!==document.msFullscreenElement?"MSFullscreenChange":void 0!==document.webkitFullscreenElement?"webkitfullscreenchange":"fullscreenchange",(n=>{qe(e)&&(He(c)||null===t.get()||Xe(e,t))})),r={scrollPos:Me(window),containerWidth:g.width,containerHeight:g.height,containerTop:g.top,containerLeft:g.left,iframeWidth:f.width,iframeHeight:f.height,fullscreenChangeHandler:n};h&&((e,t,n)=>{const r=t=>n=>{const r=$(n,"style"),o=void 0===r?"no-styles":r.trim();o!==t&&(((e,t,n)=>{((e,t,n)=>{if(!(s(n)||a(n)||m(n)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",n,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,n+"")})(e.dom,t,n)})(n,Ve,o),K(n,e.parseStyle(t)))},o=Ie(t,"*"),l=(e=>{const t=[];for(let n=0,r=e.length;nBe(e,"*:not(.tox-silver-sink)")))),c=$e(n);E(l,r("display:none!important;")),E(o,r(_e+je+c)),r((!0===ze?"":_e)+je+c)(t)})(e.dom,l,d),f.width=f.height="100%",g.width=g.height="",v(Ue.addClass),Ke.bind(l),e.on("remove",y),t.set(r),qe(e)&&(e=>{const t=e.dom;t.requestFullscreen?t.requestFullscreen():t.msRequestFullscreen?t.msRequestFullscreen():t.webkitRequestFullScreen&&t.webkitRequestFullScreen()})(c),We(e,!0)}var b},Ye=(e,t)=>n=>{n.setActive(null!==t.get());const r=e=>n.setActive(e.state);return e.on("FullscreenStateChanged",r),()=>e.off("FullscreenStateChanged",r)};t.add("fullscreen",(t=>{const n=e(null);return t.inline||((e=>{(0,e.options.register)("fullscreen_native",{processor:"boolean",default:!1})})(t),((e,t)=>{e.addCommand("mceFullScreen",(()=>{Xe(e,t)}))})(t,n),((e,t)=>{const n=()=>e.execCommand("mceFullScreen");e.ui.registry.addToggleMenuItem("fullscreen",{text:"Fullscreen",icon:"fullscreen",shortcut:"Meta+Shift+F",onAction:n,onSetup:Ye(e,t)}),e.ui.registry.addToggleButton("fullscreen",{tooltip:"Fullscreen",icon:"fullscreen",onAction:n,onSetup:Ye(e,t)})})(t,n),t.addShortcut("Meta+Shift+F","","mceFullScreen")),(e=>({isFullscreen:()=>null!==e.get()}))(n)}))}(); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/ar.js b/static/js/tinymce/plugins/help/js/i18n/keynav/ar.js new file mode 100644 index 0000000..e6ae0e8 --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/ar.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.ar', +'

      بدء التنقل بواسطة لوحة المÙاتيح

      \n' + + '\n' + + '
      \n' + + '
      التركيز على شريط القوائم
      \n' + + '
      نظاما التشغيل Windows أو Linux: Alt + F9
      \n' + + '
      نظام التشغيل macOS: ⌥F9
      \n' + + '
      التركيز على شريط الأدوات
      \n' + + '
      نظاما التشغيل Windows أو Linux: Alt + F10
      \n' + + '
      نظام التشغيل macOS: ⌥F10
      \n' + + '
      التركيز على التذييل
      \n' + + '
      نظاما التشغيل Windows أو Linux: Alt + F11
      \n' + + '
      نظام التشغيل macOS: ⌥F11
      \n' + + '
      التركيز على شريط أدوات السياق
      \n' + + '
      أنظمة التشغيل Windows أو Linux أو macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      سيبدأ التنقل عند عنصر واجهة المستخدم الأول، والذي سيتم تمييزه أو تسطيره ÙÙŠ حالة العنصر الأول ÙÙŠ\n' + + ' مسار عنصر التذييل.

      \n' + + '\n' + + '

      التنقل بين أقسام واجهة المستخدم

      \n' + + '\n' + + '

      للانتقال من أحد أقسام واجهة المستخدم إلى القسم التالي، اضغط على Tab.

      \n' + + '\n' + + '

      للانتقال من أحد أقسام واجهة المستخدم إلى القسم السابق، اضغط على Shift+Tab.

      \n' + + '\n' + + '

      ترتيب علامات Tab لأقسام واجهة المستخدم هذه هو:\n' + + '\n' + + '

        \n' + + '
      1. شريط القوائم
      2. \n' + + '
      3. كل مجموعة شريط الأدوات
      4. \n' + + '
      5. الشريط الجانبي
      6. \n' + + '
      7. مسار العنصر ÙÙŠ التذييل
      8. \n' + + '
      9. زر تبديل عدد الكلمات ÙÙŠ التذييل
      10. \n' + + '
      11. رابط إدراج العلامة التجارية ÙÙŠ التذييل
      12. \n' + + '
      13. مؤشر تغيير حجم المحرر ÙÙŠ التذييل
      14. \n' + + '
      \n' + + '\n' + + '

      إذا لم يكن قسم واجهة المستخدم موجودًا، Ùسيتم تخطيه.

      \n' + + '\n' + + '

      إذا كان التذييل يحتوي على التركيز على â€â€«Ø§Ù„تنقل بواسطة لوحة المÙاتيح، ولا يوجد شريط جانبي مرئي، Ùإن الضغط على Shift+Tab\n' + + ' ينقل التركيز إلى مجموعة شريط الأدوات الأولى، وليس الأخيرة.\n' + + '\n' + + '

      التنقل بين أقسام واجهة المستخدم

      \n' + + '\n' + + '

      للانتقال من أحد عناصر واجهة المستخدم إلى العنصر التالي، اضغط على Ù…Ùتاح السهم المناسب.

      \n' + + '\n' + + '

      Ù…Ùتاحا السهمين اليسار‎ واليمين‎

      \n' + + '\n' + + '
        \n' + + '
      • التنقل بين القوائم ÙÙŠ شريط القوائم.
      • \n' + + '
      • Ùتح قائمة Ùرعية ÙÙŠ القائمة.
      • \n' + + '
      • التنقل بين الأزرار ÙÙŠ مجموعة شريط الأدوات.
      • \n' + + '
      • التنقل بين العناصر ÙÙŠ مسار عنصر التذييل.
      • \n' + + '
      \n' + + '\n' + + '

      Ù…Ùتاحا السهمين لأسÙل‎ ولأعلى‎\n' + + '\n' + + '

        \n' + + '
      • التنقل بين عناصر القائمة ÙÙŠ القائمة.
      • \n' + + '
      • التنقل بين العناصر ÙÙŠ قائمة شريط الأدوات المنبثقة.
      • \n' + + '
      \n' + + '\n' + + '

      دورة Ù…Ùاتيح الأسهم‎ داخل قسم واجهة المستخدم التي تم التركيز عليها.

      \n' + + '\n' + + '

      لإغلاق قائمة Ù…Ùتوحة أو قائمة Ùرعية Ù…Ùتوحة أو قائمة منبثقة Ù…Ùتوحة، اضغط على Ù…Ùتاح Esc.\n' + + '\n' + + '

      إذا كان التركيز الحالي على "الجزء العلوي" من قسم معين لواجهة المستخدم، Ùإن الضغط على Ù…Ùتاح Esc يؤدي أيضًا إلى الخروج\n' + + ' من التنقل بواسطة لوحة المÙاتيح بالكامل.

      \n' + + '\n' + + '

      تنÙيذ عنصر قائمة أو زر شريط أدوات

      \n' + + '\n' + + '

      عندما يتم تمييز عنصر القائمة المطلوب أو زر شريط الأدوات، اضغط على زر ReturnØŒ أو EnterØŒ\n' + + ' أو Ù…Ùتاح المساÙØ© لتنÙيذ العنصر.\n' + + '\n' + + '

      التنقل ÙÙŠ مربعات الحوار غير المبوبة

      \n' + + '\n' + + '

      ÙÙŠ مربعات الحوار غير المبوبة، يتم التركيز على المكون التÙاعلي الأول عند Ùتح مربع الحوار.

      \n' + + '\n' + + '

      التنقل بين مكونات الحوار التÙاعلي بالضغط على زر Tab أو Shift+Tab.

      \n' + + '\n' + + '

      التنقل ÙÙŠ مربعات الحوار المبوبة

      \n' + + '\n' + + '

      ÙÙŠ مربعات الحوار المبوبة، يتم التركيز على الزر الأول ÙÙŠ قائمة علامات التبويب عند Ùتح مربع الحوار.

      \n' + + '\n' + + '

      التنقل بين المكونات التÙاعلية لعلامة التبويب لمربع الحوار هذه بالضغط على زر Tab أو\n' + + ' Shift+Tab.

      \n' + + '\n' + + '

      التبديل إلى علامة تبويب أخرى لمربع الحوار من خلال التركيز على قائمة علامة التبويب ثم الضغط على زر السهم المناسب\n' + + ' Ù…Ùتاح للتنقل بين علامات التبويب المتاحة.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/bg_BG.js b/static/js/tinymce/plugins/help/js/i18n/keynav/bg_BG.js new file mode 100644 index 0000000..ad904db --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/bg_BG.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.bg_BG', +'

      Ðачало на навигациÑта Ñ ÐºÐ»Ð°Ð²Ð¸Ð°Ñ‚ÑƒÑ€Ð°Ñ‚Ð°

      \n' + + '\n' + + '
      \n' + + '
      ФокуÑиране върху лентата Ñ Ð¼ÐµÐ½ÑŽÑ‚Ð°
      \n' + + '
      Windows или Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      ФокуÑиране върху лентата Ñ Ð¸Ð½Ñтрументи
      \n' + + '
      Windows или Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      ФокуÑиране върху Ð´Ð¾Ð»Ð½Ð¸Ñ ÐºÐ¾Ð»Ð¾Ð½Ñ‚Ð¸Ñ‚ÑƒÐ»
      \n' + + '
      Windows или Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      ФокуÑиране върху контекÑтуалната лента Ñ Ð¸Ð½Ñтрументи
      \n' + + '
      Windows, Linux или macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      ÐавигациÑта ще започне Ñ Ð¿ÑŠÑ€Ð²Ð¸Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚ на ПИ, който ще бъде маркиран или подчертан в ÑÐ»ÑƒÑ‡Ð°Ñ Ð½Ð° Ð¿ÑŠÑ€Ð²Ð¸Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚ в\n' + + ' Ð¿ÑŠÑ‚Ñ Ð´Ð¾ елемента в Ð´Ð¾Ð»Ð½Ð¸Ñ ÐºÐ¾Ð»Ð¾Ð½Ñ‚Ð¸Ñ‚ÑƒÐ».

      \n' + + '\n' + + '

      Ðавигиране между раздели на ПИ

      \n' + + '\n' + + '

      За да преминете от един раздел на ПИ към ÑледващиÑ, натиÑнете Tab.

      \n' + + '\n' + + '

      За да преминете от един раздел на ПИ към предишниÑ, натиÑнете Shift+Tab.

      \n' + + '\n' + + '

      Редът за обхождане Ñ Ñ‚Ð°Ð±ÑƒÐ»Ð°Ñ†Ð¸Ñ Ð½Ð° тези раздели на ПИ е:\n' + + '\n' + + '

        \n' + + '
      1. Лентата Ñ Ð¼ÐµÐ½ÑŽÑ‚Ð°
      2. \n' + + '
      3. Ð’ÑÑка група на лентата Ñ Ð¸Ð½Ñтрументи
      4. \n' + + '
      5. Страничната лента
      6. \n' + + '
      7. ПътÑÑ‚ до елемента в Ð´Ð¾Ð»Ð½Ð¸Ñ ÐºÐ¾Ð»Ð¾Ð½Ñ‚Ð¸Ñ‚ÑƒÐ»
      8. \n' + + '
      9. Бутонът за превключване на Ð±Ñ€Ð¾Ñ Ð½Ð° думите в Ð´Ð¾Ð»Ð½Ð¸Ñ ÐºÐ¾Ð»Ð¾Ð½Ñ‚Ð¸Ñ‚ÑƒÐ»
      10. \n' + + '
      11. Връзката за търговÑка марка в Ð´Ð¾Ð»Ð½Ð¸Ñ ÐºÐ¾Ð»Ð¾Ð½Ñ‚Ð¸Ñ‚ÑƒÐ»
      12. \n' + + '
      13. Манипулаторът за преоразмерÑване на редактора в Ð´Ð¾Ð»Ð½Ð¸Ñ ÐºÐ¾Ð»Ð¾Ð½Ñ‚Ð¸Ñ‚ÑƒÐ»
      14. \n' + + '
      \n' + + '\n' + + '

      Ðко нÑкой раздел на ПИ липÑва, той Ñе пропуÑка.

      \n' + + '\n' + + '

      Ðко долниÑÑ‚ колонтитул има Ñ„Ð¾ÐºÑƒÑ Ð·Ð° Ð½Ð°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ñ Ñ ÐºÐ»Ð°Ð²Ð¸Ð°Ñ‚ÑƒÑ€Ð°Ñ‚Ð° и нÑма Ñтранична лента, натиÑкането на Shift+Tab\n' + + ' премеÑтва фокуÑа към първата група на лентата Ñ Ð¸Ð½Ñтрументи, а не към поÑледната.\n' + + '\n' + + '

      Ðавигиране в разделите на ПИ

      \n' + + '\n' + + '

      За да преминете от един елемент на ПИ към ÑледващиÑ, натиÑнете ÑÑŠÐ¾Ñ‚Ð²ÐµÑ‚Ð½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ ÑÑŠÑ Ñтрелка.

      \n' + + '\n' + + '

      С клавишите ÑÑŠÑ Ñтрелка налÑво и надÑÑно

      \n' + + '\n' + + '
        \n' + + '
      • Ñе придвижвате между менютата в лентата Ñ Ð¼ÐµÐ½ÑŽÑ‚Ð¾;
      • \n' + + '
      • отварÑте подменю в меню;
      • \n' + + '
      • Ñе придвижвате между бутоните в група на лентата Ñ Ð¸Ð½Ñтрументи;
      • \n' + + '
      • Ñе придвижвате между елементи в Ð¿ÑŠÑ‚Ñ Ð´Ð¾ елемент в Ð´Ð¾Ð»Ð½Ð¸Ñ ÐºÐ¾Ð»Ð¾Ð½Ñ‚Ð¸Ñ‚ÑƒÐ».
      • \n' + + '
      \n' + + '\n' + + '

      С клавишите ÑÑŠÑ Ñтрелка надолу и нагоре\n' + + '\n' + + '

        \n' + + '
      • Ñе придвижвате между елементите от менюто в дадено меню;
      • \n' + + '
      • Ñе придвижвате между елементите в изÑкачащо меню на лентата Ñ Ð¸Ð½Ñтрументи.
      • \n' + + '
      \n' + + '\n' + + '

      Клавишите ÑÑŠÑ Ñтрелки Ñе придвижват в рамките на фокуÑÐ¸Ñ€Ð°Ð½Ð¸Ñ Ñ€Ð°Ð·Ð´ÐµÐ» на ПИ.

      \n' + + '\n' + + '

      За да затворите отворено меню, подменю или изÑкачащо меню, натиÑнете клавиша Esc.\n' + + '\n' + + '

      Ðко текущиÑÑ‚ Ñ„Ð¾ÐºÑƒÑ Ðµ върху „горната чаÑт“ на конкретен раздел на ПИ, натиÑкането на клавиша Esc Ñъщо излиза\n' + + ' напълно от навигациÑта Ñ ÐºÐ»Ð°Ð²Ð¸Ð°Ñ‚ÑƒÑ€Ð°Ñ‚Ð°.

      \n' + + '\n' + + '

      Изпълнение на елемент от менюто или бутон от лентата Ñ Ð¸Ð½Ñтрументи

      \n' + + '\n' + + '

      Когато желаниÑÑ‚ елемент от менюто или бутон от лентата Ñ Ð¸Ð½Ñтрументи е маркиран, натиÑнете Return, Enter\n' + + ' или клавиша за интервал, за да изпълните елемента.\n' + + '\n' + + '

      Ðавигиране в диалогови прозорци без раздели

      \n' + + '\n' + + '

      Ð’ диалоговите прозорци без раздели първиÑÑ‚ интерактивен компонент Ñе фокуÑира, когато Ñе отвори диалоговиÑÑ‚ прозорец.

      \n' + + '\n' + + '

      Ðавигирайте между интерактивните компоненти на Ð´Ð¸Ð°Ð»Ð¾Ð³Ð¾Ð²Ð¸Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ†, като натиÑнете Tab или Shift+Tab.

      \n' + + '\n' + + '

      Ðавигиране в диалогови прозорци Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸

      \n' + + '\n' + + '

      Ð’ диалоговите прозорци Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸ първиÑÑ‚ бутон в менюто Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸ Ñе фокуÑира, когато Ñе отвори диалоговиÑÑ‚ прозорец.

      \n' + + '\n' + + '

      Ðавигирайте между интерактивните компоненти на този диалогов раздел, като натиÑнете Tab или\n' + + ' Shift+Tab.

      \n' + + '\n' + + '

      Превключете към друг диалогов раздел, като фокуÑирате върху менюто Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸ и Ñлед това натиÑнете ÑÑŠÐ¾Ñ‚Ð²ÐµÑ‚Ð½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ ÑÑŠÑ Ñтрелка,\n' + + ' за да преминете през наличните раздели.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/ca.js b/static/js/tinymce/plugins/help/js/i18n/keynav/ca.js new file mode 100644 index 0000000..6d9ad54 --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/ca.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.ca', +'

      Inici de la navegació amb el teclat

      \n' + + '\n' + + '
      \n' + + '
      Enfocar la barra de menús
      \n' + + '
      Windows o Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + "
      Enfocar la barra d'eines
      \n" + + '
      Windows o Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Enfocar el peu de pàgina
      \n' + + '
      Windows o Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + "
      Enfocar una barra d'eines contextual
      \n" + + '
      Windows, Linux o macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + "

      La navegació començarà en el primer element de la interfície d'usuari, que es ressaltarà o subratllarà per al primer element a\n" + + " la ruta de l'element de peu de pàgina.

      \n" + + '\n' + + "

      Navegació entre seccions de la interfície d'usuari

      \n" + + '\n' + + "

      Per desplaçar-vos des d'una secció de la interfície d'usuari a la següent, premeu la tecla Tab.

      \n" + + '\n' + + "

      Per desplaçar-vos des d'una secció de la interfície d'usuari a l'anterior, premeu les tecles Maj+Tab.

      \n" + + '\n' + + "

      L'ordre en prémer la tecla Tab d'aquestes secciones de la interfície d'usuari és:\n" + + '\n' + + '

        \n' + + '
      1. Barra de menús
      2. \n' + + "
      3. Cada grup de la barra d'eines
      4. \n" + + '
      5. Barra lateral
      6. \n' + + "
      7. Ruta de l'element del peu de pàgina
      8. \n" + + '
      9. Botó de commutació de recompte de paraules al peu de pàgina
      10. \n' + + '
      11. Enllaç de marca del peu de pàgina
      12. \n' + + "
      13. Control de canvi de mida de l'editor al peu de pàgina
      14. \n" + + '
      \n' + + '\n' + + "

      Si no hi ha una secció de la interfície d'usuari, s'ometrà.

      \n" + + '\n' + + '

      Si el peu de pàgina té el focus de navegació del teclat i no hi ha cap barra lateral visible, en prémer Maj+Tab\n' + + " el focus es mou al primer grup de la barra d'eines, no l'últim.\n" + + '\n' + + "

      Navegació dins de les seccions de la interfície d'usuari

      \n" + + '\n' + + "

      Per desplaçar-vos des d'un element de la interfície d'usuari al següent, premeu la tecla de Fletxa adequada.

      \n" + + '\n' + + '

      Les tecles de fletxa Esquerra i Dreta

      \n' + + '\n' + + '
        \n' + + '
      • us permeten desplaçar-vos entre menús de la barra de menús.
      • \n' + + '
      • obren un submenú en un menú.
      • \n' + + "
      • us permeten desplaçar-vos entre botons d'un grup de la barra d'eines.
      • \n" + + "
      • us permeten desplaçar-vos entre elements de la ruta d'elements del peu de pàgina.
      • \n" + + '
      \n' + + '\n' + + '

      Les tecles de fletxa Avall i Amunt\n' + + '\n' + + '

        \n' + + "
      • us permeten desplaçar-vos entre elements de menú d'un menú.
      • \n" + + "
      • us permeten desplaçar-vos entre elements d'un menú emergent de la barra d'eines.
      • \n" + + '
      \n' + + '\n' + + "

      Les tecles de Fletxa us permeten desplaçar-vos dins de la secció de la interfície d'usuari que té el focus.

      \n" + + '\n' + + '

      Per tancar un menú, un submenú o un menú emergent oberts, premeu la tecla Esc.\n' + + '\n' + + "

      Si el focus actual es troba a la ‘part superior’ d'una secció específica de la interfície d'usuari, en prémer la tecla Esc també es tanca\n" + + ' completament la navegació amb el teclat.

      \n' + + '\n' + + "

      Execució d'un element de menú o d'un botó de la barra d'eines

      \n" + + '\n' + + "

      Quan l'element del menú o el botó de la barra d'eines que desitgeu estigui ressaltat, premeu Retorn, Intro\n" + + " o la barra d'espai per executar l'element.\n" + + '\n' + + '

      Navegació per quadres de diàleg sense pestanyes

      \n' + + '\n' + + "

      En els quadres de diàleg sense pestanyes, el primer component interactiu pren el focus quan s'obre el quadre diàleg.

      \n" + + '\n' + + '

      Premeu la tecla Tab o les tecles Maj+Tab per desplaçar-vos entre components interactius del quadre de diàleg.

      \n' + + '\n' + + '

      Navegació per quadres de diàleg amb pestanyes

      \n' + + '\n' + + "

      En els quadres de diàleg amb pestanyes, el primer botó del menú de la pestanya pren el focus quan s'obre el quadre diàleg.

      \n" + + '\n' + + "

      Per desplaçar-vos entre components interactius d'aquest quadre de diàleg, premeu la tecla Tab o\n" + + ' les tecles Maj+Tab.

      \n' + + '\n' + + "

      Canvieu a la pestanya d'un altre quadre de diàleg, tot enfocant el menú de la pestanya, i després premeu la tecla Fletxa adequada\n" + + ' per canviar entre les pestanyes disponibles.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/cs.js b/static/js/tinymce/plugins/help/js/i18n/keynav/cs.js new file mode 100644 index 0000000..e9103f7 --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/cs.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.cs', +'

      ZaÄínáme navigovat pomocí klávesnice

      \n' + + '\n' + + '
      \n' + + '
      Přejít na řádek nabídek
      \n' + + '
      Windows nebo Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Přejít na panel nástrojů
      \n' + + '
      Windows nebo Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Přejít na zápatí
      \n' + + '
      Windows nebo Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Přejít na kontextový panel nástrojů
      \n' + + '
      Windows, Linux nebo macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      Navigace zaÄne u první položky uživatelského rozhraní, která bude zvýraznÄ›na nebo v případÄ› první položky\n' + + ' cesty k prvku zápatí podtržena.

      \n' + + '\n' + + '

      Navigace mezi oddíly uživatelského rozhraní

      \n' + + '\n' + + '

      Stisknutím klávesy Tab se posunete z jednoho oddílu uživatelského rozhraní na další.

      \n' + + '\n' + + '

      Stisknutím kláves Shift+Tab se posunete z jednoho oddílu uživatelského rozhraní na předchozí.

      \n' + + '\n' + + '

      Pořadí přepínání mezi oddíly uživatelského rozhraní pomocí klávesy Tab:\n' + + '\n' + + '

        \n' + + '
      1. Řádek nabídek
      2. \n' + + '
      3. Každá skupina panelu nástrojů
      4. \n' + + '
      5. BoÄní panel
      6. \n' + + '
      7. Cesta k prvku v zápatí.
      8. \n' + + '
      9. TlaÄítko pÅ™epínaÄe poÄtu slov v zápatí
      10. \n' + + '
      11. Odkaz na informace o znaÄce v zápatí
      12. \n' + + '
      13. Úchyt pro změnu velikosti editoru v zápatí
      14. \n' + + '
      \n' + + '\n' + + '

      Pokud nÄ›jaký oddíl uživatelského rozhraní není přítomen, je pÅ™eskoÄen.

      \n' + + '\n' + + '

      Pokud je zápatí vybrané pro navigaci pomocí klávesnice a není zobrazen žádný boÄní panel, stisknutím kláves Shift+Tab\n' + + ' pÅ™ejdete na první skupinu panelu nástrojů, nikoli na poslední.\n' + + '\n' + + '

      Navigace v rámci oddílů uživatelského rozhraní

      \n' + + '\n' + + '

      Chcete-li se přesunout z jednoho prvku uživatelského rozhraní na další, stiskněte příslušnou klávesu s šipkou.

      \n' + + '\n' + + '

      Klávesy s šipkou vlevo a vpravo

      \n' + + '\n' + + '
        \n' + + '
      • umožňují pÅ™esun mezi nabídkami na řádku nabídek;
      • \n' + + '
      • otevírají podnabídku nabídky;
      • \n' + + '
      • umožňují pÅ™esun mezi tlaÄítky ve skupinÄ› panelu nástrojů;
      • \n' + + '
      • umožňují pÅ™esun mezi položkami cesty prvku v zápatí.
      • \n' + + '
      \n' + + '\n' + + '

      Klávesy se šipkou dolů a nahoru\n' + + '\n' + + '

        \n' + + '
      • umožňují pÅ™esun mezi položkami nabídky;
      • \n' + + '
      • umožňují pÅ™esun mezi položkami místní nabídky panelu nástrojů.
      • \n' + + '
      \n' + + '\n' + + '

      Šipky provádí přepínání v rámci vybraného oddílu uživatelského rozhraní.

      \n' + + '\n' + + '

      Chcete-li zavřít otevřenou nabídku, podnabídku nebo místní nabídku, stiskněte klávesu Esc.\n' + + '\n' + + '

      Pokud je aktuálnÄ› vybrána horní Äást oddílu uživatelského rozhraní, stisknutím klávesy Esc zcela ukonÄíte také\n' + + ' navigaci pomocí klávesnice.

      \n' + + '\n' + + '

      Provedení příkazu položky nabídky nebo tlaÄítka panelu nástrojů

      \n' + + '\n' + + '

      Pokud je zvýraznÄ›na požadovaná položka nabídky nebo tlaÄítko panelu nástrojů, stisknutím klávesy Return, Enter\n' + + ' nebo mezerníku provedete přísluÅ¡ný příkaz.\n' + + '\n' + + '

      Navigace v dialogových oknech bez záložek

      \n' + + '\n' + + '

      Při otevření dialogových oken bez záložek přejdete na první interaktivní komponentu.

      \n' + + '\n' + + '

      Přecházet mezi interaktivními komponentami dialogového okna můžete stisknutím klávesy Tab nebo kombinace Shift+Tab.

      \n' + + '\n' + + '

      Navigace v dialogových oknech se záložkami

      \n' + + '\n' + + '

      PÅ™i otevÅ™ení dialogových oken se záložkami pÅ™ejdete na první tlaÄítko v nabídce záložek.

      \n' + + '\n' + + '

      Přecházet mezi interaktivními komponentami této záložky dialogového okna můžete stisknutím klávesy Tab nebo\n' + + ' kombinace Shift+Tab.

      \n' + + '\n' + + '

      Chcete-li přepnout na další záložku dialogového okna, přejděte na nabídku záložek a poté můžete stisknutím požadované šipky\n' + + ' přepínat mezi dostupnými záložkami.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/da.js b/static/js/tinymce/plugins/help/js/i18n/keynav/da.js new file mode 100644 index 0000000..f3989a0 --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/da.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.da', +'

      Start tastaturnavigation

      \n' + + '\n' + + '
      \n' + + '
      Fokuser på menulinjen
      \n' + + '
      Windows eller Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Fokuser på værktøjslinjen
      \n' + + '
      Windows eller Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Fokuser på sidefoden
      \n' + + '
      Windows eller Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Fokuser på kontekstuel værktøjslinje
      \n' + + '
      Windows, Linux eller macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      Navigationen starter ved det første UI-element, som fremhæves eller understreges hvad angår det første element i\n' + + ' sidefodens sti til elementet.

      \n' + + '\n' + + '

      Naviger mellem UI-sektioner

      \n' + + '\n' + + '

      Gå fra én UI-sektion til den næste ved at trykke på Tab.

      \n' + + '\n' + + '

      Gå fra én UI-sektion til den forrige ved at trykke på Shift+Tab.

      \n' + + '\n' + + '

      Tab-rækkefølgen af disse UI-sektioner er:\n' + + '\n' + + '

        \n' + + '
      1. Menulinje
      2. \n' + + '
      3. Hver værktøjsgruppe
      4. \n' + + '
      5. Sidepanel
      6. \n' + + '
      7. Sti til elementet i sidefoden
      8. \n' + + '
      9. Til/fra-knap for ordoptælling i sidefoden
      10. \n' + + '
      11. Brandinglink i sidefoden
      12. \n' + + '
      13. Tilpasningshåndtag for editor i sidefoden
      14. \n' + + '
      \n' + + '\n' + + '

      Hvis en UI-sektion ikke er til stede, springes den over.

      \n' + + '\n' + + '

      Hvis sidefoden har fokus til tastaturnavigation, og der ikke er noget synligt sidepanel, kan der trykkes på Shift+Tab\n' + + ' for at flytte fokus til den første værktøjsgruppe, ikke den sidste.\n' + + '\n' + + '

      Naviger inden for UI-sektioner

      \n' + + '\n' + + '

      Gå fra ét UI-element til det næste ved at trykke på den relevante piletast.

      \n' + + '\n' + + '

      Venstre og højre piletast

      \n' + + '\n' + + '
        \n' + + '
      • flytter mellem menuerne i menulinjen.
      • \n' + + '
      • Ã¥bner en undermenu i en menu.
      • \n' + + '
      • flytter mellem knapperne i en værktøjsgruppe.
      • \n' + + '
      • flytter mellem elementer i sidefodens sti til elementet.
      • \n' + + '
      \n' + + '\n' + + '

      Pil ned og op\n' + + '\n' + + '

        \n' + + '
      • flytter mellem menupunkterne i en menu.
      • \n' + + '
      • flytter mellem punkterne i en genvejsmenu i værktøjslinjen.
      • \n' + + '
      \n' + + '\n' + + '

      Piletasterne kører rundt inden for UI-sektionen, der fokuseres på.

      \n' + + '\n' + + '

      For at lukke en åben menu, en åben undermenu eller en åben genvejsmenu trykkes der på Esc-tasten.\n' + + '\n' + + "

      Hvis det aktuelle fokus er i 'toppen' af en bestemt UI-sektion, vil tryk på Esc-tasten også afslutte\n" + + ' tastaturnavigationen helt.

      \n' + + '\n' + + '

      Udfør et menupunkt eller en værktøjslinjeknap

      \n' + + '\n' + + '

      Når det ønskede menupunkt eller den ønskede værktøjslinjeknap er fremhævet, trykkes der på Retur, Enter\n' + + ' eller mellemrumstasten for at udføre elementet.\n' + + '\n' + + '

      Naviger i ikke-faneopdelte dialogbokse

      \n' + + '\n' + + '

      I ikke-faneopdelte dialogbokse får den første interaktive komponent fokus, når dialogboksen åbnes.

      \n' + + '\n' + + '

      Naviger mellem interaktive dialogbokskomponenter ved at trykke på Tab eller Shift+Tab.

      \n' + + '\n' + + '

      Naviger i faneopdelte dialogbokse

      \n' + + '\n' + + '

      I faneopdelte dialogbokse får den første knap i fanemenuen fokus, når dialogboksen åbnes.

      \n' + + '\n' + + '

      Naviger mellem interaktive komponenter i denne dialogboksfane ved at trykke på Tab eller\n' + + ' Shift+Tab.

      \n' + + '\n' + + '

      Skift til en anden dialogboksfane ved at fokusere på fanemenuen og derefter trykke på den relevante piletast\n' + + ' for at køre igennem de tilgængelige faner.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/de.js b/static/js/tinymce/plugins/help/js/i18n/keynav/de.js new file mode 100644 index 0000000..9f0c5db --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/de.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.de', +'

      Grundlagen der Tastaturnavigation

      \n' + + '\n' + + '
      \n' + + '
      Fokus auf Menüleiste
      \n' + + '
      Windows oder Linux: ALT+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Fokus auf Symbolleiste
      \n' + + '
      Windows oder Linux: ALT+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Fokus auf Fußzeile
      \n' + + '
      Windows oder Linux: ALT+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Fokus auf kontextbezogene Symbolleiste
      \n' + + '
      Windows, Linux oder macOS: STRG+F9\n' + + '
      \n' + + '\n' + + '

      Die Navigation beginnt beim ersten Benutzeroberflächenelement, welches hervorgehoben ist. Falls sich das erste Element im Pfad der Fußzeile befindet,\n' + + ' ist es unterstrichen.

      \n' + + '\n' + + '

      Zwischen Abschnitten der Benutzeroberfläche navigieren

      \n' + + '\n' + + '

      Um von einem Abschnitt der Benutzeroberfläche zum nächsten zu wechseln, drücken Sie TAB.

      \n' + + '\n' + + '

      Um von einem Abschnitt der Benutzeroberfläche zum vorherigen zu wechseln, drücken Sie UMSCHALT+TAB.

      \n' + + '\n' + + '

      Die Abschnitte der Benutzeroberfläche haben folgende TAB-Reihenfolge:\n' + + '\n' + + '

        \n' + + '
      1. Menüleiste
      2. \n' + + '
      3. Einzelne Gruppen der Symbolleiste
      4. \n' + + '
      5. Randleiste
      6. \n' + + '
      7. Elementpfad in der Fußzeile
      8. \n' + + '
      9. Umschaltfläche „Wörter zählen“ in der Fußzeile
      10. \n' + + '
      11. Branding-Link in der Fußzeile
      12. \n' + + '
      13. Editor-Ziehpunkt zur Größenänderung in der Fußzeile
      14. \n' + + '
      \n' + + '\n' + + '

      Falls ein Abschnitt der Benutzeroberflächen nicht vorhanden ist, wird er übersprungen.

      \n' + + '\n' + + '

      Wenn in der Fußzeile die Tastaturnavigation fokussiert ist und keine Randleiste angezeigt wird, wechselt der Fokus durch Drücken von UMSCHALT+TAB\n' + + ' zur ersten Gruppe der Symbolleiste, nicht zur letzten.\n' + + '\n' + + '

      Innerhalb von Abschnitten der Benutzeroberfläche navigieren

      \n' + + '\n' + + '

      Um von einem Element der Benutzeroberfläche zum nächsten zu wechseln, drücken Sie die entsprechende Pfeiltaste.

      \n' + + '\n' + + '

      Die Pfeiltasten Links und Rechts

      \n' + + '\n' + + '
        \n' + + '
      • wechseln zwischen Menüs in der Menüleiste.
      • \n' + + '
      • öffnen das Untermenü eines Menüs.
      • \n' + + '
      • wechseln zwischen Schaltflächen in einer Gruppe der Symbolleiste.
      • \n' + + '
      • wechseln zwischen Elementen im Elementpfad der Fußzeile.
      • \n' + + '
      \n' + + '\n' + + '

      Die Pfeiltasten Abwärts und Aufwärts\n' + + '\n' + + '

        \n' + + '
      • wechseln zwischen Menüelementen in einem Menü.
      • \n' + + '
      • wechseln zwischen Elementen in einem Popupmenü der Symbolleiste.
      • \n' + + '
      \n' + + '\n' + + '

      Die Pfeiltasten rotieren innerhalb des fokussierten Abschnitts der Benutzeroberfläche.

      \n' + + '\n' + + '

      Um ein geöffnetes Menü, ein geöffnetes Untermenü oder ein geöffnetes Popupmenü zu schließen, drücken Sie die ESC-Taste.\n' + + '\n' + + '

      Wenn sich der aktuelle Fokus ganz oben in einem bestimmten Abschnitt der Benutzeroberfläche befindet, wird durch Drücken der ESC-Taste auch\n' + + ' die Tastaturnavigation beendet.

      \n' + + '\n' + + '

      Ein Menüelement oder eine Symbolleistenschaltfläche ausführen

      \n' + + '\n' + + '

      Wenn das gewünschte Menüelement oder die gewünschte Symbolleistenschaltfläche hervorgehoben ist, drücken Sie Zurück, Eingabe\n' + + ' oder die Leertaste, um das Element auszuführen.\n' + + '\n' + + '

      In Dialogfeldern ohne Registerkarten navigieren

      \n' + + '\n' + + '

      In Dialogfeldern ohne Registerkarten ist beim Öffnen eines Dialogfelds die erste interaktive Komponente fokussiert.

      \n' + + '\n' + + '

      Navigieren Sie zwischen den interaktiven Komponenten eines Dialogfelds, indem Sie TAB oder UMSCHALT+TAB drücken.

      \n' + + '\n' + + '

      In Dialogfeldern mit Registerkarten navigieren

      \n' + + '\n' + + '

      In Dialogfeldern mit Registerkarten ist beim Öffnen eines Dialogfelds die erste Schaltfläche eines Registerkartenmenüs fokussiert.

      \n' + + '\n' + + '

      Navigieren Sie zwischen den interaktiven Komponenten auf dieser Registerkarte des Dialogfelds, indem Sie TAB oder\n' + + ' UMSCHALT+TAB drücken.

      \n' + + '\n' + + '

      Wechseln Sie zu einer anderen Registerkarte des Dialogfelds, indem Sie den Fokus auf das Registerkartenmenü legen und dann die entsprechende Pfeiltaste\n' + + ' drücken, um durch die verfügbaren Registerkarten zu rotieren.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/el.js b/static/js/tinymce/plugins/help/js/i18n/keynav/el.js new file mode 100644 index 0000000..df75ec2 --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/el.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.el', +'

      ΈναÏξη πλοήγησης μέσω πληκτÏολογίου

      \n' + + '\n' + + '
      \n' + + '
      Εστίαση στη γÏαμμή μενοÏ
      \n' + + '
      Windows ή Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Εστίαση στη γÏαμμή εÏγαλείων
      \n' + + '
      Windows ή Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Εστίαση στο υποσέλιδο
      \n' + + '
      Windows ή Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Εστίαση σε γÏαμμή εÏγαλείων βάσει πεÏιεχομένου
      \n' + + '
      Windows, Linux ή macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      Η πλοήγηση θα ξεκινήσει από το Ï€Ïώτο στοιχείο πεÏιβάλλοντος χÏήστη, που θα επισημαίνεται ή θα είναι υπογÏαμμισμένο,\n' + + ' όπως στην πεÏίπτωση της διαδÏομής του στοιχείου Υποσέλιδου.

      \n' + + '\n' + + '

      Πλοήγηση Î¼ÎµÏ„Î±Î¾Ï ÎµÎ½Î¿Ï„Î®Ï„Ï‰Î½ του πεÏιβάλλοντος χÏήστη

      \n' + + '\n' + + '

      Για να μετακινηθείτε από μια ενότητα πεÏιβάλλοντος χÏήστη στην επόμενη, πιέστε το πλήκτÏο Tab.

      \n' + + '\n' + + '

      Για να μετακινηθείτε από μια ενότητα πεÏιβάλλοντος χÏήστη στην Ï€ÏοηγοÏμενη, πιέστε τα πλήκτÏα Shift+Tab.

      \n' + + '\n' + + '

      Η σειÏά Tab αυτών των ενοτήτων πεÏιβάλλοντος χÏήστη είναι η εξής:\n' + + '\n' + + '

        \n' + + '
      1. ΓÏαμμή μενοÏ
      2. \n' + + '
      3. Κάθε ομάδα γÏαμμής εÏγαλείων
      4. \n' + + '
      5. Πλαϊνή γÏαμμή
      6. \n' + + '
      7. ΔιαδÏομή στοιχείου στο υποσέλιδο
      8. \n' + + '
      9. Κουμπί εναλλαγής μέτÏησης λέξεων στο υποσέλιδο
      10. \n' + + '
      11. ΣÏνδεσμος επωνυμίας στο υποσέλιδο
      12. \n' + + '
      13. Λαβή αλλαγής μεγέθους Ï€ÏογÏάμματος επεξεÏγασίας στο υποσέλιδο
      14. \n' + + '
      \n' + + '\n' + + '

      Εάν δεν εμφανίζεται ενότητα πεÏιβάλλοντος χÏήστη, παÏαλείπεται.

      \n' + + '\n' + + '

      Εάν η εστίαση πλοήγησης βÏίσκεται στο πληκτÏολόγιο και δεν υπάÏχει εμφανής πλαϊνή γÏαμμή, εάν πιέσετε Shift+Tab\n' + + ' η εστίαση μετακινείται στην Ï€Ïώτη ομάδα γÏαμμής εÏγαλείων, όχι στην τελευταία.\n' + + '\n' + + '

      Πλοήγηση εντός των ενοτήτων του πεÏιβάλλοντος χÏήστη

      \n' + + '\n' + + '

      Για να μετακινηθείτε από ένα στοιχείο πεÏιβάλλοντος χÏήστη στο επόμενο, πιέστε το αντίστοιχο πλήκτÏο βέλους.

      \n' + + '\n' + + '

      Με τα πλήκτÏα αÏιστεÏÎ¿Ï ÎºÎ±Î¹ Î´ÎµÎ¾Î¹Î¿Ï Î²Î­Î»Î¿Ï…Ï‚

      \n' + + '\n' + + '
        \n' + + '
      • γίνεται μετακίνηση Î¼ÎµÏ„Î±Î¾Ï Ï„Ï‰Î½ Î¼ÎµÎ½Î¿Ï ÏƒÏ„Î· γÏαμμή μενοÏ.
      • \n' + + '
      • ανοίγει ένα Ï…Ï€Î¿Î¼ÎµÎ½Î¿Ï ÏƒÎµ ένα μενοÏ.
      • \n' + + '
      • γίνεται μετακίνηση Î¼ÎµÏ„Î±Î¾Ï ÎºÎ¿Ï…Î¼Ï€Î¹ÏŽÎ½ σε μια ομάδα γÏαμμής εÏγαλείων.
      • \n' + + '
      • γίνεται μετακίνηση Î¼ÎµÏ„Î±Î¾Ï ÏƒÏ„Î¿Î¹Ï‡ÎµÎ¯Ï‰Î½ στη διαδÏομή στοιχείου στο υποσέλιδο.
      • \n' + + '
      \n' + + '\n' + + '

      Με τα πλήκτÏα επάνω και κάτω βέλους\n' + + '\n' + + '

        \n' + + '
      • γίνεται μετακίνηση Î¼ÎµÏ„Î±Î¾Ï Ï„Ï‰Î½ στοιχείων Î¼ÎµÎ½Î¿Ï ÏƒÎµ ένα μενοÏ.
      • \n' + + '
      • γίνεται μετακίνηση Î¼ÎµÏ„Î±Î¾Ï Ï„Ï‰Î½ στοιχείων Î¼ÎµÎ½Î¿Ï ÏƒÎµ ένα αναδυόμενο Î¼ÎµÎ½Î¿Ï Î³Ïαμμής εÏγαλείων.
      • \n' + + '
      \n' + + '\n' + + '

      Με τα πλήκτÏα βέλους γίνεται κυκλική μετακίνηση εντός της εστιασμένης ενότητας πεÏιβάλλοντος χÏήστη.

      \n' + + '\n' + + '

      Για να κλείσετε ένα ανοιχτό μενοÏ, ένα ανοιχτό Ï…Ï€Î¿Î¼ÎµÎ½Î¿Ï Î® ένα ανοιχτό αναδυόμενο μενοÏ, πιέστε το πλήκτÏο Esc.\n' + + '\n' + + '

      Εάν η Ï„Ïέχουσα εστίαση βÏίσκεται στην κοÏυφή μιας ενότητας πεÏιβάλλοντος χÏήστη, πιέζοντας το πλήκτÏο Esc,\n' + + ' γίνεται επίσης πλήÏης έξοδος από την πλοήγηση μέσω πληκτÏολογίου.

      \n' + + '\n' + + '

      Εκτέλεση ενός στοιχείου Î¼ÎµÎ½Î¿Ï Î® ÎºÎ¿Ï…Î¼Ï€Î¹Î¿Ï Î³Ïαμμής εÏγαλείων

      \n' + + '\n' + + '

      Όταν το επιθυμητό στοιχείο Î¼ÎµÎ½Î¿Ï Î® κουμπί γÏαμμής εÏγαλείων είναι επισημασμένο, πιέστε τα πλήκτÏα Return, Enter,\n' + + ' ή το πλήκτÏο διαστήματος για να εκτελέσετε το στοιχείο.\n' + + '\n' + + '

      Πλοήγηση σε παÏάθυÏα διαλόγου χωÏίς καÏτέλες

      \n' + + '\n' + + '

      Σε παÏάθυÏα διαλόγου χωÏίς καÏτέλες, το Ï€Ïώτο αλληλεπιδÏαστικό στοιχείο λαμβάνει την εστίαση όταν ανοίγει το παÏάθυÏο διαλόγου.

      \n' + + '\n' + + '

      ΜποÏείτε να πλοηγηθείτε Î¼ÎµÏ„Î±Î¾Ï Ï„Ï‰Î½ αλληλεπιδÏαστικών στοιχείων παÏαθÏÏων διαλόγων πιέζοντας τα πλήκτÏα Tab ή Shift+Tab.

      \n' + + '\n' + + '

      Πλοήγηση σε παÏάθυÏα διαλόγου με καÏτέλες

      \n' + + '\n' + + '

      Σε παÏάθυÏα διαλόγου με καÏτέλες, το Ï€Ïώτο κουμπί στο Î¼ÎµÎ½Î¿Ï ÎºÎ±Ïτέλας λαμβάνει την εστίαση όταν ανοίγει το παÏάθυÏο διαλόγου.

      \n' + + '\n' + + '

      ΜποÏείτε να πλοηγηθείτε Î¼ÎµÏ„Î±Î¾Ï Ï„Ï‰Î½ αλληλεπιδÏαστικών στοιχείων αυτής της καÏτέλα διαλόγου πιέζοντας τα πλήκτÏα Tab ή\n' + + ' Shift+Tab.

      \n' + + '\n' + + '

      ΜποÏείτε να κάνετε εναλλαγή σε άλλη καÏτέλα του παÏαθÏÏου διαλόγου, μεταφέÏοντας την εστίαση στο Î¼ÎµÎ½Î¿Ï ÎºÎ±Ïτέλας και πιέζοντας το κατάλληλο πλήκτÏο βέλους\n' + + ' για να μετακινηθείτε κυκλικά στις διαθέσιμες καÏτέλες.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/en.js b/static/js/tinymce/plugins/help/js/i18n/keynav/en.js new file mode 100644 index 0000000..7f0fca7 --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/en.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.en', +'

      Begin keyboard navigation

      \n' + + '\n' + + '
      \n' + + '
      Focus the Menu bar
      \n' + + '
      Windows or Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Focus the Toolbar
      \n' + + '
      Windows or Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Focus the footer
      \n' + + '
      Windows or Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Focus a contextual toolbar
      \n' + + '
      Windows, Linux or macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      Navigation will start at the first UI item, which will be highlighted, or underlined in the case of the first item in\n' + + ' the Footer element path.

      \n' + + '\n' + + '

      Navigate between UI sections

      \n' + + '\n' + + '

      To move from one UI section to the next, press Tab.

      \n' + + '\n' + + '

      To move from one UI section to the previous, press Shift+Tab.

      \n' + + '\n' + + '

      The Tab order of these UI sections is:\n' + + '\n' + + '

        \n' + + '
      1. Menu bar
      2. \n' + + '
      3. Each toolbar group
      4. \n' + + '
      5. Sidebar
      6. \n' + + '
      7. Element path in the footer
      8. \n' + + '
      9. Word count toggle button in the footer
      10. \n' + + '
      11. Branding link in the footer
      12. \n' + + '
      13. Editor resize handle in the footer
      14. \n' + + '
      \n' + + '\n' + + '

      If a UI section is not present, it is skipped.

      \n' + + '\n' + + '

      If the footer has keyboard navigation focus, and there is no visible sidebar, pressing Shift+Tab\n' + + ' moves focus to the first toolbar group, not the last.\n' + + '\n' + + '

      Navigate within UI sections

      \n' + + '\n' + + '

      To move from one UI element to the next, press the appropriate Arrow key.

      \n' + + '\n' + + '

      The Left and Right arrow keys

      \n' + + '\n' + + '
        \n' + + '
      • move between menus in the menu bar.
      • \n' + + '
      • open a sub-menu in a menu.
      • \n' + + '
      • move between buttons in a toolbar group.
      • \n' + + '
      • move between items in the footer’s element path.
      • \n' + + '
      \n' + + '\n' + + '

      The Down and Up arrow keys\n' + + '\n' + + '

        \n' + + '
      • move between menu items in a menu.
      • \n' + + '
      • move between items in a toolbar pop-up menu.
      • \n' + + '
      \n' + + '\n' + + '

      Arrow keys cycle within the focused UI section.

      \n' + + '\n' + + '

      To close an open menu, an open sub-menu, or an open pop-up menu, press the Esc key.\n' + + '\n' + + '

      If the current focus is at the ‘top’ of a particular UI section, pressing the Esc key also exits\n' + + ' keyboard navigation entirely.

      \n' + + '\n' + + '

      Execute a menu item or toolbar button

      \n' + + '\n' + + '

      When the desired menu item or toolbar button is highlighted, press Return, Enter,\n' + + ' or the Space bar to execute the item.\n' + + '\n' + + '

      Navigate non-tabbed dialogs

      \n' + + '\n' + + '

      In non-tabbed dialogs, the first interactive component takes focus when the dialog opens.

      \n' + + '\n' + + '

      Navigate between interactive dialog components by pressing Tab or Shift+Tab.

      \n' + + '\n' + + '

      Navigate tabbed dialogs

      \n' + + '\n' + + '

      In tabbed dialogs, the first button in the tab menu takes focus when the dialog opens.

      \n' + + '\n' + + '

      Navigate between interactive components of this dialog tab by pressing Tab or\n' + + ' Shift+Tab.

      \n' + + '\n' + + '

      Switch to another dialog tab by giving the tab menu focus and then pressing the appropriate Arrow\n' + + ' key to cycle through the available tabs.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/es.js b/static/js/tinymce/plugins/help/js/i18n/keynav/es.js new file mode 100644 index 0000000..008382c --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/es.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.es', +'

      Iniciar la navegación con el teclado

      \n' + + '\n' + + '
      \n' + + '
      Enfocar la barra de menús
      \n' + + '
      Windows o Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Enfocar la barra de herramientas
      \n' + + '
      Windows o Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Enfocar el pie de página
      \n' + + '
      Windows o Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Enfocar una barra de herramientas contextual
      \n' + + '
      Windows, Linux o macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      La navegación comenzará por el primer elemento de la interfaz de usuario (IU), de tal manera que se resaltará, o bien se subrayará si se trata del primer elemento de\n' + + ' la ruta de elemento del pie de página.

      \n' + + '\n' + + '

      Navegar entre las secciones de la IU

      \n' + + '\n' + + '

      Para pasar de una sección de la IU a la siguiente, pulse la tecla Tab.

      \n' + + '\n' + + '

      Para pasar de una sección de la IU a la anterior, pulse Mayús+Tab.

      \n' + + '\n' + + '

      El orden de tabulación de estas secciones de la IU es:\n' + + '\n' + + '

        \n' + + '
      1. Barra de menús
      2. \n' + + '
      3. Cada grupo de barra de herramientas
      4. \n' + + '
      5. Barra lateral
      6. \n' + + '
      7. Ruta del elemento en el pie de página
      8. \n' + + '
      9. Botón de alternancia de recuento de palabras en el pie de página
      10. \n' + + '
      11. Enlace de personalización de marca en el pie de página
      12. \n' + + '
      13. Controlador de cambio de tamaño en el pie de página
      14. \n' + + '
      \n' + + '\n' + + '

      Si una sección de la IU no está presente, esta se omite.

      \n' + + '\n' + + '

      Si el pie de página tiene un enfoque de navegación con el teclado y no hay ninguna barra lateral visible, al pulsar Mayús+Tab,\n' + + ' el enfoque se moverá al primer grupo de barra de herramientas, en lugar de al último.\n' + + '\n' + + '

      Navegar dentro de las secciones de la IU

      \n' + + '\n' + + '

      Para pasar de un elemento de la IU al siguiente, pulse la tecla de flecha correspondiente.

      \n' + + '\n' + + '

      Las teclas de flecha izquierda y derecha permiten

      \n' + + '\n' + + '
        \n' + + '
      • desplazarse entre los menús de la barra de menús.
      • \n' + + '
      • abrir el submenú de un menú.
      • \n' + + '
      • desplazarse entre los botones de un grupo de barra de herramientas.
      • \n' + + '
      • desplazarse entre los elementos de la ruta de elemento del pie de página.
      • \n' + + '
      \n' + + '\n' + + '

      Las teclas de flecha abajo y arriba permiten\n' + + '\n' + + '

        \n' + + '
      • desplazarse entre los elementos de menú de un menú.
      • \n' + + '
      • desplazarse entre los elementos de un menú emergente de una barra de herramientas.
      • \n' + + '
      \n' + + '\n' + + '

      Las teclas de flecha van cambiando dentro de la sección de la IU enfocada.

      \n' + + '\n' + + '

      Para cerrar un menú, un submenú o un menú emergente que estén abiertos, pulse la tecla Esc.\n' + + '\n' + + '

      Si el enfoque actual se encuentra en la parte superior de una sección de la IU determinada, al pulsar la tecla Esc saldrá\n' + + ' de la navegación con el teclado por completo.

      \n' + + '\n' + + '

      Ejecutar un elemento de menú o un botón de barra de herramientas

      \n' + + '\n' + + '

      Si el elemento de menú o el botón de barra de herramientas deseado está resaltado, pulse la tecla Retorno o Entrar,\n' + + ' o la barra espaciadora para ejecutar el elemento.\n' + + '\n' + + '

      Navegar por cuadros de diálogo sin pestañas

      \n' + + '\n' + + '

      En los cuadros de diálogo sin pestañas, el primer componente interactivo se enfoca al abrirse el cuadro de diálogo.

      \n' + + '\n' + + '

      Para navegar entre los componentes interactivos del cuadro de diálogo, pulse las teclas Tab o Mayús+Tab.

      \n' + + '\n' + + '

      Navegar por cuadros de diálogo con pestañas

      \n' + + '\n' + + '

      En los cuadros de diálogo con pestañas, el primer botón del menú de pestaña se enfoca al abrirse el cuadro de diálogo.

      \n' + + '\n' + + '

      Para navegar entre componentes interactivos de esta pestaña del cuadro de diálogo, pulse las teclas Tab o\n' + + ' Mayús+Tab.

      \n' + + '\n' + + '

      Si desea cambiar a otra pestaña del cuadro de diálogo, enfoque el menú de pestañas y, a continuación, pulse la tecla de flecha\n' + + ' correspondiente para moverse por las pestañas disponibles.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/eu.js b/static/js/tinymce/plugins/help/js/i18n/keynav/eu.js new file mode 100644 index 0000000..637a389 --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/eu.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.eu', +'

      Hasi teklatuaren nabigazioa

      \n' + + '\n' + + '
      \n' + + '
      Fokuratu menu-barra
      \n' + + '
      Windows edo Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Fokuratu tresna-barra
      \n' + + '
      Windows edo Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Fokuratu orri-oina
      \n' + + '
      Windows edo Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Fokuratu testuinguruaren tresna-barra
      \n' + + '
      Windows, Linux edo macOS: Ktrl+F9\n' + + '
      \n' + + '\n' + + '

      Nabigazioa EIko lehen elementuan hasiko da: elementu hori nabarmendu egingo da, edo azpimarratu lehen elementua bada\n' + + ' orri-oineko elementuaren bidea.

      \n' + + '\n' + + '

      Nabigatu EIko atalen artean

      \n' + + '\n' + + '

      EIko atal batetik hurrengora mugitzeko, sakatu Tabuladorea.

      \n' + + '\n' + + '

      EIko atal batetik aurrekora mugitzeko, sakatu Maius+Tabuladorea.

      \n' + + '\n' + + '

      EIko atal hauen Tabuladorea da:\n' + + '\n' + + '

        \n' + + '
      1. Menu-barra
      2. \n' + + '
      3. Tresna-barraren talde bakoitza
      4. \n' + + '
      5. Alboko barra
      6. \n' + + '
      7. Orri-oineko elementuaren bidea
      8. \n' + + '
      9. Orri-oneko urrats-kontaketa txandakatzeko botoia
      10. \n' + + '
      11. Orri-oineko marken esteka
      12. \n' + + '
      13. Orri-oineko editorearen tamaina aldatzeko heldulekua
      14. \n' + + '
      \n' + + '\n' + + '

      EIko atal bat ez badago, saltatu egin da.

      \n' + + '\n' + + '

      Orri-oinak teklatuaren nabigazioa fokuratuta badago, eta alboko barra ikusgai ez badago, Maius+Tabuladorea sakatuz gero,\n' + + ' fokua tresna-barrako lehen taldera eramaten da, ez azkenera.\n' + + '\n' + + '

      Nabigatu EIko atalen barruan

      \n' + + '\n' + + '

      EIko elementu batetik hurrengora mugitzeko, sakatu dagokion Gezia tekla.

      \n' + + '\n' + + '

      Ezkerrera eta Eskuinera gezi-teklak

      \n' + + '\n' + + '
        \n' + + '
      • menu-barrako menuen artean mugitzen da.
      • \n' + + '
      • ireki azpimenu bat menuan.
      • \n' + + '
      • mugitu botoi batetik bestera tresna-barren talde batean.
      • \n' + + '
      • mugitu orri-oineko elementuaren bideko elementu batetik bestera.
      • \n' + + '
      \n' + + '\n' + + '

      Gora eta Behera gezi-teklak\n' + + '\n' + + '

        \n' + + '
      • mugitu menu bateko menu-elementuen artean.
      • \n' + + '
      • mugitu tresna-barrako menu gainerakor bateko menu-elementuen artean.
      • \n' + + '
      \n' + + '\n' + + '

      Gezia teklen zikloa nabarmendutako EI atalen barruan.

      \n' + + '\n' + + '

      Irekitako menu bat ixteko, ireki azpimenua, edo ireki menu gainerakorra, sakatu Ihes tekla.\n' + + '\n' + + '

      Une horretan fokuratzea EIko atal jakin baten "goialdean" badago, Ihes tekla sakatuz gero \n' + + ' teklatuaren nabigaziotik irtengo zara.

      \n' + + '\n' + + '

      Exekutatu menuko elementu bat edo tresna-barrako botoi bat

      \n' + + '\n' + + '

      Nahi den menuaren elementua edo tresna-barraren botoia nabarmenduta dagoenean, sakatu Itzuli, Sartu\n' + + ' edo Zuriune-barra elementua exekutatzeko.\n' + + '\n' + + '

      Nabigatu fitxarik gabeko elkarrizketak

      \n' + + '\n' + + '

      Fitxarik gabeko elkarrizketetan, lehen osagai interaktiboa fokuratzen da elkarrizketa irekitzen denean.

      \n' + + '\n' + + '

      Nabigatu elkarrizketa interaktiboko osagai batetik bestera Tabuladorea edo Maius+Tabuladorea sakatuta.

      \n' + + '\n' + + '

      Nabigatu fitxadun elkarrizketak

      \n' + + '\n' + + '

      Fitxadun elkarrizketetan, fitxa-menuko lehen botoia fokuratzen da elkarrizketa irekitzen denean.

      \n' + + '\n' + + '

      Nabigatu elkarrizketa-fitxa honen interaktiboko osagai batetik bestera Tabuladorea edo\n' + + ' Maius+Tabuladorea sakatuta.

      \n' + + '\n' + + '

      Aldatu beste elkarrizketa-fitxa batera fitxa-menua fokuratu eta dagokion Gezia\n' + + ' tekla sakatzeko, erabilgarri dauden fitxa batetik bestera txandakatzeko.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/fa.js b/static/js/tinymce/plugins/help/js/i18n/keynav/fa.js new file mode 100644 index 0000000..8ffcc86 --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/fa.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.fa', +'

      شروع پیمایش صÙحه‌کلید

      \n' + + '\n' + + '
      \n' + + '
      تمرکز بر نوار منو
      \n' + + '
      Windows یا Linux:‎â€: Alt+F9
      \n' + + '
      ‎â€macOS: ⌥F9‎â€
      \n' + + '
      تمرکز بر نوار ابزار
      \n' + + '
      Windows یا Linux‎â€: Alt+F10
      \n' + + '
      ‎â€macOS: ⌥F10‎â€
      \n' + + '
      تمرکز بر پانویس
      \n' + + '
      Windows یا Linux‎â€: Alt+F11
      \n' + + '
      ‎â€macOS: ⌥F11‎â€
      \n' + + '
      تمرکز بر نوار ابزار باÙتاری
      \n' + + '
      Windows ،Linux یا macOS:†Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      پیمایش در اولین مورد رابط کاربری شروع می‌شود و درخصوص اولین مورد در\n' + + ' مسیر عنصر پانویس، برجسته یا زیرخط‌دار می‌شود.

      \n' + + '\n' + + '

      پیمایش بین بخش‌های رابط کاربری

      \n' + + '\n' + + '

      برای جابجایی از یک بخش رابط کاربری به بخش بعدی، Tab را Ùشار دهید.

      \n' + + '\n' + + '

      برای جابجایی از یک بخش رابط کاربری به بخش قبلی، Shift+Tab را Ùشار دهید.

      \n' + + '\n' + + '

      ترتیب Tab این بخش‌های رابط کاربری عبارتند از:\n' + + '\n' + + '

        \n' + + '
      1. نوار منو
      2. \n' + + '
      3. هر گروه نوار ابزار
      4. \n' + + '
      5. نوار کناری
      6. \n' + + '
      7. مسیر عنصر در پانویس
      8. \n' + + '
      9. دکمه تغییر وضعیت تعداد کلمات در پانویس
      10. \n' + + '
      11. پیوند نمانام‌سازی در پانویس
      12. \n' + + '
      13. دسته تغییر اندازه ویرایشگر در پانویس
      14. \n' + + '
      \n' + + '\n' + + '

      اگر بخشی از رابط کاربری موجود نباشد، رد می‌شود.

      \n' + + '\n' + + '

      اگر پانویس دارای تمرکز بر پیمایش صÙحه‌کلید باشد،‌ Ùˆ نوار کناری قابل‌مشاهده وجود ندارد، Ùشردن Shift+Tab\n' + + ' تمرکز را به گروه نوار ابزار اول می‌برد، نه آخر.\n' + + '\n' + + '

      پیمایش در بخش‌های رابط کاربری

      \n' + + '\n' + + '

      برای جابجایی از یک عنصر رابط کاربری به بعدی، کلید جهت‌نمای مناسب را Ùشار دهید.

      \n' + + '\n' + + '

      کلیدهای جهت‌نمای چپ و راست

      \n' + + '\n' + + '
        \n' + + '
      • جابجایی بین منوها در نوار منو.
      • \n' + + '
      • باز کردن منوی Ùرعی در یک منو.
      • \n' + + '
      • جابجایی بین دکمه‌ها در یک گروه نوار ابزار.
      • \n' + + '
      • جابجایی بین موارد در مسیر عنصر پانویس.
      • \n' + + '
      \n' + + '\n' + + '

      کلیدهای جهت‌نمای پایین و بالا\n' + + '\n' + + '

        \n' + + '
      • جابجایی بین موارد منو در یک منو.
      • \n' + + '
      • جابجایی بین موارد در یک منوی بازشوی نوار ابزار.
      • \n' + + '
      \n' + + '\n' + + '

      کلیدهایجهت‌نما در بخش رابط کاربری متمرکز می‌چرخند.

      \n' + + '\n' + + '

      برای بستن یک منوی باز، یک منوی Ùرعی باز، یا یک منوی بازشوی باز، کلید Esc را Ùشار دهید.\n' + + '\n' + + '

      اگر تمرکز Ùعلی در «بالای» یک بخش رابط کاربری خاص است، Ùشردن کلید Esc نیز موجب\n' + + ' خروج کامل از پیمایش صÙحه‌کلید می‌شود.

      \n' + + '\n' + + '

      اجرای یک مورد منو یا دکمه نوار ابزار

      \n' + + '\n' + + '

      وقتی مورد منو یا دکمه نوار ابزار مورد نظر هایلایت شد، دکمه بازگشت، EnterØŒ\n' + + ' یا نوار Space را Ùشار دهید تا مورد را اجرا کنید.\n' + + '\n' + + '

      پیمایش در کادرهای Ú¯Ùتگوی بدون زبانه

      \n' + + '\n' + + '

      در کادرهای Ú¯Ùتگوی بدون زبانه، وقتی کادر Ú¯Ùتگو باز می‌شود، اولین جزء تعاملی متمرکز می‌شود.

      \n' + + '\n' + + '

      با Ùشردن Tab یا Shift+TabØŒ بین اجزای کادر Ú¯Ùتگوی تعاملی پیمایش کنید.

      \n' + + '\n' + + '

      پیمایش کادرهای Ú¯Ùتگوی زبانه‌دار

      \n' + + '\n' + + '

      در کادرهای Ú¯Ùتگوی زبانه‌دار، وقتی کادر Ú¯Ùتگو باز می‌شود، اولین دکمه در منوی زبانه متمرکز می‌شود.

      \n' + + '\n' + + '

      با Ùشردن Tab یا\n' + + ' Shift+TabØŒ بین اجزای تعاملی این زبانه کادر Ú¯Ùتگو پیمایش کنید.

      \n' + + '\n' + + '

      با دادن تمرکز به منوی زبانه Ùˆ سپس Ùشار دادن کلید جهت‌نمای\n' + + ' مناسب برای چرخش میان زبانه‌های موجود، به زبانه کادر Ú¯Ùتگوی دیگری بروید.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/fi.js b/static/js/tinymce/plugins/help/js/i18n/keynav/fi.js new file mode 100644 index 0000000..319074e --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/fi.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.fi', +'

      Näppäimistönavigoinnin aloittaminen

      \n' + + '\n' + + '
      \n' + + '
      Siirrä kohdistus valikkopalkkiin
      \n' + + '
      Windows tai Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Siirrä kohdistus työkalupalkkiin
      \n' + + '
      Windows tai Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Siirrä kohdistus alatunnisteeseen
      \n' + + '
      Windows tai Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Siirrä kohdistus kontekstuaaliseen työkalupalkkiin
      \n' + + '
      Windows, Linux tai macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      Navigointi aloitetaan ensimmäisestä käyttöliittymän kohteesta, joka joko korostetaan tai alleviivataan, jos\n' + + ' kyseessä on Alatunniste-elementin polun ensimmäinen kohde.

      \n' + + '\n' + + '

      Käyttöliittymän eri osien välillä navigointi

      \n' + + '\n' + + '

      Paina sarkainnäppäintä siirtyäksesi käyttöliittymän osasta seuraavaan.

      \n' + + '\n' + + '

      Jos haluat siirtyä edelliseen käyttöliittymän osaan, paina Shift+sarkainnäppäin.

      \n' + + '\n' + + '

      Sarkainnäppäin siirtää sinua näissä käyttöliittymän osissa tässä järjestyksessä:\n' + + '\n' + + '

        \n' + + '
      1. Valikkopalkki
      2. \n' + + '
      3. Työkalupalkin ryhmät
      4. \n' + + '
      5. Sivupalkki
      6. \n' + + '
      7. Elementin polku alatunnisteessa
      8. \n' + + '
      9. Sanalaskurin vaihtopainike alatunnisteessa
      10. \n' + + '
      11. Brändäyslinkki alatunnisteessa
      12. \n' + + '
      13. Editorin koon muuttamisen kahva alatunnisteessa
      14. \n' + + '
      \n' + + '\n' + + '

      Jos jotakin käyttöliittymän osaa ei ole, se ohitetaan.

      \n' + + '\n' + + '

      Jos kohdistus on siirretty alatunnisteeseen näppäimistönavigoinnilla eikä sivupalkkia ole näkyvissä, Shift+sarkainnäppäin\n' + + ' siirtää kohdistuksen työkalupalkin ensimmäiseen ryhmään, eikä viimeiseen.\n' + + '\n' + + '

      Käyttöliittymän eri osien sisällä navigointi

      \n' + + '\n' + + '

      Paina nuolinäppäimiä siirtyäksesi käyttöliittymäelementistä seuraavaan.

      \n' + + '\n' + + '

      Vasen- ja Oikea-nuolinäppäimet

      \n' + + '\n' + + '
        \n' + + '
      • siirtävät sinua valikkopalkin valikoiden välillä.
      • \n' + + '
      • avaavat valikon alavalikon.
      • \n' + + '
      • siirtävät sinua työkalupalkin ryhmän painikkeiden välillä.
      • \n' + + '
      • siirtävät sinua kohteiden välillä alatunnisteen elementin polussa.
      • \n' + + '
      \n' + + '\n' + + '

      Alas- ja Ylös-nuolinäppäimet\n' + + '\n' + + '

        \n' + + '
      • siirtävät sinua valikon valikkokohteiden välillä.
      • \n' + + '
      • siirtävät sinua työkalupalkin ponnahdusvalikon kohteiden välillä.
      • \n' + + '
      \n' + + '\n' + + '

      Nuolinäppäimet siirtävät sinua käyttöliittymän korostetun osan sisällä syklissä.

      \n' + + '\n' + + '

      Paina Esc-näppäintä sulkeaksesi avoimen valikon, avataksesi alavalikon tai avataksesi ponnahdusvalikon.\n' + + '\n' + + '

      Jos kohdistus on käyttöliittymän tietyn osion ylälaidassa, Esc-näppäimen painaminen\n' + + ' poistuu myös näppäimistönavigoinnista kokonaan.

      \n' + + '\n' + + '

      Suorita valikkokohde tai työkalupalkin painike

      \n' + + '\n' + + '

      Kun haluamasi valikkokohde tai työkalupalkin painike on korostettuna, paina Return-, Enter-\n' + + ' tai välilyöntinäppäintä suorittaaksesi kohteen.\n' + + '\n' + + '

      Välilehdittömissä valintaikkunoissa navigointi

      \n' + + '\n' + + '

      Kun välilehdetön valintaikkuna avautuu, kohdistus siirtyy sen ensimmäiseen interaktiiviseen komponenttiin.

      \n' + + '\n' + + '

      Voit siirtyä valintaikkunan interaktiivisten komponenttien välillä painamalla sarkainnäppäintä tai Shift+sarkainnäppäin.

      \n' + + '\n' + + '

      Välilehdellisissä valintaikkunoissa navigointi

      \n' + + '\n' + + '

      Kun välilehdellinen valintaikkuna avautuu, kohdistus siirtyy välilehtivalikon ensimmäiseen painikkeeseen.

      \n' + + '\n' + + '

      Voit siirtyä valintaikkunan välilehden interaktiivisen komponenttien välillä painamalla sarkainnäppäintä tai\n' + + ' Shift+sarkainnäppäin.

      \n' + + '\n' + + '

      Voit siirtyä valintaikkunan toiseen välilehteen siirtämällä kohdistuksen välilehtivalikkoon ja painamalla sopivaa nuolinäppäintä\n' + + ' siirtyäksesi käytettävissä olevien välilehtien välillä syklissä.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/fr_FR.js b/static/js/tinymce/plugins/help/js/i18n/keynav/fr_FR.js new file mode 100644 index 0000000..f8e208d --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/fr_FR.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.fr_FR', +'

      Débuter la navigation au clavier

      \n' + + '\n' + + '
      \n' + + '
      Cibler la barre du menu
      \n' + + '
      Windows ou Linux : Alt+F9
      \n' + + '
      macOS : ⌥F9
      \n' + + "
      Cibler la barre d'outils
      \n" + + '
      Windows ou Linux : Alt+F10
      \n' + + '
      macOS : ⌥F10
      \n' + + '
      Cibler le pied de page
      \n' + + '
      Windows ou Linux : Alt+F11
      \n' + + '
      macOS : ⌥F11
      \n' + + "
      Cibler une barre d'outils contextuelle
      \n" + + '
      Windows, Linux ou macOS : Ctrl+F9\n' + + '
      \n' + + '\n' + + "

      La navigation débutera sur le premier élément de l'interface utilisateur, qui sera mis en surbrillance ou bien souligné dans le cas du premier élément du\n" + + " chemin d'éléments du pied de page.

      \n" + + '\n' + + "

      Naviguer entre les sections de l'interface utilisateur

      \n" + + '\n' + + "

      Pour passer d'une section de l'interface utilisateur à la suivante, appuyez sur Tabulation.

      \n" + + '\n' + + "

      Pour passer d'une section de l'interface utilisateur à la précédente, appuyez sur Maj+Tabulation.

      \n" + + '\n' + + "

      L'ordre de Tabulation de ces sections de l'interface utilisateur est le suivant :\n" + + '\n' + + '

        \n' + + '
      1. Barre du menu
      2. \n' + + "
      3. Chaque groupe de barres d'outils
      4. \n" + + '
      5. Barre latérale
      6. \n' + + "
      7. Chemin d'éléments du pied de page
      8. \n" + + "
      9. Bouton d'activation du compteur de mots dans le pied de page
      10. \n" + + '
      11. Lien de marque dans le pied de page
      12. \n' + + "
      13. Poignée de redimensionnement de l'éditeur dans le pied de page
      14. \n" + + '
      \n' + + '\n' + + "

      Si une section de l'interface utilisateur n'est pas présente, elle sera ignorée.

      \n" + + '\n' + + "

      Si le pied de page comporte un ciblage par navigation au clavier et qu'il n'y a aucune barre latérale visible, appuyer sur Maj+Tabulation\n" + + " déplace le ciblage vers le premier groupe de barres d'outils et non le dernier.\n" + + '\n' + + "

      Naviguer au sein des sections de l'interface utilisateur

      \n" + + '\n' + + "

      Pour passer d'un élément de l'interface utilisateur au suivant, appuyez sur la Flèche appropriée.

      \n" + + '\n' + + '

      Les touches fléchées Gauche et Droite

      \n' + + '\n' + + '
        \n' + + '
      • se déplacent entre les menus de la barre des menus.
      • \n' + + "
      • ouvrent un sous-menu au sein d'un menu.
      • \n" + + "
      • se déplacent entre les boutons d'un groupe de barres d'outils.
      • \n" + + "
      • se déplacent entre les éléments du chemin d'éléments du pied de page.
      • \n" + + '
      \n' + + '\n' + + '

      Les touches fléchées Bas et Haut\n' + + '\n' + + '

        \n' + + "
      • se déplacent entre les éléments de menu au sein d'un menu.
      • \n" + + "
      • se déplacent entre les éléments au sein d'un menu contextuel de barre d'outils.
      • \n" + + '
      \n' + + '\n' + + "

      Les Flèches parcourent la section de l'interface utilisateur ciblée.

      \n" + + '\n' + + '

      Pour fermer un menu ouvert, un sous-menu ouvert ou un menu contextuel ouvert, appuyez sur Echap.\n' + + '\n' + + "

      Si l'actuel ciblage se trouve en « haut » d'une section spécifique de l'interface utilisateur, appuyer sur Echap permet également de quitter\n" + + ' entièrement la navigation au clavier.

      \n' + + '\n' + + "

      Exécuter un élément de menu ou un bouton de barre d'outils

      \n" + + '\n' + + "

      Lorsque l'élément de menu ou le bouton de barre d'outils désiré est mis en surbrillance, appuyez sur la touche Retour arrière, Entrée\n" + + " ou la Barre d'espace pour exécuter l'élément.\n" + + '\n' + + '

      Naviguer au sein de dialogues sans onglets

      \n' + + '\n' + + "

      Dans les dialogues sans onglets, le premier composant interactif est ciblé lorsque le dialogue s'ouvre.

      \n" + + '\n' + + '

      Naviguez entre les composants du dialogue interactif en appuyant sur Tabulation ou Maj+Tabulation.

      \n' + + '\n' + + '

      Naviguer au sein de dialogues avec onglets

      \n' + + '\n' + + "

      Dans les dialogues avec onglets, le premier bouton du menu de l'onglet est ciblé lorsque le dialogue s'ouvre.

      \n" + + '\n' + + '

      Naviguez entre les composants interactifs de cet onglet de dialogue en appuyant sur Tabulation ou\n' + + ' Maj+Tabulation.

      \n' + + '\n' + + "

      Passez à un autre onglet de dialogue en ciblant le menu de l'onglet et en appuyant sur la Flèche\n" + + ' appropriée pour parcourir les onglets disponibles.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/he_IL.js b/static/js/tinymce/plugins/help/js/i18n/keynav/he_IL.js new file mode 100644 index 0000000..37876d5 --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/he_IL.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.he_IL', +'

      התחל ניווט במקלדת

      \n' + + '\n' + + '
      \n' + + '
      התמקד בשורת התפריטי×
      \n' + + '
      Windows ×ו Linux:†Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      העבר מיקוד לסרגל הכלי×
      \n' + + '
      Windows ×ו Linux:†Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      העבר מיקוד לכותרת התחתונה
      \n' + + '
      Windows ×ו Linux:†Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      העבר מיקוד לסרגל ×›×œ×™× ×”×§×©×¨×™
      \n' + + '
      Windowsâ€, Linux ×ו macOS:†Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      הניווט יתחיל ברכיב הר×שון במשך, שיודגש ×ו שיהיה מתחתיו קו תחתון במקרה של הפריט הר×שון\n' + + ' הנתיב של רכיב הכותרת התחתונה.

      \n' + + '\n' + + '

      עבור בין ×ž×§×˜×¢×™× ×‘×ž×¡×š

      \n' + + '\n' + + '

      כדי לעבור בין ×”×ž×§×˜×¢×™× ×‘×ž×¡×š, הקש Tab.

      \n' + + '\n' + + '

      כדי לעבור למקטע ×”×§×•×“× ×‘×ž×¡×š, הקש Shift+Tab.

      \n' + + '\n' + + '

      הסדר מבחינת מקש Tab של ×”×¨×›×™×‘×™× ×‘×ž×¡×š:\n' + + '\n' + + '

        \n' + + '
      1. שורת התפריטי×
      2. \n' + + '
      3. כל קבוצה בסרגל הכלי×
      4. \n' + + '
      5. הסרגל הצידי
      6. \n' + + '
      7. נתיב של רכיב בכותרת התחתונה
      8. \n' + + '
      9. לחצן לספירת ×ž×™×œ×™× ×‘×›×•×ª×¨×ª התחתונה
      10. \n' + + '
      11. קישור של המותג בכותרת התחתונה
      12. \n' + + '
      13. ידית לשינוי גודל עבור העורך בכותרת התחתונה
      14. \n' + + '
      \n' + + '\n' + + '

      ×× ×¨×›×™×‘ כלשהו במסך ×œ× ×ž×•×¤×™×¢, המערכת תדלג עליו.

      \n' + + '\n' + + '

      ×× ×‘×›×•×ª×¨×ª התחתונה יש מיקוד של ניווט במקלדת, ×•×œ× ×ž×•×¤×™×¢ סרגל בצד, יש להקיש Shift+Tab\n' + + ' מעביר ×ת המיקוד לקבוצה הר×שונה בסרגל הכלי×, ×œ× ×”×חרונה.\n' + + '\n' + + '

      עבור בתוך ×ž×§×˜×¢×™× ×‘×ž×¡×š

      \n' + + '\n' + + '

      כדי לעבור מרכיב ×חד לרכיב ×חר במסך, הקש על מקש ×”×—×¥ המת××™×.

      \n' + + '\n' + + '

      מקשי ×”×—×™×¦×™× ×©×ž×לה וימינה

      \n' + + '\n' + + '
        \n' + + '
      • עבור בין ×ª×¤×¨×™×˜×™× ×‘×©×•×¨×ª התפריטי×.
      • \n' + + '
      • פתח תפריט משני בתפריט.
      • \n' + + '
      • עבור בין ×œ×—×¦× ×™× ×‘×§×‘×•×¦×” בסרגל הכלי×.
      • \n' + + '
      • עבור בין ×¤×¨×™×˜×™× ×‘×¨×›×™×‘ בכותרת התחתונה.
      • \n' + + '
      \n' + + '\n' + + '

      מקשי ×”×—×™×¦×™× ×œ×ž×˜×” ולמעלה\n' + + '\n' + + '

        \n' + + '
      • עבור בין ×¤×¨×™×˜×™× ×‘×ª×¤×¨×™×˜.
      • \n' + + '
      • עבור בין ×¤×¨×™×˜×™× ×‘×—×œ×•×Ÿ הקובץ של סרגל הכלי×.
      • \n' + + '
      \n' + + '\n' + + '

      מקשי ×”×—×¦×™× ×ž×©×ª× ×™× ×‘×ª×•×š המקטע במסך שעליו × ×ž×¦× ×”×ž×™×§×•×“.

      \n' + + '\n' + + '

      כדי לסגור תפריט פתוח, תפריט משני פתוח ×ו חלון קופץ, הקש על Esc.\n' + + '\n' + + "

      ×× ×”×ž×™×§×•×“ ×”×•× ×¢×œ החלק 'העליון' של מקטע ×ž×¡×•×™× ×‘×ž×¡×š, הקשה על Esc מבי××” ×’× ×œ×™×¦×™××”\n" + + ' מהניווט במקלדת לחלוטין.

      \n' + + '\n' + + '

      הפעל פריט בתפריט ×ו לחצן בסרגל הכלי×

      \n' + + '\n' + + '

      ×›×שר הפריט הרצוי בתפריט ×ו הלחצן בסרגל ×”×›×œ×™× ×ž×•×“×’×©×™×, הקש על Return, Enter,\n' + + ' ×ו על מקש הרווח כדי להפעיל ×ת הפריט.\n' + + '\n' + + '

      ניווט בחלונות דו-שיח בלי כרטיסיות

      \n' + + '\n' + + '

      בחלונות דו-שיח בלי כרטיסיות, הרכיב ×”×ינטר×קטיבי הר×שון מקבל ×ת המיקוד ×›×שר החלון נפתח.

      \n' + + '\n' + + '

      עבור בין ×¨×›×™×‘×™× ×ינטר××§×˜×™×‘×™×™× ×‘×—×œ×•×Ÿ על ידי הקשה על Tab ×ו Shift+Tab.

      \n' + + '\n' + + '

      ניווט בחלונות דו-שיח ×¢× ×›×¨×˜×™×¡×™×•×ª

      \n' + + '\n' + + '

      בחלונות דו-שיח ×¢× ×›×¨×˜×™×¡×™×•×ª, הלחצן הר×שון בתפריט מקבל ×ת המיקוד ×›×שר החלון נפתח.

      \n' + + '\n' + + '

      עבור בין ×¨×›×™×‘×™× ×ינטר××§×˜×™×‘×™×™× ×‘×—×œ×•×Ÿ על ידי הקשה על Tab ×ו\n' + + ' Shift+Tab.

      \n' + + '\n' + + '

      עבור לכרטיסיה ×חרת בחלון על ידי העברת המיקוד לתפריט הכרטיסיות והקשה על החץהמת××™×\n' + + ' כדי לעבור בין הכרטיסיות הזמינות.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/hi.js b/static/js/tinymce/plugins/help/js/i18n/keynav/hi.js new file mode 100644 index 0000000..584085a --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/hi.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.hi', +'

      कीबोरà¥à¤¡ नेविगेशन शà¥à¤°à¥‚ करें

      \n' + + '\n' + + '
      \n' + + '
      मेनà¥à¤¯à¥‚ बार पर फ़ोकस करें
      \n' + + '
      Windows या Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      टूलबार पर फ़ोकस करें
      \n' + + '
      Windows या Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      फ़à¥à¤Ÿà¤° पर फ़ोकस करें
      \n' + + '
      Windows या Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      पà¥à¤°à¤¾à¤¸à¤‚गिक टूलबार पर फ़ोकस करें
      \n' + + '
      Windows, Linux या macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      नेविगेशन पहले UI आइटम पर शà¥à¤°à¥‚ होगा, जिसे हाइलाइट किया जाà¤à¤—ा या पहले आइटम के मामले में फ़à¥à¤Ÿà¤° ततà¥à¤µ पथ में\n' + + ' रेखांकित किया जाà¤à¤—ा।

      \n' + + '\n' + + '

      UI सेकà¥à¤¶à¤¨ के बीच नेविगेट करें

      \n' + + '\n' + + '

      à¤à¤• UI सेकà¥à¤¶à¤¨ से दूसरे सेकà¥à¤¶à¤¨ में जाने के लिà¤, Tab दबाà¤à¤‚।

      \n' + + '\n' + + '

      à¤à¤• UI सेकà¥à¤¶à¤¨ से पिछले सेकà¥à¤¶à¤¨ में जाने के लिà¤, Shift+Tab दबाà¤à¤‚।

      \n' + + '\n' + + '

      इन UI सेकà¥à¤¶à¤¨ का Tab कà¥à¤°à¤® नीचे दिया गया है:\n' + + '\n' + + '

        \n' + + '
      1. मेनà¥à¤¯à¥‚ बार
      2. \n' + + '
      3. पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• टूलबार समूह
      4. \n' + + '
      5. साइडबार
      6. \n' + + '
      7. फ़à¥à¤Ÿà¤° में ततà¥à¤µ पथ
      8. \n' + + '
      9. फ़à¥à¤Ÿà¤° में शबà¥à¤¦ गणना टॉगल बटन
      10. \n' + + '
      11. फ़à¥à¤Ÿà¤° में बà¥à¤°à¤¾à¤‚डिंग लिंक
      12. \n' + + '
      13. फ़à¥à¤Ÿà¤° में संपादक का आकार बदलने का हैंडल
      14. \n' + + '
      \n' + + '\n' + + '

      अगर कोई UI सेकà¥à¤¶à¤¨ मौजूद नहीं है, तो उसे छोड़ दिया जाता है।

      \n' + + '\n' + + '

      अगर फ़à¥à¤Ÿà¤° में कीबोरà¥à¤¡ नेविगेशन फ़ोकस है, और कोई दिखा देने वाला साइडबार नहीं है, तो Shift+Tab दबाने से\n' + + ' फ़ोकस पहले टूलबार समूह पर चला जाता है, पिछले पर नहीं।\n' + + '\n' + + '

      UI सेकà¥à¤¶à¤¨ के भीतर नेविगेट करें

      \n' + + '\n' + + '

      à¤à¤• UI ततà¥à¤µ से दूसरे में जाने के लिठउपयà¥à¤•à¥à¤¤ à¤à¤°à¥‹ कà¥à¤‚जी दबाà¤à¤‚।

      \n' + + '\n' + + '

      बाà¤à¤‚ और दाà¤à¤‚ à¤à¤°à¥‹ कà¥à¤‚जियां

      \n' + + '\n' + + '
        \n' + + '
      • मेनà¥à¤¯à¥‚ बार में मेनà¥à¤¯à¥‚ के बीच ले जाती हैं।
      • \n' + + '
      • मेनà¥à¤¯à¥‚ में à¤à¤• सब-मेनà¥à¤¯à¥‚ खोलें।
      • \n' + + '
      • टूलबार समूह में बटनों के बीच ले जाà¤à¤‚।
      • \n' + + '
      • फ़à¥à¤Ÿà¤° के ततà¥à¤µ पथ में आइटम के बीच ले जाà¤à¤‚।
      • \n' + + '
      \n' + + '\n' + + '

      नीचे और ऊपर à¤à¤°à¥‹ कà¥à¤‚जियां\n' + + '\n' + + '

        \n' + + '
      • मेनà¥à¤¯à¥‚ में मेनà¥à¤¯à¥‚ आइटम के बीच ले जाती हैं।
      • \n' + + '
      • टूलबार पॉप-अप मेनà¥à¤¯à¥‚ में आइटम के बीच ले जाà¤à¤‚।
      • \n' + + '
      \n' + + '\n' + + '

      फ़ोकस वाले UI सेकà¥à¤¶à¤¨ के भीतर à¤à¤°à¥‹ कà¥à¤‚जियां चलाती रहती हैं।

      \n' + + '\n' + + '

      कोई खà¥à¤²à¤¾ मेनà¥à¤¯à¥‚, कोई खà¥à¤²à¤¾ सब-मेनà¥à¤¯à¥‚ या कोई खà¥à¤²à¤¾ पॉप-अप मेनà¥à¤¯à¥‚ बंद करने के लिठEsc कà¥à¤‚जी दबाà¤à¤‚।\n' + + '\n' + + "

      अगर मौजूदा फ़ोकस किसी विशेष UI सेकà¥à¤¶à¤¨ के 'शीरà¥à¤·' पर है, तो Esc कà¥à¤‚जी दबाने से भी\n" + + ' कीबोरà¥à¤¡ नेविगेशन पूरी तरह से बाहर हो जाता है।

      \n' + + '\n' + + '

      मेनà¥à¤¯à¥‚ आइटम या टूलबार बटन निषà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करें

      \n' + + '\n' + + '

      जब वांछित मेनà¥à¤¯à¥‚ आइटम या टूलबार बटन हाइलाइट किया जाता है, तो आइटम को निषà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करने के लिठReturn, Enter,\n' + + ' या Space bar दबाà¤à¤‚।\n' + + '\n' + + '

      गैर-टैब वाले डायलॉग पर नेविगेट करें

      \n' + + '\n' + + '

      गैर-टैब वाले डायलॉग में, डायलॉग खà¥à¤²à¤¨à¥‡ पर पहला इंटरैकà¥à¤Ÿà¤¿à¤µ घटक फ़ोकस लेता है।

      \n' + + '\n' + + '

      Tab or Shift+Tab दबाकर इंटरैकà¥à¤Ÿà¤¿à¤µ डायलॉग घटकों के बीच नेविगेट करें।

      \n' + + '\n' + + '

      टैब किठगठडायलॉग पर नेविगेट करें

      \n' + + '\n' + + '

      टैब किठगठडायलॉग में, डायलॉग खà¥à¤²à¤¨à¥‡ पर टैब मेनà¥à¤¯à¥‚ में पहला बटन फ़ोकस लेता है।

      \n' + + '\n' + + '

      इस डायलॉग टैब के इंटरैकà¥à¤Ÿà¤¿à¤µ घटकों के बीच नेविगेट करने के लिठTab या\n' + + ' Shift+Tab दबाà¤à¤‚।

      \n' + + '\n' + + '

      टैब मेनà¥à¤¯à¥‚ को फ़ोकस देकर और फिर उपलबà¥à¤§ टैब में के बीच जाने के लिठउपयà¥à¤•à¥à¤¤ à¤à¤°à¥‹\n' + + ' कà¥à¤‚जी दबाकर दूसरे डायलॉग टैब पर सà¥à¤µà¤¿à¤š करें।

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/hr.js b/static/js/tinymce/plugins/help/js/i18n/keynav/hr.js new file mode 100644 index 0000000..3c1f833 --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/hr.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.hr', +'

      PoÄetak navigacije na tipkovnici

      \n' + + '\n' + + '
      \n' + + '
      Fokusiranje trake izbornika
      \n' + + '
      Windows ili Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Fokusiranje alatne trake
      \n' + + '
      Windows ili Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Fokusiranje podnožja
      \n' + + '
      Windows ili Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Fokusiranje kontekstne alatne trake
      \n' + + '
      Windows, Linux ili macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      Navigacija će zapoÄeti kod prve stavke na korisniÄkom suÄelju, koja će biti istaknuta ili podcrtana ako se radi o prvoj stavci u\n' + + ' putu elementa u podnožju.

      \n' + + '\n' + + '

      Navigacija izmeÄ‘u dijelova korisniÄkog suÄelja

      \n' + + '\n' + + '

      Za pomicanje s jednog dijela korisniÄkog suÄelja na drugi pritisnite tabulator.

      \n' + + '\n' + + '

      Za pomicanje s jednog dijela korisniÄkog suÄelja na prethodni pritisnite Shift + tabulator.

      \n' + + '\n' + + '

      Ovo je redoslijed pomicanja tabulatora po dijelovima korisniÄkog suÄelja:\n' + + '\n' + + '

        \n' + + '
      1. Traka izbornika
      2. \n' + + '
      3. PojedinaÄne grupe na alatnoj traci
      4. \n' + + '
      5. BoÄna traka
      6. \n' + + '
      7. Put elemenata u podnožju
      8. \n' + + '
      9. Gumb za pomicanje po broju rijeÄi u podnožju
      10. \n' + + '
      11. Veza na brand u podnožju
      12. \n' + + '
      13. ZnaÄajka za promjenu veliÄine alata za ureÄ‘ivanje u podnožju
      14. \n' + + '
      \n' + + '\n' + + '

      Ako neki dio korisniÄkog suÄelja nije naveden, on se preskaÄe.

      \n' + + '\n' + + '

      Ako u podnožju postoji fokus za navigaciju na tipkovnici, a nema vidljive boÄne trake, pritiskom na Shift + tabulator\n' + + ' fokus se prebacuje na prvu skupinu na alatnoj traci, ne na zadnju.\n' + + '\n' + + '

      Navigacija unutar dijelova korisniÄkog suÄelja

      \n' + + '\n' + + '

      Za pomicanje s jednog elementa korisniÄkog suÄelja na drugi pritisnite tipku s odgovarajućom strelicom.

      \n' + + '\n' + + '

      Tipke s lijevom i desnom strelicom

      \n' + + '\n' + + '
        \n' + + '
      • služe za pomicanje izmeÄ‘u izbornika na alatnoj traci.
      • \n' + + '
      • otvaraju podizbornik unutar izbornika.
      • \n' + + '
      • služe za pomicanje izmeÄ‘u gumba unutar skupina na alatnoj traci.
      • \n' + + '
      • služe za pomicanje izmeÄ‘u stavki na elementu puta u podnožju.
      • \n' + + '
      \n' + + '\n' + + '

      Tipke s donjom i gornjom strelicom\n' + + '\n' + + '

        \n' + + '
      • služe za pomicanje izmeÄ‘u stavki unutar izbornika.
      • \n' + + '
      • služe za pomicanje izmeÄ‘u stavki na alatnoj traci skoÄnog izbornika.
      • \n' + + '
      \n' + + '\n' + + '

      Tipkama strelica kružno se pomiÄete unutar dijela korisniÄkog suÄelja koji je u fokusu.

      \n' + + '\n' + + '

      Za zatvaranje otvorenog izbornika, otvorenog podizbornika ili otvorenog skoÄnog izbornika pritisnite tipku Esc.\n' + + '\n' + + '

      Ako je fokus trenutaÄno postavljen na vrh pojedinaÄnog dijela korisniÄkog suÄelja, pritiskom na tipku Esc takoÄ‘er\n' + + ' u potpunosti zatvarate navigaciju na tipkovnici.

      \n' + + '\n' + + '

      Izvršavanje radnji putem stavki izbornika ili gumba na alatnoj traci

      \n' + + '\n' + + '

      Nakon što se istakne stavka izbornika ili gumb na alatnoj traci s radnjom koju želite izvršiti, pritisnite tipku Return, Enter\n' + + ' ili razmak da biste pokrenuli željenu radnju.\n' + + '\n' + + '

      Navigacija dijaloškim okvirima izvan kartica

      \n' + + '\n' + + '

      Prilikom otvaranja dijaloških okvira izvan kartica fokus se nalazi na prvoj interaktivnoj komponenti.

      \n' + + '\n' + + '

      Navigaciju između interaktivnih dijaloških komponenata vršite pritiskom na tabulator ili Shift + tabulator.

      \n' + + '\n' + + '

      Navigacija dijaloškim okvirima u karticama

      \n' + + '\n' + + '

      Prilikom otvaranja dijaloških okvira u karticama fokus se nalazi na prvom gumbu u izborniku unutar kartice.

      \n' + + '\n' + + '

      Navigaciju između interaktivnih komponenata dijaloškog okvira u kartici vršite pritiskom na tabulator ili\n' + + ' Shift + tabulator.

      \n' + + '\n' + + '

      Na karticu s drugim dijaloškim okvirom možete se prebaciti tako da stavite fokus na izbornik kartice pa pritisnete tipku s odgovarajućom strelicom\n' + + ' za kružno pomicanje između dostupnih kartica.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/hu_HU.js b/static/js/tinymce/plugins/help/js/i18n/keynav/hu_HU.js new file mode 100644 index 0000000..2791e15 --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/hu_HU.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.hu_HU', +'

      Billentyűzetes navigáció indítása

      \n' + + '\n' + + '
      \n' + + '
      Fókusz a menüsávra
      \n' + + '
      Windows és Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Fókusz az eszköztárra
      \n' + + '
      Windows és Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Fókusz a láblécre
      \n' + + '
      Windows és Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Fókusz egy környezetfüggő eszköztárra
      \n' + + '
      Windows, Linux és macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      A navigáció az első felhasználói felületi elemnél kezdődik, amelyet a rendszer kiemel, illetve aláhúz, amennyiben az az első elem\n' + + ' a lábléc elemútvonalán.

      \n' + + '\n' + + '

      Navigálás a felhasználói felület szakaszai között

      \n' + + '\n' + + '

      A felhasználói felület következő szakaszára váltáshoz nyomja meg a Tab billentyűt.

      \n' + + '\n' + + '

      A felhasználói felület előző szakaszára váltáshoz nyomja meg a Shift+Tab billentyűt.

      \n' + + '\n' + + '

      A Tab billentyűvel a felhasználói felület szakaszai között a következő sorrendben vált:\n' + + '\n' + + '

        \n' + + '
      1. Menüsáv
      2. \n' + + '
      3. Az egyes eszköztárcsoportok
      4. \n' + + '
      5. Oldalsáv
      6. \n' + + '
      7. Elemútvonal a láblécen
      8. \n' + + '
      9. Szószámátkapcsoló gomb a láblécen
      10. \n' + + '
      11. Márkalink a láblécen
      12. \n' + + '
      13. Szerkesztő átméretezési fogópontja a láblécen
      14. \n' + + '
      \n' + + '\n' + + '

      Ha a felhasználói felület valamelyik eleme nincs jelen, a rendszer kihagyja.

      \n' + + '\n' + + '

      Ha a billentyűzetes navigáció fókusza a láblécen van, és nincs látható oldalsáv, a Shift+Tab\n' + + ' billentyűkombináció lenyomásakor az első eszköztárcsoportra ugrik a fókusz, nem az utolsóra.\n' + + '\n' + + '

      Navigálás a felhasználói felület szakaszain belül

      \n' + + '\n' + + '

      A felhasználói felület következő elemére váltáshoz nyomja meg a megfelelő nyílbillentyűt.

      \n' + + '\n' + + '

      A bal és a jobb nyílgomb

      \n' + + '\n' + + '
        \n' + + '
      • a menüsávban a menük között vált.
      • \n' + + '
      • a menükben megnyit egy almenüt.
      • \n' + + '
      • az eszköztárcsoportban a gombok között vált.
      • \n' + + '
      • a lábléc elemútvonalán az elemek között vált.
      • \n' + + '
      \n' + + '\n' + + '

      A le és a fel nyílgomb\n' + + '\n' + + '

        \n' + + '
      • a menükben a menüpontok között vált.
      • \n' + + '
      • az eszköztár elÅ‘ugró menüjében az elemek között vált.
      • \n' + + '
      \n' + + '\n' + + '

      A nyílbillentyűk lenyomásával körkörösen lépkedhet a fókuszban lévő felhasználói felületi szakasz elemei között.

      \n' + + '\n' + + '

      A megnyitott menüket, almenüket és előugró menüket az Esc billentyűvel zárhatja be.\n' + + '\n' + + '

      Ha a fókusz az aktuális felületi elem „felső†részén van, az Esc billentyűvel az egész\n' + + ' billentyűzetes navigációból kilép.

      \n' + + '\n' + + '

      Menüpont vagy eszköztárgomb aktiválása

      \n' + + '\n' + + '

      Amikor a kívánt menüelem vagy eszköztárgomb van kijelölve, nyomja meg a Return, az Enter\n' + + ' vagy a Szóköz billentyűt az adott elem vagy gomb aktiválásához.\n' + + '\n' + + '

      Navigálás a lapokkal nem rendelkező párbeszédablakokban

      \n' + + '\n' + + '

      A lapokkal nem rendelkező párbeszédablakokban az első interaktív összetevő kapja a fókuszt, amikor a párbeszédpanel megnyílik.

      \n' + + '\n' + + '

      A párbeszédpanelek interaktív összetevői között a Tab vagy a Shift+Tab billentyűvel navigálhat.

      \n' + + '\n' + + '

      Navigálás a lapokkal rendelkező párbeszédablakokban

      \n' + + '\n' + + '

      A lapokkal rendelkező párbeszédablakokban a lapmenü első gombja kapja a fókuszt, amikor a párbeszédpanel megnyílik.

      \n' + + '\n' + + '

      A párbeszédpanel e lapjának interaktív összetevői között a Tab vagy\n' + + ' Shift+Tab billentyűvel navigálhat.

      \n' + + '\n' + + '

      A párbeszédablak másik lapjára úgy léphet, hogy a fókuszt a lapmenüre állítja, majd lenyomja a megfelelő nyílbillentyűt\n' + + ' a rendelkezésre álló lapok közötti lépkedéshez.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/id.js b/static/js/tinymce/plugins/help/js/i18n/keynav/id.js new file mode 100644 index 0000000..03cf417 --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/id.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.id', +'

      Memulai navigasi keyboard

      \n' + + '\n' + + '
      \n' + + '
      Fokus pada bilah Menu
      \n' + + '
      Windows atau Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Fokus pada Bilah Alat
      \n' + + '
      Windows atau Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Fokus pada footer
      \n' + + '
      Windows atau Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Fokus pada bilah alat kontekstual
      \n' + + '
      Windows, Linux, atau macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      Navigasi akan dimulai dari item pertama UI, yang akan disorot atau digarisbawahi di\n' + + ' alur elemen Footer.

      \n' + + '\n' + + '

      Berpindah antar-bagian UI

      \n' + + '\n' + + '

      Untuk berpindah dari satu bagian UI ke bagian berikutnya, tekan Tab.

      \n' + + '\n' + + '

      Untuk berpindah dari satu bagian UI ke bagian sebelumnya, tekan Shift+Tab.

      \n' + + '\n' + + '

      Urutan Tab bagian-bagian UI ini adalah:\n' + + '\n' + + '

        \n' + + '
      1. Bilah menu
      2. \n' + + '
      3. Tiap grup bilah alat
      4. \n' + + '
      5. Bilah sisi
      6. \n' + + '
      7. Alur elemen di footer
      8. \n' + + '
      9. Tombol aktifkan/nonaktifkan jumlah kata di footer
      10. \n' + + '
      11. Tautan merek di footer
      12. \n' + + '
      13. Pengatur pengubahan ukuran editor di footer
      14. \n' + + '
      \n' + + '\n' + + '

      Jika suatu bagian UI tidak ada, bagian tersebut dilewati.

      \n' + + '\n' + + '

      Jika fokus navigasi keyboard ada pada footer, tetapi tidak ada bilah sisi yang terlihat, menekan Shift+Tab\n' + + ' akan memindahkan fokus ke grup bilah alat pertama, bukan yang terakhir.\n' + + '\n' + + '

      Berpindah di dalam bagian-bagian UI

      \n' + + '\n' + + '

      Untuk berpindah dari satu elemen UI ke elemen berikutnya, tekan tombol Panah yang sesuai.

      \n' + + '\n' + + '

      Tombol panah Kiri dan Kanan untuk

      \n' + + '\n' + + '
        \n' + + '
      • berpindah-pindah antar-menu di dalam bilah menu.
      • \n' + + '
      • membuka sub-menu di dalam menu.
      • \n' + + '
      • berpindah-pindah antar-tombol di dalam grup bilah alat.
      • \n' + + '
      • berpindah-pindah antar-item di dalam alur elemen footer.
      • \n' + + '
      \n' + + '\n' + + '

      Tombol panah Bawah dan Atas untuk\n' + + '\n' + + '

        \n' + + '
      • berpindah-pindah antar-item menu di dalam menu.
      • \n' + + '
      • berpindah-pindah antar-item di dalam menu pop-up bilah alat.
      • \n' + + '
      \n' + + '\n' + + '

      Tombol Panah hanya bergerak di dalam bagian UI yang difokuskan.

      \n' + + '\n' + + '

      Untuk menutup menu, sub-menu, atau menu pop-up yang terbuka, tekan tombol Esc.\n' + + '\n' + + '

      Jika fokus sedang berada di ‘atas’ bagian UI tertentu, menekan tombol Esc juga dapat mengeluarkan fokus\n' + + ' dari seluruh navigasi keyboard.

      \n' + + '\n' + + '

      Menjalankan item menu atau tombol bilah alat

      \n' + + '\n' + + '

      Jika item menu atau tombol bilah alat yang diinginkan tersorot, tekan Return, Enter,\n' + + ' atau Spasi untuk menjalankan item.\n' + + '\n' + + '

      Berpindah dalam dialog tanpa tab

      \n' + + '\n' + + '

      Dalam dialog tanpa tab, fokus diarahkan pada komponen interaktif pertama saat dialog terbuka.

      \n' + + '\n' + + '

      Berpindah di antara komponen dalam dialog interaktif dengan menekan Tab atau Shift+Tab.

      \n' + + '\n' + + '

      Berpindah dalam dialog dengan tab

      \n' + + '\n' + + '

      Dalam dialog yang memiliki tab, fokus diarahkan pada tombol pertama di dalam menu saat dialog terbuka.

      \n' + + '\n' + + '

      Berpindah di antara komponen-komponen interaktif pada tab dialog ini dengan menekan Tab atau\n' + + ' Shift+Tab.

      \n' + + '\n' + + '

      Beralih ke tab dialog lain dengan mengarahkan fokus pada menu tab lalu tekan tombol Panah\n' + + ' yang sesuai untuk berpindah ke berbagai tab yang tersedia.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/it.js b/static/js/tinymce/plugins/help/js/i18n/keynav/it.js new file mode 100644 index 0000000..450a34a --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/it.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.it', +'

      Iniziare la navigazione tramite tastiera

      \n' + + '\n' + + '
      \n' + + '
      Impostare lo stato attivo per la barra dei menu
      \n' + + '
      Windows o Linux: ALT+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Impostare lo stato attivo per la barra degli strumenti
      \n' + + '
      Windows o Linux: ALT+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Impostare lo stato attivo per il piè di pagina
      \n' + + '
      Windows o Linux: ALT+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Impostare lo stato attivo per la barra degli strumenti contestuale
      \n' + + '
      Windows, Linux o macOS: CTRL+F9\n' + + '
      \n' + + '\n' + + "

      La navigazione inizierà dalla prima voce dell'interfaccia utente, che sarà evidenziata o sottolineata nel caso della prima voce\n" + + " nel percorso dell'elemento del piè di pagina.

      \n" + + '\n' + + "

      Navigare tra le sezioni dell'interfaccia utente

      \n" + + '\n' + + "

      Per passare da una sezione dell'interfaccia utente alla successiva, premere TAB.

      \n" + + '\n' + + "

      Per passare da una sezione dell'interfaccia utente alla precedente, premere MAIUSC+TAB.

      \n" + + '\n' + + "

      L'ordine di tabulazione di queste sezioni dell'interfaccia utente è:\n" + + '\n' + + '

        \n' + + '
      1. Barra dei menu
      2. \n' + + '
      3. Ogni gruppo di barre degli strumenti
      4. \n' + + '
      5. Barra laterale
      6. \n' + + "
      7. Percorso dell'elemento nel piè di pagina
      8. \n" + + '
      9. Pulsante di attivazione/disattivazione del conteggio delle parole nel piè di pagina
      10. \n' + + '
      11. Collegamento al marchio nel piè di pagina
      12. \n' + + "
      13. Quadratino di ridimensionamento dell'editor nel piè di pagina
      14. \n" + + '
      \n' + + '\n' + + "

      Se una sezione dell'interfaccia utente non è presente, viene saltata.

      \n" + + '\n' + + '

      Se il piè di pagina ha lo stato attivo per la navigazione tramite tastiera e non è presente alcuna barra laterale visibile, premendo MAIUSC+TAB\n' + + " si sposta lo stato attivo sul primo gruppo di barre degli strumenti, non sull'ultimo.\n" + + '\n' + + "

      Navigare all'interno delle sezioni dell'interfaccia utente

      \n" + + '\n' + + "

      Per passare da un elemento dell'interfaccia utente al successivo, premere il tasto freccia appropriato.

      \n" + + '\n' + + '

      I tasti freccia Sinistra e Destra

      \n' + + '\n' + + '
        \n' + + '
      • consentono di spostarsi tra i menu della barra dei menu.
      • \n' + + '
      • aprono un sottomenu in un menu.
      • \n' + + '
      • consentono di spostarsi tra i pulsanti di un gruppo di barre degli strumenti.
      • \n' + + "
      • consentono di spostarsi tra le voci nel percorso dell'elemento del piè di pagina.
      • \n" + + '
      \n' + + '\n' + + '

      I tasti freccia Giù e Su\n' + + '\n' + + '

        \n' + + '
      • consentono di spostarsi tra le voci di un menu.
      • \n' + + '
      • consentono di spostarsi tra le voci di un menu a comparsa della barra degli strumenti.
      • \n' + + '
      \n' + + '\n' + + "

      I tasti freccia consentono di spostarsi all'interno della sezione dell'interfaccia utente con stato attivo.

      \n" + + '\n' + + '

      Per chiudere un menu aperto, un sottomenu aperto o un menu a comparsa aperto, premere il tasto ESC.\n' + + '\n' + + "

      Se lo stato attivo corrente si trova nella parte superiore di una particolare sezione dell'interfaccia utente, premendo il tasto ESC si esce\n" + + ' completamente dalla navigazione tramite tastiera.

      \n' + + '\n' + + '

      Eseguire una voce di menu o un pulsante della barra degli strumenti

      \n' + + '\n' + + '

      Quando la voce di menu o il pulsante della barra degli strumenti desiderati sono evidenziati, premere il tasto diritorno a capo, il tasto Invio\n' + + ' o la barra spaziatrice per eseguirli.\n' + + '\n' + + '

      Navigare nelle finestre di dialogo non a schede

      \n' + + '\n' + + "

      Nelle finestre di dialogo non a schede, all'apertura della finestra di dialogo diventa attivo il primo componente interattivo.

      \n" + + '\n' + + '

      Per spostarsi tra i componenti interattivi della finestra di dialogo, premere TAB o MAIUSC+TAB.

      \n' + + '\n' + + '

      Navigare nelle finestre di dialogo a schede

      \n' + + '\n' + + "

      Nelle finestre di dialogo a schede, all'apertura della finestra di dialogo diventa attivo il primo pulsante del menu della scheda.

      \n" + + '\n' + + '

      Per spostarsi tra i componenti interattivi di questa scheda della finestra di dialogo, premere TAB o\n' + + ' MAIUSC+TAB.

      \n' + + '\n' + + "

      Per passare a un'altra scheda della finestra di dialogo, attivare il menu della scheda e premere il tasto freccia\n" + + ' appropriato per scorrere le schede disponibili.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/ja.js b/static/js/tinymce/plugins/help/js/i18n/keynav/ja.js new file mode 100644 index 0000000..19febc7 --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/ja.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.ja', +'

      キーボード ナビゲーションã®é–‹å§‹

      \n' + + '\n' + + '
      \n' + + '
      メニュー ãƒãƒ¼ã‚’フォーカス
      \n' + + '
      Windows ã¾ãŸã¯ Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      ツール ãƒãƒ¼ã‚’フォーカス
      \n' + + '
      Windows ã¾ãŸã¯ Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      フッターをフォーカス
      \n' + + '
      Windows ã¾ãŸã¯ Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      コンテキスト ツール ãƒãƒ¼ã‚’フォーカス
      \n' + + '
      Windowsã€Linux ã¾ãŸã¯ macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      ナビゲーションã¯æœ€åˆã® UI é …ç›®ã‹ã‚‰é–‹å§‹ã•ã‚Œã€å¼·èª¿è¡¨ç¤ºã•ã‚Œã‚‹ã‹ã€ãƒ•ãƒƒã‚¿ãƒ¼ã®è¦ç´ ãƒ‘スã«ã‚る最åˆã®é …ç›®ã®å ´åˆã¯\n' + + ' 下線ãŒå¼•ã‹ã‚Œã¾ã™ã€‚

      \n' + + '\n' + + '

      UI セクション間ã®ç§»å‹•

      \n' + + '\n' + + '

      次㮠UI セクションã«ç§»å‹•ã™ã‚‹ã«ã¯ã€Tab を押ã—ã¾ã™ã€‚

      \n' + + '\n' + + '

      å‰ã® UI セクションã«ç§»å‹•ã™ã‚‹ã«ã¯ã€Shift+Tab を押ã—ã¾ã™ã€‚

      \n' + + '\n' + + '

      ã“れら㮠UI セクション㮠Tab ã®é †åº:\n' + + '\n' + + '

        \n' + + '
      1. メニュー ãƒãƒ¼
      2. \n' + + '
      3. å„ツール ãƒãƒ¼ グループ
      4. \n' + + '
      5. サイド ãƒãƒ¼
      6. \n' + + '
      7. フッターã®è¦ç´ ãƒ‘ス
      8. \n' + + '
      9. フッターã®å˜èªžæ•°åˆ‡ã‚Šæ›¿ãˆãƒœã‚¿ãƒ³
      10. \n' + + '
      11. フッターã®ãƒ–ランド リンク
      12. \n' + + '
      13. フッターã®ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ サイズ変更ãƒãƒ³ãƒ‰ãƒ«
      14. \n' + + '
      \n' + + '\n' + + '

      UI セクションãŒå­˜åœ¨ã—ãªã„å ´åˆã¯ã€ã‚¹ã‚­ãƒƒãƒ—ã•ã‚Œã¾ã™ã€‚

      \n' + + '\n' + + '

      フッターã«ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ ナビゲーション フォーカスãŒã‚ã‚Šã€è¡¨ç¤ºå¯èƒ½ãªã‚µã‚¤ãƒ‰ ãƒãƒ¼ãŒãªã„å ´åˆã€Shift+Tab を押ã™ã¨ã€\n' + + ' フォーカスãŒæœ€å¾Œã§ã¯ãªã最åˆã®ãƒ„ール ãƒãƒ¼ グループã«ç§»å‹•ã—ã¾ã™ã€‚\n' + + '\n' + + '

      UI セクション内ã®ç§»å‹•

      \n' + + '\n' + + '

      次㮠UI è¦ç´ ã«ç§»å‹•ã™ã‚‹ã«ã¯ã€é©åˆ‡ãªçŸ¢å°ã‚­ãƒ¼ã‚’押ã—ã¾ã™ã€‚

      \n' + + '\n' + + '

      左矢å°ã¨å³çŸ¢å°ã®ã‚­ãƒ¼

      \n' + + '\n' + + '
        \n' + + '
      • メニュー ãƒãƒ¼ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼é–“ã§ç§»å‹•ã—ã¾ã™ã€‚
      • \n' + + '
      • メニュー内ã®ã‚µãƒ–メニューを開ãã¾ã™ã€‚
      • \n' + + '
      • ツール ãƒãƒ¼ グループã®ãƒœã‚¿ãƒ³é–“ã§ç§»å‹•ã—ã¾ã™ã€‚
      • \n' + + '
      • フッターã®è¦ç´ ãƒ‘スã®é …目間ã§ç§»å‹•ã—ã¾ã™ã€‚
      • \n' + + '
      \n' + + '\n' + + '

      下矢å°ã¨ä¸ŠçŸ¢å°ã®ã‚­ãƒ¼\n' + + '\n' + + '

        \n' + + '
      • メニュー内ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼é …目間ã§ç§»å‹•ã—ã¾ã™ã€‚
      • \n' + + '
      • ツール ãƒãƒ¼ ãƒãƒƒãƒ—アップ メニュー内ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼é …目間ã§ç§»å‹•ã—ã¾ã™ã€‚
      • \n' + + '
      \n' + + '\n' + + '

      矢å°ã‚­ãƒ¼ã§ã€ãƒ•ã‚©ãƒ¼ã‚«ã‚¹ã•ã‚ŒãŸ UI セクション内ã§å¾ªç’°ã—ã¾ã™ã€‚

      \n' + + '\n' + + '

      é–‹ã„ãŸãƒ¡ãƒ‹ãƒ¥ãƒ¼ã€é–‹ã„ãŸã‚µãƒ–メニューã€é–‹ã„ãŸãƒãƒƒãƒ—アップ メニューを閉ã˜ã‚‹ã«ã¯ã€Esc キーを押ã—ã¾ã™ã€‚\n' + + '\n' + + '

      ç¾åœ¨ã®ãƒ•ã‚©ãƒ¼ã‚«ã‚¹ãŒç‰¹å®šã® UI セクションã®ã€Œä¸€ç•ªä¸Šã€ã«ã‚ã‚‹å ´åˆã€Esc キーを押ã™ã¨\n' + + ' キーボード ナビゲーションも完全ã«é–‰ã˜ã‚‰ã‚Œã¾ã™ã€‚

      \n' + + '\n' + + '

      メニュー項目ã¾ãŸã¯ãƒ„ール ãƒãƒ¼ ボタンã®å®Ÿè¡Œ

      \n' + + '\n' + + '

      目的ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼é …目やツール ãƒãƒ¼ ボタンãŒå¼·èª¿è¡¨ç¤ºã•ã‚Œã¦ã„ã‚‹å ´åˆã€ãƒªã‚¿ãƒ¼ãƒ³ã€Enterã€\n' + + ' ã¾ãŸã¯ã‚¹ãƒšãƒ¼ã‚¹ キーを押ã—ã¦é …目を実行ã—ã¾ã™ã€‚\n' + + '\n' + + '

      タブã®ãªã„ダイアログã®ç§»å‹•

      \n' + + '\n' + + '

      タブã®ãªã„ダイアログã§ã¯ã€ãƒ€ã‚¤ã‚¢ãƒ­ã‚°ãŒé–‹ãã¨æœ€åˆã®å¯¾è©±åž‹ã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆãŒãƒ•ã‚©ãƒ¼ã‚«ã‚¹ã•ã‚Œã¾ã™ã€‚

      \n' + + '\n' + + '

      Tab ã¾ãŸã¯ Shift+Tab を押ã—ã¦ã€å¯¾è©±åž‹ãƒ€ã‚¤ã‚¢ãƒ­ã‚° コンãƒãƒ¼ãƒãƒ³ãƒˆé–“ã§ç§»å‹•ã—ã¾ã™ã€‚

      \n' + + '\n' + + '

      タブ付ãダイアログã®ç§»å‹•

      \n' + + '\n' + + '

      タブ付ãダイアログã§ã¯ã€ãƒ€ã‚¤ã‚¢ãƒ­ã‚°ãŒé–‹ãã¨ã‚¿ãƒ– メニューã®æœ€åˆã®ãƒœã‚¿ãƒ³ãŒãƒ•ã‚©ãƒ¼ã‚«ã‚¹ã•ã‚Œã¾ã™ã€‚

      \n' + + '\n' + + '

      Tab ã¾ãŸã¯\n' + + ' Shift+Tab を押ã—ã¦ã€ã“ã®ãƒ€ã‚¤ã‚¢ãƒ­ã‚° タブã®å¯¾è©±åž‹ã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆé–“ã§ç§»å‹•ã—ã¾ã™ã€‚

      \n' + + '\n' + + '

      タブ メニューをフォーカスã—ã¦ã‹ã‚‰é©åˆ‡ãªçŸ¢å°ã‚­ãƒ¼ã‚’押ã—ã¦è¡¨ç¤ºå¯èƒ½ãªã‚¿ãƒ–を循環ã—ã¦ã€\n' + + ' 別ã®ãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã«åˆ‡ã‚Šæ›¿ãˆã¾ã™ã€‚

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/kk.js b/static/js/tinymce/plugins/help/js/i18n/keynav/kk.js new file mode 100644 index 0000000..dd6370f --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/kk.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.kk', +'

      Пернетақта навигациÑÑын баÑтау

      \n' + + '\n' + + '
      \n' + + '
      Мәзір жолағын фокуÑтау
      \n' + + '
      Windows немеÑе Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Құралдар тақтаÑын фокуÑтау
      \n' + + '
      Windows немеÑе Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Төменгі деректемені фокуÑтау
      \n' + + '
      Windows немеÑе Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Мәтінмәндік құралдар тақтаÑын фокуÑтау
      \n' + + '
      Windows, Linux немеÑе macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      ÐÐ°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ñ Ð±Ó©Ð»ÐµÐºÑ‚ÐµÐ»ÐµÑ‚Ñ–Ð½ немеÑе Төменгі деректеме Ñлементінің жолындағы бірінші Ñлемент жағдайында аÑÑ‚Ñ‹ Ñызылатын\n' + + ' бірінші ПИ Ñлементінен баÑталады.

      \n' + + '\n' + + '

      ПИ бөлімдері араÑында навигациÑлау

      \n' + + '\n' + + '

      Бір ПИ бөлімінен келеÑÑ–Ñіне өту үшін Tab пернеÑін баÑыңыз.

      \n' + + '\n' + + '

      Бір ПИ бөлімінен алдыңғыÑына өту үшін Shift+Tab пернеÑін баÑыңыз.

      \n' + + '\n' + + '

      ОÑÑ‹ ПИ бөлімдерінің Tab реті:\n' + + '\n' + + '

        \n' + + '
      1. Мәзір жолағы
      2. \n' + + '
      3. Әрбір құралдар тақтаÑÑ‹ тобы
      4. \n' + + '
      5. Бүйірлік жолақ
      6. \n' + + '
      7. Төменгі деректемедегі Ñлемент жолы
      8. \n' + + '
      9. Төменгі деректемедегі Ñөздер Ñанын ауыÑтыру түймеÑÑ–
      10. \n' + + '
      11. Төменгі деректемедегі брендингтік Ñілтеме
      12. \n' + + '
      13. Төменгі деректемедегі редактор өлшемін өзгерту тұтқаÑÑ‹
      14. \n' + + '
      \n' + + '\n' + + '

      ПИ бөлімі көрÑетілмеÑе, ол өткізіп жіберіледі.

      \n' + + '\n' + + '

      Төменгі деректемеде пернетақта навигациÑÑының фокуÑÑ‹ болÑа және бүйірлік жолақ көрінбеÑе, Shift+Tab тіркеÑімін баÑу әрекеті\n' + + ' фокуÑÑ‚Ñ‹ ÑоңғыÑÑ‹ емеÑ, бірінші құралдар тақтаÑÑ‹ тобына жылжытады.\n' + + '\n' + + '

      ПИ бөлімдерінде навигациÑлау

      \n' + + '\n' + + '

      Бір ПИ Ñлементінен келеÑÑ–Ñіне өту үшін Arrow (КөрÑеткі) пернеÑін баÑыңыз.

      \n' + + '\n' + + '

      Left (Сол жақ) және Right (Оң жақ) көрÑеткі пернелері

      \n' + + '\n' + + '
        \n' + + '
      • мәзір жолағындағы мәзірлер араÑында жылжыту.
      • \n' + + '
      • мәзірде ішкі мәзірді ашу.
      • \n' + + '
      • құралдар тақтаÑÑ‹ тобындағы түймелер араÑында жылжыту.
      • \n' + + '
      • төменгі деректеме Ñлементінің жолындағы Ñлементтер араÑында жылжыту.
      • \n' + + '
      \n' + + '\n' + + '

      Down (Төмен) және Up (Жоғары) көрÑеткі пернелері\n' + + '\n' + + '

        \n' + + '
      • мәзірдегі мәзір Ñлементтері араÑында жылжыту.
      • \n' + + '
      • құралдар тақтаÑының ашылмалы мәзіріндегі мәзір Ñлементтері араÑында жылжыту.
      • \n' + + '
      \n' + + '\n' + + '

      ФокуÑталған ПИ бөліміндегі Arrow (КөрÑеткі) пернелерінің циклі.

      \n' + + '\n' + + '

      Ðшық мәзірді жабу үшін ішкі мәзірді ашып немеÑе ашылмалы мәзірді ашып, Esc пернеÑін баÑыңыз.\n' + + '\n' + + '

      Ðғымдағы Ñ„Ð¾ÐºÑƒÑ Ð±ÐµÐ»Ð³Ñ–Ð»Ñ– бір ПИ бөлімінің «үÑтінде» болÑа, Esc пернеÑін баÑу әрекеті пернетақта\n' + + ' навигациÑÑын толығымен жабады.

      \n' + + '\n' + + '

      Мәзір Ñлементін немеÑе құралдар тақтаÑÑ‹ түймеÑін орындау

      \n' + + '\n' + + '

      Қажетті мәзір Ñлементі немеÑе құралдар тақтаÑÑ‹ түймеÑÑ– бөлектелген кезде, Ñлементті орындау үшін Return (Қайтару), Enter (Енгізу)\n' + + ' немеÑе Space bar (Ð‘Ð¾Ñ Ð¾Ñ€Ñ‹Ð½) пернеÑін баÑыңыз.\n' + + '\n' + + '

      Белгіленбеген диалог терезелерін навигациÑлау

      \n' + + '\n' + + '

      Белгіленбеген диалог терезелерінде диалог терезеÑÑ– ашылған кезде бірінші интерактивті Ò›Ò±Ñ€Ð°Ð¼Ð´Ð°Ñ Ñ„Ð¾ÐºÑƒÑталады.

      \n' + + '\n' + + '

      Tab немеÑе Shift+Tab пернеÑін баÑу арқылы интерактивті диалог терезеÑінің құрамдаÑтары араÑында навигациÑлаңыз.

      \n' + + '\n' + + '

      Белгіленген диалог терезелерін навигациÑлау

      \n' + + '\n' + + '

      Белгіленген диалог терезелерінде диалог терезеÑÑ– ашылған кезде қойынды мәзіріндегі бірінші түйме фокуÑталады.

      \n' + + '\n' + + '

      Tab немеÑе\n' + + ' Shift+Tab пернеÑін баÑу арқылы оÑÑ‹ диалог терезеÑÑ– қойындыÑының интерактивті құрамдаÑтары араÑында навигациÑлаңыз.

      \n' + + '\n' + + '

      Қойынды мәзірінің фокуÑын беру арқылы баÑқа диалог терезеÑінің қойындыÑына ауыÑып, тиіÑÑ‚Ñ– Arrow (КөрÑеткі)\n' + + ' пернеÑін баÑу арқылы қолжетімді қойындылар араÑында айналдыруға болады.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/ko_KR.js b/static/js/tinymce/plugins/help/js/i18n/keynav/ko_KR.js new file mode 100644 index 0000000..073592c --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/ko_KR.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.ko_KR', +'

      키보드 íƒìƒ‰ 시작

      \n' + + '\n' + + '
      \n' + + '
      메뉴 ëª¨ìŒ í¬ì»¤ìŠ¤ 표시
      \n' + + '
      Windows ë˜ëŠ” Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      ë„구 ëª¨ìŒ í¬ì»¤ìŠ¤ 표시
      \n' + + '
      Windows ë˜ëŠ” Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      푸터 í¬ì»¤ìŠ¤ 표시
      \n' + + '
      Windows ë˜ëŠ” Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      컨í…스트 ë„구 모ìŒì— í¬ì»¤ìŠ¤ 표시
      \n' + + '
      Windows, Linux ë˜ëŠ” macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      첫 번째 UI 항목ì—ì„œ íƒìƒ‰ì´ 시작ë˜ë©°, ì´ë•Œ 첫 번째 í•­ëª©ì´ ê°•ì¡° 표시ë˜ê±°ë‚˜ 푸터 요소 ê²½ë¡œì— ìžˆëŠ”\n' + + ' 경우 밑줄 표시ë©ë‹ˆë‹¤.

      \n' + + '\n' + + '

      UI 섹션 ê°„ íƒìƒ‰

      \n' + + '\n' + + '

      í•œ UI 섹션ì—ì„œ ë‹¤ìŒ UI 섹션으로 ì´ë™í•˜ë ¤ë©´ Tab(탭)ì„ ëˆ„ë¦…ë‹ˆë‹¤.

      \n' + + '\n' + + '

      í•œ UI 섹션ì—ì„œ ì´ì „ UI 섹션으로 ëŒì•„가려면 Shift+Tab(시프트+탭)ì„ ëˆ„ë¦…ë‹ˆë‹¤.

      \n' + + '\n' + + '

      ì´ UI ì„¹ì…˜ì˜ Tab(탭) 순서는 다ìŒê³¼ 같습니다.\n' + + '\n' + + '

        \n' + + '
      1. 메뉴 바
      2. \n' + + '
      3. ê° ë„구 ëª¨ìŒ ê·¸ë£¹
      4. \n' + + '
      5. 사ì´ë“œë°”
      6. \n' + + '
      7. í‘¸í„°ì˜ ìš”ì†Œ 경로
      8. \n' + + '
      9. í‘¸í„°ì˜ ë‹¨ì–´ 수 토글 버튼
      10. \n' + + '
      11. í‘¸í„°ì˜ ë¸Œëžœë”© ë§í¬
      12. \n' + + '
      13. í‘¸í„°ì˜ ì—디터 í¬ê¸° 변경 핸들
      14. \n' + + '
      \n' + + '\n' + + '

      UI ì„¹ì…˜ì´ ì—†ëŠ” 경우 건너뛰기합니다.

      \n' + + '\n' + + '

      í‘¸í„°ì— í‚¤ë³´ë“œ íƒìƒ‰ í¬ì»¤ìŠ¤ê°€ 있고 사ì´ë“œë°”는 ë³´ì´ì§€ 않는 경우 Shift+Tab(시프트+탭)ì„ ëˆ„ë¥´ë©´\n' + + ' í¬ì»¤ìŠ¤ 표시가 ë§ˆì§€ë§‰ì´ ì•„ë‹Œ 첫 번째 ë„구 ëª¨ìŒ ê·¸ë£¹ìœ¼ë¡œ ì´ë™í•©ë‹ˆë‹¤.\n' + + '\n' + + '

      UI 섹션 ë‚´ íƒìƒ‰

      \n' + + '\n' + + '

      í•œ UI 요소ì—ì„œ ë‹¤ìŒ UI 요소로 ì´ë™í•˜ë ¤ë©´ ì ì ˆí•œ 화살표 키를 누릅니다.

      \n' + + '\n' + + '

      왼쪽과 오른쪽 화살표 í‚¤ì˜ ìš©ë„:

      \n' + + '\n' + + '
        \n' + + '
      • 메뉴 모ìŒì—ì„œ 메뉴 항목 사ì´ë¥¼ ì´ë™í•©ë‹ˆë‹¤.
      • \n' + + '
      • 메뉴ì—ì„œ 하위 메뉴를 엽니다.
      • \n' + + '
      • ë„구 ëª¨ìŒ ê·¸ë£¹ì—ì„œ 버튼 사ì´ë¥¼ ì´ë™í•©ë‹ˆë‹¤.
      • \n' + + '
      • í‘¸í„°ì˜ ìš”ì†Œ 경로ì—ì„œ 항목 ê°„ì— ì´ë™í•©ë‹ˆë‹¤.
      • \n' + + '
      \n' + + '\n' + + '

      아래와 위 화살표 í‚¤ì˜ ìš©ë„:\n' + + '\n' + + '

        \n' + + '
      • 메뉴ì—ì„œ 메뉴 항목 사ì´ë¥¼ ì´ë™í•©ë‹ˆë‹¤.
      • \n' + + '
      • ë„구 ëª¨ìŒ íŒì—… 메뉴ì—ì„œ 메뉴 항목 사ì´ë¥¼ ì´ë™í•©ë‹ˆë‹¤.
      • \n' + + '
      \n' + + '\n' + + '

      화살표 키는 í¬ì»¤ìŠ¤ 표시 UI 섹션 ë‚´ì—ì„œ 순환ë©ë‹ˆë‹¤.

      \n' + + '\n' + + '

      ì—´ë ¤ 있는 메뉴, ì—´ë ¤ 있는 하위 메뉴 ë˜ëŠ” ì—´ë ¤ 있는 íŒì—… 메뉴를 닫으려면 Esc 키를 누릅니다.\n' + + '\n' + + "

      현재 í¬ì»¤ìŠ¤ 표시가 특정 UI 섹션 'ìƒë‹¨'ì— ìžˆëŠ” 경우 ì´ë•Œë„ Esc 키를 누르면\n" + + ' 키보드 íƒìƒ‰ì´ 완전히 종료ë©ë‹ˆë‹¤.

      \n' + + '\n' + + '

      메뉴 항목 ë˜ëŠ” ë„구 ëª¨ìŒ ë²„íŠ¼ 실행

      \n' + + '\n' + + '

      ì›í•˜ëŠ” 메뉴 항목 ë˜ëŠ” ë„구 ëª¨ìŒ ë²„íŠ¼ì´ ê°•ì¡° 표시ë˜ì–´ ìžˆì„ ë•Œ Return(리턴), Enter(엔터),\n' + + ' ë˜ëŠ” Space bar(스페ì´ìŠ¤ë°”)를 눌러 해당 í•­ëª©ì„ ì‹¤í–‰í•©ë‹ˆë‹¤.\n' + + '\n' + + '

      íƒ­ì´ ì—†ëŠ” 대화 íƒìƒ‰

      \n' + + '\n' + + '

      íƒ­ì´ ì—†ëŠ” ëŒ€í™”ì˜ ê²½ìš°, 첫 번째 대화형 요소가 í¬ì»¤ìŠ¤ í‘œì‹œëœ ìƒíƒœë¡œ 대화가 열립니다.

      \n' + + '\n' + + '

      대화형 요소들 사ì´ë¥¼ ì´ë™í•  때는 Tab(탭) ë˜ëŠ” Shift+Tab(시프트+탭)ì„ ëˆ„ë¦…ë‹ˆë‹¤.

      \n' + + '\n' + + '

      íƒ­ì´ ìžˆëŠ” 대화 íƒìƒ‰

      \n' + + '\n' + + '

      íƒ­ì´ ìžˆëŠ” ëŒ€í™”ì˜ ê²½ìš°, 탭 메뉴ì—ì„œ 첫 번째 ë²„íŠ¼ì´ í¬ì»¤ìŠ¤ í‘œì‹œëœ ìƒíƒœë¡œ 대화가 열립니다.

      \n' + + '\n' + + '

      ì´ ëŒ€í™” íƒ­ì˜ ëŒ€í™”í˜• 요소들 사ì´ë¥¼ ì´ë™í•  때는 Tab(탭) ë˜ëŠ”\n' + + ' Shift+Tab(시프트+탭)ì„ ëˆ„ë¦…ë‹ˆë‹¤.

      \n' + + '\n' + + '

      다른 대화 탭으로 ì´ë™í•˜ë ¤ë©´ 탭 메뉴를 í¬ì»¤ìŠ¤ 표시한 ë‹¤ìŒ ì ì ˆí•œ 화살표\n' + + ' 키를 눌러 사용 가능한 íƒ­ë“¤ì„ ì§€ë‚˜ ì›í•˜ëŠ” 탭으로 ì´ë™í•©ë‹ˆë‹¤.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/ms.js b/static/js/tinymce/plugins/help/js/i18n/keynav/ms.js new file mode 100644 index 0000000..579ab49 --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/ms.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.ms', +'

      Mulakan navigasi papan kekunci

      \n' + + '\n' + + '
      \n' + + '
      Fokus bar Menu
      \n' + + '
      Windows atau Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Fokus Bar Alat
      \n' + + '
      Windows atau Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Fokus pengaki
      \n' + + '
      Windows atau Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Fokus bar alat kontekstual
      \n' + + '
      Windows, Linux atau macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      Navigasi akan bermula pada item UI pertama, yang akan diserlahkan atau digaris bawah dalam saiz item pertama dalam\n' + + ' laluan elemen Pengaki.

      \n' + + '\n' + + '

      Navigasi antara bahagian UI

      \n' + + '\n' + + '

      Untuk bergerak dari satu bahagian UI ke yang seterusnya, tekan Tab.

      \n' + + '\n' + + '

      Untuk bergerak dari satu bahagian UI ke yang sebelumnya, tekan Shift+Tab.

      \n' + + '\n' + + '

      Tertib Tab bahagian UI ini ialah:\n' + + '\n' + + '

        \n' + + '
      1. Bar menu
      2. \n' + + '
      3. Setiap kumpulan bar alat
      4. \n' + + '
      5. Bar sisi
      6. \n' + + '
      7. Laluan elemen dalam pengaki
      8. \n' + + '
      9. Butang togol kiraan perkataan dalam pengaki
      10. \n' + + '
      11. Pautan penjenamaan dalam pengaki
      12. \n' + + '
      13. Pemegang saiz semula editor dalam pengaki
      14. \n' + + '
      \n' + + '\n' + + '

      Jika bahagian UI tidak wujud, ia dilangkau.

      \n' + + '\n' + + '

      Jika pengaki mempunyai fokus navigasi papan kekunci dan tiada bar sisi kelihatan, menekan Shift+Tab\n' + + ' akan mengalihkan fokus ke kumpulan bar alat pertama, bukannya yang terakhir.\n' + + '\n' + + '

      Navigasi dalam bahagian UI

      \n' + + '\n' + + '

      Untuk bergerak dari satu elemen UI ke yang seterusnya, tekan kekunci Anak Panah yang bersesuaian.

      \n' + + '\n' + + '

      Kekunci anak panah Kiri dan Kanan

      \n' + + '\n' + + '
        \n' + + '
      • bergerak antara menu dalam bar menu.
      • \n' + + '
      • membukan submenu dalam menu.
      • \n' + + '
      • bergerak antara butang dalam kumpulan bar alat.
      • \n' + + '
      • Laluan elemen dalam pengaki.
      • \n' + + '
      \n' + + '\n' + + '

      Kekunci anak panah Bawah dan Atas\n' + + '\n' + + '

        \n' + + '
      • bergerak antara item menu dalam menu.
      • \n' + + '
      • bergerak antara item dalam menu timbul bar alat.
      • \n' + + '
      \n' + + '\n' + + '

      Kekunci Anak Panah berkitar dalam bahagian UI difokuskan.

      \n' + + '\n' + + '

      Untuk menutup menu buka, submenu terbuka atau menu timbul terbuka, tekan kekunci Esc.\n' + + '\n' + + "

      Jika fokus semasa berada di bahagian 'atas' bahagian UI tertentu, menekan kekunci Esc juga akan keluar daripada\n" + + ' navigasi papan kekunci sepenuhnya.

      \n' + + '\n' + + '

      Laksanakan item menu atau butang bar alat

      \n' + + '\n' + + '

      Apabila item menu atau butang bar alat yang diinginkan diserlahkan, tekan Return, Enter,\n' + + ' atau bar Space untuk melaksanakan item.\n' + + '\n' + + '

      Navigasi ke dialog tidak bertab

      \n' + + '\n' + + '

      Dalam dialog tidak bertab, komponen interaksi pertama difokuskan apabila dialog dibuka.

      \n' + + '\n' + + '

      Navigasi antara komponen dialog interaktif dengan menekan Tab atau Shift+Tab.

      \n' + + '\n' + + '

      Navigasi ke dialog bertab

      \n' + + '\n' + + '

      Dalam dialog bertab, butang pertama dalam menu tab difokuskan apabila dialog dibuka.

      \n' + + '\n' + + '

      Navigasi antara komponen interaktif tab dialog ini dengan menekan Tab atau\n' + + ' Shift+Tab.

      \n' + + '\n' + + '

      Tukar kepada tab dialog lain dengan memfokuskan menu tab, kemudian menekan kekunci Anak Panah yang bersesuaian\n' + + ' untuk berkitar menerusi tab yang tersedia.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/nb_NO.js b/static/js/tinymce/plugins/help/js/i18n/keynav/nb_NO.js new file mode 100644 index 0000000..f28db8f --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/nb_NO.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.nb_NO', +'

      Starte tastaturnavigering

      \n' + + '\n' + + '
      \n' + + '
      Utheve menylinjen
      \n' + + '
      Windows eller Linux: Alt + F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Utheve verktøylinjen
      \n' + + '
      Windows eller Linux: Alt + F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Utheve bunnteksten
      \n' + + '
      Windows eller Linux: Alt + F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Utheve en kontekstuell verktøylinje
      \n' + + '
      Windows, Linux eller macOS: Ctrl + F9\n' + + '
      \n' + + '\n' + + '

      Navigeringen starter ved det første grensesnittelementet, som utheves, eller understrekes når det gjelder det første elementet i\n' + + ' elementstien i bunnteksten.

      \n' + + '\n' + + '

      Navigere mellom grensesnittdeler

      \n' + + '\n' + + '

      Du kan bevege deg fra én grensesnittdel til den neste ved å trykke på tabulatortasten.

      \n' + + '\n' + + '

      Du kan bevege deg fra én grensesnittdel til den forrige ved å trykke på Shift + tabulatortasten.

      \n' + + '\n' + + '

      Rekkefølgen til tabulatortasten gjennom grensesnittdelene er:\n' + + '\n' + + '

        \n' + + '
      1. Menylinjen
      2. \n' + + '
      3. Hver gruppe på verktøylinjen
      4. \n' + + '
      5. Sidestolpen
      6. \n' + + '
      7. Elementstien i bunnteksten
      8. \n' + + '
      9. Veksleknappen for ordantall i bunnteksten
      10. \n' + + '
      11. Merkelenken i bunnteksten
      12. \n' + + '
      13. Skaleringshåndtaket for redigeringsprogrammet i bunnteksten
      14. \n' + + '
      \n' + + '\n' + + '

      Hvis en grensesnittdel ikke er til stede, blir den hoppet over.

      \n' + + '\n' + + '

      Hvis tastaturnavigeringen har uthevet bunnteksten og det ikke finnes en synlig sidestolpe, kan du trykke på Shift + tabulatortasten\n' + + ' for å flytte fokuset til den første gruppen på verktøylinjen i stedet for den siste.\n' + + '\n' + + '

      Navigere innenfor grensesnittdeler

      \n' + + '\n' + + '

      Du kan bevege deg fra ett grensesnittelement til det neste ved å trykke på den aktuelle piltasten.

      \n' + + '\n' + + '

      De venstre og høyre piltastene

      \n' + + '\n' + + '
        \n' + + '
      • beveger deg mellom menyer pÃ¥ menylinjen.
      • \n' + + '
      • Ã¥pner en undermeny i en meny.
      • \n' + + '
      • beveger deg mellom knapper i en gruppe pÃ¥ verktøylinjen.
      • \n' + + '
      • beveger deg mellom elementer i elementstien i bunnteksten.
      • \n' + + '
      \n' + + '\n' + + '

      Ned- og opp-piltastene\n' + + '\n' + + '

        \n' + + '
      • beveger deg mellom menyelementer i en meny.
      • \n' + + '
      • beveger deg mellom elementer i en hurtigmeny pÃ¥ verktøylinjen.
      • \n' + + '
      \n' + + '\n' + + '

      Med piltastene kan du bevege deg innenfor den uthevede grensesnittdelen.

      \n' + + '\n' + + '

      Du kan lukke en åpen meny, en åpen undermeny eller en åpen hurtigmeny ved å klikke på Esc-tasten.\n' + + '\n' + + '

      Hvis det øverste nivået i en grensesnittdel er uthevet, kan du ved å trykke på Esc også avslutte\n' + + ' tastaturnavigeringen helt.

      \n' + + '\n' + + '

      Utføre et menyelement eller en knapp på en verktøylinje

      \n' + + '\n' + + '

      Når det ønskede menyelementet eller verktøylinjeknappen er uthevet, trykker du på Retur, Enter,\n' + + ' eller mellomromstasten for å utføre elementet.\n' + + '\n' + + '

      Navigere i dialogbokser uten faner

      \n' + + '\n' + + '

      I dialogbokser uten faner blir den første interaktive komponenten uthevet når dialogboksen åpnes.

      \n' + + '\n' + + '

      Naviger mellom interaktive komponenter i dialogboksen ved å trykke på tabulatortasten eller Shift + tabulatortasten.

      \n' + + '\n' + + '

      Navigere i fanebaserte dialogbokser

      \n' + + '\n' + + '

      I fanebaserte dialogbokser blir den første knappen i fanemenyen uthevet når dialogboksen åpnes.

      \n' + + '\n' + + '

      Naviger mellom interaktive komponenter i fanen ved å trykke på tabulatortasten eller\n' + + ' Shift + tabulatortasten.

      \n' + + '\n' + + '

      Veksle til en annen fane i dialogboksen ved å utheve fanemenyen, og trykk deretter på den aktuelle piltasten\n' + + ' for å bevege deg mellom de tilgjengelige fanene.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/nl.js b/static/js/tinymce/plugins/help/js/i18n/keynav/nl.js new file mode 100644 index 0000000..99836a6 --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/nl.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.nl', +'

      Toetsenbordnavigatie starten

      \n' + + '\n' + + '
      \n' + + '
      Focus op de menubalk instellen
      \n' + + '
      Windows of Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Focus op de werkbalk instellen
      \n' + + '
      Windows of Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Focus op de voettekst instellen
      \n' + + '
      Windows of Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Focus op een contextuele werkbalk instellen
      \n' + + '
      Windows, Linux of macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      De navigatie start bij het eerste UI-item, dat wordt gemarkeerd of onderstreept als het eerste item zich in\n' + + ' in het elementenpad van de voettekst bevindt.

      \n' + + '\n' + + '

      Navigeren tussen UI-secties

      \n' + + '\n' + + '

      Druk op Tab om naar de volgende UI-sectie te gaan.

      \n' + + '\n' + + '

      Druk op Shift+Tab om naar de vorige UI-sectie te gaan.

      \n' + + '\n' + + '

      De Tab-volgorde van deze UI-secties is:\n' + + '\n' + + '

        \n' + + '
      1. Menubalk
      2. \n' + + '
      3. Elke werkbalkgroep
      4. \n' + + '
      5. Zijbalk
      6. \n' + + '
      7. Elementenpad in de voettekst
      8. \n' + + '
      9. Wisselknop voor aantal woorden in de voettekst
      10. \n' + + '
      11. Merkkoppeling in de voettekst
      12. \n' + + '
      13. Greep voor het wijzigen van het formaat van de editor in de voettekst
      14. \n' + + '
      \n' + + '\n' + + '

      Als een UI-sectie niet aanwezig is, wordt deze overgeslagen.

      \n' + + '\n' + + '

      Als de focus van de toetsenbordnavigatie is ingesteld op de voettekst en er geen zichtbare zijbalk is, kun je op Shift+Tab drukken\n' + + ' om de focus naar de eerste werkbalkgroep in plaats van de laatste te verplaatsen.\n' + + '\n' + + '

      Navigeren binnen UI-secties

      \n' + + '\n' + + '

      Druk op de pijltjestoets om naar het betreffende UI-element te gaan.

      \n' + + '\n' + + '

      Met de pijltjestoetsen Links en Rechts

      \n' + + '\n' + + '
        \n' + + "
      • wissel je tussen menu's in de menubalk.
      • \n" + + '
      • open je een submenu in een menu.
      • \n' + + '
      • wissel je tussen knoppen in een werkbalkgroep.
      • \n' + + '
      • wissel je tussen items in het elementenpad in de voettekst.
      • \n' + + '
      \n' + + '\n' + + '

      Met de pijltjestoetsen Omlaag en Omhoog\n' + + '\n' + + '

        \n' + + '
      • wissel je tussen menu-items in een menu.
      • \n' + + '
      • wissel je tussen items in een werkbalkpop-upmenu.
      • \n' + + '
      \n' + + '\n' + + '

      Met de pijltjestoetsen wissel je binnen de UI-sectie waarop de focus is ingesteld.

      \n' + + '\n' + + '

      Druk op de toets Esc om een geopend menu, submenu of pop-upmenu te sluiten.\n' + + '\n' + + "

      Als de huidige focus is ingesteld 'bovenaan' een bepaalde UI-sectie, kun je op de toets Esc drukken\n" + + ' om de toetsenbordnavigatie af te sluiten.

      \n' + + '\n' + + '

      Een menu-item of werkbalkknop uitvoeren

      \n' + + '\n' + + '

      Als het gewenste menu-item of de gewenste werkbalkknop is gemarkeerd, kun je op Return, Enter\n' + + ' of de spatiebalk drukken om het item uit te voeren.\n' + + '\n' + + '

      Navigeren in dialoogvensters zonder tabblad

      \n' + + '\n' + + '

      Als een dialoogvenster zonder tabblad wordt geopend, wordt de focus ingesteld op het eerste interactieve onderdeel.

      \n' + + '\n' + + '

      Je kunt navigeren tussen interactieve onderdelen van een dialoogvenster door op Tab of Shift+Tab te drukken.

      \n' + + '\n' + + '

      Navigeren in dialoogvensters met tabblad

      \n' + + '\n' + + '

      Als een dialoogvenster met tabblad wordt geopend, wordt de focus ingesteld op de eerste knop in het tabbladmenu.

      \n' + + '\n' + + '

      Je kunt navigeren tussen interactieve onderdelen van dit tabblad van het dialoogvenster door op Tab of\n' + + ' Shift+Tab te drukken.

      \n' + + '\n' + + '

      Je kunt overschakelen naar een ander tabblad van het dialoogvenster door de focus in te stellen op het tabbladmenu en vervolgens op de juiste pijltjestoets\n' + + ' te drukken om tussen de beschikbare tabbladen te wisselen.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/pl.js b/static/js/tinymce/plugins/help/js/i18n/keynav/pl.js new file mode 100644 index 0000000..16704a0 --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/pl.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.pl', +'

      Początek nawigacji przy użyciu klawiatury

      \n' + + '\n' + + '
      \n' + + '
      Ustaw fokus na pasek menu
      \n' + + '
      Windows lub Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Ustaw fokus na pasek narzędzi
      \n' + + '
      Windows lub Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Ustaw fokus na sekcjÄ™ Footer
      \n' + + '
      Windows lub Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Ustaw fokus na kontekstowy pasek narzędzi
      \n' + + '
      Windows, Linux lub macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      Nawigacja zostanie rozpoczęta od pierwszego elementu interfejsu użytkownika, który jest podświetlony lub — w przypadku pierwszego elementu\n' + + ' w ścieżce elementów w sekcji Footer — podkreślony.

      \n' + + '\n' + + '

      Nawigacja pomiędzy sekcjami interfejsu użytkownika

      \n' + + '\n' + + '

      Aby przenieść się z danej sekcji interfejsu użytkownika do następnej, naciśnij Tab.

      \n' + + '\n' + + '

      Aby przenieść się z danej sekcji interfejsu użytkownika do poprzedniej, naciśnij Shift+Tab.

      \n' + + '\n' + + '

      Kolejność klawisza Tab w takich sekcjach interfejsu użytkownika jest następująca:\n' + + '\n' + + '

        \n' + + '
      1. Pasek menu
      2. \n' + + '
      3. Każda grupa na pasku narzędzi
      4. \n' + + '
      5. Pasek boczny
      6. \n' + + '
      7. Ścieżka elementów w sekcji Footer
      8. \n' + + '
      9. Przycisk przełączania liczby słów w sekcji Footer
      10. \n' + + '
      11. ÅÄ…cze brandujÄ…ce w sekcji Footer
      12. \n' + + '
      13. Uchwyt zmiany rozmiaru edytora w sekcji Footer
      14. \n' + + '
      \n' + + '\n' + + '

      Jeżeli nie ma sekcji interfejsu użytkownika, jest to pomijane.

      \n' + + '\n' + + '

      Jeżeli na sekcji Footer jest ustawiony fokus nawigacji przy użyciu klawiatury i nie ma widocznego paska bocznego, naciśnięcie Shift+Tab\n' + + ' przenosi fokus na pierwszą grupę paska narzędzi, a nie na ostatnią.\n' + + '\n' + + '

      Nawigacja wewnątrz sekcji interfejsu użytkownika

      \n' + + '\n' + + '

      Aby przenieść się z danego elementu interfejsu użytkownika do następnego, naciśnij odpowiedni klawisz strzałki.

      \n' + + '\n' + + '

      Klawisze strzałek w prawo i w lewo służą do

      \n' + + '\n' + + '
        \n' + + '
      • przenoszenia siÄ™ pomiÄ™dzy menu na pasku menu,
      • \n' + + '
      • otwarcia podmenu w menu,
      • \n' + + '
      • przenoszenia siÄ™ pomiÄ™dzy przyciskami w grupie paska narzÄ™dzi,
      • \n' + + '
      • przenoszenia siÄ™ pomiÄ™dzy elementami w Å›cieżce elementów w sekcji Footer.
      • \n' + + '
      \n' + + '\n' + + '

      Klawisze strzałek w dół i w górę służą do\n' + + '\n' + + '

        \n' + + '
      • przenoszenia siÄ™ pomiÄ™dzy elementami menu w menu,
      • \n' + + '
      • przenoszenia siÄ™ pomiÄ™dzy elementami w wyskakujÄ…cym menu paska narzÄ™dzi.
      • \n' + + '
      \n' + + '\n' + + '

      Klawisze strzałek służą do przemieszczania się w sekcji interfejsu użytkownika z ustawionym fokusem.

      \n' + + '\n' + + '

      Aby zamknąć otwarte menu, otwarte podmenu lub otwarte menu wyskakujące, naciśnij klawisz Esc.\n' + + '\n' + + '

      Jeżeli fokus jest ustawiony na górze konkretnej sekcji interfejsu użytkownika, naciśnięcie klawisza Esc powoduje wyjście\n' + + ' z nawigacji przy użyciu klawiatury.

      \n' + + '\n' + + '

      Wykonanie elementu menu lub przycisku paska narzędzi

      \n' + + '\n' + + '

      Gdy podświetlony jest żądany element menu lub przycisk paska narzędzi, naciśnij klawisz Return, Enter\n' + + ' lub Spacja, aby go wykonać.\n' + + '\n' + + '

      Nawigacja po oknie dialogowym bez kart

      \n' + + '\n' + + '

      Gdy otwiera się okno dialogowe bez kart, fokus ustawiany jest na pierwszą interaktywną część okna.

      \n' + + '\n' + + '

      Pomiędzy interaktywnymi częściami okna dialogowego nawiguj, naciskając klawisze Tab lub Shift+Tab.

      \n' + + '\n' + + '

      Nawigacja po oknie dialogowym z kartami

      \n' + + '\n' + + '

      W przypadku okna dialogowego z kartami po otwarciu okna dialogowego fokus ustawiany jest na pierwszy przycisk w menu karty.

      \n' + + '\n' + + '

      Nawigację pomiędzy interaktywnymi częściami karty okna dialogowego prowadzi się poprzez naciskanie klawiszy Tab lub\n' + + ' Shift+Tab.

      \n' + + '\n' + + '

      Przełączenie się na inną kartę okna dialogowego wykonuje się poprzez ustawienie fokusu na menu karty i naciśnięcie odpowiedniego klawisza strzałki\n' + + ' w celu przemieszczenia się pomiędzy dostępnymi kartami.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/pt_BR.js b/static/js/tinymce/plugins/help/js/i18n/keynav/pt_BR.js new file mode 100644 index 0000000..dea9abf --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/pt_BR.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.pt_BR', +'

      Iniciar navegação pelo teclado

      \n' + + '\n' + + '
      \n' + + '
      Foco na barra de menus
      \n' + + '
      Windows ou Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Foco na barra de ferramentas
      \n' + + '
      Windows ou Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Foco no rodapé
      \n' + + '
      Windows ou Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Foco na barra de ferramentas contextual
      \n' + + '
      Windows, Linux ou macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      A navegação inicia no primeiro item da IU, que será destacado ou sublinhado no caso do primeiro item no\n' + + ' caminho do elemento Rodapé.

      \n' + + '\n' + + '

      Navegar entre seções da IU

      \n' + + '\n' + + '

      Para ir de uma seção da IU para a seguinte, pressione Tab.

      \n' + + '\n' + + '

      Para ir de uma seção da IU para a anterior, pressione Shift+Tab.

      \n' + + '\n' + + '

      A ordem de Tab destas seções da IU é:\n' + + '\n' + + '

        \n' + + '
      1. Barra de menus
      2. \n' + + '
      3. Cada grupo da barra de ferramentas
      4. \n' + + '
      5. Barra lateral
      6. \n' + + '
      7. Caminho do elemento no rodapé
      8. \n' + + '
      9. Botão de alternar contagem de palavras no rodapé
      10. \n' + + '
      11. Link da marca no rodapé
      12. \n' + + '
      13. Alça de redimensionamento do editor no rodapé
      14. \n' + + '
      \n' + + '\n' + + '

      Se não houver uma seção da IU, ela será pulada.

      \n' + + '\n' + + '

      Se o rodapé tiver o foco da navegação pelo teclado e não houver uma barra lateral visível, pressionar Shift+Tab\n' + + ' move o foco para o primeiro grupo da barra de ferramentas, não para o último.\n' + + '\n' + + '

      Navegar dentro das seções da IU

      \n' + + '\n' + + '

      Para ir de um elemento da IU para o seguinte, pressione a Seta correspondente.

      \n' + + '\n' + + '

      As teclas de seta Esquerda e Direita

      \n' + + '\n' + + '
        \n' + + '
      • movem entre menus na barra de menus.
      • \n' + + '
      • abrem um submenu em um menu.
      • \n' + + '
      • movem entre botões em um grupo da barra de ferramentas.
      • \n' + + '
      • movem entre itens no caminho do elemento do rodapé.
      • \n' + + '
      \n' + + '\n' + + '

      As teclas de seta Abaixo e Acima\n' + + '\n' + + '

        \n' + + '
      • movem entre itens de menu em um menu.
      • \n' + + '
      • movem entre itens em um menu suspenso da barra de ferramentas.
      • \n' + + '
      \n' + + '\n' + + '

      As teclas de Seta alternam dentre a seção da IU em foco.

      \n' + + '\n' + + '

      Para fechar um menu aberto, um submenu aberto ou um menu suspenso aberto, pressione Esc.\n' + + '\n' + + '

      Se o foco atual estiver no ‘alto’ de determinada seção da IU, pressionar Esc também sai\n' + + ' totalmente da navegação pelo teclado.

      \n' + + '\n' + + '

      Executar um item de menu ou botão da barra de ferramentas

      \n' + + '\n' + + '

      Com o item de menu ou botão da barra de ferramentas desejado destacado, pressione Return, Enter,\n' + + ' ou a Barra de espaço para executar o item.\n' + + '\n' + + '

      Navegar por caixas de diálogo sem guias

      \n' + + '\n' + + '

      Em caixas de diálogo sem guias, o primeiro componente interativo recebe o foco quando a caixa de diálogo abre.

      \n' + + '\n' + + '

      Navegue entre componentes interativos de caixa de diálogo pressionando Tab ou Shift+Tab.

      \n' + + '\n' + + '

      Navegar por caixas de diálogo com guias

      \n' + + '\n' + + '

      Em caixas de diálogo com guias, o primeiro botão no menu da guia recebe o foco quando a caixa de diálogo abre.

      \n' + + '\n' + + '

      Navegue entre componentes interativos dessa guia da caixa de diálogo pressionando Tab ou\n' + + ' Shift+Tab.

      \n' + + '\n' + + '

      Alterne para outra guia da caixa de diálogo colocando o foco no menu da guia e pressionando a Seta\n' + + ' adequada para percorrer as guias disponíveis.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/pt_PT.js b/static/js/tinymce/plugins/help/js/i18n/keynav/pt_PT.js new file mode 100644 index 0000000..b41bacd --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/pt_PT.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.pt_PT', +'

      Iniciar navegação com teclado

      \n' + + '\n' + + '
      \n' + + '
      Foco na barra de menu
      \n' + + '
      Windows ou Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Foco na barra de ferramentas
      \n' + + '
      Windows ou Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Foco no rodapé
      \n' + + '
      Windows ou Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Foco numa barra de ferramentas contextual
      \n' + + '
      Windows, Linux ou macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      A navegação começará no primeiro item de IU, que estará realçado ou sublinhado, no caso do primeiro item no\n' + + ' caminho do elemento do rodapé.

      \n' + + '\n' + + '

      Navegar entre secções de IU

      \n' + + '\n' + + '

      Para se mover de uma secção de IU para a seguinte, prima Tab.

      \n' + + '\n' + + '

      Para se mover de uma secção de IU para a anterior, prima Shift+Tab.

      \n' + + '\n' + + '

      A ordem de tabulação destas secções de IU é:\n' + + '\n' + + '

        \n' + + '
      1. Barra de menu
      2. \n' + + '
      3. Cada grupo da barra de ferramentas
      4. \n' + + '
      5. Barra lateral
      6. \n' + + '
      7. Caminho do elemento no rodapé
      8. \n' + + '
      9. Botão de alternar da contagem de palavras no rodapé
      10. \n' + + '
      11. Ligação da marca no rodapé
      12. \n' + + '
      13. Alça de redimensionamento do editor no rodapé
      14. \n' + + '
      \n' + + '\n' + + '

      Se uma secção de IU não estiver presente, é ignorada.

      \n' + + '\n' + + '

      Se o rodapé tiver foco de navegação com teclado e não existir uma barra lateral visível, premir Shift+Tab\n' + + ' move o foco para o primeiro grupo da barra de ferramentas e não para o último.\n' + + '\n' + + '

      Navegar nas secções de IU

      \n' + + '\n' + + '

      Para se mover de um elemento de IU para o seguinte, prima a tecla de seta adequada.

      \n' + + '\n' + + '

      As teclas de seta Para a esquerda e Para a direita

      \n' + + '\n' + + '
        \n' + + '
      • movem-se entre menus na barra de menu.
      • \n' + + '
      • abrem um submenu num menu.
      • \n' + + '
      • movem-se entre botões num grupo da barra de ferramentas.
      • \n' + + '
      • movem-se entre itens no caminho do elemento do rodapé.
      • \n' + + '
      \n' + + '\n' + + '

      As teclas de seta Para cima e Para baixo\n' + + '\n' + + '

        \n' + + '
      • movem-se entre itens de menu num menu.
      • \n' + + '
      • movem-se entre itens num menu de pop-up da barra de ferramentas.
      • \n' + + '
      \n' + + '\n' + + '

      As teclas de seta deslocam-se ciclicamente na secção de IU em foco.

      \n' + + '\n' + + '

      Para fechar um menu aberto, um submenu aberto ou um menu de pop-up aberto, prima a tecla Esc.\n' + + '\n' + + '

      Se o foco atual estiver no "topo" de determinada secção de IU, premir a tecla Esc também fecha\n' + + ' completamente a navegação com teclado.

      \n' + + '\n' + + '

      Executar um item de menu ou botão da barra de ferramentas

      \n' + + '\n' + + '

      Quando o item de menu ou o botão da barra de ferramentas pretendido estiver realçado, prima Retrocesso, Enter\n' + + ' ou a Barra de espaço para executar o item.\n' + + '\n' + + '

      Navegar em diálogos sem separadores

      \n' + + '\n' + + '

      Nos diálogos sem separadores, o primeiro componente interativo fica em foco quando o diálogo abre.

      \n' + + '\n' + + '

      Navegue entre componentes interativos do diálogo, premindo Tab ou Shift+Tab.

      \n' + + '\n' + + '

      Navegar em diálogos com separadores

      \n' + + '\n' + + '

      Nos diálogos com separadores, o primeiro botão no menu do separador fica em foco quando o diálogo abre.

      \n' + + '\n' + + '

      Navegue entre os componentes interativos deste separador do diálogo, premindo Tab ou\n' + + ' Shift+Tab.

      \n' + + '\n' + + '

      Mude para outro separador do diálogo colocando o menu do separador em foco e, em seguida, premindo a tecla de seta\n' + + ' adequada para se deslocar ciclicamente pelos separadores disponíveis.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/ro.js b/static/js/tinymce/plugins/help/js/i18n/keynav/ro.js new file mode 100644 index 0000000..738be9d --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/ro.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.ro', +'

      Începeți navigarea de la tastatură

      \n' + + '\n' + + '
      \n' + + '
      Focalizare pe bara de meniu
      \n' + + '
      Windows sau Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Focalizare pe bara de instrumente
      \n' + + '
      Windows sau Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Focalizare pe subsol
      \n' + + '
      Windows sau Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Focalizare pe o bară de instrumente contextuală
      \n' + + '
      Windows, Linux sau macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      Navigarea va începe de la primul element al interfeței cu utilizatorul, care va fi evidențiat sau subliniat în cazul primului element din\n' + + ' calea elementului Subsol.

      \n' + + '\n' + + '

      Navigați între secțiunile interfeței cu utilizatorul

      \n' + + '\n' + + '

      Pentru a trece de la o secțiune a interfeței cu utilizatorul la alta, apăsați Tab.

      \n' + + '\n' + + '

      Pentru a trece de la o secțiune a interfeței cu utilizatorul la cea anterioară, apăsați Shift+Tab.

      \n' + + '\n' + + '

      Ordinea cu Tab a acestor secțiuni ale interfeței cu utilizatorul este următoarea:\n' + + '\n' + + '

        \n' + + '
      1. Bara de meniu
      2. \n' + + '
      3. Fiecare grup de bare de instrumente
      4. \n' + + '
      5. Bara laterală
      6. \n' + + '
      7. Calea elementului în subsol
      8. \n' + + '
      9. Buton de comutare a numărului de cuvinte în subsol
      10. \n' + + '
      11. Link de branding în subsol
      12. \n' + + '
      13. Mâner de redimensionare a editorului în subsol
      14. \n' + + '
      \n' + + '\n' + + '

      În cazul în care o secțiune a interfeței cu utilizatorul nu este prezentă, aceasta este omisă.

      \n' + + '\n' + + '

      În cazul în care subsolul are focalizarea navigației asupra tastaturii și nu există o bară laterală vizibilă, apăsarea butonului Shift+Tab\n' + + ' mută focalizarea pe primul grup de bare de instrumente, nu pe ultimul.\n' + + '\n' + + '

      Navigați în secțiunile interfeței cu utilizatorul

      \n' + + '\n' + + '

      Pentru a trece de la un element de interfață cu utilizatorul la următorul, apăsați tasta cu săgeata corespunzătoare.

      \n' + + '\n' + + '

      Tastele cu săgeți către stânga și dreapta

      \n' + + '\n' + + '
        \n' + + '
      • navighează între meniurile din bara de meniuri.
      • \n' + + '
      • deschid un sub-meniu dintr-un meniu.
      • \n' + + '
      • navighează între butoanele dintr-un grup de bare de instrumente.
      • \n' + + '
      • navighează între elementele din calea elementelor subsolului.
      • \n' + + '
      \n' + + '\n' + + '

      Tastele cu săgeți în sus și în jos\n' + + '\n' + + '

        \n' + + '
      • navighează între elementele de meniu dintr-un meniu.
      • \n' + + '
      • navighează între elementele unui meniu pop-up din bara de instrumente.
      • \n' + + '
      \n' + + '\n' + + '

      Tastele cu săgeți navighează în cadrul secțiunii interfeței cu utilizatorul asupra căreia se focalizează.

      \n' + + '\n' + + '

      Pentru a închide un meniu deschis, un sub-meniu deschis sau un meniu pop-up deschis, apăsați tasta Esc.\n' + + '\n' + + '

      Dacă focalizarea curentă este asupra „părții superioare†a unei anumite secțiuni a interfeței cu utilizatorul, prin apăsarea tastei Esc se iese, de asemenea,\n' + + ' în întregime din navigarea de la tastatură.

      \n' + + '\n' + + '

      Executarea unui element de meniu sau a unui buton din bara de instrumente

      \n' + + '\n' + + '

      Atunci când elementul de meniu dorit sau butonul dorit din bara de instrumente este evidențiat, apăsați Return, Enter,\n' + + ' sau bara de spațiu pentru a executa elementul.\n' + + '\n' + + '

      Navigarea de dialoguri fără file

      \n' + + '\n' + + '

      În dialogurile fără file, prima componentă interactivă beneficiază de focalizare la deschiderea dialogului.

      \n' + + '\n' + + '

      Navigați între componentele dialogului interactiv apăsând Tab sau Shift+Tab.

      \n' + + '\n' + + '

      Navigarea de dialoguri cu file

      \n' + + '\n' + + '

      În dialogurile cu file, primul buton din meniul cu file beneficiază de focalizare la deschiderea dialogului.

      \n' + + '\n' + + '

      Navigați între componentele interactive ale acestei file de dialog apăsând Tab sau\n' + + ' Shift+Tab.

      \n' + + '\n' + + '

      Treceți la o altă filă de dialog focalizând asupra meniului cu file și apoi apăsând săgeata corespunzătoare\n' + + ' pentru a parcurge filele disponibile.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/ru.js b/static/js/tinymce/plugins/help/js/i18n/keynav/ru.js new file mode 100644 index 0000000..83ec76e --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/ru.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.ru', +'

      Ðачните управление Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ клавиатуры

      \n' + + '\n' + + '
      \n' + + '
      Ð¤Ð¾ÐºÑƒÑ Ð½Ð° панели меню
      \n' + + '
      Windows или Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Ð¤Ð¾ÐºÑƒÑ Ð½Ð° панели инÑтрументов
      \n' + + '
      Windows или Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Ð¤Ð¾ÐºÑƒÑ Ð½Ð° нижнем колонтитуле
      \n' + + '
      Windows или Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Ð¤Ð¾ÐºÑƒÑ Ð½Ð° контекÑтной панели инÑтрументов
      \n' + + '
      Windows, Linux или macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      Первый доÑтупный Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñлемент интерфейÑа будет выделен цветом или подчеркнут (еÑли он находитÑÑ\n' + + ' в пути Ñлементов нижнего колонтитула).

      \n' + + '\n' + + '

      Переход между разделами пользовательÑкого интерфейÑа

      \n' + + '\n' + + '

      Чтобы перейти из текущего раздела интерфейÑа в Ñледующий, нажмите Tab.

      \n' + + '\n' + + '

      Чтобы перейти из текущего раздела интерфейÑа в предыдущий, нажмите Shift+Tab.

      \n' + + '\n' + + '

      Вкладки разделов интерфейÑа раÑположены в Ñледующем порÑдке:\n' + + '\n' + + '

        \n' + + '
      1. Панель меню
      2. \n' + + '
      3. Группы панели инÑтрументов
      4. \n' + + '
      5. Ð‘Ð¾ÐºÐ¾Ð²Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ
      6. \n' + + '
      7. Путь Ñлементов нижнего колонтитула
      8. \n' + + '
      9. ПодÑчет Ñлов/Ñимволов в нижнем колонтитуле
      10. \n' + + '
      11. Ð‘Ñ€ÐµÐ½Ð´Ð¾Ð²Ð°Ñ ÑÑылка в нижнем колонтитуле
      12. \n' + + '
      13. Угол Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° окна редактора
      14. \n' + + '
      \n' + + '\n' + + '

      ЕÑли раздел интерфейÑа отÑутÑтвует, он пропуÑкаетÑÑ.

      \n' + + '\n' + + '

      ЕÑли при управлении Ñ ÐºÐ»Ð°Ð²Ð¸Ð°Ñ‚ÑƒÑ€Ñ‹ Ñ„Ð¾ÐºÑƒÑ Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑÑ Ð½Ð° нижнем колонтитуле, а Ð²Ð¸Ð´Ð¸Ð¼Ð°Ñ Ð±Ð¾ÐºÐ¾Ð²Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ отÑутÑтвует, то при нажатии ÑÐ¾Ñ‡ÐµÑ‚Ð°Ð½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ Shift+Tab\n' + + ' Ñ„Ð¾ÐºÑƒÑ Ð¿ÐµÑ€ÐµÐ½Ð¾ÑитÑÑ Ð½Ð° первую группу панели инÑтрументов, а не на поÑледнюю.\n' + + '\n' + + '

      Переход между Ñлементами внутри разделов пользовательÑкого интерфейÑа

      \n' + + '\n' + + '

      Чтобы перейти от текущего Ñлемента интерфейÑа к Ñледующему, нажмите ÑоответÑтвующую клавишу Ñо Ñтрелкой.

      \n' + + '\n' + + '

      Клавиши Ñо Ñтрелками влево и вправо позволÑÑŽÑ‚

      \n' + + '\n' + + '
        \n' + + '
      • перемещатьÑÑ Ð¼ÐµÐ¶Ð´Ñƒ разными меню в панели меню.
      • \n' + + '
      • открывать разделы меню.
      • \n' + + '
      • перемещатьÑÑ Ð¼ÐµÐ¶Ð´Ñƒ кнопками в группе панели инÑтрументов.
      • \n' + + '
      • перемещатьÑÑ Ð¼ÐµÐ¶Ð´Ñƒ Ñлементами в пути Ñлементов нижнего колонтитула.
      • \n' + + '
      \n' + + '\n' + + '

      Клавиши Ñо Ñтрелками вниз и вверх позволÑÑŽÑ‚\n' + + '\n' + + '

        \n' + + '
      • перемещатьÑÑ Ð¼ÐµÐ¶Ð´Ñƒ Ñлементами одного меню.
      • \n' + + '
      • перемещатьÑÑ Ð¼ÐµÐ¶Ð´Ñƒ Ñлементами вÑплывающего меню в панели инÑтрументов.
      • \n' + + '
      \n' + + '\n' + + '

      При иÑпользовании клавиш Ñо Ñтрелками вы будете цикличеÑки перемещатьÑÑ Ð¿Ð¾ Ñлементам в пределах выбранного раздела интерфейÑа.

      \n' + + '\n' + + '

      Чтобы закрыть открытое меню, его раздел или вÑплывающее меню, нажмите клавишу Esc.\n' + + '\n' + + '

      ЕÑли Ñ„Ð¾ÐºÑƒÑ Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑÑ Ð½Ð°Ð²ÐµÑ€Ñ…Ñƒ какого-либо раздела интерфейÑа, нажатие клавиши Esc также приведет\n' + + ' к выходу из режима ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ клавиатуры.

      \n' + + '\n' + + '

      ИÑпользование Ñлемента меню или кнопки на панели инÑтрументов

      \n' + + '\n' + + '

      Когда Ñлемент меню или кнопка панели инÑтрументов будут выделены, нажмите Return, Enter\n' + + ' или Space, чтобы их активировать.\n' + + '\n' + + '

      Управление в диалоговом окне без вкладок

      \n' + + '\n' + + '

      При открытии диалогового окна без вкладок Ñ„Ð¾ÐºÑƒÑ Ð¿ÐµÑ€ÐµÐ½Ð¾ÑитÑÑ Ð½Ð° первый интерактивный компонент.

      \n' + + '\n' + + '

      Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð° между интерактивными компонентами диалогового окна нажимайте Tab или Shift+Tab.

      \n' + + '\n' + + '

      Управление в диалоговом окне Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ°Ð¼Ð¸

      \n' + + '\n' + + '

      При открытии диалогового окна Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ°Ð¼Ð¸ Ñ„Ð¾ÐºÑƒÑ Ð¿ÐµÑ€ÐµÐ½Ð¾ÑитÑÑ Ð½Ð° первую кнопку в меню вкладок.

      \n' + + '\n' + + '

      Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð° между интерактивными компонентами Ñтой вкладки диалогового окна нажимайте Tab или\n' + + ' Shift+Tab.

      \n' + + '\n' + + '

      Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð° на другую вкладку диалогового окна перемеÑтите Ñ„Ð¾ÐºÑƒÑ Ð½Ð° меню вкладок, а затем иÑпользуйте клавиши Ñо Ñтрелками\n' + + ' Ð´Ð»Ñ Ñ†Ð¸ÐºÐ»Ð¸Ñ‡ÐµÑкого Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ доÑтупными вкладками.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/sk.js b/static/js/tinymce/plugins/help/js/i18n/keynav/sk.js new file mode 100644 index 0000000..6ced780 --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/sk.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.sk', +'

      ZaÄíname s navigáciou pomocou klávesnice

      \n' + + '\n' + + '
      \n' + + '
      Prejsť na panel s ponukami
      \n' + + '
      Windows alebo Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Prejsť na panel nástrojov
      \n' + + '
      Windows alebo Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      PrejsÅ¥ na pätiÄku
      \n' + + '
      Windows alebo Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Prejsť na kontextový panel nástrojov
      \n' + + '
      Windows, Linux alebo macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      Navigácia zaÄne pri prvej položke používateľského rozhrania, ktorá bude zvýraznená alebo v prípade prvej položky\n' + + ' cesty k pätiÄke podÄiarknutá.

      \n' + + '\n' + + '

      Navigácia medzi ÄasÅ¥ami používateľského rozhrania

      \n' + + '\n' + + '

      Ak sa chcete posunúť z jednej Äasti používateľského rozhrania do druhej, stlaÄte tlaÄidlo Tab.

      \n' + + '\n' + + '

      Ak sa chcete posunúť z jednej Äasti používateľského rozhrania do predchádzajúcej, stlaÄte tlaÄidlá Shift + Tab.

      \n' + + '\n' + + '

      Poradie prepínania medzi týmito ÄasÅ¥ami používateľského rozhrania pri stláÄaní tlaÄidla Tab:\n' + + '\n' + + '

        \n' + + '
      1. Panel s ponukou
      2. \n' + + '
      3. Každá skupina panela nástrojov
      4. \n' + + '
      5. BoÄný panel
      6. \n' + + '
      7. Cesta k prvku v pätiÄke
      8. \n' + + '
      9. PrepínaÄ poÄtu slov v pätiÄke
      10. \n' + + '
      11. Odkaz na informácie o znaÄke v pätiÄke
      12. \n' + + '
      13. Úchyt na zmenu veľkosti editora v pätiÄke
      14. \n' + + '
      \n' + + '\n' + + '

      Ak nejaká ÄasÅ¥ používateľského rozhrania nie je prítomná, preskoÄí sa.

      \n' + + '\n' + + '

      Ak je pätiÄka vybratá na navigáciu pomocou klávesnice a nie je viditeľný boÄný panel, stlaÄením klávesov Shift+Tab\n' + + ' prejdete na prvú skupinu panela nástrojov, nie na poslednú.\n' + + '\n' + + '

      Navigácia v rámci Äastí používateľského rozhrania

      \n' + + '\n' + + '

      Ak sa chcete posunúť z jedného prvku používateľského rozhrania na Äalší, stlaÄte prísluÅ¡ný kláves so šípkou.

      \n' + + '\n' + + '

      Klávesy so šípkami doľava a doprava

      \n' + + '\n' + + '
        \n' + + '
      • umožňujú presun medzi ponukami na paneli ponúk,
      • \n' + + '
      • otvárajú podponuku v rámci ponuky,
      • \n' + + '
      • umožňujú presun medzi tlaÄidlami v skupine panelov nástrojov,
      • \n' + + '
      • umožňujú presun medzi položkami cesty prvku v pätiÄke.
      • \n' + + '
      \n' + + '\n' + + '

      Klávesy so šípkami dole a hore\n' + + '\n' + + '

        \n' + + '
      • umožňujú presun medzi položkami ponuky,
      • \n' + + '
      • umožňujú presun medzi položkami v kontextovej ponuke panela nástrojov.
      • \n' + + '
      \n' + + '\n' + + '

      Klávesy so šípkami vykonávajú prepínanie v rámci vybranej Äasti používateľského rozhrania.

      \n' + + '\n' + + '

      Ak chcete zatvoriÅ¥ otvorenú ponuku, otvorenú podponuku alebo otvorenú kontextovú ponuku, stlaÄte kláves Esc.\n' + + '\n' + + '

      Ak je aktuálne vybratá horná ÄasÅ¥ konkrétneho používateľského rozhrania, stlaÄením klávesu Esc úplne ukonÄíte tiež\n' + + ' navigáciu pomocou klávesnice.

      \n' + + '\n' + + '

      Vykonanie príkazu položky ponuky alebo tlaÄidla panela nástrojov

      \n' + + '\n' + + '

      KeÄ je zvýraznená požadovaná položka ponuky alebo tlaÄidlo panela nástrojov, stlaÄením klávesov Return, Enter\n' + + ' alebo medzerníka vykonáte prísluÅ¡ný príkaz položky.\n' + + '\n' + + '

      Navigácia v dialógových oknách bez záložiek

      \n' + + '\n' + + '

      Pri otvorení dialógových okien bez záložiek prejdete na prvý interaktívny komponent.

      \n' + + '\n' + + '

      Medzi interaktívnymi dialógovými komponentmi môžete prechádzaÅ¥ stlaÄením klávesov Tab alebo Shift+Tab.

      \n' + + '\n' + + '

      Navigácia v dialógových oknách so záložkami

      \n' + + '\n' + + '

      Pri otvorení dialógových okien so záložkami prejdete na prvé tlaÄidlo v ponuke záložiek.

      \n' + + '\n' + + '

      Medzi interaktívnymi komponentmi tejto dialógovej záložky môžete prechádzaÅ¥ stlaÄením klávesov Tab alebo\n' + + ' Shift+Tab.

      \n' + + '\n' + + '

      Ak chcete prepnúť na ÄalÅ¡iu záložku dialógového okna, prejdite do ponuky záložiek a potom môžete stlaÄením prísluÅ¡ného klávesu so šípkou\n' + + ' prepínaÅ¥ medzi dostupnými záložkami.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/sl_SI.js b/static/js/tinymce/plugins/help/js/i18n/keynav/sl_SI.js new file mode 100644 index 0000000..11fddec --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/sl_SI.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.sl_SI', +'

      ZaÄetek krmarjenja s tipkovnico

      \n' + + '\n' + + '
      \n' + + '
      Fokus na menijsko vrstico
      \n' + + '
      Windows ali Linux: Alt + F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Fokus na orodno vrstico
      \n' + + '
      Windows ali Linux: Alt + F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Fokus na nogo
      \n' + + '
      Windows ali Linux: Alt + F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Fokus na kontekstualno orodno vrstico
      \n' + + '
      Windows, Linux ali macOS: Ctrl + F9\n' + + '
      \n' + + '\n' + + '

      Krmarjenje se bo zaÄelo s prvim elementom uporabniÅ¡kega vmesnika, ki bo izpostavljena ali podÄrtan, Äe gre za prvi element na\n' + + ' poti do elementa noge.

      \n' + + '\n' + + '

      Krmarjenje med razdelki uporabniškega vmesnika

      \n' + + '\n' + + '

      Če se želite pomakniti z enega dela uporabniškega vmesnika na naslednjega, pritisnite tabulatorko.

      \n' + + '\n' + + '

      Če se želite pomakniti z enega dela uporabniškega vmesnika na prejšnjega, pritisnite shift + tabulatorko.

      \n' + + '\n' + + '

      Zaporedje teh razdelkov uporabniškega vmesnika, ko pritiskate tabulatorko, je:\n' + + '\n' + + '

        \n' + + '
      1. Menijska vrstica
      2. \n' + + '
      3. Posamezne skupine orodne vrstice
      4. \n' + + '
      5. Stranska vrstica
      6. \n' + + '
      7. Pod do elementa v nogi
      8. \n' + + '
      9. Gumb za preklop Å¡tetja besed v nogi
      10. \n' + + '
      11. Povezava do blagovne znamke v nogi
      12. \n' + + '
      13. RoÄaj za spreminjanje velikosti urejevalnika v nogi
      14. \n' + + '
      \n' + + '\n' + + '

      ÄŒe razdelek uporabniÅ¡kega vmesnika ni prisoten, je preskoÄen.

      \n' + + '\n' + + '

      ÄŒe ima noga fokus za krmarjenje s tipkovnico in ni vidne stranske vrstice, s pritiskom na shift + tabulatorko\n' + + ' fokus premaknete na prvo skupino orodne vrstice, ne zadnjo.\n' + + '\n' + + '

      Krmarjenje v razdelkih uporabniškega vmesnika

      \n' + + '\n' + + '

      ÄŒe se želite premakniti z enega elementa uporabniÅ¡kega vmesnika na naslednjega, pritisnite ustrezno puÅ¡ÄiÄno tipko.

      \n' + + '\n' + + '

      Leva in desna puÅ¡ÄiÄna tipka

      \n' + + '\n' + + '
        \n' + + '
      • omogoÄata premikanje med meniji v menijski vrstici.
      • \n' + + '
      • odpreta podmeni v meniju.
      • \n' + + '
      • omogoÄata premikanje med gumbi v skupini orodne vrstice.
      • \n' + + '
      • omogoÄata premikanje med elementi na poti do elementov noge.
      • \n' + + '
      \n' + + '\n' + + '

      Spodnja in zgornja puÅ¡ÄiÄna tipka\n' + + '\n' + + '

        \n' + + '
      • omogoÄata premikanje med elementi menija.
      • \n' + + '
      • omogoÄata premikanje med elementi v pojavnem meniju orodne vrstice.
      • \n' + + '
      \n' + + '\n' + + '

      PuÅ¡ÄiÄne tipke omogoÄajo kroženje znotraj razdelka uporabniÅ¡kega vmesnika, na katerem je fokus.

      \n' + + '\n' + + '

      Če želite zapreti odprt meni, podmeni ali pojavni meni, pritisnite tipko Esc.\n' + + '\n' + + '

      ÄŒe je trenutni fokus na »vrhu« doloÄenega razdelka uporabniÅ¡kega vmesnika, s pritiskom tipke Esc zaprete\n' + + ' tudi celotno krmarjenje s tipkovnico.

      \n' + + '\n' + + '

      Izvajanje menijskega elementa ali gumba orodne vrstice

      \n' + + '\n' + + '

      Ko je oznaÄen želeni menijski element ali orodja vrstica, pritisnite vraÄalko, Enter\n' + + ' ali preslednico, da izvedete element.\n' + + '\n' + + '

      Krmarjenje po pogovornih oknih brez zavihkov

      \n' + + '\n' + + '

      Ko odprete pogovorno okno brez zavihkov, ima fokus prva interaktivna komponenta.

      \n' + + '\n' + + '

      Med interaktivnimi komponentami pogovornega okna se premikate s pritiskom tabulatorke ali kombinacije tipke shift + tabulatorke.

      \n' + + '\n' + + '

      Krmarjenje po pogovornih oknih z zavihki

      \n' + + '\n' + + '

      Ko odprete pogovorno okno z zavihki, ima fokus prvi gumb v meniju zavihka.

      \n' + + '\n' + + '

      Med interaktivnimi komponentami tega zavihka pogovornega okna se premikate s pritiskom tabulatorke ali\n' + + ' kombinacije tipke shift + tabulatorke.

      \n' + + '\n' + + '

      Na drug zavihek pogovornega okna preklopite tako, da fokus prestavite na meni zavihka in nato pritisnete ustrezno puÅ¡ÄiÄno\n' + + ' tipko, da se pomaknete med razpoložljivimi zavihki.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/sv_SE.js b/static/js/tinymce/plugins/help/js/i18n/keynav/sv_SE.js new file mode 100644 index 0000000..d82bce6 --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/sv_SE.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.sv_SE', +'

      Påbörja tangentbordsnavigering

      \n' + + '\n' + + '
      \n' + + '
      Fokusera på menyraden
      \n' + + '
      Windows eller Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Fokusera på verktygsraden
      \n' + + '
      Windows eller Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Fokusera på verktygsraden
      \n' + + '
      Windows eller Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Fokusera på en snabbverktygsrad
      \n' + + '
      Windows, Linux eller macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      Navigeringen börjar vid det första gränssnittsobjektet, vilket är markerat eller understruket om det gäller det första objektet i\n' + + ' sidfotens elementsökväg.

      \n' + + '\n' + + '

      Navigera mellan UI-avsnitt

      \n' + + '\n' + + '

      Flytta från ett UI-avsnitt till nästa genom att trycka på Tabb.

      \n' + + '\n' + + '

      Flytta från ett UI-avsnitt till det föregående genom att trycka på Skift+Tabb.

      \n' + + '\n' + + '

      Tabb-ordningen för dessa UI-avsnitt är:\n' + + '\n' + + '

        \n' + + '
      1. Menyrad
      2. \n' + + '
      3. Varje verktygsradsgrupp
      4. \n' + + '
      5. Sidoruta
      6. \n' + + '
      7. Elementsökväg i sidfoten
      8. \n' + + '
      9. Växlingsknapp för ordantal i sidfoten
      10. \n' + + '
      11. Varumärkeslänk i sidfoten
      12. \n' + + '
      13. Storlekshandtag för redigeraren i sidfoten
      14. \n' + + '
      \n' + + '\n' + + '

      Om ett UI-avsnitt inte finns hoppas det över.

      \n' + + '\n' + + '

      Om sidfoten har fokus på tangentbordsnavigering, och det inte finns någon synlig sidoruta, flyttas fokus till den första verktygsradsgruppen\n' + + ' när du trycker på Skift+Tabb, inte till den sista.\n' + + '\n' + + '

      Navigera i UI-avsnitt

      \n' + + '\n' + + '

      Flytta från ett UI-element till nästa genom att trycka på motsvarande piltangent.

      \n' + + '\n' + + '

      Vänsterpil och högerpil

      \n' + + '\n' + + '
        \n' + + '
      • flytta mellan menyer pÃ¥ menyraden.
      • \n' + + '
      • öppna en undermeny pÃ¥ en meny.
      • \n' + + '
      • flytta mellan knappar i en verktygsradgrupp.
      • \n' + + '
      • flytta mellan objekt i sidfotens elementsökväg.
      • \n' + + '
      \n' + + '\n' + + '

      Nedpil och uppil\n' + + '\n' + + '

        \n' + + '
      • flytta mellan menyalternativ pÃ¥ en meny.
      • \n' + + '
      • flytta mellan alternativ pÃ¥ en popup-meny pÃ¥ verktygsraden.
      • \n' + + '
      \n' + + '\n' + + '

      Piltangenterna cirkulerar inom det fokuserade UI-avsnittet.

      \n' + + '\n' + + '

      Tryck på Esc-tangenten om du vill stänga en öppen meny, undermeny eller popup-meny.\n' + + '\n' + + '

      Om det aktuella fokuset är högst upp i ett UI-avsnitt avlutas även tangentbordsnavigeringen helt när\n' + + ' du trycker på Esc-tangenten.

      \n' + + '\n' + + '

      Köra ett menyalternativ eller en verktygfältsknapp

      \n' + + '\n' + + '

      När menyalternativet eller verktygsradsknappen är markerad trycker du på Retur, Enter\n' + + ' eller blanksteg för att köra alternativet.\n' + + '\n' + + '

      Navigera i dialogrutor utan flikar

      \n' + + '\n' + + '

      I dialogrutor utan flikar är den första interaktiva komponenten i fokus när dialogrutan öppnas.

      \n' + + '\n' + + '

      Navigera mellan interaktiva dialogkomponenter genom att trycka på Tabb eller Skift+Tabb.

      \n' + + '\n' + + '

      Navigera i dialogrutor med flikar

      \n' + + '\n' + + '

      I dialogrutor utan flikar är den första knappen på flikmenyn i fokus när dialogrutan öppnas.

      \n' + + '\n' + + '

      Navigera mellan interaktiva komponenter på dialogrutefliken genom att trycka på Tabb eller\n' + + ' Skift+Tabb.

      \n' + + '\n' + + '

      Växla till en annan dialogruta genom att fokusera på flikmenyn och sedan trycka på motsvarande piltangent\n' + + ' för att cirkulera mellan de tillgängliga flikarna.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/th_TH.js b/static/js/tinymce/plugins/help/js/i18n/keynav/th_TH.js new file mode 100644 index 0000000..240f7dd --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/th_TH.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.th_TH', +'

      เริ่มต้นà¸à¸²à¸£à¸™à¸³à¸—างด้วยà¹à¸›à¹‰à¸™à¸žà¸´à¸¡à¸žà¹Œ

      \n' + + '\n' + + '
      \n' + + '
      โฟà¸à¸±à¸ªà¸—ี่à¹à¸–บเมนู
      \n' + + '
      Windows หรือ Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      โฟà¸à¸±à¸ªà¸—ี่à¹à¸–บเครื่องมือ
      \n' + + '
      Windows หรือ Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      โฟà¸à¸±à¸ªà¸—ี่ส่วนท้าย
      \n' + + '
      Windows หรือ Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      โฟà¸à¸±à¸ªà¸—ี่à¹à¸–บเครื่องมือตามบริบท
      \n' + + '
      Windows, Linux หรือ macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      à¸à¸²à¸£à¸™à¸³à¸—างจะเริ่มที่รายà¸à¸²à¸£ UI à¹à¸£à¸ ซึ่งจะมีà¸à¸²à¸£à¹„ฮไลต์หรือขีดเส้นใต้ไว้ในà¸à¸£à¸“ีที่รายà¸à¸²à¸£à¹à¸£à¸à¸­à¸¢à¸¹à¹ˆà¹ƒà¸™\n' + + ' พาธองค์ประà¸à¸­à¸šà¸ªà¹ˆà¸§à¸™à¸—้าย

      \n' + + '\n' + + '

      à¸à¸²à¸£à¸™à¸³à¸—างระหว่างส่วนต่างๆ ของ UI

      \n' + + '\n' + + '

      ในà¸à¸²à¸£à¸¢à¹‰à¸²à¸¢à¸ˆà¸²à¸à¸ªà¹ˆà¸§à¸™ UI หนึ่งไปยังส่วนถัดไป ให้à¸à¸” Tab

      \n' + + '\n' + + '

      ในà¸à¸²à¸£à¸¢à¹‰à¸²à¸¢à¸ˆà¸²à¸à¸ªà¹ˆà¸§à¸™ UI หนึ่งไปยังส่วนà¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸² ให้à¸à¸” Shift+Tab

      \n' + + '\n' + + '

      ลำดับà¹à¸—็บของส่วนต่างๆ ของ UI คือ:\n' + + '\n' + + '

        \n' + + '
      1. à¹à¸–บเมนู
      2. \n' + + '
      3. à¹à¸•à¹ˆà¸¥à¸°à¸à¸¥à¸¸à¹ˆà¸¡à¹à¸–บเครื่องมือ
      4. \n' + + '
      5. à¹à¸–บข้าง
      6. \n' + + '
      7. พาธองค์ประà¸à¸­à¸šà¹ƒà¸™à¸ªà¹ˆà¸§à¸™à¸—้าย
      8. \n' + + '
      9. ปุ่มสลับเปิด/ปิดจำนวนคำในส่วนท้าย
      10. \n' + + '
      11. ลิงà¸à¹Œà¸Šà¸·à¹ˆà¸­à¹à¸šà¸£à¸™à¸”์ในส่วนท้าย
      12. \n' + + '
      13. จุดจับปรับขนาดของตัวà¹à¸à¹‰à¹„ขในส่วนท้าย
      14. \n' + + '
      \n' + + '\n' + + '

      หาà¸à¸ªà¹ˆà¸§à¸™ UI ไม่ปราà¸à¸ à¹à¸ªà¸”งว่าถูà¸à¸‚้ามไป

      \n' + + '\n' + + '

      หาà¸à¸ªà¹ˆà¸§à¸™à¸—้ายมีà¸à¸²à¸£à¹‚ฟà¸à¸±à¸ªà¸à¸²à¸£à¸™à¸³à¸—างà¹à¸›à¹‰à¸™à¸žà¸´à¸¡à¸žà¹Œà¹à¸¥à¸°à¹„ม่มีà¹à¸–บข้างปราà¸à¸ à¸à¸²à¸£à¸à¸” Shift+Tab\n' + + ' จะย้ายà¸à¸²à¸£à¹‚ฟà¸à¸±à¸ªà¹„ปที่à¸à¸¥à¸¸à¹ˆà¸¡à¹à¸–บเครื่องมือà¹à¸£à¸ ไม่ใช่สุดท้าย\n' + + '\n' + + '

      à¸à¸²à¸£à¸™à¸³à¸—างภายในส่วนต่างๆ ของ UI

      \n' + + '\n' + + '

      ในà¸à¸²à¸£à¸¢à¹‰à¸²à¸¢à¸ˆà¸²à¸à¸­à¸‡à¸„์ประà¸à¸­à¸š UI หนึ่งไปยังองค์ประà¸à¸­à¸šà¸ªà¹ˆà¸§à¸™à¸–ัดไป ให้à¸à¸”ปุ่มลูà¸à¸¨à¸£à¸—ี่เหมาะสม

      \n' + + '\n' + + '

      ปุ่มลูà¸à¸¨à¸£à¸‹à¹‰à¸²à¸¢à¹à¸¥à¸°à¸‚วา

      \n' + + '\n' + + '
        \n' + + '
      • ย้ายไปมาระหว่างเมนูต่างๆ ในà¹à¸–บเมนู
      • \n' + + '
      • เปิดเมนูย่อยในเมนู
      • \n' + + '
      • ย้ายไปมาระหว่างปุ่มต่างๆ ในà¸à¸¥à¸¸à¹ˆà¸¡à¹à¸–บเครื่องมือ
      • \n' + + '
      • ย้ายไปมาระหว่างรายà¸à¸²à¸£à¸•à¹ˆà¸²à¸‡à¹† ในพาธองค์ประà¸à¸­à¸šà¸‚องส่วนท้าย
      • \n' + + '
      \n' + + '\n' + + '

      ปุ่มลูà¸à¸¨à¸£à¸¥à¸‡à¹à¸¥à¸°à¸‚ึ้น\n' + + '\n' + + '

        \n' + + '
      • ย้ายไปมาระหว่างรายà¸à¸²à¸£à¹€à¸¡à¸™à¸¹à¸•à¹ˆà¸²à¸‡à¹† ในเมนู
      • \n' + + '
      • ย้ายไปมาระหว่างรายà¸à¸²à¸£à¸•à¹ˆà¸²à¸‡à¹† ในเมนูป๊อบอัพà¹à¸–บเครื่องมือ
      • \n' + + '
      \n' + + '\n' + + '

      ปุ่มลูà¸à¸¨à¸£à¸ˆà¸°à¹€à¸¥à¸·à¹ˆà¸­à¸™à¹„ปมาภายในส่วน UI ที่โฟà¸à¸±à¸ª

      \n' + + '\n' + + '

      ในà¸à¸²à¸£à¸›à¸´à¸”เมนูที่เปิดอยู่ เมนูย่อยที่เปิดอยู่ หรือเมนูป๊อบอัพที่เปิดอยู่ ให้à¸à¸”ปุ่ม Esc\n' + + '\n' + + '

      หาà¸à¹‚ฟà¸à¸±à¸ªà¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™à¸­à¸¢à¸¹à¹ˆà¸—ี่ ‘ด้านบนสุด’ ของส่วน UI เฉพาะ à¸à¸²à¸£à¸à¸”ปุ่ม Esc จะทำให้ออà¸à¸ˆà¸²à¸\n' + + ' à¸à¸²à¸£à¸™à¸³à¸—างด้วยà¹à¸›à¹‰à¸™à¸žà¸´à¸¡à¸žà¹Œà¸—ั้งหมดเช่นà¸à¸±à¸™

      \n' + + '\n' + + '

      à¸à¸²à¸£à¸”ำเนินà¸à¸²à¸£à¸£à¸²à¸¢à¸à¸²à¸£à¹€à¸¡à¸™à¸¹à¸«à¸£à¸·à¸­à¸›à¸¸à¹ˆà¸¡à¹ƒà¸™à¹à¸–บเครื่องมือ

      \n' + + '\n' + + '

      เมื่อไฮไลต์รายà¸à¸²à¸£à¹€à¸¡à¸™à¸¹à¸«à¸£à¸·à¸­à¸›à¸¸à¹ˆà¸¡à¹ƒà¸™à¹à¸–บเครื่องมือที่ต้องà¸à¸²à¸£ ให้à¸à¸” Return, Enter\n' + + ' หรือ Space bar เพื่อดำเนินà¸à¸²à¸£à¸£à¸²à¸¢à¸à¸²à¸£à¸”ังà¸à¸¥à¹ˆà¸²à¸§\n' + + '\n' + + '

      à¸à¸²à¸£à¸™à¸³à¸—างสำหรับà¸à¸¥à¹ˆà¸­à¸‡à¹‚ต้ตอบที่ไม่อยู่ในà¹à¸—็บ

      \n' + + '\n' + + '

      ในà¸à¸¥à¹ˆà¸­à¸‡à¹‚ต้ตอบที่ไม่อยู่ในà¹à¸—็บ จะโฟà¸à¸±à¸ªà¸—ี่ส่วนประà¸à¸­à¸šà¹€à¸Šà¸´à¸‡à¹‚ต้ตอบà¹à¸£à¸à¹€à¸¡à¸·à¹ˆà¸­à¸à¸¥à¹ˆà¸­à¸‡à¹‚ต้ตอบเปิด

      \n' + + '\n' + + '

      นำทางระหว่างส่วนประà¸à¸­à¸šà¹€à¸Šà¸´à¸‡à¹‚ต้ตอบต่างๆ ของà¸à¸¥à¹ˆà¸­à¸‡à¹‚ต้ตอบ โดยà¸à¸²à¸£à¸à¸” Tab หรือ Shift+Tab

      \n' + + '\n' + + '

      à¸à¸²à¸£à¸™à¸³à¸—างสำหรับà¸à¸¥à¹ˆà¸­à¸‡à¹‚ต้ตอบที่อยู่ในà¹à¸—็บ

      \n' + + '\n' + + '

      ในà¸à¸¥à¹ˆà¸­à¸‡à¹‚ต้ตอบที่อยู่ในà¹à¸—็บ จะโฟà¸à¸±à¸ªà¸—ี่ปุ่มà¹à¸£à¸à¹ƒà¸™à¹€à¸¡à¸™à¸¹à¹à¸—็บเมื่อà¸à¸¥à¹ˆà¸­à¸‡à¹‚ต้ตอบเปิด

      \n' + + '\n' + + '

      นำทางระหว่างส่วนประà¸à¸­à¸šà¹€à¸Šà¸´à¸‡à¹‚ต้ตอบต่างๆ ของà¹à¸—็บà¸à¸¥à¹ˆà¸­à¸‡à¹‚ต้ตอบนี้โดยà¸à¸²à¸£à¸à¸” Tab หรือ\n' + + ' Shift+Tab

      \n' + + '\n' + + '

      สลับไปยังà¹à¸—็บà¸à¸¥à¹ˆà¸­à¸‡à¹‚ต้ตอบอื่นโดยà¸à¸²à¸£à¹€à¸¥à¸·à¸­à¸à¹‚ฟà¸à¸±à¸ªà¸—ี่เมนูà¹à¸—็บ à¹à¸¥à¹‰à¸§à¸à¸”ปุ่มลูà¸à¸¨à¸£à¸—ี่เหมาะสม\n' + + ' เพื่อเลือà¸à¹à¸—็บที่ใช้ได้

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/tr.js b/static/js/tinymce/plugins/help/js/i18n/keynav/tr.js new file mode 100644 index 0000000..87e8885 --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/tr.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.tr', +'

      Klavyeyle gezintiyi baÅŸlatma

      \n' + + '\n' + + '
      \n' + + '
      Menü çubuğuna odaklan
      \n' + + '
      Windows veya Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Araç çubuğuna odaklan
      \n' + + '
      Windows veya Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Alt bilgiye odaklan
      \n' + + '
      Windows veya Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Bağlamsal araç çubuğuna odaklan
      \n' + + '
      Windows, Linux veya macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      Gezinti ilk kullanıcı arabirimi öğesinden başlar, bu öğe vurgulanır ya da ilk öğe, Alt bilgi elemanı\n' + + ' yolundaysa altı çizilir.

      \n' + + '\n' + + '

      Kullanıcı arabirimi bölümleri arasında gezinme

      \n' + + '\n' + + '

      Sonraki kullanıcı arabirimi bölümüne gitmek için Sekme tuşuna basın.

      \n' + + '\n' + + '

      Önceki kullanıcı arabirimi bölümüne gitmek için Shift+Sekme tuşlarına basın.

      \n' + + '\n' + + '

      Bu kullanıcı arabirimi bölümlerinin Sekme sırası:\n' + + '\n' + + '

        \n' + + '
      1. Menü çubuğu
      2. \n' + + '
      3. Her araç çubuğu grubu
      4. \n' + + '
      5. Kenar çubuğu
      6. \n' + + '
      7. Alt bilgide öğe yolu
      8. \n' + + '
      9. Alt bilgide sözcük sayısı geçiş düğmesi
      10. \n' + + '
      11. Alt bilgide marka bağlantısı
      12. \n' + + '
      13. Alt bilgide düzenleyiciyi yeniden boyutlandırma tutamacı
      14. \n' + + '
      \n' + + '\n' + + '

      Kullanıcı arabirimi bölümü yoksa atlanır.

      \n' + + '\n' + + '

      Alt bilgide klavyeyle gezinti odağı yoksa ve görünür bir kenar çubuğu mevcut değilse Shift+Sekme tuşlarına basıldığında\n' + + ' odak son araç çubuğu yerine ilk araç çubuğu grubuna taşınır.\n' + + '\n' + + '

      Kullanıcı arabirimi bölümleri içinde gezinme

      \n' + + '\n' + + '

      Sonraki kullanıcı arabirimi elemanına gitmek için uygun Ok tuşuna basın.

      \n' + + '\n' + + '

      Sol ve Sağ ok tuşları

      \n' + + '\n' + + '
        \n' + + '
      • menü çubuÄŸundaki menüler arasında hareket eder.
      • \n' + + '
      • menüde bir alt menü açar.
      • \n' + + '
      • araç çubuÄŸu grubundaki düğmeler arasında hareket eder.
      • \n' + + '
      • alt bilginin öğe yolundaki öğeler arasında hareket eder.
      • \n' + + '
      \n' + + '\n' + + '

      Aşağı ve Yukarı ok tuşları\n' + + '\n' + + '

        \n' + + '
      • menüdeki menü öğeleri arasında hareket eder.
      • \n' + + '
      • araç çubuÄŸu açılır menüsündeki öğeler arasında hareket eder.
      • \n' + + '
      \n' + + '\n' + + '

      Ok tuşları, odaklanılan kullanıcı arabirimi bölümü içinde döngüsel olarak hareket eder.

      \n' + + '\n' + + '

      Açık bir menüyü, açık bir alt menüyü veya açık bir açılır menüyü kapatmak için Esc tuşuna basın.\n' + + '\n' + + '

      Geçerli odak belirli bir kullanıcı arabirimi bölümünün "üst" kısmındaysa Esc tuşuna basıldığında\n' + + ' klavyeyle gezintiden de tamamen çıkılır.

      \n' + + '\n' + + '

      Menü öğesini veya araç çubuğu düğmesini yürütme

      \n' + + '\n' + + '

      İstediğiniz menü öğesi veya araç çubuğu düğmesi vurgulandığında Return, Enter\n' + + ' veya Ara çubuğu tuşuna basın.\n' + + '\n' + + '

      Sekme bulunmayan iletişim kutularında gezinme

      \n' + + '\n' + + '

      Sekme bulunmayan iletişim kutularında, iletişim kutusu açıldığında ilk etkileşimli bileşene odaklanılır.

      \n' + + '\n' + + '

      Etkileşimli iletişim kutusu bileşenleri arasında gezinmek için Sekme veya Shift+ Sekme tuşlarına basın.

      \n' + + '\n' + + '

      Sekmeli iletişim kutularında gezinme

      \n' + + '\n' + + '

      Sekmeli iletişim kutularında, iletişim kutusu açıldığında sekme menüsündeki ilk düğmeye odaklanılır.

      \n' + + '\n' + + '

      Bu iletişim kutusu sekmesinin etkileşimli bileşenleri arasında gezinmek için Sekme veya\n' + + ' Shift+Sekme tuşlarına basın.

      \n' + + '\n' + + '

      Mevcut sekmeler arasında geçiş yapmak için sekme menüsüne odaklanıp uygun Ok tuşuna basarak\n' + + ' başka bir iletişim kutusu sekmesine geçiş yapın.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/uk.js b/static/js/tinymce/plugins/help/js/i18n/keynav/uk.js new file mode 100644 index 0000000..5cd0744 --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/uk.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.uk', +'

      Початок роботи з навігацією за допомогою клавіатури

      \n' + + '\n' + + '
      \n' + + '
      Ð¤Ð¾ÐºÑƒÑ Ð½Ð° Ñ€Ñдок меню
      \n' + + '
      Windows або Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Ð¤Ð¾ÐºÑƒÑ Ð½Ð° панелі інÑтрументів
      \n' + + '
      Windows або Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Ð¤Ð¾ÐºÑƒÑ Ð½Ð° розділі "Ðижній колонтитул"
      \n' + + '
      Windows або Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Ð¤Ð¾ÐºÑƒÑ Ð½Ð° контекÑтній панелі інÑтрументів
      \n' + + '
      Windows, Linux або macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      ÐÐ°Ð²Ñ–Ð³Ð°Ñ†Ñ–Ñ Ð¿Ð¾Ñ‡Ð½ÐµÑ‚ÑŒÑÑ Ð· першого елемента інтерфейÑу кориÑтувача, Ñкий буде виділено або підкреÑлено в разі, Ñкщо перший елемент знаходитьÑÑ Ð²\n' + + ' шлÑху до елемента "Ðижній колонтитул".

      \n' + + '\n' + + '

      ÐÐ°Ð²Ñ–Ð³Ð°Ñ†Ñ–Ñ Ð¼Ñ–Ð¶ розділами інтерфейÑу кориÑтувача

      \n' + + '\n' + + '

      Щоб перейти з одного розділу інтерфейÑу кориÑтувача до наÑтупного розділу, натиÑніть клавішу Tab.

      \n' + + '\n' + + '

      Щоб перейти з одного розділу інтерфейÑу кориÑтувача до попереднього розділу, натиÑніть ÑÐ¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ Shift+Tab.

      \n' + + '\n' + + '

      ПорÑдок Вкладок цих розділів інтерфейÑу кориÑтувача такий:\n' + + '\n' + + '

        \n' + + '
      1. РÑдок меню
      2. \n' + + '
      3. Кожна група панелей інÑтрументів
      4. \n' + + '
      5. Бічна панель
      6. \n' + + '
      7. ШлÑÑ… до елементів у розділі "Ðижній колонтитул"
      8. \n' + + '
      9. Кнопка перемикача "КількіÑÑ‚ÑŒ Ñлів" у розділі "Ðижній колонтитул"
      10. \n' + + '
      11. ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° брендинг у розділі "Ðижній колонтитул"
      12. \n' + + '
      13. Маркер Ð·Ð¼Ñ–Ð½ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€Ñƒ в розділі "Ðижній колонтитул"
      14. \n' + + '
      \n' + + '\n' + + '

      Якщо розділ інтерфейÑу кориÑтувача відÑутній, він пропуÑкаєтьÑÑ.

      \n' + + '\n' + + '

      Якщо Ñ„Ð¾ÐºÑƒÑ Ð½Ð°Ð²Ñ–Ð³Ð°Ñ†Ñ–Ñ— клавіатури знаходитьÑÑ Ð½Ð° розділі "Ðижній колонтитул", але кориÑтувач не бачить видиму бічну панель, натиÑніть Shift+Tab,\n' + + ' щоб переміÑтити Ñ„Ð¾ÐºÑƒÑ Ð½Ð° першу групу панелі інÑтрументів, а не на оÑтанню.\n' + + '\n' + + '

      ÐÐ°Ð²Ñ–Ð³Ð°Ñ†Ñ–Ñ Ð² межах розділів інтерфейÑу кориÑтувача

      \n' + + '\n' + + '

      Щоб перейти з одного елементу інтерфейÑу кориÑтувача до наÑтупного, натиÑніть відповідну клавішу зі Ñтрілкою.

      \n' + + '\n' + + '

      Клавіші зі Ñтрілками Ліворуч Ñ– Праворуч

      \n' + + '\n' + + '
        \n' + + '
      • переміщують між меню в Ñ€Ñдку меню.
      • \n' + + '
      • відкривають вкладене меню в меню.
      • \n' + + '
      • переміщують кориÑтувача між кнопками в групі панелі інÑтрументів.
      • \n' + + '
      • переміщують між елементами в шлÑху до елементів у розділі "Ðижній колонтитул".
      • \n' + + '
      \n' + + '\n' + + '

      Клавіші зі Ñтрілками Вниз Ñ– Вгору\n' + + '\n' + + '

        \n' + + '
      • переміщують між елементами меню в меню.
      • \n' + + '
      • переміщують між елементами в Ñпливаючому меню панелі інÑтрументів.
      • \n' + + '
      \n' + + '\n' + + '

      Клавіші зі Ñтрілками переміщують Ñ„Ð¾ÐºÑƒÑ Ñ†Ð¸ÐºÐ»Ñ–Ñ‡Ð½Ð¾ в межах розділу інтерфейÑу кориÑтувача, на Ñкому знаходитьÑÑ Ñ„Ð¾ÐºÑƒÑ.

      \n' + + '\n' + + '

      Щоб закрити відкрите меню, відкрите вкладене меню або відкрите Ñпливаюче меню, натиÑніть клавішу Esc.\n' + + '\n' + + '

      Якщо поточний Ñ„Ð¾ÐºÑƒÑ Ð·Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑŒÑÑ Ð½Ð° верхньому рівні певного розділу інтерфейÑу кориÑтувача, натиÑÐºÐ°Ð½Ð½Ñ ÐºÐ»Ð°Ð²Ñ–ÑˆÑ– Esc також виконує вихід\n' + + ' з навігації за допомогою клавіатури повніÑÑ‚ÑŽ.

      \n' + + '\n' + + '

      Ð’Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ñƒ меню або кнопки панелі інÑтрументів

      \n' + + '\n' + + '

      Коли потрібний елемент меню або кнопку панелі інÑтрументів виділено, натиÑніть клавіші Return, Enter,\n' + + ' або Пробіл, щоб виконати цей елемент.\n' + + '\n' + + '

      ÐÐ°Ð²Ñ–Ð³Ð°Ñ†Ñ–Ñ Ð¿Ð¾ діалоговим вікнам без вкладок

      \n' + + '\n' + + '

      У діалогових вікнах без вкладок перший інтерактивний компонент приймає фокуÑ, коли відкриваєтьÑÑ Ð´Ñ–Ð°Ð»Ð¾Ð³Ð¾Ð²Ðµ вікно.

      \n' + + '\n' + + '

      Переходьте між інтерактивними компонентами діалогового вікна, натиÑкаючи клавіші Tab або Shift+Tab.

      \n' + + '\n' + + '

      ÐÐ°Ð²Ñ–Ð³Ð°Ñ†Ñ–Ñ Ð¿Ð¾ діалоговим вікнам з вкладками

      \n' + + '\n' + + '

      У діалогових вікнах із вкладками перша кнопка в меню вкладки приймає фокуÑ, коли відкриваєтьÑÑ Ð´Ñ–Ð°Ð»Ð¾Ð³Ð¾Ð²Ðµ вікно.

      \n' + + '\n' + + '

      Переходьте між інтерактивними компонентами цієї вкладки діалогового вікна, натиÑкаючи клавіші Tab або\n' + + ' Shift+Tab.

      \n' + + '\n' + + '

      Щоб перейти на іншу вкладку діалогового вікна, переміÑÑ‚Ñ–Ñ‚ÑŒ Ñ„Ð¾ÐºÑƒÑ Ð½Ð° меню вкладки, а потім натиÑніть відповідну клавішу зі Ñтрілкою,\n' + + ' щоб циклічно переходити по доÑтупним вкладкам.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/vi.js b/static/js/tinymce/plugins/help/js/i18n/keynav/vi.js new file mode 100644 index 0000000..83d570d --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/vi.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.vi', +'

      Bắt đầu Ä‘iá»u hÆ°á»›ng bàn phím

      \n' + + '\n' + + '
      \n' + + '
      Tập trung vào thanh menu
      \n' + + '
      Windows hoặc Linux: Alt+F9
      \n' + + '
      macOS: ⌥F9
      \n' + + '
      Tập trung vào thanh công cụ
      \n' + + '
      Windows hoặc Linux: Alt+F10
      \n' + + '
      macOS: ⌥F10
      \n' + + '
      Tập trung vào chân trang
      \n' + + '
      Windows hoặc Linux: Alt+F11
      \n' + + '
      macOS: ⌥F11
      \n' + + '
      Tập trung vào thanh công cụ ngữ cảnh
      \n' + + '
      Windows, Linux hoặc macOS: Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      Äiá»u hÆ°á»›ng sẽ bắt đầu từ mục UI đầu tiên. Mục này sẽ được tô sáng hoặc có gạch dÆ°á»›i (nếu là mục đầu tiên trong\n' + + ' Ä‘Æ°á»ng dẫn phần tá»­ Chân trang).

      \n' + + '\n' + + '

      Di chuyển qua lại giữa các phần UI

      \n' + + '\n' + + '

      Äể di chuyển từ má»™t phần UI sang phần tiếp theo, ấn Tab.

      \n' + + '\n' + + '

      Äể di chuyển từ má»™t phần UI vá» phần trÆ°á»›c đó, ấn Shift+Tab.

      \n' + + '\n' + + '

      Thứ tự Tab của các phần UI này như sau:\n' + + '\n' + + '

        \n' + + '
      1. Thanh menu
      2. \n' + + '
      3. Từng nhóm thanh công cụ
      4. \n' + + '
      5. Thanh bên
      6. \n' + + '
      7. ÄÆ°á»ng dẫn phần tá»­ trong chân trang
      8. \n' + + '
      9. Nút chuyển đổi đếm chữ ở chân trang
      10. \n' + + '
      11. Liên kết thương hiệu ở chân trang
      12. \n' + + '
      13. Núm Ä‘iá»u tác chỉnh kích cỡ trình soạn thảo ở chân trang
      14. \n' + + '
      \n' + + '\n' + + '

      Nếu ngÆ°á»i dùng không thấy má»™t phần UI, thì có nghÄ©a phần đó bị bá» qua.

      \n' + + '\n' + + '

      Nếu ở chân trang có tính năng tập trung Ä‘iá»u hÆ°á»›ng bàn phím, mà không có thanh bên nào hiện hữu, thao tác ấn Shift+Tab\n' + + ' sẽ chuyển hÆ°á»›ng tập trung vào nhóm thanh công cụ đầu tiên, không phải cuối cùng.\n' + + '\n' + + '

      Di chuyển qua lại trong các phần UI

      \n' + + '\n' + + '

      Äể di chuyển từ má»™t phần tá»­ UI sang phần tiếp theo, ấn phím MÅ©i tên tÆ°Æ¡ng ứng cho phù hợp.

      \n' + + '\n' + + '

      Các phím mũi tên Trái và Phải

      \n' + + '\n' + + '
        \n' + + '
      • di chuyển giữa các menu trong thanh menu.
      • \n' + + '
      • mở menu phụ trong má»™t menu.
      • \n' + + '
      • di chuyển giữa các nút trong nhóm thanh công cụ.
      • \n' + + '
      • di chuyển giữa các mục trong Ä‘Æ°á»ng dẫn phần tá»­ của chân trang.
      • \n' + + '
      \n' + + '\n' + + '

      Các phím mũi tên Hướng xuống và Hướng lên\n' + + '\n' + + '

        \n' + + '
      • di chuyển giữa các mục menu trong menu.
      • \n' + + '
      • di chuyển giữa các mục trong menu thanh công cụ dạng bật lên.
      • \n' + + '
      \n' + + '\n' + + '

      Các phím mũi tên xoay vòng trong một phần UI tập trung.

      \n' + + '\n' + + '

      Äể đóng má»™t menu mở, má»™t menu phụ Ä‘ang mở, hoặc má»™t menu dạng bật lên Ä‘ang mở, hãy ấn phím Esc.\n' + + '\n' + + '

      Nếu trá»ng tâm hiện tại là ở phần “đầu†của má»™t phần UI cụ thể, thao tác ấn phím Esc cÅ©ng sẽ thoát\n' + + ' toàn bá»™ phần Ä‘iá»u hÆ°á»›ng bàn phím.

      \n' + + '\n' + + '

      Thực hiện chức năng của một mục menu hoặc nút thanh công cụ

      \n' + + '\n' + + '

      Khi mục menu hoặc nút thanh công cụ muốn dùng được tô sáng, hãy ấn Return, Enter,\n' + + ' hoặc Phím cách để thực hiện chức năng mục đó.\n' + + '\n' + + '

      Äiá»u hÆ°á»›ng giữa các há»™p thoại không có nhiá»u tab

      \n' + + '\n' + + '

      Trong các há»™p thoại không có nhiá»u tab, khi há»™p thoại mở ra, trá»ng tâm sẽ hÆ°á»›ng vào thành phần tÆ°Æ¡ng tác đầu tiên.

      \n' + + '\n' + + '

      Di chuyển giữa các thành phần hộp thoại tương tác bằng cách ấn Tab hoặc Shift+Tab.

      \n' + + '\n' + + '

      Äiá»u hÆ°á»›ng giữa các há»™p thoại có nhiá»u tab

      \n' + + '\n' + + '

      Trong các há»™p thoại có nhiá»u tab, khi há»™p thoại mở ra, trá»ng tâm sẽ hÆ°á»›ng vào nút đầu tiên trong menu tab.

      \n' + + '\n' + + '

      Di chuyển giữa các thành phần tương tác của tab hộp thoại này bằng cách ấn Tab hoặc\n' + + ' Shift+Tab.

      \n' + + '\n' + + '

      Chuyển sang má»™t tab há»™p thoại khác bằng cách chuyển trá»ng tâm vào menu tab, rồi ấn phím MÅ©i tên phù hợp\n' + + ' để xoay vòng các tab hiện có.

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/zh_CN.js b/static/js/tinymce/plugins/help/js/i18n/keynav/zh_CN.js new file mode 100644 index 0000000..41fe62c --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/zh_CN.js @@ -0,0 +1,84 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.zh_CN', +'

      开始键盘导航

      \n' + + '\n' + + '
      \n' + + '
      èšç„¦äºŽèœå•æ 
      \n' + + '
      Windows 或 Linux:Alt+F9
      \n' + + '
      macOS:⌥F9
      \n' + + '
      èšç„¦äºŽå·¥å…·æ 
      \n' + + '
      Windows 或 Linux:Alt+F10
      \n' + + '
      macOS:⌥F10
      \n' + + '
      èšç„¦äºŽé¡µè„š
      \n' + + '
      Windows 或 Linux:Alt+F11
      \n' + + '
      macOS:⌥F11
      \n' + + '
      èšç„¦äºŽä¸Šä¸‹æ–‡å·¥å…·æ 
      \n' + + '
      Windowsã€Linux 或 macOS:Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      导航将在第一个 UI 项上开始,其中çªå‡ºæ˜¾ç¤ºè¯¥é¡¹ï¼Œæˆ–者对于页脚元素路径中的第一项,将为其添加下划线。

      \n' + + '\n' + + '

      在 UI 部分之间导航

      \n' + + '\n' + + '

      è¦ä»Žä¸€ä¸ª UI 部分移至下一个,请按 Tab。

      \n' + + '\n' + + '

      è¦ä»Žä¸€ä¸ª UI 部分移至上一个,请按 Shift+Tab。

      \n' + + '\n' + + '

      这些 UI 部分的 Tab 顺åºä¸ºï¼š\n' + + '\n' + + '

        \n' + + '
      1. èœå•æ 
      2. \n' + + '
      3. æ¯ä¸ªå·¥å…·æ ç»„
      4. \n' + + '
      5. è¾¹æ 
      6. \n' + + '
      7. 页脚中的元素路径
      8. \n' + + '
      9. 页脚中的字数切æ¢æŒ‰é’®
      10. \n' + + '
      11. 页脚中的å“牌链接
      12. \n' + + '
      13. 页脚中的编辑器调整大å°å›¾æŸ„
      14. \n' + + '
      \n' + + '\n' + + '

      如果ä¸å­˜åœ¨æŸä¸ª UI 部分,则跳过它。

      \n' + + '\n' + + '

      如果键盘导航焦点在页脚,并且没有å¯è§çš„è¾¹æ ï¼Œåˆ™æŒ‰ Shift+Tab 将焦点移至第一个工具æ ç»„而éžæœ€åŽä¸€ä¸ªã€‚\n' + + '\n' + + '

      在 UI 部分内导航

      \n' + + '\n' + + '

      è¦ä»Žä¸€ä¸ª UI 元素移至下一个,请按相应的箭头键。

      \n' + + '\n' + + '

      左和å³ç®­å¤´é”®

      \n' + + '\n' + + '
        \n' + + '
      • 在èœå•æ ä¸­çš„èœå•ä¹‹é—´ç§»åŠ¨ã€‚
      • \n' + + '
      • 打开èœå•ä¸­çš„å­èœå•ã€‚
      • \n' + + '
      • 在工具æ ç»„中的按钮之间移动。
      • \n' + + '
      • 在页脚的元素路径中的å„项之间移动。
      • \n' + + '
      \n' + + '\n' + + '

      下和上箭头键\n' + + '\n' + + '

        \n' + + '
      • 在èœå•ä¸­çš„èœå•é¡¹ä¹‹é—´ç§»åŠ¨ã€‚
      • \n' + + '
      • 在工具æ å¼¹å‡ºèœå•ä¸­çš„å„项之间移动。
      • \n' + + '
      \n' + + '\n' + + '

      箭头键在具有焦点的 UI 部分内循环。

      \n' + + '\n' + + '

      è¦å…³é—­æ‰“开的èœå•ã€æ‰“开的å­èœå•æˆ–打开的弹出èœå•ï¼Œè¯·æŒ‰ Esc 键。\n' + + '\n' + + '

      如果当å‰çš„焦点在特定 UI 部分的“顶部â€ï¼Œåˆ™æŒ‰ Esc 键还将完全退出键盘导航。

      \n' + + '\n' + + '

      执行èœå•é¡¹æˆ–工具æ æŒ‰é’®

      \n' + + '\n' + + '

      当çªå‡ºæ˜¾ç¤ºæ‰€éœ€çš„èœå•é¡¹æˆ–工具æ æŒ‰é’®æ—¶ï¼ŒæŒ‰ Returnã€Enter 或空格以执行该项。\n' + + '\n' + + '

      在éžæ ‡ç­¾é¡µå¼å¯¹è¯æ¡†ä¸­å¯¼èˆª

      \n' + + '\n' + + '

      在éžæ ‡ç­¾é¡µå¼å¯¹è¯æ¡†ä¸­ï¼Œå½“对è¯æ¡†æ‰“开时,第一个交互组件获得焦点。

      \n' + + '\n' + + '

      通过按 Tab 或 Shift+Tab,在交互对è¯æ¡†ç»„件之间导航。

      \n' + + '\n' + + '

      在标签页å¼å¯¹è¯æ¡†ä¸­å¯¼èˆª

      \n' + + '\n' + + '

      在标签页å¼å¯¹è¯æ¡†ä¸­ï¼Œå½“对è¯æ¡†æ‰“开时,标签页èœå•ä¸­çš„第一个按钮获得焦点。

      \n' + + '\n' + + '

      通过按 Tab 或 Shift+Tab,在此对è¯æ¡†çš„交互组件之间导航。

      \n' + + '\n' + + '

      通过将焦点移至å¦ä¸€å¯¹è¯æ¡†æ ‡ç­¾é¡µçš„èœå•ï¼Œç„¶åŽæŒ‰ç›¸åº”的箭头键以在å¯ç”¨çš„标签页间循环,从而切æ¢åˆ°è¯¥å¯¹è¯æ¡†æ ‡ç­¾é¡µã€‚

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/js/i18n/keynav/zh_TW.js b/static/js/tinymce/plugins/help/js/i18n/keynav/zh_TW.js new file mode 100644 index 0000000..26b3dd2 --- /dev/null +++ b/static/js/tinymce/plugins/help/js/i18n/keynav/zh_TW.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.zh_TW', +'

      開始éµç›¤ç€è¦½

      \n' + + '\n' + + '
      \n' + + '
      跳至功能表列
      \n' + + '
      Windows 或 Linux:Alt+F9
      \n' + + '
      macOS:⌥F9
      \n' + + '
      跳至工具列
      \n' + + '
      Windows 或 Linux:Alt+F10
      \n' + + '
      macOS:⌥F10
      \n' + + '
      跳至é å°¾
      \n' + + '
      Windows 或 Linux:Alt+F11
      \n' + + '
      macOS:⌥F11
      \n' + + '
      跳至關è¯å¼å·¥å…·åˆ—
      \n' + + '
      Windowsã€Linux 或 macOS:Ctrl+F9\n' + + '
      \n' + + '\n' + + '

      ç€è¦½æœƒå¾žç¬¬ä¸€å€‹ UI 項目開始,該項目會å白顯示,但如果是「é å°¾ã€å…ƒç´ è·¯å¾‘的第一項,\n' + + ' 則加底線。

      \n' + + '\n' + + '

      在 UI å€æ®µä¹‹é–“ç€è¦½

      \n' + + '\n' + + '

      從 UI å€æ®µç§»è‡³ä¸‹ä¸€å€‹ï¼Œè«‹æŒ‰ Tab。

      \n' + + '\n' + + '

      從 UI å€æ®µç§»å›žä¸Šä¸€å€‹ï¼Œè«‹æŒ‰ Shift+Tab。

      \n' + + '\n' + + '

      這些 UI å€æ®µçš„ Tab é †åºå¦‚下:\n' + + '\n' + + '

        \n' + + '
      1. 功能表列
      2. \n' + + '
      3. å„個工具列群組
      4. \n' + + '
      5. å´é‚Šæ¬„
      6. \n' + + '
      7. é å°¾ä¸­çš„元素路徑
      8. \n' + + '
      9. é å°¾ä¸­å­—數切æ›æŒ‰éˆ•
      10. \n' + + '
      11. é å°¾ä¸­çš„å“牌連çµ
      12. \n' + + '
      13. é å°¾ä¸­ç·¨è¼¯å™¨èª¿æ•´å¤§å°æŽ§é»ž
      14. \n' + + '
      \n' + + '\n' + + '

      如果 UI å€æ®µæœªé¡¯ç¤ºï¼Œè¡¨ç¤ºå·²ç•¥éŽè©²å€æ®µã€‚

      \n' + + '\n' + + '

      如果éµç›¤ç€è¦½è·³è‡³é å°¾ï¼Œä½†æ²’有顯示å´é‚Šæ¬„,則按下 Shift+Tab\n' + + ' 會跳至第一個工具列群組,而ä¸æ˜¯æœ€å¾Œä¸€å€‹ã€‚\n' + + '\n' + + '

      在 UI å€æ®µä¹‹å…§ç€è¦½

      \n' + + '\n' + + '

      在兩個 UI 元素之間移動,請按é©ç•¶çš„æ–¹å‘éµã€‚

      \n' + + '\n' + + '

      å‘左和å‘å³æ–¹å‘éµ

      \n' + + '\n' + + '
        \n' + + '
      • 在功能表列中的功能表之間移動。
      • \n' + + '
      • 開啟功能表中的å­åŠŸèƒ½è¡¨ã€‚
      • \n' + + '
      • 在工具列群組中的按鈕之間移動。
      • \n' + + '
      • 在é å°¾çš„元素路徑中項目之間移動。
      • \n' + + '
      \n' + + '\n' + + '

      å‘下和å‘上方å‘éµ\n' + + '\n' + + '

        \n' + + '
      • 在功能表中的功能表項目之間移動。
      • \n' + + '
      • 在工具列快顯功能表中的項目之間移動。
      • \n' + + '
      \n' + + '\n' + + '

      æ–¹å‘éµæœƒåœ¨æ‰€è·³è‡³ UI å€æ®µä¹‹å…§å¾ªç’°ã€‚

      \n' + + '\n' + + '

      è‹¥è¦é—œé–‰å·²é–‹å•Ÿçš„功能表ã€å·²é–‹å•Ÿçš„å­åŠŸèƒ½è¡¨ï¼Œæˆ–已開啟的快顯功能表,請按 Esc éµã€‚\n' + + '\n' + + '

      如果目å‰å·²è·³è‡³ç‰¹å®š UI å€æ®µçš„「頂端ã€ï¼Œå‰‡æŒ‰ Esc éµä¹ŸæœƒçµæŸ\n' + + ' 整個éµç›¤ç€è¦½ã€‚

      \n' + + '\n' + + '

      執行功能表列項目或工具列按鈕

      \n' + + '\n' + + '

      當想è¦çš„功能表項目或工具列按鈕已å白顯示時,按 Returnã€Enterã€\n' + + ' 或空白éµå³å¯åŸ·è¡Œè©²é …目。\n' + + '\n' + + '

      ç€è¦½éžç´¢å¼•æ¨™ç±¤å¼å°è©±æ–¹å¡Š

      \n' + + '\n' + + '

      在éžç´¢å¼•æ¨™ç±¤å¼å°è©±æ–¹å¡Šä¸­ï¼Œé–‹å•Ÿå°è©±æ–¹å¡Šæ™‚會跳至第一個互動元件。

      \n' + + '\n' + + '

      按 Tab 或 Shift+Tab å³å¯åœ¨äº’å‹•å¼å°è©±æ–¹å¡Šå…ƒä»¶ä¹‹é–“ç€è¦½ã€‚

      \n' + + '\n' + + '

      ç€è¦½ç´¢å¼•æ¨™ç±¤å¼å°è©±æ–¹å¡Š

      \n' + + '\n' + + '

      在索引標籤å¼å°è©±æ–¹å¡Šä¸­ï¼Œé–‹å•Ÿå°è©±æ–¹å¡Šæ™‚會跳至索引標籤å¼åŠŸèƒ½è¡¨ä¸­çš„第一個按鈕。

      \n' + + '\n' + + '

      è‹¥è¦åœ¨æ­¤å°è©±æ–¹å¡Šçš„互動å¼å…ƒä»¶ä¹‹é–“ç€è¦½ï¼Œè«‹æŒ‰ Tab 或\n' + + ' Shift+Tab。

      \n' + + '\n' + + '

      先跳至索引標籤å¼åŠŸèƒ½è¡¨ï¼Œç„¶å¾ŒæŒ‰é©ç•¶çš„æ–¹å‘éµï¼Œå³å¯åˆ‡æ›è‡³å¦ä¸€å€‹å°è©±æ–¹å¡Šç´¢å¼•æ¨™ç±¤ï¼Œ\n' + + ' 以循環ç€è¦½å¯ç”¨çš„索引標籤。

      \n'); \ No newline at end of file diff --git a/static/js/tinymce/plugins/help/plugin.min.js b/static/js/tinymce/plugins/help/plugin.min.js new file mode 100644 index 0000000..58153fe --- /dev/null +++ b/static/js/tinymce/plugins/help/plugin.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.7.2 (2023-10-25) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");let t=0;const n=e=>{const n=(new Date).getTime(),a=Math.floor(1e9*Math.random());return t++,e+"_"+a+t+String(n)},a=e=>t=>t.options.get(e),r=a("help_tabs"),o=a("forced_plugins"),i=("string",e=>"string"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=a=e,(r=String).prototype.isPrototypeOf(n)||(null===(o=a.constructor)||void 0===o?void 0:o.name)===r.name)?"string":t;var n,a,r,o})(e));const s=(void 0,e=>undefined===e);const l=e=>"function"==typeof e,c=(!1,()=>false);class m{constructor(e,t){this.tag=e,this.value=t}static some(e){return new m(!0,e)}static none(){return m.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?m.some(e(this.value)):m.none()}bind(e){return this.tag?e(this.value):m.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:m.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return null==e?m.none():m.some(e)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}m.singletonNone=new m(!1);const u=Array.prototype.slice,p=Array.prototype.indexOf,y=(e,t)=>{const n=e.length,a=new Array(n);for(let r=0;r{const n=[];for(let a=0,r=e.length;a{const n=u.call(e,0);return n.sort(t),n},g=Object.keys,k=Object.hasOwnProperty,v=(e,t)=>k.call(e,t);var b=tinymce.util.Tools.resolve("tinymce.Resource"),f=tinymce.util.Tools.resolve("tinymce.util.I18n");const A=(e,t)=>b.load(`tinymce.html-i18n.help-keynav.${t}`,`${e}/js/i18n/keynav/${t}.js`),C=e=>A(e,f.getCode()).catch((()=>A(e,"en")));var w=tinymce.util.Tools.resolve("tinymce.Env");const S=e=>{const t=w.os.isMacOS()||w.os.isiOS(),n=t?{alt:"⌥",ctrl:"⌃",shift:"⇧",meta:"⌘",access:"⌃⌥"}:{meta:"Ctrl ",access:"Shift + Alt "},a=e.split("+"),r=y(a,(e=>{const t=e.toLowerCase().trim();return v(n,t)?n[t]:e}));return t?r.join("").replace(/\s/,""):r.join("+")},M=[{shortcuts:["Meta + B"],action:"Bold"},{shortcuts:["Meta + I"],action:"Italic"},{shortcuts:["Meta + U"],action:"Underline"},{shortcuts:["Meta + A"],action:"Select all"},{shortcuts:["Meta + Y","Meta + Shift + Z"],action:"Redo"},{shortcuts:["Meta + Z"],action:"Undo"},{shortcuts:["Access + 1"],action:"Heading 1"},{shortcuts:["Access + 2"],action:"Heading 2"},{shortcuts:["Access + 3"],action:"Heading 3"},{shortcuts:["Access + 4"],action:"Heading 4"},{shortcuts:["Access + 5"],action:"Heading 5"},{shortcuts:["Access + 6"],action:"Heading 6"},{shortcuts:["Access + 7"],action:"Paragraph"},{shortcuts:["Access + 8"],action:"Div"},{shortcuts:["Access + 9"],action:"Address"},{shortcuts:["Alt + 0"],action:"Open help dialog"},{shortcuts:["Alt + F9"],action:"Focus to menubar"},{shortcuts:["Alt + F10"],action:"Focus to toolbar"},{shortcuts:["Alt + F11"],action:"Focus to element path"},{shortcuts:["Ctrl + F9"],action:"Focus to contextual toolbar"},{shortcuts:["Shift + Enter"],action:"Open popup menu for split buttons"},{shortcuts:["Meta + K"],action:"Insert link (if link plugin activated)"},{shortcuts:["Meta + S"],action:"Save (if save plugin activated)"},{shortcuts:["Meta + F"],action:"Find (if searchreplace plugin activated)"},{shortcuts:["Meta + Shift + F"],action:"Switch to or from fullscreen mode"}],T=()=>({name:"shortcuts",title:"Handy Shortcuts",items:[{type:"table",header:["Action","Shortcut"],cells:y(M,(e=>{const t=y(e.shortcuts,S).join(" or ");return[e.action,t]}))}]}),x=y([{key:"accordion",name:"Accordion"},{key:"advlist",name:"Advanced List"},{key:"anchor",name:"Anchor"},{key:"autolink",name:"Autolink"},{key:"autoresize",name:"Autoresize"},{key:"autosave",name:"Autosave"},{key:"charmap",name:"Character Map"},{key:"code",name:"Code"},{key:"codesample",name:"Code Sample"},{key:"colorpicker",name:"Color Picker"},{key:"directionality",name:"Directionality"},{key:"emoticons",name:"Emoticons"},{key:"fullscreen",name:"Full Screen"},{key:"help",name:"Help"},{key:"image",name:"Image"},{key:"importcss",name:"Import CSS"},{key:"insertdatetime",name:"Insert Date/Time"},{key:"link",name:"Link"},{key:"lists",name:"Lists"},{key:"media",name:"Media"},{key:"nonbreaking",name:"Nonbreaking"},{key:"pagebreak",name:"Page Break"},{key:"preview",name:"Preview"},{key:"quickbars",name:"Quick Toolbars"},{key:"save",name:"Save"},{key:"searchreplace",name:"Search and Replace"},{key:"table",name:"Table"},{key:"template",name:"Template"},{key:"textcolor",name:"Text Color"},{key:"visualblocks",name:"Visual Blocks"},{key:"visualchars",name:"Visual Characters"},{key:"wordcount",name:"Word Count"},{key:"a11ychecker",name:"Accessibility Checker",type:"premium"},{key:"advcode",name:"Advanced Code Editor",type:"premium"},{key:"advtable",name:"Advanced Tables",type:"premium"},{key:"advtemplate",name:"Advanced Templates",type:"premium",slug:"advanced-templates"},{key:"ai",name:"AI Assistant",type:"premium"},{key:"casechange",name:"Case Change",type:"premium"},{key:"checklist",name:"Checklist",type:"premium"},{key:"editimage",name:"Enhanced Image Editing",type:"premium"},{key:"footnotes",name:"Footnotes",type:"premium"},{key:"typography",name:"Advanced Typography",type:"premium",slug:"advanced-typography"},{key:"mediaembed",name:"Enhanced Media Embed",type:"premium",slug:"introduction-to-mediaembed"},{key:"export",name:"Export",type:"premium"},{key:"formatpainter",name:"Format Painter",type:"premium"},{key:"inlinecss",name:"Inline CSS",type:"premium",slug:"inline-css"},{key:"linkchecker",name:"Link Checker",type:"premium"},{key:"mentions",name:"Mentions",type:"premium"},{key:"mergetags",name:"Merge Tags",type:"premium"},{key:"pageembed",name:"Page Embed",type:"premium"},{key:"permanentpen",name:"Permanent Pen",type:"premium"},{key:"powerpaste",name:"PowerPaste",type:"premium",slug:"introduction-to-powerpaste"},{key:"rtc",name:"Real-Time Collaboration",type:"premium",slug:"rtc-introduction"},{key:"tinymcespellchecker",name:"Spell Checker Pro",type:"premium",slug:"introduction-to-tiny-spellchecker"},{key:"autocorrect",name:"Spelling Autocorrect",type:"premium"},{key:"tableofcontents",name:"Table of Contents",type:"premium"},{key:"tinycomments",name:"Tiny Comments",type:"premium",slug:"introduction-to-tiny-comments"},{key:"tinydrive",name:"Tiny Drive",type:"premium",slug:"tinydrive-introduction"}],(e=>({...e,type:e.type||"opensource",slug:e.slug||e.key}))),_=e=>{const t=e=>`
      ${e.name}`,n=(e,n)=>{return(a=x,r=e=>e.key===n,((e,t,n)=>{for(let a=0,r=e.length;a((e,n)=>{const a=e.plugins[n].getMetadata;if(l(a)){const e=a();return{name:e.name,html:t(e)}}return{name:n,html:n}})(e,n)),(e=>{const n="premium"===e.type?`${e.name}*`:e.name;return{name:n,html:t({name:n,url:`https://www.tiny.cloud/docs/tinymce/6/${e.slug}/`})}}));var a,r},a=e=>{const t=(e=>{const t=g(e.plugins),n=o(e);return s(n)?t:h(t,(e=>!(((e,t)=>p.call(e,t))(n,e)>-1)))})(e),a=d(y(t,(t=>n(e,t))),((e,t)=>e.name.localeCompare(t.name))),r=y(a,(e=>"
    • "+e.html+"
    • ")),i=r.length,l=r.join("");return"

      "+f.translate(["Plugins installed ({0}):",i])+"

        "+l+"
      "},r={type:"htmlpanel",presets:"document",html:[(e=>null==e?"":"
      "+a(e)+"
      ")(e),(()=>{const e=h(x,(({type:e})=>"premium"===e)),t=d(y(e,(e=>e.name)),((e,t)=>e.localeCompare(t))),n=y(t,(e=>`
    • ${e}
    • `)).join("");return"

      "+f.translate("Premium plugins:")+"

      "})()].join("")};return{name:"plugins",title:"Plugins",items:[r]}};var O=tinymce.util.Tools.resolve("tinymce.EditorManager");const P=(e,t,a)=>()=>{(async(e,t,a)=>{const o=T(),s=await(async e=>({name:"keyboardnav",title:"Keyboard Navigation",items:[{type:"htmlpanel",presets:"document",html:await C(e)}]}))(a),l=_(e),c=(()=>{var e,t;const n='TinyMCE '+(e=O.majorVersion,t=O.minorVersion,(0===e.indexOf("@")?"X.X.X":e+"."+t)+"");return{name:"versions",title:"Version",items:[{type:"htmlpanel",html:"

      "+f.translate(["You are using {0}",n])+"

      ",presets:"document"}]}})(),u={[o.name]:o,[s.name]:s,[l.name]:l,[c.name]:c,...t.get()};return m.from(r(e)).fold((()=>(e=>{const t=g(e),n=t.indexOf("versions");return-1!==n&&(t.splice(n,1),t.push("versions")),{tabs:e,names:t}})(u)),(e=>((e,t)=>{const a={},r=y(e,(e=>{var r;if(i(e))return v(t,e)&&(a[e]=t[e]),e;{const t=null!==(r=e.name)&&void 0!==r?r:n("tab-name");return a[t]=e,t}}));return{tabs:a,names:r}})(e,u)))})(e,t,a).then((({tabs:t,names:n})=>{const a={type:"tabpanel",tabs:(e=>{const t=[],n=e=>{t.push(e)};for(let t=0;t{return v(n=t,a=e)?m.from(n[a]):m.none();var n,a})))};e.windowManager.open({title:"Help",size:"medium",body:a,buttons:[{type:"cancel",name:"close",text:"Close",primary:!0}],initialData:{}})}))};e.add("help",((e,t)=>{const a=(e=>{let t={};return{get:()=>t,set:e=>{t=e}}})(),r=(e=>({addTab:t=>{var a;const r=null!==(a=t.name)&&void 0!==a?a:n("tab-name"),o=e.get();o[r]=t,e.set(o)}}))(a);(e=>{(0,e.options.register)("help_tabs",{processor:"array"})})(e);const o=P(e,a,t);return((e,t)=>{e.ui.registry.addButton("help",{icon:"help",tooltip:"Help",onAction:t}),e.ui.registry.addMenuItem("help",{text:"Help",icon:"help",shortcut:"Alt+0",onAction:t})})(e,o),((e,t)=>{e.addCommand("mceHelp",t)})(e,o),e.shortcuts.add("Alt+0","Open help dialog","mceHelp"),((e,t)=>{e.on("init",(()=>{C(t)}))})(e,t),r}))}(); \ No newline at end of file diff --git a/static/js/tinymce/plugins/image/plugin.min.js b/static/js/tinymce/plugins/image/plugin.min.js new file mode 100644 index 0000000..905b475 --- /dev/null +++ b/static/js/tinymce/plugins/image/plugin.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.7.2 (2023-10-25) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=Object.getPrototypeOf,a=(e,t,a)=>{var i;return!!a(e,t.prototype)||(null===(i=e.constructor)||void 0===i?void 0:i.name)===t.name},i=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&a(e,String,((e,t)=>t.isPrototypeOf(e)))?"string":t})(t)===e,s=e=>t=>typeof t===e,r=i("string"),o=i("object"),n=e=>((e,i)=>o(e)&&a(e,i,((e,a)=>t(e)===a)))(e,Object),l=i("array"),c=(null,e=>null===e);const m=s("boolean"),d=e=>!(e=>null==e)(e),g=s("function"),u=s("number"),p=()=>{};class h{constructor(e,t){this.tag=e,this.value=t}static some(e){return new h(!0,e)}static none(){return h.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?h.some(e(this.value)):h.none()}bind(e){return this.tag?e(this.value):h.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:h.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return d(e)?h.some(e):h.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}h.singletonNone=new h(!1);const b=Object.keys,v=Object.hasOwnProperty,y=(e,t)=>v.call(e,t),f=Array.prototype.push,w=e=>{const t=[];for(let a=0,i=e.length;a{((e,t,a)=>{if(!(r(a)||m(a)||u(a)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",a,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,a+"")})(e.dom,t,a)},D=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},_=D;var C=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),I=tinymce.util.Tools.resolve("tinymce.util.URI");const U=e=>e.length>0,S=e=>t=>t.options.get(e),x=S("image_dimensions"),N=S("image_advtab"),T=S("image_uploadtab"),O=S("image_prepend_url"),E=S("image_class_list"),L=S("image_description"),j=S("image_title"),M=S("image_caption"),R=S("image_list"),k=S("a11y_advanced_options"),z=S("automatic_uploads"),P=(e,t)=>Math.max(parseInt(e,10),parseInt(t,10)),B=e=>(e&&(e=e.replace(/px$/,"")),e),F=e=>(e.length>0&&/^[0-9]+$/.test(e)&&(e+="px"),e),H=e=>"IMG"===e.nodeName&&(e.hasAttribute("data-mce-object")||e.hasAttribute("data-mce-placeholder")),G=(e,t)=>{const a=e.options.get;return I.isDomSafe(t,"img",{allow_html_data_urls:a("allow_html_data_urls"),allow_script_urls:a("allow_script_urls"),allow_svg_data_urls:a("allow_svg_data_urls")})},W=C.DOM,$=e=>e.style.marginLeft&&e.style.marginRight&&e.style.marginLeft===e.style.marginRight?B(e.style.marginLeft):"",V=e=>e.style.marginTop&&e.style.marginBottom&&e.style.marginTop===e.style.marginBottom?B(e.style.marginTop):"",K=e=>e.style.borderWidth?B(e.style.borderWidth):"",Z=(e,t)=>{var a;return e.hasAttribute(t)&&null!==(a=e.getAttribute(t))&&void 0!==a?a:""},q=e=>null!==e.parentNode&&"FIGURE"===e.parentNode.nodeName,J=(e,t,a)=>{""===a||null===a?e.removeAttribute(t):e.setAttribute(t,a)},Q=(e,t)=>{const a=e.getAttribute("style"),i=t(null!==a?a:"");i.length>0?(e.setAttribute("style",i),e.setAttribute("data-mce-style",i)):e.removeAttribute("style")},X=(e,t)=>(e,a,i)=>{const s=e.style;s[a]?(s[a]=F(i),Q(e,t)):J(e,a,i)},Y=(e,t)=>e.style[t]?B(e.style[t]):Z(e,t),ee=(e,t)=>{const a=F(t);e.style.marginLeft=a,e.style.marginRight=a},te=(e,t)=>{const a=F(t);e.style.marginTop=a,e.style.marginBottom=a},ae=(e,t)=>{const a=F(t);e.style.borderWidth=a},ie=(e,t)=>{e.style.borderStyle=t},se=e=>{var t;return null!==(t=e.style.borderStyle)&&void 0!==t?t:""},re=e=>d(e)&&"FIGURE"===e.nodeName,oe=e=>0===W.getAttrib(e,"alt").length&&"presentation"===W.getAttrib(e,"role"),ne=e=>oe(e)?"":Z(e,"alt"),le=(e,t)=>{var a;const i=document.createElement("img");return J(i,"style",t.style),($(i)||""!==t.hspace)&&ee(i,t.hspace),(V(i)||""!==t.vspace)&&te(i,t.vspace),(K(i)||""!==t.border)&&ae(i,t.border),(se(i)||""!==t.borderStyle)&&ie(i,t.borderStyle),e(null!==(a=i.getAttribute("style"))&&void 0!==a?a:"")},ce=(e,t)=>({src:Z(t,"src"),alt:ne(t),title:Z(t,"title"),width:Y(t,"width"),height:Y(t,"height"),class:Z(t,"class"),style:e(Z(t,"style")),caption:q(t),hspace:$(t),vspace:V(t),border:K(t),borderStyle:se(t),isDecorative:oe(t)}),me=(e,t,a,i,s)=>{a[i]!==t[i]&&s(e,i,String(a[i]))},de=(e,t,a)=>{if(a){W.setAttrib(e,"role","presentation");const t=_(e);A(t,"alt","")}else{if(c(t)){"alt",_(e).dom.removeAttribute("alt")}else{const a=_(e);A(a,"alt",t)}"presentation"===W.getAttrib(e,"role")&&W.setAttrib(e,"role","")}},ge=(e,t)=>(a,i,s)=>{e(a,s),Q(a,t)},ue=(e,t,a)=>{const i=ce(e,a);me(a,i,t,"caption",((e,t,a)=>(e=>{q(e)?(e=>{const t=e.parentNode;d(t)&&(W.insertAfter(e,t),W.remove(t))})(e):(e=>{const t=W.create("figure",{class:"image"});W.insertAfter(t,e),t.appendChild(e),t.appendChild(W.create("figcaption",{contentEditable:"true"},"Caption")),t.contentEditable="false"})(e)})(e))),me(a,i,t,"src",J),me(a,i,t,"title",J),me(a,i,t,"width",X(0,e)),me(a,i,t,"height",X(0,e)),me(a,i,t,"class",J),me(a,i,t,"style",ge(((e,t)=>J(e,"style",t)),e)),me(a,i,t,"hspace",ge(ee,e)),me(a,i,t,"vspace",ge(te,e)),me(a,i,t,"border",ge(ae,e)),me(a,i,t,"borderStyle",ge(ie,e)),((e,t,a)=>{a.alt===t.alt&&a.isDecorative===t.isDecorative||de(e,a.alt,a.isDecorative)})(a,i,t)},pe=(e,t)=>{const a=(e=>{if(e.margin){const t=String(e.margin).split(" ");switch(t.length){case 1:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[0],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[0];break;case 2:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[1];break;case 3:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[1];break;case 4:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[3]}delete e.margin}return e})(e.dom.styles.parse(t)),i=e.dom.styles.parse(e.dom.styles.serialize(a));return e.dom.styles.serialize(i)},he=e=>{const t=e.selection.getNode(),a=e.dom.getParent(t,"figure.image");return a?e.dom.select("img",a)[0]:t&&("IMG"!==t.nodeName||H(t))?null:t},be=(e,t)=>{var a;const i=e.dom,s=((t,a)=>{const i={};var s;return((e,t,a,i)=>{((e,t)=>{const a=b(e);for(let i=0,s=a.length;i{(t(e,s)?a:i)(e,s)}))})(t,((t,a)=>!e.schema.isValidChild(a,"figure")),(s=i,(e,t)=>{s[t]=e}),p),i})(e.schema.getTextBlockElements()),r=i.getParent(t.parentNode,(e=>{return t=s,a=e.nodeName,y(t,a)&&void 0!==t[a]&&null!==t[a];var t,a}),e.getBody());return r&&null!==(a=i.split(r,t))&&void 0!==a?a:t},ve=(e,t)=>{const a=((t,a)=>{const i=document.createElement("img");if(ue((t=>pe(e,t)),{...a,caption:!1},i),de(i,a.alt,a.isDecorative),a.caption){const e=W.create("figure",{class:"image"});return e.appendChild(i),e.appendChild(W.create("figcaption",{contentEditable:"true"},"Caption")),e.contentEditable="false",e}return i})(0,t);e.dom.setAttrib(a,"data-mce-id","__mcenew"),e.focus(),e.selection.setContent(a.outerHTML);const i=e.dom.select('*[data-mce-id="__mcenew"]')[0];if(e.dom.setAttrib(i,"data-mce-id",null),re(i)){const t=be(e,i);e.selection.select(t)}else e.selection.select(i)},ye=(e,t)=>{const a=he(e);if(a){const i={...ce((t=>pe(e,t)),a),...t},s=((e,t)=>{const a=t.src;return{...t,src:G(e,a)?a:""}})(e,i);i.src?((e,t)=>{const a=he(e);if(a)if(ue((t=>pe(e,t)),t,a),((e,t)=>{e.dom.setAttrib(t,"src",t.getAttribute("src"))})(e,a),re(a.parentNode)){const t=a.parentNode;be(e,t),e.selection.select(a.parentNode)}else e.selection.select(a),((e,t,a)=>{const i=()=>{a.onload=a.onerror=null,e.selection&&(e.selection.select(a),e.nodeChanged())};a.onload=()=>{t.width||t.height||!x(e)||e.dom.setAttribs(a,{width:String(a.clientWidth),height:String(a.clientHeight)}),i()},a.onerror=i})(e,t,a)})(e,s):((e,t)=>{if(t){const a=e.dom.is(t.parentNode,"figure.image")?t.parentNode:t;e.dom.remove(a),e.focus(),e.nodeChanged(),e.dom.isEmpty(e.getBody())&&(e.setContent(""),e.selection.setCursorLocation())}})(e,a)}else t.src&&ve(e,{src:"",alt:"",title:"",width:"",height:"",class:"",style:"",caption:!1,hspace:"",vspace:"",border:"",borderStyle:"",isDecorative:!1,...t})},fe=(we=(e,t)=>n(e)&&n(t)?fe(e,t):t,(...e)=>{if(0===e.length)throw new Error("Can't merge zero objects");const t={};for(let a=0;ar(e.value)?e.value:"",Ce=(e,t)=>{const a=[];return De.each(e,(e=>{const i=(e=>r(e.text)?e.text:r(e.title)?e.title:"")(e);if(void 0!==e.menu){const s=Ce(e.menu,t);a.push({text:i,items:s})}else{const s=t(e);a.push({text:i,value:s})}})),a},Ie=(e=_e)=>t=>t?h.from(t).map((t=>Ce(t,e))):h.none(),Ue=(e,t)=>((e,a)=>{for(let a=0;ay(e,"items"))(i=e[a])?Ue(i.items,t):i.value===t?h.some(i):h.none();if(s.isSome())return s}var i;return h.none()})(e),Se=Ie,xe=(e,t)=>e.bind((e=>Ue(e,t))),Ne=e=>{const t=Se((t=>e.convertURL(t.value||t.url||"","src"))),a=new Promise((a=>{((e,t)=>{const a=R(e);r(a)?fetch(a).then((e=>{e.ok&&e.json().then(t)})):g(a)?a(t):t(a)})(e,(e=>{a(t(e).map((e=>w([[{text:"None",value:""}],e]))))}))})),i=(A=E(e),Ie(_e)(A)),s=N(e),o=T(e),n=(e=>U(e.options.get("images_upload_url")))(e),l=(e=>d(e.options.get("images_upload_handler")))(e),c=(e=>{const t=he(e);return t?ce((t=>pe(e,t)),t):{src:"",alt:"",title:"",width:"",height:"",class:"",style:"",caption:!1,hspace:"",vspace:"",border:"",borderStyle:"",isDecorative:!1}})(e),m=L(e),u=j(e),p=x(e),b=M(e),v=k(e),y=z(e),f=h.some(O(e)).filter((e=>r(e)&&e.length>0));var A;return a.then((e=>({image:c,imageList:e,classList:i,hasAdvTab:s,hasUploadTab:o,hasUploadUrl:n,hasUploadHandler:l,hasDescription:m,hasImageTitle:u,hasDimensions:p,hasImageCaption:b,prependURL:f,hasAccessibilityOptions:v,automaticUploads:y})))},Te=e=>{const t=e.imageList.map((e=>({name:"images",type:"listbox",label:"Image list",items:e}))),a={name:"alt",type:"input",label:"Alternative description",enabled:!(e.hasAccessibilityOptions&&e.image.isDecorative)},i=e.classList.map((e=>({name:"classes",type:"listbox",label:"Class",items:e})));return w([[{name:"src",type:"urlinput",filetype:"image",label:"Source"}],t.toArray(),e.hasAccessibilityOptions&&e.hasDescription?[{type:"label",label:"Accessibility",items:[{name:"isDecorative",type:"checkbox",label:"Image is decorative"}]}]:[],e.hasDescription?[a]:[],e.hasImageTitle?[{name:"title",type:"input",label:"Image title"}]:[],e.hasDimensions?[{name:"dimensions",type:"sizeinput"}]:[],[{...(s=e.classList.isSome()&&e.hasImageCaption,s?{type:"grid",columns:2}:{type:"panel"}),items:w([i.toArray(),e.hasImageCaption?[{type:"label",label:"Caption",items:[{type:"checkbox",name:"caption",label:"Show caption"}]}]:[]])}]]);var s},Oe=e=>({title:"General",name:"general",items:Te(e)}),Ee=Te,Le=e=>({src:{value:e.src,meta:{}},images:e.src,alt:e.alt,title:e.title,dimensions:{width:e.width,height:e.height},classes:e.class,caption:e.caption,style:e.style,vspace:e.vspace,border:e.border,hspace:e.hspace,borderstyle:e.borderStyle,fileinput:[],isDecorative:e.isDecorative}),je=(e,t)=>({src:e.src.value,alt:null!==e.alt&&0!==e.alt.length||!t?e.alt:null,title:e.title,width:e.dimensions.width,height:e.dimensions.height,class:e.classes,style:e.style,caption:e.caption,hspace:e.hspace,vspace:e.vspace,border:e.border,borderStyle:e.borderstyle,isDecorative:e.isDecorative}),Me=(e,t,a,i)=>{((e,t)=>{const a=t.getData();((e,t)=>/^(?:[a-zA-Z]+:)?\/\//.test(t)?h.none():e.prependURL.bind((e=>t.substring(0,e.length)!==e?h.some(e+t):h.none())))(e,a.src.value).each((e=>{t.setData({src:{value:e,meta:a.src.meta}})}))})(t,i),((e,t)=>{const a=t.getData(),i=a.src.meta;if(void 0!==i){const s=fe({},a);((e,t,a)=>{e.hasDescription&&r(a.alt)&&(t.alt=a.alt),e.hasAccessibilityOptions&&(t.isDecorative=a.isDecorative||t.isDecorative||!1),e.hasImageTitle&&r(a.title)&&(t.title=a.title),e.hasDimensions&&(r(a.width)&&(t.dimensions.width=a.width),r(a.height)&&(t.dimensions.height=a.height)),r(a.class)&&xe(e.classList,a.class).each((e=>{t.classes=e.value})),e.hasImageCaption&&m(a.caption)&&(t.caption=a.caption),e.hasAdvTab&&(r(a.style)&&(t.style=a.style),r(a.vspace)&&(t.vspace=a.vspace),r(a.border)&&(t.border=a.border),r(a.hspace)&&(t.hspace=a.hspace),r(a.borderstyle)&&(t.borderstyle=a.borderstyle))})(e,s,i),t.setData(s)}})(t,i),((e,t,a,i)=>{const s=i.getData(),r=s.src.value,o=s.src.meta||{};o.width||o.height||!t.hasDimensions||(U(r)?e.imageSize(r).then((e=>{a.open&&i.setData({dimensions:e})})).catch((e=>console.error(e))):i.setData({dimensions:{width:"",height:""}}))})(e,t,a,i),((e,t,a)=>{const i=a.getData(),s=xe(e.imageList,i.src.value);t.prevImage=s,a.setData({images:s.map((e=>e.value)).getOr("")})})(t,a,i)},Re=(e,t,a,i)=>{const s=i.getData();var r;i.block("Uploading image"),(r=s.fileinput,((e,t)=>0{i.unblock()}),(s=>{const r=URL.createObjectURL(s),o=()=>{i.unblock(),URL.revokeObjectURL(r)},n=s=>{i.setData({src:{value:s,meta:{}}}),i.showTab("general"),Me(e,t,a,i)};var l;(l=s,new Promise(((e,t)=>{const a=new FileReader;a.onload=()=>{e(a.result)},a.onerror=()=>{var e;t(null===(e=a.error)||void 0===e?void 0:e.message)},a.readAsDataURL(l)}))).then((a=>{const l=e.createBlobCache(s,r,a);t.automaticUploads?e.uploadImage(l).then((e=>{n(e.url),o()})).catch((t=>{o(),e.alertErr(t)})):(e.addToBlobCache(l),n(l.blobUri()),i.unblock())}))}))},ke=(e,t,a)=>(i,s)=>{"src"===s.name?Me(e,t,a,i):"images"===s.name?((e,t,a,i)=>{const s=i.getData(),r=xe(t.imageList,s.images);r.each((e=>{const t=""===s.alt||a.prevImage.map((e=>e.text===s.alt)).getOr(!1);t?""===e.value?i.setData({src:e,alt:a.prevAlt}):i.setData({src:e,alt:e.text}):i.setData({src:e})})),a.prevImage=r,Me(e,t,a,i)})(e,t,a,i):"alt"===s.name?a.prevAlt=i.getData().alt:"fileinput"===s.name?Re(e,t,a,i):"isDecorative"===s.name&&i.setEnabled("alt",!i.getData().isDecorative)},ze=e=>()=>{e.open=!1},Pe=e=>e.hasAdvTab||e.hasUploadUrl||e.hasUploadHandler?{type:"tabpanel",tabs:w([[Oe(e)],e.hasAdvTab?[{title:"Advanced",name:"advanced",items:[{type:"grid",columns:2,items:[{type:"input",label:"Vertical space",name:"vspace",inputMode:"numeric"},{type:"input",label:"Horizontal space",name:"hspace",inputMode:"numeric"},{type:"input",label:"Border width",name:"border",inputMode:"numeric"},{type:"listbox",name:"borderstyle",label:"Border style",items:[{text:"Select...",value:""},{text:"Solid",value:"solid"},{text:"Dotted",value:"dotted"},{text:"Dashed",value:"dashed"},{text:"Double",value:"double"},{text:"Groove",value:"groove"},{text:"Ridge",value:"ridge"},{text:"Inset",value:"inset"},{text:"Outset",value:"outset"},{text:"None",value:"none"},{text:"Hidden",value:"hidden"}]}]}]}]:[],e.hasUploadTab&&(e.hasUploadUrl||e.hasUploadHandler)?[{title:"Upload",name:"upload",items:[{type:"dropzone",name:"fileinput"}]}]:[]])}:{type:"panel",items:Ee(e)},Be=(e,t,a)=>i=>{const s=fe(Le(t.image),i.getData()),r={...s,style:le(a.normalizeCss,je(s,!1))};e.execCommand("mceUpdateImage",!1,je(r,t.hasAccessibilityOptions)),e.editorUpload.uploadImagesAuto(),i.close()},Fe=e=>t=>G(e,t)?(e=>new Promise((t=>{const a=document.createElement("img"),i=e=>{a.onload=a.onerror=null,a.parentNode&&a.parentNode.removeChild(a),t(e)};a.onload=()=>{const e={width:P(a.width,a.clientWidth),height:P(a.height,a.clientHeight)};i(Promise.resolve(e))},a.onerror=()=>{i(Promise.reject(`Failed to get image dimensions for: ${e}`))};const s=a.style;s.visibility="hidden",s.position="fixed",s.bottom=s.left="0px",s.width=s.height="auto",document.body.appendChild(a),a.src=e})))(e.documentBaseURI.toAbsolute(t)).then((e=>({width:String(e.width),height:String(e.height)}))):Promise.resolve({width:"",height:""}),He=e=>(t,a,i)=>{var s;return e.editorUpload.blobCache.create({blob:t,blobUri:a,name:null===(s=t.name)||void 0===s?void 0:s.replace(/\.[^\.]+$/,""),filename:t.name,base64:i.split(",")[1]})},Ge=e=>t=>{e.editorUpload.blobCache.add(t)},We=e=>t=>{e.windowManager.alert(t)},$e=e=>t=>pe(e,t),Ve=e=>t=>e.dom.parseStyle(t),Ke=e=>(t,a)=>e.dom.serializeStyle(t,a),Ze=e=>t=>Ae(e).upload([t],!1).then((e=>{var t;return 0===e.length?Promise.reject("Failed to upload image"):!1===e[0].status?Promise.reject(null===(t=e[0].error)||void 0===t?void 0:t.message):e[0]})),qe=e=>{const t={imageSize:Fe(e),addToBlobCache:Ge(e),createBlobCache:He(e),alertErr:We(e),normalizeCss:$e(e),parseStyle:Ve(e),serializeStyle:Ke(e),uploadImage:Ze(e)};return{open:()=>{Ne(e).then((a=>{const i=(e=>({prevImage:xe(e.imageList,e.image.src),prevAlt:e.image.alt,open:!0}))(a);return{title:"Insert/Edit Image",size:"normal",body:Pe(a),buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:Le(a.image),onSubmit:Be(e,a,t),onChange:ke(t,a,i),onClose:ze(i)}})).then(e.windowManager.open)}}},Je=e=>{const t=e.attr("class");return d(t)&&/\bimage\b/.test(t)},Qe=e=>t=>{let a=t.length;const i=t=>{t.attr("contenteditable",e?"true":null)};for(;a--;){const s=t[a];Je(s)&&(s.attr("contenteditable",e?"false":null),De.each(s.getAll("figcaption"),i))}},Xe=e=>t=>{const a=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",a),a(),()=>{e.off("NodeChange",a)}};e.add("image",(e=>{(e=>{const t=e.options.register;t("image_dimensions",{processor:"boolean",default:!0}),t("image_advtab",{processor:"boolean",default:!1}),t("image_uploadtab",{processor:"boolean",default:!0}),t("image_prepend_url",{processor:"string",default:""}),t("image_class_list",{processor:"object[]"}),t("image_description",{processor:"boolean",default:!0}),t("image_title",{processor:"boolean",default:!1}),t("image_caption",{processor:"boolean",default:!1}),t("image_list",{processor:e=>{const t=!1===e||r(e)||((e,t)=>{if(l(e)){for(let a=0,i=e.length;a{e.on("PreInit",(()=>{e.parser.addNodeFilter("figure",Qe(!0)),e.serializer.addNodeFilter("figure",Qe(!1))}))})(e),(e=>{e.ui.registry.addToggleButton("image",{icon:"image",tooltip:"Insert/edit image",onAction:qe(e).open,onSetup:t=>{t.setActive(d(he(e)));const a=e.selection.selectorChangedWithUnbind("img:not([data-mce-object]):not([data-mce-placeholder]),figure.image",t.setActive).unbind,i=Xe(e)(t);return()=>{a(),i()}}}),e.ui.registry.addMenuItem("image",{icon:"image",text:"Image...",onAction:qe(e).open,onSetup:Xe(e)}),e.ui.registry.addContextMenu("image",{update:t=>e.selection.isEditable()&&(re(t)||"IMG"===t.nodeName&&!H(t))?["image"]:[]})})(e),(e=>{e.addCommand("mceImage",qe(e).open),e.addCommand("mceUpdateImage",((t,a)=>{e.undoManager.transact((()=>ye(e,a)))}))})(e)}))}(); \ No newline at end of file diff --git a/static/js/tinymce/plugins/importcss/plugin.min.js b/static/js/tinymce/plugins/importcss/plugin.min.js new file mode 100644 index 0000000..9afd216 --- /dev/null +++ b/static/js/tinymce/plugins/importcss/plugin.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.7.2 (2023-10-25) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(s=r=e,(o=String).prototype.isPrototypeOf(s)||(null===(n=r.constructor)||void 0===n?void 0:n.name)===o.name)?"string":t;var s,r,o,n})(t)===e,s=t("string"),r=t("object"),o=t("array"),n=("function",e=>"function"==typeof e);var c=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),i=tinymce.util.Tools.resolve("tinymce.EditorManager"),l=tinymce.util.Tools.resolve("tinymce.Env"),a=tinymce.util.Tools.resolve("tinymce.util.Tools");const p=e=>t=>t.options.get(e),u=p("importcss_merge_classes"),m=p("importcss_exclusive"),f=p("importcss_selector_converter"),y=p("importcss_selector_filter"),d=p("importcss_groups"),h=p("importcss_append"),_=p("importcss_file_filter"),g=p("skin"),v=p("skin_url"),b=Array.prototype.push,x=/^\.(?:ephox|tiny-pageembed|mce)(?:[.-]+\w+)+$/,T=e=>s(e)?t=>-1!==t.indexOf(e):e instanceof RegExp?t=>e.test(t):e,S=(e,t)=>{let s={};const r=/^(?:([a-z0-9\-_]+))?(\.[a-z0-9_\-\.]+)$/i.exec(t);if(!r)return;const o=r[1],n=r[2].substr(1).split(".").join(" "),c=a.makeMap("a,img");return r[1]?(s={title:t},e.schema.getTextBlockElements()[o]?s.block=o:e.schema.getBlockElements()[o]||c[o.toLowerCase()]?s.selector=o:s.inline=o):r[2]&&(s={inline:"span",title:t.substr(1),classes:n}),u(e)?s.classes=n:s.attributes={class:n},s},k=(e,t)=>null===t||m(e),w=e=>{e.on("init",(()=>{const t=(()=>{const e=[],t=[],s={};return{addItemToGroup:(e,r)=>{s[e]?s[e].push(r):(t.push(e),s[e]=[r])},addItem:t=>{e.push(t)},toFormats:()=>{return(r=t,n=e=>{const t=s[e];return 0===t.length?[]:[{title:e,items:t}]},(e=>{const t=[];for(let s=0,r=e.length;s{const s=e.length,r=new Array(s);for(let o=0;oa.map(e,(e=>a.extend({},e,{original:e,selectors:{},filter:T(e.filter)}))))(d(e)),u=(t,s)=>{if(((e,t,s,r)=>!(k(e,s)?t in r:t in s.selectors))(e,t,s,r)){((e,t,s,r)=>{k(e,s)?r[t]=!0:s.selectors[t]=!0})(e,t,s,r);const o=((e,t,s,r)=>{let o;const n=f(e);return o=r&&r.selector_converter?r.selector_converter:n||(()=>S(e,s)),o.call(t,s,r)})(e,e.plugins.importcss,t,s);if(o){const t=o.name||c.DOM.uniqueId();return e.formatter.register(t,o),{title:o.title,format:t}}}return null};a.each(((e,t,r)=>{const o=[],n={},c=(t,n)=>{let p,u=t.href;if(u=(e=>{const t=l.cacheSuffix;return s(e)&&(e=e.replace("?"+t,"").replace("&"+t,"")),e})(u),u&&(!r||r(u,n))&&!((e,t)=>{const s=g(e);if(s){const r=v(e),o=r?e.documentBaseURI.toAbsolute(r):i.baseURL+"/skins/ui/"+s,n=i.baseURL+"/skins/content/";return t===o+"/content"+(e.inline?".inline":"")+".min.css"||-1!==t.indexOf(n)}return!1})(e,u)){a.each(t.imports,(e=>{c(e,!0)}));try{p=t.cssRules||t.rules}catch(e){}a.each(p,(e=>{e.styleSheet?c(e.styleSheet,!0):e.selectorText&&a.each(e.selectorText.split(","),(e=>{o.push(a.trim(e))}))}))}};a.each(e.contentCSS,(e=>{n[e]=!0})),r||(r=(e,t)=>t||n[e]);try{a.each(t.styleSheets,(e=>{c(e)}))}catch(e){}return o})(e,e.getDoc(),T(_(e))),(e=>{if(!x.test(e)&&(!n||n(e))){const s=((e,t)=>a.grep(e,(e=>!e.filter||e.filter(t))))(p,e);if(s.length>0)a.each(s,(s=>{const r=u(e,s);r&&t.addItemToGroup(s.title,r)}));else{const s=u(e,null);s&&t.addItem(s)}}}));const m=t.toFormats();e.dispatch("addStyleModifications",{items:m,replace:!h(e)})}))};e.add("importcss",(e=>((e=>{const t=e.options.register,o=e=>s(e)||n(e)||r(e);t("importcss_merge_classes",{processor:"boolean",default:!0}),t("importcss_exclusive",{processor:"boolean",default:!0}),t("importcss_selector_converter",{processor:"function"}),t("importcss_selector_filter",{processor:o}),t("importcss_file_filter",{processor:o}),t("importcss_groups",{processor:"object[]"}),t("importcss_append",{processor:"boolean",default:!1})})(e),w(e),(e=>({convertSelectorToFormat:t=>S(e,t)}))(e))))}(); \ No newline at end of file diff --git a/static/js/tinymce/plugins/insertdatetime/plugin.min.js b/static/js/tinymce/plugins/insertdatetime/plugin.min.js new file mode 100644 index 0000000..e0c4d38 --- /dev/null +++ b/static/js/tinymce/plugins/insertdatetime/plugin.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.7.2 (2023-10-25) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>t.options.get(e),a=t("insertdatetime_dateformat"),n=t("insertdatetime_timeformat"),r=t("insertdatetime_formats"),s=t("insertdatetime_element"),i="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),o="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),l="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),m="January February March April May June July August September October November December".split(" "),c=(e,t)=>{if((e=""+e).length(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=t.replace("%D","%m/%d/%Y")).replace("%r","%I:%M:%S %p")).replace("%Y",""+a.getFullYear())).replace("%y",""+a.getYear())).replace("%m",c(a.getMonth()+1,2))).replace("%d",c(a.getDate(),2))).replace("%H",""+c(a.getHours(),2))).replace("%M",""+c(a.getMinutes(),2))).replace("%S",""+c(a.getSeconds(),2))).replace("%I",""+((a.getHours()+11)%12+1))).replace("%p",a.getHours()<12?"AM":"PM")).replace("%B",""+e.translate(m[a.getMonth()]))).replace("%b",""+e.translate(l[a.getMonth()]))).replace("%A",""+e.translate(o[a.getDay()]))).replace("%a",""+e.translate(i[a.getDay()]))).replace("%%","%"),u=(e,t)=>{if(s(e)){const a=d(e,t);let n;n=/%[HMSIp]/.test(t)?d(e,"%Y-%m-%dT%H:%M"):d(e,"%Y-%m-%d");const r=e.dom.getParent(e.selection.getStart(),"time");r?((e,t,a,n)=>{const r=e.dom.create("time",{datetime:a},n);e.dom.replace(r,t),e.selection.select(r,!0),e.selection.collapse(!1)})(e,r,n,a):e.insertContent('")}else e.insertContent(d(e,t))};var p=tinymce.util.Tools.resolve("tinymce.util.Tools");const g=e=>t=>{const a=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",a),a(),()=>{e.off("NodeChange",a)}};e.add("insertdatetime",(e=>{(e=>{const t=e.options.register;t("insertdatetime_dateformat",{processor:"string",default:e.translate("%Y-%m-%d")}),t("insertdatetime_timeformat",{processor:"string",default:e.translate("%H:%M:%S")}),t("insertdatetime_formats",{processor:"string[]",default:["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"]}),t("insertdatetime_element",{processor:"boolean",default:!1})})(e),(e=>{e.addCommand("mceInsertDate",((t,n)=>{u(e,null!=n?n:a(e))})),e.addCommand("mceInsertTime",((t,a)=>{u(e,null!=a?a:n(e))}))})(e),(e=>{const t=r(e),a=(e=>{let t=e;return{get:()=>t,set:e=>{t=e}}})((e=>{const t=r(e);return t.length>0?t[0]:n(e)})(e)),s=t=>e.execCommand("mceInsertDate",!1,t);e.ui.registry.addSplitButton("insertdatetime",{icon:"insert-time",tooltip:"Insert date/time",select:e=>e===a.get(),fetch:a=>{a(p.map(t,(t=>({type:"choiceitem",text:d(e,t),value:t}))))},onAction:e=>{s(a.get())},onItemAction:(e,t)=>{a.set(t),s(t)},onSetup:g(e)});const i=e=>()=>{a.set(e),s(e)};e.ui.registry.addNestedMenuItem("insertdatetime",{icon:"insert-time",text:"Date/time",getSubmenuItems:()=>p.map(t,(t=>({type:"menuitem",text:d(e,t),onAction:i(t)}))),onSetup:g(e)})})(e)}))}(); \ No newline at end of file diff --git a/static/js/tinymce/plugins/link/plugin.min.js b/static/js/tinymce/plugins/link/plugin.min.js new file mode 100644 index 0000000..fa1f873 --- /dev/null +++ b/static/js/tinymce/plugins/link/plugin.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.7.2 (2023-10-25) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=o=e,(r=String).prototype.isPrototypeOf(n)||(null===(l=o.constructor)||void 0===l?void 0:l.name)===r.name)?"string":t;var n,o,r,l})(t)===e,n=e=>t=>typeof t===e,o=t("string"),r=t("object"),l=t("array"),a=(null,e=>null===e);const i=n("boolean"),s=e=>!(e=>null==e)(e),c=n("function"),u=(e,t)=>{if(l(e)){for(let n=0,o=e.length;n{},d=(e,t)=>e===t;class m{constructor(e,t){this.tag=e,this.value=t}static some(e){return new m(!0,e)}static none(){return m.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?m.some(e(this.value)):m.none()}bind(e){return this.tag?e(this.value):m.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:m.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return s(e)?m.some(e):m.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}m.singletonNone=new m(!1);const h=Array.prototype.indexOf,f=Array.prototype.push,p=e=>{const t=[];for(let n=0,o=e.length;n{for(let n=0;ne.exists((e=>n(e,t))),y=e=>{const t=[],n=e=>{t.push(e)};for(let t=0;te?m.some(t):m.none(),b=e=>t=>t.options.get(e),_=b("link_assume_external_targets"),w=b("link_context_toolbar"),C=b("link_list"),O=b("link_default_target"),N=b("link_default_protocol"),A=b("link_target_list"),S=b("link_rel_list"),E=b("link_class_list"),T=b("link_title"),R=b("allow_unsafe_link_target"),P=b("link_quicklink");var L=tinymce.util.Tools.resolve("tinymce.util.Tools");const M=e=>o(e.value)?e.value:"",D=(e,t)=>{const n=[];return L.each(e,(e=>{const r=(e=>o(e.text)?e.text:o(e.title)?e.title:"")(e);if(void 0!==e.menu){const o=D(e.menu,t);n.push({text:r,items:o})}else{const o=t(e);n.push({text:r,value:o})}})),n},B=(e=M)=>t=>m.from(t).map((t=>D(t,e))),I=e=>B(M)(e),j=B,K=(e,t)=>n=>({name:e,type:"listbox",label:t,items:n}),U=M,q=Object.keys,F=Object.hasOwnProperty,V=(e,t)=>F.call(e,t);var $=tinymce.util.Tools.resolve("tinymce.dom.TreeWalker"),z=tinymce.util.Tools.resolve("tinymce.util.URI");const G=e=>s(e)&&"a"===e.nodeName.toLowerCase(),H=e=>G(e)&&!!Q(e),J=(e,t)=>{if(e.collapsed)return[];{const n=e.cloneContents(),o=n.firstChild,r=new $(o,n),l=[];let a=o;do{t(a)&&l.push(a)}while(a=r.next());return l}},W=e=>/^\w+:/i.test(e),Q=e=>{var t,n;return null!==(n=null!==(t=e.getAttribute("data-mce-href"))&&void 0!==t?t:e.getAttribute("href"))&&void 0!==n?n:""},X=(e,t)=>{const n=["noopener"],o=e?e.split(/\s+/):[],r=e=>e.filter((e=>-1===L.inArray(n,e))),l=t?(e=>(e=r(e)).length>0?e.concat(n):n)(o):r(o);return l.length>0?(e=>L.trim(e.sort().join(" ")))(l):""},Y=(e,t)=>(t=t||te(e.selection.getRng())[0]||e.selection.getNode(),le(t)?m.from(e.dom.select("a[href]",t)[0]):m.from(e.dom.getParent(t,"a[href]"))),Z=(e,t)=>Y(e,t).isSome(),ee=(e,t)=>t.fold((()=>e.getContent({format:"text"})),(e=>e.innerText||e.textContent||"")).replace(/\uFEFF/g,""),te=e=>J(e,H),ne=e=>L.grep(e,H),oe=e=>ne(e).length>0,re=e=>{const t=e.schema.getTextInlineElements();if(Y(e).exists((e=>e.hasAttribute("data-mce-block"))))return!1;const n=e.selection.getRng();return!!n.collapsed||0===J(n,(e=>1===e.nodeType&&!G(e)&&!V(t,e.nodeName.toLowerCase()))).length},le=e=>s(e)&&"FIGURE"===e.nodeName&&/\bimage\b/i.test(e.className),ae=(e,t,n)=>{const o=e.selection.getNode(),r=Y(e,o),l=((e,t)=>{const n={...t};if(0===S(e).length&&!R(e)){const e=X(n.rel,"_blank"===n.target);n.rel=e||null}return m.from(n.target).isNone()&&!1===A(e)&&(n.target=O(e)),n.href=((e,t)=>"http"!==t&&"https"!==t||W(e)?e:t+"://"+e)(n.href,_(e)),n})(e,(e=>{return t=["title","rel","class","target"],n=(t,n)=>(e[n].each((e=>{t[n]=e.length>0?e:null})),t),o={href:e.href},((e,t)=>{for(let n=0,o=e.length;n{o=n(o,e)})),o;var t,n,o})(n));e.undoManager.transact((()=>{n.href===t.href&&t.attach(),r.fold((()=>{((e,t,n,o)=>{const r=e.dom;le(t)?ge(r,t,o):n.fold((()=>{e.execCommand("mceInsertLink",!1,o)}),(t=>{e.insertContent(r.createHTML("a",o,r.encode(t)))}))})(e,o,n.text,l)}),(t=>{e.focus(),((e,t,n,o)=>{n.each((e=>{V(t,"innerText")?t.innerText=e:t.textContent=e})),e.dom.setAttribs(t,o),e.selection.select(t)})(e,t,n.text,l)}))}))},ie=e=>{const{class:t,href:n,rel:o,target:r,text:l,title:i}=e;return((e,t)=>{const n={};var o;return((e,t,n,o)=>{((e,t)=>{const n=q(e);for(let o=0,r=n.length;o{(t(e,r)?n:o)(e,r)}))})(e,((e,t)=>!1===a(e)),(o=n,(e,t)=>{o[t]=e}),g),n})({class:t.getOrNull(),href:n,rel:o.getOrNull(),target:r.getOrNull(),text:l.getOrNull(),title:i.getOrNull()})},se=(e,t,n)=>{const o=((e,t)=>{const n=e.options.get,o={allow_html_data_urls:n("allow_html_data_urls"),allow_script_urls:n("allow_script_urls"),allow_svg_data_urls:n("allow_svg_data_urls")},r=t.href;return{...t,href:z.isDomSafe(r,"a",o)?r:""}})(e,n);e.hasPlugin("rtc",!0)?e.execCommand("createlink",!1,ie(o)):ae(e,t,o)},ce=e=>{e.hasPlugin("rtc",!0)?e.execCommand("unlink"):(e=>{e.undoManager.transact((()=>{const t=e.selection.getNode();le(t)?ue(e,t):(e=>{const t=e.dom,n=e.selection,o=n.getBookmark(),r=n.getRng().cloneRange(),l=t.getParent(r.startContainer,"a[href]",e.getBody()),a=t.getParent(r.endContainer,"a[href]",e.getBody());l&&r.setStartBefore(l),a&&r.setEndAfter(a),n.setRng(r),e.execCommand("unlink"),n.moveToBookmark(o)})(e),e.focus()}))})(e)},ue=(e,t)=>{var n;const o=e.dom.select("img",t)[0];if(o){const r=e.dom.getParents(o,"a[href]",t)[0];r&&(null===(n=r.parentNode)||void 0===n||n.insertBefore(o,r),e.dom.remove(r))}},ge=(e,t,n)=>{var o;const r=e.select("img",t)[0];if(r){const t=e.create("a",n);null===(o=r.parentNode)||void 0===o||o.insertBefore(t,r),t.appendChild(r)}},de=(e,t)=>k(t,(t=>(e=>{return V(t=e,n="items")&&void 0!==t[n]&&null!==t[n];var t,n})(t)?de(e,t.items):x(t.value===e,t))),me=(e,t)=>{const n={text:e.text,title:e.title},o=(e,o)=>{const r=(l=t,a=o,"link"===a?l.link:"anchor"===a?l.anchor:m.none()).getOr([]);var l,a;return((e,t,n,o)=>{const r=o[t],l=e.length>0;return void 0!==r?de(r,n).map((t=>({url:{value:t.value,meta:{text:l?e:t.text,attach:g}},text:l?e:t.text}))):m.none()})(n.text,o,r,e)};return{onChange:(e,t)=>{const r=t.name;return"url"===r?(e=>{const t=(o=e.url,x(n.text.length<=0,m.from(null===(r=o.meta)||void 0===r?void 0:r.text).getOr(o.value)));var o,r;const l=(e=>{var t;return x(n.title.length<=0,m.from(null===(t=e.meta)||void 0===t?void 0:t.title).getOr(""))})(e.url);return t.isSome()||l.isSome()?m.some({...t.map((e=>({text:e}))).getOr({}),...l.map((e=>({title:e}))).getOr({})}):m.none()})(e()):((e,t)=>h.call(e,t))(["anchor","link"],r)>-1?o(e(),r):"text"===r||"title"===r?(n[r]=e()[r],m.none()):m.none()}}};var he=tinymce.util.Tools.resolve("tinymce.util.Delay");const fe=e=>{const t=e.href;return t.indexOf("@")>0&&-1===t.indexOf("/")&&-1===t.indexOf("mailto:")?m.some({message:"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",preprocess:e=>({...e,href:"mailto:"+t})}):m.none()},pe=(e,t)=>n=>{const o=n.href;return 1===e&&!W(o)||0===e&&/^\s*www(\.|\d\.)/i.test(o)?m.some({message:`The URL you entered seems to be an external link. Do you want to add the required ${t}:// prefix?`,preprocess:e=>({...e,href:t+"://"+o})}):m.none()},ke=e=>{const t=e.dom.select("a:not([href])"),n=p(((e,t)=>{const n=e.length,o=new Array(n);for(let r=0;r{const t=e.name||e.id;return t?[{text:t,value:"#"+t}]:[]})));return n.length>0?m.some([{text:"None",value:""}].concat(n)):m.none()},ve=e=>{const t=E(e);return t.length>0?I(t):m.none()},ye=e=>{try{return m.some(JSON.parse(e))}catch(e){return m.none()}},xe=(e,t)=>{const n=S(e);if(n.length>0){const o=v(t,"_blank"),r=e=>X(U(e),o);return(!1===R(e)?j(r):I)(n)}return m.none()},be=[{text:"Current window",value:""},{text:"New window",value:"_blank"}],_e=e=>{const t=A(e);return l(t)?I(t).orThunk((()=>m.some(be))):!1===t?m.none():m.some(be)},we=(e,t,n)=>{const o=e.getAttrib(t,n);return null!==o&&o.length>0?m.some(o):m.none()},Ce=(e,t)=>(e=>{const t=t=>e.convertURL(t.value||t.url||"","href"),n=C(e);return new Promise((e=>{o(n)?fetch(n).then((e=>e.ok?e.text().then(ye):Promise.reject())).then(e,(()=>e(m.none()))):c(n)?n((t=>e(m.some(t)))):e(m.from(n))})).then((e=>e.bind(j(t)).map((e=>e.length>0?[{text:"None",value:""}].concat(e):e))))})(e).then((n=>{const o=((e,t)=>{const n=e.dom,o=re(e)?m.some(ee(e.selection,t)):m.none(),r=t.bind((e=>m.from(n.getAttrib(e,"href")))),l=t.bind((e=>m.from(n.getAttrib(e,"target")))),a=t.bind((e=>we(n,e,"rel"))),i=t.bind((e=>we(n,e,"class")));return{url:r,text:o,title:t.bind((e=>we(n,e,"title"))),target:l,rel:a,linkClass:i}})(e,t);return{anchor:o,catalogs:{targets:_e(e),rels:xe(e,o.target),classes:ve(e),anchor:ke(e),link:n},optNode:t,flags:{titleEnabled:T(e)}}})),Oe=e=>{const t=(e=>{const t=Y(e);return Ce(e,t)})(e);t.then((t=>{const n=((e,t)=>n=>{const o=n.getData();if(!o.url.value)return ce(e),void n.close();const r=e=>m.from(o[e]).filter((n=>!v(t.anchor[e],n))),l={href:o.url.value,text:r("text"),target:r("target"),rel:r("rel"),class:r("linkClass"),title:r("title")},a={href:o.url.value,attach:void 0!==o.url.meta&&o.url.meta.attach?o.url.meta.attach:g};((e,t)=>k([fe,pe(_(e),N(e))],(e=>e(t))).fold((()=>Promise.resolve(t)),(n=>new Promise((o=>{((e,t,n)=>{const o=e.selection.getRng();he.setEditorTimeout(e,(()=>{e.windowManager.confirm(t,(t=>{e.selection.setRng(o),n(t)}))}))})(e,n.message,(e=>{o(e?n.preprocess(t):t)}))})))))(e,l).then((t=>{se(e,a,t)})),n.close()})(e,t);return((e,t,n)=>{const o=e.anchor.text.map((()=>({name:"text",type:"input",label:"Text to display"}))).toArray(),r=e.flags.titleEnabled?[{name:"title",type:"input",label:"Title"}]:[],l=((e,t)=>{const n=e.anchor,o=n.url.getOr("");return{url:{value:o,meta:{original:{value:o}}},text:n.text.getOr(""),title:n.title.getOr(""),anchor:o,link:o,rel:n.rel.getOr(""),target:n.target.or(t).getOr(""),linkClass:n.linkClass.getOr("")}})(e,m.from(O(n))),a=e.catalogs,i=me(l,a);return{title:"Insert/Edit Link",size:"normal",body:{type:"panel",items:p([[{name:"url",type:"urlinput",filetype:"file",label:"URL"}],o,r,y([a.anchor.map(K("anchor","Anchors")),a.rels.map(K("rel","Rel")),a.targets.map(K("target","Open link in...")),a.link.map(K("link","Link list")),a.classes.map(K("linkClass","Class"))])])},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:l,onChange:(e,{name:t})=>{i.onChange(e.getData,{name:t}).each((t=>{e.setData(t)}))},onSubmit:t}})(t,n,e)})).then((t=>{e.windowManager.open(t)}))};var Ne=tinymce.util.Tools.resolve("tinymce.util.VK");const Ae=(e,t)=>e.dom.getParent(t,"a[href]"),Se=e=>Ae(e,e.selection.getStart()),Ee=(e,t)=>{if(t){const n=Q(t);if(/^#/.test(n)){const t=e.dom.select(n);t.length&&e.selection.scrollIntoView(t[0],!0)}else(e=>{const t=document.createElement("a");t.target="_blank",t.href=e,t.rel="noreferrer noopener";const n=document.createEvent("MouseEvents");n.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),((e,t)=>{document.body.appendChild(e),e.dispatchEvent(t),document.body.removeChild(e)})(t,n)})(t.href)}},Te=e=>()=>{e.execCommand("mceLink",!1,{dialog:!0})},Re=e=>()=>{Ee(e,Se(e))},Pe=(e,t)=>(e.on("NodeChange",t),()=>e.off("NodeChange",t)),Le=e=>t=>{const n=()=>{t.setActive(!e.mode.isReadOnly()&&Z(e,e.selection.getNode())),t.setEnabled(e.selection.isEditable())};return n(),Pe(e,n)},Me=e=>t=>{const n=()=>{t.setEnabled(e.selection.isEditable())};return n(),Pe(e,n)},De=e=>t=>{const n=()=>t.setEnabled((e=>1===(e.selection.isCollapsed()?ne(e.dom.getParents(e.selection.getStart())):te(e.selection.getRng())).length)(e));return n(),Pe(e,n)},Be=e=>t=>{const n=e.dom.getParents(e.selection.getStart()),o=n=>{t.setEnabled((t=>{return oe(t)||(n=e.selection.getRng(),te(n).length>0);var n})(n)&&e.selection.isEditable())};return o(n),Pe(e,(e=>o(e.parents)))};e.add("link",(e=>{(e=>{const t=e.options.register;t("link_assume_external_targets",{processor:e=>{const t=o(e)||i(e);return t?!0===e?{value:1,valid:t}:"http"===e||"https"===e?{value:e,valid:t}:{value:0,valid:t}:{valid:!1,message:"Must be a string or a boolean."}},default:!1}),t("link_context_toolbar",{processor:"boolean",default:!1}),t("link_list",{processor:e=>o(e)||c(e)||u(e,r)}),t("link_default_target",{processor:"string"}),t("link_default_protocol",{processor:"string",default:"https"}),t("link_target_list",{processor:e=>i(e)||u(e,r),default:!0}),t("link_rel_list",{processor:"object[]",default:[]}),t("link_class_list",{processor:"object[]",default:[]}),t("link_title",{processor:"boolean",default:!0}),t("allow_unsafe_link_target",{processor:"boolean",default:!1}),t("link_quicklink",{processor:"boolean",default:!1})})(e),(e=>{e.ui.registry.addToggleButton("link",{icon:"link",tooltip:"Insert/edit link",onAction:Te(e),onSetup:Le(e)}),e.ui.registry.addButton("openlink",{icon:"new-tab",tooltip:"Open link",onAction:Re(e),onSetup:De(e)}),e.ui.registry.addButton("unlink",{icon:"unlink",tooltip:"Remove link",onAction:()=>ce(e),onSetup:Be(e)})})(e),(e=>{e.ui.registry.addMenuItem("openlink",{text:"Open link",icon:"new-tab",onAction:Re(e),onSetup:De(e)}),e.ui.registry.addMenuItem("link",{icon:"link",text:"Link...",shortcut:"Meta+K",onSetup:Me(e),onAction:Te(e)}),e.ui.registry.addMenuItem("unlink",{icon:"unlink",text:"Remove link",onAction:()=>ce(e),onSetup:Be(e)})})(e),(e=>{e.ui.registry.addContextMenu("link",{update:t=>e.dom.isEditable(t)?oe(e.dom.getParents(t,"a"))?"link unlink openlink":"link":""})})(e),(e=>{const t=t=>{const n=e.selection.getNode();return t.setEnabled(Z(e,n)),g};e.ui.registry.addContextForm("quicklink",{launch:{type:"contextformtogglebutton",icon:"link",tooltip:"Link",onSetup:Le(e)},label:"Link",predicate:t=>w(e)&&Z(e,t),initValue:()=>Y(e).fold((()=>""),Q),commands:[{type:"contextformtogglebutton",icon:"link",tooltip:"Link",primary:!0,onSetup:t=>{const n=e.selection.getNode();return t.setActive(Z(e,n)),Le(e)(t)},onAction:t=>{const n=t.getValue(),o=(t=>{const n=Y(e),o=re(e);if(n.isNone()&&o){const o=ee(e.selection,n);return x(0===o.length,t)}return m.none()})(n);se(e,{href:n,attach:g},{href:n,text:o,title:m.none(),rel:m.none(),target:m.none(),class:m.none()}),(e=>{e.selection.collapse(!1)})(e),t.hide()}},{type:"contextformbutton",icon:"unlink",tooltip:"Remove link",onSetup:t,onAction:t=>{ce(e),t.hide()}},{type:"contextformbutton",icon:"new-tab",tooltip:"Open link",onSetup:t,onAction:t=>{Re(e)(),t.hide()}}]})})(e),(e=>{e.on("click",(t=>{const n=Ae(e,t.target);n&&Ne.metaKeyPressed(t)&&(t.preventDefault(),Ee(e,n))})),e.on("keydown",(t=>{if(!t.isDefaultPrevented()&&13===t.keyCode&&(e=>!0===e.altKey&&!1===e.shiftKey&&!1===e.ctrlKey&&!1===e.metaKey)(t)){const n=Se(e);n&&(t.preventDefault(),Ee(e,n))}}))})(e),(e=>{e.addCommand("mceLink",((t,n)=>{!0!==(null==n?void 0:n.dialog)&&P(e)?e.dispatch("contexttoolbar-show",{toolbarKey:"quicklink"}):Oe(e)}))})(e),(e=>{e.addShortcut("Meta+K","",(()=>{e.execCommand("mceLink")}))})(e)}))}(); \ No newline at end of file diff --git a/static/js/tinymce/plugins/lists/plugin.min.js b/static/js/tinymce/plugins/lists/plugin.min.js new file mode 100644 index 0000000..e72e133 --- /dev/null +++ b/static/js/tinymce/plugins/lists/plugin.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.7.2 (2023-10-25) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=o=e,(r=String).prototype.isPrototypeOf(n)||(null===(s=o.constructor)||void 0===s?void 0:s.name)===r.name)?"string":t;var n,o,r,s})(t)===e,n=e=>t=>typeof t===e,o=t("string"),r=t("object"),s=t("array"),i=n("boolean"),l=e=>!(e=>null==e)(e),a=n("function"),d=n("number"),c=()=>{},m=(e,t)=>e===t,u=e=>t=>!e(t),p=(!1,()=>false);class g{constructor(e,t){this.tag=e,this.value=t}static some(e){return new g(!0,e)}static none(){return g.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?g.some(e(this.value)):g.none()}bind(e){return this.tag?e(this.value):g.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:g.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return l(e)?g.some(e):g.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}g.singletonNone=new g(!1);const h=Array.prototype.slice,f=Array.prototype.indexOf,y=Array.prototype.push,v=(e,t)=>{return n=e,o=t,f.call(n,o)>-1;var n,o},C=(e,t)=>{for(let n=0,o=e.length;n{const n=e.length,o=new Array(n);for(let r=0;r{for(let n=0,o=e.length;n{const n=[];for(let o=0,r=e.length;o(S(e,((e,o)=>{n=t(n,e,o)})),n),O=(e,t,n)=>{for(let o=0,r=e.length;oO(e,t,p),x=(e,t)=>(e=>{const t=[];for(let n=0,o=e.length;n{const t=h.call(e,0);return t.reverse(),t},T=(e,t)=>t>=0&&tT(e,0),w=e=>T(e,e.length-1),D=(e,t)=>{const n=[],o=a(t)?e=>C(n,(n=>t(n,e))):e=>v(n,e);for(let t=0,r=e.length;te.exists((e=>n(e,t))),I=(e,t,n)=>e.isSome()&&t.isSome()?g.some(n(e.getOrDie(),t.getOrDie())):g.none(),P=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},M=(e,t)=>{const n=(t||document).createElement("div");if(n.innerHTML=e,!n.hasChildNodes()||n.childNodes.length>1){const t="HTML does not have a single root node";throw console.error(t,e),new Error(t)}return P(n.childNodes[0])},R=(e,t)=>{const n=(t||document).createElement(e);return P(n)},U=P,$=(e,t)=>e.dom===t.dom;"undefined"!=typeof window?window:Function("return this;")();const _=e=>e.dom.nodeName.toLowerCase(),H=e=>e.dom.nodeType,V=(1,e=>1===H(e));const F=e=>t=>V(t)&&_(t)===e,j=e=>g.from(e.dom.parentNode).map(U),K=e=>b(e.dom.childNodes,U),z=(e,t)=>{const n=e.dom.childNodes;return g.from(n[t]).map(U)},Q=e=>z(e,0),W=e=>z(e,e.dom.childNodes.length-1),q=(e,t,n)=>{let o=e.dom;const r=a(n)?n:p;for(;o.parentNode;){o=o.parentNode;const e=U(o);if(t(e))return g.some(e);if(r(e))break}return g.none()},Z=(e,t,n)=>((e,t,n,o,r)=>o(n)?g.some(n):a(r)&&r(n)?g.none():t(n,o,r))(0,q,e,t,n),G=(e,t)=>{j(e).each((n=>{n.dom.insertBefore(t.dom,e.dom)}))},J=(e,t)=>{e.dom.appendChild(t.dom)},X=(e,t)=>{S(t,(t=>{J(e,t)}))},Y=e=>{e.dom.textContent="",S(K(e),(e=>{ee(e)}))},ee=e=>{const t=e.dom;null!==t.parentNode&&t.parentNode.removeChild(t)};var te=tinymce.util.Tools.resolve("tinymce.dom.RangeUtils"),ne=tinymce.util.Tools.resolve("tinymce.dom.TreeWalker"),oe=tinymce.util.Tools.resolve("tinymce.util.VK");const re=e=>b(e,U),se=Object.keys,ie=(e,t)=>{const n=se(e);for(let o=0,r=n.length;o{const n=e.dom;ie(t,((e,t)=>{((e,t,n)=>{if(!(o(n)||i(n)||d(n)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",n,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,n+"")})(n,t,e)}))},ae=e=>L(e.dom.attributes,((e,t)=>(e[t.name]=t.value,e)),{}),de=e=>((e,t)=>U(e.dom.cloneNode(!0)))(e),ce=(e,t)=>{const n=((e,t)=>{const n=R(t),o=ae(e);return le(n,o),n})(e,t);var o,r;r=n,(e=>g.from(e.dom.nextSibling).map(U))(o=e).fold((()=>{j(o).each((e=>{J(e,r)}))}),(e=>{G(e,r)}));const s=K(e);return X(n,s),ee(e),n};var me=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),ue=tinymce.util.Tools.resolve("tinymce.util.Tools");const pe=e=>t=>l(t)&&t.nodeName.toLowerCase()===e,ge=e=>t=>l(t)&&e.test(t.nodeName),he=e=>l(e)&&3===e.nodeType,fe=e=>l(e)&&1===e.nodeType,ye=ge(/^(OL|UL|DL)$/),ve=ge(/^(OL|UL)$/),Ce=pe("ol"),be=ge(/^(LI|DT|DD)$/),Se=ge(/^(DT|DD)$/),Ne=ge(/^(TH|TD)$/),Le=pe("br"),Oe=(e,t)=>l(t)&&t.nodeName in e.schema.getTextBlockElements(),Ae=(e,t)=>l(e)&&e.nodeName in t,xe=(e,t)=>l(t)&&t.nodeName in e.schema.getVoidElements(),ke=(e,t,n)=>{const o=e.isEmpty(t);return!(n&&e.select("span[data-mce-type=bookmark]",t).length>0)&&o},Te=(e,t)=>e.isChildOf(t,e.getRoot()),Ee=e=>t=>t.options.get(e),we=Ee("lists_indent_on_tab"),De=Ee("forced_root_block"),Be=Ee("forced_root_block_attrs"),Ie=(e,t)=>{const n=e.dom,o=e.schema.getBlockElements(),r=n.createFragment(),s=De(e),i=Be(e);let l,a,d=!1;for(a=n.create(s,i),Ae(t.firstChild,o)||r.appendChild(a);l=t.firstChild;){const e=l.nodeName;d||"SPAN"===e&&"bookmark"===l.getAttribute("data-mce-type")||(d=!0),Ae(l,o)?(r.appendChild(l),a=null):(a||(a=n.create(s,i),r.appendChild(a)),a.appendChild(l))}return!d&&a&&a.appendChild(n.create("br",{"data-mce-bogus":"1"})),r},Pe=me.DOM,Me=F("dd"),Re=F("dt"),Ue=(e,t)=>{var n;Me(t)?ce(t,"dt"):Re(t)&&(n=t,g.from(n.dom.parentElement).map(U)).each((n=>((e,t,n)=>{const o=Pe.select('span[data-mce-type="bookmark"]',t),r=Ie(e,n),s=Pe.createRng();s.setStartAfter(n),s.setEndAfter(t);const i=s.extractContents();for(let t=i.firstChild;t;t=t.firstChild)if("LI"===t.nodeName&&e.dom.isEmpty(t)){Pe.remove(t);break}e.dom.isEmpty(i)||Pe.insertAfter(i,t),Pe.insertAfter(r,t);const l=n.parentElement;l&&ke(e.dom,l)&&(e=>{const t=e.parentNode;t&&ue.each(o,(e=>{t.insertBefore(e,n.parentNode)})),Pe.remove(e)})(l),Pe.remove(n),ke(e.dom,t)&&Pe.remove(t)})(e,n.dom,t.dom)))},$e=e=>{Re(e)&&ce(e,"dd")},_e=(e,t)=>{if(he(e))return{container:e,offset:t};const n=te.getNode(e,t);return he(n)?{container:n,offset:t>=e.childNodes.length?n.data.length:0}:n.previousSibling&&he(n.previousSibling)?{container:n.previousSibling,offset:n.previousSibling.data.length}:n.nextSibling&&he(n.nextSibling)?{container:n.nextSibling,offset:0}:{container:e,offset:t}},He=e=>{const t=e.cloneRange(),n=_e(e.startContainer,e.startOffset);t.setStart(n.container,n.offset);const o=_e(e.endContainer,e.endOffset);return t.setEnd(o.container,o.offset),t},Ve=["OL","UL","DL"],Fe=Ve.join(","),je=(e,t)=>{const n=t||e.selection.getStart(!0);return e.dom.getParent(n,Fe,Qe(e,n))},Ke=e=>{const t=e.selection.getSelectedBlocks();return N(((e,t)=>{const n=ue.map(t,(t=>e.dom.getParent(t,"li,dd,dt",Qe(e,t))||t));return D(n)})(e,t),be)},ze=(e,t)=>{const n=e.dom.getParents(t,"TD,TH");return n.length>0?n[0]:e.getBody()},Qe=(e,t)=>{const n=e.dom.getParents(t,e.dom.isBlock),o=A(n,(t=>{return n=e.schema,!ye(o=t)&&!be(o)&&C(Ve,(e=>n.isValidChild(o.nodeName,e)));var n,o}));return o.getOr(e.getBody())},We=(e,t)=>{const n=e.dom.getParents(t,"ol,ul",Qe(e,t));return w(n)},qe=(e,t)=>{const n=b(t,(t=>We(e,t).getOr(t)));return D(n)},Ze=e=>/\btox\-/.test(e.className),Ge=(e,t)=>O(e,ye,Ne).exists((e=>e.nodeName===t&&!Ze(e))),Je=(e,t)=>null!==t&&!e.dom.isEditable(t),Xe=(e,t)=>{const n=e.dom.getParent(t,"ol,ul,dl");return Je(e,n)},Ye=(e,t)=>{const n=e.selection.getNode();return t({parents:e.dom.getParents(n),element:n}),e.on("NodeChange",t),()=>e.off("NodeChange",t)},et=(e,t)=>{const n=(t||document).createDocumentFragment();return S(e,(e=>{n.appendChild(e.dom)})),U(n)},tt=(e,t,n)=>e.dispatch("ListMutation",{action:t,element:n}),nt=(ot=/^\s+|\s+$/g,e=>e.replace(ot,""));var ot;const rt=(e,t,n)=>{((e,t,n)=>{if(!o(n))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",n,":: Element ",e),new Error("CSS value must be a string: "+n);(e=>void 0!==e.style&&a(e.style.getPropertyValue))(e)&&e.style.setProperty(t,n)})(e.dom,t,n)},st=e=>((e,t)=>{const n=e.dom;if(1!==n.nodeType)return!1;{const e=n;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}})(e,"OL,UL"),it=e=>Q(e).exists(st),lt=e=>"listAttributes"in e,at=e=>"isComment"in e,dt=e=>e.depth>0,ct=e=>e.isSelected,mt=e=>{const t=K(e),n=W(e).exists(st)?t.slice(0,-1):t;return b(n,de)},ut=(e,t)=>{J(e.item,t.list)},pt=(e,t)=>{const n={list:R(t,e),item:R("li",e)};return J(n.list,n.item),n},gt=(e,t,n)=>{const o=t.slice(0,n.depth);return w(o).each((t=>{if(lt(n)){const o=((e,t,n)=>{const o=R("li",e);return le(o,t),X(o,n),o})(e,n.itemAttributes,n.content);((e,t)=>{J(e.list,t),e.item=t})(t,o),((e,t)=>{_(e.list)!==t.listType&&(e.list=ce(e.list,t.listType)),le(e.list,t.listAttributes)})(t,n)}else if((e=>"isInPreviousLi"in e)(n)){if(n.isInPreviousLi){const o=((e,t,n,o)=>{const r=R(o,e);return le(r,t),X(r,n),r})(e,n.attributes,n.content,n.type);J(t.item,o)}}else{const e=M(`\x3c!--${n.content}--\x3e`);J(t.list,e)}})),o},ht=(e,t)=>{let n=g.none();const o=L(t,((t,o,r)=>lt(o)?o.depth>t.length?((e,t,n)=>{const o=((e,t,n)=>{const o=[];for(let r=0;r{for(let t=1;t{for(let t=0;t{le(e.list,t.listAttributes),le(e.item,t.itemAttributes),X(e.item,t.content)}))})(o,n),r=o,I(w(t),E(r),ut),t.concat(o)})(e,t,o):gt(e,t,o):0===r&&at(o)?(n=g.some(o),t):gt(e,t,o)),[]);return n.each((e=>{const t=M(`\x3c!--${e.content}--\x3e`);E(o).each((e=>{((e,t)=>{Q(e).fold((()=>{J(e,t)}),(n=>{e.dom.insertBefore(t.dom,n.dom)}))})(e.list,t)}))})),E(o).map((e=>e.list))},ft=e=>(S(e,((t,n)=>{((e,t)=>{const n=e[t].depth,o=e=>e.depth===n&&!e.dirty,r=e=>e.depthO(e.slice(t+1),o,r)))})(e,n).fold((()=>{t.dirty&<(t)&&(e=>{e.listAttributes=((e,t)=>{const n={};var o;return((e,t,n,o)=>{ie(e,((e,r)=>{(t(e,r)?n:o)(e,r)}))})(e,t,(o=n,(e,t)=>{o[t]=e}),c),n})(e.listAttributes,((e,t)=>"start"!==t))})(t)}),(e=>{return o=e,void(lt(n=t)&<(o)&&(n.listType=o.listType,n.listAttributes={...o.listAttributes}));var n,o}))})),e),yt=(e,t,n,o)=>{var r,s;if(8===H(s=o)||"#comment"===_(s))return[{depth:e+1,content:null!==(r=o.dom.nodeValue)&&void 0!==r?r:"",dirty:!1,isSelected:!1,isComment:!0}];t.each((e=>{$(e.start,o)&&n.set(!0)}));const i=((e,t,n)=>j(e).filter(V).map((o=>({depth:t,dirty:!1,isSelected:n,content:mt(e),itemAttributes:ae(e),listAttributes:ae(o),listType:_(o),isInPreviousLi:!1}))))(o,e,n.get());t.each((e=>{$(e.end,o)&&n.set(!1)}));const l=W(o).filter(st).map((o=>Ct(e,t,n,o))).getOr([]);return i.toArray().concat(l)},vt=(e,t,n,o)=>Q(o).filter(st).fold((()=>yt(e,t,n,o)),(r=>{const s=L(K(o),((o,r,s)=>{if(0===s)return o;{const s=yt(e,t,n,r).map((e=>((e,t,n)=>lt(e)?{depth:e.depth,dirty:e.dirty,content:e.content,isSelected:e.isSelected,type:t,attributes:e.itemAttributes,isInPreviousLi:!0}:e)(e,r.dom.nodeName.toLowerCase())));return o.concat(s)}}),[]);return Ct(e,t,n,r).concat(s)})),Ct=(e,t,n,o)=>x(K(o),(o=>(st(o)?Ct:vt)(e+1,t,n,o))),bt=(e,t,n)=>{const o=((e,t)=>{const n=(e=>{let t=!1;return{get:()=>t,set:e=>{t=e}}})();return b(e,(e=>({sourceList:e,entries:Ct(0,t,n,e)})))})(t,(e=>{const t=b(Ke(e),U);return I(A(t,u(it)),A(k(t),u(it)),((e,t)=>({start:e,end:t})))})(e));S(o,(t=>{((e,t)=>{S(N(e,ct),(e=>((e,t)=>{switch(e){case"Indent":t.depth++;break;case"Outdent":t.depth--;break;case"Flatten":t.depth=0}t.dirty=!0})(t,e)))})(t.entries,n);const o=((e,t)=>x(((e,t)=>{if(0===e.length)return[];{let n=t(e[0]);const o=[];let r=[];for(let s=0,i=e.length;sE(t).exists(dt)?((e,t)=>{const n=ft(t);return ht(e.contentDocument,n).toArray()})(e,t):((e,t)=>{const n=ft(t);return b(n,(t=>{const n=at(t)?et([M(`\x3c!--${t.content}--\x3e`)]):et(t.content);return U(Ie(e,n.dom))}))})(e,t))))(e,t.entries);var r;S(o,(t=>{tt(e,"Indent"===n?"IndentList":"OutdentList",t.dom)})),r=t.sourceList,S(o,(e=>{G(r,e)})),ee(t.sourceList)}))},St=(e,t)=>{const n=re((e=>{const t=(e=>{const t=We(e,e.selection.getStart()),n=N(e.selection.getSelectedBlocks(),ve);return t.toArray().concat(n)})(e),n=(e=>{const t=e.selection.getStart();return e.dom.getParents(t,"ol,ul",Qe(e,t))})(e);return A(n,(e=>{return t=U(e),j(t).exists((e=>be(e.dom)&&Q(e).exists((e=>!ye(e.dom)))&&W(e).exists((e=>!ye(e.dom)))));var t})).fold((()=>qe(e,t)),(e=>[e]))})(e)),o=re((e=>N(Ke(e),Se))(e));let r=!1;if(n.length||o.length){const s=e.selection.getBookmark();bt(e,n,t),((e,t,n)=>{S(n,"Indent"===t?$e:t=>Ue(e,t))})(e,t,o),e.selection.moveToBookmark(s),e.selection.setRng(He(e.selection.getRng())),e.nodeChanged(),r=!0}return r},Nt=(e,t)=>!(e=>{const t=je(e);return Je(e,t)})(e)&&St(e,t),Lt=e=>Nt(e,"Indent"),Ot=e=>Nt(e,"Outdent"),At=e=>Nt(e,"Flatten"),xt=e=>"\ufeff"===e;var kt=tinymce.util.Tools.resolve("tinymce.dom.BookmarkManager");const Tt=me.DOM,Et=e=>{const t={},n=n=>{let o=e[n?"startContainer":"endContainer"],r=e[n?"startOffset":"endOffset"];if(fe(o)){const e=Tt.create("span",{"data-mce-type":"bookmark"});o.hasChildNodes()?(r=Math.min(r,o.childNodes.length-1),n?o.insertBefore(e,o.childNodes[r]):Tt.insertAfter(e,o.childNodes[r])):o.appendChild(e),o=e,r=0}t[n?"startContainer":"endContainer"]=o,t[n?"startOffset":"endOffset"]=r};return n(!0),e.collapsed||n(),t},wt=e=>{const t=t=>{let n=e[t?"startContainer":"endContainer"],o=e[t?"startOffset":"endOffset"];if(n){if(fe(n)&&n.parentNode){const e=n;o=(e=>{var t;let n=null===(t=e.parentNode)||void 0===t?void 0:t.firstChild,o=0;for(;n;){if(n===e)return o;fe(n)&&"bookmark"===n.getAttribute("data-mce-type")||o++,n=n.nextSibling}return-1})(n),n=n.parentNode,Tt.remove(e),!n.hasChildNodes()&&Tt.isBlock(n)&&n.appendChild(Tt.create("br"))}e[t?"startContainer":"endContainer"]=n,e[t?"startOffset":"endOffset"]=o}};t(!0),t();const n=Tt.createRng();return n.setStart(e.startContainer,e.startOffset),e.endContainer&&n.setEnd(e.endContainer,e.endOffset),He(n)},Dt=e=>{switch(e){case"UL":return"ToggleUlList";case"OL":return"ToggleOlList";case"DL":return"ToggleDLList"}},Bt=(e,t)=>{ue.each(t,((t,n)=>{e.setAttribute(n,t)}))},It=(e,t,n)=>{((e,t,n)=>{const o=n["list-style-type"]?n["list-style-type"]:null;e.setStyle(t,"list-style-type",o)})(e,t,n),((e,t,n)=>{Bt(t,n["list-attributes"]),ue.each(e.select("li",t),(e=>{Bt(e,n["list-item-attributes"])}))})(e,t,n)},Pt=(e,t)=>l(t)&&!Ae(t,e.schema.getBlockElements()),Mt=(e,t,n,o)=>{let r=t[n?"startContainer":"endContainer"];const s=t[n?"startOffset":"endOffset"];fe(r)&&(r=r.childNodes[Math.min(s,r.childNodes.length-1)]||r),!n&&Le(r.nextSibling)&&(r=r.nextSibling);const i=(t,n)=>{var r;const s=new ne(t,(t=>{for(;!e.dom.isBlock(t)&&t.parentNode&&o!==t;)t=t.parentNode;return t})(t)),i=n?"next":"prev";let l;for(;l=s[i]();)if(!xe(e,l)&&!xt(l.textContent)&&0!==(null===(r=l.textContent)||void 0===r?void 0:r.length))return g.some(l);return g.none()};if(n&&he(r))if(xt(r.textContent))r=i(r,!1).getOr(r);else for(null!==r.parentNode&&Pt(e,r.parentNode)&&(r=r.parentNode);null!==r.previousSibling&&(Pt(e,r.previousSibling)||he(r.previousSibling));)r=r.previousSibling;if(!n&&he(r))if(xt(r.textContent))r=i(r,!0).getOr(r);else for(null!==r.parentNode&&Pt(e,r.parentNode)&&(r=r.parentNode);null!==r.nextSibling&&(Pt(e,r.nextSibling)||he(r.nextSibling));)r=r.nextSibling;for(;r.parentNode!==o;){const t=r.parentNode;if(Oe(e,r))return r;if(/^(TD|TH)$/.test(t.nodeName))return r;r=t}return r},Rt=(e,t,n)=>{const o=e.selection.getRng();let r="LI";const s=Qe(e,((e,t)=>{const n=e.selection.getStart(!0),o=Mt(e,t,!0,e.getBody());return r=U(o),s=U(t.commonAncestorContainer),i=r,l=function(e,...t){return(...n)=>{const o=t.concat(n);return e.apply(null,o)}}($,s),q(i,l,void 0).isSome()?t.commonAncestorContainer:n;var r,s,i,l})(e,o)),i=e.dom;if("false"===i.getContentEditable(e.selection.getNode()))return;"DL"===(t=t.toUpperCase())&&(r="DT");const l=Et(o),a=N(((e,t,n)=>{const o=[],r=e.dom,s=Mt(e,t,!0,n),i=Mt(e,t,!1,n);let l;const a=[];for(let e=s;e&&(a.push(e),e!==i);e=e.nextSibling);return ue.each(a,(t=>{var s;if(Oe(e,t))return o.push(t),void(l=null);if(r.isBlock(t)||Le(t))return Le(t)&&r.remove(t),void(l=null);const i=t.nextSibling;kt.isBookmarkNode(t)&&(ye(i)||Oe(e,i)||!i&&t.parentNode===n)?l=null:(l||(l=r.create("p"),null===(s=t.parentNode)||void 0===s||s.insertBefore(l,t),o.push(l)),l.appendChild(t))})),o})(e,o,s),e.dom.isEditable);ue.each(a,(o=>{let s;const l=o.previousSibling,a=o.parentNode;be(a)||(l&&ye(l)&&l.nodeName===t&&((e,t,n)=>{const o=e.getStyle(t,"list-style-type");let r=n?n["list-style-type"]:"";return r=null===r?"":r,o===r})(i,l,n)?(s=l,o=i.rename(o,r),l.appendChild(o)):(s=i.create(t),a.insertBefore(s,o),s.appendChild(o),o=i.rename(o,r)),((e,t,n)=>{ue.each(["margin","margin-right","margin-bottom","margin-left","margin-top","padding","padding-right","padding-bottom","padding-left","padding-top"],(n=>e.setStyle(t,n,"")))})(i,o),It(i,s,n),$t(e.dom,s))})),e.selection.setRng(wt(l))},Ut=(e,t,n)=>{return((e,t)=>ye(e)&&e.nodeName===(null==t?void 0:t.nodeName))(t,n)&&((e,t,n)=>e.getStyle(t,"list-style-type",!0)===e.getStyle(n,"list-style-type",!0))(e,t,n)&&(o=n,t.className===o.className);var o},$t=(e,t)=>{let n,o=t.nextSibling;if(Ut(e,t,o)){const r=o;for(;n=r.firstChild;)t.appendChild(n);e.remove(r)}if(o=t.previousSibling,Ut(e,t,o)){const r=o;for(;n=r.lastChild;)t.insertBefore(n,t.firstChild);e.remove(r)}},_t=(e,t,n,o)=>{if(t.nodeName!==n){const r=e.dom.rename(t,n);It(e.dom,r,o),tt(e,Dt(n),r)}else It(e.dom,t,o),tt(e,Dt(n),t)},Ht=(e,t,n,o)=>{if(t.classList.forEach(((e,n,o)=>{e.startsWith("tox-")&&(o.remove(e),0===o.length&&t.removeAttribute("class"))})),t.nodeName!==n){const r=e.dom.rename(t,n);It(e.dom,r,o),tt(e,Dt(n),r)}else It(e.dom,t,o),tt(e,Dt(n),t)},Vt=e=>"list-style-type"in e,Ft=(e,t,n)=>{const o=je(e);if(Xe(e,o))return;const s=(e=>{const t=je(e),n=e.selection.getSelectedBlocks();return((e,t)=>l(e)&&1===t.length&&t[0]===e)(t,n)?(e=>N(e.querySelectorAll(Fe),ye))(t):N(n,(e=>ye(e)&&t!==e))})(e),i=r(n)?n:{};s.length>0?((e,t,n,o,r)=>{const s=ye(t);if(!s||t.nodeName!==o||Vt(r)||Ze(t)){Rt(e,o,r);const i=Et(e.selection.getRng()),l=s?[t,...n]:n,a=s&&Ze(t)?Ht:_t;ue.each(l,(t=>{a(e,t,o,r)})),e.selection.setRng(wt(i))}else At(e)})(e,o,s,t,i):((e,t,n,o)=>{if(t!==e.getBody())if(t)if(t.nodeName!==n||Vt(o)||Ze(t)){const r=Et(e.selection.getRng());Ze(t)&&t.classList.forEach(((e,n,o)=>{e.startsWith("tox-")&&(o.remove(e),0===o.length&&t.removeAttribute("class"))})),It(e.dom,t,o);const s=e.dom.rename(t,n);$t(e.dom,s),e.selection.setRng(wt(r)),Rt(e,n,o),tt(e,Dt(n),s)}else At(e);else Rt(e,n,o),tt(e,Dt(n),t)})(e,o,t,i)},jt=me.DOM,Kt=(e,t)=>{const n=ue.grep(e.select("ol,ul",t));ue.each(n,(t=>{((e,t)=>{const n=t.parentElement;if(n&&"LI"===n.nodeName&&n.firstChild===t){const o=n.previousSibling;o&&"LI"===o.nodeName?(o.appendChild(t),ke(e,n)&&jt.remove(n)):jt.setStyle(n,"listStyleType","none")}if(ye(n)){const e=n.previousSibling;e&&"LI"===e.nodeName&&e.appendChild(t)}})(e,t)}))},zt=(e,t,n,o)=>{let r=t.startContainer;const s=t.startOffset;if(he(r)&&(n?s0))return r;const i=e.schema.getNonEmptyElements();fe(r)&&(r=te.getNode(r,s));const l=new ne(r,o);n&&((e,t)=>!!Le(t)&&e.isBlock(t.nextSibling)&&!Le(t.previousSibling))(e.dom,r)&&l.next();const a=n?l.next.bind(l):l.prev2.bind(l);for(;r=a();){if("LI"===r.nodeName&&!r.hasChildNodes())return r;if(i[r.nodeName])return r;if(he(r)&&r.data.length>0)return r}return null},Qt=(e,t)=>{const n=t.childNodes;return 1===n.length&&!ye(n[0])&&e.isBlock(n[0])},Wt=(e,t,n)=>{let o;const r=t.parentNode;if(!Te(e,t)||!Te(e,n))return;ye(n.lastChild)&&(o=n.lastChild),r===n.lastChild&&Le(r.previousSibling)&&e.remove(r.previousSibling);const s=n.lastChild;s&&Le(s)&&t.hasChildNodes()&&e.remove(s),ke(e,n,!0)&&Y(U(n)),((e,t,n)=>{let o;const r=Qt(e,n)?n.firstChild:n;if(((e,t)=>{Qt(e,t)&&e.remove(t.firstChild,!0)})(e,t),!ke(e,t,!0))for(;o=t.firstChild;)r.appendChild(o)})(e,t,n),o&&n.appendChild(o);const i=((e,t)=>{const n=e.dom,o=t.dom;return n!==o&&n.contains(o)})(U(n),U(t))?e.getParents(t,ye,n):[];e.remove(t),S(i,(t=>{ke(e,t)&&t!==e.getRoot()&&e.remove(t)}))},qt=(e,t)=>{const n=e.dom,o=e.selection,r=o.getStart(),s=ze(e,r),i=n.getParent(o.getStart(),"LI",s);if(i){const r=i.parentElement;if(r===e.getBody()&&ke(n,r))return!0;const l=He(o.getRng()),a=n.getParent(zt(e,l,t,s),"LI",s);if(a&&a!==i)return e.undoManager.transact((()=>{var n,o;t?((e,t,n,o)=>{const r=e.dom;if(r.isEmpty(o))((e,t,n)=>{Y(U(n)),Wt(e.dom,t,n),e.selection.setCursorLocation(n,0)})(e,n,o);else{const s=Et(t);Wt(r,n,o),e.selection.setRng(wt(s))}})(e,l,a,i):(null===(o=(n=i).parentNode)||void 0===o?void 0:o.firstChild)===n?Ot(e):((e,t,n,o)=>{const r=Et(t);Wt(e.dom,n,o);const s=wt(r);e.selection.setRng(s)})(e,l,i,a)})),!0;if(!a&&!t&&0===l.startOffset&&0===l.endOffset)return e.undoManager.transact((()=>{At(e)})),!0}return!1},Zt=e=>{const t=e.selection.getStart(),n=ze(e,t);return e.dom.getParent(t,"LI,DT,DD",n)||Ke(e).length>0},Gt=(e,t)=>{const n=e.selection;return!Xe(e,n.getNode())&&(n.isCollapsed()?((e,t)=>qt(e,t)||((e,t)=>{const n=e.dom,o=e.selection.getStart(),r=ze(e,o),s=n.getParent(o,n.isBlock,r);if(s&&n.isEmpty(s)){const o=He(e.selection.getRng()),i=n.getParent(zt(e,o,t,r),"LI",r);if(i){const l=e=>v(["td","th","caption"],_(e)),a=e=>e.dom===r;return!!((e,t,n=m)=>I(e,t,n).getOr(e.isNone()&&t.isNone()))(Z(U(i),l,a),Z(U(o.startContainer),l,a),$)&&(e.undoManager.transact((()=>{const o=i.parentNode;((e,t,n)=>{const o=e.getParent(t.parentNode,e.isBlock,n);e.remove(t),o&&e.isEmpty(o)&&e.remove(o)})(n,s,r),$t(n,o),e.selection.select(i,!0),e.selection.collapse(t)})),!0)}}return!1})(e,t))(e,t):(e=>!!Zt(e)&&(e.undoManager.transact((()=>{e.execCommand("Delete"),Kt(e.dom,e.getBody())})),!0))(e))},Jt=e=>{const t=k(nt(e).split("")),n=b(t,((e,t)=>{const n=e.toUpperCase().charCodeAt(0)-"A".charCodeAt(0)+1;return Math.pow(26,t)*n}));return L(n,((e,t)=>e+t),0)},Xt=e=>{if(--e<0)return"";{const t=e%26,n=Math.floor(e/26);return Xt(n)+String.fromCharCode("A".charCodeAt(0)+t)}},Yt=e=>{const t=parseInt(e.start,10);return B(e.listStyleType,"upper-alpha")?Xt(t):B(e.listStyleType,"lower-alpha")?Xt(t).toLowerCase():e.start},en=(e,t)=>()=>{const n=je(e);return l(n)&&n.nodeName===t},tn=e=>{e.addCommand("mceListProps",(()=>{(e=>{const t=je(e);Ce(t)&&!Xe(e,t)&&e.windowManager.open({title:"List Properties",body:{type:"panel",items:[{type:"input",name:"start",label:"Start list at number",inputMode:"numeric"}]},initialData:{start:Yt({start:e.dom.getAttrib(t,"start","1"),listStyleType:g.from(e.dom.getStyle(t,"list-style-type"))})},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],onSubmit:t=>{(e=>{switch((e=>/^[0-9]+$/.test(e)?2:/^[A-Z]+$/.test(e)?0:/^[a-z]+$/.test(e)?1:e.length>0?4:3)(e)){case 2:return g.some({listStyleType:g.none(),start:e});case 0:return g.some({listStyleType:g.some("upper-alpha"),start:Jt(e).toString()});case 1:return g.some({listStyleType:g.some("lower-alpha"),start:Jt(e).toString()});case 3:return g.some({listStyleType:g.none(),start:""});case 4:return g.none()}})(t.getData().start).each((t=>{e.execCommand("mceListUpdate",!1,{attrs:{start:"1"===t.start?"":t.start},styles:{"list-style-type":t.listStyleType.getOr("")}})})),t.close()}})})(e)}))};var nn=tinymce.util.Tools.resolve("tinymce.html.Node");const on=e=>3===e.type,rn=e=>0===e.length,sn=e=>{const t=(t,n)=>{const o=nn.create("li");S(t,(e=>o.append(e))),n?e.insert(o,n,!0):e.append(o)},n=L(e.children(),((e,n)=>on(n)?[...e,n]:rn(e)||on(n)?e:(t(e,n),[])),[]);rn(n)||t(n)},ln=(e,t)=>n=>(n.setEnabled(e.selection.isEditable()),Ye(e,(o=>{n.setActive(Ge(o.parents,t)),n.setEnabled(!Xe(e,o.element)&&e.selection.isEditable())}))),an=(e,t)=>n=>Ye(e,(o=>n.setEnabled(Ge(o.parents,t)&&!Xe(e,o.element))));e.add("lists",(e=>((e=>{(0,e.options.register)("lists_indent_on_tab",{processor:"boolean",default:!0})})(e),(e=>{e.on("PreInit",(()=>{const{parser:t}=e;t.addNodeFilter("ul,ol",(e=>S(e,sn)))}))})(e),e.hasPlugin("rtc",!0)?tn(e):((e=>{we(e)&&(e=>{e.on("keydown",(t=>{t.keyCode!==oe.TAB||oe.metaKeyPressed(t)||e.undoManager.transact((()=>{(t.shiftKey?Ot(e):Lt(e))&&t.preventDefault()}))}))})(e),(e=>{e.on("ExecCommand",(t=>{const n=t.command.toLowerCase();"delete"!==n&&"forwarddelete"!==n||!Zt(e)||Kt(e.dom,e.getBody())})),e.on("keydown",(t=>{t.keyCode===oe.BACKSPACE?Gt(e,!1)&&t.preventDefault():t.keyCode===oe.DELETE&&Gt(e,!0)&&t.preventDefault()}))})(e)})(e),(e=>{e.on("BeforeExecCommand",(t=>{const n=t.command.toLowerCase();"indent"===n?Lt(e):"outdent"===n&&Ot(e)})),e.addCommand("InsertUnorderedList",((t,n)=>{Ft(e,"UL",n)})),e.addCommand("InsertOrderedList",((t,n)=>{Ft(e,"OL",n)})),e.addCommand("InsertDefinitionList",((t,n)=>{Ft(e,"DL",n)})),e.addCommand("RemoveList",(()=>{At(e)})),tn(e),e.addCommand("mceListUpdate",((t,n)=>{r(n)&&((e,t)=>{const n=je(e);null===n||Xe(e,n)||e.undoManager.transact((()=>{r(t.styles)&&e.dom.setStyles(n,t.styles),r(t.attrs)&&ie(t.attrs,((t,o)=>e.dom.setAttrib(n,o,t)))}))})(e,n)})),e.addQueryStateHandler("InsertUnorderedList",en(e,"UL")),e.addQueryStateHandler("InsertOrderedList",en(e,"OL")),e.addQueryStateHandler("InsertDefinitionList",en(e,"DL"))})(e)),(e=>{const t=t=>()=>e.execCommand(t);e.hasPlugin("advlist")||(e.ui.registry.addToggleButton("numlist",{icon:"ordered-list",active:!1,tooltip:"Numbered list",onAction:t("InsertOrderedList"),onSetup:ln(e,"OL")}),e.ui.registry.addToggleButton("bullist",{icon:"unordered-list",active:!1,tooltip:"Bullet list",onAction:t("InsertUnorderedList"),onSetup:ln(e,"UL")}))})(e),(e=>{const t={text:"List properties...",icon:"ordered-list",onAction:()=>e.execCommand("mceListProps"),onSetup:an(e,"OL")};e.ui.registry.addMenuItem("listprops",t),e.ui.registry.addContextMenu("lists",{update:t=>{const n=je(e,t);return Ce(n)?["listprops"]:[]}})})(e),(e=>({backspaceDelete:t=>{Gt(e,t)}}))(e))))}(); \ No newline at end of file diff --git a/static/js/tinymce/plugins/media/plugin.min.js b/static/js/tinymce/plugins/media/plugin.min.js new file mode 100644 index 0000000..f9b72e9 --- /dev/null +++ b/static/js/tinymce/plugins/media/plugin.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.7.2 (2023-10-25) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(r=o=e,(a=String).prototype.isPrototypeOf(r)||(null===(s=o.constructor)||void 0===s?void 0:s.name)===a.name)?"string":t;var r,o,a,s})(t)===e,r=t("string"),o=t("object"),a=t("array"),s=e=>!(e=>null==e)(e);class i{constructor(e,t){this.tag=e,this.value=t}static some(e){return new i(!0,e)}static none(){return i.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?i.some(e(this.value)):i.none()}bind(e){return this.tag?e(this.value):i.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:i.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return s(e)?i.some(e):i.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}i.singletonNone=new i(!1);const n=Array.prototype.push,l=(e,t)=>{for(let r=0,o=e.length;r{const t=[];for(let r=0,o=e.length;rh(e,t)?i.from(e[t]):i.none(),h=(e,t)=>u.call(e,t),p=e=>t=>t.options.get(e),g=p("audio_template_callback"),b=p("video_template_callback"),w=p("iframe_template_callback"),v=p("media_live_embeds"),f=p("media_filter_html"),y=p("media_url_resolver"),x=p("media_alt_source"),_=p("media_poster"),k=p("media_dimensions");var j=tinymce.util.Tools.resolve("tinymce.util.Tools"),O=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),A=tinymce.util.Tools.resolve("tinymce.html.DomParser");const S=O.DOM,$=e=>e.replace(/px$/,""),C=e=>{const t=e.attr("style"),r=t?S.parseStyle(t):{};return{type:"ephox-embed-iri",source:e.attr("data-ephox-embed-iri"),altsource:"",poster:"",width:d(r,"max-width").map($).getOr(""),height:d(r,"max-height").map($).getOr("")}},T=(e,t)=>{let r={};for(let o=A({validate:!1,forced_root_block:!1},t).parse(e);o;o=o.walk())if(1===o.type){const e=o.name;if(o.attr("data-ephox-embed-iri")){r=C(o);break}r.source||"param"!==e||(r.source=o.attr("movie")),"iframe"!==e&&"object"!==e&&"embed"!==e&&"video"!==e&&"audio"!==e||(r.type||(r.type=e),r=j.extend(o.attributes.map,r)),"source"===e&&(r.source?r.altsource||(r.altsource=o.attr("src")):r.source=o.attr("src")),"img"!==e||r.poster||(r.poster=o.attr("src"))}return r.source=r.source||r.src||"",r.altsource=r.altsource||"",r.poster=r.poster||"",r},z=e=>{var t;const r=null!==(t=e.toLowerCase().split(".").pop())&&void 0!==t?t:"";return d({mp3:"audio/mpeg",m4a:"audio/x-m4a",wav:"audio/wav",mp4:"video/mp4",webm:"video/webm",ogg:"video/ogg",swf:"application/x-shockwave-flash"},r).getOr("")};var D=tinymce.util.Tools.resolve("tinymce.html.Node"),F=tinymce.util.Tools.resolve("tinymce.html.Serializer");const M=(e,t={})=>A({forced_root_block:!1,validate:!1,allow_conditional_comments:!0,...t},e),N=O.DOM,R=e=>/^[0-9.]+$/.test(e)?e+"px":e,E=(e,t)=>{const r=t.attr("style"),o=r?N.parseStyle(r):{};s(e.width)&&(o["max-width"]=R(e.width)),s(e.height)&&(o["max-height"]=R(e.height)),t.attr("style",N.serializeStyle(o))},U=["source","altsource"],P=(e,t,r,o)=>{let a=0,s=0;const i=M(o);i.addNodeFilter("source",(e=>a=e.length));const n=i.parse(e);for(let e=n;e;e=e.walk())if(1===e.type){const o=e.name;if(e.attr("data-ephox-embed-iri")){E(t,e);break}switch(o){case"video":case"object":case"embed":case"img":case"iframe":void 0!==t.height&&void 0!==t.width&&(e.attr("width",t.width),e.attr("height",t.height))}if(r)switch(o){case"video":e.attr("poster",t.poster),e.attr("src",null);for(let r=a;r<2;r++)if(t[U[r]]){const o=new D("source",1);o.attr("src",t[U[r]]),o.attr("type",t[U[r]+"mime"]||null),e.append(o)}break;case"iframe":e.attr("src",t.source);break;case"object":const r=e.getAll("img").length>0;if(t.poster&&!r){e.attr("src",t.poster);const r=new D("img",1);r.attr("src",t.poster),r.attr("width",t.width),r.attr("height",t.height),e.append(r)}break;case"source":if(s<2&&(e.attr("src",t[U[s]]),e.attr("type",t[U[s]+"mime"]||null),!t[U[s]])){e.remove();continue}s++;break;case"img":t.poster||e.remove()}}return F({},o).serialize(n)},L=[{regex:/youtu\.be\/([\w\-_\?&=.]+)/i,type:"iframe",w:560,h:314,url:"www.youtube.com/embed/$1",allowFullscreen:!0},{regex:/youtube\.com(.+)v=([^&]+)(&([a-z0-9&=\-_]+))?/i,type:"iframe",w:560,h:314,url:"www.youtube.com/embed/$2?$4",allowFullscreen:!0},{regex:/youtube.com\/embed\/([a-z0-9\?&=\-_]+)/i,type:"iframe",w:560,h:314,url:"www.youtube.com/embed/$1",allowFullscreen:!0},{regex:/vimeo\.com\/([0-9]+)\?h=(\w+)/,type:"iframe",w:425,h:350,url:"player.vimeo.com/video/$1?h=$2&title=0&byline=0&portrait=0&color=8dc7dc",allowFullscreen:!0},{regex:/vimeo\.com\/(.*)\/([0-9]+)\?h=(\w+)/,type:"iframe",w:425,h:350,url:"player.vimeo.com/video/$2?h=$3&title=0&byline=0",allowFullscreen:!0},{regex:/vimeo\.com\/([0-9]+)/,type:"iframe",w:425,h:350,url:"player.vimeo.com/video/$1?title=0&byline=0&portrait=0&color=8dc7dc",allowFullscreen:!0},{regex:/vimeo\.com\/(.*)\/([0-9]+)/,type:"iframe",w:425,h:350,url:"player.vimeo.com/video/$2?title=0&byline=0",allowFullscreen:!0},{regex:/maps\.google\.([a-z]{2,3})\/maps\/(.+)msid=(.+)/,type:"iframe",w:425,h:350,url:'maps.google.com/maps/ms?msid=$2&output=embed"',allowFullscreen:!1},{regex:/dailymotion\.com\/video\/([^_]+)/,type:"iframe",w:480,h:270,url:"www.dailymotion.com/embed/video/$1",allowFullscreen:!0},{regex:/dai\.ly\/([^_]+)/,type:"iframe",w:480,h:270,url:"www.dailymotion.com/embed/video/$1",allowFullscreen:!0}],I=(e,t)=>{const r=(e=>{const t=e.match(/^(https?:\/\/|www\.)(.+)$/i);return t&&t.length>1?"www."===t[1]?"https://":t[1]:"https://"})(t),o=e.regex.exec(t);let a=r+e.url;if(s(o))for(let e=0;eo[e]?o[e]:""));return a.replace(/\?$/,"")},B=e=>{const t=L.filter((t=>t.regex.test(e)));return t.length>0?j.extend({},t[0],{url:I(t[0],e)}):null},G=(e,t)=>{var r;const o=j.extend({},t);if(!o.source&&(j.extend(o,T(null!==(r=o.embed)&&void 0!==r?r:"",e.schema)),!o.source))return"";o.altsource||(o.altsource=""),o.poster||(o.poster=""),o.source=e.convertURL(o.source,"source"),o.altsource=e.convertURL(o.altsource,"source"),o.sourcemime=z(o.source),o.altsourcemime=z(o.altsource),o.poster=e.convertURL(o.poster,"poster");const a=B(o.source);if(a&&(o.source=a.url,o.type=a.type,o.allowfullscreen=a.allowFullscreen,o.width=o.width||String(a.w),o.height=o.height||String(a.h)),o.embed)return P(o.embed,o,!0,e.schema);{const t=g(e),r=b(e),a=w(e);return o.width=o.width||"300",o.height=o.height||"150",j.each(o,((t,r)=>{o[r]=e.dom.encode(""+t)})),"iframe"===o.type?((e,t)=>{if(t)return t(e);{const t=e.allowfullscreen?' allowFullscreen="1"':"";return'"}})(o,a):"application/x-shockwave-flash"===o.sourcemime?(e=>{let t='';return e.poster&&(t+=''),t+="",t})(o):-1!==o.sourcemime.indexOf("audio")?((e,t)=>t?t(e):'")(o,t):((e,t)=>t?t(e):'")(o,r)}},W=e=>e.hasAttribute("data-mce-object")||e.hasAttribute("data-ephox-embed-iri"),q={},H=e=>t=>G(e,t),J=(e,t)=>{const r=y(e);return r?((e,t,r)=>new Promise(((o,a)=>{const s=r=>(r.html&&(q[e.source]=r),o({url:e.source,html:r.html?r.html:t(e)}));q[e.source]?s(q[e.source]):r({url:e.source},s,a)})))(t,H(e),r):((e,t)=>Promise.resolve({html:t(e),url:e.source}))(t,H(e))},K=(e,t)=>{const r={};return d(e,"dimensions").each((e=>{l(["width","height"],(o=>{d(t,o).orThunk((()=>d(e,o))).each((e=>r[o]=e))}))})),r},Q=(e,t)=>{const r=t&&"dimensions"!==t?((e,t)=>d(t,e).bind((e=>d(e,"meta"))))(t,e).getOr({}):{},a=((e,t,r)=>a=>{const s=()=>d(e,a),n=()=>d(t,a),l=e=>d(e,"value").bind((e=>e.length>0?i.some(e):i.none()));return{[a]:(a===r?s().bind((e=>o(e)?l(e).orThunk(n):n().orThunk((()=>i.from(e))))):n().orThunk((()=>s().bind((e=>o(e)?l(e):i.from(e)))))).getOr("")}})(e,r,t);return{...a("source"),...a("altsource"),...a("poster"),...a("embed"),...K(e,r)}},V=e=>{const t={...e,source:{value:d(e,"source").getOr("")},altsource:{value:d(e,"altsource").getOr("")},poster:{value:d(e,"poster").getOr("")}};return l(["width","height"],(r=>{d(e,r).each((e=>{const o=t.dimensions||{};o[r]=e,t.dimensions=o}))})),t},X=e=>t=>{const r=t&&t.msg?"Media embed handler error: "+t.msg:"Media embed handler threw unknown error.";e.notificationManager.open({type:"error",text:r})},Y=(e,t)=>o=>{if(r(o.url)&&o.url.trim().length>0){const r=o.html,a={...T(r,t.schema),source:o.url,embed:r};e.setData(V(a))}},Z=(e,t)=>{const r=e.dom.select("*[data-mce-object]");e.insertContent(t),((e,t)=>{const r=e.dom.select("*[data-mce-object]");for(let e=0;e=0;o--)t[e]===r[o]&&r.splice(o,1);e.selection.select(r[0])})(e,r),e.nodeChanged()},ee=(e,t)=>s(t)&&"ephox-embed-iri"===t&&s(B(e)),te=(e,t)=>((e,t)=>e.width!==t.width||e.height!==t.height)(e,t)&&ee(t.source,e.type),re=e=>{const t=(e=>{const t=e.selection.getNode(),r=W(t)?e.serializer.serialize(t,{selection:!0}):"",o=T(r,e.schema),a=(()=>{if(ee(o.source,o.type)){const r=e.dom.getRect(t);return{width:r.w.toString().replace(/px$/,""),height:r.h.toString().replace(/px$/,"")}}return{}})();return{embed:r,...o,...a}})(e),r=(e=>{let t=e;return{get:()=>t,set:e=>{t=e}}})(t),o=V(t),a=k(e)?[{type:"sizeinput",name:"dimensions",label:"Constrain proportions",constrain:!0}]:[],s={title:"General",name:"general",items:c([[{name:"source",type:"urlinput",filetype:"media",label:"Source"}],a])},i=[];x(e)&&i.push({name:"altsource",type:"urlinput",filetype:"media",label:"Alternative source URL"}),_(e)&&i.push({name:"poster",type:"urlinput",filetype:"image",label:"Media poster (Image URL)"});const n={title:"Advanced",name:"advanced",items:i},l=[s,{title:"Embed",items:[{type:"textarea",name:"embed",label:"Paste your embed code below:"}]}];i.length>0&&l.push(n);const m={type:"tabpanel",tabs:l},u=e.windowManager.open({title:"Insert/Edit Media",size:"normal",body:m,buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],onSubmit:t=>{const o=Q(t.getData());((e,t,r)=>{var o,a;t.embed=te(e,t)&&k(r)?G(r,{...t,embed:""}):P(null!==(o=t.embed)&&void 0!==o?o:"",t,!1,r.schema),t.embed&&(e.source===t.source||(a=t.source,h(q,a)))?Z(r,t.embed):J(r,t).then((e=>{Z(r,e.html)})).catch(X(r))})(r.get(),o,e),t.close()},onChange:(t,o)=>{switch(o.name){case"source":((t,r)=>{const o=Q(r.getData(),"source");t.source!==o.source&&(Y(u,e)({url:o.source,html:""}),J(e,o).then(Y(u,e)).catch(X(e)))})(r.get(),t);break;case"embed":(t=>{var r;const o=Q(t.getData()),a=T(null!==(r=o.embed)&&void 0!==r?r:"",e.schema);t.setData(V(a))})(t);break;case"dimensions":case"altsource":case"poster":((t,r,o)=>{const a=Q(t.getData(),r),s=te(o,a)&&k(e)?{...a,embed:""}:a,i=G(e,s);t.setData(V({...s,embed:i}))})(t,o.name,r.get())}r.set(Q(t.getData()))},initialData:o})};var oe=tinymce.util.Tools.resolve("tinymce.Env");const ae=e=>{const t=e.name;return"iframe"===t||"video"===t||"audio"===t},se=(e,t,r,o=null)=>{const a=e.attr(r);return s(a)?a:h(t,r)?null:o},ie=(e,t,r)=>{const o="img"===t.name||"video"===e.name,a=o?"300":null,s="audio"===e.name?"30":"150",i=o?s:null;t.attr({width:se(e,r,"width",a),height:se(e,r,"height",i)})},ne=(e,t)=>{const r=t.name,o=new D("img",1);return ce(e,t,o),ie(t,o,{}),o.attr({style:t.attr("style"),src:oe.transparentSrc,"data-mce-object":r,class:"mce-object mce-object-"+r}),o},le=(e,t)=>{var r;const o=t.name,a=new D("span",1);a.attr({contentEditable:"false",style:t.attr("style"),"data-mce-object":o,class:"mce-preview-object mce-object-"+o}),ce(e,t,a);const i=e.dom.parseStyle(null!==(r=t.attr("style"))&&void 0!==r?r:""),n=new D(o,1);if(ie(t,n,i),n.attr({src:t.attr("src"),style:t.attr("style"),class:t.attr("class")}),"iframe"===o)n.attr({allowfullscreen:t.attr("allowfullscreen"),frameborder:"0"});else{l(["controls","crossorigin","currentTime","loop","muted","poster","preload"],(e=>{n.attr(e,t.attr(e))}));const r=a.attr("data-mce-html");s(r)&&((e,t,r,o)=>{const a=M(e.schema).parse(o,{context:t});for(;a.firstChild;)r.append(a.firstChild)})(e,o,n,unescape(r))}const c=new D("span",1);return c.attr("class","mce-shim"),a.append(n),a.append(c),a},ce=(e,t,r)=>{var o;const a=null!==(o=t.attributes)&&void 0!==o?o:[];let s=a.length;for(;s--;){const t=a[s].name;let o=a[s].value;"width"===t||"height"===t||"style"===t||(n="data-mce-",(i=t).length>=9&&i.substr(0,9)===n)||("data"!==t&&"src"!==t||(o=e.convertURL(o,t)),r.attr("data-mce-p-"+t,o))}var i,n;const c=F({inner:!0},e.schema),m=new D("div",1);l(t.children(),(e=>m.append(e)));const u=c.serialize(m);u&&(r.attr("data-mce-html",escape(u)),r.empty())},me=e=>{const t=e.attr("class");return r(t)&&/\btiny-pageembed\b/.test(t)},ue=e=>{let t=e;for(;t=t.parent;)if(t.attr("data-ephox-embed-iri")||me(t))return!0;return!1},de=(e,t,r)=>{const o=(0,e.options.get)("xss_sanitization"),a=f(e);return M(e.schema,{sanitize:o,validate:a}).parse(r,{context:t})},he=e=>t=>{const r=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",r),r(),()=>{e.off("NodeChange",r)}};e.add("media",(e=>((e=>{const t=e.options.register;t("audio_template_callback",{processor:"function"}),t("video_template_callback",{processor:"function"}),t("iframe_template_callback",{processor:"function"}),t("media_live_embeds",{processor:"boolean",default:!0}),t("media_filter_html",{processor:"boolean",default:!0}),t("media_url_resolver",{processor:"function"}),t("media_alt_source",{processor:"boolean",default:!0}),t("media_poster",{processor:"boolean",default:!0}),t("media_dimensions",{processor:"boolean",default:!0})})(e),(e=>{e.addCommand("mceMedia",(()=>{re(e)}))})(e),(e=>{const t=()=>e.execCommand("mceMedia");e.ui.registry.addToggleButton("media",{tooltip:"Insert/edit media",icon:"embed",onAction:t,onSetup:t=>{const r=e.selection;t.setActive(W(r.getNode()));const o=r.selectorChangedWithUnbind("img[data-mce-object],span[data-mce-object],div[data-ephox-embed-iri]",t.setActive).unbind,a=he(e)(t);return()=>{o(),a()}}}),e.ui.registry.addMenuItem("media",{icon:"embed",text:"Media...",onAction:t,onSetup:he(e)})})(e),(e=>{e.on("ResolveName",(e=>{let t;1===e.target.nodeType&&(t=e.target.getAttribute("data-mce-object"))&&(e.name=t)}))})(e),(e=>{e.on("PreInit",(()=>{const{schema:t,serializer:r,parser:o}=e,a=t.getBoolAttrs();l("webkitallowfullscreen mozallowfullscreen".split(" "),(e=>{a[e]={}})),((e,t)=>{const r=m(e);for(let o=0,a=r.length;o{const o=t.getElementRule(r);o&&l(e,(e=>{o.attributes[e]={},o.attributesOrder.push(e)}))})),o.addNodeFilter("iframe,video,audio,object,embed",(e=>t=>{let r,o=t.length;for(;o--;)r=t[o],r.parent&&(r.parent.attr("data-mce-object")||(ae(r)&&v(e)?ue(r)||r.replace(le(e,r)):ue(r)||r.replace(ne(e,r))))})(e)),r.addAttributeFilter("data-mce-object",((t,r)=>{var o;let a=t.length;for(;a--;){const s=t[a];if(!s.parent)continue;const i=s.attr(r),n=new D(i,1);if("audio"!==i){const e=s.attr("class");e&&-1!==e.indexOf("mce-preview-object")&&s.firstChild?n.attr({width:s.firstChild.attr("width"),height:s.firstChild.attr("height")}):n.attr({width:s.attr("width"),height:s.attr("height")})}n.attr({style:s.attr("style")});const c=null!==(o=s.attributes)&&void 0!==o?o:[];let m=c.length;for(;m--;){const e=c[m].name;0===e.indexOf("data-mce-p-")&&n.attr(e.substr(11),c[m].value)}const u=s.attr("data-mce-html");if(u){const t=de(e,i,unescape(u));l(t.children(),(e=>n.append(e)))}s.replace(n)}}))})),e.on("SetContent",(()=>{const t=e.dom;l(t.select("span.mce-preview-object"),(e=>{0===t.select("span.mce-shim",e).length&&t.add(e,"span",{class:"mce-shim"})}))}))})(e),(e=>{e.on("click keyup touchend",(()=>{const t=e.selection.getNode();t&&e.dom.hasClass(t,"mce-preview-object")&&e.dom.getAttrib(t,"data-mce-selected")&&t.setAttribute("data-mce-selected","2")})),e.on("ObjectResized",(t=>{const r=t.target;if(r.getAttribute("data-mce-object")){let o=r.getAttribute("data-mce-html");o&&(o=unescape(o),r.setAttribute("data-mce-html",escape(P(o,{width:String(t.width),height:String(t.height)},!1,e.schema))))}}))})(e),(e=>({showDialog:()=>{re(e)}}))(e))))}(); \ No newline at end of file diff --git a/static/js/tinymce/plugins/nonbreaking/plugin.min.js b/static/js/tinymce/plugins/nonbreaking/plugin.min.js new file mode 100644 index 0000000..1406420 --- /dev/null +++ b/static/js/tinymce/plugins/nonbreaking/plugin.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.7.2 (2023-10-25) + */ +!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=n=>e=>typeof e===n,o=e("boolean"),a=e("number"),t=n=>e=>e.options.get(n),i=t("nonbreaking_force_tab"),s=t("nonbreaking_wrap"),r=(n,e)=>{let o="";for(let a=0;a{const o=s(n)||n.plugins.visualchars?`${r(" ",e)}`:r(" ",e);n.undoManager.transact((()=>n.insertContent(o)))};var l=tinymce.util.Tools.resolve("tinymce.util.VK");const u=n=>e=>{const o=()=>{e.setEnabled(n.selection.isEditable())};return n.on("NodeChange",o),o(),()=>{n.off("NodeChange",o)}};n.add("nonbreaking",(n=>{(n=>{const e=n.options.register;e("nonbreaking_force_tab",{processor:n=>o(n)?{value:n?3:0,valid:!0}:a(n)?{value:n,valid:!0}:{valid:!1,message:"Must be a boolean or number."},default:!1}),e("nonbreaking_wrap",{processor:"boolean",default:!0})})(n),(n=>{n.addCommand("mceNonBreaking",(()=>{c(n,1)}))})(n),(n=>{const e=()=>n.execCommand("mceNonBreaking");n.ui.registry.addButton("nonbreaking",{icon:"non-breaking",tooltip:"Nonbreaking space",onAction:e,onSetup:u(n)}),n.ui.registry.addMenuItem("nonbreaking",{icon:"non-breaking",text:"Nonbreaking space",onAction:e,onSetup:u(n)})})(n),(n=>{const e=i(n);e>0&&n.on("keydown",(o=>{if(o.keyCode===l.TAB&&!o.isDefaultPrevented()){if(o.shiftKey)return;o.preventDefault(),o.stopImmediatePropagation(),c(n,e)}}))})(n)}))}(); \ No newline at end of file diff --git a/static/js/tinymce/plugins/pagebreak/plugin.min.js b/static/js/tinymce/plugins/pagebreak/plugin.min.js new file mode 100644 index 0000000..d27a40e --- /dev/null +++ b/static/js/tinymce/plugins/pagebreak/plugin.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.7.2 (2023-10-25) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=tinymce.util.Tools.resolve("tinymce.Env");const t=e=>a=>a.options.get(e),n=t("pagebreak_separator"),o=t("pagebreak_split_block"),r="mce-pagebreak",s=e=>{const t=``;return e?`

      ${t}

      `:t},c=e=>a=>{const t=()=>{a.setEnabled(e.selection.isEditable())};return e.on("NodeChange",t),t(),()=>{e.off("NodeChange",t)}};e.add("pagebreak",(e=>{(e=>{const a=e.options.register;a("pagebreak_separator",{processor:"string",default:"\x3c!-- pagebreak --\x3e"}),a("pagebreak_split_block",{processor:"boolean",default:!1})})(e),(e=>{e.addCommand("mcePageBreak",(()=>{e.insertContent(s(o(e)))}))})(e),(e=>{const a=()=>e.execCommand("mcePageBreak");e.ui.registry.addButton("pagebreak",{icon:"page-break",tooltip:"Page break",onAction:a,onSetup:c(e)}),e.ui.registry.addMenuItem("pagebreak",{text:"Page break",icon:"page-break",onAction:a,onSetup:c(e)})})(e),(e=>{const a=n(e),t=()=>o(e),c=new RegExp(a.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,(e=>"\\"+e)),"gi");e.on("BeforeSetContent",(e=>{e.content=e.content.replace(c,s(t()))})),e.on("PreInit",(()=>{e.serializer.addNodeFilter("img",(n=>{let o,s,c=n.length;for(;c--;)if(o=n[c],s=o.attr("class"),s&&-1!==s.indexOf(r)){const n=o.parent;if(n&&e.schema.getBlockElements()[n.name]&&t()){n.type=3,n.value=a,n.raw=!0,o.remove();continue}o.type=3,o.value=a,o.raw=!0}}))}))})(e),(e=>{e.on("ResolveName",(a=>{"IMG"===a.target.nodeName&&e.dom.hasClass(a.target,r)&&(a.name="pagebreak")}))})(e)}))}(); \ No newline at end of file diff --git a/static/js/tinymce/plugins/preview/plugin.min.js b/static/js/tinymce/plugins/preview/plugin.min.js new file mode 100644 index 0000000..97eb376 --- /dev/null +++ b/static/js/tinymce/plugins/preview/plugin.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.7.2 (2023-10-25) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.Env"),o=tinymce.util.Tools.resolve("tinymce.util.Tools");const n=e=>t=>t.options.get(e),i=n("content_style"),s=n("content_css_cors"),c=n("body_class"),r=n("body_id");e.add("preview",(e=>{(e=>{e.addCommand("mcePreview",(()=>{(e=>{const n=(e=>{var n;let l="";const a=e.dom.encode,d=null!==(n=i(e))&&void 0!==n?n:"";l+='';const m=s(e)?' crossorigin="anonymous"':"";o.each(e.contentCSS,(t=>{l+='"})),d&&(l+='");const y=r(e),u=c(e),v=' diff --git a/templates/builder/_search_results_th.html b/templates/builder/_search_results_th.html new file mode 100644 index 0000000..d565b1d --- /dev/null +++ b/templates/builder/_search_results_th.html @@ -0,0 +1,9 @@ + diff --git a/templates/builder/base-menu.html b/templates/builder/base-menu.html new file mode 100644 index 0000000..6ba094b --- /dev/null +++ b/templates/builder/base-menu.html @@ -0,0 +1,67 @@ +
      +
      + +
      +
      + +
      +
      +
      + +
      +
      +
      + +
      + +
      + +
      + + +
      + +
      + + +
      + +
      +
      diff --git a/templates/builder/current-deck-list.html b/templates/builder/current-deck-list.html new file mode 100644 index 0000000..f67a672 --- /dev/null +++ b/templates/builder/current-deck-list.html @@ -0,0 +1,27 @@ +
      + +
      + +
      + {% include "builder/_current_deck_list-1.html" + :class "main" + :deck-list main-deck + :title "Main Deck" + %} + + {% include "builder/_current_deck_list-1.html" + :class "extra" + :deck-list extra-deck + :title "Extra Deck" + %} + + {% include "builder/_current_deck_list-1.html" + :class "side" + :deck-list side-deck + :title "Side Deck" + %} +
      + +{% include "builder/_jquery_droppable.html" %} diff --git a/templates/builder/deck-controls.html b/templates/builder/deck-controls.html new file mode 100644 index 0000000..784c0a0 --- /dev/null +++ b/templates/builder/deck-controls.html @@ -0,0 +1,99 @@ +
      +
      +
      +
      +
      + +
      +
      +
      + +
      +
      + +
      + +
      + +
      +
      +
      +
      + +
      +
      +
      +
      + +
      + +
      + +
      + +
      + +
      +
      + +
      +
      + +
      + +
      + +
      + + +
      + +
      + +
      +
      +
      diff --git a/templates/builder/index.html b/templates/builder/index.html new file mode 100644 index 0000000..2246a62 --- /dev/null +++ b/templates/builder/index.html @@ -0,0 +1,48 @@ +{% extends "layouts/default.html" %} +{% block title %}{_ "Deck Builder" _}{% endblock %} +{% block content %} +
      + {{ token | safe }} +
      + + +
      +
      + {% include "builder/base-menu.html" %} +
      +
      + + + + +
      + {% include "builder/deck-controls.html" %} +
      + + +
      + +
      + + +
      +   +
      +
      + + +
      +
      +
      +
      +
      +{% endblock %} diff --git a/templates/builder/saved-category-list.html b/templates/builder/saved-category-list.html new file mode 100644 index 0000000..91e1b3b --- /dev/null +++ b/templates/builder/saved-category-list.html @@ -0,0 +1,12 @@ +
      + +
      diff --git a/templates/builder/saved-deck-list.html b/templates/builder/saved-deck-list.html new file mode 100644 index 0000000..8450f2b --- /dev/null +++ b/templates/builder/saved-deck-list.html @@ -0,0 +1,12 @@ +
      + +
      diff --git a/templates/builder/search-results.html b/templates/builder/search-results.html new file mode 100644 index 0000000..fa4c699 --- /dev/null +++ b/templates/builder/search-results.html @@ -0,0 +1,121 @@ +{% if length > 1 %} +{% include "pages.html" :url "builder/search" :hx-target "#search-results" :hx-include "[name='search-form']" :class "is-small" %} +{% endif %} + +{% if cards %} + + + + + + + +
      + {% include "builder/_search_results_th.html" :url "/builder/search" :target "search-results" :name "ID" :sort "id" %} + + {% include "builder/_search_results_th.html" :url "/builder/search" :target "search-results" :name "Name" :sort "name" %} +
      +{% for card in cards %} + + + + + + + +
      + + Card Image for Yu-Gi-Oh! #{{ card.passcode }} + + + {{ card.name }} +
      + +{% endfor %} + +{% if length > 1 %} +

      {{ length }} result{% if length > 2 %}s{% endif %} found.

      +{% include "pages.html" :url "builder/search" :hx-target "#search-results" :hx-include "[name='search-form']" :class "is-small" %} +{% endif %} + + +{% endif %} diff --git a/templates/cards/_advanced_search_attrs.html b/templates/cards/_advanced_search_attrs.html new file mode 100644 index 0000000..217281a --- /dev/null +++ b/templates/cards/_advanced_search_attrs.html @@ -0,0 +1,113 @@ +
      +
      +
      +
      +
      + +
      +
      +
      + +
      +
      +
      + +
      +
      +
      + +
      +
      +
      + +
      +
      +
      + +
      +
      +
      + +
      +
      +
      + +
      +
      +
      + +
      +
      +
      + +
      +
      + +
      +
      +
      +
      diff --git a/templates/cards/_advanced_search_input_numeric.html b/templates/cards/_advanced_search_input_numeric.html new file mode 100644 index 0000000..e83493d --- /dev/null +++ b/templates/cards/_advanced_search_input_numeric.html @@ -0,0 +1,12 @@ +
      + +
      diff --git a/templates/cards/_advanced_search_numeric.html b/templates/cards/_advanced_search_numeric.html new file mode 100644 index 0000000..01ab5a8 --- /dev/null +++ b/templates/cards/_advanced_search_numeric.html @@ -0,0 +1,23 @@ +
      +
      +
      + {% include "cards/_advanced_search_select_kind.html" :name "scale-kind" %} + {% include "cards/_advanced_search_input_numeric.html" :name "Scale" %} +
      + +
      + {% include "cards/_advanced_search_select_kind.html" :name "level-kind" %} + {% include "cards/_advanced_search_input_numeric.html" :name "Level" %} +
      + +
      + {% include "cards/_advanced_search_select_kind.html" :name "atk-kind" %} + {% include "cards/_advanced_search_input_numeric.html" :name "ATK" %} +
      + +
      + {% include "cards/_advanced_search_select_kind.html" :name "def-kind" %} + {% include "cards/_advanced_search_input_numeric.html" :name "DEF" %} +
      +
      +
      diff --git a/templates/cards/_advanced_search_select.html b/templates/cards/_advanced_search_select.html new file mode 100644 index 0000000..9c721a3 --- /dev/null +++ b/templates/cards/_advanced_search_select.html @@ -0,0 +1,15 @@ +
      + +
      diff --git a/templates/cards/_advanced_search_select_kind.html b/templates/cards/_advanced_search_select_kind.html new file mode 100644 index 0000000..99be635 --- /dev/null +++ b/templates/cards/_advanced_search_select_kind.html @@ -0,0 +1,16 @@ +
      +
      + +
      +
      diff --git a/templates/cards/_advanced_search_top.html b/templates/cards/_advanced_search_top.html new file mode 100644 index 0000000..beffe44 --- /dev/null +++ b/templates/cards/_advanced_search_top.html @@ -0,0 +1,57 @@ +
      +
      + +
      +
      + +
      +
      +
      + +
      +
      +
      + +
      + +
      + +
      + + +
      + +
      +
      diff --git a/templates/cards/_search_result_th.html b/templates/cards/_search_result_th.html new file mode 100644 index 0000000..4e8a8f5 --- /dev/null +++ b/templates/cards/_search_result_th.html @@ -0,0 +1,9 @@ + + + diff --git a/templates/cards/index.html b/templates/cards/index.html new file mode 100644 index 0000000..7de514b --- /dev/null +++ b/templates/cards/index.html @@ -0,0 +1,35 @@ +{% extends "layouts/default.html" %} +{% block title %}Card List{% endblock %} +{% block content %} +
      + {{ token | safe }} +
      + + +
      +
      + {% include "cards/_advanced_search_top.html" %} +
      +
      + + + +
      + {% include "cards/search-results.html" %} +
      + +
      + + +{% endblock %} diff --git a/templates/cards/search-results.html b/templates/cards/search-results.html new file mode 100644 index 0000000..ccb5d17 --- /dev/null +++ b/templates/cards/search-results.html @@ -0,0 +1,78 @@ +{% include "pages.html" :hx-include "[name='search-form']" :hx-target "#search-results" :url "/cards/search" %} + +{% if cards %} + + + + + {% include "cards/_search_result_th.html" :url "/cards/search" :hx-target "#search-results" :name "Image" :sort "id" :form "search-form" %} + {% include "cards/_search_result_th.html" :url "/cards/search" :hx-target "#search-results" :name "Passcode" :sort "passcode" :form "search-form" %} + {% include "cards/_search_result_th.html" :url "/cards/search" :hx-target "#search-results" :name "Attribute" :sort "attribute" :form "search-form" %} + {% include "cards/_search_result_th.html" :url "/cards/search" :hx-target "#search-results" :name "Name" :sort "name" :form "search-form" %} + + {% include "cards/_search_result_th.html" :url "/cards/search" :hx-target "#search-results" :name "Archetype" :sort "archetype" :form "search-form" %} + {% include "cards/_search_result_th.html" :url "/cards/search" :hx-target "#search-results" :name "Race" :sort "race" :form "search-form" %} + {% include "cards/_search_result_th.html" :url "/cards/search" :hx-target "#search-results" :name "Type" :sort "type" :form "search-form" %} + + {% include "cards/_search_result_th.html" :url "/cards/search" :hx-target "#search-results" :name "Card Text" :sort "card-text" :form "search-form" %} + {% include "cards/_search_result_th.html" :url "/cards/search" :hx-target "#search-results" :name "ATK" :sort "atk" :form "search-form" %} + {% include "cards/_search_result_th.html" :url "/cards/search" :hx-target "#search-results" :name "DEF" :sort "def" :form "search-form" %} + {% include "cards/_search_result_th.html" :url "/cards/search" :hx-target "#search-results" :name "Level" :sort "level" :form "search-form" %} + {% include "cards/_search_result_th.html" :url "/cards/search" :hx-target "#search-results" :name "Scale" :sort "scale" :form "search-form" %} + {% include "cards/_search_result_th.html" :url "/cards/search" :hx-target "#search-results" :name "Frame" :sort "frame-type" :form "search-form" %} + + + + {% for card in cards %} + + + + + + + + + + + + + + + + {% endfor %} + +
      + + + Card Image for Yu-Gi-Oh! #{{card.passcode}} - {{card.name}} + + {{ card.passcode }}{% if card.attribute %} + {{ card.attribute }} + {% elif card.frame-type == "spell" %} + Spell Card + {% elif card.frame-type == "trap" %} + Spell Card + {% endif %} + {{ card.name }}{{ card.archetype }}{{ card.race }}{{ card.type }}{{ card.desc }}{{ card.atk }}{{ card.def }}{{ card.level }}{{ card.scale }}{{ card.frame-type }}
      + +
      +

      {{ length }} result{% if length > 2 %}s{% endif %} found.

      + {% include "pages.html" :url "cards/search" :hx-target "#search-results" :hx-include "[name='search-form']" %} +
      + +{% else %} +
      +

      Nothing to see here!

      +
      +{% endif %} diff --git a/templates/cards/variant-results.html b/templates/cards/variant-results.html new file mode 100644 index 0000000..88bcea9 --- /dev/null +++ b/templates/cards/variant-results.html @@ -0,0 +1,61 @@ +{% if item %} +
      + {{ token | safe }} + + +
      + +
      +
      +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + + +
      + +
      + +
      +
      +
      +
      + +
      + +
      +{% endif %} diff --git a/templates/cards/view.html b/templates/cards/view.html new file mode 100644 index 0000000..a1483e3 --- /dev/null +++ b/templates/cards/view.html @@ -0,0 +1,57 @@ +{% extends "layouts/default.html" %} +{% block title %}{_ "Card Set List" _}{% endblock %} +{% block content %} +
      + {% if ygo-card-sets %} +
      + {{ token | safe }} +
      +
      +
      +
      +
      +
      +

      + + + +

      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + {{ ygo-card-sets.0.passcode.id }} - {{ ygo-card-sets.0.passcode.name }} +
      + + {% for set in ygo-card-sets %} + + + + {{ ygo-card-sets.0.passcode.name }} - {{ set.code.name }} - {{ set.rarity.name }} - {{ set.edition.name }} - {{ set.name.name }} - {{ set.price }} + + +
      + {% endfor %} + +
      +
      +
      +
      + {% endif %} +
      +{% endblock %} diff --git a/templates/cards/ygo-price.html b/templates/cards/ygo-price.html new file mode 100644 index 0000000..0fd616e --- /dev/null +++ b/templates/cards/ygo-price.html @@ -0,0 +1,46 @@ +{% if price %} +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      +{% endif %} diff --git a/templates/category/category-menu-bar.html b/templates/category/category-menu-bar.html new file mode 100644 index 0000000..b851151 --- /dev/null +++ b/templates/category/category-menu-bar.html @@ -0,0 +1,4 @@ + diff --git a/templates/category/child-form.html b/templates/category/child-form.html new file mode 100644 index 0000000..0bb5f29 --- /dev/null +++ b/templates/category/child-form.html @@ -0,0 +1,44 @@ + + + + + + + + + +
      + + + +
      + + + + + + + +
      diff --git a/templates/category/child-list.html b/templates/category/child-list.html new file mode 100644 index 0000000..93c2117 --- /dev/null +++ b/templates/category/child-list.html @@ -0,0 +1,10 @@ +
      + {% if children %} +
      +
      {% for child in children %}{{ child.name }}
      +{% endfor %}
      +
      + {% else %} +

      Node has no children.

      + {% endif %} +
      diff --git a/templates/category/explain.html b/templates/category/explain.html new file mode 100644 index 0000000..295320d --- /dev/null +++ b/templates/category/explain.html @@ -0,0 +1,58 @@ +{% extends "layouts/default.html" %} +{% block title %}Category Tree{% endblock %} +{% block content %} +
      +
      + {{ token | safe }} + + +
      +

      You have a hierarchy of data you want to represent:

      + +
      + + categories + +
      + +

      If you want to store this hierarchy in a database (like an SQL database), the data has to be "normalized," or "flattened" ...

      + +
      + + nested_categories + +
      + +

      Using the magic of SQL, the actual category ID becomes irrelevant as we use the left bounding number as the new index...

      + +
      + + nested_numbered + +
      + +

      If you imagine it like a bunch of rubber bands (a different rubber band for each "category"), and the bands can wrap around each other, and there's an infinite number line that the bands line up on, kind of like if they were next to a ruler, and you can move bands around freely ...

      + +

      Original Article SQL Mumbo Jumbo

      +

      TODO: much better documentation on how this works...

      +
      +
      +
      +{% endblock %} diff --git a/templates/category/index.html b/templates/category/index.html new file mode 100644 index 0000000..0378ea0 --- /dev/null +++ b/templates/category/index.html @@ -0,0 +1,49 @@ +{% extends "layouts/default.html" %} +{% block title %}Category Tree{% endblock %} +{% block content %} +
      + {{ token | safe }} +
      + +{% include "category/category-menu-bar.html" %} + +
      +
      +
      +
      + +
      +
      +
      + + {% if category.id %} +

      Decks

      +
      +
      + +

      Children

      +
      + {% include "category/child-list.html" %} +
      + {% endif %} + +
      + +
      + {% include "category/child-form.html" %} +
      + + + +

      Explain all this to me..

      +
      +{% endblock %} diff --git a/templates/chat.html b/templates/chat.html new file mode 100644 index 0000000..34635b7 --- /dev/null +++ b/templates/chat.html @@ -0,0 +1,21 @@ +{% extends "layouts/default.html" %} +{% block title %}LISP CHAT{% endblock %} +{% block content %} +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      + +{% endblock %} diff --git a/templates/construct/constructed-deck-list.html b/templates/construct/constructed-deck-list.html new file mode 100644 index 0000000..43575b2 --- /dev/null +++ b/templates/construct/constructed-deck-list.html @@ -0,0 +1,12 @@ +{% extends "layouts/default.html" %} +{% block title %}{_ "Complete Selected Card Listing" _}{% endblock %} +{% block content %} + +{% include "decks/deck-menu-bar.html" %} + +
      +
      {% for row in table %}{{ row.deck-item.passcode }} - {{ row.card.name }} - {{ row.deck-set.code.name }} - {{ row.deck-set.rarity.name }} - {{ row.deck-set.edition.name }} - {{ row.condition.name }} {{ row.set-item.sell-price }}
      +{% endfor %}
      +
      + +{% endblock %} diff --git a/templates/construct/index.html b/templates/construct/index.html new file mode 100644 index 0000000..f1c3c48 --- /dev/null +++ b/templates/construct/index.html @@ -0,0 +1,99 @@ +{% extends "layouts/default.html" %} +{% block title %}Constructed Deck List{% endblock %} +{% block content %} + +
      + {{ token | safe }} +
      + +{% include "decks/deck-menu-bar.html" %} + +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      + +
      + {% if id %} + {% include "decks/saved-category-list.html" %} + {% endif %} +
      + +
      + {% if id %} + + +
      +
      + {% endif %} +
      + + + + {% if id %} + + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      +
      + +
      + +
      + +
      +
      + + {% endif %} + +{% endblock %} diff --git a/templates/construct/select-sets.html b/templates/construct/select-sets.html new file mode 100644 index 0000000..387ff06 --- /dev/null +++ b/templates/construct/select-sets.html @@ -0,0 +1,95 @@ +{% extends "layouts/default.html" %} +{% block title %}{_ "Select Card Sets" _}{% endblock %} +{% block content %} + + +
      + {{ token | safe }} +
      + +
      +
      + {% for card-sets in sets %} +
      +
      +
      +
      +

      + + + +

      +
      +
      +
      +
      +
      +
      + +
      +
      + +
      +
      +
      +
      + +
      +
      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + {% endfor %} +
      +
      + +
      +
      +
      +
      +{% endblock %} diff --git a/templates/contact/admin.html b/templates/contact/admin.html new file mode 100644 index 0000000..771474a --- /dev/null +++ b/templates/contact/admin.html @@ -0,0 +1,38 @@ +{% extends "layouts/default.html" %} +{% block title %}{_ "Feedback Admin Panel" _}{% endblock %} +{% block content %} +{% if is-admin %} +
      + {{ token | safe }} +
      + +
      + +
      + +
      + {% include "contact/list.html" %} +
      + +
      +
      +
      + +
      +
      +{% else %} +

      {_ "Oops" _}

      +

      + {_ "Nothing to see here!" _} +

      + +{% endif %} +{% endblock %} diff --git a/templates/contact/index.html b/templates/contact/index.html new file mode 100644 index 0000000..d2265f1 --- /dev/null +++ b/templates/contact/index.html @@ -0,0 +1,43 @@ +{% extends "layouts/default.html" %} +{% block title %}{_ "Contact Us" _}{% endblock %} +{% block content %} +
      + {{ token | safe }} +
      + +{% if is-admin %} +
      + +
      +{% endif %} + +
      +
      +
      + {_ "You can type up a message here and submit it for the administrator to see." _} + {_ "Try typing it up in Notepad, then Copy/Paste." _} +
      +
      + +
      + +
      + +
      +
      + +
      +
      + +
      +
      +
      +{% endblock %} diff --git a/templates/contact/list.html b/templates/contact/list.html new file mode 100644 index 0000000..006344e --- /dev/null +++ b/templates/contact/list.html @@ -0,0 +1,37 @@ +{% if feedback %} +
      + + + + + + + + {% for message in feedback %} + + + + + + + {% endfor %} +
      User IDUsernameBodyDelete
      {{ message.user-id }}{{ message.user.name }}{{ message.body }} + +
      +
      +{% else %} +
      +
      + No Messages +
      +
      + Squeaky clean! +
      +
      +{% endif %} diff --git a/templates/decks/_field_control_select.html b/templates/decks/_field_control_select.html new file mode 100644 index 0000000..a5364e3 --- /dev/null +++ b/templates/decks/_field_control_select.html @@ -0,0 +1,21 @@ +
      + +
      +
      + +
      +
      +
      diff --git a/templates/decks/cards-in-decks.html b/templates/decks/cards-in-decks.html new file mode 100644 index 0000000..7e4b281 --- /dev/null +++ b/templates/decks/cards-in-decks.html @@ -0,0 +1,33 @@ +{% extends "layouts/default.html" %} +{% block title %}Cards List - Cards In Decks{% endblock %} +{% block content %} + +{% include "decks/deck-menu-bar.html" %} + +{% for (card-id . card-params) in table %} +
      +
      +
      +
      + + Card Image for Yu-Gi-Oh! - {{ card-id }} + +
      +
      +
      +

      + {{ card-params.0.ygo-card.id }} - {{ card-params.0.ygo-card.name }} +
      +

      +

      +
      +
      +
      +{% endfor %} +{% endblock %} diff --git a/templates/decks/category-select.html b/templates/decks/category-select.html new file mode 100644 index 0000000..671ac98 --- /dev/null +++ b/templates/decks/category-select.html @@ -0,0 +1,12 @@ +
      + +
      diff --git a/templates/decks/deck-controls.html b/templates/decks/deck-controls.html new file mode 100644 index 0000000..ec3d50b --- /dev/null +++ b/templates/decks/deck-controls.html @@ -0,0 +1,41 @@ +
      + + + + KDE Team Deck List + + + + Construct Deck + + + +
      diff --git a/templates/decks/deck-html-results-1.html b/templates/decks/deck-html-results-1.html new file mode 100644 index 0000000..13f9882 --- /dev/null +++ b/templates/decks/deck-html-results-1.html @@ -0,0 +1,24 @@ +

      + {{ class | capfirst }} Deck ({{ deck | length }}) +

      + +
      + {% for card in deck %} +
      +
      +
      +
      + + Card Image for Yu-Gi-Oh! #{{ card.passcode }} - {{ card.name }} + +
      +
      +
      +
      + {% endfor %} +
      diff --git a/templates/decks/deck-html-results.html b/templates/decks/deck-html-results.html new file mode 100644 index 0000000..7aa5183 --- /dev/null +++ b/templates/decks/deck-html-results.html @@ -0,0 +1,11 @@ +{% if main-deck %} +{% include "decks/deck-html-results-1.html" :deck main-deck :class "main" %} +{% endif %} + +{% if extra-deck %} +{% include "decks/deck-html-results-1.html" :deck extra-deck :class "extra" %} +{% endif %} + +{% if side-deck %} +{% include "decks/deck-html-results-1.html" :deck side-deck :class "side" %} +{% endif %} diff --git a/templates/decks/deck-image-listing.html b/templates/decks/deck-image-listing.html new file mode 100644 index 0000000..11c57b1 --- /dev/null +++ b/templates/decks/deck-image-listing.html @@ -0,0 +1,18 @@ +{% if files %} +

      Deck Images

      +
      + {% for image in files %} +
      +
      +
      +
      + + Deck image for {{ image }} + +
      +
      +
      +
      + {% endfor %} +
      +{% endif %} diff --git a/templates/decks/deck-menu-bar.html b/templates/decks/deck-menu-bar.html new file mode 100644 index 0000000..b6af254 --- /dev/null +++ b/templates/decks/deck-menu-bar.html @@ -0,0 +1,8 @@ + diff --git a/templates/decks/deck-select.html b/templates/decks/deck-select.html new file mode 100644 index 0000000..b8c20d8 --- /dev/null +++ b/templates/decks/deck-select.html @@ -0,0 +1,13 @@ +
      + +
      diff --git a/templates/decks/deck-text-list-original.html b/templates/decks/deck-text-list-original.html new file mode 100644 index 0000000..a657e88 --- /dev/null +++ b/templates/decks/deck-text-list-original.html @@ -0,0 +1,32 @@ +
      + {% if main-deck %} +
      +

      Main Deck

      + {% for card in main-deck %} +

      {{ card.name }}

      + {% endfor %} +
      + {% endif %} + {% if extra-deck %} +
      +

      Extra Deck

      + {% for card in extra-deck %} +

      {{ card.name }}

      + {% endfor %} +
      + {% endif %} + {% if side-deck %} +
      +

      Side Deck

      + {% for card in side-deck %} +

      {{ card.name }}

      + {% endfor %} +
      + {% endif %} +
      diff --git a/templates/decks/deck-text-list.html b/templates/decks/deck-text-list.html new file mode 100644 index 0000000..408ec27 --- /dev/null +++ b/templates/decks/deck-text-list.html @@ -0,0 +1,3 @@ +{% if html %} +{{ html | safe }} +{% endif %} diff --git a/templates/decks/deck-text-textarea-with-brs.html b/templates/decks/deck-text-textarea-with-brs.html new file mode 100644 index 0000000..092ae9e --- /dev/null +++ b/templates/decks/deck-text-textarea-with-brs.html @@ -0,0 +1,16 @@ +
      +
      + +
      +
      diff --git a/templates/decks/deck-text-textarea.html b/templates/decks/deck-text-textarea.html new file mode 100644 index 0000000..7eeaa01 --- /dev/null +++ b/templates/decks/deck-text-textarea.html @@ -0,0 +1,16 @@ +
      +
      + +
      +
      diff --git a/templates/decks/deck-text-three-column.html b/templates/decks/deck-text-three-column.html new file mode 100644 index 0000000..2b63f97 --- /dev/null +++ b/templates/decks/deck-text-three-column.html @@ -0,0 +1,26 @@ +
      + {% if main-deck-rle %} +
      +

      Main Deck ({{ main-deck | length }})

      + {% for (count . name) in main-deck-rle %} +

      {{ count }} - {{ name }}

      + {% endfor %} +
      + {% endif %} + {% if extra-deck-rle %} +
      +

      Extra Deck ({{ extra-deck | length }})

      + {% for (count . name) in extra-deck-rle %} +

      {{ count }} - {{ name }}

      + {% endfor %} +
      + {% endif %} + {% if side-deck-rle %} +
      +

      Side Deck ({{ side-deck | length }})

      + {% for (count . name) in side-deck-rle %} +

      {{ count }} - {{ name }}

      + {% endfor %} +
      + {% endif %} +
      diff --git a/templates/decks/decks-by-category.html b/templates/decks/decks-by-category.html new file mode 100644 index 0000000..12ce1c1 --- /dev/null +++ b/templates/decks/decks-by-category.html @@ -0,0 +1,3 @@ +{% for deck in table %} +{{ deck.name }} +{% endfor %} diff --git a/templates/decks/index.html b/templates/decks/index.html new file mode 100644 index 0000000..454559e --- /dev/null +++ b/templates/decks/index.html @@ -0,0 +1,107 @@ +{% extends "layouts/default.html" %} +{% block title %}{_ "Deck List" _}{% endblock %} +{% block content %} + +{% include "tabs-js.html" %} + +
      + {{ token | safe }} +
      + +{% include "decks/deck-menu-bar.html" %} + +
      +
      +
      +
      +
      + {% if id %} +
      +
      + {% endif %} +
      +
      +
      + +{% if id %} +
      +
      + +
      + +
      + +
      +
      + +{% include "decks/deck-controls.html" %} + +
      + +
      + + + +
      +
      + + + + + + + + + + + + +
      +{% endif %} +{% endblock %} diff --git a/templates/decks/saved-category-list.html b/templates/decks/saved-category-list.html new file mode 100644 index 0000000..c5c0ad8 --- /dev/null +++ b/templates/decks/saved-category-list.html @@ -0,0 +1,19 @@ +
      +
      + +
      +
      +
      + +
      +
      +
      diff --git a/templates/decks/search.html b/templates/decks/search.html new file mode 100644 index 0000000..fabad7a --- /dev/null +++ b/templates/decks/search.html @@ -0,0 +1,41 @@ +{% extends "layouts/default.html" %} +{% block title %}Deck List{% endblock %} +{% block content %} + + + +{% include "decks/deck-menu-bar.html" %} + +
      +
      +
      + +
      + +
      +
      +
      +
      + +
      +
      +
      +
      + +{% if decks %} + +{% endif %} + +{% endblock %} diff --git a/templates/docs.html b/templates/docs.html new file mode 100644 index 0000000..f665f21 --- /dev/null +++ b/templates/docs.html @@ -0,0 +1,44 @@ +{% extends "layouts/default.html" %} +{% block title %}Package Documentation{% endblock %} +{% block content %} +
      +
      + + + + + + + {% for doc in docs %} + + + + + + {% endfor %} +
      Endpoint/URL (method)ParametersDocumentation
      {{ doc.0 }} {{ doc.2 }} + {% if doc.3 %} +
      +
      {{ doc.3 }}
      +
      + {% endif %} +
      + {% if doc.1 %} +
      +
      {{ doc.1 }}
      +
      + {% endif %} +
      +
      +
      +{% endblock %} +{# comment #} +(cl-who:with-html-output-to-string (s nil :prologue t) +(:html +(:head) +(:body +(loop for (url docstring methods params) in docs +do (cl-who:htm (:h3 (cl-who:str url) " " (cl-who:fmt "~a" methods)) +(if params (cl-who:htm (:h4 (cl-who:fmt " Params: ~a" params)))) +(:div (cl-who:str docstring))))))) +{# endcomment #} diff --git a/templates/docs.md b/templates/docs.md new file mode 100644 index 0000000..acac3dd --- /dev/null +++ b/templates/docs.md @@ -0,0 +1,41 @@ +{# doc.0: URL; doc.1: Documentation; doc.2: Methods; doc.3: Params; #} +
      +# Project Documentation
      +
      +This page is automatically generated. Sections are organized like so:
      +
      +    * METHOD ROUTE PARAMETERS
      +      DOCSTRING
      +
      +`METHOD` is usually either `GET` or `POST`, but could be any of the
      +[HTTP Methods](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods).
      +
      +The `ROUTE` is the `URI` endpoint on the application, e.g. `/builder`.
      +
      +Each `ROUTE` has `PARAMETERS`. Currently, the parameters are parsed by
      +hand. As the application matures, the parameters will come more into
      +play.
      +
      +The `DOCSTRING` is written by me, the developer, and is intended to
      +provide context on the purpose of the route.
      +
      +The API follows a basic pattern:
      +
      +    GET /<base-page>
      +
      +This will display the main page for the item `<base-page>`.
      +
      +    DELETE /<base-page>
      +    PATCH /<base-page>
      +    POST /<base-page>
      +
      +If `<base-page>` may have an operation done on it (create,
      +retrieve, update, delete some values), there will be a matching method
      +for `DELETE`, `PATCH`, `POST`, etc.
      +
      +# API Index
      +{% for doc in docs %}## {{ doc.2 }} {{ doc.0 }} {{ doc.3 }}
      +{{ doc.1 }}
      +
      +{% endfor %}
      +
      diff --git a/templates/dropdown-js.html b/templates/dropdown-js.html new file mode 100644 index 0000000..25c4146 --- /dev/null +++ b/templates/dropdown-js.html @@ -0,0 +1,9 @@ + diff --git a/templates/file-js.html b/templates/file-js.html new file mode 100644 index 0000000..654e3a5 --- /dev/null +++ b/templates/file-js.html @@ -0,0 +1,11 @@ + diff --git a/templates/footer.html b/templates/footer.html new file mode 100644 index 0000000..dc2d60c --- /dev/null +++ b/templates/footer.html @@ -0,0 +1,14 @@ +
      +
      +
      +

      © 2023

      +
      +
      +
      + {% if git-revision %} +
      +

      {{ git-revision }}

      +
      + {% endif %} +
      +
      diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..ceded0d --- /dev/null +++ b/templates/index.html @@ -0,0 +1,12 @@ +{% extends "layouts/default.html" %} +{% block title %}{_ "Index" _}{% endblock %} +{% block content %} +
      +
      +

      {_ "Welcome to cl-deck-builder2!" _}

      +

      + {_ "Click the links at the top to get started." _} +

      +
      +
      +{% endblock %} diff --git a/templates/inventory/_advanced_search_input.html b/templates/inventory/_advanced_search_input.html new file mode 100644 index 0000000..e90a87f --- /dev/null +++ b/templates/inventory/_advanced_search_input.html @@ -0,0 +1,10 @@ + diff --git a/templates/inventory/_advanced_search_select.html b/templates/inventory/_advanced_search_select.html new file mode 100644 index 0000000..9c721a3 --- /dev/null +++ b/templates/inventory/_advanced_search_select.html @@ -0,0 +1,15 @@ +
      + +
      diff --git a/templates/inventory/_edit_result.html b/templates/inventory/_edit_result.html new file mode 100644 index 0000000..5920e7a --- /dev/null +++ b/templates/inventory/_edit_result.html @@ -0,0 +1,12 @@ + +
      +
      + +
      +
      + diff --git a/templates/inventory/_edit_row.html b/templates/inventory/_edit_row.html new file mode 100644 index 0000000..358afac --- /dev/null +++ b/templates/inventory/_edit_row.html @@ -0,0 +1,10 @@ + + {{ title }} + +
      +
      + +
      +
      + + diff --git a/templates/inventory/_inventory_variants.html b/templates/inventory/_inventory_variants.html new file mode 100644 index 0000000..b6cd1ba --- /dev/null +++ b/templates/inventory/_inventory_variants.html @@ -0,0 +1,10 @@ +{% comment %} +
      + {% for _variant in variants %} +
      + + +
      + {% endfor %} +
      +{% endcomment %} diff --git a/templates/inventory/_new_row.html b/templates/inventory/_new_row.html new file mode 100644 index 0000000..7e3ec88 --- /dev/null +++ b/templates/inventory/_new_row.html @@ -0,0 +1,10 @@ + + {{ title }} + +
      +
      + +
      +
      + + diff --git a/templates/inventory/_search_result_th.html b/templates/inventory/_search_result_th.html new file mode 100644 index 0000000..ba51199 --- /dev/null +++ b/templates/inventory/_search_result_th.html @@ -0,0 +1,13 @@ + +
      +
      + +
      +
      + diff --git a/templates/inventory/_view_result.html b/templates/inventory/_view_result.html new file mode 100644 index 0000000..f525781 --- /dev/null +++ b/templates/inventory/_view_result.html @@ -0,0 +1,3 @@ + + {{ value }} + diff --git a/templates/inventory/advanced-search.html b/templates/inventory/advanced-search.html new file mode 100644 index 0000000..b8abed3 --- /dev/null +++ b/templates/inventory/advanced-search.html @@ -0,0 +1,164 @@ + diff --git a/templates/inventory/base-menu.html b/templates/inventory/base-menu.html new file mode 100644 index 0000000..97956d2 --- /dev/null +++ b/templates/inventory/base-menu.html @@ -0,0 +1,56 @@ +
      +
      + +
      + +
      + +
      + +
      +
      + +
      +
      + + +
      + +
      + + +
      + +
      +
      diff --git a/templates/inventory/edit.html b/templates/inventory/edit.html new file mode 100644 index 0000000..ad670d5 --- /dev/null +++ b/templates/inventory/edit.html @@ -0,0 +1,59 @@ +{% extends "layouts/default.html" %} +{% block title %}Card Editor{% if card %} - {{ card.id }}{% endif %}{% endblock %} +{% block content %} +
      + {{ token | safe }} +
      + +
      + {% if card %} +
      + + +
      + +
      + + + + + + + + + + + + {% include "inventory/_edit_row.html" :form "edit-form" :name "name" :value card.name :title "Product Name" %} + {% include "inventory/_edit_row.html" :form "edit-form" :name "condition" :value card.condition :title "Condition" %} + {% include "inventory/_edit_row.html" :form "edit-form" :name "category" :value card.category :title "Category" %} + {% include "inventory/_edit_row.html" :form "edit-form" :name "name" :value card.name :title "Name" %} + {% include "inventory/_edit_row.html" :form "edit-form" :name "code" :value card.code :title "Code" %} + {% include "inventory/_edit_row.html" :form "edit-form" :name "edition" :value card.edition :title "Edition" %} + {% include "inventory/_edit_row.html" :form "edit-form" :name "passcode" :value card.passcode :title "Passcode" %} + {% include "inventory/_edit_row.html" :form "edit-form" :name "buy-price" :value card.buy-price :title "Buy Price" %} + {% include "inventory/_edit_row.html" :form "edit-form" :name "sell-price" :value card.sell-price :title "Sell Price" %} + {% include "inventory/_edit_row.html" :form "edit-form" :name "total-qty" :value card.total-qty :title "Total Qty" %} + {% include "inventory/_edit_row.html" :form "edit-form" :name "uri" :value card.uri :title "URI" %} + {% include "inventory/_edit_row.html" :form "edit-form" :name "description" :value card.description :title "Description" %} + +
      FieldValue
      Card Image + + Card Image for Yu-Gi-Oh! #{{card.passcode}} - {{card.name}} + +
      +
      + {% else %} +

      Nothing to see here.

      + {% endif %} +
      +{% endblock %} diff --git a/templates/inventory/import.html b/templates/inventory/import.html new file mode 100644 index 0000000..e76c389 --- /dev/null +++ b/templates/inventory/import.html @@ -0,0 +1,34 @@ +{% extends "layouts/default.html" %} +{% block title %}Inventory CSV Import{% endblock %} +{% block content %} +
      + CSV Import +
      + {% for image in files %} +
      + + Icon for {{ image.url }} + +
      + {% if forloop.counter0 == 5 %} +
      +
      + {% endif %} + {% endfor %} +
      +
      +
      + {{ token | safe }} +
      + +
      + +
      +
      +{% endblock %} + + +{% endblock %} diff --git a/templates/inventory/index.html b/templates/inventory/index.html new file mode 100644 index 0000000..4390913 --- /dev/null +++ b/templates/inventory/index.html @@ -0,0 +1,28 @@ +{% extends "layouts/default.html" %} +{% block title %}Inventory List{% endblock %} +{% block content %} +
      + {{ token | safe }} +
      + +
      + {% include "inventory/base-menu.html" %} + +
      + {% include "inventory/search-results.html" %} +
      + +
      + + +
      +{% endblock %} diff --git a/templates/inventory/new.html b/templates/inventory/new.html new file mode 100644 index 0000000..5db4729 --- /dev/null +++ b/templates/inventory/new.html @@ -0,0 +1,48 @@ +{% extends "layouts/default.html" %} +{% block title %}New Inventory Item{% endblock %} +{% block content %} +
      + {{ token | safe }} +
      + +
      +
      + + + Return + +
      + + + + + + + + + + + + + {% include "inventory/_edit_row.html" :form "edit-form" :name "name" :title "Product Name" %} + {% include "inventory/_edit_row.html" :form "edit-form" :name "category" :title "Category" %} + {% include "inventory/_edit_row.html" :form "edit-form" :name "name" :title "Name" %} + {% include "inventory/_edit_row.html" :form "edit-form" :name "code" :title "Code" %} + {% include "inventory/_edit_row.html" :form "edit-form" :name "edition" :title "Edition" %} + {% include "inventory/_edit_row.html" :form "edit-form" :name "passcode" :title "Passcode" %} + {% include "inventory/_edit_row.html" :form "edit-form" :name "buy-price" :title "Buy Price" %} + {% include "inventory/_edit_row.html" :form "edit-form" :name "sell-price" :title "Sell Price" %} + {% include "inventory/_edit_row.html" :form "edit-form" :name "total-qty" :title "Total Qty" %} + {% include "inventory/_edit_row.html" :form "edit-form" :name "uri" :title "URI" %} + {% include "inventory/_edit_row.html" :form "edit-form" :name "description" :title "Description" %} + +
      FieldValue
      Card Image + card image +
      + +
      +{% endblock %} diff --git a/templates/inventory/old.html b/templates/inventory/old.html new file mode 100644 index 0000000..c3b39e5 --- /dev/null +++ b/templates/inventory/old.html @@ -0,0 +1,58 @@ + + + + {% include "inventory/_search_result_th.html" :url "/inventory/search" :target "search-results" :name "Product Name" :sort "product-name" + :class "w3-col m5" %} + {% include "inventory/_search_result_th.html" :url "/inventory/search" :target "search-results" :name "Condition" :sort "condition" + :class "w3-col m1" %} + + {% include "inventory/_search_result_th.html" :url "/inventory/search" :target "search-results" :name "Qty" :sort "qty" + :class "w3-col m1" %} + {% include "inventory/_search_result_th.html" :url "/inventory/search" :target "search-results" :name "Opt. Qty" :sort "opt-qty" + :class "w3-col m1" %} + {% include "inventory/_search_result_th.html" :url "/inventory/search" :target "search-results" :name "Buy Price" :sort "buy-price" + :class "w3-col m1" %} + {% include "inventory/_search_result_th.html" :url "/inventory/search" :target "search-results" :name "Sell Price" :sort "sell-price" + :class "w3-col m1" %} + {% include "inventory/_search_result_th.html" :url "/inventory/search" :target "search-results" :name "Category" :sort "category" + :class "w3-col m1" %} + + + {% for condition in variants %} + + + + {% include "inventory/_view_result.html" :id card.id :name "product-name" :type "text" :value card.product-name + :class "w3-col m5" %} + + {% include "inventory/_view_result.html" :id card.id :name "condition" :type "text" :value condition.name + :class "w3-col m1" %} + + + {% include "inventory/_edit_result.html" :id card.id :name "total-qty" :type "number" :value card.total-qty + :class "w3-col m1" %} + {% include "inventory/_edit_result.html" :id card.id :name "opt-qty" :type "number" :value card.opt-qty + :class "w3-col m1" %} + {% include "inventory/_edit_result.html" :id card.id :name "buy-price" :type "number" :value card.buy-price + :class "w3-col m1" %} + {% include "inventory/_edit_result.html" :id card.id :name "sell-price" :type "number" :value card.sell-price + :class "w3-col m1" %} + {% include "inventory/_view_result.html" :id card.id :name "category" :type "text" :value card.category + :class "w3-col m1" %} + + + {% endfor %} +
      Save
      +
      + + {{ token | safe }} + +
      +
      diff --git a/templates/inventory/search-results.html b/templates/inventory/search-results.html new file mode 100644 index 0000000..7b3e82d --- /dev/null +++ b/templates/inventory/search-results.html @@ -0,0 +1,86 @@ +{% include "pages.html" :form "search-form" :hx-include "[name='search-form']" :hx-target "#search-results" :url "/inventory/search" %} + +{% if cards %} +
      + + + + {% include "inventory/_search_result_th.html" :style "width:100px" :url "/inventory/search" :hx-target "#search-results" :name "Image" :sort "id" %} + {% include "inventory/_search_result_th.html" :url "/inventory/search" :hx-target "#search-results" :name "Product Name" :sort "name" %} + + + {% include "inventory/_search_result_th.html" :style "width:10%" url "/inventory/search" :hx-target "#search-results" :name "Total Qty" :sort "total-qty" %} + {% include "inventory/_search_result_th.html" :style "width:10%" url "/inventory/search" :hx-target "#search-results" :name "Opt. Qty" :sort "opt-qty" %} + {% include "inventory/_search_result_th.html" :style "width:10%" url "/inventory/search" :hx-target "#search-results" :name "Buy Price" :sort "buy-price" %} + {% include "inventory/_search_result_th.html" :style "width:10%" url "/inventory/search" :hx-target "#search-results" :name "Sell Price" :sort "sell-price" %} + {% include "inventory/_search_result_th.html" :style "width:10px" url "/inventory/search" :hx-target "#search-results" :name "URI" :sort "uri" %} + + +
       
      +
      +{% for card in cards %} +
      + + + + + + + {% include "inventory/_view_result.html" :id card.id :name "name" :type "text" :value card.name %} + + + + + {% include "inventory/_edit_result.html" :style "width:10%" :id card.id :name "total-qty" :type "number" :value card.total-qty %} + {% include "inventory/_edit_result.html" :style "width:10%" :id card.id :name "opt-qty" :type "number" :value card.opt-qty %} + {% include "inventory/_edit_result.html" :style "width:10%" :id card.id :name "buy-price" :type "number" :value card.buy-price %} + {% include "inventory/_edit_result.html" :style "width:10%" :id card.id :name "sell-price" :type "number" :value card.sell-price %} + + + +
      + +
      + Card Image for Yu-Gi-Oh! #{{ card.passcode }} - {{ card.name }} +
      +
      +
      + + +
      + + + +
      + {{ token | safe }} + +
      +
      +
      + +{% endfor %} + +{% include "pages.html" :hx-target "#search-results" :url "/inventory/search" :hx-include "[name='search-form']" %} + +
      +

      {{ length }} results. {{ total }} entries in db.

      +
      + +{% else %} +
      +

      Nothing to see here!

      +
      +{% endif %} diff --git a/templates/inventory/variant-results.html b/templates/inventory/variant-results.html new file mode 100644 index 0000000..4043fa0 --- /dev/null +++ b/templates/inventory/variant-results.html @@ -0,0 +1,89 @@ +{% for card in cards %} +
      + {{ token | safe }} +
      +{% endfor %} +
      + + + + + + + + + + + + {% for card in cards %} + + + + + + + + + + + + + + + + {% endfor %} +
      ConditionQtyOpt. QtyBuy PriceSell PriceSave
      {{ card.variant.name }} +
      +
      + +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      + +
      +
      +
      + +
      +
      diff --git a/templates/kde-team.html b/templates/kde-team.html new file mode 100644 index 0000000..f1dbdd6 --- /dev/null +++ b/templates/kde-team.html @@ -0,0 +1,302 @@ +{% extends "layouts/minimal.html" %} +{% block title %}{_ "KDE Team Deck Listing" _}{% endblock %} +{% block content %} + + + + + + + + + +
      + +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + +
      + Please write all card names completely and legibly. +
      + Please include the quantity for each card. +
      First & Middle Name(s):
      Last Name(s):
      CARD GAME ID:
      +
      + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Judge Use Only:MS
      Event Date:MM/DD/YYYY
      Country of Residency:
      Event Name:
      +
      + + +
      + + + + + + + + + + + + + + + +
      E
      + Last Name Initial +
      +  
      +
      +

      Main Deck Total

      +

      {{ main-deck | length }}

      +
      +
      +
      + +
      +
      + + + + + +
      Team Name:
      +
      +
      + + +
      +
      + + + + + {% for (count . card) in monster-cards-rle %} + + + + + {% endfor %} + + + + +
      MONSTER CARDS
      {{ count }}{{ card.name | default:" "| safe }}
      {{ monster-cards | length }}« TOTAL MONSTER CARDS
      +
      +
      + + + + + {% for (count . card) in spell-cards-rle %} + + + + + {% endfor %} + + + + +
      SPELL CARDS
      {{ count }}{{ card.name | default:" "| safe }}
      {{ spell-cards | length }}« TOTAL SPELL CARDS
      +
      +
      + + + + + {% for (count . card) in trap-cards-rle %} + + + + + {% endfor %} + + + + +
      TRAP CARDS
      {{ count }}{{ card.name | default:" "| safe }}
      {{ trap-cards | length }}« TOTAL TRAP CARDS
      +
      +
      + +
      +
      + + + + + {% for (count . card) in side-deck-rle %} + + + + + {% endfor %} + + + + +
      SIDE DECK
      {{ count }}{{ card.name | default:" "| safe }}
      {{ side-deck | length }}« TOTAL SIDE DECK
      +
      +
      + + + + + {% for (count . card) in extra-deck-rle %} + + + + + {% endfor %} + + + + +
      EXTRA DECK
      {{ count }}{{ card.name | default:" "| safe }}
      {{ extra-deck | length }}« TOTAL EXTRA DECK
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + +
      For Judge Use Only
      Deck List Checked?
      Judge InitialsInfraction:
      Description:
      Deck Check Round:
      Judge InitialsInfraction:
      Description:
      Deck Check Round:
      Judge InitialsInfraction:
      Description:
      +
      +
      +
      +
      + +{% endblock %} diff --git a/templates/label-maker.html b/templates/label-maker.html new file mode 100644 index 0000000..d036bf4 --- /dev/null +++ b/templates/label-maker.html @@ -0,0 +1,71 @@ +{% extends "layouts/default.html" %} +{% block title %}{_ "Label Maker" _}{% endblock %} +{% block content %} +
      + {{ token | safe }} +
      + +
      +

      {_ "Label Maker" _}

      + +
      +
      + +
      + +
      +
      +
      +
      + +
      + {% include "file-js.html" :target "#file-js" %} +
      +
      + +
      +
      +
      +
      + +
      +
      +
      +
      + +
      +
      +
      + +
      +
      +
      +
      +
      + +{% endblock %} diff --git a/templates/latex/Avery-5160.tex b/templates/latex/Avery-5160.tex new file mode 100644 index 0000000..1b3a3e9 --- /dev/null +++ b/templates/latex/Avery-5160.tex @@ -0,0 +1,15 @@ +\LabelCols=3 +\LabelRows=10 +% +\LeftPageMargin=0.21975in +\RightPageMargin=0.21975in +\TopPageMargin=0.5in +\BottomPageMargin=0.5in +% +\InterLabelColumn=0.14in % adjust as required +\InterLabelRow=0mm +% +\RightLabelBorder=1mm% adjust to taste +\LeftLabelBorder=1mm +\TopLabelBorder=1mm +\BottomLabelBorder=1mm diff --git a/templates/latex/Avery-5160.tpl.tex b/templates/latex/Avery-5160.tpl.tex new file mode 100644 index 0000000..c96e96d --- /dev/null +++ b/templates/latex/Avery-5160.tpl.tex @@ -0,0 +1,26 @@ +{% extends "latex/default.tpl.tex" %} +{% block content %} +\input{Avery-5160} +% +\numberoflabels=1 +\begin{document} +% +{% for label in labels %} +\genericlabel{\begin{minipage}{2.625in}% adjust as desired + \begin{tabular}{p{0.95\linewidth}}% + {\scriptsize\frenchspacing\righthyphenmin2\sloppy% + {{ label.description | safe }}}% + \end{tabular} + \begin{tabular}{p{0.60\linewidth} p{0.40\linewidth}}% + {\Huge {{ label.price }}} & % + \vspace*{-3ex}% + \begin{tabular}{c}% + {\includegraphics[width=0.75in]{ {{ label.barcode }} }} \vspace*{-1ex} \\% + {\scriptsize\frenchspacing\righthyphenmin2\sloppy% + {{ label.barcode }}}% + \end{tabular}% + \end{tabular}% + \strut\end{minipage}}{% endfor %} +% +\end{document} +{% endblock %} diff --git a/templates/latex/ULINE-S-20247.tex b/templates/latex/ULINE-S-20247.tex new file mode 100644 index 0000000..96ac7ca --- /dev/null +++ b/templates/latex/ULINE-S-20247.tex @@ -0,0 +1,15 @@ +\LabelCols=4 +\LabelRows=8 +% +\LeftPageMargin=0.25in +\RightPageMargin=0.25in +\TopPageMargin=0.5in +\BottomPageMargin=0.5in +% +\InterLabelColumn=0mm% adjust as required +\InterLabelRow=0mm +% +\RightLabelBorder=1mm% adjust to taste +\LeftLabelBorder=1mm +\TopLabelBorder=6mm +\BottomLabelBorder=1mm diff --git a/templates/latex/ULINE-S-20247.tpl.tex b/templates/latex/ULINE-S-20247.tpl.tex new file mode 100644 index 0000000..b8ce7fd --- /dev/null +++ b/templates/latex/ULINE-S-20247.tpl.tex @@ -0,0 +1,26 @@ +{% extends "latex/default.tpl.tex" %} +{% block content %} +\input{ULINE-S-20247} +% +\numberoflabels=1 +\begin{document} +% +{% for label in labels %} +\genericlabel{\begin{minipage}{2in}% adjust as desired + \begin{tabular}{p{0.95\linewidth}}% + {\scriptsize\frenchspacing\righthyphenmin2\sloppy% + {{ label.description | safe }}}% + \end{tabular} + \begin{tabular}{p{0.60\linewidth} p{0.40\linewidth}}% + {\Huge {{ label.price }}} & % + \vspace*{-3ex}% + \begin{tabular}{c}% + {\includegraphics[width=0.75in]{ {{ label.barcode }} }} \vspace*{-1ex} \\% + {\scriptsize\frenchspacing\righthyphenmin2\sloppy% + {{ label.barcode }}}% + \end{tabular}% + \end{tabular}% + \strut\end{minipage}}{% endfor %} +% +\end{document} +{% endblock %} diff --git a/templates/latex/default.tpl.tex b/templates/latex/default.tpl.tex new file mode 100644 index 0000000..77749ea --- /dev/null +++ b/templates/latex/default.tpl.tex @@ -0,0 +1,24 @@ +% NOTE: things like two { { Together will cause Djula to explode. +\documentclass{article} +\usepackage{microtype} +\usepackage[american]{babel} +\usepackage[paper=letterpaper,layoutwidth=11in,layoutheight=8.5in,portrait]{geometry} +\usepackage{graphicx} +\usepackage[newdimens]{labels}% let the package do the work... +\usepackage{trimclip} +\usepackage[scaled]{helvet} +\usepackage[T1]{fontenc} +\renewcommand\familydefault{\sfdefault} +\graphicspath{ {./} {/tmp/labels/} } +\setlength{\baselineskip}{0pt} +\setlength{\emergencystretch}{3em} +\setlength{\lineskip}{0pt} +\setlength{\parindent}{0pt} +\setlength{\parskip}{0pt} +\setlength{\tabcolsep}{0pt} +\makeatletter +\def\input@path{ {/home/quicklisp/quicklisp/local-projects/cl-deck-builder2/templates/latex/}% + {/home/user/code/cl-deck-builder2/templates/latex/}} +%or: \def\input@path{ {/path/to/folder/}{/path/to/other/folder/}} +\makeatother +{% block content %}{% endblock %} diff --git a/templates/layouts/default.html b/templates/layouts/default.html new file mode 100644 index 0000000..a724091 --- /dev/null +++ b/templates/layouts/default.html @@ -0,0 +1,19 @@ + + + + {% include "layouts/html-head.html" %} + {% block title %}{% endblock %} + + + {% include "navbar.html" %} +
      + + + {% include "messages.html" %} + + + {% block content %}{% endblock %} +
      + {% include "footer.html" %} + + diff --git a/templates/layouts/html-head.html b/templates/layouts/html-head.html new file mode 100644 index 0000000..b39726e --- /dev/null +++ b/templates/layouts/html-head.html @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/layouts/minimal.html b/templates/layouts/minimal.html new file mode 100644 index 0000000..fe6e551 --- /dev/null +++ b/templates/layouts/minimal.html @@ -0,0 +1,10 @@ + + + + {% include "layouts/html-head.html" %} + {% block title %}{% endblock %} + + + {% block content %}{% endblock %} + + diff --git a/templates/markdown.html b/templates/markdown.html new file mode 100644 index 0000000..56f3596 --- /dev/null +++ b/templates/markdown.html @@ -0,0 +1,13 @@ +{% extends "layouts/default.html" %} +{% block title %}{{ title }}{% endblock %} +{% block content %} +
      + {% if title %} +

      {{ title }}

      + {% endif %} + {% if subtitle %} +

      {{ subtitle }}

      + {% endif %} + {{ html | safe }} +
      +{% endblock %} diff --git a/templates/messages.html b/templates/messages.html new file mode 100644 index 0000000..9582e08 --- /dev/null +++ b/templates/messages.html @@ -0,0 +1,13 @@ +
      + {% for message in messages %} +
      +
      +

      {{ message.title }}

      +
      +
      + {{ message.body | safe }} +
      +
      + {% endfor %} +
      diff --git a/templates/navbar-js.html b/templates/navbar-js.html new file mode 100644 index 0000000..aaefe59 --- /dev/null +++ b/templates/navbar-js.html @@ -0,0 +1,10 @@ + diff --git a/templates/navbar.html b/templates/navbar.html new file mode 100644 index 0000000..09661c3 --- /dev/null +++ b/templates/navbar.html @@ -0,0 +1,85 @@ +{% include "navbar-js.html" %} + diff --git a/templates/news.html b/templates/news.html new file mode 100644 index 0000000..6474392 --- /dev/null +++ b/templates/news.html @@ -0,0 +1,32 @@ +{% extends "layouts/default.html" %} +{% block title %}cl-deck-builder2 News{% endblock %} +{% block content %} +
      +

      + Recent Changes +

      + {% for message in git-log %} +
      +
      + {{ message.subject }} + + + {{ message.commit }} + + + + + +
      + +
      + {% if message.message %} +
      {{ message.message }}
      + {% endif %} +
      + {{ message.date }} +
      +
      + {% endfor %} +
      +{% endblock %} diff --git a/templates/offline.html b/templates/offline.html new file mode 100644 index 0000000..c78800f --- /dev/null +++ b/templates/offline.html @@ -0,0 +1 @@ +

      Offline

      diff --git a/templates/pages.html b/templates/pages.html new file mode 100644 index 0000000..ad8a062 --- /dev/null +++ b/templates/pages.html @@ -0,0 +1,27 @@ +{% if pages %} + +{% endif %} diff --git a/templates/qr.html b/templates/qr.html new file mode 100644 index 0000000..9d46ba8 --- /dev/null +++ b/templates/qr.html @@ -0,0 +1,154 @@ +{% extends "layouts/default.html" %} +{% block title %}{_ "QR Code Generator" _}{% endblock %} +{% block content %} +
      + {{ token | safe }} +
      + +
      +

      QR Generator

      + +
      +
      + +
      + +
      + +
      +
      + + +
      + +
      +
      + +
      +
      + +
      +
      +
      +
      + + +
      +
      + +
      +
      + +
      +
      +
      +
      + + +
      +
      + +
      + +
      +
      +
      + + +
      +
      + +
      + +
      +
      +
      +
      + + +
      +
      + +
      +
      + +
      + +
      +
      + Helpful Links: +
      + +
      +
      + + +
      +
      +
      +
      + QR Code +
      +
      +
      +
      +
      +
      +{% endblock %} diff --git a/templates/tabs-js.html b/templates/tabs-js.html new file mode 100644 index 0000000..dfd50dd --- /dev/null +++ b/templates/tabs-js.html @@ -0,0 +1,15 @@ + diff --git a/templates/tinymce-js.html b/templates/tinymce-js.html new file mode 100644 index 0000000..90b55ec --- /dev/null +++ b/templates/tinymce-js.html @@ -0,0 +1,40 @@ + + diff --git a/templates/tinymce/index.html b/templates/tinymce/index.html new file mode 100644 index 0000000..46cf82a --- /dev/null +++ b/templates/tinymce/index.html @@ -0,0 +1,69 @@ +{% extends "layouts/default.html" %} +{% block title %}TinyMCE{% endblock %} +{% block content %} +
      +
      + + {{ token | safe }} +
      +
      +

      TinyMCE

      +
      +
      +
      +
      + +
      +
      +
      +
      + +
      +
      + +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      + + +{% endblock %} diff --git a/templates/upload.html b/templates/upload.html new file mode 100644 index 0000000..8866337 --- /dev/null +++ b/templates/upload.html @@ -0,0 +1,88 @@ +{% extends "layouts/default.html" %} +{% block title %}{_ "File Uploader" _}{% endblock %} +{% block content %} +
      + {{ token | safe }} + +
      + +
      + {% if files %} +

      Files

      +
      + {% for image in files %} +
      +
      +
      +
      +
      +

      + + + +

      +
      +
      +
      +

      File Key: {{ image.attachment.file-key }}

      +

      File Size: {{ image.attachment.file-size }}

      +
      +
      +
      + +
      +
      +
      +
      +
      + {% endfor %} +
      + +
      + {% endif %} + +
      +
      +
      +
      +
      + +
      + {% include "file-js.html" :target "#file-js" %} +
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      + +{% endblock %} diff --git a/templates/user/admin.html b/templates/user/admin.html new file mode 100644 index 0000000..3d9d88f --- /dev/null +++ b/templates/user/admin.html @@ -0,0 +1,48 @@ +{% extends "layouts/default.html" %} +{% block title %}{_ "User Admin Panel" _}{% endblock %} +{% block content %} + +{% include "user/user-menu-bar.html" %} + +
      +
      + + + + + + + + + + + + {% for user in user-list %} + + + + + + + + {% endfor %} + +
      IDNameEmailRolesDelete
      {{ user.id }}{{ user.name }}{{ user.email }}
      +
      +
      + {{ token | safe }} + + + +
      +
      +
      +
      +{% endblock %} diff --git a/templates/user/index.html b/templates/user/index.html new file mode 100644 index 0000000..64aa0a7 --- /dev/null +++ b/templates/user/index.html @@ -0,0 +1,23 @@ +{% extends "layouts/default.html" %} +{% block title %}Dashboard{% endblock %} +{% block content %} + +{% include "user/user-menu-bar.html" %} + +
      + {% if session.username %} +
      +
      + You are logged in. +
      +
      + {% endif %} + +
      + Session Info +
      {% for (key . value) in session %}{{ key }} . {{ value }}
      +{% endfor %}
      +
      + +
      +{% endblock %} diff --git a/templates/user/login.html b/templates/user/login.html new file mode 100644 index 0000000..e982f09 --- /dev/null +++ b/templates/user/login.html @@ -0,0 +1,78 @@ +{% extends "layouts/minimal.html" %} +{% block title %}{_ "Login" _}{% endblock %} +{% block content %} + + + +
      + {{ token | safe }} +
      + +
      +
      +
      +
      +
      + {% include "messages.html" %} +
      +
      +
      +
      + +
      + + + + +
      +
      +
      + +
      + + + + +
      +
      +
      +
      + +
      +
      + +
      + +
      + +
      + +
      + Register +
      +
      +
      +
      +
      +
      +
      +{% endblock %} diff --git a/templates/user/register.html b/templates/user/register.html new file mode 100644 index 0000000..c0e0fe2 --- /dev/null +++ b/templates/user/register.html @@ -0,0 +1,85 @@ +{% extends "layouts/minimal.html" %} +{% block title %}{_ "Register" _}{% endblock %} +{% block content %} + + + +
      + {{ token | safe }} +
      + +
      +
      +
      +
      +
      + {% include "messages.html" %} +
      +
      +
      +
      + +
      + + + + +
      +
      +
      + +
      + + + + +
      +
      +
      + +
      + + + + +
      +
      +
      + +
      + +
      + +
      + +
      + +
      + Login +
      +
      +
      +
      +
      +
      +
      +{% endblock %} diff --git a/templates/user/user-menu-bar.html b/templates/user/user-menu-bar.html new file mode 100644 index 0000000..8a19b20 --- /dev/null +++ b/templates/user/user-menu-bar.html @@ -0,0 +1,14 @@ +
      + +
      diff --git a/templates/workbench/docs.html b/templates/workbench/docs.html new file mode 100644 index 0000000..f665f21 --- /dev/null +++ b/templates/workbench/docs.html @@ -0,0 +1,44 @@ +{% extends "layouts/default.html" %} +{% block title %}Package Documentation{% endblock %} +{% block content %} +
      +
      + + + + + + + {% for doc in docs %} + + + + + + {% endfor %} +
      Endpoint/URL (method)ParametersDocumentation
      {{ doc.0 }} {{ doc.2 }} + {% if doc.3 %} +
      +
      {{ doc.3 }}
      +
      + {% endif %} +
      + {% if doc.1 %} +
      +
      {{ doc.1 }}
      +
      + {% endif %} +
      +
      +
      +{% endblock %} +{# comment #} +(cl-who:with-html-output-to-string (s nil :prologue t) +(:html +(:head) +(:body +(loop for (url docstring methods params) in docs +do (cl-who:htm (:h3 (cl-who:str url) " " (cl-who:fmt "~a" methods)) +(if params (cl-who:htm (:h4 (cl-who:fmt " Params: ~a" params)))) +(:div (cl-who:str docstring))))))) +{# endcomment #} diff --git a/templates/workbench/dropdown.html b/templates/workbench/dropdown.html new file mode 100644 index 0000000..b428b71 --- /dev/null +++ b/templates/workbench/dropdown.html @@ -0,0 +1,36 @@ +{% extends "layouts/minimal.html" %} +{% block title %}{_ "Dropdown" _}{% endblock %} +{% block content %} + +{% include "dropdown-js.html" :class ".dropdown" %} + +
      +
      +
      +
      + +
      +
      +
      +
      + +{% endblock %} diff --git a/templates/workbench/pure.html b/templates/workbench/pure.html new file mode 100644 index 0000000..2fc3a71 --- /dev/null +++ b/templates/workbench/pure.html @@ -0,0 +1,44 @@ +{% extends "layouts/minimal.html" %} +{% block title %}{_ "Workbench" _}{% endblock %} +{% block content %} + + +
      +
      +

      + Pure CSS Gradient Background Animation +

      +

      + + Pen by Manuel Pinto + +

      +

      + + Source Code + +

      +
      +
      +{% endblock %} diff --git a/templates/workbench/table.html b/templates/workbench/table.html new file mode 100644 index 0000000..9c1a9a4 --- /dev/null +++ b/templates/workbench/table.html @@ -0,0 +1,6 @@ +{% extends "layouts/minimal.html" %} +{% block title %}{_ "Workbench" _}{% endblock %} +{% block content %} + + +{% endblock %} diff --git a/templates/workbench/tabs.html b/templates/workbench/tabs.html new file mode 100644 index 0000000..0455373 --- /dev/null +++ b/templates/workbench/tabs.html @@ -0,0 +1,46 @@ +{% extends "layouts/minimal.html" %} +{% block title %}{_ "Tabs" _}{% endblock %} +{% block content %} + +{% include "tabs-js.html" %} + +
      +
      +
      +

      + JS for Bulma Tabs +

      +
      +
      + +
      + +
      +
      + +
      +
      +

      + test1
      + Overview Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.

      +
      + + +
      +{% endblock %} diff --git a/templates/workbench/template.Dockerfile b/templates/workbench/template.Dockerfile new file mode 100644 index 0000000..98317c6 --- /dev/null +++ b/templates/workbench/template.Dockerfile @@ -0,0 +1,19 @@ +{% if args %} +ARG{% for arg in args %} arg{% endfor %} +{% endif %} +FROM {{ platform }} {{ image }} +RUN {{ apt }} {{ update }} +{% for pkg in packages %}RUN {{ apt }} {{ install }} {{ pkg }} +{% endfor %} +{% if workdir %}WORKDIR {{ workdir }} +{% endif %} +{% for command in pre-commands %}RUN {{ command | safe }} +{% endfor %} +COPY {{ chown }} {{ src }} {{ dst }} +{% for command in post-commands %}RUN {{ command | safe }} +{% endfor %} +{% if expose %}EXPOSE{% for arg in expose %} arg{% endfor %} +{% endif %} +{% if user %}USER user +{% endif %} +CMD {{ cmd | safe }} diff --git a/templates/workbench/test-1.html b/templates/workbench/test-1.html new file mode 100644 index 0000000..cc88735 --- /dev/null +++ b/templates/workbench/test-1.html @@ -0,0 +1,16 @@ +{% if parsed %} +
      +{{ parsed }} +
      +{% else %} +
      +
      + + + + + + +
      +
      +{% endif %} diff --git a/templates/workbench/test.html b/templates/workbench/test.html new file mode 100644 index 0000000..a3a0ec2 --- /dev/null +++ b/templates/workbench/test.html @@ -0,0 +1,5 @@ +{% extends "layouts/minimal.html" %} +{% block title %}{_ "Workbench" _}{% endblock %} +{% block content %} +{% include "workbench/test-1.html" %} +{% endblock %} diff --git a/templates/ydk/index.html b/templates/ydk/index.html new file mode 100644 index 0000000..84a481a --- /dev/null +++ b/templates/ydk/index.html @@ -0,0 +1,85 @@ +{% extends "layouts/default.html" %} +{% block title %}YDK Upload{% endblock %} +{% block content %} +
      + {{ token | safe }} + +
      + +
      +

      YDK Uploader

      +

      + Upload deck text or file +

      + +
      +
      +
      + +
      + +
      +
      + +
      + +
      + +
      +
      +
      + +
      OR
      + +
      +
      +
      +
      +
      + +
      + {% include "file-js.html" :target "#file-js" %} +
      +
      +
      +
      +
      + +
      + +
      +
      +
      +
      + +
      +
      +
      +
      +
      + +{% endblock %} diff --git a/tests/cl-deck-builder2.lisp b/tests/cl-deck-builder2.lisp new file mode 100644 index 0000000..6f665ec --- /dev/null +++ b/tests/cl-deck-builder2.lisp @@ -0,0 +1,25 @@ +#| + +tests/cl-deck-builder2.lisp + +Main Test Entry Point + +|# + +(in-package :cl-deck-builder2-test) + +(deftest cl-deck-builder2-test-suite + (testing "Test Suite Is Online" + (ok (= 1 1)))) + +(deftest cl-deck-builder2.toolkit.money + (let ((+currency+ '(0.01 0.91 1.91 16.60 99.999)) + (+currency-expect-deflate+ '(1 91 191 1660 10000)) + (+currency-expect-inflate+ '("0.01" "0.91" "1.91" "16.60" "100.00"))) + (testing "currency-deflate" + (ok + (equal +currency-expect-deflate+ + (mapcar #'currency-deflate +currency+)))) + (testing "currency-inflate" + (ok (equal +currency-expect-inflate+ + (mapcar (alexandria:compose #'currency-inflate #'currency-deflate) +currency+)))))) diff --git a/tests/crystal-commerce.lisp b/tests/crystal-commerce.lisp new file mode 100644 index 0000000..10cb7ba --- /dev/null +++ b/tests/crystal-commerce.lisp @@ -0,0 +1,32 @@ +(in-package #:cl-deck-builder2-test) + +;; (with-connection +;; (db) +;; (retrieve-all +;; (select (:product-name :buy-price :sell-price) +;; (from :crystal-commerce) +;; (order-by (:desc (:cast (:as :buy-price :integer)))) +;; (limit 10)))) + +(defun fix-null-passcodes () + (with-connection + (db) + (let ((null-passcode-lst + (retrieve-all + (select :* + (from :crystal-commerce) + (where (:is-null :passcode)))))) + (dolist (itm null-passcode-lst) + (let* ((code (getf itm :code)) + (result (retrieve-one + (select :* + (from :ygoprodeck-card-sets) + (where (:= :code code)))))) + (format t "~A: ~A~%" (getf itm :product-name) result)))))) + + (if result + (progn + (setf (getf itm :passcode) (getf result :passcode)) + (cc-item-update + (apply #'make-cc-item itm)))))) + ))) diff --git a/tests/import.lisp b/tests/import.lisp new file mode 100644 index 0000000..f29839e --- /dev/null +++ b/tests/import.lisp @@ -0,0 +1,11 @@ +(in-package :cl-deck-builder2-test) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; CSV/JSON Importing Tests + +;; (cl-deck-builder2.models::drop-table-ygoprodeck-data) +;; (cl-deck-builder2.models::create-table-ygoprodeck-data) +;; (cl-deck-builder2.models::json-import-ygoprodeck +;; #P"~/quicklisp/local-projects/cl-deck-builder2/data/ygoprodeck/cardinfo.json") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/tests/models/labels.lisp b/tests/models/labels.lisp new file mode 100644 index 0000000..5cd2396 --- /dev/null +++ b/tests/models/labels.lisp @@ -0,0 +1,4 @@ +(in-package #:cl-deck-builder2-test) + +(is (latex-escape "testing -- #1 -- & \\2 -- ^3 -- _4 \\5 ~6") + "testing -- \\#1 -- \\& $\\backslash$2 -- \\^{}3 -- \\_4 \\5 \\texttt{\\~{}}6") diff --git a/tests/models/ygo-import.lisp b/tests/models/ygo-import.lisp new file mode 100644 index 0000000..773a933 --- /dev/null +++ b/tests/models/ygo-import.lisp @@ -0,0 +1,20 @@ +(in-package #:cl-deck-builder2-test) + +(defun ensure-unique (class field) + "The idea is to select COUNT(*) and then GROUP BY (field) and see if +the number of entries returned is the same." + (let ((count-1 + (with-datafly-transaction (db) + (datafly:retrieve-one + (sxql:select ((:as (:count :id) :count)) + (sxql:from + (sxql:make-sql-symbol (mito.class:table-name (find-class class)))))))) + (count-2 + (with-datafly-transaction (db) + (datafly:retrieve-one + (sxql:select ((:as (:count :id) :count)) + (sxql:from + (sxql:make-sql-symbol (mito.class:table-name (find-class class)))) + (sxql:group-by field)))))) + (eq (getf count-1 :count) + (getf count-2 :count)))) diff --git a/tests/packages.lisp b/tests/packages.lisp new file mode 100644 index 0000000..486a948 --- /dev/null +++ b/tests/packages.lisp @@ -0,0 +1,20 @@ +#| + +tests/packages.lisp + +Test Packages + +|# + +(in-package #:cl-user) + +(defpackage #:cl-deck-builder2-test + (:use #:cl + #:rove + #:cl-deck-builder2.models + #:cl-deck-builder2.toolkit) + (:import-from #:cl-deck-builder2.db + #:db + #:with-connection)) + +(in-package #:cl-deck-builder2-test) diff --git a/tests/toolkit.lisp b/tests/toolkit.lisp new file mode 100644 index 0000000..458f676 --- /dev/null +++ b/tests/toolkit.lisp @@ -0,0 +1,107 @@ +;;;; tests/toolkit.lisp + +;; Toolkit Tests +;; +;; TODO I thought after not looking at this file that it was a toolkit +;; *for* tests. Maybe I should rename the tests? + +(in-package #:cl-deck-builder2-test) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(is (grouped (loop for _ upto 10 collect _) 10) + '((0 1 2 3 4 5 6 7 8 9) (10))) + +(is (grouped (loop for _ upto 10 collect _) 3) + '((0 1 2) (3 4 5) (6 7 8) (9 10))) + +(is (grouped (loop for _ upto 10 collect _) 1) + '((0) (1) (2) (3) (4) (5) (6) (7) (8) (9) (10))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(is (normalize-newlines (format nil "as~%df")) + (format nil "as~%df")) + +(is (normalize-newlines (format nil "as~C~%df" #\Return)) + (format nil "as~%df")) + +(is (normalize-newlines (format nil "as~Cdf~C~C" #\Return #\Return #\Newline)) + (format nil "as~%df~%")) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Test removal of UTF8 BOMs +;; +;; TODO Surely there has got to be a better way to handle this. +(defparameter *utf8-bom* + (flexi-streams:octets-to-string #(239 187 191) + :external-format :utf-8)) + +(is (strip-bom (format nil "~aTest!" *utf8-bom*)) + "Test!") + +(is (normalize-newlines + (strip-bom + (format nil "~aTest!~C~%" *utf8-bom* #\Return))) + (format nil "Test!~%")) + +(is (strip-bom + (normalize-newlines + (format nil "~aTest!~C~%" *utf8-bom* #\Return))) + (format nil "Test!~%")) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(is (query-param nil nil) nil) + +(is (query-param nil nil) nil) + +(is (query-param "name" '(("name" . "user"))) + "user") + +;; QUERY-PARAM always returns a string +(is (query-param "name" '(("name" . "15"))) + "15") + +;; Empty string is the same as not passing a value / unset +;; +;; TODO Surely there has got to be a better way to handle this. +(is (query-param "name" '(("name" . ""))) + nil) + +(is (query-param "name" '(("name" . ""))) + nil) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; No results, no offset, LIMIT 1 +(is (generate-pages 0 0 1) + '((:id 0 :offset 0))) + +;; No results, OFFSET 10, LIMIT 10 +(is (generate-pages 0 10 10) + '((:id 0 :offset 0))) + +;; One result, OFFSET 10, LIMIT 10 +;; +;; TODO I generate one extra page. Maybe don't? +(is (generate-pages 1 10 10) + '((:id 0 :offset 0) + (:id 1 :offset 10))) + +;; Ten results, OFFSET 10, LIMIT 10 +;; +(is (generate-pages 10 10 10) + '((:id 0 :offset 0) + (:id 1 :offset 10))) + +;; One hundred reults, OFFSET 100, LIMIT 10 +;; +;; So we show a lot of extra pages here. If there are 100 results and +;; OFFSET 100 items into our 10 per page list, we should start at page +;; 5 and go up to page 10. But this returns out to page 13. +(is (generate-pages 100 100 10) + '((:id 5 :offset 50) (:id 6 :offset 60) (:id 7 :offset 70) + (:id 8 :offset 80) (:id 9 :offset 90) (:id 10 :offset 100) + (:id 11 :offset 110) (:id 12 :offset 120) (:id 13 :offset 130))) + +(is (get-opposite-direction "asc") "desc") +(is (get-opposite-direction "desc") "asc") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/tests/user.lisp b/tests/user.lisp new file mode 100644 index 0000000..f19410f --- /dev/null +++ b/tests/user.lisp @@ -0,0 +1,63 @@ +;;;; tests/users.lisp + +(in-package :cl-deck-builder2-test) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; USER Tests + +;; (defparameter *user* +;; (make-user :username "batman" :password "robin")) + +;; So much to be done. +;; TODO test find-user +;; TODO test list-users +;; TODO test sxql create drop alter table +;; TODO test csv-import +;; TODO test card merging +;; TODO test card modification +;; TODO test card diff + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defparameter *user-names* + '("Mary" "John" "Joseph" "James" "Jordan" "Armaan" "Amaranth" "Sheldon" + "Amy" "Lisa" "Bart" "Homer" "Sheila" "Tony Hawk" "Blanket" + "Michael Jackson" "Gary" "Spongebob" "Squidward" "Tentacles" "Anime" + "BLT" "Subway" "Shiitake" "Psilocybin" "Psilocilin" "Magician" + "Dark Magician" "Dark Magician of Chaos" "Buster Blader" + "M. Night Shamalyan" "Drake" "Josh" "Meghan")) + +(defparameter *user-emails* + '("email@example.com" + "yahoo@gmail.com" + "fake@email.com" + "nope@nobody.net" + "install@gentoo.org" + "smartypants@uni.edu" + "FBI@CIA.GOV")) + +(defun populate-table-users () + (user-table-ensure-exists) + + (dolist (user-name *user-names*) + (user-create + :username user-name + :password "a" + :email (alexandria:random-elt *user-emails*)))) + +(defparameter *user* (make-instance 'user + :username (alexandria:random-elt *user-names*) + :password "test" + :email (alexandria:random-elt *user-emails*))) + +(is (member (user-username-of *user*) *user-emails* :test #'string=) + t) + +;; (is (user-valid-p *user*) t) + +;; (is (user-password-of *user*) "test") + +;; (user-hash-password *user*) + +;; ISNT? As in, "is not"? Maybe there's a better way to do this. I'd +;; like to check if the string starts with PKBDF whatever nonsense. +(isnt (user-password-of *user*) "test") diff --git a/tests/ydk.lisp b/tests/ydk.lisp new file mode 100644 index 0000000..52ca612 --- /dev/null +++ b/tests/ydk.lisp @@ -0,0 +1,22 @@ +;;;; tests/ydk.lisp + +(in-package :cl-deck-builder2-test) + +;; blah blah blah. + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; YDK Tests + +;; (format t "~A" +;; (ydk-read +;; (asdf:system-relative-pathname :cl-deck-builder2 +;; #P"data/OG_bechi_21-Chaos Turbo.ydk"))) + +;; (defparameter *ydk* +;; (cl-deck-builder2.models.ydk::read-ydk-as-model +;; (asdf:system-relative-pathname :cl-deck-builder2 #P"data/OG_bechi_21-Chaos Turbo.ydk"))) + +;; (merge-pathnames (make-pathname :name "04178474" :type "jpg") +;; (asdf:system-relative-pathname :cl-deck-builder2 "static/public/ygoprodeck")) + +;; (defparameter *passcode-list* (cl-deck-builder2.models.ydk::ydk-complete-list *ydk*)) diff --git a/tests/ygoprodeck.lisp b/tests/ygoprodeck.lisp new file mode 100644 index 0000000..42771f9 --- /dev/null +++ b/tests/ygoprodeck.lisp @@ -0,0 +1,3 @@ +;;;; tests/ygoprodeck.lisp + +(in-package :cl-deck-builder2-test)

      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�F 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 literal 0 HcmV?d00001 diff --git a/static/img/noise.png b/static/img/noise.png new file mode 100644 index 0000000000000000000000000000000000000000..c12624a0693d2af001af57e74aa2ace108ec7cf8 GIT binary patch literal 975607 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