diff --git a/app/static/scripts/emoji-picker-element/data.json b/app/static/scripts/emoji-picker-element/data.json new file mode 100644 index 0000000..1dab199 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/data.json @@ -0,0 +1 @@ +[{"shortcodes":["grinning","grinning_face"],"annotation":"grinning face","tags":["face","grin"],"emoji":"๐","order":1,"group":0,"version":1},{"shortcodes":["grinning_face_with_big_eyes","smiley"],"annotation":"grinning face with big eyes","tags":["face","mouth","open","smile"],"emoji":"๐","order":2,"group":0,"version":0.6},{"shortcodes":["grinning_face_with_closed_eyes","smile"],"annotation":"grinning face with smiling eyes","tags":["eye","face","mouth","open","smile"],"emoji":"๐","order":3,"group":0,"version":0.6,"emoticon":":D"},{"shortcodes":["beaming_face","grin"],"annotation":"beaming face with smiling eyes","tags":["eye","face","grin","smile"],"emoji":"๐","order":4,"group":0,"version":0.6},{"shortcodes":["laughing","lol","satisfied","squinting_face"],"annotation":"grinning squinting face","tags":["face","laugh","mouth","satisfied","smile"],"emoji":"๐","order":5,"group":0,"version":0.6,"emoticon":"XD"},{"shortcodes":["grinning_face_with_sweat","sweat_smile"],"annotation":"grinning face with sweat","tags":["cold","face","open","smile","sweat"],"emoji":"๐ ","order":6,"group":0,"version":0.6},{"shortcodes":["rofl"],"annotation":"rolling on the floor laughing","tags":["face","floor","laugh","rofl","rolling","rotfl"],"emoji":"๐คฃ","order":7,"group":0,"version":3,"emoticon":":'D"},{"shortcodes":["joy","lmao","tears_of_joy"],"annotation":"face with tears of joy","tags":["face","joy","laugh","tear"],"emoji":"๐","order":8,"group":0,"version":0.6,"emoticon":":')"},{"shortcodes":["slightly_smiling_face"],"annotation":"slightly smiling face","tags":["face","smile"],"emoji":"๐","order":9,"group":0,"version":1,"emoticon":":)"},{"shortcodes":["upside_down_face"],"annotation":"upside-down face","tags":["face","upside-down"],"emoji":"๐","order":10,"group":0,"version":1},{"shortcodes":["melt","melting_face"],"annotation":"melting face","tags":["disappear","dissolve","liquid","melt"],"emoji":"๐ซ ","order":11,"group":0,"version":14},{"shortcodes":["wink","winking_face"],"annotation":"winking face","tags":["face","wink"],"emoji":"๐","order":12,"group":0,"version":0.6,"emoticon":";)"},{"shortcodes":["blush","smiling_face_with_closed_eyes"],"annotation":"smiling face with smiling eyes","tags":["blush","eye","face","smile"],"emoji":"๐","order":13,"group":0,"version":0.6,"emoticon":":>"},{"shortcodes":["halo","innocent"],"annotation":"smiling face with halo","tags":["angel","face","fantasy","halo","innocent"],"emoji":"๐","order":14,"group":0,"version":1,"emoticon":"O:)"},{"shortcodes":["smiling_face_with_3_hearts"],"annotation":"smiling face with hearts","tags":["adore","crush","hearts","in love"],"emoji":"๐ฅฐ","order":15,"group":0,"version":11},{"shortcodes":["heart_eyes","smiling_face_with_heart_eyes"],"annotation":"smiling face with heart-eyes","tags":["eye","face","love","smile"],"emoji":"๐","order":16,"group":0,"version":0.6},{"shortcodes":["star_struck"],"annotation":"star-struck","tags":["eyes","face","grinning","star"],"emoji":"๐คฉ","order":17,"group":0,"version":5},{"shortcodes":["blowing_a_kiss","kissing_heart"],"annotation":"face blowing a kiss","tags":["face","kiss"],"emoji":"๐","order":18,"group":0,"version":0.6,"emoticon":":X"},{"shortcodes":["kissing","kissing_face"],"annotation":"kissing face","tags":["face","kiss"],"emoji":"๐","order":19,"group":0,"version":1},{"shortcodes":["relaxed","smiling_face"],"annotation":"smiling face","tags":["face","outlined","relaxed","smile"],"emoji":"โบ๏ธ","order":21,"group":0,"version":0.6},{"shortcodes":["kissing_closed_eyes","kissing_face_with_closed_eyes"],"annotation":"kissing face with closed eyes","tags":["closed","eye","face","kiss"],"emoji":"๐","order":22,"group":0,"version":0.6,"emoticon":":*"},{"shortcodes":["kissing_face_with_smiling_eyes","kissing_smiling_eyes"],"annotation":"kissing face with smiling eyes","tags":["eye","face","kiss","smile"],"emoji":"๐","order":23,"group":0,"version":1},{"shortcodes":["smiling_face_with_tear"],"annotation":"smiling face with tear","tags":["grateful","proud","relieved","smiling","tear","touched"],"emoji":"๐ฅฒ","order":24,"group":0,"version":13},{"shortcodes":["savoring_food","yum"],"annotation":"face savoring food","tags":["delicious","face","savouring","smile","yum"],"emoji":"๐","order":25,"group":0,"version":0.6},{"shortcodes":["face_with_tongue","stuck_out_tongue"],"annotation":"face with tongue","tags":["face","tongue"],"emoji":"๐","order":26,"group":0,"version":1,"emoticon":":P"},{"shortcodes":["stuck_out_tongue_winking_eye"],"annotation":"winking face with tongue","tags":["eye","face","joke","tongue","wink"],"emoji":"๐","order":27,"group":0,"version":0.6,"emoticon":";P"},{"shortcodes":["zany","zany_face"],"annotation":"zany face","tags":["eye","goofy","large","small"],"emoji":"๐คช","order":28,"group":0,"version":5},{"shortcodes":["stuck_out_tongue_closed_eyes"],"annotation":"squinting face with tongue","tags":["eye","face","horrible","taste","tongue"],"emoji":"๐","order":29,"group":0,"version":0.6,"emoticon":"XP"},{"shortcodes":["money_mouth_face"],"annotation":"money-mouth face","tags":["face","money","mouth"],"emoji":"๐ค","order":30,"group":0,"version":1},{"shortcodes":["hug","hugging","hugging_face"],"annotation":"smiling face with open hands","tags":["face","hug","hugging","open hands","smiling face"],"emoji":"๐ค","order":31,"group":0,"version":1},{"shortcodes":["face_with_hand_over_mouth","hand_over_mouth"],"annotation":"face with hand over mouth","tags":["whoops"],"emoji":"๐คญ","order":32,"group":0,"version":5},{"shortcodes":["face_with_open_eyes_hand_over_mouth","gasp"],"annotation":"face with open eyes and hand over mouth","tags":["amazement","awe","disbelief","embarrass","scared","surprise"],"emoji":"๐ซข","order":33,"group":0,"version":14},{"shortcodes":["face_with_peeking_eye","peek"],"annotation":"face with peeking eye","tags":["captivated","peep","stare"],"emoji":"๐ซฃ","order":34,"group":0,"version":14},{"shortcodes":["shush","shushing_face"],"annotation":"shushing face","tags":["quiet","shush"],"emoji":"๐คซ","order":35,"group":0,"version":5},{"shortcodes":["thinking","thinking_face","wtf"],"annotation":"thinking face","tags":["face","thinking"],"emoji":"๐ค","order":36,"group":0,"version":1,"emoticon":":L"},{"shortcodes":["salute","saluting_face"],"annotation":"saluting face","tags":["ok","salute","sunny","troops","yes"],"emoji":"๐ซก","order":37,"group":0,"version":14},{"shortcodes":["zipper_mouth","zipper_mouth_face"],"annotation":"zipper-mouth face","tags":["face","mouth","zipper"],"emoji":"๐ค","order":38,"group":0,"version":1,"emoticon":":Z"},{"shortcodes":["face_with_raised_eyebrow","raised_eyebrow"],"annotation":"face with raised eyebrow","tags":["distrust","skeptic"],"emoji":"๐คจ","order":39,"group":0,"version":5},{"shortcodes":["neutral","neutral_face"],"annotation":"neutral face","tags":["deadpan","face","meh","neutral"],"emoji":"๐๏ธ","order":40,"group":0,"version":0.7,"emoticon":":|"},{"shortcodes":["expressionless","expressionless_face"],"annotation":"expressionless face","tags":["expressionless","face","inexpressive","meh","unexpressive"],"emoji":"๐","order":41,"group":0,"version":1},{"shortcodes":["no_mouth"],"annotation":"face without mouth","tags":["face","mouth","quiet","silent"],"emoji":"๐ถ","order":42,"group":0,"version":1,"emoticon":":#"},{"shortcodes":["dotted_line_face"],"annotation":"dotted line face","tags":["depressed","disappear","hide","introvert","invisible"],"emoji":"๐ซฅ","order":43,"group":0,"version":14},{"shortcodes":["in_clouds"],"annotation":"face in clouds","tags":["absentminded","face in the fog","head in clouds"],"emoji":"๐ถโ๐ซ๏ธ","order":44,"group":0,"version":13.1},{"shortcodes":["smirk","smirking","smirking_face"],"annotation":"smirking face","tags":["face","smirk"],"emoji":"๐","order":46,"group":0,"version":0.6,"emoticon":":j"},{"shortcodes":["unamused","unamused_face"],"annotation":"unamused face","tags":["face","unamused","unhappy"],"emoji":"๐","order":47,"group":0,"version":0.6,"emoticon":":?"},{"shortcodes":["rolling_eyes"],"annotation":"face with rolling eyes","tags":["eyeroll","eyes","face","rolling"],"emoji":"๐","order":48,"group":0,"version":1},{"shortcodes":["grimacing","grimacing_face"],"annotation":"grimacing face","tags":["face","grimace"],"emoji":"๐ฌ","order":49,"group":0,"version":1,"emoticon":"8D"},{"shortcodes":["exhale","exhaling"],"annotation":"face exhaling","tags":["exhale","gasp","groan","relief","whisper","whistle"],"emoji":"๐ฎโ๐จ","order":50,"group":0,"version":13.1},{"shortcodes":["lying","lying_face"],"annotation":"lying face","tags":["face","lie","pinocchio"],"emoji":"๐คฅ","order":51,"group":0,"version":3},{"shortcodes":["relieved","relieved_face"],"annotation":"relieved face","tags":["face","relieved"],"emoji":"๐","order":52,"group":0,"version":0.6},{"shortcodes":["pensive","pensive_face"],"annotation":"pensive face","tags":["dejected","face","pensive"],"emoji":"๐","order":53,"group":0,"version":0.6},{"shortcodes":["sleepy","sleepy_face"],"annotation":"sleepy face","tags":["face","good night","sleep"],"emoji":"๐ช","order":54,"group":0,"version":0.6},{"shortcodes":["drooling","drooling_face"],"annotation":"drooling face","tags":["drooling","face"],"emoji":"๐คค","order":55,"group":0,"version":3},{"shortcodes":["sleeping","sleeping_face"],"annotation":"sleeping face","tags":["face","good night","sleep","zzz"],"emoji":"๐ด","order":56,"group":0,"version":1},{"shortcodes":["mask","medical_mask"],"annotation":"face with medical mask","tags":["cold","doctor","face","mask","sick"],"emoji":"๐ท","order":57,"group":0,"version":0.6},{"shortcodes":["face_with_thermometer"],"annotation":"face with thermometer","tags":["face","ill","sick","thermometer"],"emoji":"๐ค","order":58,"group":0,"version":1},{"shortcodes":["face_with_head_bandage"],"annotation":"face with head-bandage","tags":["bandage","face","hurt","injury"],"emoji":"๐ค","order":59,"group":0,"version":1},{"shortcodes":["nauseated","nauseated_face"],"annotation":"nauseated face","tags":["face","nauseated","vomit"],"emoji":"๐คข","order":60,"group":0,"version":3,"emoticon":"%("},{"shortcodes":["face_vomiting","vomiting"],"annotation":"face vomiting","tags":["puke","sick","vomit"],"emoji":"๐คฎ","order":61,"group":0,"version":5},{"shortcodes":["sneezing","sneezing_face"],"annotation":"sneezing face","tags":["face","gesundheit","sneeze"],"emoji":"๐คง","order":62,"group":0,"version":3},{"shortcodes":["hot","hot_face"],"annotation":"hot face","tags":["feverish","heat stroke","hot","red-faced","sweating"],"emoji":"๐ฅต","order":63,"group":0,"version":11},{"shortcodes":["cold","cold_face"],"annotation":"cold face","tags":["blue-faced","cold","freezing","frostbite","icicles"],"emoji":"๐ฅถ","order":64,"group":0,"version":11},{"shortcodes":["woozy","woozy_face"],"annotation":"woozy face","tags":["dizzy","intoxicated","tipsy","uneven eyes","wavy mouth"],"emoji":"๐ฅด","order":65,"group":0,"version":11,"emoticon":":&"},{"shortcodes":["dizzy_face","knocked_out"],"annotation":"face with crossed-out eyes","tags":["crossed-out eyes","dead","face","knocked out"],"emoji":"๐ต","order":66,"group":0,"version":0.6,"emoticon":"XO"},{"shortcodes":["dizzy_eyes"],"annotation":"face with spiral eyes","tags":["dizzy","hypnotized","spiral","trouble","whoa"],"emoji":"๐ตโ๐ซ","order":67,"group":0,"version":13.1},{"shortcodes":["exploding_head"],"annotation":"exploding head","tags":["mind blown","shocked"],"emoji":"๐คฏ","order":68,"group":0,"version":5},{"shortcodes":["cowboy","cowboy_face"],"annotation":"cowboy hat face","tags":["cowboy","cowgirl","face","hat"],"emoji":"๐ค ","order":69,"group":0,"version":3},{"shortcodes":["hooray","partying","partying_face"],"annotation":"partying face","tags":["celebration","hat","horn","party"],"emoji":"๐ฅณ","order":70,"group":0,"version":11},{"shortcodes":["disguised","disguised_face"],"annotation":"disguised face","tags":["disguise","face","glasses","incognito","nose"],"emoji":"๐ฅธ","order":71,"group":0,"version":13},{"shortcodes":["smiling_face_with_sunglasses","sunglasses_cool","too_cool"],"annotation":"smiling face with sunglasses","tags":["bright","cool","face","sun","sunglasses"],"emoji":"๐","order":72,"group":0,"version":1,"emoticon":"8)"},{"shortcodes":["nerd","nerd_face"],"annotation":"nerd face","tags":["face","geek","nerd"],"emoji":"๐ค","order":73,"group":0,"version":1,"emoticon":":B"},{"shortcodes":["face_with_monocle"],"annotation":"face with monocle","tags":["face","monocle","stuffy"],"emoji":"๐ง","order":74,"group":0,"version":5},{"shortcodes":["confused","confused_face"],"annotation":"confused face","tags":["confused","face","meh"],"emoji":"๐","order":75,"group":0,"version":1,"emoticon":":/"},{"shortcodes":["face_with_diagonal_mouth"],"annotation":"face with diagonal mouth","tags":["disappointed","meh","skeptical","unsure"],"emoji":"๐ซค","order":76,"group":0,"version":14},{"shortcodes":["worried","worried_face"],"annotation":"worried face","tags":["face","worried"],"emoji":"๐","order":77,"group":0,"version":1},{"shortcodes":["slightly_frowning_face"],"annotation":"slightly frowning face","tags":["face","frown"],"emoji":"๐","order":78,"group":0,"version":1},{"shortcodes":["white_frowning_face"],"annotation":"frowning face","tags":["face","frown"],"emoji":"โน๏ธ","order":80,"group":0,"version":0.7,"emoticon":":("},{"shortcodes":["face_with_open_mouth","open_mouth"],"annotation":"face with open mouth","tags":["face","mouth","open","sympathy"],"emoji":"๐ฎ","order":81,"group":0,"version":1},{"shortcodes":["hushed","hushed_face"],"annotation":"hushed face","tags":["face","hushed","stunned","surprised"],"emoji":"๐ฏ","order":82,"group":0,"version":1},{"shortcodes":["astonished","astonished_face"],"annotation":"astonished face","tags":["astonished","face","shocked","totally"],"emoji":"๐ฒ","order":83,"group":0,"version":0.6,"emoticon":":O"},{"shortcodes":["flushed","flushed_face"],"annotation":"flushed face","tags":["dazed","face","flushed"],"emoji":"๐ณ","order":84,"group":0,"version":0.6,"emoticon":":$"},{"shortcodes":["pleading","pleading_face"],"annotation":"pleading face","tags":["begging","mercy","puppy eyes"],"emoji":"๐ฅบ","order":85,"group":0,"version":11},{"shortcodes":["face_holding_back_tears","watery_eyes"],"annotation":"face holding back tears","tags":["angry","cry","proud","resist","sad"],"emoji":"๐ฅน","order":86,"group":0,"version":14},{"shortcodes":["frowning","frowning_face"],"annotation":"frowning face with open mouth","tags":["face","frown","mouth","open"],"emoji":"๐ฆ","order":87,"group":0,"version":1},{"shortcodes":["anguished","anguished_face"],"annotation":"anguished face","tags":["anguished","face"],"emoji":"๐ง","order":88,"group":0,"version":1,"emoticon":":S"},{"shortcodes":["fearful","fearful_face"],"annotation":"fearful face","tags":["face","fear","fearful","scared"],"emoji":"๐จ","order":89,"group":0,"version":0.6},{"shortcodes":["anxious","anxious_face","cold_sweat"],"annotation":"anxious face with sweat","tags":["blue","cold","face","rushed","sweat"],"emoji":"๐ฐ","order":90,"group":0,"version":0.6},{"shortcodes":["disappointed_relieved","sad_relieved_face"],"annotation":"sad but relieved face","tags":["disappointed","face","relieved","whew"],"emoji":"๐ฅ","order":91,"group":0,"version":0.6},{"shortcodes":["cry","crying_face"],"annotation":"crying face","tags":["cry","face","sad","tear"],"emoji":"๐ข","order":92,"group":0,"version":0.6,"emoticon":":'("},{"shortcodes":["loudly_crying_face","sob"],"annotation":"loudly crying face","tags":["cry","face","sad","sob","tear"],"emoji":"๐ญ","order":93,"group":0,"version":0.6,"emoticon":":'o"},{"shortcodes":["scream","screaming_in_fear"],"annotation":"face screaming in fear","tags":["face","fear","munch","scared","scream"],"emoji":"๐ฑ","order":94,"group":0,"version":0.6,"emoticon":"Dx"},{"shortcodes":["confounded","confounded_face"],"annotation":"confounded face","tags":["confounded","face"],"emoji":"๐","order":95,"group":0,"version":0.6,"emoticon":"X("},{"shortcodes":["persevere","persevering_face"],"annotation":"persevering face","tags":["face","persevere"],"emoji":"๐ฃ","order":96,"group":0,"version":0.6},{"shortcodes":["disappointed","disappointed_face"],"annotation":"disappointed face","tags":["disappointed","face"],"emoji":"๐","order":97,"group":0,"version":0.6},{"shortcodes":["downcast_face","sweat"],"annotation":"downcast face with sweat","tags":["cold","face","sweat"],"emoji":"๐","order":98,"group":0,"version":0.6,"emoticon":":<"},{"shortcodes":["weary","weary_face"],"annotation":"weary face","tags":["face","tired","weary"],"emoji":"๐ฉ","order":99,"group":0,"version":0.6,"emoticon":"D:"},{"shortcodes":["tired","tired_face"],"annotation":"tired face","tags":["face","tired"],"emoji":"๐ซ","order":100,"group":0,"version":0.6,"emoticon":":C"},{"shortcodes":["yawn","yawning","yawning_face"],"annotation":"yawning face","tags":["bored","tired","yawn"],"emoji":"๐ฅฑ","order":101,"group":0,"version":12},{"shortcodes":["nose_steam","triumph"],"annotation":"face with steam from nose","tags":["face","triumph","won"],"emoji":"๐ค","order":102,"group":0,"version":0.6},{"shortcodes":["pout","pouting_face","rage"],"annotation":"enraged face","tags":["angry","enraged","face","mad","pouting","rage","red"],"emoji":"๐ก","order":103,"group":0,"version":0.6,"emoticon":">:/"},{"shortcodes":["angry","angry_face"],"annotation":"angry face","tags":["anger","angry","face","mad"],"emoji":"๐ ","order":104,"group":0,"version":0.6},{"shortcodes":["censored","face_with_symbols_on_mouth"],"annotation":"face with symbols on mouth","tags":["swearing"],"emoji":"๐คฌ","order":105,"group":0,"version":5,"emoticon":":@"},{"shortcodes":["smiling_imp"],"annotation":"smiling face with horns","tags":["face","fairy tale","fantasy","horns","smile"],"emoji":"๐","order":106,"group":0,"version":1,"emoticon":">:)"},{"shortcodes":["angry_imp","imp"],"annotation":"angry face with horns","tags":["demon","devil","face","fantasy","imp"],"emoji":"๐ฟ","order":107,"group":0,"version":0.6,"emoticon":">:("},{"shortcodes":["skull"],"annotation":"skull","tags":["death","face","fairy tale","monster"],"emoji":"๐","order":108,"group":0,"version":0.6},{"shortcodes":["skull_and_crossbones"],"annotation":"skull and crossbones","tags":["crossbones","death","face","monster","skull"],"emoji":"โ ๏ธ","order":110,"group":0,"version":1},{"shortcodes":["poop","shit"],"annotation":"pile of poo","tags":["dung","face","monster","poo","poop"],"emoji":"๐ฉ","order":111,"group":0,"version":0.6},{"shortcodes":["clown","clown_face"],"annotation":"clown face","tags":["clown","face"],"emoji":"๐คก","order":112,"group":0,"version":3},{"shortcodes":["japanese_ogre","ogre"],"annotation":"ogre","tags":["creature","face","fairy tale","fantasy","monster"],"emoji":"๐น","order":113,"group":0,"version":0.6,"emoticon":">0)"},{"shortcodes":["goblin","japanese_goblin"],"annotation":"goblin","tags":["creature","face","fairy tale","fantasy","monster"],"emoji":"๐บ","order":114,"group":0,"version":0.6},{"shortcodes":["ghost"],"annotation":"ghost","tags":["creature","face","fairy tale","fantasy","monster"],"emoji":"๐ป","order":115,"group":0,"version":0.6},{"shortcodes":["alien"],"annotation":"alien","tags":["creature","extraterrestrial","face","fantasy","ufo"],"emoji":"๐ฝ๏ธ","order":116,"group":0,"version":0.6},{"shortcodes":["alien_monster","space_invader"],"annotation":"alien monster","tags":["alien","creature","extraterrestrial","face","monster","ufo"],"emoji":"๐พ","order":117,"group":0,"version":0.6},{"shortcodes":["robot","robot_face"],"annotation":"robot","tags":["face","monster"],"emoji":"๐ค","order":118,"group":0,"version":1},{"shortcodes":["grinning_cat","smiley_cat"],"annotation":"grinning cat","tags":["cat","face","grinning","mouth","open","smile"],"emoji":"๐บ","order":119,"group":0,"version":0.6},{"shortcodes":["grinning_cat_with_closed_eyes","smile_cat"],"annotation":"grinning cat with smiling eyes","tags":["cat","eye","face","grin","smile"],"emoji":"๐ธ","order":120,"group":0,"version":0.6},{"shortcodes":["joy_cat","tears_of_joy_cat"],"annotation":"cat with tears of joy","tags":["cat","face","joy","tear"],"emoji":"๐น","order":121,"group":0,"version":0.6},{"shortcodes":["heart_eyes_cat","smiling_cat_with_heart_eyes"],"annotation":"smiling cat with heart-eyes","tags":["cat","eye","face","heart","love","smile"],"emoji":"๐ป","order":122,"group":0,"version":0.6},{"shortcodes":["smirk_cat","wry_smile_cat"],"annotation":"cat with wry smile","tags":["cat","face","ironic","smile","wry"],"emoji":"๐ผ","order":123,"group":0,"version":0.6},{"shortcodes":["kissing_cat"],"annotation":"kissing cat","tags":["cat","eye","face","kiss"],"emoji":"๐ฝ","order":124,"group":0,"version":0.6,"emoticon":":3"},{"shortcodes":["scream_cat","weary_cat"],"annotation":"weary cat","tags":["cat","face","oh","surprised","weary"],"emoji":"๐","order":125,"group":0,"version":0.6},{"shortcodes":["crying_cat"],"annotation":"crying cat","tags":["cat","cry","face","sad","tear"],"emoji":"๐ฟ","order":126,"group":0,"version":0.6},{"shortcodes":["pouting_cat"],"annotation":"pouting cat","tags":["cat","face","pouting"],"emoji":"๐พ","order":127,"group":0,"version":0.6},{"shortcodes":["see_no_evil"],"annotation":"see-no-evil monkey","tags":["evil","face","forbidden","monkey","see"],"emoji":"๐","order":128,"group":0,"version":0.6},{"shortcodes":["hear_no_evil"],"annotation":"hear-no-evil monkey","tags":["evil","face","forbidden","hear","monkey"],"emoji":"๐","order":129,"group":0,"version":0.6},{"shortcodes":["speak_no_evil"],"annotation":"speak-no-evil monkey","tags":["evil","face","forbidden","monkey","speak"],"emoji":"๐","order":130,"group":0,"version":0.6},{"shortcodes":["kiss"],"annotation":"kiss mark","tags":["kiss","lips"],"emoji":"๐","order":131,"group":0,"version":0.6},{"shortcodes":["love_letter"],"annotation":"love letter","tags":["heart","letter","love","mail"],"emoji":"๐","order":132,"group":0,"version":0.6},{"shortcodes":["cupid","heart_with_arrow"],"annotation":"heart with arrow","tags":["arrow","cupid"],"emoji":"๐","order":133,"group":0,"version":0.6},{"shortcodes":["gift_heart","heart_with_ribbon"],"annotation":"heart with ribbon","tags":["ribbon","valentine"],"emoji":"๐","order":134,"group":0,"version":0.6},{"shortcodes":["sparkling_heart"],"annotation":"sparkling heart","tags":["excited","sparkle"],"emoji":"๐","order":135,"group":0,"version":0.6},{"shortcodes":["growing_heart","heartpulse"],"annotation":"growing heart","tags":["excited","growing","nervous","pulse"],"emoji":"๐","order":136,"group":0,"version":0.6},{"shortcodes":["beating_heart","heartbeat"],"annotation":"beating heart","tags":["beating","heartbeat","pulsating"],"emoji":"๐","order":137,"group":0,"version":0.6},{"shortcodes":["revolving_hearts"],"annotation":"revolving hearts","tags":["revolving"],"emoji":"๐","order":138,"group":0,"version":0.6},{"shortcodes":["two_hearts"],"annotation":"two hearts","tags":["love"],"emoji":"๐","order":139,"group":0,"version":0.6},{"shortcodes":["heart_decoration"],"annotation":"heart decoration","tags":["heart"],"emoji":"๐","order":140,"group":0,"version":0.6},{"shortcodes":["heart_exclamation"],"annotation":"heart exclamation","tags":["exclamation","mark","punctuation"],"emoji":"โฃ๏ธ","order":142,"group":0,"version":1},{"shortcodes":["broken_heart"],"annotation":"broken heart","tags":["break","broken"],"emoji":"๐","order":143,"group":0,"version":0.6,"emoticon":"3"},{"shortcodes":["heart_on_fire"],"annotation":"heart on fire","tags":["burn","heart","love","lust","sacred heart"],"emoji":"โค๏ธโ๐ฅ","order":144,"group":0,"version":13.1},{"shortcodes":["mending_heart"],"annotation":"mending heart","tags":["healthier","improving","mending","recovering","recuperating","well"],"emoji":"โค๏ธโ๐ฉน","order":146,"group":0,"version":13.1},{"shortcodes":["heart","red_heart"],"annotation":"red heart","tags":["heart"],"emoji":"โค๏ธ","order":149,"group":0,"version":0.6,"emoticon":"<3"},{"shortcodes":["orange_heart"],"annotation":"orange heart","tags":["orange"],"emoji":"๐งก","order":150,"group":0,"version":5},{"shortcodes":["yellow_heart"],"annotation":"yellow heart","tags":["yellow"],"emoji":"๐","order":151,"group":0,"version":0.6},{"shortcodes":["green_heart"],"annotation":"green heart","tags":["green"],"emoji":"๐","order":152,"group":0,"version":0.6},{"shortcodes":["blue_heart"],"annotation":"blue heart","tags":["blue"],"emoji":"๐","order":153,"group":0,"version":0.6},{"shortcodes":["purple_heart"],"annotation":"purple heart","tags":["purple"],"emoji":"๐","order":154,"group":0,"version":0.6},{"shortcodes":["brown_heart"],"annotation":"brown heart","tags":["brown","heart"],"emoji":"๐ค","order":155,"group":0,"version":12},{"shortcodes":["black_heart"],"annotation":"black heart","tags":["black","evil","wicked"],"emoji":"๐ค","order":156,"group":0,"version":3},{"shortcodes":["white_heart"],"annotation":"white heart","tags":["heart","white"],"emoji":"๐ค","order":157,"group":0,"version":12},{"shortcodes":["100"],"annotation":"hundred points","tags":["100","full","hundred","score"],"emoji":"๐ฏ","order":158,"group":0,"version":0.6},{"shortcodes":["anger"],"annotation":"anger symbol","tags":["angry","comic","mad"],"emoji":"๐ข","order":159,"group":0,"version":0.6},{"shortcodes":["boom","collision"],"annotation":"collision","tags":["boom","comic"],"emoji":"๐ฅ","order":160,"group":0,"version":0.6},{"shortcodes":["dizzy"],"annotation":"dizzy","tags":["comic","star"],"emoji":"๐ซ","order":161,"group":0,"version":0.6},{"shortcodes":["sweat_drops"],"annotation":"sweat droplets","tags":["comic","splashing","sweat"],"emoji":"๐ฆ","order":162,"group":0,"version":0.6},{"shortcodes":["dash","dashing_away"],"annotation":"dashing away","tags":["comic","dash","running"],"emoji":"๐จ","order":163,"group":0,"version":0.6},{"shortcodes":["hole"],"annotation":"hole","tags":["hole"],"emoji":"๐ณ๏ธ","order":165,"group":0,"version":0.7},{"shortcodes":["bomb"],"annotation":"bomb","tags":["comic"],"emoji":"๐ฃ๏ธ","order":166,"group":0,"version":0.6},{"shortcodes":["speech_balloon"],"annotation":"speech balloon","tags":["balloon","bubble","comic","dialog","speech"],"emoji":"๐ฌ","order":167,"group":0,"version":0.6},{"shortcodes":["eye_in_speech_bubble"],"annotation":"eye in speech bubble","tags":["balloon","bubble","eye","speech","witness"],"emoji":"๐๏ธโ๐จ๏ธ","order":168,"group":0,"version":2},{"shortcodes":["left_speech_bubble"],"annotation":"left speech bubble","tags":["balloon","bubble","dialog","speech"],"emoji":"๐จ๏ธ","order":173,"group":0,"version":2},{"shortcodes":["right_anger_bubble"],"annotation":"right anger bubble","tags":["angry","balloon","bubble","mad"],"emoji":"๐ฏ๏ธ","order":175,"group":0,"version":0.7},{"shortcodes":["thought_balloon"],"annotation":"thought balloon","tags":["balloon","bubble","comic","thought"],"emoji":"๐ญ","order":176,"group":0,"version":1},{"shortcodes":["zzz"],"annotation":"ZZZ","tags":["comic","good night","sleep","zzz"],"emoji":"๐ค","order":177,"group":0,"version":0.6},{"shortcodes":["wave","waving_hand"],"annotation":"waving hand","tags":["hand","wave","waving"],"emoji":"๐","order":178,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["raised_back_of_hand"],"annotation":"raised back of hand","tags":["backhand","raised"],"emoji":"๐ค","order":184,"group":1,"version":3,"skins":[{"emoji":"๐ค๐ป","version":3,"tone":1},{"emoji":"๐ค๐ผ","version":3,"tone":2},{"emoji":"๐ค๐ฝ","version":3,"tone":3},{"emoji":"๐ค๐พ","version":3,"tone":4},{"emoji":"๐ค๐ฟ","version":3,"tone":5}]},{"shortcodes":["raised_hand_with_fingers_splayed"],"annotation":"hand with fingers splayed","tags":["finger","hand","splayed"],"emoji":"๐๏ธ","order":191,"group":1,"version":0.7,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["high_five","raised_hand"],"annotation":"raised hand","tags":["hand","high 5","high five"],"emoji":"โ","order":197,"group":1,"version":0.6,"skins":[{"emoji":"โ๐ป","version":1,"tone":1},{"emoji":"โ๐ผ","version":1,"tone":2},{"emoji":"โ๐ฝ","version":1,"tone":3},{"emoji":"โ๐พ","version":1,"tone":4},{"emoji":"โ๐ฟ","version":1,"tone":5}]},{"shortcodes":["vulcan"],"annotation":"vulcan salute","tags":["finger","hand","spock","vulcan"],"emoji":"๐","order":203,"group":1,"version":1,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["rightwards_hand"],"annotation":"rightwards hand","tags":["hand","right","rightward"],"emoji":"๐ซฑ","order":209,"group":1,"version":14,"skins":[{"emoji":"๐ซฑ๐ป","version":14,"tone":1},{"emoji":"๐ซฑ๐ผ","version":14,"tone":2},{"emoji":"๐ซฑ๐ฝ","version":14,"tone":3},{"emoji":"๐ซฑ๐พ","version":14,"tone":4},{"emoji":"๐ซฑ๐ฟ","version":14,"tone":5}]},{"shortcodes":["leftwards_hand"],"annotation":"leftwards hand","tags":["hand","left","leftward"],"emoji":"๐ซฒ","order":215,"group":1,"version":14,"skins":[{"emoji":"๐ซฒ๐ป","version":14,"tone":1},{"emoji":"๐ซฒ๐ผ","version":14,"tone":2},{"emoji":"๐ซฒ๐ฝ","version":14,"tone":3},{"emoji":"๐ซฒ๐พ","version":14,"tone":4},{"emoji":"๐ซฒ๐ฟ","version":14,"tone":5}]},{"shortcodes":["palm_down"],"annotation":"palm down hand","tags":["dismiss","drop","shoo"],"emoji":"๐ซณ","order":221,"group":1,"version":14,"skins":[{"emoji":"๐ซณ๐ป","version":14,"tone":1},{"emoji":"๐ซณ๐ผ","version":14,"tone":2},{"emoji":"๐ซณ๐ฝ","version":14,"tone":3},{"emoji":"๐ซณ๐พ","version":14,"tone":4},{"emoji":"๐ซณ๐ฟ","version":14,"tone":5}]},{"shortcodes":["palm_up"],"annotation":"palm up hand","tags":["beckon","catch","come","offer"],"emoji":"๐ซด","order":227,"group":1,"version":14,"skins":[{"emoji":"๐ซด๐ป","version":14,"tone":1},{"emoji":"๐ซด๐ผ","version":14,"tone":2},{"emoji":"๐ซด๐ฝ","version":14,"tone":3},{"emoji":"๐ซด๐พ","version":14,"tone":4},{"emoji":"๐ซด๐ฟ","version":14,"tone":5}]},{"shortcodes":["ok_hand"],"annotation":"OK hand","tags":["hand","ok"],"emoji":"๐","order":233,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["pinch","pinched_fingers"],"annotation":"pinched fingers","tags":["fingers","hand gesture","interrogation","pinched","sarcastic"],"emoji":"๐ค","order":239,"group":1,"version":13,"skins":[{"emoji":"๐ค๐ป","version":13,"tone":1},{"emoji":"๐ค๐ผ","version":13,"tone":2},{"emoji":"๐ค๐ฝ","version":13,"tone":3},{"emoji":"๐ค๐พ","version":13,"tone":4},{"emoji":"๐ค๐ฟ","version":13,"tone":5}]},{"shortcodes":["pinching_hand"],"annotation":"pinching hand","tags":["small amount"],"emoji":"๐ค","order":245,"group":1,"version":12,"skins":[{"emoji":"๐ค๐ป","version":12,"tone":1},{"emoji":"๐ค๐ผ","version":12,"tone":2},{"emoji":"๐ค๐ฝ","version":12,"tone":3},{"emoji":"๐ค๐พ","version":12,"tone":4},{"emoji":"๐ค๐ฟ","version":12,"tone":5}]},{"shortcodes":["v","victory"],"annotation":"victory hand","tags":["hand","v","victory"],"emoji":"โ๏ธ","order":252,"group":1,"version":0.6,"skins":[{"emoji":"โ๐ป","version":1,"tone":1},{"emoji":"โ๐ผ","version":1,"tone":2},{"emoji":"โ๐ฝ","version":1,"tone":3},{"emoji":"โ๐พ","version":1,"tone":4},{"emoji":"โ๐ฟ","version":1,"tone":5}]},{"shortcodes":["fingers_crossed"],"annotation":"crossed fingers","tags":["cross","finger","hand","luck"],"emoji":"๐ค","order":258,"group":1,"version":3,"skins":[{"emoji":"๐ค๐ป","version":3,"tone":1},{"emoji":"๐ค๐ผ","version":3,"tone":2},{"emoji":"๐ค๐ฝ","version":3,"tone":3},{"emoji":"๐ค๐พ","version":3,"tone":4},{"emoji":"๐ค๐ฟ","version":3,"tone":5}]},{"shortcodes":["hand_with_index_finger_and_thumb_crossed"],"annotation":"hand with index finger and thumb crossed","tags":["expensive","heart","love","money","snap"],"emoji":"๐ซฐ","order":264,"group":1,"version":14,"skins":[{"emoji":"๐ซฐ๐ป","version":14,"tone":1},{"emoji":"๐ซฐ๐ผ","version":14,"tone":2},{"emoji":"๐ซฐ๐ฝ","version":14,"tone":3},{"emoji":"๐ซฐ๐พ","version":14,"tone":4},{"emoji":"๐ซฐ๐ฟ","version":14,"tone":5}]},{"shortcodes":["love_you_gesture"],"annotation":"love-you gesture","tags":["hand","ily"],"emoji":"๐ค","order":270,"group":1,"version":5,"skins":[{"emoji":"๐ค๐ป","version":5,"tone":1},{"emoji":"๐ค๐ผ","version":5,"tone":2},{"emoji":"๐ค๐ฝ","version":5,"tone":3},{"emoji":"๐ค๐พ","version":5,"tone":4},{"emoji":"๐ค๐ฟ","version":5,"tone":5}]},{"shortcodes":["metal","sign_of_the_horns"],"annotation":"sign of the horns","tags":["finger","hand","horns","rock-on"],"emoji":"๐ค","order":276,"group":1,"version":1,"emoticon":"\\M/","skins":[{"emoji":"๐ค๐ป","version":1,"tone":1},{"emoji":"๐ค๐ผ","version":1,"tone":2},{"emoji":"๐ค๐ฝ","version":1,"tone":3},{"emoji":"๐ค๐พ","version":1,"tone":4},{"emoji":"๐ค๐ฟ","version":1,"tone":5}]},{"shortcodes":["call_me_hand"],"annotation":"call me hand","tags":["call","hand","hang loose","shaka"],"emoji":"๐ค","order":282,"group":1,"version":3,"skins":[{"emoji":"๐ค๐ป","version":3,"tone":1},{"emoji":"๐ค๐ผ","version":3,"tone":2},{"emoji":"๐ค๐ฝ","version":3,"tone":3},{"emoji":"๐ค๐พ","version":3,"tone":4},{"emoji":"๐ค๐ฟ","version":3,"tone":5}]},{"shortcodes":["point_left"],"annotation":"backhand index pointing left","tags":["backhand","finger","hand","index","point"],"emoji":"๐๏ธ","order":288,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["point_right"],"annotation":"backhand index pointing right","tags":["backhand","finger","hand","index","point"],"emoji":"๐๏ธ","order":294,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["point_up"],"annotation":"backhand index pointing up","tags":["backhand","finger","hand","point","up"],"emoji":"๐๏ธ","order":300,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["middle_finger"],"annotation":"middle finger","tags":["finger","hand"],"emoji":"๐","order":306,"group":1,"version":1,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["point_down"],"annotation":"backhand index pointing down","tags":["backhand","down","finger","hand","point"],"emoji":"๐๏ธ","order":312,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["point_up_2"],"annotation":"index pointing up","tags":["finger","hand","index","point","up"],"emoji":"โ๏ธ","order":319,"group":1,"version":0.6,"skins":[{"emoji":"โ๐ป","version":1,"tone":1},{"emoji":"โ๐ผ","version":1,"tone":2},{"emoji":"โ๐ฝ","version":1,"tone":3},{"emoji":"โ๐พ","version":1,"tone":4},{"emoji":"โ๐ฟ","version":1,"tone":5}]},{"shortcodes":["point_forward"],"annotation":"index pointing at the viewer","tags":["point","you"],"emoji":"๐ซต","order":325,"group":1,"version":14,"skins":[{"emoji":"๐ซต๐ป","version":14,"tone":1},{"emoji":"๐ซต๐ผ","version":14,"tone":2},{"emoji":"๐ซต๐ฝ","version":14,"tone":3},{"emoji":"๐ซต๐พ","version":14,"tone":4},{"emoji":"๐ซต๐ฟ","version":14,"tone":5}]},{"shortcodes":["+1","thumbsup","yes"],"annotation":"thumbs up","tags":["+1","hand","thumb","up"],"emoji":"๐๏ธ","order":331,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["-1","no","thumbsdown"],"annotation":"thumbs down","tags":["-1","down","hand","thumb"],"emoji":"๐๏ธ","order":337,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["fist"],"annotation":"raised fist","tags":["clenched","fist","hand","punch"],"emoji":"โ","order":343,"group":1,"version":0.6,"skins":[{"emoji":"โ๐ป","version":1,"tone":1},{"emoji":"โ๐ผ","version":1,"tone":2},{"emoji":"โ๐ฝ","version":1,"tone":3},{"emoji":"โ๐พ","version":1,"tone":4},{"emoji":"โ๐ฟ","version":1,"tone":5}]},{"shortcodes":["punch"],"annotation":"oncoming fist","tags":["clenched","fist","hand","punch"],"emoji":"๐","order":349,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["left_facing_fist"],"annotation":"left-facing fist","tags":["fist","leftwards"],"emoji":"๐ค","order":355,"group":1,"version":3,"skins":[{"emoji":"๐ค๐ป","version":3,"tone":1},{"emoji":"๐ค๐ผ","version":3,"tone":2},{"emoji":"๐ค๐ฝ","version":3,"tone":3},{"emoji":"๐ค๐พ","version":3,"tone":4},{"emoji":"๐ค๐ฟ","version":3,"tone":5}]},{"shortcodes":["right_facing_fist"],"annotation":"right-facing fist","tags":["fist","rightwards"],"emoji":"๐ค","order":361,"group":1,"version":3,"skins":[{"emoji":"๐ค๐ป","version":3,"tone":1},{"emoji":"๐ค๐ผ","version":3,"tone":2},{"emoji":"๐ค๐ฝ","version":3,"tone":3},{"emoji":"๐ค๐พ","version":3,"tone":4},{"emoji":"๐ค๐ฟ","version":3,"tone":5}]},{"shortcodes":["clap","clapping_hands"],"annotation":"clapping hands","tags":["clap","hand"],"emoji":"๐","order":367,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["raised_hands"],"annotation":"raising hands","tags":["celebration","gesture","hand","hooray","raised"],"emoji":"๐","order":373,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["heart_hands"],"annotation":"heart hands","tags":["love"],"emoji":"๐ซถ","order":379,"group":1,"version":14,"skins":[{"emoji":"๐ซถ๐ป","version":14,"tone":1},{"emoji":"๐ซถ๐ผ","version":14,"tone":2},{"emoji":"๐ซถ๐ฝ","version":14,"tone":3},{"emoji":"๐ซถ๐พ","version":14,"tone":4},{"emoji":"๐ซถ๐ฟ","version":14,"tone":5}]},{"shortcodes":["open_hands"],"annotation":"open hands","tags":["hand","open"],"emoji":"๐","order":385,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["palms_up_together"],"annotation":"palms up together","tags":["prayer"],"emoji":"๐คฒ","order":391,"group":1,"version":5,"skins":[{"emoji":"๐คฒ๐ป","version":5,"tone":1},{"emoji":"๐คฒ๐ผ","version":5,"tone":2},{"emoji":"๐คฒ๐ฝ","version":5,"tone":3},{"emoji":"๐คฒ๐พ","version":5,"tone":4},{"emoji":"๐คฒ๐ฟ","version":5,"tone":5}]},{"shortcodes":["handshake"],"annotation":"handshake","tags":["agreement","hand","meeting","shake"],"emoji":"๐ค","order":397,"group":1,"version":3,"skins":[{"emoji":"๐ค๐ป","version":3,"tone":1},{"emoji":"๐ค๐ผ","version":3,"tone":2},{"emoji":"๐ค๐ฝ","version":3,"tone":3},{"emoji":"๐ค๐พ","version":3,"tone":4},{"emoji":"๐ค๐ฟ","version":3,"tone":5},{"emoji":"๐ซฑ๐ปโ๐ซฒ๐ผ","version":14,"tone":[1,2]},{"emoji":"๐ซฑ๐ปโ๐ซฒ๐ฝ","version":14,"tone":[1,3]},{"emoji":"๐ซฑ๐ปโ๐ซฒ๐พ","version":14,"tone":[1,4]},{"emoji":"๐ซฑ๐ปโ๐ซฒ๐ฟ","version":14,"tone":[1,5]},{"emoji":"๐ซฑ๐ผโ๐ซฒ๐ป","version":14,"tone":[2,1]},{"emoji":"๐ซฑ๐ผโ๐ซฒ๐ฝ","version":14,"tone":[2,3]},{"emoji":"๐ซฑ๐ผโ๐ซฒ๐พ","version":14,"tone":[2,4]},{"emoji":"๐ซฑ๐ผโ๐ซฒ๐ฟ","version":14,"tone":[2,5]},{"emoji":"๐ซฑ๐ฝโ๐ซฒ๐ป","version":14,"tone":[3,1]},{"emoji":"๐ซฑ๐ฝโ๐ซฒ๐ผ","version":14,"tone":[3,2]},{"emoji":"๐ซฑ๐ฝโ๐ซฒ๐พ","version":14,"tone":[3,4]},{"emoji":"๐ซฑ๐ฝโ๐ซฒ๐ฟ","version":14,"tone":[3,5]},{"emoji":"๐ซฑ๐พโ๐ซฒ๐ป","version":14,"tone":[4,1]},{"emoji":"๐ซฑ๐พโ๐ซฒ๐ผ","version":14,"tone":[4,2]},{"emoji":"๐ซฑ๐พโ๐ซฒ๐ฝ","version":14,"tone":[4,3]},{"emoji":"๐ซฑ๐พโ๐ซฒ๐ฟ","version":14,"tone":[4,5]},{"emoji":"๐ซฑ๐ฟโ๐ซฒ๐ป","version":14,"tone":[5,1]},{"emoji":"๐ซฑ๐ฟโ๐ซฒ๐ผ","version":14,"tone":[5,2]},{"emoji":"๐ซฑ๐ฟโ๐ซฒ๐ฝ","version":14,"tone":[5,3]},{"emoji":"๐ซฑ๐ฟโ๐ซฒ๐พ","version":14,"tone":[5,4]}]},{"shortcodes":["folded_hands","pray"],"annotation":"folded hands","tags":["ask","hand","high 5","high five","please","pray","thanks"],"emoji":"๐","order":423,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["writing_hand"],"annotation":"writing hand","tags":["hand","write"],"emoji":"โ๏ธ","order":430,"group":1,"version":0.7,"skins":[{"emoji":"โ๐ป","version":1,"tone":1},{"emoji":"โ๐ผ","version":1,"tone":2},{"emoji":"โ๐ฝ","version":1,"tone":3},{"emoji":"โ๐พ","version":1,"tone":4},{"emoji":"โ๐ฟ","version":1,"tone":5}]},{"shortcodes":["nail_care","nail_polish"],"annotation":"nail polish","tags":["care","cosmetics","manicure","nail","polish"],"emoji":"๐ ","order":436,"group":1,"version":0.6,"skins":[{"emoji":"๐ ๐ป","version":1,"tone":1},{"emoji":"๐ ๐ผ","version":1,"tone":2},{"emoji":"๐ ๐ฝ","version":1,"tone":3},{"emoji":"๐ ๐พ","version":1,"tone":4},{"emoji":"๐ ๐ฟ","version":1,"tone":5}]},{"shortcodes":["selfie"],"annotation":"selfie","tags":["camera","phone"],"emoji":"๐คณ","order":442,"group":1,"version":3,"skins":[{"emoji":"๐คณ๐ป","version":3,"tone":1},{"emoji":"๐คณ๐ผ","version":3,"tone":2},{"emoji":"๐คณ๐ฝ","version":3,"tone":3},{"emoji":"๐คณ๐พ","version":3,"tone":4},{"emoji":"๐คณ๐ฟ","version":3,"tone":5}]},{"shortcodes":["muscle","right_bicep"],"annotation":"flexed biceps","tags":["biceps","comic","flex","muscle"],"emoji":"๐ช","order":448,"group":1,"version":0.6,"skins":[{"emoji":"๐ช๐ป","version":1,"tone":1},{"emoji":"๐ช๐ผ","version":1,"tone":2},{"emoji":"๐ช๐ฝ","version":1,"tone":3},{"emoji":"๐ช๐พ","version":1,"tone":4},{"emoji":"๐ช๐ฟ","version":1,"tone":5}]},{"shortcodes":["mechanical_arm"],"annotation":"mechanical arm","tags":["accessibility","prosthetic"],"emoji":"๐ฆพ","order":454,"group":1,"version":12},{"shortcodes":["mechanical_leg"],"annotation":"mechanical leg","tags":["accessibility","prosthetic"],"emoji":"๐ฆฟ","order":455,"group":1,"version":12},{"shortcodes":["leg"],"annotation":"leg","tags":["kick","limb"],"emoji":"๐ฆต","order":456,"group":1,"version":11,"skins":[{"emoji":"๐ฆต๐ป","version":11,"tone":1},{"emoji":"๐ฆต๐ผ","version":11,"tone":2},{"emoji":"๐ฆต๐ฝ","version":11,"tone":3},{"emoji":"๐ฆต๐พ","version":11,"tone":4},{"emoji":"๐ฆต๐ฟ","version":11,"tone":5}]},{"shortcodes":["foot"],"annotation":"foot","tags":["kick","stomp"],"emoji":"๐ฆถ","order":462,"group":1,"version":11,"skins":[{"emoji":"๐ฆถ๐ป","version":11,"tone":1},{"emoji":"๐ฆถ๐ผ","version":11,"tone":2},{"emoji":"๐ฆถ๐ฝ","version":11,"tone":3},{"emoji":"๐ฆถ๐พ","version":11,"tone":4},{"emoji":"๐ฆถ๐ฟ","version":11,"tone":5}]},{"shortcodes":["ear"],"annotation":"ear","tags":["body"],"emoji":"๐๏ธ","order":468,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["ear_with_hearing_aid","hearing_aid"],"annotation":"ear with hearing aid","tags":["accessibility","hard of hearing"],"emoji":"๐ฆป","order":474,"group":1,"version":12,"skins":[{"emoji":"๐ฆป๐ป","version":12,"tone":1},{"emoji":"๐ฆป๐ผ","version":12,"tone":2},{"emoji":"๐ฆป๐ฝ","version":12,"tone":3},{"emoji":"๐ฆป๐พ","version":12,"tone":4},{"emoji":"๐ฆป๐ฟ","version":12,"tone":5}]},{"shortcodes":["nose"],"annotation":"nose","tags":["body"],"emoji":"๐","order":480,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["brain"],"annotation":"brain","tags":["intelligent"],"emoji":"๐ง ","order":486,"group":1,"version":5},{"shortcodes":["anatomical_heart"],"annotation":"anatomical heart","tags":["anatomical","cardiology","heart","organ","pulse"],"emoji":"๐ซ","order":487,"group":1,"version":13},{"shortcodes":["lungs"],"annotation":"lungs","tags":["breath","exhalation","inhalation","organ","respiration"],"emoji":"๐ซ","order":488,"group":1,"version":13},{"shortcodes":["tooth"],"annotation":"tooth","tags":["dentist"],"emoji":"๐ฆท","order":489,"group":1,"version":11},{"shortcodes":["bone"],"annotation":"bone","tags":["skeleton"],"emoji":"๐ฆด","order":490,"group":1,"version":11},{"shortcodes":["eyes"],"annotation":"eyes","tags":["eye","face"],"emoji":"๐","order":491,"group":1,"version":0.6},{"shortcodes":["eye"],"annotation":"eye","tags":["body"],"emoji":"๐๏ธ","order":493,"group":1,"version":0.7},{"shortcodes":["tongue"],"annotation":"tongue","tags":["body"],"emoji":"๐ ","order":494,"group":1,"version":0.6},{"shortcodes":["lips","mouth"],"annotation":"mouth","tags":["lips"],"emoji":"๐","order":495,"group":1,"version":0.6},{"shortcodes":["biting_lip"],"annotation":"biting lip","tags":["anxious","fear","flirting","nervous","uncomfortable","worried"],"emoji":"๐ซฆ","order":496,"group":1,"version":14},{"shortcodes":["baby"],"annotation":"baby","tags":["young"],"emoji":"๐ถ","order":497,"group":1,"version":0.6,"skins":[{"emoji":"๐ถ๐ป","version":1,"tone":1},{"emoji":"๐ถ๐ผ","version":1,"tone":2},{"emoji":"๐ถ๐ฝ","version":1,"tone":3},{"emoji":"๐ถ๐พ","version":1,"tone":4},{"emoji":"๐ถ๐ฟ","version":1,"tone":5}]},{"shortcodes":["child"],"annotation":"child","tags":["gender-neutral","unspecified gender","young"],"emoji":"๐ง","order":503,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ป","version":5,"tone":1},{"emoji":"๐ง๐ผ","version":5,"tone":2},{"emoji":"๐ง๐ฝ","version":5,"tone":3},{"emoji":"๐ง๐พ","version":5,"tone":4},{"emoji":"๐ง๐ฟ","version":5,"tone":5}]},{"shortcodes":["boy"],"annotation":"boy","tags":["young"],"emoji":"๐ฆ","order":509,"group":1,"version":0.6,"skins":[{"emoji":"๐ฆ๐ป","version":1,"tone":1},{"emoji":"๐ฆ๐ผ","version":1,"tone":2},{"emoji":"๐ฆ๐ฝ","version":1,"tone":3},{"emoji":"๐ฆ๐พ","version":1,"tone":4},{"emoji":"๐ฆ๐ฟ","version":1,"tone":5}]},{"shortcodes":["girl"],"annotation":"girl","tags":["virgo","young","zodiac"],"emoji":"๐ง","order":515,"group":1,"version":0.6,"skins":[{"emoji":"๐ง๐ป","version":1,"tone":1},{"emoji":"๐ง๐ผ","version":1,"tone":2},{"emoji":"๐ง๐ฝ","version":1,"tone":3},{"emoji":"๐ง๐พ","version":1,"tone":4},{"emoji":"๐ง๐ฟ","version":1,"tone":5}]},{"shortcodes":["adult"],"annotation":"person","tags":["adult","gender-neutral","unspecified gender"],"emoji":"๐ง","order":521,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ป","version":5,"tone":1},{"emoji":"๐ง๐ผ","version":5,"tone":2},{"emoji":"๐ง๐ฝ","version":5,"tone":3},{"emoji":"๐ง๐พ","version":5,"tone":4},{"emoji":"๐ง๐ฟ","version":5,"tone":5}]},{"shortcodes":["blond_haired"],"annotation":"person: blond hair","tags":["blond","blond-haired person","hair"],"emoji":"๐ฑ","order":527,"group":1,"version":0.6,"skins":[{"emoji":"๐ฑ๐ป","version":1,"tone":1},{"emoji":"๐ฑ๐ผ","version":1,"tone":2},{"emoji":"๐ฑ๐ฝ","version":1,"tone":3},{"emoji":"๐ฑ๐พ","version":1,"tone":4},{"emoji":"๐ฑ๐ฟ","version":1,"tone":5}]},{"shortcodes":["man"],"annotation":"man","tags":["adult"],"emoji":"๐จ","order":533,"group":1,"version":0.6,"skins":[{"emoji":"๐จ๐ป","version":1,"tone":1},{"emoji":"๐จ๐ผ","version":1,"tone":2},{"emoji":"๐จ๐ฝ","version":1,"tone":3},{"emoji":"๐จ๐พ","version":1,"tone":4},{"emoji":"๐จ๐ฟ","version":1,"tone":5}]},{"shortcodes":["person_bearded"],"annotation":"person: beard","tags":["beard","person"],"emoji":"๐ง","order":539,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ป","version":5,"tone":1},{"emoji":"๐ง๐ผ","version":5,"tone":2},{"emoji":"๐ง๐ฝ","version":5,"tone":3},{"emoji":"๐ง๐พ","version":5,"tone":4},{"emoji":"๐ง๐ฟ","version":5,"tone":5}]},{"shortcodes":["man_bearded"],"annotation":"man: beard","tags":["beard","man"],"emoji":"๐งโโ๏ธ","order":545,"group":1,"version":13.1,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":13.1,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":13.1,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":13.1,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":13.1,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":13.1,"tone":5}]},{"shortcodes":["woman_bearded"],"annotation":"woman: beard","tags":["beard","woman"],"emoji":"๐งโโ๏ธ","order":557,"group":1,"version":13.1,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":13.1,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":13.1,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":13.1,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":13.1,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":13.1,"tone":5}]},{"shortcodes":["man_red_haired"],"annotation":"man: red hair","tags":["adult","man","red hair"],"emoji":"๐จโ๐ฆฐ","order":569,"group":1,"version":11,"skins":[{"emoji":"๐จ๐ปโ๐ฆฐ","version":11,"tone":1},{"emoji":"๐จ๐ผโ๐ฆฐ","version":11,"tone":2},{"emoji":"๐จ๐ฝโ๐ฆฐ","version":11,"tone":3},{"emoji":"๐จ๐พโ๐ฆฐ","version":11,"tone":4},{"emoji":"๐จ๐ฟโ๐ฆฐ","version":11,"tone":5}]},{"shortcodes":["man_curly_haired"],"annotation":"man: curly hair","tags":["adult","curly hair","man"],"emoji":"๐จโ๐ฆฑ","order":575,"group":1,"version":11,"skins":[{"emoji":"๐จ๐ปโ๐ฆฑ","version":11,"tone":1},{"emoji":"๐จ๐ผโ๐ฆฑ","version":11,"tone":2},{"emoji":"๐จ๐ฝโ๐ฆฑ","version":11,"tone":3},{"emoji":"๐จ๐พโ๐ฆฑ","version":11,"tone":4},{"emoji":"๐จ๐ฟโ๐ฆฑ","version":11,"tone":5}]},{"shortcodes":["man_white_haired"],"annotation":"man: white hair","tags":["adult","man","white hair"],"emoji":"๐จโ๐ฆณ","order":581,"group":1,"version":11,"skins":[{"emoji":"๐จ๐ปโ๐ฆณ","version":11,"tone":1},{"emoji":"๐จ๐ผโ๐ฆณ","version":11,"tone":2},{"emoji":"๐จ๐ฝโ๐ฆณ","version":11,"tone":3},{"emoji":"๐จ๐พโ๐ฆณ","version":11,"tone":4},{"emoji":"๐จ๐ฟโ๐ฆณ","version":11,"tone":5}]},{"shortcodes":["man_bald"],"annotation":"man: bald","tags":["adult","bald","man"],"emoji":"๐จโ๐ฆฒ","order":587,"group":1,"version":11,"skins":[{"emoji":"๐จ๐ปโ๐ฆฒ","version":11,"tone":1},{"emoji":"๐จ๐ผโ๐ฆฒ","version":11,"tone":2},{"emoji":"๐จ๐ฝโ๐ฆฒ","version":11,"tone":3},{"emoji":"๐จ๐พโ๐ฆฒ","version":11,"tone":4},{"emoji":"๐จ๐ฟโ๐ฆฒ","version":11,"tone":5}]},{"shortcodes":["woman"],"annotation":"woman","tags":["adult"],"emoji":"๐ฉ","order":593,"group":1,"version":0.6,"skins":[{"emoji":"๐ฉ๐ป","version":1,"tone":1},{"emoji":"๐ฉ๐ผ","version":1,"tone":2},{"emoji":"๐ฉ๐ฝ","version":1,"tone":3},{"emoji":"๐ฉ๐พ","version":1,"tone":4},{"emoji":"๐ฉ๐ฟ","version":1,"tone":5}]},{"shortcodes":["woman_red_haired"],"annotation":"woman: red hair","tags":["adult","red hair","woman"],"emoji":"๐ฉโ๐ฆฐ","order":599,"group":1,"version":11,"skins":[{"emoji":"๐ฉ๐ปโ๐ฆฐ","version":11,"tone":1},{"emoji":"๐ฉ๐ผโ๐ฆฐ","version":11,"tone":2},{"emoji":"๐ฉ๐ฝโ๐ฆฐ","version":11,"tone":3},{"emoji":"๐ฉ๐พโ๐ฆฐ","version":11,"tone":4},{"emoji":"๐ฉ๐ฟโ๐ฆฐ","version":11,"tone":5}]},{"shortcodes":["red_haired"],"annotation":"person: red hair","tags":["adult","gender-neutral","person","red hair","unspecified gender"],"emoji":"๐งโ๐ฆฐ","order":605,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโ๐ฆฐ","version":12.1,"tone":1},{"emoji":"๐ง๐ผโ๐ฆฐ","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโ๐ฆฐ","version":12.1,"tone":3},{"emoji":"๐ง๐พโ๐ฆฐ","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโ๐ฆฐ","version":12.1,"tone":5}]},{"shortcodes":["woman_curly_haired"],"annotation":"woman: curly hair","tags":["adult","curly hair","woman"],"emoji":"๐ฉโ๐ฆฑ","order":611,"group":1,"version":11,"skins":[{"emoji":"๐ฉ๐ปโ๐ฆฑ","version":11,"tone":1},{"emoji":"๐ฉ๐ผโ๐ฆฑ","version":11,"tone":2},{"emoji":"๐ฉ๐ฝโ๐ฆฑ","version":11,"tone":3},{"emoji":"๐ฉ๐พโ๐ฆฑ","version":11,"tone":4},{"emoji":"๐ฉ๐ฟโ๐ฆฑ","version":11,"tone":5}]},{"shortcodes":["curly_haired"],"annotation":"person: curly hair","tags":["adult","curly hair","gender-neutral","person","unspecified gender"],"emoji":"๐งโ๐ฆฑ","order":617,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโ๐ฆฑ","version":12.1,"tone":1},{"emoji":"๐ง๐ผโ๐ฆฑ","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโ๐ฆฑ","version":12.1,"tone":3},{"emoji":"๐ง๐พโ๐ฆฑ","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโ๐ฆฑ","version":12.1,"tone":5}]},{"shortcodes":["woman_white_haired"],"annotation":"woman: white hair","tags":["adult","white hair","woman"],"emoji":"๐ฉโ๐ฆณ","order":623,"group":1,"version":11,"skins":[{"emoji":"๐ฉ๐ปโ๐ฆณ","version":11,"tone":1},{"emoji":"๐ฉ๐ผโ๐ฆณ","version":11,"tone":2},{"emoji":"๐ฉ๐ฝโ๐ฆณ","version":11,"tone":3},{"emoji":"๐ฉ๐พโ๐ฆณ","version":11,"tone":4},{"emoji":"๐ฉ๐ฟโ๐ฆณ","version":11,"tone":5}]},{"shortcodes":["white_haired"],"annotation":"person: white hair","tags":["adult","gender-neutral","person","unspecified gender","white hair"],"emoji":"๐งโ๐ฆณ","order":629,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโ๐ฆณ","version":12.1,"tone":1},{"emoji":"๐ง๐ผโ๐ฆณ","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโ๐ฆณ","version":12.1,"tone":3},{"emoji":"๐ง๐พโ๐ฆณ","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโ๐ฆณ","version":12.1,"tone":5}]},{"shortcodes":["woman_bald"],"annotation":"woman: bald","tags":["adult","bald","woman"],"emoji":"๐ฉโ๐ฆฒ","order":635,"group":1,"version":11,"skins":[{"emoji":"๐ฉ๐ปโ๐ฆฒ","version":11,"tone":1},{"emoji":"๐ฉ๐ผโ๐ฆฒ","version":11,"tone":2},{"emoji":"๐ฉ๐ฝโ๐ฆฒ","version":11,"tone":3},{"emoji":"๐ฉ๐พโ๐ฆฒ","version":11,"tone":4},{"emoji":"๐ฉ๐ฟโ๐ฆฒ","version":11,"tone":5}]},{"shortcodes":["bald"],"annotation":"person: bald","tags":["adult","bald","gender-neutral","person","unspecified gender"],"emoji":"๐งโ๐ฆฒ","order":641,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโ๐ฆฒ","version":12.1,"tone":1},{"emoji":"๐ง๐ผโ๐ฆฒ","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโ๐ฆฒ","version":12.1,"tone":3},{"emoji":"๐ง๐พโ๐ฆฒ","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโ๐ฆฒ","version":12.1,"tone":5}]},{"shortcodes":["woman_blond_haired"],"annotation":"woman: blond hair","tags":["blond-haired woman","blonde","hair","woman"],"emoji":"๐ฑโโ๏ธ","order":647,"group":1,"version":4,"skins":[{"emoji":"๐ฑ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ฑ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ฑ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ฑ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ฑ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["man_blond_haired"],"annotation":"man: blond hair","tags":["blond","blond-haired man","hair","man"],"emoji":"๐ฑโโ๏ธ","order":659,"group":1,"version":4,"skins":[{"emoji":"๐ฑ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ฑ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ฑ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ฑ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ฑ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["older_adult"],"annotation":"older person","tags":["adult","gender-neutral","old","unspecified gender"],"emoji":"๐ง","order":671,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ป","version":5,"tone":1},{"emoji":"๐ง๐ผ","version":5,"tone":2},{"emoji":"๐ง๐ฝ","version":5,"tone":3},{"emoji":"๐ง๐พ","version":5,"tone":4},{"emoji":"๐ง๐ฟ","version":5,"tone":5}]},{"shortcodes":["older_man"],"annotation":"old man","tags":["adult","man","old"],"emoji":"๐ด","order":677,"group":1,"version":0.6,"skins":[{"emoji":"๐ด๐ป","version":1,"tone":1},{"emoji":"๐ด๐ผ","version":1,"tone":2},{"emoji":"๐ด๐ฝ","version":1,"tone":3},{"emoji":"๐ด๐พ","version":1,"tone":4},{"emoji":"๐ด๐ฟ","version":1,"tone":5}]},{"shortcodes":["older_woman"],"annotation":"old woman","tags":["adult","old","woman"],"emoji":"๐ต","order":683,"group":1,"version":0.6,"skins":[{"emoji":"๐ต๐ป","version":1,"tone":1},{"emoji":"๐ต๐ผ","version":1,"tone":2},{"emoji":"๐ต๐ฝ","version":1,"tone":3},{"emoji":"๐ต๐พ","version":1,"tone":4},{"emoji":"๐ต๐ฟ","version":1,"tone":5}]},{"shortcodes":["person_frowning"],"annotation":"person frowning","tags":["frown","gesture"],"emoji":"๐","order":689,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_frowning"],"annotation":"man frowning","tags":["frowning","gesture","man"],"emoji":"๐โโ๏ธ","order":695,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_frowning"],"annotation":"woman frowning","tags":["frowning","gesture","woman"],"emoji":"๐โโ๏ธ","order":707,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["person_pouting","pouting"],"annotation":"person pouting","tags":["gesture","pouting"],"emoji":"๐","order":719,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_pouting"],"annotation":"man pouting","tags":["gesture","man","pouting"],"emoji":"๐โโ๏ธ","order":725,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_pouting"],"annotation":"woman pouting","tags":["gesture","pouting","woman"],"emoji":"๐โโ๏ธ","order":737,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["no_good","person_gesturing_no"],"annotation":"person gesturing NO","tags":["forbidden","gesture","hand","person gesturing no","prohibited"],"emoji":"๐ ","order":749,"group":1,"version":0.6,"skins":[{"emoji":"๐ ๐ป","version":1,"tone":1},{"emoji":"๐ ๐ผ","version":1,"tone":2},{"emoji":"๐ ๐ฝ","version":1,"tone":3},{"emoji":"๐ ๐พ","version":1,"tone":4},{"emoji":"๐ ๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_gesturing_no"],"annotation":"man gesturing NO","tags":["forbidden","gesture","hand","man","man gesturing no","prohibited"],"emoji":"๐ โโ๏ธ","order":755,"group":1,"version":4,"skins":[{"emoji":"๐ ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_gesturing_no"],"annotation":"woman gesturing NO","tags":["forbidden","gesture","hand","prohibited","woman","woman gesturing no"],"emoji":"๐ โโ๏ธ","order":767,"group":1,"version":4,"skins":[{"emoji":"๐ ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["all_good","person_gesturing_ok"],"annotation":"person gesturing OK","tags":["gesture","hand","ok","person gesturing ok"],"emoji":"๐","order":779,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_gesturing_ok"],"annotation":"man gesturing OK","tags":["gesture","hand","man","man gesturing ok","ok"],"emoji":"๐โโ๏ธ","order":785,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_gesturing_ok"],"annotation":"woman gesturing OK","tags":["gesture","hand","ok","woman","woman gesturing ok"],"emoji":"๐โโ๏ธ","order":797,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["person_tipping_hand"],"annotation":"person tipping hand","tags":["hand","help","information","sassy","tipping"],"emoji":"๐","order":809,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_tipping_hand"],"annotation":"man tipping hand","tags":["man","sassy","tipping hand"],"emoji":"๐โโ๏ธ","order":815,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_tipping_hand"],"annotation":"woman tipping hand","tags":["sassy","tipping hand","woman"],"emoji":"๐โโ๏ธ","order":827,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["person_raising_hand"],"annotation":"person raising hand","tags":["gesture","hand","happy","raised"],"emoji":"๐","order":839,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_raising_hand"],"annotation":"man raising hand","tags":["gesture","man","raising hand"],"emoji":"๐โโ๏ธ","order":845,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_raising_hand"],"annotation":"woman raising hand","tags":["gesture","raising hand","woman"],"emoji":"๐โโ๏ธ","order":857,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["deaf_person"],"annotation":"deaf person","tags":["accessibility","deaf","ear","hear"],"emoji":"๐ง","order":869,"group":1,"version":12,"skins":[{"emoji":"๐ง๐ป","version":12,"tone":1},{"emoji":"๐ง๐ผ","version":12,"tone":2},{"emoji":"๐ง๐ฝ","version":12,"tone":3},{"emoji":"๐ง๐พ","version":12,"tone":4},{"emoji":"๐ง๐ฟ","version":12,"tone":5}]},{"shortcodes":["deaf_man"],"annotation":"deaf man","tags":["deaf","man"],"emoji":"๐งโโ๏ธ","order":875,"group":1,"version":12,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":12,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":12,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":12,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":12,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":12,"tone":5}]},{"shortcodes":["deaf_woman"],"annotation":"deaf woman","tags":["deaf","woman"],"emoji":"๐งโโ๏ธ","order":887,"group":1,"version":12,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":12,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":12,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":12,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":12,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":12,"tone":5}]},{"shortcodes":["bow","person_bowing"],"annotation":"person bowing","tags":["apology","bow","gesture","sorry"],"emoji":"๐","order":899,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_bowing"],"annotation":"man bowing","tags":["apology","bowing","favor","gesture","man","sorry"],"emoji":"๐โโ๏ธ","order":905,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_bowing"],"annotation":"woman bowing","tags":["apology","bowing","favor","gesture","sorry","woman"],"emoji":"๐โโ๏ธ","order":917,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["facepalm","person_facepalming"],"annotation":"person facepalming","tags":["disbelief","exasperation","face","palm"],"emoji":"๐คฆ","order":929,"group":1,"version":3,"skins":[{"emoji":"๐คฆ๐ป","version":3,"tone":1},{"emoji":"๐คฆ๐ผ","version":3,"tone":2},{"emoji":"๐คฆ๐ฝ","version":3,"tone":3},{"emoji":"๐คฆ๐พ","version":3,"tone":4},{"emoji":"๐คฆ๐ฟ","version":3,"tone":5}]},{"shortcodes":["man_facepalming"],"annotation":"man facepalming","tags":["disbelief","exasperation","facepalm","man"],"emoji":"๐คฆโโ๏ธ","order":935,"group":1,"version":4,"skins":[{"emoji":"๐คฆ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐คฆ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐คฆ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐คฆ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐คฆ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_facepalming"],"annotation":"woman facepalming","tags":["disbelief","exasperation","facepalm","woman"],"emoji":"๐คฆโโ๏ธ","order":947,"group":1,"version":4,"skins":[{"emoji":"๐คฆ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐คฆ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐คฆ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐คฆ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐คฆ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["person_shrugging","shrug"],"annotation":"person shrugging","tags":["doubt","ignorance","indifference","shrug"],"emoji":"๐คท","order":959,"group":1,"version":3,"skins":[{"emoji":"๐คท๐ป","version":3,"tone":1},{"emoji":"๐คท๐ผ","version":3,"tone":2},{"emoji":"๐คท๐ฝ","version":3,"tone":3},{"emoji":"๐คท๐พ","version":3,"tone":4},{"emoji":"๐คท๐ฟ","version":3,"tone":5}]},{"shortcodes":["man_shrugging"],"annotation":"man shrugging","tags":["doubt","ignorance","indifference","man","shrug"],"emoji":"๐คทโโ๏ธ","order":965,"group":1,"version":4,"skins":[{"emoji":"๐คท๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐คท๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐คท๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐คท๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐คท๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_shrugging"],"annotation":"woman shrugging","tags":["doubt","ignorance","indifference","shrug","woman"],"emoji":"๐คทโโ๏ธ","order":977,"group":1,"version":4,"skins":[{"emoji":"๐คท๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐คท๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐คท๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐คท๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐คท๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["health_worker"],"annotation":"health worker","tags":["doctor","healthcare","nurse","therapist"],"emoji":"๐งโโ๏ธ","order":989,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":12.1,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":12.1,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":12.1,"tone":5}]},{"shortcodes":["man_health_worker"],"annotation":"man health worker","tags":["doctor","healthcare","man","nurse","therapist"],"emoji":"๐จโโ๏ธ","order":1001,"group":1,"version":4,"skins":[{"emoji":"๐จ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐จ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐จ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐จ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐จ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_health_worker"],"annotation":"woman health worker","tags":["doctor","healthcare","nurse","therapist","woman"],"emoji":"๐ฉโโ๏ธ","order":1013,"group":1,"version":4,"skins":[{"emoji":"๐ฉ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ฉ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ฉ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ฉ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ฉ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["student"],"annotation":"student","tags":["graduate"],"emoji":"๐งโ๐","order":1025,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโ๐","version":12.1,"tone":1},{"emoji":"๐ง๐ผโ๐","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโ๐","version":12.1,"tone":3},{"emoji":"๐ง๐พโ๐","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโ๐","version":12.1,"tone":5}]},{"shortcodes":["man_student"],"annotation":"man student","tags":["graduate","man","student"],"emoji":"๐จโ๐","order":1031,"group":1,"version":4,"skins":[{"emoji":"๐จ๐ปโ๐","version":4,"tone":1},{"emoji":"๐จ๐ผโ๐","version":4,"tone":2},{"emoji":"๐จ๐ฝโ๐","version":4,"tone":3},{"emoji":"๐จ๐พโ๐","version":4,"tone":4},{"emoji":"๐จ๐ฟโ๐","version":4,"tone":5}]},{"shortcodes":["woman_student"],"annotation":"woman student","tags":["graduate","student","woman"],"emoji":"๐ฉโ๐","order":1037,"group":1,"version":4,"skins":[{"emoji":"๐ฉ๐ปโ๐","version":4,"tone":1},{"emoji":"๐ฉ๐ผโ๐","version":4,"tone":2},{"emoji":"๐ฉ๐ฝโ๐","version":4,"tone":3},{"emoji":"๐ฉ๐พโ๐","version":4,"tone":4},{"emoji":"๐ฉ๐ฟโ๐","version":4,"tone":5}]},{"shortcodes":["teacher"],"annotation":"teacher","tags":["instructor","professor"],"emoji":"๐งโ๐ซ","order":1043,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโ๐ซ","version":12.1,"tone":1},{"emoji":"๐ง๐ผโ๐ซ","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโ๐ซ","version":12.1,"tone":3},{"emoji":"๐ง๐พโ๐ซ","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโ๐ซ","version":12.1,"tone":5}]},{"shortcodes":["man_teacher"],"annotation":"man teacher","tags":["instructor","man","professor","teacher"],"emoji":"๐จโ๐ซ","order":1049,"group":1,"version":4,"skins":[{"emoji":"๐จ๐ปโ๐ซ","version":4,"tone":1},{"emoji":"๐จ๐ผโ๐ซ","version":4,"tone":2},{"emoji":"๐จ๐ฝโ๐ซ","version":4,"tone":3},{"emoji":"๐จ๐พโ๐ซ","version":4,"tone":4},{"emoji":"๐จ๐ฟโ๐ซ","version":4,"tone":5}]},{"shortcodes":["woman_teacher"],"annotation":"woman teacher","tags":["instructor","professor","teacher","woman"],"emoji":"๐ฉโ๐ซ","order":1055,"group":1,"version":4,"skins":[{"emoji":"๐ฉ๐ปโ๐ซ","version":4,"tone":1},{"emoji":"๐ฉ๐ผโ๐ซ","version":4,"tone":2},{"emoji":"๐ฉ๐ฝโ๐ซ","version":4,"tone":3},{"emoji":"๐ฉ๐พโ๐ซ","version":4,"tone":4},{"emoji":"๐ฉ๐ฟโ๐ซ","version":4,"tone":5}]},{"shortcodes":["judge"],"annotation":"judge","tags":["justice","scales"],"emoji":"๐งโโ๏ธ","order":1061,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":12.1,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":12.1,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":12.1,"tone":5}]},{"shortcodes":["man_judge"],"annotation":"man judge","tags":["judge","justice","man","scales"],"emoji":"๐จโโ๏ธ","order":1073,"group":1,"version":4,"skins":[{"emoji":"๐จ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐จ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐จ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐จ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐จ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_judge"],"annotation":"woman judge","tags":["judge","justice","scales","woman"],"emoji":"๐ฉโโ๏ธ","order":1085,"group":1,"version":4,"skins":[{"emoji":"๐ฉ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ฉ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ฉ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ฉ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ฉ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["farmer"],"annotation":"farmer","tags":["gardener","rancher"],"emoji":"๐งโ๐พ","order":1097,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโ๐พ","version":12.1,"tone":1},{"emoji":"๐ง๐ผโ๐พ","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโ๐พ","version":12.1,"tone":3},{"emoji":"๐ง๐พโ๐พ","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโ๐พ","version":12.1,"tone":5}]},{"shortcodes":["man_farmer"],"annotation":"man farmer","tags":["farmer","gardener","man","rancher"],"emoji":"๐จโ๐พ","order":1103,"group":1,"version":4,"skins":[{"emoji":"๐จ๐ปโ๐พ","version":4,"tone":1},{"emoji":"๐จ๐ผโ๐พ","version":4,"tone":2},{"emoji":"๐จ๐ฝโ๐พ","version":4,"tone":3},{"emoji":"๐จ๐พโ๐พ","version":4,"tone":4},{"emoji":"๐จ๐ฟโ๐พ","version":4,"tone":5}]},{"shortcodes":["woman_farmer"],"annotation":"woman farmer","tags":["farmer","gardener","rancher","woman"],"emoji":"๐ฉโ๐พ","order":1109,"group":1,"version":4,"skins":[{"emoji":"๐ฉ๐ปโ๐พ","version":4,"tone":1},{"emoji":"๐ฉ๐ผโ๐พ","version":4,"tone":2},{"emoji":"๐ฉ๐ฝโ๐พ","version":4,"tone":3},{"emoji":"๐ฉ๐พโ๐พ","version":4,"tone":4},{"emoji":"๐ฉ๐ฟโ๐พ","version":4,"tone":5}]},{"shortcodes":["cook"],"annotation":"cook","tags":["chef"],"emoji":"๐งโ๐ณ","order":1115,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโ๐ณ","version":12.1,"tone":1},{"emoji":"๐ง๐ผโ๐ณ","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโ๐ณ","version":12.1,"tone":3},{"emoji":"๐ง๐พโ๐ณ","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโ๐ณ","version":12.1,"tone":5}]},{"shortcodes":["man_cook"],"annotation":"man cook","tags":["chef","cook","man"],"emoji":"๐จโ๐ณ","order":1121,"group":1,"version":4,"skins":[{"emoji":"๐จ๐ปโ๐ณ","version":4,"tone":1},{"emoji":"๐จ๐ผโ๐ณ","version":4,"tone":2},{"emoji":"๐จ๐ฝโ๐ณ","version":4,"tone":3},{"emoji":"๐จ๐พโ๐ณ","version":4,"tone":4},{"emoji":"๐จ๐ฟโ๐ณ","version":4,"tone":5}]},{"shortcodes":["woman_cook"],"annotation":"woman cook","tags":["chef","cook","woman"],"emoji":"๐ฉโ๐ณ","order":1127,"group":1,"version":4,"skins":[{"emoji":"๐ฉ๐ปโ๐ณ","version":4,"tone":1},{"emoji":"๐ฉ๐ผโ๐ณ","version":4,"tone":2},{"emoji":"๐ฉ๐ฝโ๐ณ","version":4,"tone":3},{"emoji":"๐ฉ๐พโ๐ณ","version":4,"tone":4},{"emoji":"๐ฉ๐ฟโ๐ณ","version":4,"tone":5}]},{"shortcodes":["mechanic"],"annotation":"mechanic","tags":["electrician","plumber","tradesperson"],"emoji":"๐งโ๐ง","order":1133,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโ๐ง","version":12.1,"tone":1},{"emoji":"๐ง๐ผโ๐ง","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโ๐ง","version":12.1,"tone":3},{"emoji":"๐ง๐พโ๐ง","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโ๐ง","version":12.1,"tone":5}]},{"shortcodes":["man_mechanic"],"annotation":"man mechanic","tags":["electrician","man","mechanic","plumber","tradesperson"],"emoji":"๐จโ๐ง","order":1139,"group":1,"version":4,"skins":[{"emoji":"๐จ๐ปโ๐ง","version":4,"tone":1},{"emoji":"๐จ๐ผโ๐ง","version":4,"tone":2},{"emoji":"๐จ๐ฝโ๐ง","version":4,"tone":3},{"emoji":"๐จ๐พโ๐ง","version":4,"tone":4},{"emoji":"๐จ๐ฟโ๐ง","version":4,"tone":5}]},{"shortcodes":["woman_mechanic"],"annotation":"woman mechanic","tags":["electrician","mechanic","plumber","tradesperson","woman"],"emoji":"๐ฉโ๐ง","order":1145,"group":1,"version":4,"skins":[{"emoji":"๐ฉ๐ปโ๐ง","version":4,"tone":1},{"emoji":"๐ฉ๐ผโ๐ง","version":4,"tone":2},{"emoji":"๐ฉ๐ฝโ๐ง","version":4,"tone":3},{"emoji":"๐ฉ๐พโ๐ง","version":4,"tone":4},{"emoji":"๐ฉ๐ฟโ๐ง","version":4,"tone":5}]},{"shortcodes":["factory_worker"],"annotation":"factory worker","tags":["assembly","factory","industrial","worker"],"emoji":"๐งโ๐ญ","order":1151,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโ๐ญ","version":12.1,"tone":1},{"emoji":"๐ง๐ผโ๐ญ","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโ๐ญ","version":12.1,"tone":3},{"emoji":"๐ง๐พโ๐ญ","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโ๐ญ","version":12.1,"tone":5}]},{"shortcodes":["man_factory_worker"],"annotation":"man factory worker","tags":["assembly","factory","industrial","man","worker"],"emoji":"๐จโ๐ญ","order":1157,"group":1,"version":4,"skins":[{"emoji":"๐จ๐ปโ๐ญ","version":4,"tone":1},{"emoji":"๐จ๐ผโ๐ญ","version":4,"tone":2},{"emoji":"๐จ๐ฝโ๐ญ","version":4,"tone":3},{"emoji":"๐จ๐พโ๐ญ","version":4,"tone":4},{"emoji":"๐จ๐ฟโ๐ญ","version":4,"tone":5}]},{"shortcodes":["woman_factory_worker"],"annotation":"woman factory worker","tags":["assembly","factory","industrial","woman","worker"],"emoji":"๐ฉโ๐ญ","order":1163,"group":1,"version":4,"skins":[{"emoji":"๐ฉ๐ปโ๐ญ","version":4,"tone":1},{"emoji":"๐ฉ๐ผโ๐ญ","version":4,"tone":2},{"emoji":"๐ฉ๐ฝโ๐ญ","version":4,"tone":3},{"emoji":"๐ฉ๐พโ๐ญ","version":4,"tone":4},{"emoji":"๐ฉ๐ฟโ๐ญ","version":4,"tone":5}]},{"shortcodes":["office_worker"],"annotation":"office worker","tags":["architect","business","manager","white-collar"],"emoji":"๐งโ๐ผ","order":1169,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโ๐ผ","version":12.1,"tone":1},{"emoji":"๐ง๐ผโ๐ผ","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโ๐ผ","version":12.1,"tone":3},{"emoji":"๐ง๐พโ๐ผ","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโ๐ผ","version":12.1,"tone":5}]},{"shortcodes":["man_office_worker"],"annotation":"man office worker","tags":["architect","business","man","manager","white-collar"],"emoji":"๐จโ๐ผ","order":1175,"group":1,"version":4,"skins":[{"emoji":"๐จ๐ปโ๐ผ","version":4,"tone":1},{"emoji":"๐จ๐ผโ๐ผ","version":4,"tone":2},{"emoji":"๐จ๐ฝโ๐ผ","version":4,"tone":3},{"emoji":"๐จ๐พโ๐ผ","version":4,"tone":4},{"emoji":"๐จ๐ฟโ๐ผ","version":4,"tone":5}]},{"shortcodes":["woman_office_worker"],"annotation":"woman office worker","tags":["architect","business","manager","white-collar","woman"],"emoji":"๐ฉโ๐ผ","order":1181,"group":1,"version":4,"skins":[{"emoji":"๐ฉ๐ปโ๐ผ","version":4,"tone":1},{"emoji":"๐ฉ๐ผโ๐ผ","version":4,"tone":2},{"emoji":"๐ฉ๐ฝโ๐ผ","version":4,"tone":3},{"emoji":"๐ฉ๐พโ๐ผ","version":4,"tone":4},{"emoji":"๐ฉ๐ฟโ๐ผ","version":4,"tone":5}]},{"shortcodes":["scientist"],"annotation":"scientist","tags":["biologist","chemist","engineer","physicist"],"emoji":"๐งโ๐ฌ","order":1187,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโ๐ฌ","version":12.1,"tone":1},{"emoji":"๐ง๐ผโ๐ฌ","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโ๐ฌ","version":12.1,"tone":3},{"emoji":"๐ง๐พโ๐ฌ","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโ๐ฌ","version":12.1,"tone":5}]},{"shortcodes":["man_scientist"],"annotation":"man scientist","tags":["biologist","chemist","engineer","man","physicist","scientist"],"emoji":"๐จโ๐ฌ","order":1193,"group":1,"version":4,"skins":[{"emoji":"๐จ๐ปโ๐ฌ","version":4,"tone":1},{"emoji":"๐จ๐ผโ๐ฌ","version":4,"tone":2},{"emoji":"๐จ๐ฝโ๐ฌ","version":4,"tone":3},{"emoji":"๐จ๐พโ๐ฌ","version":4,"tone":4},{"emoji":"๐จ๐ฟโ๐ฌ","version":4,"tone":5}]},{"shortcodes":["woman_scientist"],"annotation":"woman scientist","tags":["biologist","chemist","engineer","physicist","scientist","woman"],"emoji":"๐ฉโ๐ฌ","order":1199,"group":1,"version":4,"skins":[{"emoji":"๐ฉ๐ปโ๐ฌ","version":4,"tone":1},{"emoji":"๐ฉ๐ผโ๐ฌ","version":4,"tone":2},{"emoji":"๐ฉ๐ฝโ๐ฌ","version":4,"tone":3},{"emoji":"๐ฉ๐พโ๐ฌ","version":4,"tone":4},{"emoji":"๐ฉ๐ฟโ๐ฌ","version":4,"tone":5}]},{"shortcodes":["technologist"],"annotation":"technologist","tags":["coder","developer","inventor","software"],"emoji":"๐งโ๐ป","order":1205,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโ๐ป","version":12.1,"tone":1},{"emoji":"๐ง๐ผโ๐ป","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโ๐ป","version":12.1,"tone":3},{"emoji":"๐ง๐พโ๐ป","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโ๐ป","version":12.1,"tone":5}]},{"shortcodes":["man_technologist"],"annotation":"man technologist","tags":["coder","developer","inventor","man","software","technologist"],"emoji":"๐จโ๐ป","order":1211,"group":1,"version":4,"skins":[{"emoji":"๐จ๐ปโ๐ป","version":4,"tone":1},{"emoji":"๐จ๐ผโ๐ป","version":4,"tone":2},{"emoji":"๐จ๐ฝโ๐ป","version":4,"tone":3},{"emoji":"๐จ๐พโ๐ป","version":4,"tone":4},{"emoji":"๐จ๐ฟโ๐ป","version":4,"tone":5}]},{"shortcodes":["woman_technologist"],"annotation":"woman technologist","tags":["coder","developer","inventor","software","technologist","woman"],"emoji":"๐ฉโ๐ป","order":1217,"group":1,"version":4,"skins":[{"emoji":"๐ฉ๐ปโ๐ป","version":4,"tone":1},{"emoji":"๐ฉ๐ผโ๐ป","version":4,"tone":2},{"emoji":"๐ฉ๐ฝโ๐ป","version":4,"tone":3},{"emoji":"๐ฉ๐พโ๐ป","version":4,"tone":4},{"emoji":"๐ฉ๐ฟโ๐ป","version":4,"tone":5}]},{"shortcodes":["singer"],"annotation":"singer","tags":["actor","entertainer","rock","star"],"emoji":"๐งโ๐ค","order":1223,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโ๐ค","version":12.1,"tone":1},{"emoji":"๐ง๐ผโ๐ค","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโ๐ค","version":12.1,"tone":3},{"emoji":"๐ง๐พโ๐ค","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโ๐ค","version":12.1,"tone":5}]},{"shortcodes":["man_singer"],"annotation":"man singer","tags":["actor","entertainer","man","rock","singer","star"],"emoji":"๐จโ๐ค","order":1229,"group":1,"version":4,"skins":[{"emoji":"๐จ๐ปโ๐ค","version":4,"tone":1},{"emoji":"๐จ๐ผโ๐ค","version":4,"tone":2},{"emoji":"๐จ๐ฝโ๐ค","version":4,"tone":3},{"emoji":"๐จ๐พโ๐ค","version":4,"tone":4},{"emoji":"๐จ๐ฟโ๐ค","version":4,"tone":5}]},{"shortcodes":["woman_singer"],"annotation":"woman singer","tags":["actor","entertainer","rock","singer","star","woman"],"emoji":"๐ฉโ๐ค","order":1235,"group":1,"version":4,"skins":[{"emoji":"๐ฉ๐ปโ๐ค","version":4,"tone":1},{"emoji":"๐ฉ๐ผโ๐ค","version":4,"tone":2},{"emoji":"๐ฉ๐ฝโ๐ค","version":4,"tone":3},{"emoji":"๐ฉ๐พโ๐ค","version":4,"tone":4},{"emoji":"๐ฉ๐ฟโ๐ค","version":4,"tone":5}]},{"shortcodes":["artist"],"annotation":"artist","tags":["palette"],"emoji":"๐งโ๐จ","order":1241,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโ๐จ","version":12.1,"tone":1},{"emoji":"๐ง๐ผโ๐จ","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโ๐จ","version":12.1,"tone":3},{"emoji":"๐ง๐พโ๐จ","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโ๐จ","version":12.1,"tone":5}]},{"shortcodes":["man_artist"],"annotation":"man artist","tags":["artist","man","palette"],"emoji":"๐จโ๐จ","order":1247,"group":1,"version":4,"skins":[{"emoji":"๐จ๐ปโ๐จ","version":4,"tone":1},{"emoji":"๐จ๐ผโ๐จ","version":4,"tone":2},{"emoji":"๐จ๐ฝโ๐จ","version":4,"tone":3},{"emoji":"๐จ๐พโ๐จ","version":4,"tone":4},{"emoji":"๐จ๐ฟโ๐จ","version":4,"tone":5}]},{"shortcodes":["woman_artist"],"annotation":"woman artist","tags":["artist","palette","woman"],"emoji":"๐ฉโ๐จ","order":1253,"group":1,"version":4,"skins":[{"emoji":"๐ฉ๐ปโ๐จ","version":4,"tone":1},{"emoji":"๐ฉ๐ผโ๐จ","version":4,"tone":2},{"emoji":"๐ฉ๐ฝโ๐จ","version":4,"tone":3},{"emoji":"๐ฉ๐พโ๐จ","version":4,"tone":4},{"emoji":"๐ฉ๐ฟโ๐จ","version":4,"tone":5}]},{"shortcodes":["pilot"],"annotation":"pilot","tags":["plane"],"emoji":"๐งโโ๏ธ","order":1259,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":12.1,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":12.1,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":12.1,"tone":5}]},{"shortcodes":["man_pilot"],"annotation":"man pilot","tags":["man","pilot","plane"],"emoji":"๐จโโ๏ธ","order":1271,"group":1,"version":4,"skins":[{"emoji":"๐จ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐จ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐จ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐จ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐จ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_pilot"],"annotation":"woman pilot","tags":["pilot","plane","woman"],"emoji":"๐ฉโโ๏ธ","order":1283,"group":1,"version":4,"skins":[{"emoji":"๐ฉ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ฉ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ฉ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ฉ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ฉ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["astronaut"],"annotation":"astronaut","tags":["rocket"],"emoji":"๐งโ๐","order":1295,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโ๐","version":12.1,"tone":1},{"emoji":"๐ง๐ผโ๐","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโ๐","version":12.1,"tone":3},{"emoji":"๐ง๐พโ๐","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโ๐","version":12.1,"tone":5}]},{"shortcodes":["man_astronaut"],"annotation":"man astronaut","tags":["astronaut","man","rocket"],"emoji":"๐จโ๐","order":1301,"group":1,"version":4,"skins":[{"emoji":"๐จ๐ปโ๐","version":4,"tone":1},{"emoji":"๐จ๐ผโ๐","version":4,"tone":2},{"emoji":"๐จ๐ฝโ๐","version":4,"tone":3},{"emoji":"๐จ๐พโ๐","version":4,"tone":4},{"emoji":"๐จ๐ฟโ๐","version":4,"tone":5}]},{"shortcodes":["woman_astronaut"],"annotation":"woman astronaut","tags":["astronaut","rocket","woman"],"emoji":"๐ฉโ๐","order":1307,"group":1,"version":4,"skins":[{"emoji":"๐ฉ๐ปโ๐","version":4,"tone":1},{"emoji":"๐ฉ๐ผโ๐","version":4,"tone":2},{"emoji":"๐ฉ๐ฝโ๐","version":4,"tone":3},{"emoji":"๐ฉ๐พโ๐","version":4,"tone":4},{"emoji":"๐ฉ๐ฟโ๐","version":4,"tone":5}]},{"shortcodes":["firefighter"],"annotation":"firefighter","tags":["firetruck"],"emoji":"๐งโ๐","order":1313,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโ๐","version":12.1,"tone":1},{"emoji":"๐ง๐ผโ๐","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโ๐","version":12.1,"tone":3},{"emoji":"๐ง๐พโ๐","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโ๐","version":12.1,"tone":5}]},{"shortcodes":["man_firefighter"],"annotation":"man firefighter","tags":["firefighter","firetruck","man"],"emoji":"๐จโ๐","order":1319,"group":1,"version":4,"skins":[{"emoji":"๐จ๐ปโ๐","version":4,"tone":1},{"emoji":"๐จ๐ผโ๐","version":4,"tone":2},{"emoji":"๐จ๐ฝโ๐","version":4,"tone":3},{"emoji":"๐จ๐พโ๐","version":4,"tone":4},{"emoji":"๐จ๐ฟโ๐","version":4,"tone":5}]},{"shortcodes":["woman_firefighter"],"annotation":"woman firefighter","tags":["firefighter","firetruck","woman"],"emoji":"๐ฉโ๐","order":1325,"group":1,"version":4,"skins":[{"emoji":"๐ฉ๐ปโ๐","version":4,"tone":1},{"emoji":"๐ฉ๐ผโ๐","version":4,"tone":2},{"emoji":"๐ฉ๐ฝโ๐","version":4,"tone":3},{"emoji":"๐ฉ๐พโ๐","version":4,"tone":4},{"emoji":"๐ฉ๐ฟโ๐","version":4,"tone":5}]},{"shortcodes":["cop","police_officer"],"annotation":"police officer","tags":["cop","officer","police"],"emoji":"๐ฎ","order":1331,"group":1,"version":0.6,"skins":[{"emoji":"๐ฎ๐ป","version":1,"tone":1},{"emoji":"๐ฎ๐ผ","version":1,"tone":2},{"emoji":"๐ฎ๐ฝ","version":1,"tone":3},{"emoji":"๐ฎ๐พ","version":1,"tone":4},{"emoji":"๐ฎ๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_police_officer"],"annotation":"man police officer","tags":["cop","man","officer","police"],"emoji":"๐ฎโโ๏ธ","order":1337,"group":1,"version":4,"skins":[{"emoji":"๐ฎ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ฎ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ฎ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ฎ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ฎ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_police_officer"],"annotation":"woman police officer","tags":["cop","officer","police","woman"],"emoji":"๐ฎโโ๏ธ","order":1349,"group":1,"version":4,"skins":[{"emoji":"๐ฎ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ฎ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ฎ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ฎ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ฎ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["detective"],"annotation":"detective","tags":["sleuth","spy"],"emoji":"๐ต๏ธ","order":1362,"group":1,"version":0.7,"skins":[{"emoji":"๐ต๐ป","version":2,"tone":1},{"emoji":"๐ต๐ผ","version":2,"tone":2},{"emoji":"๐ต๐ฝ","version":2,"tone":3},{"emoji":"๐ต๐พ","version":2,"tone":4},{"emoji":"๐ต๐ฟ","version":2,"tone":5}]},{"shortcodes":["man_detective"],"annotation":"man detective","tags":["detective","man","sleuth","spy"],"emoji":"๐ต๏ธโโ๏ธ","order":1368,"group":1,"version":4,"skins":[{"emoji":"๐ต๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ต๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ต๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ต๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ต๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_detective"],"annotation":"woman detective","tags":["detective","sleuth","spy","woman"],"emoji":"๐ต๏ธโโ๏ธ","order":1382,"group":1,"version":4,"skins":[{"emoji":"๐ต๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ต๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ต๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ต๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ต๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["guard"],"annotation":"guard","tags":["guard"],"emoji":"๐","order":1396,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_guard"],"annotation":"man guard","tags":["guard","man"],"emoji":"๐โโ๏ธ","order":1402,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_guard"],"annotation":"woman guard","tags":["guard","woman"],"emoji":"๐โโ๏ธ","order":1414,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["ninja"],"annotation":"ninja","tags":["fighter","hidden","stealth"],"emoji":"๐ฅท","order":1426,"group":1,"version":13,"skins":[{"emoji":"๐ฅท๐ป","version":13,"tone":1},{"emoji":"๐ฅท๐ผ","version":13,"tone":2},{"emoji":"๐ฅท๐ฝ","version":13,"tone":3},{"emoji":"๐ฅท๐พ","version":13,"tone":4},{"emoji":"๐ฅท๐ฟ","version":13,"tone":5}]},{"shortcodes":["construction_worker"],"annotation":"construction worker","tags":["construction","hat","worker"],"emoji":"๐ท","order":1432,"group":1,"version":0.6,"skins":[{"emoji":"๐ท๐ป","version":1,"tone":1},{"emoji":"๐ท๐ผ","version":1,"tone":2},{"emoji":"๐ท๐ฝ","version":1,"tone":3},{"emoji":"๐ท๐พ","version":1,"tone":4},{"emoji":"๐ท๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_construction_worker"],"annotation":"man construction worker","tags":["construction","man","worker"],"emoji":"๐ทโโ๏ธ","order":1438,"group":1,"version":4,"skins":[{"emoji":"๐ท๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ท๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ท๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ท๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ท๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_construction_worker"],"annotation":"woman construction worker","tags":["construction","woman","worker"],"emoji":"๐ทโโ๏ธ","order":1450,"group":1,"version":4,"skins":[{"emoji":"๐ท๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ท๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ท๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ท๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ท๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["person_with_crown","royalty"],"annotation":"person with crown","tags":["monarch","noble","regal","royalty"],"emoji":"๐ซ ","order":1462,"group":1,"version":14,"skins":[{"emoji":"๐ซ ๐ป","version":14,"tone":1},{"emoji":"๐ซ ๐ผ","version":14,"tone":2},{"emoji":"๐ซ ๐ฝ","version":14,"tone":3},{"emoji":"๐ซ ๐พ","version":14,"tone":4},{"emoji":"๐ซ ๐ฟ","version":14,"tone":5}]},{"shortcodes":["prince"],"annotation":"prince","tags":["prince"],"emoji":"๐คด","order":1468,"group":1,"version":3,"skins":[{"emoji":"๐คด๐ป","version":3,"tone":1},{"emoji":"๐คด๐ผ","version":3,"tone":2},{"emoji":"๐คด๐ฝ","version":3,"tone":3},{"emoji":"๐คด๐พ","version":3,"tone":4},{"emoji":"๐คด๐ฟ","version":3,"tone":5}]},{"shortcodes":["princess"],"annotation":"princess","tags":["fairy tale","fantasy"],"emoji":"๐ธ","order":1474,"group":1,"version":0.6,"skins":[{"emoji":"๐ธ๐ป","version":1,"tone":1},{"emoji":"๐ธ๐ผ","version":1,"tone":2},{"emoji":"๐ธ๐ฝ","version":1,"tone":3},{"emoji":"๐ธ๐พ","version":1,"tone":4},{"emoji":"๐ธ๐ฟ","version":1,"tone":5}]},{"shortcodes":["person_wearing_turban"],"annotation":"person wearing turban","tags":["turban"],"emoji":"๐ณ","order":1480,"group":1,"version":0.6,"skins":[{"emoji":"๐ณ๐ป","version":1,"tone":1},{"emoji":"๐ณ๐ผ","version":1,"tone":2},{"emoji":"๐ณ๐ฝ","version":1,"tone":3},{"emoji":"๐ณ๐พ","version":1,"tone":4},{"emoji":"๐ณ๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_wearing_turban"],"annotation":"man wearing turban","tags":["man","turban"],"emoji":"๐ณโโ๏ธ","order":1486,"group":1,"version":4,"skins":[{"emoji":"๐ณ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ณ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ณ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ณ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ณ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_wearing_turban"],"annotation":"woman wearing turban","tags":["turban","woman"],"emoji":"๐ณโโ๏ธ","order":1498,"group":1,"version":4,"skins":[{"emoji":"๐ณ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ณ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ณ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ณ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ณ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["person_with_skullcap"],"annotation":"person with skullcap","tags":["cap","gua pi mao","hat","person","skullcap"],"emoji":"๐ฒ","order":1510,"group":1,"version":0.6,"skins":[{"emoji":"๐ฒ๐ป","version":1,"tone":1},{"emoji":"๐ฒ๐ผ","version":1,"tone":2},{"emoji":"๐ฒ๐ฝ","version":1,"tone":3},{"emoji":"๐ฒ๐พ","version":1,"tone":4},{"emoji":"๐ฒ๐ฟ","version":1,"tone":5}]},{"shortcodes":["woman_with_headscarf"],"annotation":"woman with headscarf","tags":["headscarf","hijab","mantilla","tichel"],"emoji":"๐ง","order":1516,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ป","version":5,"tone":1},{"emoji":"๐ง๐ผ","version":5,"tone":2},{"emoji":"๐ง๐ฝ","version":5,"tone":3},{"emoji":"๐ง๐พ","version":5,"tone":4},{"emoji":"๐ง๐ฟ","version":5,"tone":5}]},{"shortcodes":["person_in_tuxedo"],"annotation":"person in tuxedo","tags":["groom","person","tuxedo"],"emoji":"๐คต","order":1522,"group":1,"version":3,"skins":[{"emoji":"๐คต๐ป","version":3,"tone":1},{"emoji":"๐คต๐ผ","version":3,"tone":2},{"emoji":"๐คต๐ฝ","version":3,"tone":3},{"emoji":"๐คต๐พ","version":3,"tone":4},{"emoji":"๐คต๐ฟ","version":3,"tone":5}]},{"shortcodes":["man_in_tuxedo"],"annotation":"man in tuxedo","tags":["man","tuxedo"],"emoji":"๐คตโโ๏ธ","order":1528,"group":1,"version":13,"skins":[{"emoji":"๐คต๐ปโโ๏ธ","version":13,"tone":1},{"emoji":"๐คต๐ผโโ๏ธ","version":13,"tone":2},{"emoji":"๐คต๐ฝโโ๏ธ","version":13,"tone":3},{"emoji":"๐คต๐พโโ๏ธ","version":13,"tone":4},{"emoji":"๐คต๐ฟโโ๏ธ","version":13,"tone":5}]},{"shortcodes":["woman_in_tuxedo"],"annotation":"woman in tuxedo","tags":["tuxedo","woman"],"emoji":"๐คตโโ๏ธ","order":1540,"group":1,"version":13,"skins":[{"emoji":"๐คต๐ปโโ๏ธ","version":13,"tone":1},{"emoji":"๐คต๐ผโโ๏ธ","version":13,"tone":2},{"emoji":"๐คต๐ฝโโ๏ธ","version":13,"tone":3},{"emoji":"๐คต๐พโโ๏ธ","version":13,"tone":4},{"emoji":"๐คต๐ฟโโ๏ธ","version":13,"tone":5}]},{"shortcodes":["person_with_veil"],"annotation":"person with veil","tags":["bride","person","veil","wedding"],"emoji":"๐ฐ","order":1552,"group":1,"version":0.6,"skins":[{"emoji":"๐ฐ๐ป","version":1,"tone":1},{"emoji":"๐ฐ๐ผ","version":1,"tone":2},{"emoji":"๐ฐ๐ฝ","version":1,"tone":3},{"emoji":"๐ฐ๐พ","version":1,"tone":4},{"emoji":"๐ฐ๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_with_veil"],"annotation":"man with veil","tags":["man","veil"],"emoji":"๐ฐโโ๏ธ","order":1558,"group":1,"version":13,"skins":[{"emoji":"๐ฐ๐ปโโ๏ธ","version":13,"tone":1},{"emoji":"๐ฐ๐ผโโ๏ธ","version":13,"tone":2},{"emoji":"๐ฐ๐ฝโโ๏ธ","version":13,"tone":3},{"emoji":"๐ฐ๐พโโ๏ธ","version":13,"tone":4},{"emoji":"๐ฐ๐ฟโโ๏ธ","version":13,"tone":5}]},{"shortcodes":["woman_with_veil"],"annotation":"woman with veil","tags":["veil","woman"],"emoji":"๐ฐโโ๏ธ","order":1570,"group":1,"version":13,"skins":[{"emoji":"๐ฐ๐ปโโ๏ธ","version":13,"tone":1},{"emoji":"๐ฐ๐ผโโ๏ธ","version":13,"tone":2},{"emoji":"๐ฐ๐ฝโโ๏ธ","version":13,"tone":3},{"emoji":"๐ฐ๐พโโ๏ธ","version":13,"tone":4},{"emoji":"๐ฐ๐ฟโโ๏ธ","version":13,"tone":5}]},{"shortcodes":["pregnant_woman"],"annotation":"pregnant woman","tags":["pregnant","woman"],"emoji":"๐คฐ","order":1582,"group":1,"version":3,"skins":[{"emoji":"๐คฐ๐ป","version":3,"tone":1},{"emoji":"๐คฐ๐ผ","version":3,"tone":2},{"emoji":"๐คฐ๐ฝ","version":3,"tone":3},{"emoji":"๐คฐ๐พ","version":3,"tone":4},{"emoji":"๐คฐ๐ฟ","version":3,"tone":5}]},{"shortcodes":["pregnant_man"],"annotation":"pregnant man","tags":["belly","bloated","full","pregnant"],"emoji":"๐ซ","order":1588,"group":1,"version":14,"skins":[{"emoji":"๐ซ๐ป","version":14,"tone":1},{"emoji":"๐ซ๐ผ","version":14,"tone":2},{"emoji":"๐ซ๐ฝ","version":14,"tone":3},{"emoji":"๐ซ๐พ","version":14,"tone":4},{"emoji":"๐ซ๐ฟ","version":14,"tone":5}]},{"shortcodes":["pregnant_person"],"annotation":"pregnant person","tags":["belly","bloated","full","pregnant"],"emoji":"๐ซ","order":1594,"group":1,"version":14,"skins":[{"emoji":"๐ซ๐ป","version":14,"tone":1},{"emoji":"๐ซ๐ผ","version":14,"tone":2},{"emoji":"๐ซ๐ฝ","version":14,"tone":3},{"emoji":"๐ซ๐พ","version":14,"tone":4},{"emoji":"๐ซ๐ฟ","version":14,"tone":5}]},{"shortcodes":["breast_feeding"],"annotation":"breast-feeding","tags":["baby","breast","nursing"],"emoji":"๐คฑ","order":1600,"group":1,"version":5,"skins":[{"emoji":"๐คฑ๐ป","version":5,"tone":1},{"emoji":"๐คฑ๐ผ","version":5,"tone":2},{"emoji":"๐คฑ๐ฝ","version":5,"tone":3},{"emoji":"๐คฑ๐พ","version":5,"tone":4},{"emoji":"๐คฑ๐ฟ","version":5,"tone":5}]},{"shortcodes":["woman_feeding_baby"],"annotation":"woman feeding baby","tags":["baby","feeding","nursing","woman"],"emoji":"๐ฉโ๐ผ","order":1606,"group":1,"version":13,"skins":[{"emoji":"๐ฉ๐ปโ๐ผ","version":13,"tone":1},{"emoji":"๐ฉ๐ผโ๐ผ","version":13,"tone":2},{"emoji":"๐ฉ๐ฝโ๐ผ","version":13,"tone":3},{"emoji":"๐ฉ๐พโ๐ผ","version":13,"tone":4},{"emoji":"๐ฉ๐ฟโ๐ผ","version":13,"tone":5}]},{"shortcodes":["man_feeding_baby"],"annotation":"man feeding baby","tags":["baby","feeding","man","nursing"],"emoji":"๐จโ๐ผ","order":1612,"group":1,"version":13,"skins":[{"emoji":"๐จ๐ปโ๐ผ","version":13,"tone":1},{"emoji":"๐จ๐ผโ๐ผ","version":13,"tone":2},{"emoji":"๐จ๐ฝโ๐ผ","version":13,"tone":3},{"emoji":"๐จ๐พโ๐ผ","version":13,"tone":4},{"emoji":"๐จ๐ฟโ๐ผ","version":13,"tone":5}]},{"shortcodes":["person_feeding_baby"],"annotation":"person feeding baby","tags":["baby","feeding","nursing","person"],"emoji":"๐งโ๐ผ","order":1618,"group":1,"version":13,"skins":[{"emoji":"๐ง๐ปโ๐ผ","version":13,"tone":1},{"emoji":"๐ง๐ผโ๐ผ","version":13,"tone":2},{"emoji":"๐ง๐ฝโ๐ผ","version":13,"tone":3},{"emoji":"๐ง๐พโ๐ผ","version":13,"tone":4},{"emoji":"๐ง๐ฟโ๐ผ","version":13,"tone":5}]},{"shortcodes":["angel"],"annotation":"baby angel","tags":["angel","baby","face","fairy tale","fantasy"],"emoji":"๐ผ","order":1624,"group":1,"version":0.6,"skins":[{"emoji":"๐ผ๐ป","version":1,"tone":1},{"emoji":"๐ผ๐ผ","version":1,"tone":2},{"emoji":"๐ผ๐ฝ","version":1,"tone":3},{"emoji":"๐ผ๐พ","version":1,"tone":4},{"emoji":"๐ผ๐ฟ","version":1,"tone":5}]},{"shortcodes":["santa"],"annotation":"Santa Claus","tags":["celebration","christmas","claus","father","santa","santa claus"],"emoji":"๐ ","order":1630,"group":1,"version":0.6,"skins":[{"emoji":"๐ ๐ป","version":1,"tone":1},{"emoji":"๐ ๐ผ","version":1,"tone":2},{"emoji":"๐ ๐ฝ","version":1,"tone":3},{"emoji":"๐ ๐พ","version":1,"tone":4},{"emoji":"๐ ๐ฟ","version":1,"tone":5}]},{"shortcodes":["mrs_claus"],"annotation":"Mrs. Claus","tags":["celebration","christmas","claus","mother","mrs.","mrs. claus"],"emoji":"๐คถ","order":1636,"group":1,"version":3,"skins":[{"emoji":"๐คถ๐ป","version":3,"tone":1},{"emoji":"๐คถ๐ผ","version":3,"tone":2},{"emoji":"๐คถ๐ฝ","version":3,"tone":3},{"emoji":"๐คถ๐พ","version":3,"tone":4},{"emoji":"๐คถ๐ฟ","version":3,"tone":5}]},{"shortcodes":["mx_claus"],"annotation":"mx claus","tags":["claus, christmas"],"emoji":"๐งโ๐","order":1642,"group":1,"version":13,"skins":[{"emoji":"๐ง๐ปโ๐","version":13,"tone":1},{"emoji":"๐ง๐ผโ๐","version":13,"tone":2},{"emoji":"๐ง๐ฝโ๐","version":13,"tone":3},{"emoji":"๐ง๐พโ๐","version":13,"tone":4},{"emoji":"๐ง๐ฟโ๐","version":13,"tone":5}]},{"shortcodes":["superhero"],"annotation":"superhero","tags":["good","hero","heroine","superpower"],"emoji":"๐ฆธ","order":1648,"group":1,"version":11,"skins":[{"emoji":"๐ฆธ๐ป","version":11,"tone":1},{"emoji":"๐ฆธ๐ผ","version":11,"tone":2},{"emoji":"๐ฆธ๐ฝ","version":11,"tone":3},{"emoji":"๐ฆธ๐พ","version":11,"tone":4},{"emoji":"๐ฆธ๐ฟ","version":11,"tone":5}]},{"shortcodes":["man_superhero"],"annotation":"man superhero","tags":["good","hero","man","superpower"],"emoji":"๐ฆธโโ๏ธ","order":1654,"group":1,"version":11,"skins":[{"emoji":"๐ฆธ๐ปโโ๏ธ","version":11,"tone":1},{"emoji":"๐ฆธ๐ผโโ๏ธ","version":11,"tone":2},{"emoji":"๐ฆธ๐ฝโโ๏ธ","version":11,"tone":3},{"emoji":"๐ฆธ๐พโโ๏ธ","version":11,"tone":4},{"emoji":"๐ฆธ๐ฟโโ๏ธ","version":11,"tone":5}]},{"shortcodes":["woman_superhero"],"annotation":"woman superhero","tags":["good","hero","heroine","superpower","woman"],"emoji":"๐ฆธโโ๏ธ","order":1666,"group":1,"version":11,"skins":[{"emoji":"๐ฆธ๐ปโโ๏ธ","version":11,"tone":1},{"emoji":"๐ฆธ๐ผโโ๏ธ","version":11,"tone":2},{"emoji":"๐ฆธ๐ฝโโ๏ธ","version":11,"tone":3},{"emoji":"๐ฆธ๐พโโ๏ธ","version":11,"tone":4},{"emoji":"๐ฆธ๐ฟโโ๏ธ","version":11,"tone":5}]},{"shortcodes":["supervillain"],"annotation":"supervillain","tags":["criminal","evil","superpower","villain"],"emoji":"๐ฆน","order":1678,"group":1,"version":11,"skins":[{"emoji":"๐ฆน๐ป","version":11,"tone":1},{"emoji":"๐ฆน๐ผ","version":11,"tone":2},{"emoji":"๐ฆน๐ฝ","version":11,"tone":3},{"emoji":"๐ฆน๐พ","version":11,"tone":4},{"emoji":"๐ฆน๐ฟ","version":11,"tone":5}]},{"shortcodes":["man_supervillain"],"annotation":"man supervillain","tags":["criminal","evil","man","superpower","villain"],"emoji":"๐ฆนโโ๏ธ","order":1684,"group":1,"version":11,"skins":[{"emoji":"๐ฆน๐ปโโ๏ธ","version":11,"tone":1},{"emoji":"๐ฆน๐ผโโ๏ธ","version":11,"tone":2},{"emoji":"๐ฆน๐ฝโโ๏ธ","version":11,"tone":3},{"emoji":"๐ฆน๐พโโ๏ธ","version":11,"tone":4},{"emoji":"๐ฆน๐ฟโโ๏ธ","version":11,"tone":5}]},{"shortcodes":["woman_supervillain"],"annotation":"woman supervillain","tags":["criminal","evil","superpower","villain","woman"],"emoji":"๐ฆนโโ๏ธ","order":1696,"group":1,"version":11,"skins":[{"emoji":"๐ฆน๐ปโโ๏ธ","version":11,"tone":1},{"emoji":"๐ฆน๐ผโโ๏ธ","version":11,"tone":2},{"emoji":"๐ฆน๐ฝโโ๏ธ","version":11,"tone":3},{"emoji":"๐ฆน๐พโโ๏ธ","version":11,"tone":4},{"emoji":"๐ฆน๐ฟโโ๏ธ","version":11,"tone":5}]},{"shortcodes":["mage"],"annotation":"mage","tags":["sorcerer","sorceress","witch","wizard"],"emoji":"๐ง","order":1708,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ป","version":5,"tone":1},{"emoji":"๐ง๐ผ","version":5,"tone":2},{"emoji":"๐ง๐ฝ","version":5,"tone":3},{"emoji":"๐ง๐พ","version":5,"tone":4},{"emoji":"๐ง๐ฟ","version":5,"tone":5}]},{"shortcodes":["man_mage"],"annotation":"man mage","tags":["sorcerer","wizard"],"emoji":"๐งโโ๏ธ","order":1714,"group":1,"version":5,"emoticon":":{>","skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":5,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":5,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":5,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":5,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":5,"tone":5}]},{"shortcodes":["woman_mage"],"annotation":"woman mage","tags":["sorceress","witch"],"emoji":"๐งโโ๏ธ","order":1726,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":5,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":5,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":5,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":5,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":5,"tone":5}]},{"shortcodes":["fairy"],"annotation":"fairy","tags":["oberon","puck","titania"],"emoji":"๐ง","order":1738,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ป","version":5,"tone":1},{"emoji":"๐ง๐ผ","version":5,"tone":2},{"emoji":"๐ง๐ฝ","version":5,"tone":3},{"emoji":"๐ง๐พ","version":5,"tone":4},{"emoji":"๐ง๐ฟ","version":5,"tone":5}]},{"shortcodes":["man_fairy"],"annotation":"man fairy","tags":["oberon","puck"],"emoji":"๐งโโ๏ธ","order":1744,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":5,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":5,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":5,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":5,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":5,"tone":5}]},{"shortcodes":["woman_fairy"],"annotation":"woman fairy","tags":["titania"],"emoji":"๐งโโ๏ธ","order":1756,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":5,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":5,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":5,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":5,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":5,"tone":5}]},{"shortcodes":["vampire"],"annotation":"vampire","tags":["dracula","undead"],"emoji":"๐ง","order":1768,"group":1,"version":5,"emoticon":":E","skins":[{"emoji":"๐ง๐ป","version":5,"tone":1},{"emoji":"๐ง๐ผ","version":5,"tone":2},{"emoji":"๐ง๐ฝ","version":5,"tone":3},{"emoji":"๐ง๐พ","version":5,"tone":4},{"emoji":"๐ง๐ฟ","version":5,"tone":5}]},{"shortcodes":["man_vampire"],"annotation":"man vampire","tags":["dracula","undead"],"emoji":"๐งโโ๏ธ","order":1774,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":5,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":5,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":5,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":5,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":5,"tone":5}]},{"shortcodes":["woman_vampire"],"annotation":"woman vampire","tags":["undead"],"emoji":"๐งโโ๏ธ","order":1786,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":5,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":5,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":5,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":5,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":5,"tone":5}]},{"shortcodes":["merperson"],"annotation":"merperson","tags":["mermaid","merman","merwoman"],"emoji":"๐ง","order":1798,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ป","version":5,"tone":1},{"emoji":"๐ง๐ผ","version":5,"tone":2},{"emoji":"๐ง๐ฝ","version":5,"tone":3},{"emoji":"๐ง๐พ","version":5,"tone":4},{"emoji":"๐ง๐ฟ","version":5,"tone":5}]},{"shortcodes":["merman"],"annotation":"merman","tags":["triton"],"emoji":"๐งโโ๏ธ","order":1804,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":5,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":5,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":5,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":5,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":5,"tone":5}]},{"shortcodes":["mermaid"],"annotation":"mermaid","tags":["merwoman"],"emoji":"๐งโโ๏ธ","order":1816,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":5,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":5,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":5,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":5,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":5,"tone":5}]},{"shortcodes":["elf"],"annotation":"elf","tags":["magical"],"emoji":"๐ง","order":1828,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ป","version":5,"tone":1},{"emoji":"๐ง๐ผ","version":5,"tone":2},{"emoji":"๐ง๐ฝ","version":5,"tone":3},{"emoji":"๐ง๐พ","version":5,"tone":4},{"emoji":"๐ง๐ฟ","version":5,"tone":5}]},{"shortcodes":["man_elf"],"annotation":"man elf","tags":["magical"],"emoji":"๐งโโ๏ธ","order":1834,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":5,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":5,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":5,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":5,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":5,"tone":5}]},{"shortcodes":["woman_elf"],"annotation":"woman elf","tags":["magical"],"emoji":"๐งโโ๏ธ","order":1846,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":5,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":5,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":5,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":5,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":5,"tone":5}]},{"shortcodes":["genie"],"annotation":"genie","tags":["djinn"],"emoji":"๐ง","order":1858,"group":1,"version":5},{"shortcodes":["man_genie"],"annotation":"man genie","tags":["djinn"],"emoji":"๐งโโ๏ธ","order":1859,"group":1,"version":5},{"shortcodes":["woman_genie"],"annotation":"woman genie","tags":["djinn"],"emoji":"๐งโโ๏ธ","order":1861,"group":1,"version":5},{"shortcodes":["zombie"],"annotation":"zombie","tags":["undead","walking dead"],"emoji":"๐ง","order":1863,"group":1,"version":5,"emoticon":"8#"},{"shortcodes":["man_zombie"],"annotation":"man zombie","tags":["undead","walking dead"],"emoji":"๐งโโ๏ธ","order":1864,"group":1,"version":5},{"shortcodes":["woman_zombie"],"annotation":"woman zombie","tags":["undead","walking dead"],"emoji":"๐งโโ๏ธ","order":1866,"group":1,"version":5},{"shortcodes":["troll"],"annotation":"troll","tags":["fairy tale","fantasy","monster"],"emoji":"๐ง","order":1868,"group":1,"version":14},{"shortcodes":["massage","person_getting_massage"],"annotation":"person getting massage","tags":["face","massage","salon"],"emoji":"๐","order":1869,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_getting_massage"],"annotation":"man getting massage","tags":["face","man","massage"],"emoji":"๐โโ๏ธ","order":1875,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_getting_massage"],"annotation":"woman getting massage","tags":["face","massage","woman"],"emoji":"๐โโ๏ธ","order":1887,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["haircut","person_getting_haircut"],"annotation":"person getting haircut","tags":["barber","beauty","haircut","parlor"],"emoji":"๐","order":1899,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_getting_haircut"],"annotation":"man getting haircut","tags":["haircut","man"],"emoji":"๐โโ๏ธ","order":1905,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_getting_haircut"],"annotation":"woman getting haircut","tags":["haircut","woman"],"emoji":"๐โโ๏ธ","order":1917,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["person_walking","walking"],"annotation":"person walking","tags":["hike","walk","walking"],"emoji":"๐ถ","order":1929,"group":1,"version":0.6,"skins":[{"emoji":"๐ถ๐ป","version":1,"tone":1},{"emoji":"๐ถ๐ผ","version":1,"tone":2},{"emoji":"๐ถ๐ฝ","version":1,"tone":3},{"emoji":"๐ถ๐พ","version":1,"tone":4},{"emoji":"๐ถ๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_walking"],"annotation":"man walking","tags":["hike","man","walk"],"emoji":"๐ถโโ๏ธ","order":1935,"group":1,"version":4,"skins":[{"emoji":"๐ถ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ถ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ถ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ถ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ถ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_walking"],"annotation":"woman walking","tags":["hike","walk","woman"],"emoji":"๐ถโโ๏ธ","order":1947,"group":1,"version":4,"skins":[{"emoji":"๐ถ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ถ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ถ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ถ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ถ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["person_standing","standing"],"annotation":"person standing","tags":["stand","standing"],"emoji":"๐ง","order":1959,"group":1,"version":12,"skins":[{"emoji":"๐ง๐ป","version":12,"tone":1},{"emoji":"๐ง๐ผ","version":12,"tone":2},{"emoji":"๐ง๐ฝ","version":12,"tone":3},{"emoji":"๐ง๐พ","version":12,"tone":4},{"emoji":"๐ง๐ฟ","version":12,"tone":5}]},{"shortcodes":["man_standing"],"annotation":"man standing","tags":["man","standing"],"emoji":"๐งโโ๏ธ","order":1965,"group":1,"version":12,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":12,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":12,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":12,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":12,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":12,"tone":5}]},{"shortcodes":["woman_standing"],"annotation":"woman standing","tags":["standing","woman"],"emoji":"๐งโโ๏ธ","order":1977,"group":1,"version":12,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":12,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":12,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":12,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":12,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":12,"tone":5}]},{"shortcodes":["kneeling","person_kneeling"],"annotation":"person kneeling","tags":["kneel","kneeling"],"emoji":"๐ง","order":1989,"group":1,"version":12,"skins":[{"emoji":"๐ง๐ป","version":12,"tone":1},{"emoji":"๐ง๐ผ","version":12,"tone":2},{"emoji":"๐ง๐ฝ","version":12,"tone":3},{"emoji":"๐ง๐พ","version":12,"tone":4},{"emoji":"๐ง๐ฟ","version":12,"tone":5}]},{"shortcodes":["man_kneeling"],"annotation":"man kneeling","tags":["kneeling","man"],"emoji":"๐งโโ๏ธ","order":1995,"group":1,"version":12,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":12,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":12,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":12,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":12,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":12,"tone":5}]},{"shortcodes":["woman_kneeling"],"annotation":"woman kneeling","tags":["kneeling","woman"],"emoji":"๐งโโ๏ธ","order":2007,"group":1,"version":12,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":12,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":12,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":12,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":12,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":12,"tone":5}]},{"shortcodes":["person_with_probing_cane","person_with_white_cane"],"annotation":"person with white cane","tags":["accessibility","blind"],"emoji":"๐งโ๐ฆฏ","order":2019,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโ๐ฆฏ","version":12.1,"tone":1},{"emoji":"๐ง๐ผโ๐ฆฏ","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโ๐ฆฏ","version":12.1,"tone":3},{"emoji":"๐ง๐พโ๐ฆฏ","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโ๐ฆฏ","version":12.1,"tone":5}]},{"shortcodes":["man_with_probing_cane","man_with_white_cane"],"annotation":"man with white cane","tags":["accessibility","blind","man"],"emoji":"๐จโ๐ฆฏ","order":2025,"group":1,"version":12,"skins":[{"emoji":"๐จ๐ปโ๐ฆฏ","version":12,"tone":1},{"emoji":"๐จ๐ผโ๐ฆฏ","version":12,"tone":2},{"emoji":"๐จ๐ฝโ๐ฆฏ","version":12,"tone":3},{"emoji":"๐จ๐พโ๐ฆฏ","version":12,"tone":4},{"emoji":"๐จ๐ฟโ๐ฆฏ","version":12,"tone":5}]},{"shortcodes":["woman_with_probing_cane","woman_with_white_cane"],"annotation":"woman with white cane","tags":["accessibility","blind","woman"],"emoji":"๐ฉโ๐ฆฏ","order":2031,"group":1,"version":12,"skins":[{"emoji":"๐ฉ๐ปโ๐ฆฏ","version":12,"tone":1},{"emoji":"๐ฉ๐ผโ๐ฆฏ","version":12,"tone":2},{"emoji":"๐ฉ๐ฝโ๐ฆฏ","version":12,"tone":3},{"emoji":"๐ฉ๐พโ๐ฆฏ","version":12,"tone":4},{"emoji":"๐ฉ๐ฟโ๐ฆฏ","version":12,"tone":5}]},{"shortcodes":["person_in_motorized_wheelchair"],"annotation":"person in motorized wheelchair","tags":["accessibility","wheelchair"],"emoji":"๐งโ๐ฆผ","order":2037,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโ๐ฆผ","version":12.1,"tone":1},{"emoji":"๐ง๐ผโ๐ฆผ","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโ๐ฆผ","version":12.1,"tone":3},{"emoji":"๐ง๐พโ๐ฆผ","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโ๐ฆผ","version":12.1,"tone":5}]},{"shortcodes":["man_in_motorized_wheelchair"],"annotation":"man in motorized wheelchair","tags":["accessibility","man","wheelchair"],"emoji":"๐จโ๐ฆผ","order":2043,"group":1,"version":12,"skins":[{"emoji":"๐จ๐ปโ๐ฆผ","version":12,"tone":1},{"emoji":"๐จ๐ผโ๐ฆผ","version":12,"tone":2},{"emoji":"๐จ๐ฝโ๐ฆผ","version":12,"tone":3},{"emoji":"๐จ๐พโ๐ฆผ","version":12,"tone":4},{"emoji":"๐จ๐ฟโ๐ฆผ","version":12,"tone":5}]},{"shortcodes":["woman_in_motorized_wheelchair"],"annotation":"woman in motorized wheelchair","tags":["accessibility","wheelchair","woman"],"emoji":"๐ฉโ๐ฆผ","order":2049,"group":1,"version":12,"skins":[{"emoji":"๐ฉ๐ปโ๐ฆผ","version":12,"tone":1},{"emoji":"๐ฉ๐ผโ๐ฆผ","version":12,"tone":2},{"emoji":"๐ฉ๐ฝโ๐ฆผ","version":12,"tone":3},{"emoji":"๐ฉ๐พโ๐ฆผ","version":12,"tone":4},{"emoji":"๐ฉ๐ฟโ๐ฆผ","version":12,"tone":5}]},{"shortcodes":["person_in_manual_wheelchair"],"annotation":"person in manual wheelchair","tags":["accessibility","wheelchair"],"emoji":"๐งโ๐ฆฝ","order":2055,"group":1,"version":12.1,"skins":[{"emoji":"๐ง๐ปโ๐ฆฝ","version":12.1,"tone":1},{"emoji":"๐ง๐ผโ๐ฆฝ","version":12.1,"tone":2},{"emoji":"๐ง๐ฝโ๐ฆฝ","version":12.1,"tone":3},{"emoji":"๐ง๐พโ๐ฆฝ","version":12.1,"tone":4},{"emoji":"๐ง๐ฟโ๐ฆฝ","version":12.1,"tone":5}]},{"shortcodes":["man_in_manual_wheelchair"],"annotation":"man in manual wheelchair","tags":["accessibility","man","wheelchair"],"emoji":"๐จโ๐ฆฝ","order":2061,"group":1,"version":12,"skins":[{"emoji":"๐จ๐ปโ๐ฆฝ","version":12,"tone":1},{"emoji":"๐จ๐ผโ๐ฆฝ","version":12,"tone":2},{"emoji":"๐จ๐ฝโ๐ฆฝ","version":12,"tone":3},{"emoji":"๐จ๐พโ๐ฆฝ","version":12,"tone":4},{"emoji":"๐จ๐ฟโ๐ฆฝ","version":12,"tone":5}]},{"shortcodes":["woman_in_manual_wheelchair"],"annotation":"woman in manual wheelchair","tags":["accessibility","wheelchair","woman"],"emoji":"๐ฉโ๐ฆฝ","order":2067,"group":1,"version":12,"skins":[{"emoji":"๐ฉ๐ปโ๐ฆฝ","version":12,"tone":1},{"emoji":"๐ฉ๐ผโ๐ฆฝ","version":12,"tone":2},{"emoji":"๐ฉ๐ฝโ๐ฆฝ","version":12,"tone":3},{"emoji":"๐ฉ๐พโ๐ฆฝ","version":12,"tone":4},{"emoji":"๐ฉ๐ฟโ๐ฆฝ","version":12,"tone":5}]},{"shortcodes":["person_running","running"],"annotation":"person running","tags":["marathon","running"],"emoji":"๐","order":2073,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_running"],"annotation":"man running","tags":["man","marathon","racing","running"],"emoji":"๐โโ๏ธ","order":2079,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_running"],"annotation":"woman running","tags":["marathon","racing","running","woman"],"emoji":"๐โโ๏ธ","order":2091,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["dancer","woman_dancing"],"annotation":"woman dancing","tags":["dance","dancing","woman"],"emoji":"๐","order":2103,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_dancing"],"annotation":"man dancing","tags":["dance","dancing","man"],"emoji":"๐บ","order":2109,"group":1,"version":3,"skins":[{"emoji":"๐บ๐ป","version":3,"tone":1},{"emoji":"๐บ๐ผ","version":3,"tone":2},{"emoji":"๐บ๐ฝ","version":3,"tone":3},{"emoji":"๐บ๐พ","version":3,"tone":4},{"emoji":"๐บ๐ฟ","version":3,"tone":5}]},{"shortcodes":["levitate","levitating","person_in_suit_levitating"],"annotation":"person in suit levitating","tags":["business","person","suit"],"emoji":"๐ด๏ธ","order":2116,"group":1,"version":0.7,"skins":[{"emoji":"๐ด๐ป","version":4,"tone":1},{"emoji":"๐ด๐ผ","version":4,"tone":2},{"emoji":"๐ด๐ฝ","version":4,"tone":3},{"emoji":"๐ด๐พ","version":4,"tone":4},{"emoji":"๐ด๐ฟ","version":4,"tone":5}]},{"shortcodes":["dancers","people_with_bunny_ears_partying"],"annotation":"people with bunny ears","tags":["bunny ear","dancer","partying"],"emoji":"๐ฏ","order":2122,"group":1,"version":0.6},{"shortcodes":["men_with_bunny_ears_partying"],"annotation":"men with bunny ears","tags":["bunny ear","dancer","men","partying"],"emoji":"๐ฏโโ๏ธ","order":2123,"group":1,"version":4},{"shortcodes":["women_with_bunny_ears_partying"],"annotation":"women with bunny ears","tags":["bunny ear","dancer","partying","women"],"emoji":"๐ฏโโ๏ธ","order":2125,"group":1,"version":4},{"shortcodes":["person_in_steamy_room"],"annotation":"person in steamy room","tags":["sauna","steam room"],"emoji":"๐ง","order":2127,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ป","version":5,"tone":1},{"emoji":"๐ง๐ผ","version":5,"tone":2},{"emoji":"๐ง๐ฝ","version":5,"tone":3},{"emoji":"๐ง๐พ","version":5,"tone":4},{"emoji":"๐ง๐ฟ","version":5,"tone":5}]},{"shortcodes":["man_in_steamy_room"],"annotation":"man in steamy room","tags":["sauna","steam room"],"emoji":"๐งโโ๏ธ","order":2133,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":5,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":5,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":5,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":5,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":5,"tone":5}]},{"shortcodes":["woman_in_steamy_room"],"annotation":"woman in steamy room","tags":["sauna","steam room"],"emoji":"๐งโโ๏ธ","order":2145,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":5,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":5,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":5,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":5,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":5,"tone":5}]},{"shortcodes":["climbing","person_climbing"],"annotation":"person climbing","tags":["climber"],"emoji":"๐ง","order":2157,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ป","version":5,"tone":1},{"emoji":"๐ง๐ผ","version":5,"tone":2},{"emoji":"๐ง๐ฝ","version":5,"tone":3},{"emoji":"๐ง๐พ","version":5,"tone":4},{"emoji":"๐ง๐ฟ","version":5,"tone":5}]},{"shortcodes":["man_climbing"],"annotation":"man climbing","tags":["climber"],"emoji":"๐งโโ๏ธ","order":2163,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":5,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":5,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":5,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":5,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":5,"tone":5}]},{"shortcodes":["woman_climbing"],"annotation":"woman climbing","tags":["climber"],"emoji":"๐งโโ๏ธ","order":2175,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":5,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":5,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":5,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":5,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":5,"tone":5}]},{"shortcodes":["fencer","fencing","person_fencing"],"annotation":"person fencing","tags":["fencer","fencing","sword"],"emoji":"๐คบ","order":2187,"group":1,"version":3},{"shortcodes":["horse_racing"],"annotation":"horse racing","tags":["horse","jockey","racehorse","racing"],"emoji":"๐","order":2188,"group":1,"version":1,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["person_skiing","skier","skiing"],"annotation":"skier","tags":["ski","snow"],"emoji":"โท๏ธ","order":2195,"group":1,"version":0.7},{"shortcodes":["person_snowboarding","snowboarder","snowboarding"],"annotation":"snowboarder","tags":["ski","snow","snowboard"],"emoji":"๐๏ธ","order":2196,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["golfer","golfing","person_golfing"],"annotation":"person golfing","tags":["ball","golf"],"emoji":"๐๏ธ","order":2203,"group":1,"version":0.7,"skins":[{"emoji":"๐๐ป","version":4,"tone":1},{"emoji":"๐๐ผ","version":4,"tone":2},{"emoji":"๐๐ฝ","version":4,"tone":3},{"emoji":"๐๐พ","version":4,"tone":4},{"emoji":"๐๐ฟ","version":4,"tone":5}]},{"shortcodes":["man_golfing"],"annotation":"man golfing","tags":["golf","man"],"emoji":"๐๏ธโโ๏ธ","order":2209,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_golfing"],"annotation":"woman golfing","tags":["golf","woman"],"emoji":"๐๏ธโโ๏ธ","order":2223,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["person_surfing","surfer","surfing"],"annotation":"person surfing","tags":["surfing"],"emoji":"๐๏ธ","order":2237,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_surfing"],"annotation":"man surfing","tags":["man","surfing"],"emoji":"๐โโ๏ธ","order":2243,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_surfing"],"annotation":"woman surfing","tags":["surfing","woman"],"emoji":"๐โโ๏ธ","order":2255,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["person_rowing_boat","rowboat"],"annotation":"person rowing boat","tags":["boat","rowboat"],"emoji":"๐ฃ","order":2267,"group":1,"version":1,"skins":[{"emoji":"๐ฃ๐ป","version":1,"tone":1},{"emoji":"๐ฃ๐ผ","version":1,"tone":2},{"emoji":"๐ฃ๐ฝ","version":1,"tone":3},{"emoji":"๐ฃ๐พ","version":1,"tone":4},{"emoji":"๐ฃ๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_rowing_boat"],"annotation":"man rowing boat","tags":["boat","man","rowboat"],"emoji":"๐ฃโโ๏ธ","order":2273,"group":1,"version":4,"skins":[{"emoji":"๐ฃ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ฃ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ฃ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ฃ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ฃ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_rowing_boat"],"annotation":"woman rowing boat","tags":["boat","rowboat","woman"],"emoji":"๐ฃโโ๏ธ","order":2285,"group":1,"version":4,"skins":[{"emoji":"๐ฃ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ฃ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ฃ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ฃ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ฃ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["person_swimming","swimmer","swimming"],"annotation":"person swimming","tags":["swim"],"emoji":"๐๏ธ","order":2297,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_swimming"],"annotation":"man swimming","tags":["man","swim"],"emoji":"๐โโ๏ธ","order":2303,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_swimming"],"annotation":"woman swimming","tags":["swim","woman"],"emoji":"๐โโ๏ธ","order":2315,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["person_bouncing_ball"],"annotation":"person bouncing ball","tags":["ball"],"emoji":"โน๏ธ","order":2328,"group":1,"version":0.7,"skins":[{"emoji":"โน๐ป","version":2,"tone":1},{"emoji":"โน๐ผ","version":2,"tone":2},{"emoji":"โน๐ฝ","version":2,"tone":3},{"emoji":"โน๐พ","version":2,"tone":4},{"emoji":"โน๐ฟ","version":2,"tone":5}]},{"shortcodes":["man_bouncing_ball"],"annotation":"man bouncing ball","tags":["ball","man"],"emoji":"โน๏ธโโ๏ธ","order":2334,"group":1,"version":4,"skins":[{"emoji":"โน๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"โน๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"โน๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"โน๐พโโ๏ธ","version":4,"tone":4},{"emoji":"โน๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_bouncing_ball"],"annotation":"woman bouncing ball","tags":["ball","woman"],"emoji":"โน๏ธโโ๏ธ","order":2348,"group":1,"version":4,"skins":[{"emoji":"โน๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"โน๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"โน๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"โน๐พโโ๏ธ","version":4,"tone":4},{"emoji":"โน๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["person_lifting_weights","weight_lifter","weight_lifting"],"annotation":"person lifting weights","tags":["lifter","weight"],"emoji":"๐๏ธ","order":2363,"group":1,"version":0.7,"skins":[{"emoji":"๐๐ป","version":2,"tone":1},{"emoji":"๐๐ผ","version":2,"tone":2},{"emoji":"๐๐ฝ","version":2,"tone":3},{"emoji":"๐๐พ","version":2,"tone":4},{"emoji":"๐๐ฟ","version":2,"tone":5}]},{"shortcodes":["man_lifting_weights"],"annotation":"man lifting weights","tags":["man","weight lifter"],"emoji":"๐๏ธโโ๏ธ","order":2369,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_lifting_weights"],"annotation":"woman lifting weights","tags":["weight lifter","woman"],"emoji":"๐๏ธโโ๏ธ","order":2383,"group":1,"version":4,"skins":[{"emoji":"๐๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["bicyclist","biking","person_biking"],"annotation":"person biking","tags":["bicycle","biking","cyclist"],"emoji":"๐ด","order":2397,"group":1,"version":1,"skins":[{"emoji":"๐ด๐ป","version":1,"tone":1},{"emoji":"๐ด๐ผ","version":1,"tone":2},{"emoji":"๐ด๐ฝ","version":1,"tone":3},{"emoji":"๐ด๐พ","version":1,"tone":4},{"emoji":"๐ด๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_biking"],"annotation":"man biking","tags":["bicycle","biking","cyclist","man"],"emoji":"๐ดโโ๏ธ","order":2403,"group":1,"version":4,"skins":[{"emoji":"๐ด๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ด๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ด๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ด๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ด๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_biking"],"annotation":"woman biking","tags":["bicycle","biking","cyclist","woman"],"emoji":"๐ดโโ๏ธ","order":2415,"group":1,"version":4,"skins":[{"emoji":"๐ด๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ด๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ด๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ด๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ด๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["mountain_bicyclist","mountain_biking","person_mountain_biking"],"annotation":"person mountain biking","tags":["bicycle","bicyclist","bike","cyclist","mountain"],"emoji":"๐ต","order":2427,"group":1,"version":1,"skins":[{"emoji":"๐ต๐ป","version":1,"tone":1},{"emoji":"๐ต๐ผ","version":1,"tone":2},{"emoji":"๐ต๐ฝ","version":1,"tone":3},{"emoji":"๐ต๐พ","version":1,"tone":4},{"emoji":"๐ต๐ฟ","version":1,"tone":5}]},{"shortcodes":["man_mountain_biking"],"annotation":"man mountain biking","tags":["bicycle","bike","cyclist","man","mountain"],"emoji":"๐ตโโ๏ธ","order":2433,"group":1,"version":4,"skins":[{"emoji":"๐ต๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ต๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ต๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ต๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ต๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_mountain_biking"],"annotation":"woman mountain biking","tags":["bicycle","bike","biking","cyclist","mountain","woman"],"emoji":"๐ตโโ๏ธ","order":2445,"group":1,"version":4,"skins":[{"emoji":"๐ต๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐ต๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐ต๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐ต๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐ต๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["cartwheeling","person_cartwheel"],"annotation":"person cartwheeling","tags":["cartwheel","gymnastics"],"emoji":"๐คธ","order":2457,"group":1,"version":3,"skins":[{"emoji":"๐คธ๐ป","version":3,"tone":1},{"emoji":"๐คธ๐ผ","version":3,"tone":2},{"emoji":"๐คธ๐ฝ","version":3,"tone":3},{"emoji":"๐คธ๐พ","version":3,"tone":4},{"emoji":"๐คธ๐ฟ","version":3,"tone":5}]},{"shortcodes":["man_cartwheeling"],"annotation":"man cartwheeling","tags":["cartwheel","gymnastics","man"],"emoji":"๐คธโโ๏ธ","order":2463,"group":1,"version":4,"skins":[{"emoji":"๐คธ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐คธ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐คธ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐คธ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐คธ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_cartwheeling"],"annotation":"woman cartwheeling","tags":["cartwheel","gymnastics","woman"],"emoji":"๐คธโโ๏ธ","order":2475,"group":1,"version":4,"skins":[{"emoji":"๐คธ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐คธ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐คธ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐คธ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐คธ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["people_wrestling","wrestlers","wrestling"],"annotation":"people wrestling","tags":["wrestle","wrestler"],"emoji":"๐คผ","order":2487,"group":1,"version":3},{"shortcodes":["men_wrestling"],"annotation":"men wrestling","tags":["men","wrestle"],"emoji":"๐คผโโ๏ธ","order":2488,"group":1,"version":4},{"shortcodes":["women_wrestling"],"annotation":"women wrestling","tags":["women","wrestle"],"emoji":"๐คผโโ๏ธ","order":2490,"group":1,"version":4},{"shortcodes":["person_playing_water_polo","water_polo"],"annotation":"person playing water polo","tags":["polo","water"],"emoji":"๐คฝ","order":2492,"group":1,"version":3,"skins":[{"emoji":"๐คฝ๐ป","version":3,"tone":1},{"emoji":"๐คฝ๐ผ","version":3,"tone":2},{"emoji":"๐คฝ๐ฝ","version":3,"tone":3},{"emoji":"๐คฝ๐พ","version":3,"tone":4},{"emoji":"๐คฝ๐ฟ","version":3,"tone":5}]},{"shortcodes":["man_playing_water_polo"],"annotation":"man playing water polo","tags":["man","water polo"],"emoji":"๐คฝโโ๏ธ","order":2498,"group":1,"version":4,"skins":[{"emoji":"๐คฝ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐คฝ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐คฝ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐คฝ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐คฝ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_playing_water_polo"],"annotation":"woman playing water polo","tags":["water polo","woman"],"emoji":"๐คฝโโ๏ธ","order":2510,"group":1,"version":4,"skins":[{"emoji":"๐คฝ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐คฝ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐คฝ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐คฝ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐คฝ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["handball","person_playing_handball"],"annotation":"person playing handball","tags":["ball","handball"],"emoji":"๐คพ","order":2522,"group":1,"version":3,"skins":[{"emoji":"๐คพ๐ป","version":3,"tone":1},{"emoji":"๐คพ๐ผ","version":3,"tone":2},{"emoji":"๐คพ๐ฝ","version":3,"tone":3},{"emoji":"๐คพ๐พ","version":3,"tone":4},{"emoji":"๐คพ๐ฟ","version":3,"tone":5}]},{"shortcodes":["man_playing_handball"],"annotation":"man playing handball","tags":["handball","man"],"emoji":"๐คพโโ๏ธ","order":2528,"group":1,"version":4,"skins":[{"emoji":"๐คพ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐คพ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐คพ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐คพ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐คพ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_playing_handball"],"annotation":"woman playing handball","tags":["handball","woman"],"emoji":"๐คพโโ๏ธ","order":2540,"group":1,"version":4,"skins":[{"emoji":"๐คพ๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐คพ๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐คพ๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐คพ๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐คพ๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["juggler","juggling","person_juggling"],"annotation":"person juggling","tags":["balance","juggle","multitask","skill"],"emoji":"๐คน","order":2552,"group":1,"version":3,"skins":[{"emoji":"๐คน๐ป","version":3,"tone":1},{"emoji":"๐คน๐ผ","version":3,"tone":2},{"emoji":"๐คน๐ฝ","version":3,"tone":3},{"emoji":"๐คน๐พ","version":3,"tone":4},{"emoji":"๐คน๐ฟ","version":3,"tone":5}]},{"shortcodes":["man_juggling"],"annotation":"man juggling","tags":["juggling","man","multitask"],"emoji":"๐คนโโ๏ธ","order":2558,"group":1,"version":4,"skins":[{"emoji":"๐คน๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐คน๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐คน๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐คน๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐คน๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["woman_juggling"],"annotation":"woman juggling","tags":["juggling","multitask","woman"],"emoji":"๐คนโโ๏ธ","order":2570,"group":1,"version":4,"skins":[{"emoji":"๐คน๐ปโโ๏ธ","version":4,"tone":1},{"emoji":"๐คน๐ผโโ๏ธ","version":4,"tone":2},{"emoji":"๐คน๐ฝโโ๏ธ","version":4,"tone":3},{"emoji":"๐คน๐พโโ๏ธ","version":4,"tone":4},{"emoji":"๐คน๐ฟโโ๏ธ","version":4,"tone":5}]},{"shortcodes":["person_in_lotus_position"],"annotation":"person in lotus position","tags":["meditation","yoga"],"emoji":"๐ง","order":2582,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ป","version":5,"tone":1},{"emoji":"๐ง๐ผ","version":5,"tone":2},{"emoji":"๐ง๐ฝ","version":5,"tone":3},{"emoji":"๐ง๐พ","version":5,"tone":4},{"emoji":"๐ง๐ฟ","version":5,"tone":5}]},{"shortcodes":["man_in_lotus_position"],"annotation":"man in lotus position","tags":["meditation","yoga"],"emoji":"๐งโโ๏ธ","order":2588,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":5,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":5,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":5,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":5,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":5,"tone":5}]},{"shortcodes":["woman_in_lotus_position"],"annotation":"woman in lotus position","tags":["meditation","yoga"],"emoji":"๐งโโ๏ธ","order":2600,"group":1,"version":5,"skins":[{"emoji":"๐ง๐ปโโ๏ธ","version":5,"tone":1},{"emoji":"๐ง๐ผโโ๏ธ","version":5,"tone":2},{"emoji":"๐ง๐ฝโโ๏ธ","version":5,"tone":3},{"emoji":"๐ง๐พโโ๏ธ","version":5,"tone":4},{"emoji":"๐ง๐ฟโโ๏ธ","version":5,"tone":5}]},{"shortcodes":["bath","person_taking_bath"],"annotation":"person taking bath","tags":["bath","bathtub"],"emoji":"๐","order":2612,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":1,"tone":1},{"emoji":"๐๐ผ","version":1,"tone":2},{"emoji":"๐๐ฝ","version":1,"tone":3},{"emoji":"๐๐พ","version":1,"tone":4},{"emoji":"๐๐ฟ","version":1,"tone":5}]},{"shortcodes":["person_in_bed","sleeping_accommodation"],"annotation":"person in bed","tags":["good night","hotel","sleep"],"emoji":"๐","order":2618,"group":1,"version":1,"skins":[{"emoji":"๐๐ป","version":4,"tone":1},{"emoji":"๐๐ผ","version":4,"tone":2},{"emoji":"๐๐ฝ","version":4,"tone":3},{"emoji":"๐๐พ","version":4,"tone":4},{"emoji":"๐๐ฟ","version":4,"tone":5}]},{"shortcodes":["people_holding_hands"],"annotation":"people holding hands","tags":["couple","hand","hold","holding hands","person"],"emoji":"๐งโ๐คโ๐ง","order":2624,"group":1,"version":12,"skins":[{"emoji":"๐ง๐ปโ๐คโ๐ง๐ป","version":12,"tone":1},{"emoji":"๐ง๐ปโ๐คโ๐ง๐ผ","version":12.1,"tone":[1,2]},{"emoji":"๐ง๐ปโ๐คโ๐ง๐ฝ","version":12.1,"tone":[1,3]},{"emoji":"๐ง๐ปโ๐คโ๐ง๐พ","version":12.1,"tone":[1,4]},{"emoji":"๐ง๐ปโ๐คโ๐ง๐ฟ","version":12.1,"tone":[1,5]},{"emoji":"๐ง๐ผโ๐คโ๐ง๐ป","version":12,"tone":[2,1]},{"emoji":"๐ง๐ผโ๐คโ๐ง๐ผ","version":12,"tone":2},{"emoji":"๐ง๐ผโ๐คโ๐ง๐ฝ","version":12.1,"tone":[2,3]},{"emoji":"๐ง๐ผโ๐คโ๐ง๐พ","version":12.1,"tone":[2,4]},{"emoji":"๐ง๐ผโ๐คโ๐ง๐ฟ","version":12.1,"tone":[2,5]},{"emoji":"๐ง๐ฝโ๐คโ๐ง๐ป","version":12,"tone":[3,1]},{"emoji":"๐ง๐ฝโ๐คโ๐ง๐ผ","version":12,"tone":[3,2]},{"emoji":"๐ง๐ฝโ๐คโ๐ง๐ฝ","version":12,"tone":3},{"emoji":"๐ง๐ฝโ๐คโ๐ง๐พ","version":12.1,"tone":[3,4]},{"emoji":"๐ง๐ฝโ๐คโ๐ง๐ฟ","version":12.1,"tone":[3,5]},{"emoji":"๐ง๐พโ๐คโ๐ง๐ป","version":12,"tone":[4,1]},{"emoji":"๐ง๐พโ๐คโ๐ง๐ผ","version":12,"tone":[4,2]},{"emoji":"๐ง๐พโ๐คโ๐ง๐ฝ","version":12,"tone":[4,3]},{"emoji":"๐ง๐พโ๐คโ๐ง๐พ","version":12,"tone":4},{"emoji":"๐ง๐พโ๐คโ๐ง๐ฟ","version":12.1,"tone":[4,5]},{"emoji":"๐ง๐ฟโ๐คโ๐ง๐ป","version":12,"tone":[5,1]},{"emoji":"๐ง๐ฟโ๐คโ๐ง๐ผ","version":12,"tone":[5,2]},{"emoji":"๐ง๐ฟโ๐คโ๐ง๐ฝ","version":12,"tone":[5,3]},{"emoji":"๐ง๐ฟโ๐คโ๐ง๐พ","version":12,"tone":[5,4]},{"emoji":"๐ง๐ฟโ๐คโ๐ง๐ฟ","version":12,"tone":5}]},{"shortcodes":["two_women_holding_hands"],"annotation":"women holding hands","tags":["couple","hand","holding hands","women"],"emoji":"๐ญ","order":2650,"group":1,"version":1,"skins":[{"emoji":"๐ญ๐ป","version":12,"tone":1},{"emoji":"๐ญ๐ผ","version":12,"tone":2},{"emoji":"๐ญ๐ฝ","version":12,"tone":3},{"emoji":"๐ญ๐พ","version":12,"tone":4},{"emoji":"๐ญ๐ฟ","version":12,"tone":5},{"emoji":"๐ฉ๐ปโ๐คโ๐ฉ๐ผ","version":12.1,"tone":[1,2]},{"emoji":"๐ฉ๐ปโ๐คโ๐ฉ๐ฝ","version":12.1,"tone":[1,3]},{"emoji":"๐ฉ๐ปโ๐คโ๐ฉ๐พ","version":12.1,"tone":[1,4]},{"emoji":"๐ฉ๐ปโ๐คโ๐ฉ๐ฟ","version":12.1,"tone":[1,5]},{"emoji":"๐ฉ๐ผโ๐คโ๐ฉ๐ป","version":12,"tone":[2,1]},{"emoji":"๐ฉ๐ผโ๐คโ๐ฉ๐ฝ","version":12.1,"tone":[2,3]},{"emoji":"๐ฉ๐ผโ๐คโ๐ฉ๐พ","version":12.1,"tone":[2,4]},{"emoji":"๐ฉ๐ผโ๐คโ๐ฉ๐ฟ","version":12.1,"tone":[2,5]},{"emoji":"๐ฉ๐ฝโ๐คโ๐ฉ๐ป","version":12,"tone":[3,1]},{"emoji":"๐ฉ๐ฝโ๐คโ๐ฉ๐ผ","version":12,"tone":[3,2]},{"emoji":"๐ฉ๐ฝโ๐คโ๐ฉ๐พ","version":12.1,"tone":[3,4]},{"emoji":"๐ฉ๐ฝโ๐คโ๐ฉ๐ฟ","version":12.1,"tone":[3,5]},{"emoji":"๐ฉ๐พโ๐คโ๐ฉ๐ป","version":12,"tone":[4,1]},{"emoji":"๐ฉ๐พโ๐คโ๐ฉ๐ผ","version":12,"tone":[4,2]},{"emoji":"๐ฉ๐พโ๐คโ๐ฉ๐ฝ","version":12,"tone":[4,3]},{"emoji":"๐ฉ๐พโ๐คโ๐ฉ๐ฟ","version":12.1,"tone":[4,5]},{"emoji":"๐ฉ๐ฟโ๐คโ๐ฉ๐ป","version":12,"tone":[5,1]},{"emoji":"๐ฉ๐ฟโ๐คโ๐ฉ๐ผ","version":12,"tone":[5,2]},{"emoji":"๐ฉ๐ฟโ๐คโ๐ฉ๐ฝ","version":12,"tone":[5,3]},{"emoji":"๐ฉ๐ฟโ๐คโ๐ฉ๐พ","version":12,"tone":[5,4]}]},{"shortcodes":["couple"],"annotation":"woman and man holding hands","tags":["couple","hand","hold","holding hands","man","woman"],"emoji":"๐ซ","order":2676,"group":1,"version":0.6,"skins":[{"emoji":"๐ซ๐ป","version":12,"tone":1},{"emoji":"๐ซ๐ผ","version":12,"tone":2},{"emoji":"๐ซ๐ฝ","version":12,"tone":3},{"emoji":"๐ซ๐พ","version":12,"tone":4},{"emoji":"๐ซ๐ฟ","version":12,"tone":5},{"emoji":"๐ฉ๐ปโ๐คโ๐จ๐ผ","version":12,"tone":[1,2]},{"emoji":"๐ฉ๐ปโ๐คโ๐จ๐ฝ","version":12,"tone":[1,3]},{"emoji":"๐ฉ๐ปโ๐คโ๐จ๐พ","version":12,"tone":[1,4]},{"emoji":"๐ฉ๐ปโ๐คโ๐จ๐ฟ","version":12,"tone":[1,5]},{"emoji":"๐ฉ๐ผโ๐คโ๐จ๐ป","version":12,"tone":[2,1]},{"emoji":"๐ฉ๐ผโ๐คโ๐จ๐ฝ","version":12,"tone":[2,3]},{"emoji":"๐ฉ๐ผโ๐คโ๐จ๐พ","version":12,"tone":[2,4]},{"emoji":"๐ฉ๐ผโ๐คโ๐จ๐ฟ","version":12,"tone":[2,5]},{"emoji":"๐ฉ๐ฝโ๐คโ๐จ๐ป","version":12,"tone":[3,1]},{"emoji":"๐ฉ๐ฝโ๐คโ๐จ๐ผ","version":12,"tone":[3,2]},{"emoji":"๐ฉ๐ฝโ๐คโ๐จ๐พ","version":12,"tone":[3,4]},{"emoji":"๐ฉ๐ฝโ๐คโ๐จ๐ฟ","version":12,"tone":[3,5]},{"emoji":"๐ฉ๐พโ๐คโ๐จ๐ป","version":12,"tone":[4,1]},{"emoji":"๐ฉ๐พโ๐คโ๐จ๐ผ","version":12,"tone":[4,2]},{"emoji":"๐ฉ๐พโ๐คโ๐จ๐ฝ","version":12,"tone":[4,3]},{"emoji":"๐ฉ๐พโ๐คโ๐จ๐ฟ","version":12,"tone":[4,5]},{"emoji":"๐ฉ๐ฟโ๐คโ๐จ๐ป","version":12,"tone":[5,1]},{"emoji":"๐ฉ๐ฟโ๐คโ๐จ๐ผ","version":12,"tone":[5,2]},{"emoji":"๐ฉ๐ฟโ๐คโ๐จ๐ฝ","version":12,"tone":[5,3]},{"emoji":"๐ฉ๐ฟโ๐คโ๐จ๐พ","version":12,"tone":[5,4]}]},{"shortcodes":["two_men_holding_hands"],"annotation":"men holding hands","tags":["couple","gemini","holding hands","man","men","twins","zodiac"],"emoji":"๐ฌ","order":2702,"group":1,"version":1,"skins":[{"emoji":"๐ฌ๐ป","version":12,"tone":1},{"emoji":"๐ฌ๐ผ","version":12,"tone":2},{"emoji":"๐ฌ๐ฝ","version":12,"tone":3},{"emoji":"๐ฌ๐พ","version":12,"tone":4},{"emoji":"๐ฌ๐ฟ","version":12,"tone":5},{"emoji":"๐จ๐ปโ๐คโ๐จ๐ผ","version":12.1,"tone":[1,2]},{"emoji":"๐จ๐ปโ๐คโ๐จ๐ฝ","version":12.1,"tone":[1,3]},{"emoji":"๐จ๐ปโ๐คโ๐จ๐พ","version":12.1,"tone":[1,4]},{"emoji":"๐จ๐ปโ๐คโ๐จ๐ฟ","version":12.1,"tone":[1,5]},{"emoji":"๐จ๐ผโ๐คโ๐จ๐ป","version":12,"tone":[2,1]},{"emoji":"๐จ๐ผโ๐คโ๐จ๐ฝ","version":12.1,"tone":[2,3]},{"emoji":"๐จ๐ผโ๐คโ๐จ๐พ","version":12.1,"tone":[2,4]},{"emoji":"๐จ๐ผโ๐คโ๐จ๐ฟ","version":12.1,"tone":[2,5]},{"emoji":"๐จ๐ฝโ๐คโ๐จ๐ป","version":12,"tone":[3,1]},{"emoji":"๐จ๐ฝโ๐คโ๐จ๐ผ","version":12,"tone":[3,2]},{"emoji":"๐จ๐ฝโ๐คโ๐จ๐พ","version":12.1,"tone":[3,4]},{"emoji":"๐จ๐ฝโ๐คโ๐จ๐ฟ","version":12.1,"tone":[3,5]},{"emoji":"๐จ๐พโ๐คโ๐จ๐ป","version":12,"tone":[4,1]},{"emoji":"๐จ๐พโ๐คโ๐จ๐ผ","version":12,"tone":[4,2]},{"emoji":"๐จ๐พโ๐คโ๐จ๐ฝ","version":12,"tone":[4,3]},{"emoji":"๐จ๐พโ๐คโ๐จ๐ฟ","version":12.1,"tone":[4,5]},{"emoji":"๐จ๐ฟโ๐คโ๐จ๐ป","version":12,"tone":[5,1]},{"emoji":"๐จ๐ฟโ๐คโ๐จ๐ผ","version":12,"tone":[5,2]},{"emoji":"๐จ๐ฟโ๐คโ๐จ๐ฝ","version":12,"tone":[5,3]},{"emoji":"๐จ๐ฟโ๐คโ๐จ๐พ","version":12,"tone":[5,4]}]},{"shortcodes":["couple_kiss","couplekiss"],"annotation":"kiss","tags":["couple"],"emoji":"๐","order":2728,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":13.1,"tone":1},{"emoji":"๐๐ผ","version":13.1,"tone":2},{"emoji":"๐๐ฝ","version":13.1,"tone":3},{"emoji":"๐๐พ","version":13.1,"tone":4},{"emoji":"๐๐ฟ","version":13.1,"tone":5},{"emoji":"๐ง๐ปโโค๏ธโ๐โ๐ง๐ผ","version":13.1,"tone":[1,2]},{"emoji":"๐ง๐ปโโค๏ธโ๐โ๐ง๐ฝ","version":13.1,"tone":[1,3]},{"emoji":"๐ง๐ปโโค๏ธโ๐โ๐ง๐พ","version":13.1,"tone":[1,4]},{"emoji":"๐ง๐ปโโค๏ธโ๐โ๐ง๐ฟ","version":13.1,"tone":[1,5]},{"emoji":"๐ง๐ผโโค๏ธโ๐โ๐ง๐ป","version":13.1,"tone":[2,1]},{"emoji":"๐ง๐ผโโค๏ธโ๐โ๐ง๐ฝ","version":13.1,"tone":[2,3]},{"emoji":"๐ง๐ผโโค๏ธโ๐โ๐ง๐พ","version":13.1,"tone":[2,4]},{"emoji":"๐ง๐ผโโค๏ธโ๐โ๐ง๐ฟ","version":13.1,"tone":[2,5]},{"emoji":"๐ง๐ฝโโค๏ธโ๐โ๐ง๐ป","version":13.1,"tone":[3,1]},{"emoji":"๐ง๐ฝโโค๏ธโ๐โ๐ง๐ผ","version":13.1,"tone":[3,2]},{"emoji":"๐ง๐ฝโโค๏ธโ๐โ๐ง๐พ","version":13.1,"tone":[3,4]},{"emoji":"๐ง๐ฝโโค๏ธโ๐โ๐ง๐ฟ","version":13.1,"tone":[3,5]},{"emoji":"๐ง๐พโโค๏ธโ๐โ๐ง๐ป","version":13.1,"tone":[4,1]},{"emoji":"๐ง๐พโโค๏ธโ๐โ๐ง๐ผ","version":13.1,"tone":[4,2]},{"emoji":"๐ง๐พโโค๏ธโ๐โ๐ง๐ฝ","version":13.1,"tone":[4,3]},{"emoji":"๐ง๐พโโค๏ธโ๐โ๐ง๐ฟ","version":13.1,"tone":[4,5]},{"emoji":"๐ง๐ฟโโค๏ธโ๐โ๐ง๐ป","version":13.1,"tone":[5,1]},{"emoji":"๐ง๐ฟโโค๏ธโ๐โ๐ง๐ผ","version":13.1,"tone":[5,2]},{"emoji":"๐ง๐ฟโโค๏ธโ๐โ๐ง๐ฝ","version":13.1,"tone":[5,3]},{"emoji":"๐ง๐ฟโโค๏ธโ๐โ๐ง๐พ","version":13.1,"tone":[5,4]}]},{"shortcodes":["kiss_mw","kiss_wm"],"annotation":"kiss: woman, man","tags":["couple","kiss","man","woman"],"emoji":"๐ฉโโค๏ธโ๐โ๐จ","order":2774,"group":1,"version":2,"skins":[{"emoji":"๐ฉ๐ปโโค๏ธโ๐โ๐จ๐ป","version":13.1,"tone":1},{"emoji":"๐ฉ๐ปโโค๏ธโ๐โ๐จ๐ผ","version":13.1,"tone":[1,2]},{"emoji":"๐ฉ๐ปโโค๏ธโ๐โ๐จ๐ฝ","version":13.1,"tone":[1,3]},{"emoji":"๐ฉ๐ปโโค๏ธโ๐โ๐จ๐พ","version":13.1,"tone":[1,4]},{"emoji":"๐ฉ๐ปโโค๏ธโ๐โ๐จ๐ฟ","version":13.1,"tone":[1,5]},{"emoji":"๐ฉ๐ผโโค๏ธโ๐โ๐จ๐ป","version":13.1,"tone":[2,1]},{"emoji":"๐ฉ๐ผโโค๏ธโ๐โ๐จ๐ผ","version":13.1,"tone":2},{"emoji":"๐ฉ๐ผโโค๏ธโ๐โ๐จ๐ฝ","version":13.1,"tone":[2,3]},{"emoji":"๐ฉ๐ผโโค๏ธโ๐โ๐จ๐พ","version":13.1,"tone":[2,4]},{"emoji":"๐ฉ๐ผโโค๏ธโ๐โ๐จ๐ฟ","version":13.1,"tone":[2,5]},{"emoji":"๐ฉ๐ฝโโค๏ธโ๐โ๐จ๐ป","version":13.1,"tone":[3,1]},{"emoji":"๐ฉ๐ฝโโค๏ธโ๐โ๐จ๐ผ","version":13.1,"tone":[3,2]},{"emoji":"๐ฉ๐ฝโโค๏ธโ๐โ๐จ๐ฝ","version":13.1,"tone":3},{"emoji":"๐ฉ๐ฝโโค๏ธโ๐โ๐จ๐พ","version":13.1,"tone":[3,4]},{"emoji":"๐ฉ๐ฝโโค๏ธโ๐โ๐จ๐ฟ","version":13.1,"tone":[3,5]},{"emoji":"๐ฉ๐พโโค๏ธโ๐โ๐จ๐ป","version":13.1,"tone":[4,1]},{"emoji":"๐ฉ๐พโโค๏ธโ๐โ๐จ๐ผ","version":13.1,"tone":[4,2]},{"emoji":"๐ฉ๐พโโค๏ธโ๐โ๐จ๐ฝ","version":13.1,"tone":[4,3]},{"emoji":"๐ฉ๐พโโค๏ธโ๐โ๐จ๐พ","version":13.1,"tone":4},{"emoji":"๐ฉ๐พโโค๏ธโ๐โ๐จ๐ฟ","version":13.1,"tone":[4,5]},{"emoji":"๐ฉ๐ฟโโค๏ธโ๐โ๐จ๐ป","version":13.1,"tone":[5,1]},{"emoji":"๐ฉ๐ฟโโค๏ธโ๐โ๐จ๐ผ","version":13.1,"tone":[5,2]},{"emoji":"๐ฉ๐ฟโโค๏ธโ๐โ๐จ๐ฝ","version":13.1,"tone":[5,3]},{"emoji":"๐ฉ๐ฟโโค๏ธโ๐โ๐จ๐พ","version":13.1,"tone":[5,4]},{"emoji":"๐ฉ๐ฟโโค๏ธโ๐โ๐จ๐ฟ","version":13.1,"tone":5}]},{"shortcodes":["kiss_mm"],"annotation":"kiss: man, man","tags":["couple","kiss","man"],"emoji":"๐จโโค๏ธโ๐โ๐จ","order":2826,"group":1,"version":2,"skins":[{"emoji":"๐จ๐ปโโค๏ธโ๐โ๐จ๐ป","version":13.1,"tone":1},{"emoji":"๐จ๐ปโโค๏ธโ๐โ๐จ๐ผ","version":13.1,"tone":[1,2]},{"emoji":"๐จ๐ปโโค๏ธโ๐โ๐จ๐ฝ","version":13.1,"tone":[1,3]},{"emoji":"๐จ๐ปโโค๏ธโ๐โ๐จ๐พ","version":13.1,"tone":[1,4]},{"emoji":"๐จ๐ปโโค๏ธโ๐โ๐จ๐ฟ","version":13.1,"tone":[1,5]},{"emoji":"๐จ๐ผโโค๏ธโ๐โ๐จ๐ป","version":13.1,"tone":[2,1]},{"emoji":"๐จ๐ผโโค๏ธโ๐โ๐จ๐ผ","version":13.1,"tone":2},{"emoji":"๐จ๐ผโโค๏ธโ๐โ๐จ๐ฝ","version":13.1,"tone":[2,3]},{"emoji":"๐จ๐ผโโค๏ธโ๐โ๐จ๐พ","version":13.1,"tone":[2,4]},{"emoji":"๐จ๐ผโโค๏ธโ๐โ๐จ๐ฟ","version":13.1,"tone":[2,5]},{"emoji":"๐จ๐ฝโโค๏ธโ๐โ๐จ๐ป","version":13.1,"tone":[3,1]},{"emoji":"๐จ๐ฝโโค๏ธโ๐โ๐จ๐ผ","version":13.1,"tone":[3,2]},{"emoji":"๐จ๐ฝโโค๏ธโ๐โ๐จ๐ฝ","version":13.1,"tone":3},{"emoji":"๐จ๐ฝโโค๏ธโ๐โ๐จ๐พ","version":13.1,"tone":[3,4]},{"emoji":"๐จ๐ฝโโค๏ธโ๐โ๐จ๐ฟ","version":13.1,"tone":[3,5]},{"emoji":"๐จ๐พโโค๏ธโ๐โ๐จ๐ป","version":13.1,"tone":[4,1]},{"emoji":"๐จ๐พโโค๏ธโ๐โ๐จ๐ผ","version":13.1,"tone":[4,2]},{"emoji":"๐จ๐พโโค๏ธโ๐โ๐จ๐ฝ","version":13.1,"tone":[4,3]},{"emoji":"๐จ๐พโโค๏ธโ๐โ๐จ๐พ","version":13.1,"tone":4},{"emoji":"๐จ๐พโโค๏ธโ๐โ๐จ๐ฟ","version":13.1,"tone":[4,5]},{"emoji":"๐จ๐ฟโโค๏ธโ๐โ๐จ๐ป","version":13.1,"tone":[5,1]},{"emoji":"๐จ๐ฟโโค๏ธโ๐โ๐จ๐ผ","version":13.1,"tone":[5,2]},{"emoji":"๐จ๐ฟโโค๏ธโ๐โ๐จ๐ฝ","version":13.1,"tone":[5,3]},{"emoji":"๐จ๐ฟโโค๏ธโ๐โ๐จ๐พ","version":13.1,"tone":[5,4]},{"emoji":"๐จ๐ฟโโค๏ธโ๐โ๐จ๐ฟ","version":13.1,"tone":5}]},{"shortcodes":["kiss_ww"],"annotation":"kiss: woman, woman","tags":["couple","kiss","woman"],"emoji":"๐ฉโโค๏ธโ๐โ๐ฉ","order":2878,"group":1,"version":2,"skins":[{"emoji":"๐ฉ๐ปโโค๏ธโ๐โ๐ฉ๐ป","version":13.1,"tone":1},{"emoji":"๐ฉ๐ปโโค๏ธโ๐โ๐ฉ๐ผ","version":13.1,"tone":[1,2]},{"emoji":"๐ฉ๐ปโโค๏ธโ๐โ๐ฉ๐ฝ","version":13.1,"tone":[1,3]},{"emoji":"๐ฉ๐ปโโค๏ธโ๐โ๐ฉ๐พ","version":13.1,"tone":[1,4]},{"emoji":"๐ฉ๐ปโโค๏ธโ๐โ๐ฉ๐ฟ","version":13.1,"tone":[1,5]},{"emoji":"๐ฉ๐ผโโค๏ธโ๐โ๐ฉ๐ป","version":13.1,"tone":[2,1]},{"emoji":"๐ฉ๐ผโโค๏ธโ๐โ๐ฉ๐ผ","version":13.1,"tone":2},{"emoji":"๐ฉ๐ผโโค๏ธโ๐โ๐ฉ๐ฝ","version":13.1,"tone":[2,3]},{"emoji":"๐ฉ๐ผโโค๏ธโ๐โ๐ฉ๐พ","version":13.1,"tone":[2,4]},{"emoji":"๐ฉ๐ผโโค๏ธโ๐โ๐ฉ๐ฟ","version":13.1,"tone":[2,5]},{"emoji":"๐ฉ๐ฝโโค๏ธโ๐โ๐ฉ๐ป","version":13.1,"tone":[3,1]},{"emoji":"๐ฉ๐ฝโโค๏ธโ๐โ๐ฉ๐ผ","version":13.1,"tone":[3,2]},{"emoji":"๐ฉ๐ฝโโค๏ธโ๐โ๐ฉ๐ฝ","version":13.1,"tone":3},{"emoji":"๐ฉ๐ฝโโค๏ธโ๐โ๐ฉ๐พ","version":13.1,"tone":[3,4]},{"emoji":"๐ฉ๐ฝโโค๏ธโ๐โ๐ฉ๐ฟ","version":13.1,"tone":[3,5]},{"emoji":"๐ฉ๐พโโค๏ธโ๐โ๐ฉ๐ป","version":13.1,"tone":[4,1]},{"emoji":"๐ฉ๐พโโค๏ธโ๐โ๐ฉ๐ผ","version":13.1,"tone":[4,2]},{"emoji":"๐ฉ๐พโโค๏ธโ๐โ๐ฉ๐ฝ","version":13.1,"tone":[4,3]},{"emoji":"๐ฉ๐พโโค๏ธโ๐โ๐ฉ๐พ","version":13.1,"tone":4},{"emoji":"๐ฉ๐พโโค๏ธโ๐โ๐ฉ๐ฟ","version":13.1,"tone":[4,5]},{"emoji":"๐ฉ๐ฟโโค๏ธโ๐โ๐ฉ๐ป","version":13.1,"tone":[5,1]},{"emoji":"๐ฉ๐ฟโโค๏ธโ๐โ๐ฉ๐ผ","version":13.1,"tone":[5,2]},{"emoji":"๐ฉ๐ฟโโค๏ธโ๐โ๐ฉ๐ฝ","version":13.1,"tone":[5,3]},{"emoji":"๐ฉ๐ฟโโค๏ธโ๐โ๐ฉ๐พ","version":13.1,"tone":[5,4]},{"emoji":"๐ฉ๐ฟโโค๏ธโ๐โ๐ฉ๐ฟ","version":13.1,"tone":5}]},{"shortcodes":["couple_with_heart"],"annotation":"couple with heart","tags":["couple","love"],"emoji":"๐","order":2930,"group":1,"version":0.6,"skins":[{"emoji":"๐๐ป","version":13.1,"tone":1},{"emoji":"๐๐ผ","version":13.1,"tone":2},{"emoji":"๐๐ฝ","version":13.1,"tone":3},{"emoji":"๐๐พ","version":13.1,"tone":4},{"emoji":"๐๐ฟ","version":13.1,"tone":5},{"emoji":"๐ง๐ปโโค๏ธโ๐ง๐ผ","version":13.1,"tone":[1,2]},{"emoji":"๐ง๐ปโโค๏ธโ๐ง๐ฝ","version":13.1,"tone":[1,3]},{"emoji":"๐ง๐ปโโค๏ธโ๐ง๐พ","version":13.1,"tone":[1,4]},{"emoji":"๐ง๐ปโโค๏ธโ๐ง๐ฟ","version":13.1,"tone":[1,5]},{"emoji":"๐ง๐ผโโค๏ธโ๐ง๐ป","version":13.1,"tone":[2,1]},{"emoji":"๐ง๐ผโโค๏ธโ๐ง๐ฝ","version":13.1,"tone":[2,3]},{"emoji":"๐ง๐ผโโค๏ธโ๐ง๐พ","version":13.1,"tone":[2,4]},{"emoji":"๐ง๐ผโโค๏ธโ๐ง๐ฟ","version":13.1,"tone":[2,5]},{"emoji":"๐ง๐ฝโโค๏ธโ๐ง๐ป","version":13.1,"tone":[3,1]},{"emoji":"๐ง๐ฝโโค๏ธโ๐ง๐ผ","version":13.1,"tone":[3,2]},{"emoji":"๐ง๐ฝโโค๏ธโ๐ง๐พ","version":13.1,"tone":[3,4]},{"emoji":"๐ง๐ฝโโค๏ธโ๐ง๐ฟ","version":13.1,"tone":[3,5]},{"emoji":"๐ง๐พโโค๏ธโ๐ง๐ป","version":13.1,"tone":[4,1]},{"emoji":"๐ง๐พโโค๏ธโ๐ง๐ผ","version":13.1,"tone":[4,2]},{"emoji":"๐ง๐พโโค๏ธโ๐ง๐ฝ","version":13.1,"tone":[4,3]},{"emoji":"๐ง๐พโโค๏ธโ๐ง๐ฟ","version":13.1,"tone":[4,5]},{"emoji":"๐ง๐ฟโโค๏ธโ๐ง๐ป","version":13.1,"tone":[5,1]},{"emoji":"๐ง๐ฟโโค๏ธโ๐ง๐ผ","version":13.1,"tone":[5,2]},{"emoji":"๐ง๐ฟโโค๏ธโ๐ง๐ฝ","version":13.1,"tone":[5,3]},{"emoji":"๐ง๐ฟโโค๏ธโ๐ง๐พ","version":13.1,"tone":[5,4]}]},{"shortcodes":["couple_with_heart_mw","couple_with_heart_wm"],"annotation":"couple with heart: woman, man","tags":["couple","couple with heart","love","man","woman"],"emoji":"๐ฉโโค๏ธโ๐จ","order":2976,"group":1,"version":2,"skins":[{"emoji":"๐ฉ๐ปโโค๏ธโ๐จ๐ป","version":13.1,"tone":1},{"emoji":"๐ฉ๐ปโโค๏ธโ๐จ๐ผ","version":13.1,"tone":[1,2]},{"emoji":"๐ฉ๐ปโโค๏ธโ๐จ๐ฝ","version":13.1,"tone":[1,3]},{"emoji":"๐ฉ๐ปโโค๏ธโ๐จ๐พ","version":13.1,"tone":[1,4]},{"emoji":"๐ฉ๐ปโโค๏ธโ๐จ๐ฟ","version":13.1,"tone":[1,5]},{"emoji":"๐ฉ๐ผโโค๏ธโ๐จ๐ป","version":13.1,"tone":[2,1]},{"emoji":"๐ฉ๐ผโโค๏ธโ๐จ๐ผ","version":13.1,"tone":2},{"emoji":"๐ฉ๐ผโโค๏ธโ๐จ๐ฝ","version":13.1,"tone":[2,3]},{"emoji":"๐ฉ๐ผโโค๏ธโ๐จ๐พ","version":13.1,"tone":[2,4]},{"emoji":"๐ฉ๐ผโโค๏ธโ๐จ๐ฟ","version":13.1,"tone":[2,5]},{"emoji":"๐ฉ๐ฝโโค๏ธโ๐จ๐ป","version":13.1,"tone":[3,1]},{"emoji":"๐ฉ๐ฝโโค๏ธโ๐จ๐ผ","version":13.1,"tone":[3,2]},{"emoji":"๐ฉ๐ฝโโค๏ธโ๐จ๐ฝ","version":13.1,"tone":3},{"emoji":"๐ฉ๐ฝโโค๏ธโ๐จ๐พ","version":13.1,"tone":[3,4]},{"emoji":"๐ฉ๐ฝโโค๏ธโ๐จ๐ฟ","version":13.1,"tone":[3,5]},{"emoji":"๐ฉ๐พโโค๏ธโ๐จ๐ป","version":13.1,"tone":[4,1]},{"emoji":"๐ฉ๐พโโค๏ธโ๐จ๐ผ","version":13.1,"tone":[4,2]},{"emoji":"๐ฉ๐พโโค๏ธโ๐จ๐ฝ","version":13.1,"tone":[4,3]},{"emoji":"๐ฉ๐พโโค๏ธโ๐จ๐พ","version":13.1,"tone":4},{"emoji":"๐ฉ๐พโโค๏ธโ๐จ๐ฟ","version":13.1,"tone":[4,5]},{"emoji":"๐ฉ๐ฟโโค๏ธโ๐จ๐ป","version":13.1,"tone":[5,1]},{"emoji":"๐ฉ๐ฟโโค๏ธโ๐จ๐ผ","version":13.1,"tone":[5,2]},{"emoji":"๐ฉ๐ฟโโค๏ธโ๐จ๐ฝ","version":13.1,"tone":[5,3]},{"emoji":"๐ฉ๐ฟโโค๏ธโ๐จ๐พ","version":13.1,"tone":[5,4]},{"emoji":"๐ฉ๐ฟโโค๏ธโ๐จ๐ฟ","version":13.1,"tone":5}]},{"shortcodes":["couple_with_heart_mm"],"annotation":"couple with heart: man, man","tags":["couple","couple with heart","love","man"],"emoji":"๐จโโค๏ธโ๐จ","order":3028,"group":1,"version":2,"skins":[{"emoji":"๐จ๐ปโโค๏ธโ๐จ๐ป","version":13.1,"tone":1},{"emoji":"๐จ๐ปโโค๏ธโ๐จ๐ผ","version":13.1,"tone":[1,2]},{"emoji":"๐จ๐ปโโค๏ธโ๐จ๐ฝ","version":13.1,"tone":[1,3]},{"emoji":"๐จ๐ปโโค๏ธโ๐จ๐พ","version":13.1,"tone":[1,4]},{"emoji":"๐จ๐ปโโค๏ธโ๐จ๐ฟ","version":13.1,"tone":[1,5]},{"emoji":"๐จ๐ผโโค๏ธโ๐จ๐ป","version":13.1,"tone":[2,1]},{"emoji":"๐จ๐ผโโค๏ธโ๐จ๐ผ","version":13.1,"tone":2},{"emoji":"๐จ๐ผโโค๏ธโ๐จ๐ฝ","version":13.1,"tone":[2,3]},{"emoji":"๐จ๐ผโโค๏ธโ๐จ๐พ","version":13.1,"tone":[2,4]},{"emoji":"๐จ๐ผโโค๏ธโ๐จ๐ฟ","version":13.1,"tone":[2,5]},{"emoji":"๐จ๐ฝโโค๏ธโ๐จ๐ป","version":13.1,"tone":[3,1]},{"emoji":"๐จ๐ฝโโค๏ธโ๐จ๐ผ","version":13.1,"tone":[3,2]},{"emoji":"๐จ๐ฝโโค๏ธโ๐จ๐ฝ","version":13.1,"tone":3},{"emoji":"๐จ๐ฝโโค๏ธโ๐จ๐พ","version":13.1,"tone":[3,4]},{"emoji":"๐จ๐ฝโโค๏ธโ๐จ๐ฟ","version":13.1,"tone":[3,5]},{"emoji":"๐จ๐พโโค๏ธโ๐จ๐ป","version":13.1,"tone":[4,1]},{"emoji":"๐จ๐พโโค๏ธโ๐จ๐ผ","version":13.1,"tone":[4,2]},{"emoji":"๐จ๐พโโค๏ธโ๐จ๐ฝ","version":13.1,"tone":[4,3]},{"emoji":"๐จ๐พโโค๏ธโ๐จ๐พ","version":13.1,"tone":4},{"emoji":"๐จ๐พโโค๏ธโ๐จ๐ฟ","version":13.1,"tone":[4,5]},{"emoji":"๐จ๐ฟโโค๏ธโ๐จ๐ป","version":13.1,"tone":[5,1]},{"emoji":"๐จ๐ฟโโค๏ธโ๐จ๐ผ","version":13.1,"tone":[5,2]},{"emoji":"๐จ๐ฟโโค๏ธโ๐จ๐ฝ","version":13.1,"tone":[5,3]},{"emoji":"๐จ๐ฟโโค๏ธโ๐จ๐พ","version":13.1,"tone":[5,4]},{"emoji":"๐จ๐ฟโโค๏ธโ๐จ๐ฟ","version":13.1,"tone":5}]},{"shortcodes":["couple_with_heart_ww"],"annotation":"couple with heart: woman, woman","tags":["couple","couple with heart","love","woman"],"emoji":"๐ฉโโค๏ธโ๐ฉ","order":3080,"group":1,"version":2,"skins":[{"emoji":"๐ฉ๐ปโโค๏ธโ๐ฉ๐ป","version":13.1,"tone":1},{"emoji":"๐ฉ๐ปโโค๏ธโ๐ฉ๐ผ","version":13.1,"tone":[1,2]},{"emoji":"๐ฉ๐ปโโค๏ธโ๐ฉ๐ฝ","version":13.1,"tone":[1,3]},{"emoji":"๐ฉ๐ปโโค๏ธโ๐ฉ๐พ","version":13.1,"tone":[1,4]},{"emoji":"๐ฉ๐ปโโค๏ธโ๐ฉ๐ฟ","version":13.1,"tone":[1,5]},{"emoji":"๐ฉ๐ผโโค๏ธโ๐ฉ๐ป","version":13.1,"tone":[2,1]},{"emoji":"๐ฉ๐ผโโค๏ธโ๐ฉ๐ผ","version":13.1,"tone":2},{"emoji":"๐ฉ๐ผโโค๏ธโ๐ฉ๐ฝ","version":13.1,"tone":[2,3]},{"emoji":"๐ฉ๐ผโโค๏ธโ๐ฉ๐พ","version":13.1,"tone":[2,4]},{"emoji":"๐ฉ๐ผโโค๏ธโ๐ฉ๐ฟ","version":13.1,"tone":[2,5]},{"emoji":"๐ฉ๐ฝโโค๏ธโ๐ฉ๐ป","version":13.1,"tone":[3,1]},{"emoji":"๐ฉ๐ฝโโค๏ธโ๐ฉ๐ผ","version":13.1,"tone":[3,2]},{"emoji":"๐ฉ๐ฝโโค๏ธโ๐ฉ๐ฝ","version":13.1,"tone":3},{"emoji":"๐ฉ๐ฝโโค๏ธโ๐ฉ๐พ","version":13.1,"tone":[3,4]},{"emoji":"๐ฉ๐ฝโโค๏ธโ๐ฉ๐ฟ","version":13.1,"tone":[3,5]},{"emoji":"๐ฉ๐พโโค๏ธโ๐ฉ๐ป","version":13.1,"tone":[4,1]},{"emoji":"๐ฉ๐พโโค๏ธโ๐ฉ๐ผ","version":13.1,"tone":[4,2]},{"emoji":"๐ฉ๐พโโค๏ธโ๐ฉ๐ฝ","version":13.1,"tone":[4,3]},{"emoji":"๐ฉ๐พโโค๏ธโ๐ฉ๐พ","version":13.1,"tone":4},{"emoji":"๐ฉ๐พโโค๏ธโ๐ฉ๐ฟ","version":13.1,"tone":[4,5]},{"emoji":"๐ฉ๐ฟโโค๏ธโ๐ฉ๐ป","version":13.1,"tone":[5,1]},{"emoji":"๐ฉ๐ฟโโค๏ธโ๐ฉ๐ผ","version":13.1,"tone":[5,2]},{"emoji":"๐ฉ๐ฟโโค๏ธโ๐ฉ๐ฝ","version":13.1,"tone":[5,3]},{"emoji":"๐ฉ๐ฟโโค๏ธโ๐ฉ๐พ","version":13.1,"tone":[5,4]},{"emoji":"๐ฉ๐ฟโโค๏ธโ๐ฉ๐ฟ","version":13.1,"tone":5}]},{"shortcodes":["family"],"annotation":"family","tags":["family"],"emoji":"๐ช๏ธ","order":3132,"group":1,"version":0.6},{"shortcodes":["family_mwb"],"annotation":"family: man, woman, boy","tags":["boy","family","man","woman"],"emoji":"๐จโ๐ฉโ๐ฆ","order":3133,"group":1,"version":2},{"shortcodes":["family_mwg"],"annotation":"family: man, woman, girl","tags":["family","girl","man","woman"],"emoji":"๐จโ๐ฉโ๐ง","order":3134,"group":1,"version":2},{"shortcodes":["family_mwgb"],"annotation":"family: man, woman, girl, boy","tags":["boy","family","girl","man","woman"],"emoji":"๐จโ๐ฉโ๐งโ๐ฆ","order":3135,"group":1,"version":2},{"shortcodes":["family_mwbb"],"annotation":"family: man, woman, boy, boy","tags":["boy","family","man","woman"],"emoji":"๐จโ๐ฉโ๐ฆโ๐ฆ","order":3136,"group":1,"version":2},{"shortcodes":["family_mwgg"],"annotation":"family: man, woman, girl, girl","tags":["family","girl","man","woman"],"emoji":"๐จโ๐ฉโ๐งโ๐ง","order":3137,"group":1,"version":2},{"shortcodes":["family_mmb"],"annotation":"family: man, man, boy","tags":["boy","family","man"],"emoji":"๐จโ๐จโ๐ฆ","order":3138,"group":1,"version":2},{"shortcodes":["family_mmg"],"annotation":"family: man, man, girl","tags":["family","girl","man"],"emoji":"๐จโ๐จโ๐ง","order":3139,"group":1,"version":2},{"shortcodes":["family_mmgb"],"annotation":"family: man, man, girl, boy","tags":["boy","family","girl","man"],"emoji":"๐จโ๐จโ๐งโ๐ฆ","order":3140,"group":1,"version":2},{"shortcodes":["family_mmbb"],"annotation":"family: man, man, boy, boy","tags":["boy","family","man"],"emoji":"๐จโ๐จโ๐ฆโ๐ฆ","order":3141,"group":1,"version":2},{"shortcodes":["family_mmgg"],"annotation":"family: man, man, girl, girl","tags":["family","girl","man"],"emoji":"๐จโ๐จโ๐งโ๐ง","order":3142,"group":1,"version":2},{"shortcodes":["family_wwb"],"annotation":"family: woman, woman, boy","tags":["boy","family","woman"],"emoji":"๐ฉโ๐ฉโ๐ฆ","order":3143,"group":1,"version":2},{"shortcodes":["family_wwg"],"annotation":"family: woman, woman, girl","tags":["family","girl","woman"],"emoji":"๐ฉโ๐ฉโ๐ง","order":3144,"group":1,"version":2},{"shortcodes":["family_wwgb"],"annotation":"family: woman, woman, girl, boy","tags":["boy","family","girl","woman"],"emoji":"๐ฉโ๐ฉโ๐งโ๐ฆ","order":3145,"group":1,"version":2},{"shortcodes":["family_wwbb"],"annotation":"family: woman, woman, boy, boy","tags":["boy","family","woman"],"emoji":"๐ฉโ๐ฉโ๐ฆโ๐ฆ","order":3146,"group":1,"version":2},{"shortcodes":["family_wwgg"],"annotation":"family: woman, woman, girl, girl","tags":["family","girl","woman"],"emoji":"๐ฉโ๐ฉโ๐งโ๐ง","order":3147,"group":1,"version":2},{"shortcodes":["family_mb"],"annotation":"family: man, boy","tags":["boy","family","man"],"emoji":"๐จโ๐ฆ","order":3148,"group":1,"version":4},{"shortcodes":["family_mbb"],"annotation":"family: man, boy, boy","tags":["boy","family","man"],"emoji":"๐จโ๐ฆโ๐ฆ","order":3149,"group":1,"version":4},{"shortcodes":["family_mg"],"annotation":"family: man, girl","tags":["family","girl","man"],"emoji":"๐จโ๐ง","order":3150,"group":1,"version":4},{"shortcodes":["family_mgb"],"annotation":"family: man, girl, boy","tags":["boy","family","girl","man"],"emoji":"๐จโ๐งโ๐ฆ","order":3151,"group":1,"version":4},{"shortcodes":["family_mgg"],"annotation":"family: man, girl, girl","tags":["family","girl","man"],"emoji":"๐จโ๐งโ๐ง","order":3152,"group":1,"version":4},{"shortcodes":["family_wb"],"annotation":"family: woman, boy","tags":["boy","family","woman"],"emoji":"๐ฉโ๐ฆ","order":3153,"group":1,"version":4},{"shortcodes":["family_wbb"],"annotation":"family: woman, boy, boy","tags":["boy","family","woman"],"emoji":"๐ฉโ๐ฆโ๐ฆ","order":3154,"group":1,"version":4},{"shortcodes":["family_wg"],"annotation":"family: woman, girl","tags":["family","girl","woman"],"emoji":"๐ฉโ๐ง","order":3155,"group":1,"version":4},{"shortcodes":["family_wgb"],"annotation":"family: woman, girl, boy","tags":["boy","family","girl","woman"],"emoji":"๐ฉโ๐งโ๐ฆ","order":3156,"group":1,"version":4},{"shortcodes":["family_wgg"],"annotation":"family: woman, girl, girl","tags":["family","girl","woman"],"emoji":"๐ฉโ๐งโ๐ง","order":3157,"group":1,"version":4},{"shortcodes":["speaking_head"],"annotation":"speaking head","tags":["face","head","silhouette","speak","speaking"],"emoji":"๐ฃ๏ธ","order":3159,"group":1,"version":0.7},{"shortcodes":["bust_in_silhouette"],"annotation":"bust in silhouette","tags":["bust","silhouette"],"emoji":"๐ค","order":3160,"group":1,"version":0.6},{"shortcodes":["busts_in_silhouette"],"annotation":"busts in silhouette","tags":["bust","silhouette"],"emoji":"๐ฅ","order":3161,"group":1,"version":1},{"shortcodes":["people_hugging"],"annotation":"people hugging","tags":["goodbye","hello","hug","thanks"],"emoji":"๐ซ","order":3162,"group":1,"version":13},{"shortcodes":["footprints"],"annotation":"footprints","tags":["clothing","footprint","print"],"emoji":"๐ฃ","order":3163,"group":1,"version":0.6},{"shortcodes":["tone1","tone_light"],"annotation":"light skin tone","tags":["skin tone","type 1โ2"],"emoji":"๐ป","order":3164,"group":2,"version":1},{"shortcodes":["tone2","tone_medium_light"],"annotation":"medium-light skin tone","tags":["skin tone","type 3"],"emoji":"๐ผ","order":3165,"group":2,"version":1},{"shortcodes":["tone3","tone_medium"],"annotation":"medium skin tone","tags":["skin tone","type 4"],"emoji":"๐ฝ","order":3166,"group":2,"version":1},{"shortcodes":["tone4","tone_medium_dark"],"annotation":"medium-dark skin tone","tags":["skin tone","type 5"],"emoji":"๐พ","order":3167,"group":2,"version":1},{"shortcodes":["tone5","tone_dark"],"annotation":"dark skin tone","tags":["skin tone","type 6"],"emoji":"๐ฟ","order":3168,"group":2,"version":1},{"shortcodes":["red_hair"],"annotation":"red hair","tags":["ginger","redhead"],"emoji":"๐ฆฐ","order":3169,"group":2,"version":11},{"shortcodes":["curly_hair"],"annotation":"curly hair","tags":["afro","curly","ringlets"],"emoji":"๐ฆฑ","order":3170,"group":2,"version":11},{"shortcodes":["white_hair"],"annotation":"white hair","tags":["gray","hair","old","white"],"emoji":"๐ฆณ","order":3171,"group":2,"version":11},{"shortcodes":["no_hair"],"annotation":"bald","tags":["chemotherapy","hairless","no hair","shaven"],"emoji":"๐ฆฒ","order":3172,"group":2,"version":11},{"shortcodes":["monkey_face"],"annotation":"monkey face","tags":["face","monkey"],"emoji":"๐ต","order":3173,"group":3,"version":0.6},{"shortcodes":["monkey"],"annotation":"monkey","tags":["monkey"],"emoji":"๐","order":3174,"group":3,"version":0.6},{"shortcodes":["gorilla"],"annotation":"gorilla","tags":["gorilla"],"emoji":"๐ฆ","order":3175,"group":3,"version":3},{"shortcodes":["orangutan"],"annotation":"orangutan","tags":["ape"],"emoji":"๐ฆง","order":3176,"group":3,"version":12},{"shortcodes":["dog_face"],"annotation":"dog face","tags":["dog","face","pet"],"emoji":"๐ถ","order":3177,"group":3,"version":0.6},{"shortcodes":["dog"],"annotation":"dog","tags":["pet"],"emoji":"๐๏ธ","order":3178,"group":3,"version":0.7},{"shortcodes":["guide_dog"],"annotation":"guide dog","tags":["accessibility","blind","guide"],"emoji":"๐ฆฎ","order":3179,"group":3,"version":12},{"shortcodes":["service_dog"],"annotation":"service dog","tags":["accessibility","assistance","dog","service"],"emoji":"๐โ๐ฆบ","order":3180,"group":3,"version":12},{"shortcodes":["poodle"],"annotation":"poodle","tags":["dog"],"emoji":"๐ฉ","order":3181,"group":3,"version":0.6},{"shortcodes":["wolf","wolf_face"],"annotation":"wolf","tags":["face"],"emoji":"๐บ","order":3182,"group":3,"version":0.6},{"shortcodes":["fox","fox_face"],"annotation":"fox","tags":["face"],"emoji":"๐ฆ","order":3183,"group":3,"version":3},{"shortcodes":["raccoon"],"annotation":"raccoon","tags":["curious","sly"],"emoji":"๐ฆ","order":3184,"group":3,"version":11},{"shortcodes":["cat_face"],"annotation":"cat face","tags":["cat","face","pet"],"emoji":"๐ฑ","order":3185,"group":3,"version":0.6},{"shortcodes":["cat"],"annotation":"cat","tags":["pet"],"emoji":"๐๏ธ","order":3186,"group":3,"version":0.7},{"shortcodes":["black_cat"],"annotation":"black cat","tags":["black","cat","unlucky"],"emoji":"๐โโฌ","order":3187,"group":3,"version":13},{"shortcodes":["lion","lion_face"],"annotation":"lion","tags":["face","leo","zodiac"],"emoji":"๐ฆ","order":3188,"group":3,"version":1},{"shortcodes":["tiger_face"],"annotation":"tiger face","tags":["face","tiger"],"emoji":"๐ฏ","order":3189,"group":3,"version":0.6},{"shortcodes":["tiger"],"annotation":"tiger","tags":["tiger"],"emoji":"๐ ","order":3190,"group":3,"version":1},{"shortcodes":["leopard"],"annotation":"leopard","tags":["leopard"],"emoji":"๐","order":3191,"group":3,"version":1},{"shortcodes":["horse_face"],"annotation":"horse face","tags":["face","horse"],"emoji":"๐ด","order":3192,"group":3,"version":0.6},{"shortcodes":["horse","racehorse"],"annotation":"horse","tags":["equestrian","racehorse","racing"],"emoji":"๐","order":3193,"group":3,"version":0.6},{"shortcodes":["unicorn","unicorn_face"],"annotation":"unicorn","tags":["face"],"emoji":"๐ฆ","order":3194,"group":3,"version":1},{"shortcodes":["zebra"],"annotation":"zebra","tags":["stripe"],"emoji":"๐ฆ","order":3195,"group":3,"version":5},{"shortcodes":["deer"],"annotation":"deer","tags":["deer"],"emoji":"๐ฆ","order":3196,"group":3,"version":3},{"shortcodes":["bison"],"annotation":"bison","tags":["buffalo","herd","wisent"],"emoji":"๐ฆฌ","order":3197,"group":3,"version":13},{"shortcodes":["cow_face"],"annotation":"cow face","tags":["cow","face"],"emoji":"๐ฎ","order":3198,"group":3,"version":0.6},{"shortcodes":["ox"],"annotation":"ox","tags":["bull","taurus","zodiac"],"emoji":"๐","order":3199,"group":3,"version":1},{"shortcodes":["water_buffalo"],"annotation":"water buffalo","tags":["buffalo","water"],"emoji":"๐","order":3200,"group":3,"version":1},{"shortcodes":["cow"],"annotation":"cow","tags":["cow"],"emoji":"๐","order":3201,"group":3,"version":1},{"shortcodes":["pig_face"],"annotation":"pig face","tags":["face","pig"],"emoji":"๐ท","order":3202,"group":3,"version":0.6},{"shortcodes":["pig"],"annotation":"pig","tags":["sow"],"emoji":"๐","order":3203,"group":3,"version":1},{"shortcodes":["boar"],"annotation":"boar","tags":["pig"],"emoji":"๐","order":3204,"group":3,"version":0.6},{"shortcodes":["pig_nose"],"annotation":"pig nose","tags":["face","nose","pig"],"emoji":"๐ฝ","order":3205,"group":3,"version":0.6},{"shortcodes":["ram"],"annotation":"ram","tags":["aries","male","sheep","zodiac"],"emoji":"๐","order":3206,"group":3,"version":1},{"shortcodes":["ewe","sheep"],"annotation":"ewe","tags":["female","sheep"],"emoji":"๐","order":3207,"group":3,"version":0.6},{"shortcodes":["goat"],"annotation":"goat","tags":["capricorn","zodiac"],"emoji":"๐","order":3208,"group":3,"version":1},{"shortcodes":["dromedary_camel"],"annotation":"camel","tags":["dromedary","hump"],"emoji":"๐ช","order":3209,"group":3,"version":1},{"shortcodes":["camel"],"annotation":"two-hump camel","tags":["bactrian","camel","hump"],"emoji":"๐ซ","order":3210,"group":3,"version":0.6},{"shortcodes":["llama"],"annotation":"llama","tags":["alpaca","guanaco","vicuรฑa","wool"],"emoji":"๐ฆ","order":3211,"group":3,"version":11},{"shortcodes":["giraffe"],"annotation":"giraffe","tags":["spots"],"emoji":"๐ฆ","order":3212,"group":3,"version":5},{"shortcodes":["elephant"],"annotation":"elephant","tags":["elephant"],"emoji":"๐","order":3213,"group":3,"version":0.6},{"shortcodes":["mammoth"],"annotation":"mammoth","tags":["extinction","large","tusk","woolly"],"emoji":"๐ฆฃ","order":3214,"group":3,"version":13},{"shortcodes":["rhino","rhinoceros"],"annotation":"rhinoceros","tags":["rhinoceros"],"emoji":"๐ฆ","order":3215,"group":3,"version":3},{"shortcodes":["hippo"],"annotation":"hippopotamus","tags":["hippo"],"emoji":"๐ฆ","order":3216,"group":3,"version":11},{"shortcodes":["mouse_face"],"annotation":"mouse face","tags":["face","mouse"],"emoji":"๐ญ","order":3217,"group":3,"version":0.6},{"shortcodes":["mouse"],"annotation":"mouse","tags":["mouse"],"emoji":"๐","order":3218,"group":3,"version":1},{"shortcodes":["rat"],"annotation":"rat","tags":["rat"],"emoji":"๐","order":3219,"group":3,"version":1},{"shortcodes":["hamster","hamster_face"],"annotation":"hamster","tags":["face","pet"],"emoji":"๐น","order":3220,"group":3,"version":0.6},{"shortcodes":["rabbit_face"],"annotation":"rabbit face","tags":["bunny","face","pet","rabbit"],"emoji":"๐ฐ","order":3221,"group":3,"version":0.6},{"shortcodes":["rabbit"],"annotation":"rabbit","tags":["bunny","pet"],"emoji":"๐","order":3222,"group":3,"version":1},{"shortcodes":["chipmunk"],"annotation":"chipmunk","tags":["squirrel"],"emoji":"๐ฟ๏ธ","order":3224,"group":3,"version":0.7},{"shortcodes":["beaver"],"annotation":"beaver","tags":["dam"],"emoji":"๐ฆซ","order":3225,"group":3,"version":13},{"shortcodes":["hedgehog"],"annotation":"hedgehog","tags":["spiny"],"emoji":"๐ฆ","order":3226,"group":3,"version":5},{"shortcodes":["bat"],"annotation":"bat","tags":["vampire"],"emoji":"๐ฆ","order":3227,"group":3,"version":3},{"shortcodes":["bear","bear_face"],"annotation":"bear","tags":["face"],"emoji":"๐ป","order":3228,"group":3,"version":0.6},{"shortcodes":["polar_bear","polar_bear_face"],"annotation":"polar bear","tags":["arctic","bear","white"],"emoji":"๐ปโโ๏ธ","order":3229,"group":3,"version":13},{"shortcodes":["koala","koala_face"],"annotation":"koala","tags":["face","marsupial"],"emoji":"๐จ","order":3231,"group":3,"version":0.6},{"shortcodes":["panda","panda_face"],"annotation":"panda","tags":["face"],"emoji":"๐ผ","order":3232,"group":3,"version":0.6},{"shortcodes":["sloth"],"annotation":"sloth","tags":["lazy","slow"],"emoji":"๐ฆฅ","order":3233,"group":3,"version":12},{"shortcodes":["otter"],"annotation":"otter","tags":["fishing","playful"],"emoji":"๐ฆฆ","order":3234,"group":3,"version":12},{"shortcodes":["skunk"],"annotation":"skunk","tags":["stink"],"emoji":"๐ฆจ","order":3235,"group":3,"version":12},{"shortcodes":["kangaroo"],"annotation":"kangaroo","tags":["australia","joey","jump","marsupial"],"emoji":"๐ฆ","order":3236,"group":3,"version":11},{"shortcodes":["badger"],"annotation":"badger","tags":["honey badger","pester"],"emoji":"๐ฆก","order":3237,"group":3,"version":11},{"shortcodes":["paw_prints"],"annotation":"paw prints","tags":["feet","paw","print"],"emoji":"๐พ","order":3238,"group":3,"version":0.6},{"shortcodes":["turkey"],"annotation":"turkey","tags":["bird"],"emoji":"๐ฆ","order":3239,"group":3,"version":1},{"shortcodes":["chicken","chicken_face"],"annotation":"chicken","tags":["bird"],"emoji":"๐","order":3240,"group":3,"version":0.6},{"shortcodes":["rooster"],"annotation":"rooster","tags":["bird"],"emoji":"๐","order":3241,"group":3,"version":1},{"shortcodes":["hatching_chick"],"annotation":"hatching chick","tags":["baby","bird","chick","hatching"],"emoji":"๐ฃ","order":3242,"group":3,"version":0.6},{"shortcodes":["baby_chick"],"annotation":"baby chick","tags":["baby","bird","chick"],"emoji":"๐ค","order":3243,"group":3,"version":0.6},{"shortcodes":["hatched_chick"],"annotation":"front-facing baby chick","tags":["baby","bird","chick"],"emoji":"๐ฅ","order":3244,"group":3,"version":0.6},{"shortcodes":["bird","bird_face"],"annotation":"bird","tags":["bird"],"emoji":"๐ฆ๏ธ","order":3245,"group":3,"version":0.6},{"shortcodes":["penguin","penguin_face"],"annotation":"penguin","tags":["bird"],"emoji":"๐ง","order":3246,"group":3,"version":0.6},{"shortcodes":["dove"],"annotation":"dove","tags":["bird","fly","peace"],"emoji":"๐๏ธ","order":3248,"group":3,"version":0.7},{"shortcodes":["eagle"],"annotation":"eagle","tags":["bird"],"emoji":"๐ฆ ","order":3249,"group":3,"version":3},{"shortcodes":["duck"],"annotation":"duck","tags":["bird"],"emoji":"๐ฆ","order":3250,"group":3,"version":3},{"shortcodes":["swan"],"annotation":"swan","tags":["bird","cygnet","ugly duckling"],"emoji":"๐ฆข","order":3251,"group":3,"version":11},{"shortcodes":["owl"],"annotation":"owl","tags":["bird","wise"],"emoji":"๐ฆ","order":3252,"group":3,"version":3},{"shortcodes":["dodo"],"annotation":"dodo","tags":["extinction","large","mauritius"],"emoji":"๐ฆค","order":3253,"group":3,"version":13},{"shortcodes":["feather"],"annotation":"feather","tags":["bird","flight","light","plumage"],"emoji":"๐ชถ","order":3254,"group":3,"version":13},{"shortcodes":["flamingo"],"annotation":"flamingo","tags":["flamboyant","tropical"],"emoji":"๐ฆฉ","order":3255,"group":3,"version":12},{"shortcodes":["peacock"],"annotation":"peacock","tags":["bird","ostentatious","peahen","proud"],"emoji":"๐ฆ","order":3256,"group":3,"version":11},{"shortcodes":["parrot"],"annotation":"parrot","tags":["bird","pirate","talk"],"emoji":"๐ฆ","order":3257,"group":3,"version":11},{"shortcodes":["frog","frog_face"],"annotation":"frog","tags":["face"],"emoji":"๐ธ","order":3258,"group":3,"version":0.6},{"shortcodes":["crocodile"],"annotation":"crocodile","tags":["crocodile"],"emoji":"๐","order":3259,"group":3,"version":1},{"shortcodes":["turtle"],"annotation":"turtle","tags":["terrapin","tortoise"],"emoji":"๐ข","order":3260,"group":3,"version":0.6},{"shortcodes":["lizard"],"annotation":"lizard","tags":["reptile"],"emoji":"๐ฆ","order":3261,"group":3,"version":3},{"shortcodes":["snake"],"annotation":"snake","tags":["bearer","ophiuchus","serpent","zodiac"],"emoji":"๐","order":3262,"group":3,"version":0.6},{"shortcodes":["dragon_face"],"annotation":"dragon face","tags":["dragon","face","fairy tale"],"emoji":"๐ฒ","order":3263,"group":3,"version":0.6},{"shortcodes":["dragon"],"annotation":"dragon","tags":["fairy tale"],"emoji":"๐","order":3264,"group":3,"version":1},{"shortcodes":["sauropod"],"annotation":"sauropod","tags":["brachiosaurus","brontosaurus","diplodocus"],"emoji":"๐ฆ","order":3265,"group":3,"version":5},{"shortcodes":["t-rex","trex"],"annotation":"T-Rex","tags":["t-rex","tyrannosaurus rex"],"emoji":"๐ฆ","order":3266,"group":3,"version":5},{"shortcodes":["spouting_whale"],"annotation":"spouting whale","tags":["face","spouting","whale"],"emoji":"๐ณ","order":3267,"group":3,"version":0.6},{"shortcodes":["whale"],"annotation":"whale","tags":["whale"],"emoji":"๐","order":3268,"group":3,"version":1},{"shortcodes":["dolphin"],"annotation":"dolphin","tags":["flipper"],"emoji":"๐ฌ","order":3269,"group":3,"version":0.6},{"shortcodes":["seal"],"annotation":"seal","tags":["sea lion"],"emoji":"๐ฆญ","order":3270,"group":3,"version":13},{"shortcodes":["fish"],"annotation":"fish","tags":["pisces","zodiac"],"emoji":"๐๏ธ","order":3271,"group":3,"version":0.6},{"shortcodes":["tropical_fish"],"annotation":"tropical fish","tags":["fish","tropical"],"emoji":"๐ ","order":3272,"group":3,"version":0.6},{"shortcodes":["blowfish"],"annotation":"blowfish","tags":["fish"],"emoji":"๐ก","order":3273,"group":3,"version":0.6},{"shortcodes":["shark"],"annotation":"shark","tags":["fish"],"emoji":"๐ฆ","order":3274,"group":3,"version":3},{"shortcodes":["octopus"],"annotation":"octopus","tags":["octopus"],"emoji":"๐","order":3275,"group":3,"version":0.6},{"shortcodes":["shell"],"annotation":"spiral shell","tags":["shell","spiral"],"emoji":"๐","order":3276,"group":3,"version":0.6},{"shortcodes":["coral"],"annotation":"coral","tags":["ocean","reef"],"emoji":"๐ชธ","order":3277,"group":3,"version":14},{"shortcodes":["snail"],"annotation":"snail","tags":["snail"],"emoji":"๐","order":3278,"group":3,"version":0.6},{"shortcodes":["butterfly"],"annotation":"butterfly","tags":["insect","pretty"],"emoji":"๐ฆ","order":3279,"group":3,"version":3},{"shortcodes":["bug"],"annotation":"bug","tags":["insect"],"emoji":"๐","order":3280,"group":3,"version":0.6},{"shortcodes":["ant"],"annotation":"ant","tags":["insect"],"emoji":"๐","order":3281,"group":3,"version":0.6},{"shortcodes":["bee"],"annotation":"honeybee","tags":["bee","insect"],"emoji":"๐","order":3282,"group":3,"version":0.6},{"shortcodes":["beetle"],"annotation":"beetle","tags":["bug","insect"],"emoji":"๐ชฒ","order":3283,"group":3,"version":13},{"shortcodes":["lady_beetle"],"annotation":"lady beetle","tags":["beetle","insect","ladybird","ladybug"],"emoji":"๐","order":3284,"group":3,"version":0.6},{"shortcodes":["cricket"],"annotation":"cricket","tags":["grasshopper"],"emoji":"๐ฆ","order":3285,"group":3,"version":5},{"shortcodes":["cockroach"],"annotation":"cockroach","tags":["insect","pest","roach"],"emoji":"๐ชณ","order":3286,"group":3,"version":13},{"shortcodes":["spider"],"annotation":"spider","tags":["insect"],"emoji":"๐ท๏ธ","order":3288,"group":3,"version":0.7},{"shortcodes":["spider_web"],"annotation":"spider web","tags":["spider","web"],"emoji":"๐ธ๏ธ","order":3290,"group":3,"version":0.7},{"shortcodes":["scorpion"],"annotation":"scorpion","tags":["scorpio","zodiac"],"emoji":"๐ฆ","order":3291,"group":3,"version":1},{"shortcodes":["mosquito"],"annotation":"mosquito","tags":["disease","fever","malaria","pest","virus"],"emoji":"๐ฆ","order":3292,"group":3,"version":11},{"shortcodes":["fly"],"annotation":"fly","tags":["disease","maggot","pest","rotting"],"emoji":"๐ชฐ","order":3293,"group":3,"version":13},{"shortcodes":["worm"],"annotation":"worm","tags":["annelid","earthworm","parasite"],"emoji":"๐ชฑ","order":3294,"group":3,"version":13},{"shortcodes":["microbe"],"annotation":"microbe","tags":["amoeba","bacteria","virus"],"emoji":"๐ฆ ","order":3295,"group":3,"version":11},{"shortcodes":["bouquet"],"annotation":"bouquet","tags":["flower"],"emoji":"๐","order":3296,"group":3,"version":0.6},{"shortcodes":["cherry_blossom"],"annotation":"cherry blossom","tags":["blossom","cherry","flower"],"emoji":"๐ธ","order":3297,"group":3,"version":0.6},{"shortcodes":["white_flower"],"annotation":"white flower","tags":["flower"],"emoji":"๐ฎ","order":3298,"group":3,"version":0.6},{"shortcodes":["lotus"],"annotation":"lotus","tags":["buddhism","flower","hinduism","india","purity","vietnam"],"emoji":"๐ชท","order":3299,"group":3,"version":14},{"shortcodes":["rosette"],"annotation":"rosette","tags":["plant"],"emoji":"๐ต๏ธ","order":3301,"group":3,"version":0.7},{"shortcodes":["rose"],"annotation":"rose","tags":["flower"],"emoji":"๐น","order":3302,"group":3,"version":0.6},{"shortcodes":["wilted_flower"],"annotation":"wilted flower","tags":["flower","wilted"],"emoji":"๐ฅ","order":3303,"group":3,"version":3},{"shortcodes":["hibiscus"],"annotation":"hibiscus","tags":["flower"],"emoji":"๐บ","order":3304,"group":3,"version":0.6},{"shortcodes":["sunflower"],"annotation":"sunflower","tags":["flower","sun"],"emoji":"๐ป","order":3305,"group":3,"version":0.6},{"shortcodes":["blossom"],"annotation":"blossom","tags":["flower"],"emoji":"๐ผ","order":3306,"group":3,"version":0.6},{"shortcodes":["tulip"],"annotation":"tulip","tags":["flower"],"emoji":"๐ท","order":3307,"group":3,"version":0.6},{"shortcodes":["seedling"],"annotation":"seedling","tags":["young"],"emoji":"๐ฑ","order":3308,"group":3,"version":0.6},{"shortcodes":["potted_plant"],"annotation":"potted plant","tags":["boring","grow","house","nurturing","plant","useless"],"emoji":"๐ชด","order":3309,"group":3,"version":13},{"shortcodes":["evergreen_tree"],"annotation":"evergreen tree","tags":["tree"],"emoji":"๐ฒ","order":3310,"group":3,"version":1},{"shortcodes":["deciduous_tree"],"annotation":"deciduous tree","tags":["deciduous","shedding","tree"],"emoji":"๐ณ","order":3311,"group":3,"version":1},{"shortcodes":["palm_tree"],"annotation":"palm tree","tags":["palm","tree"],"emoji":"๐ด","order":3312,"group":3,"version":0.6},{"shortcodes":["cactus"],"annotation":"cactus","tags":["plant"],"emoji":"๐ต","order":3313,"group":3,"version":0.6},{"shortcodes":["ear_of_rice","sheaf_of_rice"],"annotation":"sheaf of rice","tags":["ear","grain","rice"],"emoji":"๐พ","order":3314,"group":3,"version":0.6},{"shortcodes":["herb"],"annotation":"herb","tags":["leaf"],"emoji":"๐ฟ","order":3315,"group":3,"version":0.6},{"shortcodes":["shamrock"],"annotation":"shamrock","tags":["plant"],"emoji":"โ๏ธ","order":3317,"group":3,"version":1},{"shortcodes":["four_leaf_clover"],"annotation":"four leaf clover","tags":["4","clover","four","four-leaf clover","leaf"],"emoji":"๐","order":3318,"group":3,"version":0.6},{"shortcodes":["maple_leaf"],"annotation":"maple leaf","tags":["falling","leaf","maple"],"emoji":"๐","order":3319,"group":3,"version":0.6},{"shortcodes":["fallen_leaf"],"annotation":"fallen leaf","tags":["falling","leaf"],"emoji":"๐","order":3320,"group":3,"version":0.6},{"shortcodes":["leaves"],"annotation":"leaf fluttering in wind","tags":["blow","flutter","leaf","wind"],"emoji":"๐","order":3321,"group":3,"version":0.6},{"shortcodes":["empty_nest","nest"],"annotation":"empty nest","tags":["nesting"],"emoji":"๐ชน","order":3322,"group":3,"version":14},{"shortcodes":["nest_with_eggs"],"annotation":"nest with eggs","tags":["nesting"],"emoji":"๐ชบ","order":3323,"group":3,"version":14},{"shortcodes":["grapes"],"annotation":"grapes","tags":["fruit","grape"],"emoji":"๐","order":3324,"group":4,"version":0.6},{"shortcodes":["melon"],"annotation":"melon","tags":["fruit"],"emoji":"๐","order":3325,"group":4,"version":0.6},{"shortcodes":["watermelon"],"annotation":"watermelon","tags":["fruit"],"emoji":"๐","order":3326,"group":4,"version":0.6},{"shortcodes":["orange","tangerine"],"annotation":"tangerine","tags":["fruit","orange"],"emoji":"๐","order":3327,"group":4,"version":0.6},{"shortcodes":["lemon"],"annotation":"lemon","tags":["citrus","fruit"],"emoji":"๐","order":3328,"group":4,"version":1},{"shortcodes":["banana"],"annotation":"banana","tags":["fruit"],"emoji":"๐","order":3329,"group":4,"version":0.6},{"shortcodes":["pineapple"],"annotation":"pineapple","tags":["fruit"],"emoji":"๐","order":3330,"group":4,"version":0.6},{"shortcodes":["mango"],"annotation":"mango","tags":["fruit","tropical"],"emoji":"๐ฅญ","order":3331,"group":4,"version":11},{"shortcodes":["apple","red_apple"],"annotation":"red apple","tags":["apple","fruit","red"],"emoji":"๐","order":3332,"group":4,"version":0.6},{"shortcodes":["green_apple"],"annotation":"green apple","tags":["apple","fruit","green"],"emoji":"๐","order":3333,"group":4,"version":0.6},{"shortcodes":["pear"],"annotation":"pear","tags":["fruit"],"emoji":"๐","order":3334,"group":4,"version":1},{"shortcodes":["peach"],"annotation":"peach","tags":["fruit"],"emoji":"๐","order":3335,"group":4,"version":0.6},{"shortcodes":["cherries"],"annotation":"cherries","tags":["berries","cherry","fruit","red"],"emoji":"๐","order":3336,"group":4,"version":0.6},{"shortcodes":["strawberry"],"annotation":"strawberry","tags":["berry","fruit"],"emoji":"๐","order":3337,"group":4,"version":0.6},{"shortcodes":["blueberries"],"annotation":"blueberries","tags":["berry","bilberry","blue","blueberry"],"emoji":"๐ซ","order":3338,"group":4,"version":13},{"shortcodes":["kiwi"],"annotation":"kiwi fruit","tags":["food","fruit","kiwi"],"emoji":"๐ฅ","order":3339,"group":4,"version":3},{"shortcodes":["tomato"],"annotation":"tomato","tags":["fruit","vegetable"],"emoji":"๐ ","order":3340,"group":4,"version":0.6},{"shortcodes":["olive"],"annotation":"olive","tags":["food"],"emoji":"๐ซ","order":3341,"group":4,"version":13},{"shortcodes":["coconut"],"annotation":"coconut","tags":["palm","piรฑa colada"],"emoji":"๐ฅฅ","order":3342,"group":4,"version":5},{"shortcodes":["avocado"],"annotation":"avocado","tags":["food","fruit"],"emoji":"๐ฅ","order":3343,"group":4,"version":3},{"shortcodes":["eggplant"],"annotation":"eggplant","tags":["aubergine","vegetable"],"emoji":"๐","order":3344,"group":4,"version":0.6},{"shortcodes":["potato"],"annotation":"potato","tags":["food","vegetable"],"emoji":"๐ฅ","order":3345,"group":4,"version":3},{"shortcodes":["carrot"],"annotation":"carrot","tags":["food","vegetable"],"emoji":"๐ฅ","order":3346,"group":4,"version":3},{"shortcodes":["corn","ear_of_corn"],"annotation":"ear of corn","tags":["corn","ear","maize","maze"],"emoji":"๐ฝ","order":3347,"group":4,"version":0.6},{"shortcodes":["hot_pepper"],"annotation":"hot pepper","tags":["hot","pepper"],"emoji":"๐ถ๏ธ","order":3349,"group":4,"version":0.7},{"shortcodes":["bell_pepper"],"annotation":"bell pepper","tags":["capsicum","pepper","vegetable"],"emoji":"๐ซ","order":3350,"group":4,"version":13},{"shortcodes":["cucumber"],"annotation":"cucumber","tags":["food","pickle","vegetable"],"emoji":"๐ฅ","order":3351,"group":4,"version":3},{"shortcodes":["leafy_green"],"annotation":"leafy green","tags":["bok choy","cabbage","kale","lettuce"],"emoji":"๐ฅฌ","order":3352,"group":4,"version":11},{"shortcodes":["broccoli"],"annotation":"broccoli","tags":["wild cabbage"],"emoji":"๐ฅฆ","order":3353,"group":4,"version":5},{"shortcodes":["garlic"],"annotation":"garlic","tags":["flavoring"],"emoji":"๐ง","order":3354,"group":4,"version":12},{"shortcodes":["onion"],"annotation":"onion","tags":["flavoring"],"emoji":"๐ง ","order":3355,"group":4,"version":12},{"shortcodes":["mushroom"],"annotation":"mushroom","tags":["toadstool"],"emoji":"๐","order":3356,"group":4,"version":0.6},{"shortcodes":["peanuts"],"annotation":"peanuts","tags":["food","nut","peanut","vegetable"],"emoji":"๐ฅ","order":3357,"group":4,"version":3},{"shortcodes":["beans"],"annotation":"beans","tags":["food","kidney","legume"],"emoji":"๐ซ","order":3358,"group":4,"version":14},{"shortcodes":["chestnut"],"annotation":"chestnut","tags":["plant"],"emoji":"๐ฐ","order":3359,"group":4,"version":0.6},{"shortcodes":["bread"],"annotation":"bread","tags":["loaf"],"emoji":"๐","order":3360,"group":4,"version":0.6},{"shortcodes":["croissant"],"annotation":"croissant","tags":["bread","breakfast","food","french","roll"],"emoji":"๐ฅ","order":3361,"group":4,"version":3},{"shortcodes":["baguette_bread"],"annotation":"baguette bread","tags":["baguette","bread","food","french"],"emoji":"๐ฅ","order":3362,"group":4,"version":3},{"shortcodes":["flatbread"],"annotation":"flatbread","tags":["arepa","lavash","naan","pita"],"emoji":"๐ซ","order":3363,"group":4,"version":13},{"shortcodes":["pretzel"],"annotation":"pretzel","tags":["twisted"],"emoji":"๐ฅจ","order":3364,"group":4,"version":5},{"shortcodes":["bagel"],"annotation":"bagel","tags":["bakery","breakfast","schmear"],"emoji":"๐ฅฏ","order":3365,"group":4,"version":11},{"shortcodes":["pancakes"],"annotation":"pancakes","tags":["breakfast","crรชpe","food","hotcake","pancake"],"emoji":"๐ฅ","order":3366,"group":4,"version":3},{"shortcodes":["waffle"],"annotation":"waffle","tags":["breakfast","indecisive","iron"],"emoji":"๐ง","order":3367,"group":4,"version":12},{"shortcodes":["cheese"],"annotation":"cheese wedge","tags":["cheese"],"emoji":"๐ง","order":3368,"group":4,"version":1},{"shortcodes":["meat_on_bone"],"annotation":"meat on bone","tags":["bone","meat"],"emoji":"๐","order":3369,"group":4,"version":0.6},{"shortcodes":["poultry_leg"],"annotation":"poultry leg","tags":["bone","chicken","drumstick","leg","poultry"],"emoji":"๐","order":3370,"group":4,"version":0.6},{"shortcodes":["cut_of_meat"],"annotation":"cut of meat","tags":["chop","lambchop","porkchop","steak"],"emoji":"๐ฅฉ","order":3371,"group":4,"version":5},{"shortcodes":["bacon"],"annotation":"bacon","tags":["breakfast","food","meat"],"emoji":"๐ฅ","order":3372,"group":4,"version":3},{"shortcodes":["hamburger"],"annotation":"hamburger","tags":["burger"],"emoji":"๐","order":3373,"group":4,"version":0.6},{"shortcodes":["french_fries","fries"],"annotation":"french fries","tags":["french","fries"],"emoji":"๐","order":3374,"group":4,"version":0.6},{"shortcodes":["pizza"],"annotation":"pizza","tags":["cheese","slice"],"emoji":"๐","order":3375,"group":4,"version":0.6},{"shortcodes":["hotdog"],"annotation":"hot dog","tags":["frankfurter","hotdog","sausage"],"emoji":"๐ญ","order":3376,"group":4,"version":1},{"shortcodes":["sandwich"],"annotation":"sandwich","tags":["bread"],"emoji":"๐ฅช","order":3377,"group":4,"version":5},{"shortcodes":["taco"],"annotation":"taco","tags":["mexican"],"emoji":"๐ฎ","order":3378,"group":4,"version":1},{"shortcodes":["burrito"],"annotation":"burrito","tags":["mexican","wrap"],"emoji":"๐ฏ","order":3379,"group":4,"version":1},{"shortcodes":["tamale"],"annotation":"tamale","tags":["mexican","wrapped"],"emoji":"๐ซ","order":3380,"group":4,"version":13},{"shortcodes":["stuffed_flatbread"],"annotation":"stuffed flatbread","tags":["falafel","flatbread","food","gyro","kebab","stuffed"],"emoji":"๐ฅ","order":3381,"group":4,"version":3},{"shortcodes":["falafel"],"annotation":"falafel","tags":["chickpea","meatball"],"emoji":"๐ง","order":3382,"group":4,"version":12},{"shortcodes":["egg"],"annotation":"egg","tags":["breakfast","food"],"emoji":"๐ฅ","order":3383,"group":4,"version":3},{"shortcodes":["cooking","fried_egg"],"annotation":"cooking","tags":["breakfast","egg","frying","pan"],"emoji":"๐ณ","order":3384,"group":4,"version":0.6},{"shortcodes":["shallow_pan_of_food"],"annotation":"shallow pan of food","tags":["casserole","food","paella","pan","shallow"],"emoji":"๐ฅ","order":3385,"group":4,"version":3},{"shortcodes":["pot_of_food","stew"],"annotation":"pot of food","tags":["pot","stew"],"emoji":"๐ฒ","order":3386,"group":4,"version":0.6},{"shortcodes":["fondue"],"annotation":"fondue","tags":["cheese","chocolate","melted","pot","swiss"],"emoji":"๐ซ","order":3387,"group":4,"version":13},{"shortcodes":["bowl_with_spoon"],"annotation":"bowl with spoon","tags":["breakfast","cereal","congee"],"emoji":"๐ฅฃ","order":3388,"group":4,"version":5},{"shortcodes":["green_salad","salad"],"annotation":"green salad","tags":["food","green","salad"],"emoji":"๐ฅ","order":3389,"group":4,"version":3},{"shortcodes":["popcorn"],"annotation":"popcorn","tags":["popcorn"],"emoji":"๐ฟ","order":3390,"group":4,"version":1},{"shortcodes":["butter"],"annotation":"butter","tags":["dairy"],"emoji":"๐ง","order":3391,"group":4,"version":12},{"shortcodes":["salt"],"annotation":"salt","tags":["condiment","shaker"],"emoji":"๐ง","order":3392,"group":4,"version":11},{"shortcodes":["canned_food"],"annotation":"canned food","tags":["can"],"emoji":"๐ฅซ","order":3393,"group":4,"version":5},{"shortcodes":["bento","bento_box"],"annotation":"bento box","tags":["bento","box"],"emoji":"๐ฑ","order":3394,"group":4,"version":0.6},{"shortcodes":["rice_cracker"],"annotation":"rice cracker","tags":["cracker","rice"],"emoji":"๐","order":3395,"group":4,"version":0.6},{"shortcodes":["rice_ball"],"annotation":"rice ball","tags":["ball","japanese","rice"],"emoji":"๐","order":3396,"group":4,"version":0.6},{"shortcodes":["cooked_rice","rice"],"annotation":"cooked rice","tags":["cooked","rice"],"emoji":"๐","order":3397,"group":4,"version":0.6},{"shortcodes":["curry","curry_rice"],"annotation":"curry rice","tags":["curry","rice"],"emoji":"๐","order":3398,"group":4,"version":0.6},{"shortcodes":["ramen","steaming_bowl"],"annotation":"steaming bowl","tags":["bowl","noodle","ramen","steaming"],"emoji":"๐","order":3399,"group":4,"version":0.6},{"shortcodes":["spaghetti"],"annotation":"spaghetti","tags":["pasta"],"emoji":"๐","order":3400,"group":4,"version":0.6},{"shortcodes":["sweet_potato"],"annotation":"roasted sweet potato","tags":["potato","roasted","sweet"],"emoji":"๐ ","order":3401,"group":4,"version":0.6},{"shortcodes":["oden"],"annotation":"oden","tags":["kebab","seafood","skewer","stick"],"emoji":"๐ข","order":3402,"group":4,"version":0.6},{"shortcodes":["sushi"],"annotation":"sushi","tags":["sushi"],"emoji":"๐ฃ","order":3403,"group":4,"version":0.6},{"shortcodes":["fried_shrimp"],"annotation":"fried shrimp","tags":["fried","prawn","shrimp","tempura"],"emoji":"๐ค","order":3404,"group":4,"version":0.6},{"shortcodes":["fish_cake"],"annotation":"fish cake with swirl","tags":["cake","fish","pastry","swirl"],"emoji":"๐ฅ","order":3405,"group":4,"version":0.6},{"shortcodes":["moon_cake"],"annotation":"moon cake","tags":["autumn","festival","yuรจbวng"],"emoji":"๐ฅฎ","order":3406,"group":4,"version":11},{"shortcodes":["dango"],"annotation":"dango","tags":["dessert","japanese","skewer","stick","sweet"],"emoji":"๐ก","order":3407,"group":4,"version":0.6},{"shortcodes":["dumpling"],"annotation":"dumpling","tags":["empanada","gyลza","jiaozi","pierogi","potsticker"],"emoji":"๐ฅ","order":3408,"group":4,"version":5},{"shortcodes":["fortune_cookie"],"annotation":"fortune cookie","tags":["prophecy"],"emoji":"๐ฅ ","order":3409,"group":4,"version":5},{"shortcodes":["takeout_box"],"annotation":"takeout box","tags":["oyster pail"],"emoji":"๐ฅก","order":3410,"group":4,"version":5},{"shortcodes":["crab"],"annotation":"crab","tags":["cancer","zodiac"],"emoji":"๐ฆ","order":3411,"group":4,"version":1},{"shortcodes":["lobster"],"annotation":"lobster","tags":["bisque","claws","seafood"],"emoji":"๐ฆ","order":3412,"group":4,"version":11},{"shortcodes":["shrimp"],"annotation":"shrimp","tags":["food","shellfish","small"],"emoji":"๐ฆ","order":3413,"group":4,"version":3},{"shortcodes":["squid"],"annotation":"squid","tags":["food","molusc"],"emoji":"๐ฆ","order":3414,"group":4,"version":3},{"shortcodes":["oyster"],"annotation":"oyster","tags":["diving","pearl"],"emoji":"๐ฆช","order":3415,"group":4,"version":12},{"shortcodes":["icecream","soft_serve"],"annotation":"soft ice cream","tags":["cream","dessert","ice","icecream","soft","sweet"],"emoji":"๐ฆ","order":3416,"group":4,"version":0.6},{"shortcodes":["shaved_ice"],"annotation":"shaved ice","tags":["dessert","ice","shaved","sweet"],"emoji":"๐ง","order":3417,"group":4,"version":0.6},{"shortcodes":["ice_cream"],"annotation":"ice cream","tags":["cream","dessert","ice","sweet"],"emoji":"๐จ","order":3418,"group":4,"version":0.6},{"shortcodes":["doughnut"],"annotation":"doughnut","tags":["breakfast","dessert","donut","sweet"],"emoji":"๐ฉ","order":3419,"group":4,"version":0.6},{"shortcodes":["cookie"],"annotation":"cookie","tags":["dessert","sweet"],"emoji":"๐ช","order":3420,"group":4,"version":0.6},{"shortcodes":["birthday","birthday_cake"],"annotation":"birthday cake","tags":["birthday","cake","celebration","dessert","pastry","sweet"],"emoji":"๐","order":3421,"group":4,"version":0.6},{"shortcodes":["cake","shortcake"],"annotation":"shortcake","tags":["cake","dessert","pastry","slice","sweet"],"emoji":"๐ฐ","order":3422,"group":4,"version":0.6},{"shortcodes":["cupcake"],"annotation":"cupcake","tags":["bakery","sweet"],"emoji":"๐ง","order":3423,"group":4,"version":11},{"shortcodes":["pie"],"annotation":"pie","tags":["filling","pastry"],"emoji":"๐ฅง","order":3424,"group":4,"version":5},{"shortcodes":["chocolate_bar"],"annotation":"chocolate bar","tags":["bar","chocolate","dessert","sweet"],"emoji":"๐ซ","order":3425,"group":4,"version":0.6},{"shortcodes":["candy"],"annotation":"candy","tags":["dessert","sweet"],"emoji":"๐ฌ","order":3426,"group":4,"version":0.6},{"shortcodes":["lollipop"],"annotation":"lollipop","tags":["candy","dessert","sweet"],"emoji":"๐ญ","order":3427,"group":4,"version":0.6},{"shortcodes":["custard"],"annotation":"custard","tags":["dessert","pudding","sweet"],"emoji":"๐ฎ","order":3428,"group":4,"version":0.6},{"shortcodes":["honey_pot"],"annotation":"honey pot","tags":["honey","honeypot","pot","sweet"],"emoji":"๐ฏ","order":3429,"group":4,"version":0.6},{"shortcodes":["baby_bottle"],"annotation":"baby bottle","tags":["baby","bottle","drink","milk"],"emoji":"๐ผ","order":3430,"group":4,"version":1},{"shortcodes":["glass_of_milk","milk"],"annotation":"glass of milk","tags":["drink","glass","milk"],"emoji":"๐ฅ","order":3431,"group":4,"version":3},{"shortcodes":["coffee"],"annotation":"hot beverage","tags":["beverage","coffee","drink","hot","steaming","tea"],"emoji":"โ๏ธ","order":3432,"group":4,"version":0.6},{"shortcodes":["teapot"],"annotation":"teapot","tags":["drink","pot","tea"],"emoji":"๐ซ","order":3433,"group":4,"version":13},{"shortcodes":["tea"],"annotation":"teacup without handle","tags":["beverage","cup","drink","tea","teacup"],"emoji":"๐ต","order":3434,"group":4,"version":0.6},{"shortcodes":["sake"],"annotation":"sake","tags":["bar","beverage","bottle","cup","drink"],"emoji":"๐ถ","order":3435,"group":4,"version":0.6},{"shortcodes":["champagne"],"annotation":"bottle with popping cork","tags":["bar","bottle","cork","drink","popping"],"emoji":"๐พ","order":3436,"group":4,"version":1},{"shortcodes":["wine_glass"],"annotation":"wine glass","tags":["bar","beverage","drink","glass","wine"],"emoji":"๐ท","order":3437,"group":4,"version":0.6},{"shortcodes":["cocktail"],"annotation":"cocktail glass","tags":["bar","cocktail","drink","glass"],"emoji":"๐ธ๏ธ","order":3438,"group":4,"version":0.6},{"shortcodes":["tropical_drink"],"annotation":"tropical drink","tags":["bar","drink","tropical"],"emoji":"๐น","order":3439,"group":4,"version":0.6},{"shortcodes":["beer"],"annotation":"beer mug","tags":["bar","beer","drink","mug"],"emoji":"๐บ","order":3440,"group":4,"version":0.6},{"shortcodes":["beers"],"annotation":"clinking beer mugs","tags":["bar","beer","clink","drink","mug"],"emoji":"๐ป","order":3441,"group":4,"version":0.6},{"shortcodes":["clinking_glasses"],"annotation":"clinking glasses","tags":["celebrate","clink","drink","glass"],"emoji":"๐ฅ","order":3442,"group":4,"version":3},{"shortcodes":["tumbler_glass","whisky"],"annotation":"tumbler glass","tags":["glass","liquor","shot","tumbler","whisky"],"emoji":"๐ฅ","order":3443,"group":4,"version":3},{"shortcodes":["pour","pouring_liquid"],"annotation":"pouring liquid","tags":["drink","empty","glass","spill"],"emoji":"๐ซ","order":3444,"group":4,"version":14},{"shortcodes":["cup_with_straw"],"annotation":"cup with straw","tags":["juice","soda"],"emoji":"๐ฅค","order":3445,"group":4,"version":5},{"shortcodes":["boba_drink","bubble_tea"],"annotation":"bubble tea","tags":["bubble","milk","pearl","tea"],"emoji":"๐ง","order":3446,"group":4,"version":13},{"shortcodes":["beverage_box","juice_box"],"annotation":"beverage box","tags":["beverage","box","juice","straw","sweet"],"emoji":"๐ง","order":3447,"group":4,"version":12},{"shortcodes":["mate"],"annotation":"mate","tags":["drink"],"emoji":"๐ง","order":3448,"group":4,"version":12},{"shortcodes":["ice","ice_cube"],"annotation":"ice","tags":["cold","ice cube","iceberg"],"emoji":"๐ง","order":3449,"group":4,"version":12},{"shortcodes":["chopsticks"],"annotation":"chopsticks","tags":["hashi"],"emoji":"๐ฅข","order":3450,"group":4,"version":5},{"shortcodes":["fork_knife_plate"],"annotation":"fork and knife with plate","tags":["cooking","fork","knife","plate"],"emoji":"๐ฝ๏ธ","order":3452,"group":4,"version":0.7},{"shortcodes":["fork_and_knife"],"annotation":"fork and knife","tags":["cooking","cutlery","fork","knife"],"emoji":"๐ด","order":3453,"group":4,"version":0.6},{"shortcodes":["spoon"],"annotation":"spoon","tags":["tableware"],"emoji":"๐ฅ","order":3454,"group":4,"version":3},{"shortcodes":["knife"],"annotation":"kitchen knife","tags":["cooking","hocho","knife","tool","weapon"],"emoji":"๐ช","order":3455,"group":4,"version":0.6},{"shortcodes":["jar"],"annotation":"jar","tags":["condiment","container","empty","sauce","store"],"emoji":"๐ซ","order":3456,"group":4,"version":14},{"shortcodes":["amphora"],"annotation":"amphora","tags":["aquarius","cooking","drink","jug","zodiac"],"emoji":"๐บ","order":3457,"group":4,"version":1},{"shortcodes":["earth_africa","earth_europe"],"annotation":"globe showing Europe-Africa","tags":["africa","earth","europe","globe","globe showing europe-africa","world"],"emoji":"๐๏ธ","order":3458,"group":5,"version":0.7},{"shortcodes":["earth_americas"],"annotation":"globe showing Americas","tags":["americas","earth","globe","globe showing americas","world"],"emoji":"๐๏ธ","order":3459,"group":5,"version":0.7},{"shortcodes":["earth_asia"],"annotation":"globe showing Asia-Australia","tags":["asia","australia","earth","globe","globe showing asia-australia","world"],"emoji":"๐๏ธ","order":3460,"group":5,"version":0.6},{"shortcodes":["globe_with_meridians"],"annotation":"globe with meridians","tags":["earth","globe","meridians","world"],"emoji":"๐","order":3461,"group":5,"version":1},{"shortcodes":["world_map"],"annotation":"world map","tags":["map","world"],"emoji":"๐บ๏ธ","order":3463,"group":5,"version":0.7},{"shortcodes":["japan_map"],"annotation":"map of Japan","tags":["japan","map","map of japan"],"emoji":"๐พ","order":3464,"group":5,"version":0.6},{"shortcodes":["compass"],"annotation":"compass","tags":["magnetic","navigation","orienteering"],"emoji":"๐งญ","order":3465,"group":5,"version":11},{"shortcodes":["mountain_snow"],"annotation":"snow-capped mountain","tags":["cold","mountain","snow"],"emoji":"๐๏ธ","order":3467,"group":5,"version":0.7},{"shortcodes":["mountain"],"annotation":"mountain","tags":["mountain"],"emoji":"โฐ๏ธ","order":3469,"group":5,"version":0.7},{"shortcodes":["volcano"],"annotation":"volcano","tags":["eruption","mountain"],"emoji":"๐","order":3470,"group":5,"version":0.6},{"shortcodes":["mount_fuji"],"annotation":"mount fuji","tags":["fuji","mountain"],"emoji":"๐ป","order":3471,"group":5,"version":0.6},{"shortcodes":["camping"],"annotation":"camping","tags":["camping"],"emoji":"๐๏ธ","order":3473,"group":5,"version":0.7},{"shortcodes":["beach","beach_with_umbrella"],"annotation":"beach with umbrella","tags":["beach","umbrella"],"emoji":"๐๏ธ","order":3475,"group":5,"version":0.7},{"shortcodes":["desert"],"annotation":"desert","tags":["desert"],"emoji":"๐๏ธ","order":3477,"group":5,"version":0.7},{"shortcodes":["desert_island","island"],"annotation":"desert island","tags":["desert","island"],"emoji":"๐๏ธ","order":3479,"group":5,"version":0.7},{"shortcodes":["national_park"],"annotation":"national park","tags":["park"],"emoji":"๐๏ธ","order":3481,"group":5,"version":0.7},{"shortcodes":["stadium"],"annotation":"stadium","tags":["stadium"],"emoji":"๐๏ธ","order":3483,"group":5,"version":0.7},{"shortcodes":["classical_building"],"annotation":"classical building","tags":["classical"],"emoji":"๐๏ธ","order":3485,"group":5,"version":0.7},{"shortcodes":["building_construction","construction_site"],"annotation":"building construction","tags":["construction"],"emoji":"๐๏ธ","order":3487,"group":5,"version":0.7},{"shortcodes":["bricks"],"annotation":"brick","tags":["bricks","clay","mortar","wall"],"emoji":"๐งฑ","order":3488,"group":5,"version":11},{"shortcodes":["rock"],"annotation":"rock","tags":["boulder","heavy","solid","stone"],"emoji":"๐ชจ","order":3489,"group":5,"version":13},{"shortcodes":["wood"],"annotation":"wood","tags":["log","lumber","timber"],"emoji":"๐ชต","order":3490,"group":5,"version":13},{"shortcodes":["hut"],"annotation":"hut","tags":["house","roundhouse","yurt"],"emoji":"๐","order":3491,"group":5,"version":13},{"shortcodes":["homes","houses"],"annotation":"houses","tags":["houses"],"emoji":"๐๏ธ","order":3493,"group":5,"version":0.7},{"shortcodes":["derelict_house","house_abandoned"],"annotation":"derelict house","tags":["derelict","house"],"emoji":"๐๏ธ","order":3495,"group":5,"version":0.7},{"shortcodes":["house"],"annotation":"house","tags":["home"],"emoji":"๐ ๏ธ","order":3496,"group":5,"version":0.6},{"shortcodes":["house_with_garden"],"annotation":"house with garden","tags":["garden","home","house"],"emoji":"๐ก","order":3497,"group":5,"version":0.6},{"shortcodes":["office"],"annotation":"office building","tags":["building"],"emoji":"๐ข","order":3498,"group":5,"version":0.6},{"shortcodes":["post_office"],"annotation":"Japanese post office","tags":["japanese","japanese post office","post"],"emoji":"๐ฃ","order":3499,"group":5,"version":0.6},{"shortcodes":["european_post_office"],"annotation":"post office","tags":["european","post"],"emoji":"๐ค","order":3500,"group":5,"version":1},{"shortcodes":["hospital"],"annotation":"hospital","tags":["doctor","medicine"],"emoji":"๐ฅ","order":3501,"group":5,"version":0.6},{"shortcodes":["bank"],"annotation":"bank","tags":["building"],"emoji":"๐ฆ","order":3502,"group":5,"version":0.6},{"shortcodes":["hotel"],"annotation":"hotel","tags":["building"],"emoji":"๐จ","order":3503,"group":5,"version":0.6},{"shortcodes":["love_hotel"],"annotation":"love hotel","tags":["hotel","love"],"emoji":"๐ฉ","order":3504,"group":5,"version":0.6},{"shortcodes":["convenience_store"],"annotation":"convenience store","tags":["convenience","store"],"emoji":"๐ช","order":3505,"group":5,"version":0.6},{"shortcodes":["school"],"annotation":"school","tags":["building"],"emoji":"๐ซ","order":3506,"group":5,"version":0.6},{"shortcodes":["department_store"],"annotation":"department store","tags":["department","store"],"emoji":"๐ฌ","order":3507,"group":5,"version":0.6},{"shortcodes":["factory"],"annotation":"factory","tags":["building"],"emoji":"๐ญ๏ธ","order":3508,"group":5,"version":0.6},{"shortcodes":["japanese_castle"],"annotation":"Japanese castle","tags":["castle","japanese"],"emoji":"๐ฏ","order":3509,"group":5,"version":0.6},{"shortcodes":["castle","european_castle"],"annotation":"castle","tags":["european"],"emoji":"๐ฐ","order":3510,"group":5,"version":0.6},{"shortcodes":["wedding"],"annotation":"wedding","tags":["chapel","romance"],"emoji":"๐","order":3511,"group":5,"version":0.6},{"shortcodes":["tokyo_tower"],"annotation":"Tokyo tower","tags":["tokyo","tower"],"emoji":"๐ผ","order":3512,"group":5,"version":0.6},{"shortcodes":["statue_of_liberty"],"annotation":"Statue of Liberty","tags":["liberty","statue","statue of liberty"],"emoji":"๐ฝ","order":3513,"group":5,"version":0.6},{"shortcodes":["church"],"annotation":"church","tags":["christian","cross","religion"],"emoji":"โช๏ธ","order":3514,"group":5,"version":0.6},{"shortcodes":["mosque"],"annotation":"mosque","tags":["islam","muslim","religion"],"emoji":"๐","order":3515,"group":5,"version":1},{"shortcodes":["hindu_temple"],"annotation":"hindu temple","tags":["hindu","temple"],"emoji":"๐","order":3516,"group":5,"version":12},{"shortcodes":["synagogue"],"annotation":"synagogue","tags":["jew","jewish","religion","temple"],"emoji":"๐","order":3517,"group":5,"version":1},{"shortcodes":["shinto_shrine"],"annotation":"shinto shrine","tags":["religion","shinto","shrine"],"emoji":"โฉ๏ธ","order":3519,"group":5,"version":0.7},{"shortcodes":["kaaba"],"annotation":"kaaba","tags":["islam","muslim","religion"],"emoji":"๐","order":3520,"group":5,"version":1},{"shortcodes":["fountain"],"annotation":"fountain","tags":["fountain"],"emoji":"โฒ๏ธ","order":3521,"group":5,"version":0.6},{"shortcodes":["tent"],"annotation":"tent","tags":["camping"],"emoji":"โบ๏ธ","order":3522,"group":5,"version":0.6},{"shortcodes":["foggy"],"annotation":"foggy","tags":["fog"],"emoji":"๐","order":3523,"group":5,"version":0.6},{"shortcodes":["night_with_stars"],"annotation":"night with stars","tags":["night","star"],"emoji":"๐","order":3524,"group":5,"version":0.6},{"shortcodes":["cityscape"],"annotation":"cityscape","tags":["city"],"emoji":"๐๏ธ","order":3526,"group":5,"version":0.7},{"shortcodes":["sunrise_over_mountains"],"annotation":"sunrise over mountains","tags":["morning","mountain","sun","sunrise"],"emoji":"๐","order":3527,"group":5,"version":0.6},{"shortcodes":["sunrise"],"annotation":"sunrise","tags":["morning","sun"],"emoji":"๐ ","order":3528,"group":5,"version":0.6},{"shortcodes":["city_dusk"],"annotation":"cityscape at dusk","tags":["city","dusk","evening","landscape","sunset"],"emoji":"๐","order":3529,"group":5,"version":0.6},{"shortcodes":["city_sunrise","city_sunset"],"annotation":"sunset","tags":["dusk","sun"],"emoji":"๐","order":3530,"group":5,"version":0.6},{"shortcodes":["bridge_at_night"],"annotation":"bridge at night","tags":["bridge","night"],"emoji":"๐","order":3531,"group":5,"version":0.6},{"shortcodes":["hotsprings"],"annotation":"hot springs","tags":["hot","hotsprings","springs","steaming"],"emoji":"โจ๏ธ","order":3533,"group":5,"version":0.6},{"shortcodes":["carousel_horse"],"annotation":"carousel horse","tags":["carousel","horse"],"emoji":"๐ ","order":3534,"group":5,"version":0.6},{"shortcodes":["playground_slide","slide"],"annotation":"playground slide","tags":["amusement park","play"],"emoji":"๐","order":3535,"group":5,"version":14},{"shortcodes":["ferris_wheel"],"annotation":"ferris wheel","tags":["amusement park","ferris","wheel"],"emoji":"๐ก","order":3536,"group":5,"version":0.6},{"shortcodes":["roller_coaster"],"annotation":"roller coaster","tags":["amusement park","coaster","roller"],"emoji":"๐ข","order":3537,"group":5,"version":0.6},{"shortcodes":["barber","barber_pole"],"annotation":"barber pole","tags":["barber","haircut","pole"],"emoji":"๐","order":3538,"group":5,"version":0.6},{"shortcodes":["circus_tent"],"annotation":"circus tent","tags":["circus","tent"],"emoji":"๐ช","order":3539,"group":5,"version":0.6},{"shortcodes":["steam_locomotive"],"annotation":"locomotive","tags":["engine","railway","steam","train"],"emoji":"๐","order":3540,"group":5,"version":1},{"shortcodes":["railway_car"],"annotation":"railway car","tags":["car","electric","railway","train","tram","trolleybus"],"emoji":"๐","order":3541,"group":5,"version":0.6},{"shortcodes":["bullettrain_side"],"annotation":"high-speed train","tags":["railway","shinkansen","speed","train"],"emoji":"๐","order":3542,"group":5,"version":0.6},{"shortcodes":["bullettrain_front"],"annotation":"bullet train","tags":["bullet","railway","shinkansen","speed","train"],"emoji":"๐ ","order":3543,"group":5,"version":0.6},{"shortcodes":["train"],"annotation":"train","tags":["railway"],"emoji":"๐","order":3544,"group":5,"version":1},{"shortcodes":["metro"],"annotation":"metro","tags":["subway"],"emoji":"๐๏ธ","order":3545,"group":5,"version":0.6},{"shortcodes":["light_rail"],"annotation":"light rail","tags":["railway"],"emoji":"๐","order":3546,"group":5,"version":1},{"shortcodes":["station"],"annotation":"station","tags":["railway","train"],"emoji":"๐","order":3547,"group":5,"version":0.6},{"shortcodes":["tram"],"annotation":"tram","tags":["trolleybus"],"emoji":"๐","order":3548,"group":5,"version":1},{"shortcodes":["monorail"],"annotation":"monorail","tags":["vehicle"],"emoji":"๐","order":3549,"group":5,"version":1},{"shortcodes":["mountain_railway"],"annotation":"mountain railway","tags":["car","mountain","railway"],"emoji":"๐","order":3550,"group":5,"version":1},{"shortcodes":["tram_car"],"annotation":"tram car","tags":["car","tram","trolleybus"],"emoji":"๐","order":3551,"group":5,"version":1},{"shortcodes":["bus"],"annotation":"bus","tags":["vehicle"],"emoji":"๐","order":3552,"group":5,"version":0.6},{"shortcodes":["oncoming_bus"],"annotation":"oncoming bus","tags":["bus","oncoming"],"emoji":"๐๏ธ","order":3553,"group":5,"version":0.7},{"shortcodes":["trolleybus"],"annotation":"trolleybus","tags":["bus","tram","trolley"],"emoji":"๐","order":3554,"group":5,"version":1},{"shortcodes":["minibus"],"annotation":"minibus","tags":["bus"],"emoji":"๐","order":3555,"group":5,"version":1},{"shortcodes":["ambulance"],"annotation":"ambulance","tags":["vehicle"],"emoji":"๐๏ธ","order":3556,"group":5,"version":0.6},{"shortcodes":["fire_engine"],"annotation":"fire engine","tags":["engine","fire","truck"],"emoji":"๐","order":3557,"group":5,"version":0.6},{"shortcodes":["police_car"],"annotation":"police car","tags":["car","patrol","police"],"emoji":"๐","order":3558,"group":5,"version":0.6},{"shortcodes":["oncoming_police_car"],"annotation":"oncoming police car","tags":["car","oncoming","police"],"emoji":"๐๏ธ","order":3559,"group":5,"version":0.7},{"shortcodes":["taxi"],"annotation":"taxi","tags":["vehicle"],"emoji":"๐","order":3560,"group":5,"version":0.6},{"shortcodes":["oncoming_taxi"],"annotation":"oncoming taxi","tags":["oncoming","taxi"],"emoji":"๐","order":3561,"group":5,"version":1},{"shortcodes":["car","red_car"],"annotation":"automobile","tags":["car"],"emoji":"๐","order":3562,"group":5,"version":0.6},{"shortcodes":["oncoming_automobile"],"annotation":"oncoming automobile","tags":["automobile","car","oncoming"],"emoji":"๐๏ธ","order":3563,"group":5,"version":0.7},{"shortcodes":["blue_car","suv"],"annotation":"sport utility vehicle","tags":["recreational","sport utility"],"emoji":"๐","order":3564,"group":5,"version":0.6},{"shortcodes":["pickup_truck"],"annotation":"pickup truck","tags":["pick-up","pickup","truck"],"emoji":"๐ป","order":3565,"group":5,"version":13},{"shortcodes":["delivery_truck","truck"],"annotation":"delivery truck","tags":["delivery","truck"],"emoji":"๐","order":3566,"group":5,"version":0.6},{"shortcodes":["articulated_lorry"],"annotation":"articulated lorry","tags":["lorry","semi","truck"],"emoji":"๐","order":3567,"group":5,"version":1},{"shortcodes":["tractor"],"annotation":"tractor","tags":["vehicle"],"emoji":"๐","order":3568,"group":5,"version":1},{"shortcodes":["racing_car"],"annotation":"racing car","tags":["car","racing"],"emoji":"๐๏ธ","order":3570,"group":5,"version":0.7},{"shortcodes":["motorcycle"],"annotation":"motorcycle","tags":["racing"],"emoji":"๐๏ธ","order":3572,"group":5,"version":0.7},{"shortcodes":["motor_scooter"],"annotation":"motor scooter","tags":["motor","scooter"],"emoji":"๐ต","order":3573,"group":5,"version":3},{"shortcodes":["manual_wheelchair"],"annotation":"manual wheelchair","tags":["accessibility"],"emoji":"๐ฆฝ","order":3574,"group":5,"version":12},{"shortcodes":["motorized_wheelchair"],"annotation":"motorized wheelchair","tags":["accessibility"],"emoji":"๐ฆผ","order":3575,"group":5,"version":12},{"shortcodes":["auto_rickshaw"],"annotation":"auto rickshaw","tags":["tuk tuk"],"emoji":"๐บ","order":3576,"group":5,"version":12},{"shortcodes":["bicycle","bike"],"annotation":"bicycle","tags":["bike"],"emoji":"๐ฒ๏ธ","order":3577,"group":5,"version":0.6},{"shortcodes":["scooter"],"annotation":"kick scooter","tags":["kick","scooter"],"emoji":"๐ด","order":3578,"group":5,"version":3},{"shortcodes":["skateboard"],"annotation":"skateboard","tags":["board"],"emoji":"๐น","order":3579,"group":5,"version":11},{"shortcodes":["roller_skate"],"annotation":"roller skate","tags":["roller","skate"],"emoji":"๐ผ","order":3580,"group":5,"version":13},{"shortcodes":["busstop"],"annotation":"bus stop","tags":["bus","stop"],"emoji":"๐","order":3581,"group":5,"version":0.6},{"shortcodes":["motorway"],"annotation":"motorway","tags":["highway","road"],"emoji":"๐ฃ๏ธ","order":3583,"group":5,"version":0.7},{"shortcodes":["railway_track"],"annotation":"railway track","tags":["railway","train"],"emoji":"๐ค๏ธ","order":3585,"group":5,"version":0.7},{"shortcodes":["oil_drum"],"annotation":"oil drum","tags":["drum","oil"],"emoji":"๐ข๏ธ","order":3587,"group":5,"version":0.7},{"shortcodes":["fuelpump"],"annotation":"fuel pump","tags":["diesel","fuel","fuelpump","gas","pump","station"],"emoji":"โฝ๏ธ","order":3588,"group":5,"version":0.6},{"shortcodes":["wheel"],"annotation":"wheel","tags":["circle","tire","turn"],"emoji":"๐","order":3589,"group":5,"version":14},{"shortcodes":["rotating_light"],"annotation":"police car light","tags":["beacon","car","light","police","revolving"],"emoji":"๐จ","order":3590,"group":5,"version":0.6},{"shortcodes":["traffic_light"],"annotation":"horizontal traffic light","tags":["light","signal","traffic"],"emoji":"๐ฅ","order":3591,"group":5,"version":0.6},{"shortcodes":["vertical_traffic_light"],"annotation":"vertical traffic light","tags":["light","signal","traffic"],"emoji":"๐ฆ","order":3592,"group":5,"version":1},{"shortcodes":["octagonal_sign","stop_sign"],"annotation":"stop sign","tags":["octagonal","sign","stop"],"emoji":"๐","order":3593,"group":5,"version":3},{"shortcodes":["construction"],"annotation":"construction","tags":["barrier"],"emoji":"๐ง","order":3594,"group":5,"version":0.6},{"shortcodes":["anchor"],"annotation":"anchor","tags":["ship","tool"],"emoji":"โ๏ธ","order":3595,"group":5,"version":0.6},{"shortcodes":["lifebuoy","ring_buoy"],"annotation":"ring buoy","tags":["float","life preserver","life saver","rescue","safety"],"emoji":"๐","order":3596,"group":5,"version":14},{"shortcodes":["sailboat"],"annotation":"sailboat","tags":["boat","resort","sea","yacht"],"emoji":"โต๏ธ","order":3597,"group":5,"version":0.6},{"shortcodes":["canoe"],"annotation":"canoe","tags":["boat"],"emoji":"๐ถ","order":3598,"group":5,"version":3},{"shortcodes":["speedboat"],"annotation":"speedboat","tags":["boat"],"emoji":"๐ค","order":3599,"group":5,"version":0.6},{"shortcodes":["cruise_ship","passenger_ship"],"annotation":"passenger ship","tags":["passenger","ship"],"emoji":"๐ณ๏ธ","order":3601,"group":5,"version":0.7},{"shortcodes":["ferry"],"annotation":"ferry","tags":["boat","passenger"],"emoji":"โด๏ธ","order":3603,"group":5,"version":0.7},{"shortcodes":["motorboat"],"annotation":"motor boat","tags":["boat","motorboat"],"emoji":"๐ฅ๏ธ","order":3605,"group":5,"version":0.7},{"shortcodes":["ship"],"annotation":"ship","tags":["boat","passenger"],"emoji":"๐ข","order":3606,"group":5,"version":0.6},{"shortcodes":["airplane"],"annotation":"airplane","tags":["aeroplane"],"emoji":"โ๏ธ","order":3608,"group":5,"version":0.6},{"shortcodes":["small_airplane"],"annotation":"small airplane","tags":["aeroplane","airplane"],"emoji":"๐ฉ๏ธ","order":3610,"group":5,"version":0.7},{"shortcodes":["airplane_departure"],"annotation":"airplane departure","tags":["aeroplane","airplane","check-in","departure","departures"],"emoji":"๐ซ","order":3611,"group":5,"version":1},{"shortcodes":["airplane_arriving"],"annotation":"airplane arrival","tags":["aeroplane","airplane","arrivals","arriving","landing"],"emoji":"๐ฌ","order":3612,"group":5,"version":1},{"shortcodes":["parachute"],"annotation":"parachute","tags":["hang-glide","parasail","skydive"],"emoji":"๐ช","order":3613,"group":5,"version":12},{"shortcodes":["seat"],"annotation":"seat","tags":["chair"],"emoji":"๐บ","order":3614,"group":5,"version":0.6},{"shortcodes":["helicopter"],"annotation":"helicopter","tags":["vehicle"],"emoji":"๐","order":3615,"group":5,"version":1},{"shortcodes":["suspension_railway"],"annotation":"suspension railway","tags":["railway","suspension"],"emoji":"๐","order":3616,"group":5,"version":1},{"shortcodes":["mountain_cableway"],"annotation":"mountain cableway","tags":["cable","gondola","mountain"],"emoji":"๐ ","order":3617,"group":5,"version":1},{"shortcodes":["aerial_tramway"],"annotation":"aerial tramway","tags":["aerial","cable","car","gondola","tramway"],"emoji":"๐ก","order":3618,"group":5,"version":1},{"shortcodes":["satellite"],"annotation":"satellite","tags":["space"],"emoji":"๐ฐ๏ธ","order":3620,"group":5,"version":0.7},{"shortcodes":["rocket"],"annotation":"rocket","tags":["space"],"emoji":"๐","order":3621,"group":5,"version":0.6},{"shortcodes":["flying_saucer"],"annotation":"flying saucer","tags":["ufo"],"emoji":"๐ธ","order":3622,"group":5,"version":5},{"shortcodes":["bellhop"],"annotation":"bellhop bell","tags":["bell","bellhop","hotel"],"emoji":"๐๏ธ","order":3624,"group":5,"version":0.7},{"shortcodes":["luggage"],"annotation":"luggage","tags":["packing","travel"],"emoji":"๐งณ","order":3625,"group":5,"version":11},{"shortcodes":["hourglass"],"annotation":"hourglass done","tags":["sand","timer"],"emoji":"โ๏ธ","order":3626,"group":5,"version":0.6},{"shortcodes":["hourglass_flowing_sand"],"annotation":"hourglass not done","tags":["hourglass","sand","timer"],"emoji":"โณ๏ธ","order":3627,"group":5,"version":0.6},{"shortcodes":["watch"],"annotation":"watch","tags":["clock"],"emoji":"โ๏ธ","order":3628,"group":5,"version":0.6},{"shortcodes":["alarm_clock"],"annotation":"alarm clock","tags":["alarm","clock"],"emoji":"โฐ","order":3629,"group":5,"version":0.6},{"shortcodes":["stopwatch"],"annotation":"stopwatch","tags":["clock"],"emoji":"โฑ๏ธ","order":3631,"group":5,"version":1},{"shortcodes":["timer_clock"],"annotation":"timer clock","tags":["clock","timer"],"emoji":"โฒ๏ธ","order":3633,"group":5,"version":1},{"shortcodes":["clock"],"annotation":"mantelpiece clock","tags":["clock"],"emoji":"๐ฐ๏ธ","order":3635,"group":5,"version":0.7},{"shortcodes":["clock12"],"annotation":"twelve oโclock","tags":["00","12","12:00","clock","oโclock","twelve"],"emoji":"๐๏ธ","order":3636,"group":5,"version":0.6},{"shortcodes":["clock1230"],"annotation":"twelve-thirty","tags":["12","12:30","clock","thirty","twelve"],"emoji":"๐ง๏ธ","order":3637,"group":5,"version":0.7},{"shortcodes":["clock1"],"annotation":"one oโclock","tags":["00","1","1:00","clock","one","oโclock"],"emoji":"๐๏ธ","order":3638,"group":5,"version":0.6},{"shortcodes":["clock130"],"annotation":"one-thirty","tags":["1","1:30","clock","one","thirty"],"emoji":"๐๏ธ","order":3639,"group":5,"version":0.7},{"shortcodes":["clock2"],"annotation":"two oโclock","tags":["00","2","2:00","clock","oโclock","two"],"emoji":"๐๏ธ","order":3640,"group":5,"version":0.6},{"shortcodes":["clock230"],"annotation":"two-thirty","tags":["2","2:30","clock","thirty","two"],"emoji":"๐๏ธ","order":3641,"group":5,"version":0.7},{"shortcodes":["clock3"],"annotation":"three oโclock","tags":["00","3","3:00","clock","oโclock","three"],"emoji":"๐๏ธ","order":3642,"group":5,"version":0.6},{"shortcodes":["clock330"],"annotation":"three-thirty","tags":["3","3:30","clock","thirty","three"],"emoji":"๐๏ธ","order":3643,"group":5,"version":0.7},{"shortcodes":["clock4"],"annotation":"four oโclock","tags":["00","4","4:00","clock","four","oโclock"],"emoji":"๐๏ธ","order":3644,"group":5,"version":0.6},{"shortcodes":["clock430"],"annotation":"four-thirty","tags":["4","4:30","clock","four","thirty"],"emoji":"๐๏ธ","order":3645,"group":5,"version":0.7},{"shortcodes":["clock5"],"annotation":"five oโclock","tags":["00","5","5:00","clock","five","oโclock"],"emoji":"๐๏ธ","order":3646,"group":5,"version":0.6},{"shortcodes":["clock530"],"annotation":"five-thirty","tags":["5","5:30","clock","five","thirty"],"emoji":"๐ ๏ธ","order":3647,"group":5,"version":0.7},{"shortcodes":["clock6"],"annotation":"six oโclock","tags":["00","6","6:00","clock","oโclock","six"],"emoji":"๐๏ธ","order":3648,"group":5,"version":0.6},{"shortcodes":["clock630"],"annotation":"six-thirty","tags":["6","6:30","clock","six","thirty"],"emoji":"๐ก๏ธ","order":3649,"group":5,"version":0.7},{"shortcodes":["clock7"],"annotation":"seven oโclock","tags":["00","7","7:00","clock","oโclock","seven"],"emoji":"๐๏ธ","order":3650,"group":5,"version":0.6},{"shortcodes":["clock730"],"annotation":"seven-thirty","tags":["7","7:30","clock","seven","thirty"],"emoji":"๐ข๏ธ","order":3651,"group":5,"version":0.7},{"shortcodes":["clock8"],"annotation":"eight oโclock","tags":["00","8","8:00","clock","eight","oโclock"],"emoji":"๐๏ธ","order":3652,"group":5,"version":0.6},{"shortcodes":["clock830"],"annotation":"eight-thirty","tags":["8","8:30","clock","eight","thirty"],"emoji":"๐ฃ๏ธ","order":3653,"group":5,"version":0.7},{"shortcodes":["clock9"],"annotation":"nine oโclock","tags":["00","9","9:00","clock","nine","oโclock"],"emoji":"๐๏ธ","order":3654,"group":5,"version":0.6},{"shortcodes":["clock930"],"annotation":"nine-thirty","tags":["9","9:30","clock","nine","thirty"],"emoji":"๐ค๏ธ","order":3655,"group":5,"version":0.7},{"shortcodes":["clock10"],"annotation":"ten oโclock","tags":["00","10","10:00","clock","oโclock","ten"],"emoji":"๐๏ธ","order":3656,"group":5,"version":0.6},{"shortcodes":["clock1030"],"annotation":"ten-thirty","tags":["10","10:30","clock","ten","thirty"],"emoji":"๐ฅ๏ธ","order":3657,"group":5,"version":0.7},{"shortcodes":["clock11"],"annotation":"eleven oโclock","tags":["00","11","11:00","clock","eleven","oโclock"],"emoji":"๐๏ธ","order":3658,"group":5,"version":0.6},{"shortcodes":["clock1130"],"annotation":"eleven-thirty","tags":["11","11:30","clock","eleven","thirty"],"emoji":"๐ฆ๏ธ","order":3659,"group":5,"version":0.7},{"shortcodes":["new_moon"],"annotation":"new moon","tags":["dark","moon"],"emoji":"๐","order":3660,"group":5,"version":0.6},{"shortcodes":["waxing_crescent_moon"],"annotation":"waxing crescent moon","tags":["crescent","moon","waxing"],"emoji":"๐","order":3661,"group":5,"version":1},{"shortcodes":["first_quarter_moon"],"annotation":"first quarter moon","tags":["moon","quarter"],"emoji":"๐","order":3662,"group":5,"version":0.6},{"shortcodes":["waxing_gibbous_moon"],"annotation":"waxing gibbous moon","tags":["gibbous","moon","waxing"],"emoji":"๐","order":3663,"group":5,"version":0.6},{"shortcodes":["full_moon"],"annotation":"full moon","tags":["full","moon"],"emoji":"๐๏ธ","order":3664,"group":5,"version":0.6},{"shortcodes":["waning_gibbous_moon"],"annotation":"waning gibbous moon","tags":["gibbous","moon","waning"],"emoji":"๐","order":3665,"group":5,"version":1},{"shortcodes":["last_quarter_moon"],"annotation":"last quarter moon","tags":["moon","quarter"],"emoji":"๐","order":3666,"group":5,"version":1},{"shortcodes":["waning_crescent_moon"],"annotation":"waning crescent moon","tags":["crescent","moon","waning"],"emoji":"๐","order":3667,"group":5,"version":1},{"shortcodes":["crescent_moon"],"annotation":"crescent moon","tags":["crescent","moon"],"emoji":"๐","order":3668,"group":5,"version":0.6},{"shortcodes":["new_moon_with_face"],"annotation":"new moon face","tags":["face","moon"],"emoji":"๐","order":3669,"group":5,"version":1},{"shortcodes":["first_quarter_moon_with_face"],"annotation":"first quarter moon face","tags":["face","moon","quarter"],"emoji":"๐","order":3670,"group":5,"version":0.6},{"shortcodes":["last_quarter_moon_with_face"],"annotation":"last quarter moon face","tags":["face","moon","quarter"],"emoji":"๐๏ธ","order":3671,"group":5,"version":0.7},{"shortcodes":["thermometer"],"annotation":"thermometer","tags":["weather"],"emoji":"๐ก๏ธ","order":3673,"group":5,"version":0.7},{"shortcodes":["sun"],"annotation":"sun","tags":["bright","rays","sunny"],"emoji":"โ๏ธ","order":3675,"group":5,"version":0.6},{"shortcodes":["full_moon_with_face"],"annotation":"full moon face","tags":["bright","face","full","moon"],"emoji":"๐","order":3676,"group":5,"version":1},{"shortcodes":["sun_with_face"],"annotation":"sun with face","tags":["bright","face","sun"],"emoji":"๐","order":3677,"group":5,"version":1},{"shortcodes":["ringed_planet","saturn"],"annotation":"ringed planet","tags":["saturn","saturnine"],"emoji":"๐ช","order":3678,"group":5,"version":12},{"shortcodes":["star"],"annotation":"star","tags":["star"],"emoji":"โญ๏ธ","order":3679,"group":5,"version":0.6},{"shortcodes":["glowing_star","star2"],"annotation":"glowing star","tags":["glittery","glow","shining","sparkle","star"],"emoji":"๐","order":3680,"group":5,"version":0.6},{"shortcodes":["shooting_star","stars"],"annotation":"shooting star","tags":["falling","shooting","star"],"emoji":"๐ ","order":3681,"group":5,"version":0.6},{"shortcodes":["milky_way"],"annotation":"milky way","tags":["space"],"emoji":"๐","order":3682,"group":5,"version":0.6},{"shortcodes":["cloud"],"annotation":"cloud","tags":["weather"],"emoji":"โ๏ธ","order":3684,"group":5,"version":0.6},{"shortcodes":["partly_sunny","sun_behind_cloud"],"annotation":"sun behind cloud","tags":["cloud","sun"],"emoji":"โ ๏ธ","order":3685,"group":5,"version":0.6},{"shortcodes":["stormy","thunder_cloud_and_rain"],"annotation":"cloud with lightning and rain","tags":["cloud","rain","thunder"],"emoji":"โ๏ธ","order":3687,"group":5,"version":0.7},{"shortcodes":["sun_behind_small_cloud","sunny"],"annotation":"sun behind small cloud","tags":["cloud","sun"],"emoji":"๐ค๏ธ","order":3689,"group":5,"version":0.7},{"shortcodes":["cloudy","sun_behind_large_cloud"],"annotation":"sun behind large cloud","tags":["cloud","sun"],"emoji":"๐ฅ๏ธ","order":3691,"group":5,"version":0.7},{"shortcodes":["sun_and_rain","sun_behind_rain_cloud"],"annotation":"sun behind rain cloud","tags":["cloud","rain","sun"],"emoji":"๐ฆ๏ธ","order":3693,"group":5,"version":0.7},{"shortcodes":["cloud_with_rain","rainy"],"annotation":"cloud with rain","tags":["cloud","rain"],"emoji":"๐ง๏ธ","order":3695,"group":5,"version":0.7},{"shortcodes":["cloud_with_snow","snowy"],"annotation":"cloud with snow","tags":["cloud","cold","snow"],"emoji":"๐จ๏ธ","order":3697,"group":5,"version":0.7},{"shortcodes":["cloud_with_lightning","lightning"],"annotation":"cloud with lightning","tags":["cloud","lightning"],"emoji":"๐ฉ๏ธ","order":3699,"group":5,"version":0.7},{"shortcodes":["tornado"],"annotation":"tornado","tags":["cloud","whirlwind"],"emoji":"๐ช๏ธ","order":3701,"group":5,"version":0.7},{"shortcodes":["fog"],"annotation":"fog","tags":["cloud"],"emoji":"๐ซ๏ธ","order":3703,"group":5,"version":0.7},{"shortcodes":["wind_blowing_face"],"annotation":"wind face","tags":["blow","cloud","face","wind"],"emoji":"๐ฌ๏ธ","order":3705,"group":5,"version":0.7},{"shortcodes":["cyclone"],"annotation":"cyclone","tags":["dizzy","hurricane","twister","typhoon"],"emoji":"๐","order":3706,"group":5,"version":0.6},{"shortcodes":["rainbow"],"annotation":"rainbow","tags":["rain"],"emoji":"๐","order":3707,"group":5,"version":0.6},{"shortcodes":["closed_umbrella"],"annotation":"closed umbrella","tags":["clothing","rain","umbrella"],"emoji":"๐","order":3708,"group":5,"version":0.6},{"shortcodes":["umbrella"],"annotation":"umbrella","tags":["clothing","rain"],"emoji":"โ๏ธ","order":3710,"group":5,"version":0.7},{"shortcodes":["umbrella_with_rain"],"annotation":"umbrella with rain drops","tags":["clothing","drop","rain","umbrella"],"emoji":"โ๏ธ","order":3711,"group":5,"version":0.6},{"shortcodes":["beach_umbrella","umbrella_on_ground"],"annotation":"umbrella on ground","tags":["rain","sun","umbrella"],"emoji":"โฑ๏ธ","order":3713,"group":5,"version":0.7},{"shortcodes":["high_voltage","zap"],"annotation":"high voltage","tags":["danger","electric","lightning","voltage","zap"],"emoji":"โก๏ธ","order":3714,"group":5,"version":0.6},{"shortcodes":["snowflake"],"annotation":"snowflake","tags":["cold","snow"],"emoji":"โ๏ธ","order":3716,"group":5,"version":0.6},{"shortcodes":["snowman2"],"annotation":"snowman","tags":["cold","snow"],"emoji":"โ๏ธ","order":3718,"group":5,"version":0.7},{"shortcodes":["snowman"],"annotation":"snowman without snow","tags":["cold","snow","snowman"],"emoji":"โ๏ธ","order":3719,"group":5,"version":0.6},{"shortcodes":["comet"],"annotation":"comet","tags":["space"],"emoji":"โ๏ธ","order":3721,"group":5,"version":1},{"shortcodes":["fire"],"annotation":"fire","tags":["flame","tool"],"emoji":"๐ฅ","order":3722,"group":5,"version":0.6},{"shortcodes":["droplet"],"annotation":"droplet","tags":["cold","comic","drop","sweat"],"emoji":"๐ง","order":3723,"group":5,"version":0.6},{"shortcodes":["ocean","water_wave"],"annotation":"water wave","tags":["ocean","water","wave"],"emoji":"๐","order":3724,"group":5,"version":0.6},{"shortcodes":["jack_o_lantern"],"annotation":"jack-o-lantern","tags":["celebration","halloween","jack","lantern"],"emoji":"๐","order":3725,"group":6,"version":0.6},{"shortcodes":["christmas_tree"],"annotation":"Christmas tree","tags":["celebration","christmas","tree"],"emoji":"๐","order":3726,"group":6,"version":0.6},{"shortcodes":["fireworks"],"annotation":"fireworks","tags":["celebration"],"emoji":"๐","order":3727,"group":6,"version":0.6},{"shortcodes":["sparkler"],"annotation":"sparkler","tags":["celebration","fireworks","sparkle"],"emoji":"๐","order":3728,"group":6,"version":0.6},{"shortcodes":["firecracker"],"annotation":"firecracker","tags":["dynamite","explosive","fireworks"],"emoji":"๐งจ","order":3729,"group":6,"version":11},{"shortcodes":["sparkles"],"annotation":"sparkles","tags":["*","sparkle","star"],"emoji":"โจ","order":3730,"group":6,"version":0.6},{"shortcodes":["balloon"],"annotation":"balloon","tags":["celebration"],"emoji":"๐","order":3731,"group":6,"version":0.6},{"shortcodes":["party","party_popper","tada"],"annotation":"party popper","tags":["celebration","party","popper","tada"],"emoji":"๐","order":3732,"group":6,"version":0.6},{"shortcodes":["confetti_ball"],"annotation":"confetti ball","tags":["ball","celebration","confetti"],"emoji":"๐","order":3733,"group":6,"version":0.6},{"shortcodes":["tanabata_tree"],"annotation":"tanabata tree","tags":["banner","celebration","japanese","tree"],"emoji":"๐","order":3734,"group":6,"version":0.6},{"shortcodes":["bamboo"],"annotation":"pine decoration","tags":["bamboo","celebration","japanese","pine"],"emoji":"๐","order":3735,"group":6,"version":0.6},{"shortcodes":["dolls"],"annotation":"Japanese dolls","tags":["celebration","doll","festival","japanese","japanese dolls"],"emoji":"๐","order":3736,"group":6,"version":0.6},{"shortcodes":["carp_streamer","flags"],"annotation":"carp streamer","tags":["carp","celebration","streamer"],"emoji":"๐","order":3737,"group":6,"version":0.6},{"shortcodes":["wind_chime"],"annotation":"wind chime","tags":["bell","celebration","chime","wind"],"emoji":"๐","order":3738,"group":6,"version":0.6},{"shortcodes":["moon_ceremony","rice_scene"],"annotation":"moon viewing ceremony","tags":["celebration","ceremony","moon"],"emoji":"๐","order":3739,"group":6,"version":0.6},{"shortcodes":["red_envelope"],"annotation":"red envelope","tags":["gift","good luck","hรณngbฤo","lai see","money"],"emoji":"๐งง","order":3740,"group":6,"version":11},{"shortcodes":["ribbon"],"annotation":"ribbon","tags":["celebration"],"emoji":"๐","order":3741,"group":6,"version":0.6},{"shortcodes":["gift"],"annotation":"wrapped gift","tags":["box","celebration","gift","present","wrapped"],"emoji":"๐","order":3742,"group":6,"version":0.6},{"shortcodes":["reminder_ribbon"],"annotation":"reminder ribbon","tags":["celebration","reminder","ribbon"],"emoji":"๐๏ธ","order":3744,"group":6,"version":0.7},{"shortcodes":["admission_tickets","tickets"],"annotation":"admission tickets","tags":["admission","ticket"],"emoji":"๐๏ธ","order":3746,"group":6,"version":0.7},{"shortcodes":["ticket"],"annotation":"ticket","tags":["admission"],"emoji":"๐ซ","order":3747,"group":6,"version":0.6},{"shortcodes":["military_medal"],"annotation":"military medal","tags":["celebration","medal","military"],"emoji":"๐๏ธ","order":3749,"group":6,"version":0.7},{"shortcodes":["trophy"],"annotation":"trophy","tags":["prize"],"emoji":"๐๏ธ","order":3750,"group":6,"version":0.6},{"shortcodes":["sports_medal"],"annotation":"sports medal","tags":["medal"],"emoji":"๐ ","order":3751,"group":6,"version":1},{"shortcodes":["1st","first_place_medal"],"annotation":"1st place medal","tags":["first","gold","medal"],"emoji":"๐ฅ","order":3752,"group":6,"version":3},{"shortcodes":["2nd","second_place_medal"],"annotation":"2nd place medal","tags":["medal","second","silver"],"emoji":"๐ฅ","order":3753,"group":6,"version":3},{"shortcodes":["3rd","third_place_medal"],"annotation":"3rd place medal","tags":["bronze","medal","third"],"emoji":"๐ฅ","order":3754,"group":6,"version":3},{"shortcodes":["soccer"],"annotation":"soccer ball","tags":["ball","football","soccer"],"emoji":"โฝ๏ธ","order":3755,"group":6,"version":0.6},{"shortcodes":["baseball"],"annotation":"baseball","tags":["ball"],"emoji":"โพ๏ธ","order":3756,"group":6,"version":0.6},{"shortcodes":["softball"],"annotation":"softball","tags":["ball","glove","underarm"],"emoji":"๐ฅ","order":3757,"group":6,"version":11},{"shortcodes":["basketball"],"annotation":"basketball","tags":["ball","hoop"],"emoji":"๐","order":3758,"group":6,"version":0.6},{"shortcodes":["volleyball"],"annotation":"volleyball","tags":["ball","game"],"emoji":"๐","order":3759,"group":6,"version":1},{"shortcodes":["football"],"annotation":"american football","tags":["american","ball","football"],"emoji":"๐","order":3760,"group":6,"version":0.6},{"shortcodes":["rugby_football"],"annotation":"rugby football","tags":["ball","football","rugby"],"emoji":"๐","order":3761,"group":6,"version":1},{"shortcodes":["tennis"],"annotation":"tennis","tags":["ball","racquet"],"emoji":"๐พ","order":3762,"group":6,"version":0.6},{"shortcodes":["flying_disc"],"annotation":"flying disc","tags":["ultimate"],"emoji":"๐ฅ","order":3763,"group":6,"version":11},{"shortcodes":["bowling"],"annotation":"bowling","tags":["ball","game"],"emoji":"๐ณ","order":3764,"group":6,"version":0.6},{"shortcodes":["cricket_game"],"annotation":"cricket game","tags":["ball","bat","game"],"emoji":"๐","order":3765,"group":6,"version":1},{"shortcodes":["field_hockey"],"annotation":"field hockey","tags":["ball","field","game","hockey","stick"],"emoji":"๐","order":3766,"group":6,"version":1},{"shortcodes":["hockey"],"annotation":"ice hockey","tags":["game","hockey","ice","puck","stick"],"emoji":"๐","order":3767,"group":6,"version":1},{"shortcodes":["lacrosse"],"annotation":"lacrosse","tags":["ball","goal","stick"],"emoji":"๐ฅ","order":3768,"group":6,"version":11},{"shortcodes":["ping_pong"],"annotation":"ping pong","tags":["ball","bat","game","paddle","table tennis"],"emoji":"๐","order":3769,"group":6,"version":1},{"shortcodes":["badminton"],"annotation":"badminton","tags":["birdie","game","racquet","shuttlecock"],"emoji":"๐ธ","order":3770,"group":6,"version":1},{"shortcodes":["boxing_glove"],"annotation":"boxing glove","tags":["boxing","glove"],"emoji":"๐ฅ","order":3771,"group":6,"version":3},{"shortcodes":["martial_arts_uniform"],"annotation":"martial arts uniform","tags":["judo","karate","martial arts","taekwondo","uniform"],"emoji":"๐ฅ","order":3772,"group":6,"version":3},{"shortcodes":["goal_net"],"annotation":"goal net","tags":["goal","net"],"emoji":"๐ฅ ","order":3773,"group":6,"version":3},{"shortcodes":["golf"],"annotation":"flag in hole","tags":["golf","hole"],"emoji":"โณ๏ธ","order":3774,"group":6,"version":0.6},{"shortcodes":["ice_skate"],"annotation":"ice skate","tags":["ice","skate"],"emoji":"โธ๏ธ","order":3776,"group":6,"version":0.7},{"shortcodes":["fishing_pole","fishing_pole_and_fish"],"annotation":"fishing pole","tags":["fish","pole"],"emoji":"๐ฃ","order":3777,"group":6,"version":0.6},{"shortcodes":["diving_mask"],"annotation":"diving mask","tags":["diving","scuba","snorkeling"],"emoji":"๐คฟ","order":3778,"group":6,"version":12},{"shortcodes":["running_shirt","running_shirt_with_sash"],"annotation":"running shirt","tags":["athletics","running","sash","shirt"],"emoji":"๐ฝ","order":3779,"group":6,"version":0.6},{"shortcodes":["ski"],"annotation":"skis","tags":["ski","snow"],"emoji":"๐ฟ","order":3780,"group":6,"version":0.6},{"shortcodes":["sled"],"annotation":"sled","tags":["sledge","sleigh"],"emoji":"๐ท","order":3781,"group":6,"version":5},{"shortcodes":["curling_stone"],"annotation":"curling stone","tags":["game","rock"],"emoji":"๐ฅ","order":3782,"group":6,"version":5},{"shortcodes":["bullseye","dart","direct_hit"],"annotation":"bullseye","tags":["dart","direct hit","game","hit","target"],"emoji":"๐ฏ","order":3783,"group":6,"version":0.6},{"shortcodes":["yo_yo"],"annotation":"yo-yo","tags":["fluctuate","toy"],"emoji":"๐ช","order":3784,"group":6,"version":12},{"shortcodes":["kite"],"annotation":"kite","tags":["fly","soar"],"emoji":"๐ช","order":3785,"group":6,"version":12},{"shortcodes":["8ball","billiards"],"annotation":"pool 8 ball","tags":["8","ball","billiard","eight","game"],"emoji":"๐ฑ","order":3786,"group":6,"version":0.6},{"shortcodes":["crystal_ball"],"annotation":"crystal ball","tags":["ball","crystal","fairy tale","fantasy","fortune","tool"],"emoji":"๐ฎ","order":3787,"group":6,"version":0.6},{"shortcodes":["magic_wand"],"annotation":"magic wand","tags":["magic","witch","wizard"],"emoji":"๐ช","order":3788,"group":6,"version":13},{"shortcodes":["nazar_amulet"],"annotation":"nazar amulet","tags":["bead","charm","evil-eye","nazar","talisman"],"emoji":"๐งฟ","order":3789,"group":6,"version":11},{"shortcodes":["hamsa"],"annotation":"hamsa","tags":["amulet","fatima","hand","mary","miriam","protection"],"emoji":"๐ชฌ","order":3790,"group":6,"version":14},{"shortcodes":["controller","video_game"],"annotation":"video game","tags":["controller","game"],"emoji":"๐ฎ๏ธ","order":3791,"group":6,"version":0.6},{"shortcodes":["joystick"],"annotation":"joystick","tags":["game","video game"],"emoji":"๐น๏ธ","order":3793,"group":6,"version":0.7},{"shortcodes":["slot_machine"],"annotation":"slot machine","tags":["game","slot"],"emoji":"๐ฐ","order":3794,"group":6,"version":0.6},{"shortcodes":["game_die"],"annotation":"game die","tags":["dice","die","game"],"emoji":"๐ฒ","order":3795,"group":6,"version":0.6},{"shortcodes":["jigsaw","puzzle_piece"],"annotation":"puzzle piece","tags":["clue","interlocking","jigsaw","piece","puzzle"],"emoji":"๐งฉ","order":3796,"group":6,"version":11},{"shortcodes":["teddy_bear"],"annotation":"teddy bear","tags":["plaything","plush","stuffed","toy"],"emoji":"๐งธ","order":3797,"group":6,"version":11},{"shortcodes":["pinata"],"annotation":"piรฑata","tags":["celebration","party"],"emoji":"๐ช ","order":3798,"group":6,"version":13},{"shortcodes":["disco","disco_ball","mirror_ball"],"annotation":"mirror ball","tags":["dance","disco","glitter","party"],"emoji":"๐ชฉ","order":3799,"group":6,"version":14},{"shortcodes":["nesting_dolls"],"annotation":"nesting dolls","tags":["doll","nesting","russia"],"emoji":"๐ช","order":3800,"group":6,"version":13},{"shortcodes":["spades"],"annotation":"spade suit","tags":["card","game"],"emoji":"โ ๏ธ","order":3802,"group":6,"version":0.6},{"shortcodes":["hearts"],"annotation":"heart suit","tags":["card","game"],"emoji":"โฅ๏ธ","order":3804,"group":6,"version":0.6},{"shortcodes":["diamonds"],"annotation":"diamond suit","tags":["card","game"],"emoji":"โฆ๏ธ","order":3806,"group":6,"version":0.6},{"shortcodes":["clubs"],"annotation":"club suit","tags":["card","game"],"emoji":"โฃ๏ธ","order":3808,"group":6,"version":0.6},{"shortcodes":["chess_pawn"],"annotation":"chess pawn","tags":["chess","dupe","expendable"],"emoji":"โ๏ธ","order":3810,"group":6,"version":11},{"shortcodes":["black_joker"],"annotation":"joker","tags":["card","game","wildcard"],"emoji":"๐","order":3811,"group":6,"version":0.6},{"shortcodes":["mahjong"],"annotation":"mahjong red dragon","tags":["game","mahjong","red"],"emoji":"๐๏ธ","order":3812,"group":6,"version":0.6},{"shortcodes":["flower_playing_cards"],"annotation":"flower playing cards","tags":["card","flower","game","japanese","playing"],"emoji":"๐ด","order":3813,"group":6,"version":0.6},{"shortcodes":["performing_arts"],"annotation":"performing arts","tags":["art","mask","performing","theater","theatre"],"emoji":"๐ญ๏ธ","order":3814,"group":6,"version":0.6},{"shortcodes":["frame_with_picture","framed_picture"],"annotation":"framed picture","tags":["art","frame","museum","painting","picture"],"emoji":"๐ผ๏ธ","order":3816,"group":6,"version":0.7},{"shortcodes":["art","palette"],"annotation":"artist palette","tags":["art","museum","painting","palette"],"emoji":"๐จ","order":3817,"group":6,"version":0.6},{"shortcodes":["thread"],"annotation":"thread","tags":["needle","sewing","spool","string"],"emoji":"๐งต","order":3818,"group":6,"version":11},{"shortcodes":["sewing_needle"],"annotation":"sewing needle","tags":["embroidery","needle","sewing","stitches","sutures","tailoring"],"emoji":"๐ชก","order":3819,"group":6,"version":13},{"shortcodes":["yarn"],"annotation":"yarn","tags":["ball","crochet","knit"],"emoji":"๐งถ","order":3820,"group":6,"version":11},{"shortcodes":["knot"],"annotation":"knot","tags":["rope","tangled","tie","twine","twist"],"emoji":"๐ชข","order":3821,"group":6,"version":13},{"shortcodes":["eyeglasses","glasses"],"annotation":"glasses","tags":["clothing","eye","eyeglasses","eyewear"],"emoji":"๐๏ธ","order":3822,"group":7,"version":0.6},{"shortcodes":["sunglasses"],"annotation":"sunglasses","tags":["dark","eye","eyewear","glasses"],"emoji":"๐ถ๏ธ","order":3824,"group":7,"version":0.7},{"shortcodes":["goggles"],"annotation":"goggles","tags":["eye protection","swimming","welding"],"emoji":"๐ฅฝ","order":3825,"group":7,"version":11},{"shortcodes":["lab_coat"],"annotation":"lab coat","tags":["doctor","experiment","scientist"],"emoji":"๐ฅผ","order":3826,"group":7,"version":11},{"shortcodes":["safety_vest"],"annotation":"safety vest","tags":["emergency","safety","vest"],"emoji":"๐ฆบ","order":3827,"group":7,"version":12},{"shortcodes":["necktie"],"annotation":"necktie","tags":["clothing","tie"],"emoji":"๐","order":3828,"group":7,"version":0.6},{"shortcodes":["shirt"],"annotation":"t-shirt","tags":["clothing","shirt","tshirt"],"emoji":"๐","order":3829,"group":7,"version":0.6},{"shortcodes":["jeans"],"annotation":"jeans","tags":["clothing","pants","trousers"],"emoji":"๐","order":3830,"group":7,"version":0.6},{"shortcodes":["scarf"],"annotation":"scarf","tags":["neck"],"emoji":"๐งฃ","order":3831,"group":7,"version":5},{"shortcodes":["gloves"],"annotation":"gloves","tags":["hand"],"emoji":"๐งค","order":3832,"group":7,"version":5},{"shortcodes":["coat"],"annotation":"coat","tags":["jacket"],"emoji":"๐งฅ","order":3833,"group":7,"version":5},{"shortcodes":["socks"],"annotation":"socks","tags":["stocking"],"emoji":"๐งฆ","order":3834,"group":7,"version":5},{"shortcodes":["dress"],"annotation":"dress","tags":["clothing"],"emoji":"๐","order":3835,"group":7,"version":0.6},{"shortcodes":["kimono"],"annotation":"kimono","tags":["clothing"],"emoji":"๐","order":3836,"group":7,"version":0.6},{"shortcodes":["sari"],"annotation":"sari","tags":["clothing","dress"],"emoji":"๐ฅป","order":3837,"group":7,"version":12},{"shortcodes":["one_piece_swimsuit"],"annotation":"one-piece swimsuit","tags":["bathing suit"],"emoji":"๐ฉฑ","order":3838,"group":7,"version":12},{"shortcodes":["briefs"],"annotation":"briefs","tags":["bathing suit","one-piece","swimsuit","underwear"],"emoji":"๐ฉฒ","order":3839,"group":7,"version":12},{"shortcodes":["shorts"],"annotation":"shorts","tags":["bathing suit","pants","underwear"],"emoji":"๐ฉณ","order":3840,"group":7,"version":12},{"shortcodes":["bikini"],"annotation":"bikini","tags":["clothing","swim"],"emoji":"๐","order":3841,"group":7,"version":0.6},{"shortcodes":["womans_clothes"],"annotation":"womanโs clothes","tags":["clothing","woman"],"emoji":"๐","order":3842,"group":7,"version":0.6},{"shortcodes":["purse"],"annotation":"purse","tags":["clothing","coin"],"emoji":"๐","order":3843,"group":7,"version":0.6},{"shortcodes":["handbag"],"annotation":"handbag","tags":["bag","clothing","purse"],"emoji":"๐","order":3844,"group":7,"version":0.6},{"shortcodes":["clutch_bag","pouch"],"annotation":"clutch bag","tags":["bag","clothing","pouch"],"emoji":"๐","order":3845,"group":7,"version":0.6},{"shortcodes":["shopping_bags"],"annotation":"shopping bags","tags":["bag","hotel","shopping"],"emoji":"๐๏ธ","order":3847,"group":7,"version":0.7},{"shortcodes":["backpack","school_satchel"],"annotation":"backpack","tags":["bag","rucksack","satchel","school"],"emoji":"๐","order":3848,"group":7,"version":0.6},{"shortcodes":["thong_sandal"],"annotation":"thong sandal","tags":["beach sandals","sandals","thong sandals","thongs","zลri"],"emoji":"๐ฉด","order":3849,"group":7,"version":13},{"shortcodes":["mans_shoe"],"annotation":"manโs shoe","tags":["clothing","man","shoe"],"emoji":"๐","order":3850,"group":7,"version":0.6},{"shortcodes":["athletic_shoe","sneaker"],"annotation":"running shoe","tags":["athletic","clothing","shoe","sneaker"],"emoji":"๐","order":3851,"group":7,"version":0.6},{"shortcodes":["hiking_boot"],"annotation":"hiking boot","tags":["backpacking","boot","camping","hiking"],"emoji":"๐ฅพ","order":3852,"group":7,"version":11},{"shortcodes":["flat_shoe","womans_flat_shoe"],"annotation":"flat shoe","tags":["ballet flat","slip-on","slipper"],"emoji":"๐ฅฟ","order":3853,"group":7,"version":11},{"shortcodes":["high_heel"],"annotation":"high-heeled shoe","tags":["clothing","heel","shoe","woman"],"emoji":"๐ ","order":3854,"group":7,"version":0.6},{"shortcodes":["sandal"],"annotation":"womanโs sandal","tags":["clothing","sandal","shoe","woman"],"emoji":"๐ก","order":3855,"group":7,"version":0.6},{"shortcodes":["ballet_shoes"],"annotation":"ballet shoes","tags":["ballet","dance"],"emoji":"๐ฉฐ","order":3856,"group":7,"version":12},{"shortcodes":["boot"],"annotation":"womanโs boot","tags":["boot","clothing","shoe","woman"],"emoji":"๐ข","order":3857,"group":7,"version":0.6},{"shortcodes":["crown"],"annotation":"crown","tags":["clothing","king","queen"],"emoji":"๐","order":3858,"group":7,"version":0.6},{"shortcodes":["womans_hat"],"annotation":"womanโs hat","tags":["clothing","hat","woman"],"emoji":"๐","order":3859,"group":7,"version":0.6},{"shortcodes":["top_hat","tophat"],"annotation":"top hat","tags":["clothing","hat","top","tophat"],"emoji":"๐ฉ","order":3860,"group":7,"version":0.6},{"shortcodes":["graduation_cap","mortar_board"],"annotation":"graduation cap","tags":["cap","celebration","clothing","graduation","hat"],"emoji":"๐๏ธ","order":3861,"group":7,"version":0.6},{"shortcodes":["billed_cap"],"annotation":"billed cap","tags":["baseball cap"],"emoji":"๐งข","order":3862,"group":7,"version":5},{"shortcodes":["military_helmet"],"annotation":"military helmet","tags":["army","helmet","military","soldier","warrior"],"emoji":"๐ช","order":3863,"group":7,"version":13},{"shortcodes":["helmet_with_cross","rescue_worker_helmet"],"annotation":"rescue workerโs helmet","tags":["aid","cross","face","hat","helmet"],"emoji":"โ๏ธ","order":3865,"group":7,"version":0.7},{"shortcodes":["prayer_beads"],"annotation":"prayer beads","tags":["beads","clothing","necklace","prayer","religion"],"emoji":"๐ฟ","order":3866,"group":7,"version":1},{"shortcodes":["lipstick"],"annotation":"lipstick","tags":["cosmetics","makeup"],"emoji":"๐","order":3867,"group":7,"version":0.6},{"shortcodes":["ring"],"annotation":"ring","tags":["diamond"],"emoji":"๐","order":3868,"group":7,"version":0.6},{"shortcodes":["gem"],"annotation":"gem stone","tags":["diamond","gem","jewel"],"emoji":"๐","order":3869,"group":7,"version":0.6},{"shortcodes":["mute","no_sound"],"annotation":"muted speaker","tags":["mute","quiet","silent","speaker"],"emoji":"๐","order":3870,"group":7,"version":1},{"shortcodes":["low_volume","quiet_sound","speaker"],"annotation":"speaker low volume","tags":["soft"],"emoji":"๐๏ธ","order":3871,"group":7,"version":0.7},{"shortcodes":["medium_volumne","sound"],"annotation":"speaker medium volume","tags":["medium"],"emoji":"๐","order":3872,"group":7,"version":1},{"shortcodes":["high_volume","loud_sound"],"annotation":"speaker high volume","tags":["loud"],"emoji":"๐","order":3873,"group":7,"version":0.6},{"shortcodes":["loudspeaker"],"annotation":"loudspeaker","tags":["loud","public address"],"emoji":"๐ข","order":3874,"group":7,"version":0.6},{"shortcodes":["mega","megaphone"],"annotation":"megaphone","tags":["cheering"],"emoji":"๐ฃ","order":3875,"group":7,"version":0.6},{"shortcodes":["postal_horn"],"annotation":"postal horn","tags":["horn","post","postal"],"emoji":"๐ฏ","order":3876,"group":7,"version":1},{"shortcodes":["bell"],"annotation":"bell","tags":["bell"],"emoji":"๐","order":3877,"group":7,"version":0.6},{"shortcodes":["no_bell"],"annotation":"bell with slash","tags":["bell","forbidden","mute","quiet","silent"],"emoji":"๐","order":3878,"group":7,"version":1},{"shortcodes":["musical_score"],"annotation":"musical score","tags":["music","score"],"emoji":"๐ผ","order":3879,"group":7,"version":0.6},{"shortcodes":["musical_note"],"annotation":"musical note","tags":["music","note"],"emoji":"๐ต","order":3880,"group":7,"version":0.6},{"shortcodes":["musical_notes","notes"],"annotation":"musical notes","tags":["music","note","notes"],"emoji":"๐ถ","order":3881,"group":7,"version":0.6},{"shortcodes":["studio_microphone"],"annotation":"studio microphone","tags":["mic","microphone","music","studio"],"emoji":"๐๏ธ","order":3883,"group":7,"version":0.7},{"shortcodes":["level_slider"],"annotation":"level slider","tags":["level","music","slider"],"emoji":"๐๏ธ","order":3885,"group":7,"version":0.7},{"shortcodes":["control_knobs"],"annotation":"control knobs","tags":["control","knobs","music"],"emoji":"๐๏ธ","order":3887,"group":7,"version":0.7},{"shortcodes":["microphone"],"annotation":"microphone","tags":["karaoke","mic"],"emoji":"๐ค","order":3888,"group":7,"version":0.6},{"shortcodes":["headphones"],"annotation":"headphone","tags":["earbud"],"emoji":"๐ง๏ธ","order":3889,"group":7,"version":0.6},{"shortcodes":["radio"],"annotation":"radio","tags":["video"],"emoji":"๐ป๏ธ","order":3890,"group":7,"version":0.6},{"shortcodes":["saxophone"],"annotation":"saxophone","tags":["instrument","music","sax"],"emoji":"๐ท","order":3891,"group":7,"version":0.6},{"shortcodes":["accordion"],"annotation":"accordion","tags":["concertina","squeeze box"],"emoji":"๐ช","order":3892,"group":7,"version":13},{"shortcodes":["guitar"],"annotation":"guitar","tags":["instrument","music"],"emoji":"๐ธ","order":3893,"group":7,"version":0.6},{"shortcodes":["musical_keyboard"],"annotation":"musical keyboard","tags":["instrument","keyboard","music","piano"],"emoji":"๐น","order":3894,"group":7,"version":0.6},{"shortcodes":["trumpet"],"annotation":"trumpet","tags":["instrument","music"],"emoji":"๐บ","order":3895,"group":7,"version":0.6},{"shortcodes":["violin"],"annotation":"violin","tags":["instrument","music"],"emoji":"๐ป","order":3896,"group":7,"version":0.6},{"shortcodes":["banjo"],"annotation":"banjo","tags":["music","stringed"],"emoji":"๐ช","order":3897,"group":7,"version":12},{"shortcodes":["drum"],"annotation":"drum","tags":["drumsticks","music"],"emoji":"๐ฅ","order":3898,"group":7,"version":3},{"shortcodes":["long_drum"],"annotation":"long drum","tags":["beat","conga","drum","rhythm"],"emoji":"๐ช","order":3899,"group":7,"version":13},{"shortcodes":["android","iphone","mobile_phone"],"annotation":"mobile phone","tags":["cell","mobile","phone","telephone"],"emoji":"๐ฑ","order":3900,"group":7,"version":0.6},{"shortcodes":["calling","mobile_phone_arrow"],"annotation":"mobile phone with arrow","tags":["arrow","cell","mobile","phone","receive"],"emoji":"๐ฒ","order":3901,"group":7,"version":0.6},{"shortcodes":["telephone"],"annotation":"telephone","tags":["phone"],"emoji":"โ๏ธ","order":3903,"group":7,"version":0.6},{"shortcodes":["telephone_receiver"],"annotation":"telephone receiver","tags":["phone","receiver","telephone"],"emoji":"๐","order":3904,"group":7,"version":0.6},{"shortcodes":["pager"],"annotation":"pager","tags":["pager"],"emoji":"๐๏ธ","order":3905,"group":7,"version":0.6},{"shortcodes":["fax","fax_machine"],"annotation":"fax machine","tags":["fax"],"emoji":"๐ ","order":3906,"group":7,"version":0.6},{"shortcodes":["battery"],"annotation":"battery","tags":["battery"],"emoji":"๐","order":3907,"group":7,"version":0.6},{"shortcodes":["low_battery"],"annotation":"low battery","tags":["electronic","low energy"],"emoji":"๐ชซ","order":3908,"group":7,"version":14},{"shortcodes":["electric_plug"],"annotation":"electric plug","tags":["electric","electricity","plug"],"emoji":"๐","order":3909,"group":7,"version":0.6},{"shortcodes":["laptop"],"annotation":"laptop","tags":["computer","pc","personal"],"emoji":"๐ป๏ธ","order":3910,"group":7,"version":0.6},{"shortcodes":["computer","desktop_computer"],"annotation":"desktop computer","tags":["computer","desktop"],"emoji":"๐ฅ๏ธ","order":3912,"group":7,"version":0.7},{"shortcodes":["printer"],"annotation":"printer","tags":["computer"],"emoji":"๐จ๏ธ","order":3914,"group":7,"version":0.7},{"shortcodes":["keyboard"],"annotation":"keyboard","tags":["computer"],"emoji":"โจ๏ธ","order":3916,"group":7,"version":1},{"shortcodes":["computer_mouse"],"annotation":"computer mouse","tags":["computer"],"emoji":"๐ฑ๏ธ","order":3918,"group":7,"version":0.7},{"shortcodes":["trackball"],"annotation":"trackball","tags":["computer"],"emoji":"๐ฒ๏ธ","order":3920,"group":7,"version":0.7},{"shortcodes":["computer_disk","minidisc"],"annotation":"computer disk","tags":["computer","disk","minidisk","optical"],"emoji":"๐ฝ","order":3921,"group":7,"version":0.6},{"shortcodes":["floppy_disk"],"annotation":"floppy disk","tags":["computer","disk","floppy"],"emoji":"๐พ","order":3922,"group":7,"version":0.6},{"shortcodes":["cd","optical_disk"],"annotation":"optical disk","tags":["cd","computer","disk","optical"],"emoji":"๐ฟ๏ธ","order":3923,"group":7,"version":0.6},{"shortcodes":["dvd"],"annotation":"dvd","tags":["blu-ray","computer","disk","optical"],"emoji":"๐","order":3924,"group":7,"version":0.6},{"shortcodes":["abacus"],"annotation":"abacus","tags":["calculation"],"emoji":"๐งฎ","order":3925,"group":7,"version":11},{"shortcodes":["movie_camera"],"annotation":"movie camera","tags":["camera","cinema","movie"],"emoji":"๐ฅ","order":3926,"group":7,"version":0.6},{"shortcodes":["film_frames"],"annotation":"film frames","tags":["cinema","film","frames","movie"],"emoji":"๐๏ธ","order":3928,"group":7,"version":0.7},{"shortcodes":["film_projector"],"annotation":"film projector","tags":["cinema","film","movie","projector","video"],"emoji":"๐ฝ๏ธ","order":3930,"group":7,"version":0.7},{"shortcodes":["clapper"],"annotation":"clapper board","tags":["clapper","movie"],"emoji":"๐ฌ๏ธ","order":3931,"group":7,"version":0.6},{"shortcodes":["tv"],"annotation":"television","tags":["tv","video"],"emoji":"๐บ๏ธ","order":3932,"group":7,"version":0.6},{"shortcodes":["camera"],"annotation":"camera","tags":["video"],"emoji":"๐ท๏ธ","order":3933,"group":7,"version":0.6},{"shortcodes":["camera_with_flash"],"annotation":"camera with flash","tags":["camera","flash","video"],"emoji":"๐ธ","order":3934,"group":7,"version":1},{"shortcodes":["video_camera"],"annotation":"video camera","tags":["camera","video"],"emoji":"๐น๏ธ","order":3935,"group":7,"version":0.6},{"shortcodes":["vhs","videocassette"],"annotation":"videocassette","tags":["tape","vhs","video"],"emoji":"๐ผ","order":3936,"group":7,"version":0.6},{"shortcodes":["mag"],"annotation":"magnifying glass tilted left","tags":["glass","magnifying","search","tool"],"emoji":"๐๏ธ","order":3937,"group":7,"version":0.6},{"shortcodes":["mag_right"],"annotation":"magnifying glass tilted right","tags":["glass","magnifying","search","tool"],"emoji":"๐","order":3938,"group":7,"version":0.6},{"shortcodes":["candle"],"annotation":"candle","tags":["light"],"emoji":"๐ฏ๏ธ","order":3940,"group":7,"version":0.7},{"shortcodes":["bulb","light_bulb"],"annotation":"light bulb","tags":["bulb","comic","electric","idea","light"],"emoji":"๐ก","order":3941,"group":7,"version":0.6},{"shortcodes":["flashlight"],"annotation":"flashlight","tags":["electric","light","tool","torch"],"emoji":"๐ฆ","order":3942,"group":7,"version":0.6},{"shortcodes":["izakaya_lantern","red_paper_lantern"],"annotation":"red paper lantern","tags":["bar","lantern","light","red"],"emoji":"๐ฎ","order":3943,"group":7,"version":0.6},{"shortcodes":["diya_lamp"],"annotation":"diya lamp","tags":["diya","lamp","oil"],"emoji":"๐ช","order":3944,"group":7,"version":12},{"shortcodes":["notebook_with_decorative_cover"],"annotation":"notebook with decorative cover","tags":["book","cover","decorated","notebook"],"emoji":"๐","order":3945,"group":7,"version":0.6},{"shortcodes":["closed_book"],"annotation":"closed book","tags":["book","closed"],"emoji":"๐","order":3946,"group":7,"version":0.6},{"shortcodes":["book","open_book"],"annotation":"open book","tags":["book","open"],"emoji":"๐","order":3947,"group":7,"version":0.6},{"shortcodes":["green_book"],"annotation":"green book","tags":["book","green"],"emoji":"๐","order":3948,"group":7,"version":0.6},{"shortcodes":["blue_book"],"annotation":"blue book","tags":["blue","book"],"emoji":"๐","order":3949,"group":7,"version":0.6},{"shortcodes":["orange_book"],"annotation":"orange book","tags":["book","orange"],"emoji":"๐","order":3950,"group":7,"version":0.6},{"shortcodes":["books"],"annotation":"books","tags":["book"],"emoji":"๐๏ธ","order":3951,"group":7,"version":0.6},{"shortcodes":["notebook"],"annotation":"notebook","tags":["notebook"],"emoji":"๐","order":3952,"group":7,"version":0.6},{"shortcodes":["ledger"],"annotation":"ledger","tags":["notebook"],"emoji":"๐","order":3953,"group":7,"version":0.6},{"shortcodes":["page_with_curl"],"annotation":"page with curl","tags":["curl","document","page"],"emoji":"๐","order":3954,"group":7,"version":0.6},{"shortcodes":["scroll"],"annotation":"scroll","tags":["paper"],"emoji":"๐","order":3955,"group":7,"version":0.6},{"shortcodes":["page_facing_up"],"annotation":"page facing up","tags":["document","page"],"emoji":"๐","order":3956,"group":7,"version":0.6},{"shortcodes":["newspaper"],"annotation":"newspaper","tags":["news","paper"],"emoji":"๐ฐ","order":3957,"group":7,"version":0.6},{"shortcodes":["rolled_up_newspaper"],"annotation":"rolled-up newspaper","tags":["news","newspaper","paper","rolled"],"emoji":"๐๏ธ","order":3959,"group":7,"version":0.7},{"shortcodes":["bookmark_tabs"],"annotation":"bookmark tabs","tags":["bookmark","mark","marker","tabs"],"emoji":"๐","order":3960,"group":7,"version":0.6},{"shortcodes":["bookmark"],"annotation":"bookmark","tags":["mark"],"emoji":"๐","order":3961,"group":7,"version":0.6},{"shortcodes":["label"],"annotation":"label","tags":["label"],"emoji":"๐ท๏ธ","order":3963,"group":7,"version":0.7},{"shortcodes":["moneybag"],"annotation":"money bag","tags":["bag","dollar","money","moneybag"],"emoji":"๐ฐ๏ธ","order":3964,"group":7,"version":0.6},{"shortcodes":["coin"],"annotation":"coin","tags":["gold","metal","money","silver","treasure"],"emoji":"๐ช","order":3965,"group":7,"version":13},{"shortcodes":["yen"],"annotation":"yen banknote","tags":["banknote","bill","currency","money","note","yen"],"emoji":"๐ด","order":3966,"group":7,"version":0.6},{"shortcodes":["dollar"],"annotation":"dollar banknote","tags":["banknote","bill","currency","dollar","money","note"],"emoji":"๐ต","order":3967,"group":7,"version":0.6},{"shortcodes":["euro"],"annotation":"euro banknote","tags":["banknote","bill","currency","euro","money","note"],"emoji":"๐ถ","order":3968,"group":7,"version":1},{"shortcodes":["pound"],"annotation":"pound banknote","tags":["banknote","bill","currency","money","note","pound"],"emoji":"๐ท","order":3969,"group":7,"version":1},{"shortcodes":["money_with_wings"],"annotation":"money with wings","tags":["banknote","bill","fly","money","wings"],"emoji":"๐ธ","order":3970,"group":7,"version":0.6},{"shortcodes":["credit_card"],"annotation":"credit card","tags":["card","credit","money"],"emoji":"๐ณ๏ธ","order":3971,"group":7,"version":0.6},{"shortcodes":["receipt"],"annotation":"receipt","tags":["accounting","bookkeeping","evidence","proof"],"emoji":"๐งพ","order":3972,"group":7,"version":11},{"shortcodes":["chart"],"annotation":"chart increasing with yen","tags":["chart","graph","growth","money","yen"],"emoji":"๐น","order":3973,"group":7,"version":0.6},{"shortcodes":["envelope"],"annotation":"envelope","tags":["email","letter"],"emoji":"โ๏ธ","order":3975,"group":7,"version":0.6},{"shortcodes":["e-mail","email"],"annotation":"e-mail","tags":["email","letter","mail"],"emoji":"๐ง","order":3976,"group":7,"version":0.6},{"shortcodes":["incoming_envelope"],"annotation":"incoming envelope","tags":["e-mail","email","envelope","incoming","letter","receive"],"emoji":"๐จ","order":3977,"group":7,"version":0.6},{"shortcodes":["envelope_with_arrow"],"annotation":"envelope with arrow","tags":["arrow","e-mail","email","envelope","outgoing"],"emoji":"๐ฉ","order":3978,"group":7,"version":0.6},{"shortcodes":["outbox_tray"],"annotation":"outbox tray","tags":["box","letter","mail","outbox","sent","tray"],"emoji":"๐ค๏ธ","order":3979,"group":7,"version":0.6},{"shortcodes":["inbox_tray"],"annotation":"inbox tray","tags":["box","inbox","letter","mail","receive","tray"],"emoji":"๐ฅ๏ธ","order":3980,"group":7,"version":0.6},{"shortcodes":["package"],"annotation":"package","tags":["box","parcel"],"emoji":"๐ฆ๏ธ","order":3981,"group":7,"version":0.6},{"shortcodes":["mailbox"],"annotation":"closed mailbox with raised flag","tags":["closed","mail","mailbox","postbox"],"emoji":"๐ซ๏ธ","order":3982,"group":7,"version":0.6},{"shortcodes":["mailbox_closed"],"annotation":"closed mailbox with lowered flag","tags":["closed","lowered","mail","mailbox","postbox"],"emoji":"๐ช๏ธ","order":3983,"group":7,"version":0.6},{"shortcodes":["mailbox_with_mail"],"annotation":"open mailbox with raised flag","tags":["mail","mailbox","open","postbox"],"emoji":"๐ฌ๏ธ","order":3984,"group":7,"version":0.7},{"shortcodes":["mailbox_with_no_mail"],"annotation":"open mailbox with lowered flag","tags":["lowered","mail","mailbox","open","postbox"],"emoji":"๐ญ๏ธ","order":3985,"group":7,"version":0.7},{"shortcodes":["postbox"],"annotation":"postbox","tags":["mail","mailbox"],"emoji":"๐ฎ","order":3986,"group":7,"version":0.6},{"shortcodes":["ballot_box"],"annotation":"ballot box with ballot","tags":["ballot","box"],"emoji":"๐ณ๏ธ","order":3988,"group":7,"version":0.7},{"shortcodes":["pencil"],"annotation":"pencil","tags":["pencil"],"emoji":"โ๏ธ","order":3990,"group":7,"version":0.6},{"shortcodes":["black_nib"],"annotation":"black nib","tags":["nib","pen"],"emoji":"โ๏ธ","order":3992,"group":7,"version":0.6},{"shortcodes":["fountain_pen"],"annotation":"fountain pen","tags":["fountain","pen"],"emoji":"๐๏ธ","order":3994,"group":7,"version":0.7},{"shortcodes":["pen"],"annotation":"pen","tags":["ballpoint"],"emoji":"๐๏ธ","order":3996,"group":7,"version":0.7},{"shortcodes":["paintbrush"],"annotation":"paintbrush","tags":["painting"],"emoji":"๐๏ธ","order":3998,"group":7,"version":0.7},{"shortcodes":["crayon"],"annotation":"crayon","tags":["crayon"],"emoji":"๐๏ธ","order":4000,"group":7,"version":0.7},{"shortcodes":["memo"],"annotation":"memo","tags":["pencil"],"emoji":"๐","order":4001,"group":7,"version":0.6},{"shortcodes":["briefcase"],"annotation":"briefcase","tags":["briefcase"],"emoji":"๐ผ","order":4002,"group":7,"version":0.6},{"shortcodes":["file_folder"],"annotation":"file folder","tags":["file","folder"],"emoji":"๐","order":4003,"group":7,"version":0.6},{"shortcodes":["open_file_folder"],"annotation":"open file folder","tags":["file","folder","open"],"emoji":"๐","order":4004,"group":7,"version":0.6},{"shortcodes":["card_index_dividers"],"annotation":"card index dividers","tags":["card","dividers","index"],"emoji":"๐๏ธ","order":4006,"group":7,"version":0.7},{"shortcodes":["date"],"annotation":"calendar","tags":["date"],"emoji":"๐ ","order":4007,"group":7,"version":0.6},{"shortcodes":["calendar"],"annotation":"tear-off calendar","tags":["calendar"],"emoji":"๐","order":4008,"group":7,"version":0.6},{"shortcodes":["notepad_spiral"],"annotation":"spiral notepad","tags":["note","pad","spiral"],"emoji":"๐๏ธ","order":4010,"group":7,"version":0.7},{"shortcodes":["calendar_spiral"],"annotation":"spiral calendar","tags":["calendar","pad","spiral"],"emoji":"๐๏ธ","order":4012,"group":7,"version":0.7},{"shortcodes":["card_index"],"annotation":"card index","tags":["card","index","rolodex"],"emoji":"๐","order":4013,"group":7,"version":0.6},{"shortcodes":["chart_increasing","chart_with_upwards_trend"],"annotation":"chart increasing","tags":["chart","graph","growth","trend","upward"],"emoji":"๐","order":4014,"group":7,"version":0.6},{"shortcodes":["chart_decreasing","chart_with_downwards_trend"],"annotation":"chart decreasing","tags":["chart","down","graph","trend"],"emoji":"๐","order":4015,"group":7,"version":0.6},{"shortcodes":["bar_chart"],"annotation":"bar chart","tags":["bar","chart","graph"],"emoji":"๐","order":4016,"group":7,"version":0.6},{"shortcodes":["clipboard"],"annotation":"clipboard","tags":["clipboard"],"emoji":"๐๏ธ","order":4017,"group":7,"version":0.6},{"shortcodes":["pushpin"],"annotation":"pushpin","tags":["pin"],"emoji":"๐","order":4018,"group":7,"version":0.6},{"shortcodes":["round_pushpin"],"annotation":"round pushpin","tags":["pin","pushpin"],"emoji":"๐","order":4019,"group":7,"version":0.6},{"shortcodes":["paperclip"],"annotation":"paperclip","tags":["paperclip"],"emoji":"๐","order":4020,"group":7,"version":0.6},{"shortcodes":["paperclips"],"annotation":"linked paperclips","tags":["link","paperclip"],"emoji":"๐๏ธ","order":4022,"group":7,"version":0.7},{"shortcodes":["straight_ruler"],"annotation":"straight ruler","tags":["ruler","straight edge"],"emoji":"๐","order":4023,"group":7,"version":0.6},{"shortcodes":["triangular_ruler"],"annotation":"triangular ruler","tags":["ruler","set","triangle"],"emoji":"๐","order":4024,"group":7,"version":0.6},{"shortcodes":["scissors"],"annotation":"scissors","tags":["cutting","tool"],"emoji":"โ๏ธ","order":4026,"group":7,"version":0.6},{"shortcodes":["card_file_box"],"annotation":"card file box","tags":["box","card","file"],"emoji":"๐๏ธ","order":4028,"group":7,"version":0.7},{"shortcodes":["file_cabinet"],"annotation":"file cabinet","tags":["cabinet","file","filing"],"emoji":"๐๏ธ","order":4030,"group":7,"version":0.7},{"shortcodes":["trashcan","wastebasket"],"annotation":"wastebasket","tags":["wastebasket"],"emoji":"๐๏ธ","order":4032,"group":7,"version":0.7},{"shortcodes":["lock","locked"],"annotation":"locked","tags":["closed"],"emoji":"๐๏ธ","order":4033,"group":7,"version":0.6},{"shortcodes":["unlock","unlocked"],"annotation":"unlocked","tags":["lock","open","unlock"],"emoji":"๐๏ธ","order":4034,"group":7,"version":0.6},{"shortcodes":["lock_with_ink_pen","locked_with_pen"],"annotation":"locked with pen","tags":["ink","lock","nib","pen","privacy"],"emoji":"๐","order":4035,"group":7,"version":0.6},{"shortcodes":["closed_lock_with_key","locked_with_key"],"annotation":"locked with key","tags":["closed","key","lock","secure"],"emoji":"๐","order":4036,"group":7,"version":0.6},{"shortcodes":["key"],"annotation":"key","tags":["lock","password"],"emoji":"๐","order":4037,"group":7,"version":0.6},{"shortcodes":["old_key"],"annotation":"old key","tags":["clue","key","lock","old"],"emoji":"๐๏ธ","order":4039,"group":7,"version":0.7},{"shortcodes":["hammer"],"annotation":"hammer","tags":["tool"],"emoji":"๐จ","order":4040,"group":7,"version":0.6},{"shortcodes":["axe"],"annotation":"axe","tags":["chop","hatchet","split","wood"],"emoji":"๐ช","order":4041,"group":7,"version":12},{"shortcodes":["pick"],"annotation":"pick","tags":["mining","tool"],"emoji":"โ๏ธ","order":4043,"group":7,"version":0.7},{"shortcodes":["hammer_and_pick"],"annotation":"hammer and pick","tags":["hammer","pick","tool"],"emoji":"โ๏ธ","order":4045,"group":7,"version":1},{"shortcodes":["hammer_and_wrench"],"annotation":"hammer and wrench","tags":["hammer","spanner","tool","wrench"],"emoji":"๐ ๏ธ","order":4047,"group":7,"version":0.7},{"shortcodes":["dagger"],"annotation":"dagger","tags":["knife","weapon"],"emoji":"๐ก๏ธ","order":4049,"group":7,"version":0.7},{"shortcodes":["crossed_swords"],"annotation":"crossed swords","tags":["crossed","swords","weapon"],"emoji":"โ๏ธ","order":4051,"group":7,"version":1},{"shortcodes":["gun","pistol"],"annotation":"water pistol","tags":["gun","handgun","pistol","revolver","tool","water","weapon"],"emoji":"๐ซ","order":4052,"group":7,"version":0.6},{"shortcodes":["boomerang"],"annotation":"boomerang","tags":["australia","rebound","repercussion"],"emoji":"๐ช","order":4053,"group":7,"version":13},{"shortcodes":["bow_and_arrow"],"annotation":"bow and arrow","tags":["archer","arrow","bow","sagittarius","zodiac"],"emoji":"๐น","order":4054,"group":7,"version":1},{"shortcodes":["shield"],"annotation":"shield","tags":["weapon"],"emoji":"๐ก๏ธ","order":4056,"group":7,"version":0.7},{"shortcodes":["carpentry_saw"],"annotation":"carpentry saw","tags":["carpenter","lumber","saw","tool"],"emoji":"๐ช","order":4057,"group":7,"version":13},{"shortcodes":["wrench"],"annotation":"wrench","tags":["spanner","tool"],"emoji":"๐ง","order":4058,"group":7,"version":0.6},{"shortcodes":["screwdriver"],"annotation":"screwdriver","tags":["screw","tool"],"emoji":"๐ช","order":4059,"group":7,"version":13},{"shortcodes":["nut_and_bolt"],"annotation":"nut and bolt","tags":["bolt","nut","tool"],"emoji":"๐ฉ","order":4060,"group":7,"version":0.6},{"shortcodes":["gear"],"annotation":"gear","tags":["cog","cogwheel","tool"],"emoji":"โ๏ธ","order":4062,"group":7,"version":1},{"shortcodes":["clamp","compression"],"annotation":"clamp","tags":["compress","tool","vice"],"emoji":"๐๏ธ","order":4064,"group":7,"version":0.7},{"shortcodes":["scales"],"annotation":"balance scale","tags":["balance","justice","libra","scale","zodiac"],"emoji":"โ๏ธ","order":4066,"group":7,"version":1},{"shortcodes":["probing_cane","white_cane"],"annotation":"white cane","tags":["accessibility","blind"],"emoji":"๐ฆฏ","order":4067,"group":7,"version":12},{"shortcodes":["link"],"annotation":"link","tags":["link"],"emoji":"๐","order":4068,"group":7,"version":0.6},{"shortcodes":["chains"],"annotation":"chains","tags":["chain"],"emoji":"โ๏ธ","order":4070,"group":7,"version":0.7},{"shortcodes":["hook"],"annotation":"hook","tags":["catch","crook","curve","ensnare","selling point"],"emoji":"๐ช","order":4071,"group":7,"version":13},{"shortcodes":["toolbox"],"annotation":"toolbox","tags":["chest","mechanic","tool"],"emoji":"๐งฐ","order":4072,"group":7,"version":11},{"shortcodes":["magnet"],"annotation":"magnet","tags":["attraction","horseshoe","magnetic"],"emoji":"๐งฒ","order":4073,"group":7,"version":11},{"shortcodes":["ladder"],"annotation":"ladder","tags":["climb","rung","step"],"emoji":"๐ช","order":4074,"group":7,"version":13},{"shortcodes":["alembic"],"annotation":"alembic","tags":["chemistry","tool"],"emoji":"โ๏ธ","order":4076,"group":7,"version":1},{"shortcodes":["test_tube"],"annotation":"test tube","tags":["chemist","chemistry","experiment","lab","science"],"emoji":"๐งช","order":4077,"group":7,"version":11},{"shortcodes":["petri_dish"],"annotation":"petri dish","tags":["bacteria","biologist","biology","culture","lab"],"emoji":"๐งซ","order":4078,"group":7,"version":11},{"shortcodes":["dna","double_helix"],"annotation":"dna","tags":["biologist","evolution","gene","genetics","life"],"emoji":"๐งฌ","order":4079,"group":7,"version":11},{"shortcodes":["microscope"],"annotation":"microscope","tags":["science","tool"],"emoji":"๐ฌ","order":4080,"group":7,"version":1},{"shortcodes":["telescope"],"annotation":"telescope","tags":["science","tool"],"emoji":"๐ญ","order":4081,"group":7,"version":1},{"shortcodes":["satellite_antenna"],"annotation":"satellite antenna","tags":["antenna","dish","satellite"],"emoji":"๐ก","order":4082,"group":7,"version":0.6},{"shortcodes":["syringe"],"annotation":"syringe","tags":["medicine","needle","shot","sick"],"emoji":"๐","order":4083,"group":7,"version":0.6},{"shortcodes":["drop_of_blood"],"annotation":"drop of blood","tags":["bleed","blood donation","injury","medicine","menstruation"],"emoji":"๐ฉธ","order":4084,"group":7,"version":12},{"shortcodes":["pill"],"annotation":"pill","tags":["doctor","medicine","sick"],"emoji":"๐","order":4085,"group":7,"version":0.6},{"shortcodes":["adhesive_bandage","bandaid"],"annotation":"adhesive bandage","tags":["bandage"],"emoji":"๐ฉน","order":4086,"group":7,"version":12},{"shortcodes":["crutch"],"annotation":"crutch","tags":["cane","disability","hurt","mobility aid","stick"],"emoji":"๐ฉผ","order":4087,"group":7,"version":14},{"shortcodes":["stethoscope"],"annotation":"stethoscope","tags":["doctor","heart","medicine"],"emoji":"๐ฉบ","order":4088,"group":7,"version":12},{"shortcodes":["x-ray","xray"],"annotation":"x-ray","tags":["bones","doctor","medical","skeleton"],"emoji":"๐ฉป","order":4089,"group":7,"version":14},{"shortcodes":["door"],"annotation":"door","tags":["door"],"emoji":"๐ช","order":4090,"group":7,"version":0.6},{"shortcodes":["elevator"],"annotation":"elevator","tags":["accessibility","hoist","lift"],"emoji":"๐","order":4091,"group":7,"version":13},{"shortcodes":["mirror"],"annotation":"mirror","tags":["reflection","reflector","speculum"],"emoji":"๐ช","order":4092,"group":7,"version":13},{"shortcodes":["window"],"annotation":"window","tags":["frame","fresh air","opening","transparent","view"],"emoji":"๐ช","order":4093,"group":7,"version":13},{"shortcodes":["bed"],"annotation":"bed","tags":["hotel","sleep"],"emoji":"๐๏ธ","order":4095,"group":7,"version":0.7},{"shortcodes":["couch_and_lamp"],"annotation":"couch and lamp","tags":["couch","hotel","lamp"],"emoji":"๐๏ธ","order":4097,"group":7,"version":0.7},{"shortcodes":["chair"],"annotation":"chair","tags":["seat","sit"],"emoji":"๐ช","order":4098,"group":7,"version":12},{"shortcodes":["toilet"],"annotation":"toilet","tags":["toilet"],"emoji":"๐ฝ","order":4099,"group":7,"version":0.6},{"shortcodes":["plunger"],"annotation":"plunger","tags":["force cup","plumber","suction","toilet"],"emoji":"๐ช ","order":4100,"group":7,"version":13},{"shortcodes":["shower"],"annotation":"shower","tags":["water"],"emoji":"๐ฟ","order":4101,"group":7,"version":1},{"shortcodes":["bathtub"],"annotation":"bathtub","tags":["bath"],"emoji":"๐","order":4102,"group":7,"version":1},{"shortcodes":["mouse_trap"],"annotation":"mouse trap","tags":["bait","mousetrap","snare","trap"],"emoji":"๐ชค","order":4103,"group":7,"version":13},{"shortcodes":["razor"],"annotation":"razor","tags":["sharp","shave"],"emoji":"๐ช","order":4104,"group":7,"version":12},{"shortcodes":["lotion_bottle"],"annotation":"lotion bottle","tags":["lotion","moisturizer","shampoo","sunscreen"],"emoji":"๐งด","order":4105,"group":7,"version":11},{"shortcodes":["safety_pin"],"annotation":"safety pin","tags":["diaper","punk rock"],"emoji":"๐งท","order":4106,"group":7,"version":11},{"shortcodes":["broom"],"annotation":"broom","tags":["cleaning","sweeping","witch"],"emoji":"๐งน","order":4107,"group":7,"version":11},{"shortcodes":["basket"],"annotation":"basket","tags":["farming","laundry","picnic"],"emoji":"๐งบ","order":4108,"group":7,"version":11},{"shortcodes":["roll_of_paper","toilet_paper"],"annotation":"roll of paper","tags":["paper towels","toilet paper"],"emoji":"๐งป","order":4109,"group":7,"version":11},{"shortcodes":["bucket"],"annotation":"bucket","tags":["cask","pail","vat"],"emoji":"๐ชฃ","order":4110,"group":7,"version":13},{"shortcodes":["soap"],"annotation":"soap","tags":["bar","bathing","cleaning","lather","soapdish"],"emoji":"๐งผ","order":4111,"group":7,"version":11},{"shortcodes":["bubbles"],"annotation":"bubbles","tags":["burp","clean","soap","underwater"],"emoji":"๐ซง","order":4112,"group":7,"version":14},{"shortcodes":["toothbrush"],"annotation":"toothbrush","tags":["bathroom","brush","clean","dental","hygiene","teeth"],"emoji":"๐ชฅ","order":4113,"group":7,"version":13},{"shortcodes":["sponge"],"annotation":"sponge","tags":["absorbing","cleaning","porous"],"emoji":"๐งฝ","order":4114,"group":7,"version":11},{"shortcodes":["fire_extinguisher"],"annotation":"fire extinguisher","tags":["extinguish","fire","quench"],"emoji":"๐งฏ","order":4115,"group":7,"version":11},{"shortcodes":["shopping_cart"],"annotation":"shopping cart","tags":["cart","shopping","trolley"],"emoji":"๐","order":4116,"group":7,"version":3},{"shortcodes":["cigarette","smoking"],"annotation":"cigarette","tags":["smoking"],"emoji":"๐ฌ","order":4117,"group":7,"version":0.6},{"shortcodes":["coffin"],"annotation":"coffin","tags":["death"],"emoji":"โฐ๏ธ","order":4119,"group":7,"version":1},{"shortcodes":["headstone"],"annotation":"headstone","tags":["cemetery","grave","graveyard","tombstone"],"emoji":"๐ชฆ","order":4120,"group":7,"version":13},{"shortcodes":["funeral_urn"],"annotation":"funeral urn","tags":["ashes","death","funeral","urn"],"emoji":"โฑ๏ธ","order":4122,"group":7,"version":1},{"shortcodes":["moai","moyai"],"annotation":"moai","tags":["face","moyai","statue"],"emoji":"๐ฟ","order":4123,"group":7,"version":0.6},{"shortcodes":["placard"],"annotation":"placard","tags":["demonstration","picket","protest","sign"],"emoji":"๐ชง","order":4124,"group":7,"version":13},{"shortcodes":["id_card"],"annotation":"identification card","tags":["credentials","id","license","security"],"emoji":"๐ชช","order":4125,"group":7,"version":14},{"shortcodes":["atm"],"annotation":"ATM sign","tags":["atm","atm sign","automated","bank","teller"],"emoji":"๐ง","order":4126,"group":8,"version":0.6},{"shortcodes":["litter_bin","put_litter_in_its_place"],"annotation":"litter in bin sign","tags":["litter","litter bin"],"emoji":"๐ฎ","order":4127,"group":8,"version":1},{"shortcodes":["potable_water"],"annotation":"potable water","tags":["drinking","potable","water"],"emoji":"๐ฐ","order":4128,"group":8,"version":1},{"shortcodes":["handicapped","wheelchair"],"annotation":"wheelchair symbol","tags":["access"],"emoji":"โฟ๏ธ","order":4129,"group":8,"version":0.6},{"shortcodes":["mens"],"annotation":"menโs room","tags":["bathroom","lavatory","man","restroom","toilet","wc"],"emoji":"๐น๏ธ","order":4130,"group":8,"version":0.6},{"shortcodes":["womens"],"annotation":"womenโs room","tags":["bathroom","lavatory","restroom","toilet","wc","woman"],"emoji":"๐บ๏ธ","order":4131,"group":8,"version":0.6},{"shortcodes":["bathroom","restroom"],"annotation":"restroom","tags":["bathroom","lavatory","toilet","wc"],"emoji":"๐ป","order":4132,"group":8,"version":0.6},{"shortcodes":["baby_symbol"],"annotation":"baby symbol","tags":["baby","changing"],"emoji":"๐ผ๏ธ","order":4133,"group":8,"version":0.6},{"shortcodes":["water_closet","wc"],"annotation":"water closet","tags":["bathroom","closet","lavatory","restroom","toilet","water","wc"],"emoji":"๐พ","order":4134,"group":8,"version":0.6},{"shortcodes":["passport_control"],"annotation":"passport control","tags":["control","passport"],"emoji":"๐","order":4135,"group":8,"version":1},{"shortcodes":["customs"],"annotation":"customs","tags":["customs"],"emoji":"๐","order":4136,"group":8,"version":1},{"shortcodes":["baggage_claim"],"annotation":"baggage claim","tags":["baggage","claim"],"emoji":"๐","order":4137,"group":8,"version":1},{"shortcodes":["left_luggage"],"annotation":"left luggage","tags":["baggage","locker","luggage"],"emoji":"๐ ","order":4138,"group":8,"version":1},{"shortcodes":["warning"],"annotation":"warning","tags":["warning"],"emoji":"โ ๏ธ","order":4140,"group":8,"version":0.6},{"shortcodes":["children_crossing"],"annotation":"children crossing","tags":["child","crossing","pedestrian","traffic"],"emoji":"๐ธ","order":4141,"group":8,"version":1},{"shortcodes":["no_entry"],"annotation":"no entry","tags":["entry","forbidden","no","not","prohibited","traffic"],"emoji":"โ๏ธ","order":4142,"group":8,"version":0.6},{"shortcodes":["no_entry_sign"],"annotation":"prohibited","tags":["entry","forbidden","no","not"],"emoji":"๐ซ","order":4143,"group":8,"version":0.6},{"shortcodes":["no_bicycles"],"annotation":"no bicycles","tags":["bicycle","bike","forbidden","no","prohibited"],"emoji":"๐ณ","order":4144,"group":8,"version":1},{"shortcodes":["no_smoking"],"annotation":"no smoking","tags":["forbidden","no","not","prohibited","smoking"],"emoji":"๐ญ๏ธ","order":4145,"group":8,"version":0.6},{"shortcodes":["do_not_litter","no_littering"],"annotation":"no littering","tags":["forbidden","litter","no","not","prohibited"],"emoji":"๐ฏ","order":4146,"group":8,"version":1},{"shortcodes":["non-potable_water"],"annotation":"non-potable water","tags":["non-drinking","non-potable","water"],"emoji":"๐ฑ","order":4147,"group":8,"version":1},{"shortcodes":["no_pedestrians"],"annotation":"no pedestrians","tags":["forbidden","no","not","pedestrian","prohibited"],"emoji":"๐ท","order":4148,"group":8,"version":1},{"shortcodes":["no_mobile_phones"],"annotation":"no mobile phones","tags":["cell","forbidden","mobile","no","phone"],"emoji":"๐ต","order":4149,"group":8,"version":1},{"shortcodes":["no_one_under_18","underage"],"annotation":"no one under eighteen","tags":["18","age restriction","eighteen","prohibited","underage"],"emoji":"๐","order":4150,"group":8,"version":0.6},{"shortcodes":["radioactive"],"annotation":"radioactive","tags":["sign"],"emoji":"โข๏ธ","order":4152,"group":8,"version":1},{"shortcodes":["biohazard"],"annotation":"biohazard","tags":["sign"],"emoji":"โฃ๏ธ","order":4154,"group":8,"version":1},{"shortcodes":["arrow_up"],"annotation":"up arrow","tags":["arrow","cardinal","direction","north"],"emoji":"โฌ๏ธ","order":4156,"group":8,"version":0.6},{"shortcodes":["arrow_upper_right"],"annotation":"up-right arrow","tags":["arrow","direction","intercardinal","northeast"],"emoji":"โ๏ธ","order":4158,"group":8,"version":0.6},{"shortcodes":["arrow_right"],"annotation":"right arrow","tags":["arrow","cardinal","direction","east"],"emoji":"โก๏ธ","order":4160,"group":8,"version":0.6},{"shortcodes":["arrow_lower_right"],"annotation":"down-right arrow","tags":["arrow","direction","intercardinal","southeast"],"emoji":"โ๏ธ","order":4162,"group":8,"version":0.6},{"shortcodes":["arrow_down"],"annotation":"down arrow","tags":["arrow","cardinal","direction","down","south"],"emoji":"โฌ๏ธ","order":4164,"group":8,"version":0.6},{"shortcodes":["arrow_lower_left"],"annotation":"down-left arrow","tags":["arrow","direction","intercardinal","southwest"],"emoji":"โ๏ธ","order":4166,"group":8,"version":0.6},{"shortcodes":["arrow_left"],"annotation":"left arrow","tags":["arrow","cardinal","direction","west"],"emoji":"โฌ ๏ธ","order":4168,"group":8,"version":0.6},{"shortcodes":["arrow_upper_left"],"annotation":"up-left arrow","tags":["arrow","direction","intercardinal","northwest"],"emoji":"โ๏ธ","order":4170,"group":8,"version":0.6},{"shortcodes":["arrow_up_down"],"annotation":"up-down arrow","tags":["arrow"],"emoji":"โ๏ธ","order":4172,"group":8,"version":0.6},{"shortcodes":["left_right_arrow"],"annotation":"left-right arrow","tags":["arrow"],"emoji":"โ๏ธ","order":4174,"group":8,"version":0.6},{"shortcodes":["arrow_left_hook","leftwards_arrow_with_hook"],"annotation":"right arrow curving left","tags":["arrow"],"emoji":"โฉ๏ธ","order":4176,"group":8,"version":0.6},{"shortcodes":["arrow_right_hook","rightwards_arrow_with_hook"],"annotation":"left arrow curving right","tags":["arrow"],"emoji":"โช๏ธ","order":4178,"group":8,"version":0.6},{"shortcodes":["arrow_heading_up"],"annotation":"right arrow curving up","tags":["arrow"],"emoji":"โคด๏ธ","order":4180,"group":8,"version":0.6},{"shortcodes":["arrow_heading_down"],"annotation":"right arrow curving down","tags":["arrow","down"],"emoji":"โคต๏ธ","order":4182,"group":8,"version":0.6},{"shortcodes":["arrows_clockwise","clockwise"],"annotation":"clockwise vertical arrows","tags":["arrow","clockwise","reload"],"emoji":"๐","order":4183,"group":8,"version":0.6},{"shortcodes":["arrows_counterclockwise","counterclockwise"],"annotation":"counterclockwise arrows button","tags":["anticlockwise","arrow","counterclockwise","withershins"],"emoji":"๐","order":4184,"group":8,"version":1},{"shortcodes":["back"],"annotation":"BACK arrow","tags":["arrow","back"],"emoji":"๐","order":4185,"group":8,"version":0.6},{"shortcodes":["end"],"annotation":"END arrow","tags":["arrow","end"],"emoji":"๐","order":4186,"group":8,"version":0.6},{"shortcodes":["on"],"annotation":"ON! arrow","tags":["arrow","mark","on","on!"],"emoji":"๐","order":4187,"group":8,"version":0.6},{"shortcodes":["soon"],"annotation":"SOON arrow","tags":["arrow","soon"],"emoji":"๐","order":4188,"group":8,"version":0.6},{"shortcodes":["top"],"annotation":"TOP arrow","tags":["arrow","top","up"],"emoji":"๐","order":4189,"group":8,"version":0.6},{"shortcodes":["place_of_worship"],"annotation":"place of worship","tags":["religion","worship"],"emoji":"๐","order":4190,"group":8,"version":1},{"shortcodes":["atom","atom_symbol"],"annotation":"atom symbol","tags":["atheist","atom"],"emoji":"โ๏ธ","order":4192,"group":8,"version":1},{"shortcodes":["om"],"annotation":"om","tags":["hindu","religion"],"emoji":"๐๏ธ","order":4194,"group":8,"version":0.7},{"shortcodes":["star_of_david"],"annotation":"star of David","tags":["david","jew","jewish","religion","star","star of david"],"emoji":"โก๏ธ","order":4196,"group":8,"version":0.7},{"shortcodes":["wheel_of_dharma"],"annotation":"wheel of dharma","tags":["buddhist","dharma","religion","wheel"],"emoji":"โธ๏ธ","order":4198,"group":8,"version":0.7},{"shortcodes":["yin_yang"],"annotation":"yin yang","tags":["religion","tao","taoist","yang","yin"],"emoji":"โฏ๏ธ","order":4200,"group":8,"version":0.7},{"shortcodes":["latin_cross"],"annotation":"latin cross","tags":["christian","cross","religion"],"emoji":"โ๏ธ","order":4202,"group":8,"version":0.7},{"shortcodes":["orthodox_cross"],"annotation":"orthodox cross","tags":["christian","cross","religion"],"emoji":"โฆ๏ธ","order":4204,"group":8,"version":1},{"shortcodes":["star_and_crescent"],"annotation":"star and crescent","tags":["islam","muslim","religion"],"emoji":"โช๏ธ","order":4206,"group":8,"version":0.7},{"shortcodes":["peace","peace_symbol"],"annotation":"peace symbol","tags":["peace"],"emoji":"โฎ๏ธ","order":4208,"group":8,"version":1},{"shortcodes":["menorah"],"annotation":"menorah","tags":["candelabrum","candlestick","religion"],"emoji":"๐","order":4209,"group":8,"version":1},{"shortcodes":["six_pointed_star"],"annotation":"dotted six-pointed star","tags":["fortune","star"],"emoji":"๐ฏ","order":4210,"group":8,"version":0.6},{"shortcodes":["aries"],"annotation":"Aries","tags":["aries","ram","zodiac"],"emoji":"โ๏ธ","order":4211,"group":8,"version":0.6},{"shortcodes":["taurus"],"annotation":"Taurus","tags":["bull","ox","taurus","zodiac"],"emoji":"โ๏ธ","order":4212,"group":8,"version":0.6},{"shortcodes":["gemini"],"annotation":"Gemini","tags":["gemini","twins","zodiac"],"emoji":"โ๏ธ","order":4213,"group":8,"version":0.6},{"shortcodes":["cancer"],"annotation":"Cancer","tags":["cancer","crab","zodiac"],"emoji":"โ๏ธ","order":4214,"group":8,"version":0.6},{"shortcodes":["leo"],"annotation":"Leo","tags":["leo","lion","zodiac"],"emoji":"โ๏ธ","order":4215,"group":8,"version":0.6},{"shortcodes":["virgo"],"annotation":"Virgo","tags":["virgo","zodiac"],"emoji":"โ๏ธ","order":4216,"group":8,"version":0.6},{"shortcodes":["libra"],"annotation":"Libra","tags":["balance","justice","libra","scales","zodiac"],"emoji":"โ๏ธ","order":4217,"group":8,"version":0.6},{"shortcodes":["scorpius"],"annotation":"Scorpio","tags":["scorpio","scorpion","scorpius","zodiac"],"emoji":"โ๏ธ","order":4218,"group":8,"version":0.6},{"shortcodes":["sagittarius"],"annotation":"Sagittarius","tags":["archer","sagittarius","zodiac"],"emoji":"โ๏ธ","order":4219,"group":8,"version":0.6},{"shortcodes":["capricorn"],"annotation":"Capricorn","tags":["capricorn","goat","zodiac"],"emoji":"โ๏ธ","order":4220,"group":8,"version":0.6},{"shortcodes":["aquarius"],"annotation":"Aquarius","tags":["aquarius","bearer","water","zodiac"],"emoji":"โ๏ธ","order":4221,"group":8,"version":0.6},{"shortcodes":["pisces"],"annotation":"Pisces","tags":["fish","pisces","zodiac"],"emoji":"โ๏ธ","order":4222,"group":8,"version":0.6},{"shortcodes":["ophiuchus"],"annotation":"Ophiuchus","tags":["bearer","ophiuchus","serpent","snake","zodiac"],"emoji":"โ","order":4223,"group":8,"version":0.6},{"shortcodes":["shuffle","twisted_rightwards_arrows"],"annotation":"shuffle tracks button","tags":["arrow","crossed"],"emoji":"๐","order":4224,"group":8,"version":1},{"shortcodes":["repeat"],"annotation":"repeat button","tags":["arrow","clockwise","repeat"],"emoji":"๐","order":4225,"group":8,"version":1},{"shortcodes":["repeat_one"],"annotation":"repeat single button","tags":["arrow","clockwise","once"],"emoji":"๐","order":4226,"group":8,"version":1},{"shortcodes":["arrow_forward","play"],"annotation":"play button","tags":["arrow","play","right","triangle"],"emoji":"โถ๏ธ","order":4228,"group":8,"version":0.6},{"shortcodes":["fast_forward"],"annotation":"fast-forward button","tags":["arrow","double","fast","forward"],"emoji":"โฉ๏ธ","order":4229,"group":8,"version":0.6},{"shortcodes":["next_track"],"annotation":"next track button","tags":["arrow","next scene","next track","triangle"],"emoji":"โญ๏ธ","order":4231,"group":8,"version":0.7},{"shortcodes":["play_pause"],"annotation":"play or pause button","tags":["arrow","pause","play","right","triangle"],"emoji":"โฏ๏ธ","order":4233,"group":8,"version":1},{"shortcodes":["arrow_backward","reverse"],"annotation":"reverse button","tags":["arrow","left","reverse","triangle"],"emoji":"โ๏ธ","order":4235,"group":8,"version":0.6},{"shortcodes":["fast_reverse","rewind"],"annotation":"fast reverse button","tags":["arrow","double","rewind"],"emoji":"โช๏ธ","order":4236,"group":8,"version":0.6},{"shortcodes":["previous_track"],"annotation":"last track button","tags":["arrow","previous scene","previous track","triangle"],"emoji":"โฎ๏ธ","order":4238,"group":8,"version":0.7},{"shortcodes":["arrow_up_small","up"],"annotation":"upwards button","tags":["arrow","button","red"],"emoji":"๐ผ","order":4239,"group":8,"version":0.6},{"shortcodes":["arrow_double_up","fast_up"],"annotation":"fast up button","tags":["arrow","double"],"emoji":"โซ","order":4240,"group":8,"version":0.6},{"shortcodes":["arrow_down_small","down"],"annotation":"downwards button","tags":["arrow","button","down","red"],"emoji":"๐ฝ","order":4241,"group":8,"version":0.6},{"shortcodes":["arrow_double_down","fast_down"],"annotation":"fast down button","tags":["arrow","double","down"],"emoji":"โฌ","order":4242,"group":8,"version":0.6},{"shortcodes":["pause"],"annotation":"pause button","tags":["bar","double","pause","vertical"],"emoji":"โธ๏ธ","order":4244,"group":8,"version":0.7},{"shortcodes":["stop"],"annotation":"stop button","tags":["square","stop"],"emoji":"โน๏ธ","order":4246,"group":8,"version":0.7},{"shortcodes":["record"],"annotation":"record button","tags":["circle","record"],"emoji":"โบ๏ธ","order":4248,"group":8,"version":0.7},{"shortcodes":["eject"],"annotation":"eject button","tags":["eject"],"emoji":"โ๏ธ","order":4250,"group":8,"version":1},{"shortcodes":["cinema"],"annotation":"cinema","tags":["camera","film","movie"],"emoji":"๐ฆ","order":4251,"group":8,"version":0.6},{"shortcodes":["dim_button","low_brightness"],"annotation":"dim button","tags":["brightness","dim","low"],"emoji":"๐ ","order":4252,"group":8,"version":1},{"shortcodes":["bright_button","high_brightness"],"annotation":"bright button","tags":["bright","brightness"],"emoji":"๐","order":4253,"group":8,"version":1},{"shortcodes":["antenna_bars","signal_strength"],"annotation":"antenna bars","tags":["antenna","bar","cell","mobile","phone"],"emoji":"๐ถ","order":4254,"group":8,"version":0.6},{"shortcodes":["vibration_mode"],"annotation":"vibration mode","tags":["cell","mobile","mode","phone","telephone","vibration"],"emoji":"๐ณ","order":4255,"group":8,"version":0.6},{"shortcodes":["mobile_phone_off"],"annotation":"mobile phone off","tags":["cell","mobile","off","phone","telephone"],"emoji":"๐ด","order":4256,"group":8,"version":0.6},{"shortcodes":["female","female_sign"],"annotation":"female sign","tags":["woman"],"emoji":"โ๏ธ","order":4258,"group":8,"version":4},{"shortcodes":["male","male_sign"],"annotation":"male sign","tags":["man"],"emoji":"โ๏ธ","order":4260,"group":8,"version":4},{"shortcodes":["transgender_symbol"],"annotation":"transgender symbol","tags":["transgender"],"emoji":"โง๏ธ","order":4262,"group":8,"version":13},{"shortcodes":["multiplication","multiply"],"annotation":"multiply","tags":["cancel","multiplication","sign","x","ร"],"emoji":"โ๏ธ","order":4264,"group":8,"version":0.6},{"shortcodes":["plus"],"annotation":"plus","tags":["+","math","sign"],"emoji":"โ","order":4265,"group":8,"version":0.6},{"shortcodes":["minus"],"annotation":"minus","tags":["-","math","sign","โ"],"emoji":"โ","order":4266,"group":8,"version":0.6},{"shortcodes":["divide","division"],"annotation":"divide","tags":["division","math","sign","รท"],"emoji":"โ","order":4267,"group":8,"version":0.6},{"shortcodes":["heavy_equals_sign"],"annotation":"heavy equals sign","tags":["equality","math"],"emoji":"๐ฐ","order":4268,"group":8,"version":14},{"shortcodes":["infinity"],"annotation":"infinity","tags":["forever","unbounded","universal"],"emoji":"โพ๏ธ","order":4270,"group":8,"version":11},{"shortcodes":["bangbang","double_exclamation"],"annotation":"double exclamation mark","tags":["!","!!","bangbang","exclamation","mark"],"emoji":"โผ๏ธ","order":4272,"group":8,"version":0.6},{"shortcodes":["exclamation_question","interrobang"],"annotation":"exclamation question mark","tags":["!","!?","?","exclamation","interrobang","mark","punctuation","question"],"emoji":"โ๏ธ","order":4274,"group":8,"version":0.6},{"shortcodes":["question"],"annotation":"red question mark","tags":["?","mark","punctuation","question"],"emoji":"โ๏ธ","order":4275,"group":8,"version":0.6},{"shortcodes":["white_question"],"annotation":"white question mark","tags":["?","mark","outlined","punctuation","question"],"emoji":"โ","order":4276,"group":8,"version":0.6},{"shortcodes":["white_exclamation"],"annotation":"white exclamation mark","tags":["!","exclamation","mark","outlined","punctuation"],"emoji":"โ","order":4277,"group":8,"version":0.6},{"shortcodes":["exclamation"],"annotation":"red exclamation mark","tags":["!","exclamation","mark","punctuation"],"emoji":"โ๏ธ","order":4278,"group":8,"version":0.6},{"shortcodes":["wavy_dash"],"annotation":"wavy dash","tags":["dash","punctuation","wavy"],"emoji":"ใฐ๏ธ","order":4280,"group":8,"version":0.6},{"shortcodes":["currency_exchange"],"annotation":"currency exchange","tags":["bank","currency","exchange","money"],"emoji":"๐ฑ","order":4281,"group":8,"version":0.6},{"shortcodes":["heavy_dollar_sign"],"annotation":"heavy dollar sign","tags":["currency","dollar","money"],"emoji":"๐ฒ","order":4282,"group":8,"version":0.6},{"shortcodes":["medical","medical_symbol"],"annotation":"medical symbol","tags":["aesculapius","medicine","staff"],"emoji":"โ๏ธ","order":4284,"group":8,"version":4},{"shortcodes":["recycle","recycling_symbol"],"annotation":"recycling symbol","tags":["recycle"],"emoji":"โป๏ธ","order":4286,"group":8,"version":0.6},{"shortcodes":["fleur-de-lis"],"annotation":"fleur-de-lis","tags":["fleur-de-lis"],"emoji":"โ๏ธ","order":4288,"group":8,"version":1},{"shortcodes":["trident"],"annotation":"trident emblem","tags":["anchor","emblem","ship","tool","trident"],"emoji":"๐ฑ","order":4289,"group":8,"version":0.6},{"shortcodes":["name_badge"],"annotation":"name badge","tags":["badge","name"],"emoji":"๐","order":4290,"group":8,"version":0.6},{"shortcodes":["beginner"],"annotation":"Japanese symbol for beginner","tags":["beginner","chevron","japanese","japanese symbol for beginner","leaf"],"emoji":"๐ฐ","order":4291,"group":8,"version":0.6},{"shortcodes":["hollow_red_circle","red_o"],"annotation":"hollow red circle","tags":["circle","large","o","red"],"emoji":"โญ๏ธ","order":4292,"group":8,"version":0.6},{"shortcodes":["check_mark_button","white_check_mark"],"annotation":"check mark button","tags":["button","check","mark","โ"],"emoji":"โ ","order":4293,"group":8,"version":0.6},{"shortcodes":["ballot_box_with_check"],"annotation":"check box with check","tags":["box","check","โ"],"emoji":"โ๏ธ","order":4295,"group":8,"version":0.6},{"shortcodes":["check_mark","heavy_check_mark"],"annotation":"check mark","tags":["check","mark","โ"],"emoji":"โ๏ธ","order":4297,"group":8,"version":0.6},{"shortcodes":["cross_mark","x"],"annotation":"cross mark","tags":["cancel","cross","mark","multiplication","multiply","x","ร"],"emoji":"โ","order":4298,"group":8,"version":0.6},{"shortcodes":["cross_mark_button","negative_squared_cross_mark"],"annotation":"cross mark button","tags":["mark","square","x","ร"],"emoji":"โ","order":4299,"group":8,"version":0.6},{"shortcodes":["curly_loop"],"annotation":"curly loop","tags":["curl","loop"],"emoji":"โฐ","order":4300,"group":8,"version":0.6},{"shortcodes":["double_curly_loop","loop"],"annotation":"double curly loop","tags":["curl","double","loop"],"emoji":"โฟ","order":4301,"group":8,"version":1},{"shortcodes":["part_alternation_mark"],"annotation":"part alternation mark","tags":["mark","part"],"emoji":"ใฝ๏ธ","order":4303,"group":8,"version":0.6},{"shortcodes":["eight_spoked_asterisk"],"annotation":"eight-spoked asterisk","tags":["*","asterisk"],"emoji":"โณ๏ธ","order":4305,"group":8,"version":0.6},{"shortcodes":["eight_pointed_black_star"],"annotation":"eight-pointed star","tags":["*","star"],"emoji":"โด๏ธ","order":4307,"group":8,"version":0.6},{"shortcodes":["sparkle"],"annotation":"sparkle","tags":["*"],"emoji":"โ๏ธ","order":4309,"group":8,"version":0.6},{"shortcodes":["copyright"],"annotation":"copyright","tags":["c"],"emoji":"ยฉ๏ธ","order":4311,"group":8,"version":0.6},{"shortcodes":["registered"],"annotation":"registered","tags":["r"],"emoji":"ยฎ๏ธ","order":4313,"group":8,"version":0.6},{"shortcodes":["tm","trade_mark"],"annotation":"trade mark","tags":["mark","tm","trademark"],"emoji":"โข๏ธ","order":4315,"group":8,"version":0.6},{"shortcodes":["hash","number_sign"],"annotation":"keycap: #","tags":["keycap"],"emoji":"#๏ธโฃ","order":4316,"group":8,"version":0.6},{"shortcodes":["asterisk"],"annotation":"keycap: *","tags":["keycap"],"emoji":"*๏ธโฃ","order":4318,"group":8,"version":2},{"shortcodes":["zero"],"annotation":"keycap: 0","tags":["keycap"],"emoji":"0๏ธโฃ","order":4320,"group":8,"version":0.6},{"shortcodes":["one"],"annotation":"keycap: 1","tags":["keycap"],"emoji":"1๏ธโฃ","order":4322,"group":8,"version":0.6},{"shortcodes":["two"],"annotation":"keycap: 2","tags":["keycap"],"emoji":"2๏ธโฃ","order":4324,"group":8,"version":0.6},{"shortcodes":["three"],"annotation":"keycap: 3","tags":["keycap"],"emoji":"3๏ธโฃ","order":4326,"group":8,"version":0.6},{"shortcodes":["four"],"annotation":"keycap: 4","tags":["keycap"],"emoji":"4๏ธโฃ","order":4328,"group":8,"version":0.6},{"shortcodes":["five"],"annotation":"keycap: 5","tags":["keycap"],"emoji":"5๏ธโฃ","order":4330,"group":8,"version":0.6},{"shortcodes":["six"],"annotation":"keycap: 6","tags":["keycap"],"emoji":"6๏ธโฃ","order":4332,"group":8,"version":0.6},{"shortcodes":["seven"],"annotation":"keycap: 7","tags":["keycap"],"emoji":"7๏ธโฃ","order":4334,"group":8,"version":0.6},{"shortcodes":["eight"],"annotation":"keycap: 8","tags":["keycap"],"emoji":"8๏ธโฃ","order":4336,"group":8,"version":0.6},{"shortcodes":["nine"],"annotation":"keycap: 9","tags":["keycap"],"emoji":"9๏ธโฃ","order":4338,"group":8,"version":0.6},{"shortcodes":["ten"],"annotation":"keycap: 10","tags":["keycap"],"emoji":"๐","order":4340,"group":8,"version":0.6},{"shortcodes":["capital_abcd"],"annotation":"input latin uppercase","tags":["abcd","input","latin","letters","uppercase"],"emoji":"๐ ","order":4341,"group":8,"version":0.6},{"shortcodes":["abcd"],"annotation":"input latin lowercase","tags":["abcd","input","latin","letters","lowercase"],"emoji":"๐ก","order":4342,"group":8,"version":0.6},{"shortcodes":["1234"],"annotation":"input numbers","tags":["1234","input","numbers"],"emoji":"๐ข","order":4343,"group":8,"version":0.6},{"shortcodes":["symbols"],"annotation":"input symbols","tags":["input","ใโช&%"],"emoji":"๐ฃ","order":4344,"group":8,"version":0.6},{"shortcodes":["abc"],"annotation":"input latin letters","tags":["abc","alphabet","input","latin","letters"],"emoji":"๐ค","order":4345,"group":8,"version":0.6},{"shortcodes":["a","a_blood"],"annotation":"A button (blood type)","tags":["a","a button (blood type)","blood type"],"emoji":"๐ ฐ๏ธ","order":4347,"group":8,"version":0.6},{"shortcodes":["ab","ab_blood"],"annotation":"AB button (blood type)","tags":["ab","ab button (blood type)","blood type"],"emoji":"๐","order":4348,"group":8,"version":0.6},{"shortcodes":["b","b_blood"],"annotation":"B button (blood type)","tags":["b","b button (blood type)","blood type"],"emoji":"๐ ฑ๏ธ","order":4350,"group":8,"version":0.6},{"shortcodes":["cl"],"annotation":"CL button","tags":["cl","cl button"],"emoji":"๐","order":4351,"group":8,"version":0.6},{"shortcodes":["cool"],"annotation":"COOL button","tags":["cool","cool button"],"emoji":"๐","order":4352,"group":8,"version":0.6},{"shortcodes":["free"],"annotation":"FREE button","tags":["free","free button"],"emoji":"๐","order":4353,"group":8,"version":0.6},{"shortcodes":["info","information_source"],"annotation":"information","tags":["i"],"emoji":"โน๏ธ","order":4355,"group":8,"version":0.6},{"shortcodes":["id"],"annotation":"ID button","tags":["id","id button","identity"],"emoji":"๐","order":4356,"group":8,"version":0.6},{"shortcodes":["m"],"annotation":"circled M","tags":["circle","circled m","m"],"emoji":"โ๏ธ","order":4358,"group":8,"version":0.6},{"shortcodes":["new"],"annotation":"NEW button","tags":["new","new button"],"emoji":"๐","order":4359,"group":8,"version":0.6},{"shortcodes":["ng"],"annotation":"NG button","tags":["ng","ng button"],"emoji":"๐","order":4360,"group":8,"version":0.6},{"shortcodes":["o","o_blood"],"annotation":"O button (blood type)","tags":["blood type","o","o button (blood type)"],"emoji":"๐ พ๏ธ","order":4362,"group":8,"version":0.6},{"shortcodes":["ok"],"annotation":"OK button","tags":["ok","ok button"],"emoji":"๐","order":4363,"group":8,"version":0.6},{"shortcodes":["parking"],"annotation":"P button","tags":["p","p button","parking"],"emoji":"๐ ฟ๏ธ","order":4365,"group":8,"version":0.6},{"shortcodes":["sos"],"annotation":"SOS button","tags":["help","sos","sos button"],"emoji":"๐","order":4366,"group":8,"version":0.6},{"shortcodes":["up2"],"annotation":"UP! button","tags":["mark","up","up!","up! button"],"emoji":"๐","order":4367,"group":8,"version":0.6},{"shortcodes":["vs"],"annotation":"VS button","tags":["versus","vs","vs button"],"emoji":"๐","order":4368,"group":8,"version":0.6},{"shortcodes":["ja_here","koko"],"annotation":"Japanese โhereโ button","tags":["japanese","japanese โhereโ button","katakana","โhereโ","ใณใณ"],"emoji":"๐","order":4369,"group":8,"version":0.6},{"shortcodes":["ja_service_charge"],"annotation":"Japanese โservice chargeโ button","tags":["japanese","japanese โservice chargeโ button","katakana","โservice chargeโ","ใต"],"emoji":"๐๏ธ","order":4371,"group":8,"version":0.6},{"shortcodes":["ja_monthly_amount"],"annotation":"Japanese โmonthly amountโ button","tags":["ideograph","japanese","japanese โmonthly amountโ button","โmonthly amountโ","ๆ"],"emoji":"๐ท๏ธ","order":4373,"group":8,"version":0.6},{"shortcodes":["ja_not_free_of_carge"],"annotation":"Japanese โnot free of chargeโ button","tags":["ideograph","japanese","japanese โnot free of chargeโ button","โnot free of chargeโ","ๆ"],"emoji":"๐ถ","order":4374,"group":8,"version":0.6},{"shortcodes":["ja_reserved"],"annotation":"Japanese โreservedโ button","tags":["ideograph","japanese","japanese โreservedโ button","โreservedโ","ๆ"],"emoji":"๐ฏ๏ธ","order":4375,"group":8,"version":0.6},{"shortcodes":["ideograph_advantage","ja_bargain"],"annotation":"Japanese โbargainโ button","tags":["ideograph","japanese","japanese โbargainโ button","โbargainโ","ๅพ"],"emoji":"๐","order":4376,"group":8,"version":0.6},{"shortcodes":["ja_discount"],"annotation":"Japanese โdiscountโ button","tags":["ideograph","japanese","japanese โdiscountโ button","โdiscountโ","ๅฒ"],"emoji":"๐น","order":4377,"group":8,"version":0.6},{"shortcodes":["ja_free_of_charge"],"annotation":"Japanese โfree of chargeโ button","tags":["ideograph","japanese","japanese โfree of chargeโ button","โfree of chargeโ","็ก"],"emoji":"๐๏ธ","order":4378,"group":8,"version":0.6},{"shortcodes":["ja_prohibited"],"annotation":"Japanese โprohibitedโ button","tags":["ideograph","japanese","japanese โprohibitedโ button","โprohibitedโ","็ฆ"],"emoji":"๐ฒ","order":4379,"group":8,"version":0.6},{"shortcodes":["accept","ja_acceptable"],"annotation":"Japanese โacceptableโ button","tags":["ideograph","japanese","japanese โacceptableโ button","โacceptableโ","ๅฏ"],"emoji":"๐","order":4380,"group":8,"version":0.6},{"shortcodes":["ja_application"],"annotation":"Japanese โapplicationโ button","tags":["ideograph","japanese","japanese โapplicationโ button","โapplicationโ","็ณ"],"emoji":"๐ธ","order":4381,"group":8,"version":0.6},{"shortcodes":["ja_passing_grade"],"annotation":"Japanese โpassing gradeโ button","tags":["ideograph","japanese","japanese โpassing gradeโ button","โpassing gradeโ","ๅ"],"emoji":"๐ด","order":4382,"group":8,"version":0.6},{"shortcodes":["ja_vacancy"],"annotation":"Japanese โvacancyโ button","tags":["ideograph","japanese","japanese โvacancyโ button","โvacancyโ","็ฉบ"],"emoji":"๐ณ","order":4383,"group":8,"version":0.6},{"shortcodes":["congratulations","ja_congratulations"],"annotation":"Japanese โcongratulationsโ button","tags":["ideograph","japanese","japanese โcongratulationsโ button","โcongratulationsโ","็ฅ"],"emoji":"ใ๏ธ","order":4385,"group":8,"version":0.6},{"shortcodes":["ja_secret","secret"],"annotation":"Japanese โsecretโ button","tags":["ideograph","japanese","japanese โsecretโ button","โsecretโ","็ง"],"emoji":"ใ๏ธ","order":4387,"group":8,"version":0.6},{"shortcodes":["ja_open_for_business"],"annotation":"Japanese โopen for businessโ button","tags":["ideograph","japanese","japanese โopen for businessโ button","โopen for businessโ","ๅถ"],"emoji":"๐บ","order":4388,"group":8,"version":0.6},{"shortcodes":["ja_no_vacancy"],"annotation":"Japanese โno vacancyโ button","tags":["ideograph","japanese","japanese โno vacancyโ button","โno vacancyโ","ๆบ"],"emoji":"๐ต","order":4389,"group":8,"version":0.6},{"shortcodes":["red_circle"],"annotation":"red circle","tags":["circle","geometric","red"],"emoji":"๐ด","order":4390,"group":8,"version":0.6},{"shortcodes":["orange_circle"],"annotation":"orange circle","tags":["circle","orange"],"emoji":"๐ ","order":4391,"group":8,"version":12},{"shortcodes":["yellow_circle"],"annotation":"yellow circle","tags":["circle","yellow"],"emoji":"๐ก","order":4392,"group":8,"version":12},{"shortcodes":["green_circle"],"annotation":"green circle","tags":["circle","green"],"emoji":"๐ข","order":4393,"group":8,"version":12},{"shortcodes":["blue_circle"],"annotation":"blue circle","tags":["blue","circle","geometric"],"emoji":"๐ต","order":4394,"group":8,"version":0.6},{"shortcodes":["purple_circle"],"annotation":"purple circle","tags":["circle","purple"],"emoji":"๐ฃ","order":4395,"group":8,"version":12},{"shortcodes":["brown_circle"],"annotation":"brown circle","tags":["brown","circle"],"emoji":"๐ค","order":4396,"group":8,"version":12},{"shortcodes":["black_circle"],"annotation":"black circle","tags":["circle","geometric"],"emoji":"โซ๏ธ","order":4397,"group":8,"version":0.6},{"shortcodes":["white_circle"],"annotation":"white circle","tags":["circle","geometric"],"emoji":"โช๏ธ","order":4398,"group":8,"version":0.6},{"shortcodes":["red_square"],"annotation":"red square","tags":["red","square"],"emoji":"๐ฅ","order":4399,"group":8,"version":12},{"shortcodes":["orange_square"],"annotation":"orange square","tags":["orange","square"],"emoji":"๐ง","order":4400,"group":8,"version":12},{"shortcodes":["yellow_square"],"annotation":"yellow square","tags":["square","yellow"],"emoji":"๐จ","order":4401,"group":8,"version":12},{"shortcodes":["green_square"],"annotation":"green square","tags":["green","square"],"emoji":"๐ฉ","order":4402,"group":8,"version":12},{"shortcodes":["blue_square"],"annotation":"blue square","tags":["blue","square"],"emoji":"๐ฆ","order":4403,"group":8,"version":12},{"shortcodes":["purple_square"],"annotation":"purple square","tags":["purple","square"],"emoji":"๐ช","order":4404,"group":8,"version":12},{"shortcodes":["brown_square"],"annotation":"brown square","tags":["brown","square"],"emoji":"๐ซ","order":4405,"group":8,"version":12},{"shortcodes":["black_large_square"],"annotation":"black large square","tags":["geometric","square"],"emoji":"โฌ๏ธ","order":4406,"group":8,"version":0.6},{"shortcodes":["white_large_square"],"annotation":"white large square","tags":["geometric","square"],"emoji":"โฌ๏ธ","order":4407,"group":8,"version":0.6},{"shortcodes":["black_medium_square"],"annotation":"black medium square","tags":["geometric","square"],"emoji":"โผ๏ธ","order":4409,"group":8,"version":0.6},{"shortcodes":["white_medium_square"],"annotation":"white medium square","tags":["geometric","square"],"emoji":"โป๏ธ","order":4411,"group":8,"version":0.6},{"shortcodes":["black_medium_small_square"],"annotation":"black medium-small square","tags":["geometric","square"],"emoji":"โพ๏ธ","order":4412,"group":8,"version":0.6},{"shortcodes":["white_medium_small_square"],"annotation":"white medium-small square","tags":["geometric","square"],"emoji":"โฝ๏ธ","order":4413,"group":8,"version":0.6},{"shortcodes":["black_small_square"],"annotation":"black small square","tags":["geometric","square"],"emoji":"โช๏ธ","order":4415,"group":8,"version":0.6},{"shortcodes":["white_small_square"],"annotation":"white small square","tags":["geometric","square"],"emoji":"โซ๏ธ","order":4417,"group":8,"version":0.6},{"shortcodes":["large_orange_diamond"],"annotation":"large orange diamond","tags":["diamond","geometric","orange"],"emoji":"๐ถ","order":4418,"group":8,"version":0.6},{"shortcodes":["large_blue_diamond"],"annotation":"large blue diamond","tags":["blue","diamond","geometric"],"emoji":"๐ท","order":4419,"group":8,"version":0.6},{"shortcodes":["small_orange_diamond"],"annotation":"small orange diamond","tags":["diamond","geometric","orange"],"emoji":"๐ธ","order":4420,"group":8,"version":0.6},{"shortcodes":["small_blue_diamond"],"annotation":"small blue diamond","tags":["blue","diamond","geometric"],"emoji":"๐น","order":4421,"group":8,"version":0.6},{"shortcodes":["small_red_triangle"],"annotation":"red triangle pointed up","tags":["geometric","red"],"emoji":"๐บ","order":4422,"group":8,"version":0.6},{"shortcodes":["small_red_triangle_down"],"annotation":"red triangle pointed down","tags":["down","geometric","red"],"emoji":"๐ป","order":4423,"group":8,"version":0.6},{"shortcodes":["diamond_shape_with_a_dot_inside","diamond_with_a_dot"],"annotation":"diamond with a dot","tags":["comic","diamond","geometric","inside"],"emoji":"๐ ","order":4424,"group":8,"version":0.6},{"shortcodes":["radio_button"],"annotation":"radio button","tags":["button","geometric","radio"],"emoji":"๐","order":4425,"group":8,"version":0.6},{"shortcodes":["white_square_button"],"annotation":"white square button","tags":["button","geometric","outlined","square"],"emoji":"๐ณ","order":4426,"group":8,"version":0.6},{"shortcodes":["black_square_button"],"annotation":"black square button","tags":["button","geometric","square"],"emoji":"๐ฒ","order":4427,"group":8,"version":0.6},{"shortcodes":["checkered_flag"],"annotation":"chequered flag","tags":["checkered","chequered","racing"],"emoji":"๐","order":4428,"group":9,"version":0.6},{"shortcodes":["triangular_flag","triangular_flag_on_post"],"annotation":"triangular flag","tags":["post"],"emoji":"๐ฉ","order":4429,"group":9,"version":0.6},{"shortcodes":["crossed_flags"],"annotation":"crossed flags","tags":["celebration","cross","crossed","japanese"],"emoji":"๐","order":4430,"group":9,"version":0.6},{"shortcodes":["black_flag"],"annotation":"black flag","tags":["waving"],"emoji":"๐ด","order":4431,"group":9,"version":1},{"shortcodes":["white_flag"],"annotation":"white flag","tags":["waving"],"emoji":"๐ณ๏ธ","order":4433,"group":9,"version":0.7},{"shortcodes":["rainbow_flag"],"annotation":"rainbow flag","tags":["pride","rainbow"],"emoji":"๐ณ๏ธโ๐","order":4434,"group":9,"version":4},{"shortcodes":["transgender_flag"],"annotation":"transgender flag","tags":["flag","light blue","pink","transgender","white"],"emoji":"๐ณ๏ธโโง๏ธ","order":4436,"group":9,"version":13},{"shortcodes":["jolly_roger","pirate_flag"],"annotation":"pirate flag","tags":["jolly roger","pirate","plunder","treasure"],"emoji":"๐ดโโ ๏ธ","order":4440,"group":9,"version":11},{"shortcodes":["ascension_island","flag_ac"],"annotation":"flag: Ascension Island","tags":["AC","flag"],"emoji":"๐ฆ๐จ","order":4442,"group":9,"version":2},{"shortcodes":["andorra","flag_ad"],"annotation":"flag: Andorra","tags":["AD","flag"],"emoji":"๐ฆ๐ฉ","order":4443,"group":9,"version":2},{"shortcodes":["flag_ae","united_arab_emirates"],"annotation":"flag: United Arab Emirates","tags":["AE","flag"],"emoji":"๐ฆ๐ช","order":4444,"group":9,"version":2},{"shortcodes":["afghanistan","flag_af"],"annotation":"flag: Afghanistan","tags":["AF","flag"],"emoji":"๐ฆ๐ซ","order":4445,"group":9,"version":2},{"shortcodes":["antigua_barbuda","flag_ag"],"annotation":"flag: Antigua & Barbuda","tags":["AG","flag"],"emoji":"๐ฆ๐ฌ","order":4446,"group":9,"version":2},{"shortcodes":["anguilla","flag_ai"],"annotation":"flag: Anguilla","tags":["AI","flag"],"emoji":"๐ฆ๐ฎ","order":4447,"group":9,"version":2},{"shortcodes":["albania","flag_al"],"annotation":"flag: Albania","tags":["AL","flag"],"emoji":"๐ฆ๐ฑ","order":4448,"group":9,"version":2},{"shortcodes":["armenia","flag_am"],"annotation":"flag: Armenia","tags":["AM","flag"],"emoji":"๐ฆ๐ฒ","order":4449,"group":9,"version":2},{"shortcodes":["angola","flag_ao"],"annotation":"flag: Angola","tags":["AO","flag"],"emoji":"๐ฆ๐ด","order":4450,"group":9,"version":2},{"shortcodes":["antarctica","flag_aq"],"annotation":"flag: Antarctica","tags":["AQ","flag"],"emoji":"๐ฆ๐ถ","order":4451,"group":9,"version":2},{"shortcodes":["argentina","flag_ar"],"annotation":"flag: Argentina","tags":["AR","flag"],"emoji":"๐ฆ๐ท","order":4452,"group":9,"version":2},{"shortcodes":["american_samoa","flag_as"],"annotation":"flag: American Samoa","tags":["AS","flag"],"emoji":"๐ฆ๐ธ","order":4453,"group":9,"version":2},{"shortcodes":["austria","flag_at"],"annotation":"flag: Austria","tags":["AT","flag"],"emoji":"๐ฆ๐น","order":4454,"group":9,"version":2},{"shortcodes":["australia","flag_au"],"annotation":"flag: Australia","tags":["AU","flag"],"emoji":"๐ฆ๐บ","order":4455,"group":9,"version":2},{"shortcodes":["aruba","flag_aw"],"annotation":"flag: Aruba","tags":["AW","flag"],"emoji":"๐ฆ๐ผ","order":4456,"group":9,"version":2},{"shortcodes":["aland_islands","flag_ax"],"annotation":"flag: ร land Islands","tags":["AX","flag"],"emoji":"๐ฆ๐ฝ","order":4457,"group":9,"version":2},{"shortcodes":["azerbaijan","flag_az"],"annotation":"flag: Azerbaijan","tags":["AZ","flag"],"emoji":"๐ฆ๐ฟ","order":4458,"group":9,"version":2},{"shortcodes":["bosnia_herzegovina","flag_ba"],"annotation":"flag: Bosnia & Herzegovina","tags":["BA","flag"],"emoji":"๐ง๐ฆ","order":4459,"group":9,"version":2},{"shortcodes":["barbados","flag_bb"],"annotation":"flag: Barbados","tags":["BB","flag"],"emoji":"๐ง๐ง","order":4460,"group":9,"version":2},{"shortcodes":["bangladesh","flag_bd"],"annotation":"flag: Bangladesh","tags":["BD","flag"],"emoji":"๐ง๐ฉ","order":4461,"group":9,"version":2},{"shortcodes":["belgium","flag_be"],"annotation":"flag: Belgium","tags":["BE","flag"],"emoji":"๐ง๐ช","order":4462,"group":9,"version":2},{"shortcodes":["burkina_faso","flag_bf"],"annotation":"flag: Burkina Faso","tags":["BF","flag"],"emoji":"๐ง๐ซ","order":4463,"group":9,"version":2},{"shortcodes":["bulgaria","flag_bg"],"annotation":"flag: Bulgaria","tags":["BG","flag"],"emoji":"๐ง๐ฌ","order":4464,"group":9,"version":2},{"shortcodes":["bahrain","flag_bh"],"annotation":"flag: Bahrain","tags":["BH","flag"],"emoji":"๐ง๐ญ","order":4465,"group":9,"version":2},{"shortcodes":["burundi","flag_bi"],"annotation":"flag: Burundi","tags":["BI","flag"],"emoji":"๐ง๐ฎ","order":4466,"group":9,"version":2},{"shortcodes":["benin","flag_bj"],"annotation":"flag: Benin","tags":["BJ","flag"],"emoji":"๐ง๐ฏ","order":4467,"group":9,"version":2},{"shortcodes":["flag_bl","st_barthelemy"],"annotation":"flag: St. Barthรฉlemy","tags":["BL","flag"],"emoji":"๐ง๐ฑ","order":4468,"group":9,"version":2},{"shortcodes":["bermuda","flag_bm"],"annotation":"flag: Bermuda","tags":["BM","flag"],"emoji":"๐ง๐ฒ","order":4469,"group":9,"version":2},{"shortcodes":["brunei","flag_bn"],"annotation":"flag: Brunei","tags":["BN","flag"],"emoji":"๐ง๐ณ","order":4470,"group":9,"version":2},{"shortcodes":["bolivia","flag_bo"],"annotation":"flag: Bolivia","tags":["BO","flag"],"emoji":"๐ง๐ด","order":4471,"group":9,"version":2},{"shortcodes":["caribbean_netherlands","flag_bq"],"annotation":"flag: Caribbean Netherlands","tags":["BQ","flag"],"emoji":"๐ง๐ถ","order":4472,"group":9,"version":2},{"shortcodes":["brazil","flag_br"],"annotation":"flag: Brazil","tags":["BR","flag"],"emoji":"๐ง๐ท","order":4473,"group":9,"version":2},{"shortcodes":["bahamas","flag_bs"],"annotation":"flag: Bahamas","tags":["BS","flag"],"emoji":"๐ง๐ธ","order":4474,"group":9,"version":2},{"shortcodes":["bhutan","flag_bt"],"annotation":"flag: Bhutan","tags":["BT","flag"],"emoji":"๐ง๐น","order":4475,"group":9,"version":2},{"shortcodes":["bouvet_island","flag_bv"],"annotation":"flag: Bouvet Island","tags":["BV","flag"],"emoji":"๐ง๐ป","order":4476,"group":9,"version":2},{"shortcodes":["botswana","flag_bw"],"annotation":"flag: Botswana","tags":["BW","flag"],"emoji":"๐ง๐ผ","order":4477,"group":9,"version":2},{"shortcodes":["belarus","flag_by"],"annotation":"flag: Belarus","tags":["BY","flag"],"emoji":"๐ง๐พ","order":4478,"group":9,"version":2},{"shortcodes":["belize","flag_bz"],"annotation":"flag: Belize","tags":["BZ","flag"],"emoji":"๐ง๐ฟ","order":4479,"group":9,"version":2},{"shortcodes":["canada","flag_ca"],"annotation":"flag: Canada","tags":["CA","flag"],"emoji":"๐จ๐ฆ","order":4480,"group":9,"version":2},{"shortcodes":["cocos_islands","flag_cc"],"annotation":"flag: Cocos (Keeling) Islands","tags":["CC","flag"],"emoji":"๐จ๐จ","order":4481,"group":9,"version":2},{"shortcodes":["congo_kinshasa","flag_cd"],"annotation":"flag: Congo - Kinshasa","tags":["CD","flag"],"emoji":"๐จ๐ฉ","order":4482,"group":9,"version":2},{"shortcodes":["central_african_republic","flag_cf"],"annotation":"flag: Central African Republic","tags":["CF","flag"],"emoji":"๐จ๐ซ","order":4483,"group":9,"version":2},{"shortcodes":["congo_brazzaville","flag_cg"],"annotation":"flag: Congo - Brazzaville","tags":["CG","flag"],"emoji":"๐จ๐ฌ","order":4484,"group":9,"version":2},{"shortcodes":["flag_ch","switzerland"],"annotation":"flag: Switzerland","tags":["CH","flag"],"emoji":"๐จ๐ญ","order":4485,"group":9,"version":2},{"shortcodes":["cote_divoire","flag_ci"],"annotation":"flag: Cรดte dโIvoire","tags":["CI","flag"],"emoji":"๐จ๐ฎ","order":4486,"group":9,"version":2},{"shortcodes":["cook_islands","flag_ck"],"annotation":"flag: Cook Islands","tags":["CK","flag"],"emoji":"๐จ๐ฐ","order":4487,"group":9,"version":2},{"shortcodes":["chile","flag_cl"],"annotation":"flag: Chile","tags":["CL","flag"],"emoji":"๐จ๐ฑ","order":4488,"group":9,"version":2},{"shortcodes":["cameroon","flag_cm"],"annotation":"flag: Cameroon","tags":["CM","flag"],"emoji":"๐จ๐ฒ","order":4489,"group":9,"version":2},{"shortcodes":["china","flag_cn"],"annotation":"flag: China","tags":["CN","flag"],"emoji":"๐จ๐ณ","order":4490,"group":9,"version":0.6},{"shortcodes":["colombia","flag_co"],"annotation":"flag: Colombia","tags":["CO","flag"],"emoji":"๐จ๐ด","order":4491,"group":9,"version":2},{"shortcodes":["clipperton_island","flag_cp"],"annotation":"flag: Clipperton Island","tags":["CP","flag"],"emoji":"๐จ๐ต","order":4492,"group":9,"version":2},{"shortcodes":["costa_rica","flag_cr"],"annotation":"flag: Costa Rica","tags":["CR","flag"],"emoji":"๐จ๐ท","order":4493,"group":9,"version":2},{"shortcodes":["cuba","flag_cu"],"annotation":"flag: Cuba","tags":["CU","flag"],"emoji":"๐จ๐บ","order":4494,"group":9,"version":2},{"shortcodes":["cape_verde","flag_cv"],"annotation":"flag: Cape Verde","tags":["CV","flag"],"emoji":"๐จ๐ป","order":4495,"group":9,"version":2},{"shortcodes":["curacao","flag_cw"],"annotation":"flag: Curaรงao","tags":["CW","flag"],"emoji":"๐จ๐ผ","order":4496,"group":9,"version":2},{"shortcodes":["christmas_island","flag_cx"],"annotation":"flag: Christmas Island","tags":["CX","flag"],"emoji":"๐จ๐ฝ","order":4497,"group":9,"version":2},{"shortcodes":["cyprus","flag_cy"],"annotation":"flag: Cyprus","tags":["CY","flag"],"emoji":"๐จ๐พ","order":4498,"group":9,"version":2},{"shortcodes":["czech_republic","czechia","flag_cz"],"annotation":"flag: Czechia","tags":["CZ","flag"],"emoji":"๐จ๐ฟ","order":4499,"group":9,"version":2},{"shortcodes":["flag_de","germany"],"annotation":"flag: Germany","tags":["DE","flag"],"emoji":"๐ฉ๐ช","order":4500,"group":9,"version":0.6},{"shortcodes":["diego_garcia","flag_dg"],"annotation":"flag: Diego Garcia","tags":["DG","flag"],"emoji":"๐ฉ๐ฌ","order":4501,"group":9,"version":2},{"shortcodes":["djibouti","flag_dj"],"annotation":"flag: Djibouti","tags":["DJ","flag"],"emoji":"๐ฉ๐ฏ","order":4502,"group":9,"version":2},{"shortcodes":["denmark","flag_dk"],"annotation":"flag: Denmark","tags":["DK","flag"],"emoji":"๐ฉ๐ฐ","order":4503,"group":9,"version":2},{"shortcodes":["dominica","flag_dm"],"annotation":"flag: Dominica","tags":["DM","flag"],"emoji":"๐ฉ๐ฒ","order":4504,"group":9,"version":2},{"shortcodes":["dominican_republic","flag_do"],"annotation":"flag: Dominican Republic","tags":["DO","flag"],"emoji":"๐ฉ๐ด","order":4505,"group":9,"version":2},{"shortcodes":["algeria","flag_dz"],"annotation":"flag: Algeria","tags":["DZ","flag"],"emoji":"๐ฉ๐ฟ","order":4506,"group":9,"version":2},{"shortcodes":["ceuta_melilla","flag_ea"],"annotation":"flag: Ceuta & Melilla","tags":["EA","flag"],"emoji":"๐ช๐ฆ","order":4507,"group":9,"version":2},{"shortcodes":["ecuador","flag_ec"],"annotation":"flag: Ecuador","tags":["EC","flag"],"emoji":"๐ช๐จ","order":4508,"group":9,"version":2},{"shortcodes":["estonia","flag_ee"],"annotation":"flag: Estonia","tags":["EE","flag"],"emoji":"๐ช๐ช","order":4509,"group":9,"version":2},{"shortcodes":["egypt","flag_eg"],"annotation":"flag: Egypt","tags":["EG","flag"],"emoji":"๐ช๐ฌ","order":4510,"group":9,"version":2},{"shortcodes":["flag_eh","western_sahara"],"annotation":"flag: Western Sahara","tags":["EH","flag"],"emoji":"๐ช๐ญ","order":4511,"group":9,"version":2},{"shortcodes":["eritrea","flag_er"],"annotation":"flag: Eritrea","tags":["ER","flag"],"emoji":"๐ช๐ท","order":4512,"group":9,"version":2},{"shortcodes":["flag_es","spain"],"annotation":"flag: Spain","tags":["ES","flag"],"emoji":"๐ช๐ธ","order":4513,"group":9,"version":0.6},{"shortcodes":["ethiopia","flag_et"],"annotation":"flag: Ethiopia","tags":["ET","flag"],"emoji":"๐ช๐น","order":4514,"group":9,"version":2},{"shortcodes":["european_union","flag_eu"],"annotation":"flag: European Union","tags":["EU","flag"],"emoji":"๐ช๐บ","order":4515,"group":9,"version":2},{"shortcodes":["finland","flag_fi"],"annotation":"flag: Finland","tags":["FI","flag"],"emoji":"๐ซ๐ฎ","order":4516,"group":9,"version":2},{"shortcodes":["fiji","flag_fj"],"annotation":"flag: Fiji","tags":["FJ","flag"],"emoji":"๐ซ๐ฏ","order":4517,"group":9,"version":2},{"shortcodes":["falkland_islands","flag_fk"],"annotation":"flag: Falkland Islands","tags":["FK","flag"],"emoji":"๐ซ๐ฐ","order":4518,"group":9,"version":2},{"shortcodes":["flag_fm","micronesia"],"annotation":"flag: Micronesia","tags":["FM","flag"],"emoji":"๐ซ๐ฒ","order":4519,"group":9,"version":2},{"shortcodes":["faroe_islands","flag_fo"],"annotation":"flag: Faroe Islands","tags":["FO","flag"],"emoji":"๐ซ๐ด","order":4520,"group":9,"version":2},{"shortcodes":["flag_fr","france"],"annotation":"flag: France","tags":["FR","flag"],"emoji":"๐ซ๐ท","order":4521,"group":9,"version":0.6},{"shortcodes":["flag_ga","gabon"],"annotation":"flag: Gabon","tags":["GA","flag"],"emoji":"๐ฌ๐ฆ","order":4522,"group":9,"version":2},{"shortcodes":["flag_gb","uk","united_kingdom"],"annotation":"flag: United Kingdom","tags":["GB","flag"],"emoji":"๐ฌ๐ง","order":4523,"group":9,"version":0.6},{"shortcodes":["flag_gd","grenada"],"annotation":"flag: Grenada","tags":["GD","flag"],"emoji":"๐ฌ๐ฉ","order":4524,"group":9,"version":2},{"shortcodes":["flag_ge","georgia"],"annotation":"flag: Georgia","tags":["GE","flag"],"emoji":"๐ฌ๐ช","order":4525,"group":9,"version":2},{"shortcodes":["flag_gf","french_guiana"],"annotation":"flag: French Guiana","tags":["GF","flag"],"emoji":"๐ฌ๐ซ","order":4526,"group":9,"version":2},{"shortcodes":["flag_gg","guernsey"],"annotation":"flag: Guernsey","tags":["GG","flag"],"emoji":"๐ฌ๐ฌ","order":4527,"group":9,"version":2},{"shortcodes":["flag_gh","ghana"],"annotation":"flag: Ghana","tags":["GH","flag"],"emoji":"๐ฌ๐ญ","order":4528,"group":9,"version":2},{"shortcodes":["flag_gi","gibraltar"],"annotation":"flag: Gibraltar","tags":["GI","flag"],"emoji":"๐ฌ๐ฎ","order":4529,"group":9,"version":2},{"shortcodes":["flag_gl","greenland"],"annotation":"flag: Greenland","tags":["GL","flag"],"emoji":"๐ฌ๐ฑ","order":4530,"group":9,"version":2},{"shortcodes":["flag_gm","gambia"],"annotation":"flag: Gambia","tags":["GM","flag"],"emoji":"๐ฌ๐ฒ","order":4531,"group":9,"version":2},{"shortcodes":["flag_gn","guinea"],"annotation":"flag: Guinea","tags":["GN","flag"],"emoji":"๐ฌ๐ณ","order":4532,"group":9,"version":2},{"shortcodes":["flag_gp","guadeloupe"],"annotation":"flag: Guadeloupe","tags":["GP","flag"],"emoji":"๐ฌ๐ต","order":4533,"group":9,"version":2},{"shortcodes":["equatorial_guinea","flag_gq"],"annotation":"flag: Equatorial Guinea","tags":["GQ","flag"],"emoji":"๐ฌ๐ถ","order":4534,"group":9,"version":2},{"shortcodes":["flag_gr","greece"],"annotation":"flag: Greece","tags":["GR","flag"],"emoji":"๐ฌ๐ท","order":4535,"group":9,"version":2},{"shortcodes":["flag_gs","south_georgia_south_sandwich_islands"],"annotation":"flag: South Georgia & South Sandwich Islands","tags":["GS","flag"],"emoji":"๐ฌ๐ธ","order":4536,"group":9,"version":2},{"shortcodes":["flag_gt","guatemala"],"annotation":"flag: Guatemala","tags":["GT","flag"],"emoji":"๐ฌ๐น","order":4537,"group":9,"version":2},{"shortcodes":["flag_gu","guam"],"annotation":"flag: Guam","tags":["GU","flag"],"emoji":"๐ฌ๐บ","order":4538,"group":9,"version":2},{"shortcodes":["flag_gw","guinea_bissau"],"annotation":"flag: Guinea-Bissau","tags":["GW","flag"],"emoji":"๐ฌ๐ผ","order":4539,"group":9,"version":2},{"shortcodes":["flag_gy","guyana"],"annotation":"flag: Guyana","tags":["GY","flag"],"emoji":"๐ฌ๐พ","order":4540,"group":9,"version":2},{"shortcodes":["flag_hk","hong_kong"],"annotation":"flag: Hong Kong SAR China","tags":["HK","flag"],"emoji":"๐ญ๐ฐ","order":4541,"group":9,"version":2},{"shortcodes":["flag_hm","heard_mcdonald_islands"],"annotation":"flag: Heard & McDonald Islands","tags":["HM","flag"],"emoji":"๐ญ๐ฒ","order":4542,"group":9,"version":2},{"shortcodes":["flag_hn","honduras"],"annotation":"flag: Honduras","tags":["HN","flag"],"emoji":"๐ญ๐ณ","order":4543,"group":9,"version":2},{"shortcodes":["croatia","flag_hr"],"annotation":"flag: Croatia","tags":["HR","flag"],"emoji":"๐ญ๐ท","order":4544,"group":9,"version":2},{"shortcodes":["flag_ht","haiti"],"annotation":"flag: Haiti","tags":["HT","flag"],"emoji":"๐ญ๐น","order":4545,"group":9,"version":2},{"shortcodes":["flag_hu","hungary"],"annotation":"flag: Hungary","tags":["HU","flag"],"emoji":"๐ญ๐บ","order":4546,"group":9,"version":2},{"shortcodes":["canary_islands","flag_ic"],"annotation":"flag: Canary Islands","tags":["IC","flag"],"emoji":"๐ฎ๐จ","order":4547,"group":9,"version":2},{"shortcodes":["flag_id","indonesia"],"annotation":"flag: Indonesia","tags":["ID","flag"],"emoji":"๐ฎ๐ฉ","order":4548,"group":9,"version":2},{"shortcodes":["flag_ie","ireland"],"annotation":"flag: Ireland","tags":["IE","flag"],"emoji":"๐ฎ๐ช","order":4549,"group":9,"version":2},{"shortcodes":["flag_il","israel"],"annotation":"flag: Israel","tags":["IL","flag"],"emoji":"๐ฎ๐ฑ","order":4550,"group":9,"version":2},{"shortcodes":["flag_im","isle_of_man"],"annotation":"flag: Isle of Man","tags":["IM","flag"],"emoji":"๐ฎ๐ฒ","order":4551,"group":9,"version":2},{"shortcodes":["flag_in","india"],"annotation":"flag: India","tags":["IN","flag"],"emoji":"๐ฎ๐ณ","order":4552,"group":9,"version":2},{"shortcodes":["british_indian_ocean_territory","flag_io"],"annotation":"flag: British Indian Ocean Territory","tags":["IO","flag"],"emoji":"๐ฎ๐ด","order":4553,"group":9,"version":2},{"shortcodes":["flag_iq","iraq"],"annotation":"flag: Iraq","tags":["IQ","flag"],"emoji":"๐ฎ๐ถ","order":4554,"group":9,"version":2},{"shortcodes":["flag_ir","iran"],"annotation":"flag: Iran","tags":["IR","flag"],"emoji":"๐ฎ๐ท","order":4555,"group":9,"version":2},{"shortcodes":["flag_is","iceland"],"annotation":"flag: Iceland","tags":["IS","flag"],"emoji":"๐ฎ๐ธ","order":4556,"group":9,"version":2},{"shortcodes":["flag_it","italy"],"annotation":"flag: Italy","tags":["IT","flag"],"emoji":"๐ฎ๐น","order":4557,"group":9,"version":0.6},{"shortcodes":["flag_je","jersey"],"annotation":"flag: Jersey","tags":["JE","flag"],"emoji":"๐ฏ๐ช","order":4558,"group":9,"version":2},{"shortcodes":["flag_jm","jamaica"],"annotation":"flag: Jamaica","tags":["JM","flag"],"emoji":"๐ฏ๐ฒ","order":4559,"group":9,"version":2},{"shortcodes":["flag_jo","jordan"],"annotation":"flag: Jordan","tags":["JO","flag"],"emoji":"๐ฏ๐ด","order":4560,"group":9,"version":2},{"shortcodes":["flag_jp","japan"],"annotation":"flag: Japan","tags":["JP","flag"],"emoji":"๐ฏ๐ต","order":4561,"group":9,"version":0.6},{"shortcodes":["flag_ke","kenya"],"annotation":"flag: Kenya","tags":["KE","flag"],"emoji":"๐ฐ๐ช","order":4562,"group":9,"version":2},{"shortcodes":["flag_kg","kyrgyzstan"],"annotation":"flag: Kyrgyzstan","tags":["KG","flag"],"emoji":"๐ฐ๐ฌ","order":4563,"group":9,"version":2},{"shortcodes":["cambodia","flag_kh"],"annotation":"flag: Cambodia","tags":["KH","flag"],"emoji":"๐ฐ๐ญ","order":4564,"group":9,"version":2},{"shortcodes":["flag_ki","kiribati"],"annotation":"flag: Kiribati","tags":["KI","flag"],"emoji":"๐ฐ๐ฎ","order":4565,"group":9,"version":2},{"shortcodes":["comoros","flag_km"],"annotation":"flag: Comoros","tags":["KM","flag"],"emoji":"๐ฐ๐ฒ","order":4566,"group":9,"version":2},{"shortcodes":["flag_kn","st_kitts_nevis"],"annotation":"flag: St. Kitts & Nevis","tags":["KN","flag"],"emoji":"๐ฐ๐ณ","order":4567,"group":9,"version":2},{"shortcodes":["flag_kp","north_korea"],"annotation":"flag: North Korea","tags":["KP","flag"],"emoji":"๐ฐ๐ต","order":4568,"group":9,"version":2},{"shortcodes":["flag_kr","south_korea"],"annotation":"flag: South Korea","tags":["KR","flag"],"emoji":"๐ฐ๐ท","order":4569,"group":9,"version":0.6},{"shortcodes":["flag_kw","kuwait"],"annotation":"flag: Kuwait","tags":["KW","flag"],"emoji":"๐ฐ๐ผ","order":4570,"group":9,"version":2},{"shortcodes":["cayman_islands","flag_ky"],"annotation":"flag: Cayman Islands","tags":["KY","flag"],"emoji":"๐ฐ๐พ","order":4571,"group":9,"version":2},{"shortcodes":["flag_kz","kazakhstan"],"annotation":"flag: Kazakhstan","tags":["KZ","flag"],"emoji":"๐ฐ๐ฟ","order":4572,"group":9,"version":2},{"shortcodes":["flag_la","laos"],"annotation":"flag: Laos","tags":["LA","flag"],"emoji":"๐ฑ๐ฆ","order":4573,"group":9,"version":2},{"shortcodes":["flag_lb","lebanon"],"annotation":"flag: Lebanon","tags":["LB","flag"],"emoji":"๐ฑ๐ง","order":4574,"group":9,"version":2},{"shortcodes":["flag_lc","st_lucia"],"annotation":"flag: St. Lucia","tags":["LC","flag"],"emoji":"๐ฑ๐จ","order":4575,"group":9,"version":2},{"shortcodes":["flag_li","liechtenstein"],"annotation":"flag: Liechtenstein","tags":["LI","flag"],"emoji":"๐ฑ๐ฎ","order":4576,"group":9,"version":2},{"shortcodes":["flag_lk","sri_lanka"],"annotation":"flag: Sri Lanka","tags":["LK","flag"],"emoji":"๐ฑ๐ฐ","order":4577,"group":9,"version":2},{"shortcodes":["flag_lr","liberia"],"annotation":"flag: Liberia","tags":["LR","flag"],"emoji":"๐ฑ๐ท","order":4578,"group":9,"version":2},{"shortcodes":["flag_ls","lesotho"],"annotation":"flag: Lesotho","tags":["LS","flag"],"emoji":"๐ฑ๐ธ","order":4579,"group":9,"version":2},{"shortcodes":["flag_lt","lithuania"],"annotation":"flag: Lithuania","tags":["LT","flag"],"emoji":"๐ฑ๐น","order":4580,"group":9,"version":2},{"shortcodes":["flag_lu","luxembourg"],"annotation":"flag: Luxembourg","tags":["LU","flag"],"emoji":"๐ฑ๐บ","order":4581,"group":9,"version":2},{"shortcodes":["flag_lv","latvia"],"annotation":"flag: Latvia","tags":["LV","flag"],"emoji":"๐ฑ๐ป","order":4582,"group":9,"version":2},{"shortcodes":["flag_ly","libya"],"annotation":"flag: Libya","tags":["LY","flag"],"emoji":"๐ฑ๐พ","order":4583,"group":9,"version":2},{"shortcodes":["flag_ma","morocco"],"annotation":"flag: Morocco","tags":["MA","flag"],"emoji":"๐ฒ๐ฆ","order":4584,"group":9,"version":2},{"shortcodes":["flag_mc","monaco"],"annotation":"flag: Monaco","tags":["MC","flag"],"emoji":"๐ฒ๐จ","order":4585,"group":9,"version":2},{"shortcodes":["flag_md","moldova"],"annotation":"flag: Moldova","tags":["MD","flag"],"emoji":"๐ฒ๐ฉ","order":4586,"group":9,"version":2},{"shortcodes":["flag_me","montenegro"],"annotation":"flag: Montenegro","tags":["ME","flag"],"emoji":"๐ฒ๐ช","order":4587,"group":9,"version":2},{"shortcodes":["flag_mf","st_martin"],"annotation":"flag: St. Martin","tags":["MF","flag"],"emoji":"๐ฒ๐ซ","order":4588,"group":9,"version":2},{"shortcodes":["flag_mg","madagascar"],"annotation":"flag: Madagascar","tags":["MG","flag"],"emoji":"๐ฒ๐ฌ","order":4589,"group":9,"version":2},{"shortcodes":["flag_mh","marshall_islands"],"annotation":"flag: Marshall Islands","tags":["MH","flag"],"emoji":"๐ฒ๐ญ","order":4590,"group":9,"version":2},{"shortcodes":["flag_mk","macedonia"],"annotation":"flag: North Macedonia","tags":["MK","flag"],"emoji":"๐ฒ๐ฐ","order":4591,"group":9,"version":2},{"shortcodes":["flag_ml","mali"],"annotation":"flag: Mali","tags":["ML","flag"],"emoji":"๐ฒ๐ฑ","order":4592,"group":9,"version":2},{"shortcodes":["burma","flag_mm","myanmar"],"annotation":"flag: Myanmar (Burma)","tags":["MM","flag"],"emoji":"๐ฒ๐ฒ","order":4593,"group":9,"version":2},{"shortcodes":["flag_mn","mongolia"],"annotation":"flag: Mongolia","tags":["MN","flag"],"emoji":"๐ฒ๐ณ","order":4594,"group":9,"version":2},{"shortcodes":["flag_mo","macao","macau"],"annotation":"flag: Macao SAR China","tags":["MO","flag"],"emoji":"๐ฒ๐ด","order":4595,"group":9,"version":2},{"shortcodes":["flag_mp","northern_mariana_islands"],"annotation":"flag: Northern Mariana Islands","tags":["MP","flag"],"emoji":"๐ฒ๐ต","order":4596,"group":9,"version":2},{"shortcodes":["flag_mq","martinique"],"annotation":"flag: Martinique","tags":["MQ","flag"],"emoji":"๐ฒ๐ถ","order":4597,"group":9,"version":2},{"shortcodes":["flag_mr","mauritania"],"annotation":"flag: Mauritania","tags":["MR","flag"],"emoji":"๐ฒ๐ท","order":4598,"group":9,"version":2},{"shortcodes":["flag_ms","montserrat"],"annotation":"flag: Montserrat","tags":["MS","flag"],"emoji":"๐ฒ๐ธ","order":4599,"group":9,"version":2},{"shortcodes":["flag_mt","malta"],"annotation":"flag: Malta","tags":["MT","flag"],"emoji":"๐ฒ๐น","order":4600,"group":9,"version":2},{"shortcodes":["flag_mu","mauritius"],"annotation":"flag: Mauritius","tags":["MU","flag"],"emoji":"๐ฒ๐บ","order":4601,"group":9,"version":2},{"shortcodes":["flag_mv","maldives"],"annotation":"flag: Maldives","tags":["MV","flag"],"emoji":"๐ฒ๐ป","order":4602,"group":9,"version":2},{"shortcodes":["flag_mw","malawi"],"annotation":"flag: Malawi","tags":["MW","flag"],"emoji":"๐ฒ๐ผ","order":4603,"group":9,"version":2},{"shortcodes":["flag_mx","mexico"],"annotation":"flag: Mexico","tags":["MX","flag"],"emoji":"๐ฒ๐ฝ","order":4604,"group":9,"version":2},{"shortcodes":["flag_my","malaysia"],"annotation":"flag: Malaysia","tags":["MY","flag"],"emoji":"๐ฒ๐พ","order":4605,"group":9,"version":2},{"shortcodes":["flag_mz","mozambique"],"annotation":"flag: Mozambique","tags":["MZ","flag"],"emoji":"๐ฒ๐ฟ","order":4606,"group":9,"version":2},{"shortcodes":["flag_na","namibia"],"annotation":"flag: Namibia","tags":["NA","flag"],"emoji":"๐ณ๐ฆ","order":4607,"group":9,"version":2},{"shortcodes":["flag_nc","new_caledonia"],"annotation":"flag: New Caledonia","tags":["NC","flag"],"emoji":"๐ณ๐จ","order":4608,"group":9,"version":2},{"shortcodes":["flag_ne","niger"],"annotation":"flag: Niger","tags":["NE","flag"],"emoji":"๐ณ๐ช","order":4609,"group":9,"version":2},{"shortcodes":["flag_nf","norfolk_island"],"annotation":"flag: Norfolk Island","tags":["NF","flag"],"emoji":"๐ณ๐ซ","order":4610,"group":9,"version":2},{"shortcodes":["flag_ng","nigeria"],"annotation":"flag: Nigeria","tags":["NG","flag"],"emoji":"๐ณ๐ฌ","order":4611,"group":9,"version":2},{"shortcodes":["flag_ni","nicaragua"],"annotation":"flag: Nicaragua","tags":["NI","flag"],"emoji":"๐ณ๐ฎ","order":4612,"group":9,"version":2},{"shortcodes":["flag_nl","netherlands"],"annotation":"flag: Netherlands","tags":["NL","flag"],"emoji":"๐ณ๐ฑ","order":4613,"group":9,"version":2},{"shortcodes":["flag_no","norway"],"annotation":"flag: Norway","tags":["NO","flag"],"emoji":"๐ณ๐ด","order":4614,"group":9,"version":2},{"shortcodes":["flag_np","nepal"],"annotation":"flag: Nepal","tags":["NP","flag"],"emoji":"๐ณ๐ต","order":4615,"group":9,"version":2},{"shortcodes":["flag_nr","nauru"],"annotation":"flag: Nauru","tags":["NR","flag"],"emoji":"๐ณ๐ท","order":4616,"group":9,"version":2},{"shortcodes":["flag_nu","niue"],"annotation":"flag: Niue","tags":["NU","flag"],"emoji":"๐ณ๐บ","order":4617,"group":9,"version":2},{"shortcodes":["flag_nz","new_zealand"],"annotation":"flag: New Zealand","tags":["NZ","flag"],"emoji":"๐ณ๐ฟ","order":4618,"group":9,"version":2},{"shortcodes":["flag_om","oman"],"annotation":"flag: Oman","tags":["OM","flag"],"emoji":"๐ด๐ฒ","order":4619,"group":9,"version":2},{"shortcodes":["flag_pa","panama"],"annotation":"flag: Panama","tags":["PA","flag"],"emoji":"๐ต๐ฆ","order":4620,"group":9,"version":2},{"shortcodes":["flag_pe","peru"],"annotation":"flag: Peru","tags":["PE","flag"],"emoji":"๐ต๐ช","order":4621,"group":9,"version":2},{"shortcodes":["flag_pf","french_polynesia"],"annotation":"flag: French Polynesia","tags":["PF","flag"],"emoji":"๐ต๐ซ","order":4622,"group":9,"version":2},{"shortcodes":["flag_pg","papua_new_guinea"],"annotation":"flag: Papua New Guinea","tags":["PG","flag"],"emoji":"๐ต๐ฌ","order":4623,"group":9,"version":2},{"shortcodes":["flag_ph","philippines"],"annotation":"flag: Philippines","tags":["PH","flag"],"emoji":"๐ต๐ญ","order":4624,"group":9,"version":2},{"shortcodes":["flag_pk","pakistan"],"annotation":"flag: Pakistan","tags":["PK","flag"],"emoji":"๐ต๐ฐ","order":4625,"group":9,"version":2},{"shortcodes":["flag_pl","poland"],"annotation":"flag: Poland","tags":["PL","flag"],"emoji":"๐ต๐ฑ","order":4626,"group":9,"version":2},{"shortcodes":["flag_pm","st_pierre_miquelon"],"annotation":"flag: St. Pierre & Miquelon","tags":["PM","flag"],"emoji":"๐ต๐ฒ","order":4627,"group":9,"version":2},{"shortcodes":["flag_pn","pitcairn_islands"],"annotation":"flag: Pitcairn Islands","tags":["PN","flag"],"emoji":"๐ต๐ณ","order":4628,"group":9,"version":2},{"shortcodes":["flag_pr","puerto_rico"],"annotation":"flag: Puerto Rico","tags":["PR","flag"],"emoji":"๐ต๐ท","order":4629,"group":9,"version":2},{"shortcodes":["flag_ps","palestinian_territories"],"annotation":"flag: Palestinian Territories","tags":["PS","flag"],"emoji":"๐ต๐ธ","order":4630,"group":9,"version":2},{"shortcodes":["flag_pt","portugal"],"annotation":"flag: Portugal","tags":["PT","flag"],"emoji":"๐ต๐น","order":4631,"group":9,"version":2},{"shortcodes":["flag_pw","palau"],"annotation":"flag: Palau","tags":["PW","flag"],"emoji":"๐ต๐ผ","order":4632,"group":9,"version":2},{"shortcodes":["flag_py","paraguay"],"annotation":"flag: Paraguay","tags":["PY","flag"],"emoji":"๐ต๐พ","order":4633,"group":9,"version":2},{"shortcodes":["flag_qa","qatar"],"annotation":"flag: Qatar","tags":["QA","flag"],"emoji":"๐ถ๐ฆ","order":4634,"group":9,"version":2},{"shortcodes":["flag_re","reunion"],"annotation":"flag: Rรฉunion","tags":["RE","flag"],"emoji":"๐ท๐ช","order":4635,"group":9,"version":2},{"shortcodes":["flag_ro","romania"],"annotation":"flag: Romania","tags":["RO","flag"],"emoji":"๐ท๐ด","order":4636,"group":9,"version":2},{"shortcodes":["flag_rs","serbia"],"annotation":"flag: Serbia","tags":["RS","flag"],"emoji":"๐ท๐ธ","order":4637,"group":9,"version":2},{"shortcodes":["flag_ru","russia"],"annotation":"flag: Russia","tags":["RU","flag"],"emoji":"๐ท๐บ","order":4638,"group":9,"version":0.6},{"shortcodes":["flag_rw","rwanda"],"annotation":"flag: Rwanda","tags":["RW","flag"],"emoji":"๐ท๐ผ","order":4639,"group":9,"version":2},{"shortcodes":["flag_sa","saudi_arabia"],"annotation":"flag: Saudi Arabia","tags":["SA","flag"],"emoji":"๐ธ๐ฆ","order":4640,"group":9,"version":2},{"shortcodes":["flag_sb","solomon_islands"],"annotation":"flag: Solomon Islands","tags":["SB","flag"],"emoji":"๐ธ๐ง","order":4641,"group":9,"version":2},{"shortcodes":["flag_sc","seychelles"],"annotation":"flag: Seychelles","tags":["SC","flag"],"emoji":"๐ธ๐จ","order":4642,"group":9,"version":2},{"shortcodes":["flag_sd","sudan"],"annotation":"flag: Sudan","tags":["SD","flag"],"emoji":"๐ธ๐ฉ","order":4643,"group":9,"version":2},{"shortcodes":["flag_se","sweden"],"annotation":"flag: Sweden","tags":["SE","flag"],"emoji":"๐ธ๐ช","order":4644,"group":9,"version":2},{"shortcodes":["flag_sg","singapore"],"annotation":"flag: Singapore","tags":["SG","flag"],"emoji":"๐ธ๐ฌ","order":4645,"group":9,"version":2},{"shortcodes":["flag_sh","st_helena"],"annotation":"flag: St. Helena","tags":["SH","flag"],"emoji":"๐ธ๐ญ","order":4646,"group":9,"version":2},{"shortcodes":["flag_si","slovenia"],"annotation":"flag: Slovenia","tags":["SI","flag"],"emoji":"๐ธ๐ฎ","order":4647,"group":9,"version":2},{"shortcodes":["flag_sj","svalbard_jan_mayen"],"annotation":"flag: Svalbard & Jan Mayen","tags":["SJ","flag"],"emoji":"๐ธ๐ฏ","order":4648,"group":9,"version":2},{"shortcodes":["flag_sk","slovakia"],"annotation":"flag: Slovakia","tags":["SK","flag"],"emoji":"๐ธ๐ฐ","order":4649,"group":9,"version":2},{"shortcodes":["flag_sl","sierra_leone"],"annotation":"flag: Sierra Leone","tags":["SL","flag"],"emoji":"๐ธ๐ฑ","order":4650,"group":9,"version":2},{"shortcodes":["flag_sm","san_marino"],"annotation":"flag: San Marino","tags":["SM","flag"],"emoji":"๐ธ๐ฒ","order":4651,"group":9,"version":2},{"shortcodes":["flag_sn","senegal"],"annotation":"flag: Senegal","tags":["SN","flag"],"emoji":"๐ธ๐ณ","order":4652,"group":9,"version":2},{"shortcodes":["flag_so","somalia"],"annotation":"flag: Somalia","tags":["SO","flag"],"emoji":"๐ธ๐ด","order":4653,"group":9,"version":2},{"shortcodes":["flag_sr","suriname"],"annotation":"flag: Suriname","tags":["SR","flag"],"emoji":"๐ธ๐ท","order":4654,"group":9,"version":2},{"shortcodes":["flag_ss","south_sudan"],"annotation":"flag: South Sudan","tags":["SS","flag"],"emoji":"๐ธ๐ธ","order":4655,"group":9,"version":2},{"shortcodes":["flag_st","sao_tome_principe"],"annotation":"flag: Sรฃo Tomรฉ & Prรญncipe","tags":["ST","flag"],"emoji":"๐ธ๐น","order":4656,"group":9,"version":2},{"shortcodes":["el_salvador","flag_sv"],"annotation":"flag: El Salvador","tags":["SV","flag"],"emoji":"๐ธ๐ป","order":4657,"group":9,"version":2},{"shortcodes":["flag_sx","sint_maarten"],"annotation":"flag: Sint Maarten","tags":["SX","flag"],"emoji":"๐ธ๐ฝ","order":4658,"group":9,"version":2},{"shortcodes":["flag_sy","syria"],"annotation":"flag: Syria","tags":["SY","flag"],"emoji":"๐ธ๐พ","order":4659,"group":9,"version":2},{"shortcodes":["eswatini","flag_sz","swaziland"],"annotation":"flag: Eswatini","tags":["SZ","flag"],"emoji":"๐ธ๐ฟ","order":4660,"group":9,"version":2},{"shortcodes":["flag_ta","tristan_da_cunha"],"annotation":"flag: Tristan da Cunha","tags":["TA","flag"],"emoji":"๐น๐ฆ","order":4661,"group":9,"version":2},{"shortcodes":["flag_tc","turks_caicos_islands"],"annotation":"flag: Turks & Caicos Islands","tags":["TC","flag"],"emoji":"๐น๐จ","order":4662,"group":9,"version":2},{"shortcodes":["chad","flag_td"],"annotation":"flag: Chad","tags":["TD","flag"],"emoji":"๐น๐ฉ","order":4663,"group":9,"version":2},{"shortcodes":["flag_tf","french_southern_territories"],"annotation":"flag: French Southern Territories","tags":["TF","flag"],"emoji":"๐น๐ซ","order":4664,"group":9,"version":2},{"shortcodes":["flag_tg","togo"],"annotation":"flag: Togo","tags":["TG","flag"],"emoji":"๐น๐ฌ","order":4665,"group":9,"version":2},{"shortcodes":["flag_th","thailand"],"annotation":"flag: Thailand","tags":["TH","flag"],"emoji":"๐น๐ญ","order":4666,"group":9,"version":2},{"shortcodes":["flag_tj","tajikistan"],"annotation":"flag: Tajikistan","tags":["TJ","flag"],"emoji":"๐น๐ฏ","order":4667,"group":9,"version":2},{"shortcodes":["flag_tk","tokelau"],"annotation":"flag: Tokelau","tags":["TK","flag"],"emoji":"๐น๐ฐ","order":4668,"group":9,"version":2},{"shortcodes":["flag_tl","timor_leste"],"annotation":"flag: Timor-Leste","tags":["TL","flag"],"emoji":"๐น๐ฑ","order":4669,"group":9,"version":2},{"shortcodes":["flag_tm","turkmenistan"],"annotation":"flag: Turkmenistan","tags":["TM","flag"],"emoji":"๐น๐ฒ","order":4670,"group":9,"version":2},{"shortcodes":["flag_tn","tunisia"],"annotation":"flag: Tunisia","tags":["TN","flag"],"emoji":"๐น๐ณ","order":4671,"group":9,"version":2},{"shortcodes":["flag_to","tonga"],"annotation":"flag: Tonga","tags":["TO","flag"],"emoji":"๐น๐ด","order":4672,"group":9,"version":2},{"shortcodes":["flag_tr","turkey_tr"],"annotation":"flag: Turkey","tags":["TR","flag"],"emoji":"๐น๐ท","order":4673,"group":9,"version":2},{"shortcodes":["flag_tt","trinidad_tobago"],"annotation":"flag: Trinidad & Tobago","tags":["TT","flag"],"emoji":"๐น๐น","order":4674,"group":9,"version":2},{"shortcodes":["flag_tv","tuvalu"],"annotation":"flag: Tuvalu","tags":["TV","flag"],"emoji":"๐น๐ป","order":4675,"group":9,"version":2},{"shortcodes":["flag_tw","taiwan"],"annotation":"flag: Taiwan","tags":["TW","flag"],"emoji":"๐น๐ผ","order":4676,"group":9,"version":2},{"shortcodes":["flag_tz","tanzania"],"annotation":"flag: Tanzania","tags":["TZ","flag"],"emoji":"๐น๐ฟ","order":4677,"group":9,"version":2},{"shortcodes":["flag_ua","ukraine"],"annotation":"flag: Ukraine","tags":["UA","flag"],"emoji":"๐บ๐ฆ","order":4678,"group":9,"version":2},{"shortcodes":["flag_ug","uganda"],"annotation":"flag: Uganda","tags":["UG","flag"],"emoji":"๐บ๐ฌ","order":4679,"group":9,"version":2},{"shortcodes":["flag_um","us_outlying_islands"],"annotation":"flag: U.S. Outlying Islands","tags":["UM","flag"],"emoji":"๐บ๐ฒ","order":4680,"group":9,"version":2},{"shortcodes":["flag_un","un","united_nations"],"annotation":"flag: United Nations","tags":["UN","flag"],"emoji":"๐บ๐ณ","order":4681,"group":9,"version":4},{"shortcodes":["flag_us","united_states","usa"],"annotation":"flag: United States","tags":["US","flag"],"emoji":"๐บ๐ธ","order":4682,"group":9,"version":0.6},{"shortcodes":["flag_uy","uruguay"],"annotation":"flag: Uruguay","tags":["UY","flag"],"emoji":"๐บ๐พ","order":4683,"group":9,"version":2},{"shortcodes":["flag_uz","uzbekistan"],"annotation":"flag: Uzbekistan","tags":["UZ","flag"],"emoji":"๐บ๐ฟ","order":4684,"group":9,"version":2},{"shortcodes":["flag_va","vatican_city"],"annotation":"flag: Vatican City","tags":["VA","flag"],"emoji":"๐ป๐ฆ","order":4685,"group":9,"version":2},{"shortcodes":["flag_vc","st_vincent_grenadines"],"annotation":"flag: St. Vincent & Grenadines","tags":["VC","flag"],"emoji":"๐ป๐จ","order":4686,"group":9,"version":2},{"shortcodes":["flag_ve","venezuela"],"annotation":"flag: Venezuela","tags":["VE","flag"],"emoji":"๐ป๐ช","order":4687,"group":9,"version":2},{"shortcodes":["british_virgin_islands","flag_vg"],"annotation":"flag: British Virgin Islands","tags":["VG","flag"],"emoji":"๐ป๐ฌ","order":4688,"group":9,"version":2},{"shortcodes":["flag_vi","us_virgin_islands"],"annotation":"flag: U.S. Virgin Islands","tags":["VI","flag"],"emoji":"๐ป๐ฎ","order":4689,"group":9,"version":2},{"shortcodes":["flag_vn","vietnam"],"annotation":"flag: Vietnam","tags":["VN","flag"],"emoji":"๐ป๐ณ","order":4690,"group":9,"version":2},{"shortcodes":["flag_vu","vanuatu"],"annotation":"flag: Vanuatu","tags":["VU","flag"],"emoji":"๐ป๐บ","order":4691,"group":9,"version":2},{"shortcodes":["flag_wf","wallis_futuna"],"annotation":"flag: Wallis & Futuna","tags":["WF","flag"],"emoji":"๐ผ๐ซ","order":4692,"group":9,"version":2},{"shortcodes":["flag_ws","samoa"],"annotation":"flag: Samoa","tags":["WS","flag"],"emoji":"๐ผ๐ธ","order":4693,"group":9,"version":2},{"shortcodes":["flag_xk","kosovo"],"annotation":"flag: Kosovo","tags":["XK","flag"],"emoji":"๐ฝ๐ฐ","order":4694,"group":9,"version":2},{"shortcodes":["flag_ye","yemen"],"annotation":"flag: Yemen","tags":["YE","flag"],"emoji":"๐พ๐ช","order":4695,"group":9,"version":2},{"shortcodes":["flag_yt","mayotte"],"annotation":"flag: Mayotte","tags":["YT","flag"],"emoji":"๐พ๐น","order":4696,"group":9,"version":2},{"shortcodes":["flag_za","south_africa"],"annotation":"flag: South Africa","tags":["ZA","flag"],"emoji":"๐ฟ๐ฆ","order":4697,"group":9,"version":2},{"shortcodes":["flag_zm","zambia"],"annotation":"flag: Zambia","tags":["ZM","flag"],"emoji":"๐ฟ๐ฒ","order":4698,"group":9,"version":2},{"shortcodes":["flag_zw","zimbabwe"],"annotation":"flag: Zimbabwe","tags":["ZW","flag"],"emoji":"๐ฟ๐ผ","order":4699,"group":9,"version":2},{"shortcodes":["england","flag_gbeng"],"annotation":"flag: England","tags":["flag","gbeng"],"emoji":"๐ด๓ ง๓ ข๓ ฅ๓ ฎ๓ ง๓ ฟ","order":4700,"group":9,"version":5},{"shortcodes":["flag_gbsct","scotland"],"annotation":"flag: Scotland","tags":["flag","gbsct"],"emoji":"๐ด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ","order":4701,"group":9,"version":5},{"shortcodes":["flag_gbwls","wales"],"annotation":"flag: Wales","tags":["flag","gbwls"],"emoji":"๐ด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ","order":4702,"group":9,"version":5}] \ No newline at end of file diff --git a/app/static/scripts/emoji-picker-element/database.js b/app/static/scripts/emoji-picker-element/database.js new file mode 100644 index 0000000..ada5098 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/database.js @@ -0,0 +1,972 @@ +function assertNonEmptyString (str) { + if (typeof str !== 'string' || !str) { + throw new Error('expected a non-empty string, got: ' + str) + } +} + +function assertNumber (number) { + if (typeof number !== 'number') { + throw new Error('expected a number, got: ' + number) + } +} + +const DB_VERSION_CURRENT = 1; +const DB_VERSION_INITIAL = 1; +const STORE_EMOJI = 'emoji'; +const STORE_KEYVALUE = 'keyvalue'; +const STORE_FAVORITES = 'favorites'; +const FIELD_TOKENS = 'tokens'; +const INDEX_TOKENS = 'tokens'; +const FIELD_UNICODE = 'unicode'; +const INDEX_COUNT = 'count'; +const FIELD_GROUP = 'group'; +const FIELD_ORDER = 'order'; +const INDEX_GROUP_AND_ORDER = 'group-order'; +const KEY_ETAG = 'eTag'; +const KEY_URL = 'url'; +const KEY_PREFERRED_SKINTONE = 'skinTone'; +const MODE_READONLY = 'readonly'; +const MODE_READWRITE = 'readwrite'; +const INDEX_SKIN_UNICODE = 'skinUnicodes'; +const FIELD_SKIN_UNICODE = 'skinUnicodes'; + +const DEFAULT_DATA_SOURCE = 'https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json'; +const DEFAULT_LOCALE = 'en'; + +// like lodash's uniqBy but much smaller +function uniqBy (arr, func) { + const set = new Set(); + const res = []; + for (const item of arr) { + const key = func(item); + if (!set.has(key)) { + set.add(key); + res.push(item); + } + } + return res +} + +function uniqEmoji (emojis) { + return uniqBy(emojis, _ => _.unicode) +} + +function initialMigration (db) { + function createObjectStore (name, keyPath, indexes) { + const store = keyPath + ? db.createObjectStore(name, { keyPath }) + : db.createObjectStore(name); + if (indexes) { + for (const [indexName, [keyPath, multiEntry]] of Object.entries(indexes)) { + store.createIndex(indexName, keyPath, { multiEntry }); + } + } + return store + } + + createObjectStore(STORE_KEYVALUE); + createObjectStore(STORE_EMOJI, /* keyPath */ FIELD_UNICODE, { + [INDEX_TOKENS]: [FIELD_TOKENS, /* multiEntry */ true], + [INDEX_GROUP_AND_ORDER]: [[FIELD_GROUP, FIELD_ORDER]], + [INDEX_SKIN_UNICODE]: [FIELD_SKIN_UNICODE, /* multiEntry */ true] + }); + createObjectStore(STORE_FAVORITES, undefined, { + [INDEX_COUNT]: [''] + }); +} + +const openIndexedDBRequests = {}; +const databaseCache = {}; +const onCloseListeners = {}; + +function handleOpenOrDeleteReq (resolve, reject, req) { + // These things are almost impossible to test with fakeIndexedDB sadly + /* istanbul ignore next */ + req.onerror = () => reject(req.error); + /* istanbul ignore next */ + req.onblocked = () => reject(new Error('IDB blocked')); + req.onsuccess = () => resolve(req.result); +} + +async function createDatabase (dbName) { + const db = await new Promise((resolve, reject) => { + const req = indexedDB.open(dbName, DB_VERSION_CURRENT); + openIndexedDBRequests[dbName] = req; + req.onupgradeneeded = e => { + // Technically there is only one version, so we don't need this `if` check + // But if an old version of the JS is in another browser tab + // and it gets upgraded in the future and we have a new DB version, well... + // better safe than sorry. + /* istanbul ignore else */ + if (e.oldVersion < DB_VERSION_INITIAL) { + initialMigration(req.result); + } + }; + handleOpenOrDeleteReq(resolve, reject, req); + }); + // Handle abnormal closes, e.g. "delete database" in chrome dev tools. + // No need for removeEventListener, because once the DB can no longer + // fire "close" events, it will auto-GC. + // Unfortunately cannot test in fakeIndexedDB: https://github.com/dumbmatter/fakeIndexedDB/issues/50 + /* istanbul ignore next */ + db.onclose = () => closeDatabase(dbName); + return db +} + +function openDatabase (dbName) { + if (!databaseCache[dbName]) { + databaseCache[dbName] = createDatabase(dbName); + } + return databaseCache[dbName] +} + +function dbPromise (db, storeName, readOnlyOrReadWrite, cb) { + return new Promise((resolve, reject) => { + // Use relaxed durability because neither the emoji data nor the favorites/preferred skin tone + // are really irreplaceable data. IndexedDB is just a cache in this case. + const txn = db.transaction(storeName, readOnlyOrReadWrite, { durability: 'relaxed' }); + const store = typeof storeName === 'string' + ? txn.objectStore(storeName) + : storeName.map(name => txn.objectStore(name)); + let res; + cb(store, txn, (result) => { + res = result; + }); + + txn.oncomplete = () => resolve(res); + /* istanbul ignore next */ + txn.onerror = () => reject(txn.error); + }) +} + +function closeDatabase (dbName) { + // close any open requests + const req = openIndexedDBRequests[dbName]; + const db = req && req.result; + if (db) { + db.close(); + const listeners = onCloseListeners[dbName]; + /* istanbul ignore else */ + if (listeners) { + for (const listener of listeners) { + listener(); + } + } + } + delete openIndexedDBRequests[dbName]; + delete databaseCache[dbName]; + delete onCloseListeners[dbName]; +} + +function deleteDatabase (dbName) { + return new Promise((resolve, reject) => { + // close any open requests + closeDatabase(dbName); + const req = indexedDB.deleteDatabase(dbName); + handleOpenOrDeleteReq(resolve, reject, req); + }) +} + +// The "close" event occurs during an abnormal shutdown, e.g. a user clearing their browser data. +// However, it doesn't occur with the normal "close" event, so we handle that separately. +// https://www.w3.org/TR/IndexedDB/#close-a-database-connection +function addOnCloseListener (dbName, listener) { + let listeners = onCloseListeners[dbName]; + if (!listeners) { + listeners = onCloseListeners[dbName] = []; + } + listeners.push(listener); +} + +// list of emoticons that don't match a simple \W+ regex +// extracted using: +// require('emoji-picker-element-data/en/emojibase/data.json').map(_ => _.emoticon).filter(Boolean).filter(_ => !/^\W+$/.test(_)) +const irregularEmoticons = new Set([ + ':D', 'XD', ":'D", 'O:)', + ':X', ':P', ';P', 'XP', + ':L', ':Z', ':j', '8D', + 'XO', '8)', ':B', ':O', + ':S', ":'o", 'Dx', 'X(', + 'D:', ':C', '>0)', ':3', + '3', '<3', '\\M/', ':E', + '8#' +]); + +function extractTokens (str) { + return str + .split(/[\s_]+/) + .map(word => { + if (!word.match(/\w/) || irregularEmoticons.has(word)) { + // for pure emoticons like :) or :-), just leave them as-is + return word.toLowerCase() + } + + return word + .replace(/[)(:,]/g, '') + .replace(/โ/g, "'") + .toLowerCase() + }).filter(Boolean) +} + +const MIN_SEARCH_TEXT_LENGTH = 2; + +// This is an extra step in addition to extractTokens(). The difference here is that we expect +// the input to have already been run through extractTokens(). This is useful for cases like +// emoticons, where we don't want to do any tokenization (because it makes no sense to split up +// ">:)" by the colon) but we do want to lowercase it to have consistent search results, so that +// the user can type ':P' or ':p' and still get the same result. +function normalizeTokens (str) { + return str + .filter(Boolean) + .map(_ => _.toLowerCase()) + .filter(_ => _.length >= MIN_SEARCH_TEXT_LENGTH) +} + +// Transform emoji data for storage in IDB +function transformEmojiData (emojiData) { + const res = emojiData.map(({ annotation, emoticon, group, order, shortcodes, skins, tags, emoji, version }) => { + const tokens = [...new Set( + normalizeTokens([ + ...(shortcodes || []).map(extractTokens).flat(), + ...tags.map(extractTokens).flat(), + ...extractTokens(annotation), + emoticon + ]) + )].sort(); + const res = { + annotation, + group, + order, + tags, + tokens, + unicode: emoji, + version + }; + if (emoticon) { + res.emoticon = emoticon; + } + if (shortcodes) { + res.shortcodes = shortcodes; + } + if (skins) { + res.skinTones = []; + res.skinUnicodes = []; + res.skinVersions = []; + for (const { tone, emoji, version } of skins) { + res.skinTones.push(tone); + res.skinUnicodes.push(emoji); + res.skinVersions.push(version); + } + } + return res + }); + return res +} + +// helper functions that help compress the code better + +function callStore (store, method, key, cb) { + store[method](key).onsuccess = e => (cb && cb(e.target.result)); +} + +function getIDB (store, key, cb) { + callStore(store, 'get', key, cb); +} + +function getAllIDB (store, key, cb) { + callStore(store, 'getAll', key, cb); +} + +function commit (txn) { + /* istanbul ignore else */ + if (txn.commit) { + txn.commit(); + } +} + +// like lodash's minBy +function minBy (array, func) { + let minItem = array[0]; + for (let i = 1; i < array.length; i++) { + const item = array[i]; + if (func(minItem) > func(item)) { + minItem = item; + } + } + return minItem +} + +// return an array of results representing all items that are found in each one of the arrays + +function findCommonMembers (arrays, uniqByFunc) { + const shortestArray = minBy(arrays, _ => _.length); + const results = []; + for (const item of shortestArray) { + // if this item is included in every array in the intermediate results, add it to the final results + if (!arrays.some(array => array.findIndex(_ => uniqByFunc(_) === uniqByFunc(item)) === -1)) { + results.push(item); + } + } + return results +} + +async function isEmpty (db) { + return !(await get(db, STORE_KEYVALUE, KEY_URL)) +} + +async function hasData (db, url, eTag) { + const [oldETag, oldUrl] = await Promise.all([KEY_ETAG, KEY_URL] + .map(key => get(db, STORE_KEYVALUE, key))); + return (oldETag === eTag && oldUrl === url) +} + +async function doFullDatabaseScanForSingleResult (db, predicate) { + // This batching algorithm is just a perf improvement over a basic + // cursor. The BATCH_SIZE is an estimate of what would give the best + // perf for doing a full DB scan (worst case). + // + // Mini-benchmark for determining the best batch size: + // + // PERF=1 yarn build:rollup && yarn test:adhoc + // + // (async () => { + // performance.mark('start') + // await $('emoji-picker').database.getEmojiByShortcode('doesnotexist') + // performance.measure('total', 'start') + // console.log(performance.getEntriesByName('total').slice(-1)[0].duration) + // })() + const BATCH_SIZE = 50; // Typically around 150ms for 6x slowdown in Chrome for above benchmark + return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => { + let lastKey; + + const processNextBatch = () => { + emojiStore.getAll(lastKey && IDBKeyRange.lowerBound(lastKey, true), BATCH_SIZE).onsuccess = e => { + const results = e.target.result; + for (const result of results) { + lastKey = result.unicode; + if (predicate(result)) { + return cb(result) + } + } + if (results.length < BATCH_SIZE) { + return cb() + } + processNextBatch(); + }; + }; + processNextBatch(); + }) +} + +async function loadData (db, emojiData, url, eTag) { + try { + const transformedData = transformEmojiData(emojiData); + await dbPromise(db, [STORE_EMOJI, STORE_KEYVALUE], MODE_READWRITE, ([emojiStore, metaStore], txn) => { + let oldETag; + let oldUrl; + let todo = 0; + + function checkFetched () { + if (++todo === 2) { // 2 requests made + onFetched(); + } + } + + function onFetched () { + if (oldETag === eTag && oldUrl === url) { + // check again within the transaction to guard against concurrency, e.g. multiple browser tabs + return + } + // delete old data + emojiStore.clear(); + // insert new data + for (const data of transformedData) { + emojiStore.put(data); + } + metaStore.put(eTag, KEY_ETAG); + metaStore.put(url, KEY_URL); + commit(txn); + } + + getIDB(metaStore, KEY_ETAG, result => { + oldETag = result; + checkFetched(); + }); + + getIDB(metaStore, KEY_URL, result => { + oldUrl = result; + checkFetched(); + }); + }); + } finally { + } +} + +async function getEmojiByGroup (db, group) { + return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => { + const range = IDBKeyRange.bound([group, 0], [group + 1, 0], false, true); + getAllIDB(emojiStore.index(INDEX_GROUP_AND_ORDER), range, cb); + }) +} + +async function getEmojiBySearchQuery (db, query) { + const tokens = normalizeTokens(extractTokens(query)); + + if (!tokens.length) { + return [] + } + + return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => { + // get all results that contain all tokens (i.e. an AND query) + const intermediateResults = []; + + const checkDone = () => { + if (intermediateResults.length === tokens.length) { + onDone(); + } + }; + + const onDone = () => { + const results = findCommonMembers(intermediateResults, _ => _.unicode); + cb(results.sort((a, b) => a.order < b.order ? -1 : 1)); + }; + + for (let i = 0; i < tokens.length; i++) { + const token = tokens[i]; + const range = i === tokens.length - 1 + ? IDBKeyRange.bound(token, token + '\uffff', false, true) // treat last token as a prefix search + : IDBKeyRange.only(token); // treat all other tokens as an exact match + getAllIDB(emojiStore.index(INDEX_TOKENS), range, result => { + intermediateResults.push(result); + checkDone(); + }); + } + }) +} + +// This could have been implemented as an IDB index on shortcodes, but it seemed wasteful to do that +// when we can already query by tokens and this will give us what we're looking for 99.9% of the time +async function getEmojiByShortcode (db, shortcode) { + const emojis = await getEmojiBySearchQuery(db, shortcode); + + // In very rare cases (e.g. the shortcode "v" as in "v for victory"), we cannot search because + // there are no usable tokens (too short in this case). In that case, we have to do an inefficient + // full-database scan, which I believe is an acceptable tradeoff for not having to have an extra + // index on shortcodes. + + if (!emojis.length) { + const predicate = _ => ((_.shortcodes || []).includes(shortcode.toLowerCase())); + return (await doFullDatabaseScanForSingleResult(db, predicate)) || null + } + + return emojis.filter(_ => { + const lowerShortcodes = (_.shortcodes || []).map(_ => _.toLowerCase()); + return lowerShortcodes.includes(shortcode.toLowerCase()) + })[0] || null +} + +async function getEmojiByUnicode (db, unicode) { + return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => ( + getIDB(emojiStore, unicode, result => { + if (result) { + return cb(result) + } + getIDB(emojiStore.index(INDEX_SKIN_UNICODE), unicode, result => cb(result || null)); + }) + )) +} + +function get (db, storeName, key) { + return dbPromise(db, storeName, MODE_READONLY, (store, txn, cb) => ( + getIDB(store, key, cb) + )) +} + +function set (db, storeName, key, value) { + return dbPromise(db, storeName, MODE_READWRITE, (store, txn) => { + store.put(value, key); + commit(txn); + }) +} + +function incrementFavoriteEmojiCount (db, unicode) { + return dbPromise(db, STORE_FAVORITES, MODE_READWRITE, (store, txn) => ( + getIDB(store, unicode, result => { + store.put((result || 0) + 1, unicode); + commit(txn); + }) + )) +} + +function getTopFavoriteEmoji (db, customEmojiIndex, limit) { + if (limit === 0) { + return [] + } + return dbPromise(db, [STORE_FAVORITES, STORE_EMOJI], MODE_READONLY, ([favoritesStore, emojiStore], txn, cb) => { + const results = []; + favoritesStore.index(INDEX_COUNT).openCursor(undefined, 'prev').onsuccess = e => { + const cursor = e.target.result; + if (!cursor) { // no more results + return cb(results) + } + + function addResult (result) { + results.push(result); + if (results.length === limit) { + return cb(results) // done, reached the limit + } + cursor.continue(); + } + + const unicodeOrName = cursor.primaryKey; + const custom = customEmojiIndex.byName(unicodeOrName); + if (custom) { + return addResult(custom) + } + // This could be done in parallel (i.e. make the cursor and the get()s parallelized), + // but my testing suggests it's not actually faster. + getIDB(emojiStore, unicodeOrName, emoji => { + if (emoji) { + return addResult(emoji) + } + // emoji not found somehow, ignore (may happen if custom emoji change) + cursor.continue(); + }); + }; + }) +} + +// trie data structure for prefix searches +// loosely based on https://github.com/nolanlawson/substring-trie + +const CODA_MARKER = ''; // marks the end of the string + +function trie (arr, itemToTokens) { + const map = new Map(); + for (const item of arr) { + const tokens = itemToTokens(item); + for (const token of tokens) { + let currentMap = map; + for (let i = 0; i < token.length; i++) { + const char = token.charAt(i); + let nextMap = currentMap.get(char); + if (!nextMap) { + nextMap = new Map(); + currentMap.set(char, nextMap); + } + currentMap = nextMap; + } + let valuesAtCoda = currentMap.get(CODA_MARKER); + if (!valuesAtCoda) { + valuesAtCoda = []; + currentMap.set(CODA_MARKER, valuesAtCoda); + } + valuesAtCoda.push(item); + } + } + + const search = (query, exact) => { + let currentMap = map; + for (let i = 0; i < query.length; i++) { + const char = query.charAt(i); + const nextMap = currentMap.get(char); + if (nextMap) { + currentMap = nextMap; + } else { + return [] + } + } + + if (exact) { + const results = currentMap.get(CODA_MARKER); + return results || [] + } + + const results = []; + // traverse + const queue = [currentMap]; + while (queue.length) { + const currentMap = queue.shift(); + const entriesSortedByKey = [...currentMap.entries()].sort((a, b) => a[0] < b[0] ? -1 : 1); + for (const [key, value] of entriesSortedByKey) { + if (key === CODA_MARKER) { // CODA_MARKER always comes first; it's the empty string + results.push(...value); + } else { + queue.push(value); + } + } + } + return results + }; + + return search +} + +const requiredKeys$1 = [ + 'name', + 'url' +]; + +function assertCustomEmojis (customEmojis) { + const isArray = customEmojis && Array.isArray(customEmojis); + const firstItemIsFaulty = isArray && + customEmojis.length && + (!customEmojis[0] || requiredKeys$1.some(key => !(key in customEmojis[0]))); + if (!isArray || firstItemIsFaulty) { + throw new Error('Custom emojis are in the wrong format') + } +} + +function customEmojiIndex (customEmojis) { + assertCustomEmojis(customEmojis); + + const sortByName = (a, b) => a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1; + + // + // all() + // + const all = customEmojis.sort(sortByName); + + // + // search() + // + const emojiToTokens = emoji => ( + [...new Set((emoji.shortcodes || []).map(shortcode => extractTokens(shortcode)).flat())] + ); + const searchTrie = trie(customEmojis, emojiToTokens); + const searchByExactMatch = _ => searchTrie(_, true); + const searchByPrefix = _ => searchTrie(_, false); + + // Search by query for custom emoji. Similar to how we do this in IDB, the last token + // is treated as a prefix search, but every other one is treated as an exact match. + // Then we AND the results together + const search = query => { + const tokens = extractTokens(query); + const intermediateResults = tokens.map((token, i) => ( + (i < tokens.length - 1 ? searchByExactMatch : searchByPrefix)(token) + )); + return findCommonMembers(intermediateResults, _ => _.name).sort(sortByName) + }; + + // + // byShortcode, byName + // + const shortcodeToEmoji = new Map(); + const nameToEmoji = new Map(); + for (const customEmoji of customEmojis) { + nameToEmoji.set(customEmoji.name.toLowerCase(), customEmoji); + for (const shortcode of (customEmoji.shortcodes || [])) { + shortcodeToEmoji.set(shortcode.toLowerCase(), customEmoji); + } + } + + const byShortcode = shortcode => shortcodeToEmoji.get(shortcode.toLowerCase()); + const byName = name => nameToEmoji.get(name.toLowerCase()); + + return { + all, + search, + byShortcode, + byName + } +} + +// remove some internal implementation details, i.e. the "tokens" array on the emoji object +// essentially, convert the emoji from the version stored in IDB to the version used in-memory +function cleanEmoji (emoji) { + if (!emoji) { + return emoji + } + delete emoji.tokens; + if (emoji.skinTones) { + const len = emoji.skinTones.length; + emoji.skins = Array(len); + for (let i = 0; i < len; i++) { + emoji.skins[i] = { + tone: emoji.skinTones[i], + unicode: emoji.skinUnicodes[i], + version: emoji.skinVersions[i] + }; + } + delete emoji.skinTones; + delete emoji.skinUnicodes; + delete emoji.skinVersions; + } + return emoji +} + +function warnETag (eTag) { + if (!eTag) { + console.warn('emoji-picker-element is more efficient if the dataSource server exposes an ETag header.'); + } +} + +const requiredKeys = [ + 'annotation', + 'emoji', + 'group', + 'order', + 'tags', + 'version' +]; + +function assertEmojiData (emojiData) { + if (!emojiData || + !Array.isArray(emojiData) || + !emojiData[0] || + (typeof emojiData[0] !== 'object') || + requiredKeys.some(key => (!(key in emojiData[0])))) { + throw new Error('Emoji data is in the wrong format') + } +} + +function assertStatus (response, dataSource) { + if (Math.floor(response.status / 100) !== 2) { + throw new Error('Failed to fetch: ' + dataSource + ': ' + response.status) + } +} + +async function getETag (dataSource) { + const response = await fetch(dataSource, { method: 'HEAD' }); + assertStatus(response, dataSource); + const eTag = response.headers.get('etag'); + warnETag(eTag); + return eTag +} + +async function getETagAndData (dataSource) { + const response = await fetch(dataSource); + assertStatus(response, dataSource); + const eTag = response.headers.get('etag'); + warnETag(eTag); + const emojiData = await response.json(); + assertEmojiData(emojiData); + return [eTag, emojiData] +} + +// TODO: including these in blob-util.ts causes typedoc to generate docs for them, +/** + * Convert an `ArrayBuffer` to a binary string. + * + * Example: + * + * ```js + * var myString = blobUtil.arrayBufferToBinaryString(arrayBuff) + * ``` + * + * @param buffer - array buffer + * @returns binary string + */ +function arrayBufferToBinaryString(buffer) { + var binary = ''; + var bytes = new Uint8Array(buffer); + var length = bytes.byteLength; + var i = -1; + while (++i < length) { + binary += String.fromCharCode(bytes[i]); + } + return binary; +} +/** + * Convert a binary string to an `ArrayBuffer`. + * + * ```js + * var myBuffer = blobUtil.binaryStringToArrayBuffer(binaryString) + * ``` + * + * @param binary - binary string + * @returns array buffer + */ +function binaryStringToArrayBuffer(binary) { + var length = binary.length; + var buf = new ArrayBuffer(length); + var arr = new Uint8Array(buf); + var i = -1; + while (++i < length) { + arr[i] = binary.charCodeAt(i); + } + return buf; +} + +// generate a checksum based on the stringified JSON +async function jsonChecksum (object) { + const inString = JSON.stringify(object); + const inBuffer = binaryStringToArrayBuffer(inString); + // this does not need to be cryptographically secure, SHA-1 is fine + const outBuffer = await crypto.subtle.digest('SHA-1', inBuffer); + const outBinString = arrayBufferToBinaryString(outBuffer); + const res = btoa(outBinString); + return res +} + +async function checkForUpdates (db, dataSource) { + // just do a simple HEAD request first to see if the eTags match + let emojiData; + let eTag = await getETag(dataSource); + if (!eTag) { // work around lack of ETag/Access-Control-Expose-Headers + const eTagAndData = await getETagAndData(dataSource); + eTag = eTagAndData[0]; + emojiData = eTagAndData[1]; + if (!eTag) { + eTag = await jsonChecksum(emojiData); + } + } + if (await hasData(db, dataSource, eTag)) ; else { + if (!emojiData) { + const eTagAndData = await getETagAndData(dataSource); + emojiData = eTagAndData[1]; + } + await loadData(db, emojiData, dataSource, eTag); + } +} + +async function loadDataForFirstTime (db, dataSource) { + let [eTag, emojiData] = await getETagAndData(dataSource); + if (!eTag) { + // Handle lack of support for ETag or Access-Control-Expose-Headers + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers#Browser_compatibility + eTag = await jsonChecksum(emojiData); + } + + await loadData(db, emojiData, dataSource, eTag); +} + +class Database { + constructor ({ dataSource = DEFAULT_DATA_SOURCE, locale = DEFAULT_LOCALE, customEmoji = [] } = {}) { + this.dataSource = dataSource; + this.locale = locale; + this._dbName = `emoji-picker-element-${this.locale}`; + this._db = undefined; + this._lazyUpdate = undefined; + this._custom = customEmojiIndex(customEmoji); + + this._clear = this._clear.bind(this); + this._ready = this._init(); + } + + async _init () { + const db = this._db = await openDatabase(this._dbName); + + addOnCloseListener(this._dbName, this._clear); + const dataSource = this.dataSource; + const empty = await isEmpty(db); + + if (empty) { + await loadDataForFirstTime(db, dataSource); + } else { // offline-first - do an update asynchronously + this._lazyUpdate = checkForUpdates(db, dataSource); + } + } + + async ready () { + const checkReady = async () => { + if (!this._ready) { + this._ready = this._init(); + } + return this._ready + }; + await checkReady(); + // There's a possibility of a race condition where the element gets added, removed, and then added again + // with a particular timing, which would set the _db to undefined. + // We *could* do a while loop here, but that seems excessive and could lead to an infinite loop. + if (!this._db) { + await checkReady(); + } + } + + async getEmojiByGroup (group) { + assertNumber(group); + await this.ready(); + return uniqEmoji(await getEmojiByGroup(this._db, group)).map(cleanEmoji) + } + + async getEmojiBySearchQuery (query) { + assertNonEmptyString(query); + await this.ready(); + const customs = this._custom.search(query); + const natives = uniqEmoji(await getEmojiBySearchQuery(this._db, query)).map(cleanEmoji); + return [ + ...customs, + ...natives + ] + } + + async getEmojiByShortcode (shortcode) { + assertNonEmptyString(shortcode); + await this.ready(); + const custom = this._custom.byShortcode(shortcode); + if (custom) { + return custom + } + return cleanEmoji(await getEmojiByShortcode(this._db, shortcode)) + } + + async getEmojiByUnicodeOrName (unicodeOrName) { + assertNonEmptyString(unicodeOrName); + await this.ready(); + const custom = this._custom.byName(unicodeOrName); + if (custom) { + return custom + } + return cleanEmoji(await getEmojiByUnicode(this._db, unicodeOrName)) + } + + async getPreferredSkinTone () { + await this.ready(); + return (await get(this._db, STORE_KEYVALUE, KEY_PREFERRED_SKINTONE)) || 0 + } + + async setPreferredSkinTone (skinTone) { + assertNumber(skinTone); + await this.ready(); + return set(this._db, STORE_KEYVALUE, KEY_PREFERRED_SKINTONE, skinTone) + } + + async incrementFavoriteEmojiCount (unicodeOrName) { + assertNonEmptyString(unicodeOrName); + await this.ready(); + return incrementFavoriteEmojiCount(this._db, unicodeOrName) + } + + async getTopFavoriteEmoji (limit) { + assertNumber(limit); + await this.ready(); + return (await getTopFavoriteEmoji(this._db, this._custom, limit)).map(cleanEmoji) + } + + set customEmoji (customEmojis) { + this._custom = customEmojiIndex(customEmojis); + } + + get customEmoji () { + return this._custom.all + } + + async _shutdown () { + await this.ready(); // reopen if we've already been closed/deleted + try { + await this._lazyUpdate; // allow any lazy updates to process before closing/deleting + } catch (err) { /* ignore network errors (offline-first) */ } + } + + // clear references to IDB, e.g. during a close event + _clear () { + // We don't need to call removeEventListener or remove the manual "close" listeners. + // The memory leak tests prove this is unnecessary. It's because: + // 1) IDBDatabases that can no longer fire "close" automatically have listeners GCed + // 2) we clear the manual close listeners in databaseLifecycle.js. + this._db = this._ready = this._lazyUpdate = undefined; + } + + async close () { + await this._shutdown(); + await closeDatabase(this._dbName); + } + + async delete () { + await this._shutdown(); + await deleteDatabase(this._dbName); + } +} + +export { Database as default }; diff --git a/app/static/scripts/emoji-picker-element/i18n/ar.js b/app/static/scripts/emoji-picker-element/i18n/ar.js new file mode 100644 index 0000000..672a0d9 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/ar.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'ุงููุฆุงุช', + emojiUnsupportedMessage: 'ู ุชุตูุญู ูุง ูุฏุนู ุฑู ูุฒ ุงูู ุดุงุนุฑ ุงูู ูููุฉ.', + favoritesLabel: 'ุงูู ูุถูุฉ', + loadingMessage: 'ุฌุงุฑู ุงูุชุญู ููโฆ', + networkErrorMessage: 'ุชุนุฐุฑ ุชุญู ูู ุฑู ุฒ ู ุดุงุนุฑ.', + regionLabel: 'ู ูุชูู ุฑู ูุฒ ุงูู ุดุงุนุฑ', + searchDescription: 'ุนูุฏู ุง ุชููู ูุชุงุฆุฌ ุงูุจุญุซ ู ุชุงุญุฉุ ุงุถุบุท ุงูุณูู ูุฃุนูู ุฃู ูุฃุณูู ููุชุญุฏูุฏ ูุงุถุบุท enter ููุงุฎุชูุงุฑ.', + searchLabel: 'ุจุญุซ', + searchResultsLabel: 'ูุชุงุฆุฌ ุงูุจุญุซ', + skinToneDescription: 'ุนูุฏ ุชูุณูุน ุงููุชุงุฆุฌุ ุงุถุบุท ุงูุณูู ูุฃุนูู ุฃู ูุฃุณูู ููุชุญุฏูุฏ ูุงุถุบุท enter ููุงุฎุชูุงุฑ.', + skinToneLabel: 'ุงุฎุชุฑ ุฏุฑุฌุฉ ููู ุงูุจุดุฑุฉ (ุญุงูููุง {skinTone})', + skinTonesLabel: 'ุฏุฑุฌุงุช ููู ุงูุจุดุฑุฉ', + skinTones: [ + 'ุงูุชุฑุงุถู', + 'ูุงุชุญ', + 'ูุงุชุญ ู ุชูุณุท', + 'ู ุชูุณุท', + 'ุฏุงูู ู ุชูุณุท', + 'ุฏุงูู' + ], + categories: { + custom: 'ู ุฎุตุต', + 'smileys-emotion': 'ุงููุฌูู ุงูุถุงุญูุฉ ูุฑู ูุฒ ุงูู ุดุงุนุฑ', + 'people-body': 'ุงูุฃุดุฎุงุต ูุงูุฌุณุฏ', + 'animals-nature': 'ุงูุญููุงูุงุช ูุงูุทุจูุนุฉ', + 'food-drink': 'ุงูุทุนุงู ูุงูุดุฑุงุจ', + 'travel-places': 'ุงูุณูุฑ ูุงูุฃู ุงูู', + activities: 'ุงูุฃูุดุทุฉ', + objects: 'ุงูุฃุดูุงุก', + symbols: 'ุงูุฑู ูุฒ', + flags: 'ุงูุฃุนูุงู ' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/de.js b/app/static/scripts/emoji-picker-element/i18n/de.js new file mode 100644 index 0000000..bd21ed3 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/de.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Kategorien', + emojiUnsupportedMessage: 'Dein Browser unterstรผtzt keine farbigen Emojis.', + favoritesLabel: 'Favoriten', + loadingMessage: 'Wird geladenโฆ', + networkErrorMessage: 'Konnte Emoji nicht laden.', + regionLabel: 'Emoji auswรคhlen', + searchDescription: 'Wenn Suchergebnisse verfรผgbar sind, wรคhle sie mit Pfeil rauf und runter, dann Eingabetaste, aus.', + searchLabel: 'Suchen', + searchResultsLabel: 'Suchergebnisse', + skinToneDescription: 'Wenn angezeigt, nutze Pfeiltasten rauf und runter zum Auswรคhlen, Eingabe zum Akzeptieren.', + skinToneLabel: 'Wรคhle einen Hautton (aktuell {skinTone})', + skinTonesLabel: 'Hauttรถne', + skinTones: [ + 'Standard', + 'Hell', + 'Mittel-hell', + 'Mittel', + 'Mittel-dunkel', + 'Dunkel' + ], + categories: { + custom: 'Benutzerdefiniert', + 'smileys-emotion': 'Smileys und Emoticons', + 'people-body': 'Menschen und Kรถrper', + 'animals-nature': 'Tiere und Natur', + 'food-drink': 'Essen und Trinken', + 'travel-places': 'Reisen und Orte', + activities: 'Aktivitรคten', + objects: 'Objekte', + symbols: 'Symbole', + flags: 'Flaggen' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/en.js b/app/static/scripts/emoji-picker-element/i18n/en.js new file mode 100644 index 0000000..57e15ff --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/en.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Categories', + emojiUnsupportedMessage: 'Your browser does not support color emoji.', + favoritesLabel: 'Favorites', + loadingMessage: 'Loadingโฆ', + networkErrorMessage: 'Could not load emoji.', + regionLabel: 'Emoji picker', + searchDescription: 'When search results are available, press up or down to select and enter to choose.', + searchLabel: 'Search', + searchResultsLabel: 'Search results', + skinToneDescription: 'When expanded, press up or down to select and enter to choose.', + skinToneLabel: 'Choose a skin tone (currently {skinTone})', + skinTonesLabel: 'Skin tones', + skinTones: [ + 'Default', + 'Light', + 'Medium-Light', + 'Medium', + 'Medium-Dark', + 'Dark' + ], + categories: { + custom: 'Custom', + 'smileys-emotion': 'Smileys and emoticons', + 'people-body': 'People and body', + 'animals-nature': 'Animals and nature', + 'food-drink': 'Food and drink', + 'travel-places': 'Travel and places', + activities: 'Activities', + objects: 'Objects', + symbols: 'Symbols', + flags: 'Flags' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/es.js b/app/static/scripts/emoji-picker-element/i18n/es.js new file mode 100644 index 0000000..9b8ec49 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/es.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Categorรญas', + emojiUnsupportedMessage: 'El navegador no admite emojis de color.', + favoritesLabel: 'Favoritos', + loadingMessage: 'Cargandoโฆ', + networkErrorMessage: 'No se pudo cargar el emoji.', + regionLabel: 'Selector de emojis', + searchDescription: 'Cuando estรฉn disponibles los resultados, pulsa la tecla hacia arriba o hacia abajo para seleccionar y la tecla intro para elegir.', + searchLabel: 'Buscar', + searchResultsLabel: 'Resultados de bรบsqueda', + skinToneDescription: 'Cuando se abran las opciones, pulsa la tecla hacia arriba o hacia abajo para seleccionar y la tecla intro para elegir.', + skinToneLabel: 'Elige un tono de piel ({skinTone} es el actual)', + skinTonesLabel: 'Tonos de piel', + skinTones: [ + 'Predeterminado', + 'Claro', + 'Claro medio', + 'Medio', + 'Oscuro medio', + 'Oscuro' + ], + categories: { + custom: 'Personalizado', + 'smileys-emotion': 'Emojis y emoticones', + 'people-body': 'Personas y partes del cuerpo', + 'animals-nature': 'Animales y naturaleza', + 'food-drink': 'Comida y bebida', + 'travel-places': 'Viajes y lugares', + activities: 'Actividades', + objects: 'Objetos', + symbols: 'Sรญmbolos', + flags: 'Banderas' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/fr.js b/app/static/scripts/emoji-picker-element/i18n/fr.js new file mode 100644 index 0000000..d61e2cf --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/fr.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Catรฉgories', + emojiUnsupportedMessage: 'Votre navigateur ne soutient pas les emojis en couleur.', + favoritesLabel: 'Favoris', + loadingMessage: 'Chargement en coursโฆ', + networkErrorMessage: 'Impossible de charger les emojis.', + regionLabel: 'Choisir un emoji', + searchDescription: 'Quand les rรฉsultats sont disponisbles, appuyez la fleche vers le haut ou le bas et la touche entrรฉe pour choisir.', + searchLabel: 'Rechercher', + searchResultsLabel: 'Rรฉsultats', + skinToneDescription: 'Quand disponible, appuyez la fleche vers le haut ou le bas et la touch entrรฉe pour choisir.', + skinToneLabel: 'Choisir une couleur de peau (actuellement {skinTone})', + skinTonesLabel: 'Couleurs de peau', + skinTones: [ + 'Dรฉfaut', + 'Clair', + 'Moyennement clair', + 'Moyen', + 'Moyennement sombre', + 'Sombre' + ], + categories: { + custom: 'Customisรฉ', + 'smileys-emotion': 'Les smileyes et les รฉmoticรดnes', + 'people-body': 'Les gens et le corps', + 'animals-nature': 'Les animaux et la nature', + 'food-drink': 'La nourriture et les boissons', + 'travel-places': 'Les voyages et les endroits', + activities: 'Les activitรฉs', + objects: 'Les objets', + symbols: 'Les symbols', + flags: 'Les drapeaux' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/hi.js b/app/static/scripts/emoji-picker-element/i18n/hi.js new file mode 100644 index 0000000..1141cd1 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/hi.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'เคถเฅเคฐเฅเคฃเคฟเคฏเคพเค', + emojiUnsupportedMessage: 'เคเคชเคเคพ เคฌเฅเคฐเคพเคเคเคผเคฐ เคเคฒเคฐ เคเคฎเฅเคเฅ เคเคพ เคธเคฎเคฐเฅเคฅเคจ เคจเคนเฅเค เคเคฐเคคเคพเฅค', + favoritesLabel: 'เคชเคธเคเคฆเฅเคฆเคพ', + loadingMessage: 'เคฒเฅเคก เคนเฅ เคฐเคนเคพ เคนเฅ...', + networkErrorMessage: 'เคเคฎเฅเคเฅ เคฒเฅเคก เคจเคนเฅเค เคนเฅ เคธเคเฅเฅค', + regionLabel: 'เคเคฎเฅเคเฅ เคเฅเคจเคจเฅเคตเคพเคฒเคพ', + searchDescription: 'เคเคฌ เคเฅเค เคชเคฐเคฟเคฃเคพเคฎ เคเคชเคฒเคฌเฅเคง เคนเฅเค เคคเฅ เคเคฏเคจ เคเคฐเคจเฅ เคเฅ เคฒเคฟเค เคเคชเคฐ เคฏเคพ เคจเฅเคเฅ เคฆเคฌเคพเคเค เคเคฐ เคเฅเคจเคจเฅ เคเฅ เคฒเคฟเค เคเคเคเคฐ เคฆเคฌเคพเคเคเฅค', + searchLabel: 'เคเฅเค', + searchResultsLabel: 'เคเฅเค เคเฅ เคชเคฐเคฟเคฃเคพเคฎ', + skinToneDescription: 'เคเคฌ เคตเคฟเคธเฅเคคเฅเคค เคเคฟเคฏเคพ เคเคพเคคเคพ เคนเฅ เคคเฅ เคเคฏเคจ เคเคฐเคจเฅ เคเฅ เคฒเคฟเค เคเคชเคฐ เคฏเคพ เคจเฅเคเฅ เคฆเคฌเคพเคเค เคเคฐ เคเฅเคจเคจเฅ เคเฅ เคฒเคฟเค เคเคเคเคฐ เคฆเคฌเคพเคเคเฅค', + skinToneLabel: 'เคคเฅเคตเคเคพ เคเคพ เคฐเคเค เคเฅเคจเฅเค (เคตเคฐเฅเคคเคฎเคพเคจ เคฎเฅเค {skinTone})', + skinTonesLabel: 'เคคเฅเคตเคเคพ เคเฅ เคฐเคเค', + skinTones: [ + 'เคกเคฟเคซเฅเคฒเฅเค', + 'เคนเคฒเฅเคเคพ', + 'เคฎเคงเฅเคฏเคฎ เคนเคฒเฅเคเคพ', + 'เคฎเคงเฅเคฏเคฎ', + 'เคฎเคงเฅเคฏเคฎ เคเคนเคฐเคพ', + 'เคเคนเคฐเคพ' + ], + categories: { + custom: 'เคเคธเฅเคเคฎ', + 'smileys-emotion': 'เคธเฅเคฎเคพเคเคฒเฅ เคเคฐ เคเคฎเฅเคเคฟเคเฅเคจเฅเคธ', + 'people-body': 'เคฒเฅเค เคเคฐ เคถเคฐเฅเคฐ', + 'animals-nature': 'เคชเคถเฅ เคเคฐ เคชเฅเคฐเคเฅเคคเคฟ', + 'food-drink': 'เคเคพเคฆเฅเคฏ เคเคฐ เคชเฅเคฏ', + 'travel-places': 'เคฏเคพเคคเฅเคฐเคพ เคเคฐ เคธเฅเคฅเคพเคจ', + activities: 'เคเคคเคฟเคตเคฟเคงเคฟเคฏเคพเค', + objects: 'เคตเคธเฅเคคเฅเคเค', + symbols: 'เคชเฅเคฐเคคเฅเค', + flags: 'เคเคเคกเฅ' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/id.js b/app/static/scripts/emoji-picker-element/i18n/id.js new file mode 100644 index 0000000..994a26d --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/id.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Kategori', + emojiUnsupportedMessage: 'Browser Anda tidak mendukung emoji warna.', + favoritesLabel: 'Favorit', + loadingMessage: 'Memuat...', + networkErrorMessage: 'Tidak dapat memuat emoji.', + regionLabel: 'Pemilih emoji', + searchDescription: 'Ketika hasil pencarian tersedia, tekan atas atau bawah untuk menyeleksi dan enter untuk memilih.', + searchLabel: 'Cari', + searchResultsLabel: 'Hasil Pencarian', + skinToneDescription: 'Saat diperluas tekan atas atau bawah untuk menyeleksi dan enter untuk memilih.', + skinToneLabel: 'Pilih warna skin (saat ini {skinTone})', + skinTonesLabel: 'Warna skin', + skinTones: [ + 'Default', + 'Light', + 'Medium light', + 'Medium', + 'Medium dark', + 'Dark' + ], + categories: { + custom: 'Kustom', + 'smileys-emotion': 'Smiley dan emoticon', + 'people-body': 'Orang dan bagian tubuh', + 'animals-nature': 'Hewan dan tumbuhan', + 'food-drink': 'Makanan dan minuman', + 'travel-places': 'Rekreasi dan tempat', + activities: 'Aktivitas', + objects: 'Objek', + symbols: 'Simbol', + flags: 'Bendera' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/it.js b/app/static/scripts/emoji-picker-element/i18n/it.js new file mode 100644 index 0000000..df55324 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/it.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Categorie', + emojiUnsupportedMessage: 'Il tuo browser non supporta le emoji colorate.', + favoritesLabel: 'Preferiti', + loadingMessage: 'Caricamento...', + networkErrorMessage: 'Impossibile caricare le emoji.', + regionLabel: 'Selezione emoji', + searchDescription: 'Quando i risultati della ricerca sono disponibili, premi su o giรน per selezionare e invio per scegliere.', + searchLabel: 'Cerca', + searchResultsLabel: 'Risultati di ricerca', + skinToneDescription: 'Quando espanso, premi su o giรน per selezionare e invio per scegliere.', + skinToneLabel: 'Scegli una tonalitร della pelle (corrente {skinTone})', + skinTonesLabel: 'Tonalitร della pelle', + skinTones: [ + 'Predefinita', + 'Chiara', + 'Medio-Chiara', + 'Media', + 'Medio-Scura', + 'Scura' + ], + categories: { + custom: 'Personalizzata', + 'smileys-emotion': 'Faccine ed emozioni', + 'people-body': 'Persone e corpi', + 'animals-nature': 'Animali e natura', + 'food-drink': 'Cibi e bevande', + 'travel-places': 'Viaggi e luoghi', + activities: 'Attivitร ', + objects: 'Oggetti', + symbols: 'Simboli', + flags: 'Bandiere' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/ms_MY.js b/app/static/scripts/emoji-picker-element/i18n/ms_MY.js new file mode 100644 index 0000000..21ae388 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/ms_MY.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Kategori', + emojiUnsupportedMessage: 'Penyemak imbas anda tidak menyokong emoji warna.', + favoritesLabel: 'Kegemaran', + loadingMessage: 'Memuatโฆ', + networkErrorMessage: 'Tidak dapat memuatkan emoji.', + regionLabel: 'Pemilih emoji', + searchDescription: 'Apabila hasil carian tersedia, tekan atas atau bawah untuk memilih dan tekan masukkan untuk memilih.', + searchLabel: 'Cari', + searchResultsLabel: 'Hasil carian', + skinToneDescription: 'Apabila dikembangkan, tekan atas atau bawah untuk memilih dan tekan masukkan untuk memilih.', + skinToneLabel: 'Pilih warna kulit (pada masa ini {skinTone})', + skinTonesLabel: 'Warna kulit', + skinTones: [ + 'Lalai', + 'Cerah', + 'Kuning langsat', + 'Sederhana cerah', + 'Sawo matang', + 'Gelap' + ], + categories: { + custom: 'Tersuai', + 'smileys-emotion': 'Smiley dan emotikon', + 'people-body': 'Orang dan badan', + 'animals-nature': 'Haiwan dan alam semula jadi', + 'food-drink': 'Makanan dan minuman', + 'travel-places': 'Perjalanan dan tempat', + activities: 'Aktiviti', + objects: 'Objek', + symbols: 'Simbol', + flags: 'Bendera' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/nl.js b/app/static/scripts/emoji-picker-element/i18n/nl.js new file mode 100644 index 0000000..a2dabc5 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/nl.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Categorieรซn', + emojiUnsupportedMessage: 'Uw browser ondersteunt geen kleurenemoji.', + favoritesLabel: 'Favorieten', + loadingMessage: 'Bezig met ladenโฆ', + networkErrorMessage: 'Kan emoji niet laden.', + regionLabel: 'Emoji-kiezer', + searchDescription: 'Als er zoekresultaten beschikbaar zijn, drukt u op omhoog of omlaag om te selecteren en op enter om te kiezen.', + searchLabel: 'Zoeken', + searchResultsLabel: 'Zoekresultaten', + skinToneDescription: 'Wanneer uitgevouwen, druk omhoog of omlaag om te selecteren en enter om te kiezen.', + skinToneLabel: 'Kies een huidskleur (momenteel {skinTone})', + skinTonesLabel: 'Huidskleuren', + skinTones: [ + 'Standaard', + 'Licht', + 'Medium-Licht', + 'Medium', + 'Middeldonker', + 'Donker' + ], + categories: { + custom: 'Aangepast', + 'smileys-emotion': 'Smileys en emoticons', + 'people-body': 'Mensen en lichaam', + 'animals-nature': 'Dieren en natuur', + 'food-drink': 'Eten en drinken', + 'travel-places': 'Reizen en plaatsen', + activities: 'Activiteiten', + objects: 'Voorwerpen', + symbols: 'Symbolen', + flags: 'Vlaggen' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/pl.js b/app/static/scripts/emoji-picker-element/i18n/pl.js new file mode 100644 index 0000000..454cb7d --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/pl.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Kategorie', + emojiUnsupportedMessage: 'Twoja przeglฤ darka nie wspiera kolorowych emotikon.', + favoritesLabel: 'Ulubione', + loadingMessage: 'ลadujฤโฆ', + networkErrorMessage: 'Nie moลผna zaลadowaฤ emoji.', + regionLabel: 'Selektor emoji', + searchDescription: 'Kiedy wyniki wyszukiwania bฤdฤ dostฤpne, wciลnij gรณra lub dรณล aby wybraฤ oraz enter aby zatwierdziฤ wybรณr.', + searchLabel: 'Wyszukaj', + searchResultsLabel: 'Wyniki wyszukiwania', + skinToneDescription: 'Po rozwiniฤciu wciลnij gรณra lub dรณล aby wybraฤ oraz enter aby zatwierdziฤ wybรณr.', + skinToneLabel: 'Wybierz odcieล skรณry (aktualnie {skinTone})', + skinTonesLabel: 'Odcienie skรณry', + skinTones: [ + 'Domyลlna', + 'Jasna', + 'ลrednio-jasna', + 'ลrednia', + 'ลrednio-ciemna', + 'Ciemna' + ], + categories: { + custom: 'Wลasne', + 'smileys-emotion': 'Uลmiechy', + 'people-body': 'Ludzie', + 'animals-nature': 'Zwierzฤta i natura', + 'food-drink': 'ลปywnoลฤ i napoje', + 'travel-places': 'Podrรณลผe i miejsca', + activities: 'Aktywnoลci', + objects: 'Obiekty', + symbols: 'Symbole', + flags: 'Flagi' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/pt_BR.js b/app/static/scripts/emoji-picker-element/i18n/pt_BR.js new file mode 100644 index 0000000..25b5dc9 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/pt_BR.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Categorias', + emojiUnsupportedMessage: 'Seu navegador nรฃo suporta emojis coloridos.', + favoritesLabel: 'Favoritos', + loadingMessage: 'Carregandoโฆ', + networkErrorMessage: 'Nรฃo foi possรญvel carregar o emoji.', + regionLabel: 'Seletor de emoji', + searchDescription: 'Quando os resultados da pesquisa estiverem disponรญveis, pressione para cima ou para baixo para selecionar e โenterโ para escolher.', + searchLabel: 'Procurar', + searchResultsLabel: 'Resultados da pesquisa', + skinToneDescription: 'Quando expandido, pressione para cima ou para baixo para selecionar e โenterโ para escolher.', + skinToneLabel: 'Escolha um tom de pele (atualmente {skinTone})', + skinTonesLabel: 'Tons de pele', + skinTones: [ + 'Padrรฃo', + 'Claro', + 'Claro mรฉdio', + 'Mรฉdio', + 'Escuro mรฉdio', + 'Escuro' + ], + categories: { + custom: 'Personalizar', + 'smileys-emotion': 'Carinhas e emoticons', + 'people-body': 'Pessoas e corpo', + 'animals-nature': 'Animais e natureza', + 'food-drink': 'Alimentos e bebidas', + 'travel-places': 'Viagem e lugares', + activities: 'Atividades', + objects: 'Objetos', + symbols: 'Sรญmbolos', + flags: 'Bandeiras' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/pt_PT.js b/app/static/scripts/emoji-picker-element/i18n/pt_PT.js new file mode 100644 index 0000000..93d88db --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/pt_PT.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Categorias', + emojiUnsupportedMessage: 'O seu browser nรฃo suporta emojis.', + favoritesLabel: 'Favoritos', + loadingMessage: 'A Carregarโฆ', + networkErrorMessage: 'Nรฃo foi possรญvel carregar o emoji.', + regionLabel: 'Emoji picker', + searchDescription: 'Quando os resultados da pesquisa estiverem disponรญveis, pressione para cima ou para baixo para selecionar e digite para escolher.', + searchLabel: 'Procurar', + searchResultsLabel: 'Resultados da procura', + skinToneDescription: 'Quando expandido, pressione para cima ou para baixo para selecionar e digite para escolher.', + skinToneLabel: 'Escolha um tom de pele (atual {skinTone})', + skinTonesLabel: 'Tons de pele', + skinTones: [ + 'Prรฉ-definido', + 'Claro', + 'Mรฉdio-Claro', + 'Mรฉdio', + 'Mรฉdio-Escuro', + 'Escuro' + ], + categories: { + custom: 'Personalizados', + 'smileys-emotion': 'Smileys e emoticons', + 'people-body': 'Pessoas e corpo', + 'animals-nature': 'Animais e natureza', + 'food-drink': 'Comida e bebida', + 'travel-places': 'Viagens e locais', + activities: 'Atividades', + objects: 'Objetos', + symbols: 'Sรญmbolos', + flags: 'Bandeiras' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/ru_RU.js b/app/static/scripts/emoji-picker-element/i18n/ru_RU.js new file mode 100644 index 0000000..ea90966 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/ru_RU.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'ะะฐัะตะณะพัะธะธ', + emojiUnsupportedMessage: 'ะะฐั ะฑัะฐัะทะตั ะฝะต ะฟะพะดะดะตัะถะธะฒะฐะตั ัะฒะตัะฝัะต ัะผะพะดะทะธ.', + favoritesLabel: 'ะะทะฑัะฐะฝะฝะพะต', + loadingMessage: 'ะะฐะณััะทะบะฐโฆ', + networkErrorMessage: 'ะะต ัะดะฐะปะพัั ะทะฐะณััะทะธัั ัะผะพะดะทะธ. ะะพะฟัะพะฑัะนัะต ะฟะตัะตะทะฐะณััะทะธัั ัััะฐะฝะธัั.', + regionLabel: 'ะัะฑะตัะธัะต ัะผะพะดะทะธ', + searchDescription: 'ะะพะณะดะฐ ัะตะทัะปััะฐัั ะฟะพะธัะบะฐ ััะฐะฝัั ะดะพัััะฟะฝั, ะฒัะฑะตัะธัะต ะธั ั ะฟะพะผะพััั ัััะตะปะพะบ ะฒะฒะตัั ะธ ะฒะฝะธะท, ะทะฐัะตะผ ะฝะฐะถะผะธัะต ะดะปั ะฟะพะดัะฒะตัะถะดะตะฝะธั.', + searchLabel: 'ะัะบะฐัั', + searchResultsLabel: 'ะ ะตะทัะปััะฐัั ะฟะพะธัะบะฐ', + skinToneDescription: 'ะัะธ ะพัะพะฑัะฐะถะตะฝะธะธ ะธัะฟะพะปัะทัะนัะต ะบะปะฐะฒะธัะธ ัะพ ัััะตะปะบะฐะผะธ ะฒะฒะตัั ะธ ะฒะฝะธะท ะดะปั ะฒัะฑะพัะฐ, ะฝะฐะถะผะธัะต ะดะปั ะฟะพะดัะฒะตัะถะดะตะฝะธั.', + skinToneLabel: 'ะัะฑะตัะธัะต ะพััะตะฝะพะบ ะบะพะถะธ (ัะตะบััะธะน {skinTone})', + skinTonesLabel: 'ะััะตะฝะบะธ ะบะพะถะธ', + skinTones: [ + 'ะกัะฐะฝะดะฐััะฝัะน', + 'ะกะฒะตัะปัะน', + 'ะกัะตะดะฝะต-ัะฒะตัะปัะน', + 'ะกัะตะดะฝะธะน', + 'ะกัะตะดะฝะต-ัะตะผะฝัะน', + 'ะขะตะผะฝัะน' + ], + categories: { + custom: 'ะะพะปัะทะพะฒะฐัะตะปััะบะธะน', + 'smileys-emotion': 'ะกะผะฐะนะปะธะบะธ ะธ ะญะผะพัะธะบะพะฝั', + 'people-body': 'ะัะดะธ ะธ ะขะตะปะฐ', + 'animals-nature': 'ะะธะฒะพัะฝัะต ะธ ะัะธัะพะดะฐ', + 'food-drink': 'ะะดะฐ ะธ ะะฐะฟะธัะบะธ', + 'travel-places': 'ะััะตัะตััะฒะธั ะธ ะะตััะฐ', + activities: 'ะะธะดั ะดะตััะตะปัะฝะพััะธ', + objects: 'ะะฑัะตะบัั', + symbols: 'ะกะธะผะฒะพะปั', + flags: 'ะคะปะฐะณะธ' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/tr.js b/app/static/scripts/emoji-picker-element/i18n/tr.js new file mode 100644 index 0000000..c41491b --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/tr.js @@ -0,0 +1,34 @@ +export default { + categoriesLabel: 'Kategoriler', + emojiUnsupportedMessage: 'Tarayฤฑcฤฑnฤฑz renkli emojiyi desteklemiyor.', + favoritesLabel: 'Favoriler', + loadingMessage: 'Yรผkleniyorโฆ', + networkErrorMessage: 'Emoji yรผklenemedi.', + regionLabel: 'Emoji seรงici', + searchDescription: 'Arama sonuรงlarฤฑ mevcut olduฤunda seรงmek iรงin yukarฤฑ veya aลaฤฤฑ basฤฑn ve seรงmek iรงin girin.', + searchLabel: 'Arama', + searchResultsLabel: 'Arama sonuรงlarฤฑ', + skinToneDescription: 'Geniลletildiฤinde seรงmek iรงin yukarฤฑ veya aลaฤฤฑ basฤฑn ve seรงmek iรงin girin.', + skinToneLabel: 'Cilt tonu seรงin (ลu anda {skinTone})', + skinTonesLabel: 'Cilt tonlarฤฑ', + skinTones: [ + 'Varsayฤฑlan', + 'Iลฤฑk', + 'Orta ฤฑลฤฑk', + 'Orta', + 'Orta koyu', + 'Karanlฤฑk' + ], + categories: { + custom: 'Gelenek', + 'smileys-emotion': 'Suratlar ve ifadeler', + 'people-body': 'ฤฐnsanlar ve vรผcut', + 'animals-nature': 'Hayvanlar ve doฤa', + 'food-drink': 'Yiyecek ve iรงecek', + 'travel-places': 'Seyahat ve yerler', + activities: 'Aktiviteler', + objects: 'Nesneler', + symbols: 'Semboller', + flags: 'Bayraklar' + } +} diff --git a/app/static/scripts/emoji-picker-element/i18n/zh_CN.js b/app/static/scripts/emoji-picker-element/i18n/zh_CN.js new file mode 100644 index 0000000..6dd452a --- /dev/null +++ b/app/static/scripts/emoji-picker-element/i18n/zh_CN.js @@ -0,0 +1,27 @@ +export default { + categoriesLabel: '็ฑปๅซ', + emojiUnsupportedMessage: 'ๆจ็ๆต่งๅจไธๆฏๆๅฝฉ่ฒ่กจๆ ็ฌฆๅทใ', + favoritesLabel: 'ๆถ่ๅคน', + loadingMessage: 'ๆญฃๅจๅ ่ฝฝโฆ', + networkErrorMessage: 'ๆ ๆณๅ ่ฝฝ่กจๆ ็ฌฆๅทใ', + regionLabel: '่กจๆ ็ฌฆๅท้ๆฉๅจ', + searchDescription: 'ๅฝๆ็ดข็ปๆๅฏ็จๆถ๏ผๆๅไธๆๅไธ้ๆฉๅนถ่พๅ ฅ้ๆฉใ', + searchLabel: 'ๆ็ดข', + searchResultsLabel: 'ๆ็ดข็ปๆ', + skinToneDescription: 'ๅฑๅผๆถ๏ผๆๅไธๆๅไธ้ฎ่ฟ่ก้ๆฉ๏ผๆๅ่ฝฆ้ฎ่ฟ่ก้ๆฉใ', + skinToneLabel: '้ๆฉ่ค่ฒ๏ผๅฝๅไธบ {skinTone}๏ผ', + skinTonesLabel: '่ค่ฒ', + skinTones: ['้ป่ฎค', 'ๆไบฎ', 'ๅพฎไบฎ', 'ไธญ็ญ', 'ๅพฎๆ', 'ๆ'], + categories: { + custom: '่ชๅฎไน', + 'smileys-emotion': '็ฌ่ธๅ่กจๆ ', + 'people-body': 'ไบบ็ฉๅ่บซไฝ', + 'animals-nature': 'ๅจ็ฉไธ่ช็ถ', + 'food-drink': '้ฃๅ้ฅฎๆ', + 'travel-places': 'ๆ ่กๅๅฐๆน', + activities: 'ๆดปๅจ', + objects: '็ฉไฝ', + symbols: '็ฌฆๅท', + flags: 'ๆๅธ' + } +} diff --git a/app/static/scripts/emoji-picker-element/index.js b/app/static/scripts/emoji-picker-element/index.js new file mode 100644 index 0000000..aa23cc4 --- /dev/null +++ b/app/static/scripts/emoji-picker-element/index.js @@ -0,0 +1,3 @@ +import Picker from './picker.js' +import Database from './database.js' +export { Picker, Database } diff --git a/app/static/scripts/emoji-picker-element/picker.js b/app/static/scripts/emoji-picker-element/picker.js new file mode 100644 index 0000000..c4ed88b --- /dev/null +++ b/app/static/scripts/emoji-picker-element/picker.js @@ -0,0 +1,2704 @@ +import Database from './database.js'; + +function noop() { } +function run(fn) { + return fn(); +} +function blank_object() { + return Object.create(null); +} +function run_all(fns) { + fns.forEach(run); +} +function is_function(thing) { + return typeof thing === 'function'; +} +function safe_not_equal(a, b) { + return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function'); +} +let src_url_equal_anchor; +function src_url_equal(element_src, url) { + if (!src_url_equal_anchor) { + src_url_equal_anchor = document.createElement('a'); + } + src_url_equal_anchor.href = url; + return element_src === src_url_equal_anchor.href; +} +function is_empty(obj) { + return Object.keys(obj).length === 0; +} +function action_destroyer(action_result) { + return action_result && is_function(action_result.destroy) ? action_result.destroy : noop; +} +function append(target, node) { + target.appendChild(node); +} +function insert(target, node, anchor) { + target.insertBefore(node, anchor || null); +} +function detach(node) { + if (node.parentNode) { + node.parentNode.removeChild(node); + } +} +function element(name) { + return document.createElement(name); +} +function text(data) { + return document.createTextNode(data); +} +function listen(node, event, handler, options) { + node.addEventListener(event, handler, options); + return () => node.removeEventListener(event, handler, options); +} +function attr(node, attribute, value) { + if (value == null) + node.removeAttribute(attribute); + else if (node.getAttribute(attribute) !== value) + node.setAttribute(attribute, value); +} +function set_data(text, data) { + data = '' + data; + if (text.wholeText !== data) + text.data = data; +} +function set_input_value(input, value) { + input.value = value == null ? '' : value; +} +function set_style(node, key, value, important) { + if (value === null) { + node.style.removeProperty(key); + } + else { + node.style.setProperty(key, value, important ? 'important' : ''); + } +} + +let current_component; +function set_current_component(component) { + current_component = component; +} +function get_current_component() { + if (!current_component) + throw new Error('Function called outside component initialization'); + return current_component; +} +/** + * The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM. + * It must be called during the component's initialisation (but doesn't need to live *inside* the component; + * it can be called from an external module). + * + * `onMount` does not run inside a [server-side component](/docs#run-time-server-side-component-api). + * + * https://svelte.dev/docs#run-time-svelte-onmount + */ +function onMount(fn) { + get_current_component().$$.on_mount.push(fn); +} + +const dirty_components = []; +const binding_callbacks = []; +const render_callbacks = []; +const flush_callbacks = []; +const resolved_promise = Promise.resolve(); +let update_scheduled = false; +function schedule_update() { + if (!update_scheduled) { + update_scheduled = true; + resolved_promise.then(flush); + } +} +function tick() { + schedule_update(); + return resolved_promise; +} +function add_render_callback(fn) { + render_callbacks.push(fn); +} +// flush() calls callbacks in this order: +// 1. All beforeUpdate callbacks, in order: parents before children +// 2. All bind:this callbacks, in reverse order: children before parents. +// 3. All afterUpdate callbacks, in order: parents before children. EXCEPT +// for afterUpdates called during the initial onMount, which are called in +// reverse order: children before parents. +// Since callbacks might update component values, which could trigger another +// call to flush(), the following steps guard against this: +// 1. During beforeUpdate, any updated components will be added to the +// dirty_components array and will cause a reentrant call to flush(). Because +// the flush index is kept outside the function, the reentrant call will pick +// up where the earlier call left off and go through all dirty components. The +// current_component value is saved and restored so that the reentrant call will +// not interfere with the "parent" flush() call. +// 2. bind:this callbacks cannot trigger new flush() calls. +// 3. During afterUpdate, any updated components will NOT have their afterUpdate +// callback called a second time; the seen_callbacks set, outside the flush() +// function, guarantees this behavior. +const seen_callbacks = new Set(); +let flushidx = 0; // Do *not* move this inside the flush() function +function flush() { + // Do not reenter flush while dirty components are updated, as this can + // result in an infinite loop. Instead, let the inner flush handle it. + // Reentrancy is ok afterwards for bindings etc. + if (flushidx !== 0) { + return; + } + const saved_component = current_component; + do { + // first, call beforeUpdate functions + // and update components + try { + while (flushidx < dirty_components.length) { + const component = dirty_components[flushidx]; + flushidx++; + set_current_component(component); + update(component.$$); + } + } + catch (e) { + // reset dirty state to not end up in a deadlocked state and then rethrow + dirty_components.length = 0; + flushidx = 0; + throw e; + } + set_current_component(null); + dirty_components.length = 0; + flushidx = 0; + while (binding_callbacks.length) + binding_callbacks.pop()(); + // then, once components are updated, call + // afterUpdate functions. This may cause + // subsequent updates... + for (let i = 0; i < render_callbacks.length; i += 1) { + const callback = render_callbacks[i]; + if (!seen_callbacks.has(callback)) { + // ...so guard against infinite loops + seen_callbacks.add(callback); + callback(); + } + } + render_callbacks.length = 0; + } while (dirty_components.length); + while (flush_callbacks.length) { + flush_callbacks.pop()(); + } + update_scheduled = false; + seen_callbacks.clear(); + set_current_component(saved_component); +} +function update($$) { + if ($$.fragment !== null) { + $$.update(); + run_all($$.before_update); + const dirty = $$.dirty; + $$.dirty = [-1]; + $$.fragment && $$.fragment.p($$.ctx, dirty); + $$.after_update.forEach(add_render_callback); + } +} +const outroing = new Set(); +function transition_in(block, local) { + if (block && block.i) { + outroing.delete(block); + block.i(local); + } +} + +const globals = (typeof window !== 'undefined' + ? window + : typeof globalThis !== 'undefined' + ? globalThis + : global); + +function destroy_block(block, lookup) { + block.d(1); + lookup.delete(block.key); +} +function update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) { + let o = old_blocks.length; + let n = list.length; + let i = o; + const old_indexes = {}; + while (i--) + old_indexes[old_blocks[i].key] = i; + const new_blocks = []; + const new_lookup = new Map(); + const deltas = new Map(); + i = n; + while (i--) { + const child_ctx = get_context(ctx, list, i); + const key = get_key(child_ctx); + let block = lookup.get(key); + if (!block) { + block = create_each_block(key, child_ctx); + block.c(); + } + else if (dynamic) { + block.p(child_ctx, dirty); + } + new_lookup.set(key, new_blocks[i] = block); + if (key in old_indexes) + deltas.set(key, Math.abs(i - old_indexes[key])); + } + const will_move = new Set(); + const did_move = new Set(); + function insert(block) { + transition_in(block, 1); + block.m(node, next); + lookup.set(block.key, block); + next = block.first; + n--; + } + while (o && n) { + const new_block = new_blocks[n - 1]; + const old_block = old_blocks[o - 1]; + const new_key = new_block.key; + const old_key = old_block.key; + if (new_block === old_block) { + // do nothing + next = new_block.first; + o--; + n--; + } + else if (!new_lookup.has(old_key)) { + // remove old block + destroy(old_block, lookup); + o--; + } + else if (!lookup.has(new_key) || will_move.has(new_key)) { + insert(new_block); + } + else if (did_move.has(old_key)) { + o--; + } + else if (deltas.get(new_key) > deltas.get(old_key)) { + did_move.add(new_key); + insert(new_block); + } + else { + will_move.add(old_key); + o--; + } + } + while (o--) { + const old_block = old_blocks[o]; + if (!new_lookup.has(old_block.key)) + destroy(old_block, lookup); + } + while (n) + insert(new_blocks[n - 1]); + return new_blocks; +} +function mount_component(component, target, anchor, customElement) { + const { fragment, after_update } = component.$$; + fragment && fragment.m(target, anchor); + if (!customElement) { + // onMount happens before the initial afterUpdate + add_render_callback(() => { + const new_on_destroy = component.$$.on_mount.map(run).filter(is_function); + // if the component was destroyed immediately + // it will update the `$$.on_destroy` reference to `null`. + // the destructured on_destroy may still reference to the old array + if (component.$$.on_destroy) { + component.$$.on_destroy.push(...new_on_destroy); + } + else { + // Edge case - component was destroyed immediately, + // most likely as a result of a binding initialising + run_all(new_on_destroy); + } + component.$$.on_mount = []; + }); + } + after_update.forEach(add_render_callback); +} +function destroy_component(component, detaching) { + const $$ = component.$$; + if ($$.fragment !== null) { + run_all($$.on_destroy); + $$.fragment && $$.fragment.d(detaching); + // TODO null out other refs, including component.$$ (but need to + // preserve final state?) + $$.on_destroy = $$.fragment = null; + $$.ctx = []; + } +} +function make_dirty(component, i) { + if (component.$$.dirty[0] === -1) { + dirty_components.push(component); + schedule_update(); + component.$$.dirty.fill(0); + } + component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31)); +} +function init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) { + const parent_component = current_component; + set_current_component(component); + const $$ = component.$$ = { + fragment: null, + ctx: [], + // state + props, + update: noop, + not_equal, + bound: blank_object(), + // lifecycle + on_mount: [], + on_destroy: [], + on_disconnect: [], + before_update: [], + after_update: [], + context: new Map((parent_component ? parent_component.$$.context : [])), + // everything else + callbacks: blank_object(), + dirty, + skip_bound: false, + root: options.target || parent_component.$$.root + }; + append_styles && append_styles($$.root); + let ready = false; + $$.ctx = instance + ? instance(component, options.props || {}, (i, ret, ...rest) => { + const value = rest.length ? rest[0] : ret; + if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) { + if (!$$.skip_bound && $$.bound[i]) + $$.bound[i](value); + if (ready) + make_dirty(component, i); + } + return ret; + }) + : []; + $$.update(); + ready = true; + run_all($$.before_update); + // `false` as a special case of no DOM component + $$.fragment = create_fragment ? create_fragment($$.ctx) : false; + if (options.target) { + { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + $$.fragment && $$.fragment.c(); + } + mount_component(component, options.target, undefined, undefined); + flush(); + } + set_current_component(parent_component); +} +/** + * Base class for Svelte components. Used when dev=false. + */ +class SvelteComponent { + $destroy() { + destroy_component(this, 1); + this.$destroy = noop; + } + $on(type, callback) { + if (!is_function(callback)) { + return noop; + } + const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = [])); + callbacks.push(callback); + return () => { + const index = callbacks.indexOf(callback); + if (index !== -1) + callbacks.splice(index, 1); + }; + } + $set($$props) { + if (this.$$set && !is_empty($$props)) { + this.$$.skip_bound = true; + this.$$set($$props); + this.$$.skip_bound = false; + } + } +} + +// via https://unpkg.com/browse/emojibase-data@6.0.0/meta/groups.json +const allGroups = [ + [-1, 'โจ', 'custom'], + [0, '๐', 'smileys-emotion'], + [1, '๐', 'people-body'], + [3, '๐ฑ', 'animals-nature'], + [4, '๐', 'food-drink'], + [5, '๐ ๏ธ', 'travel-places'], + [6, 'โฝ', 'activities'], + [7, '๐', 'objects'], + [8, 'โ๏ธ', 'symbols'], + [9, '๐', 'flags'] +].map(([id, emoji, name]) => ({ id, emoji, name })); + +const groups = allGroups.slice(1); +const customGroup = allGroups[0]; + +const MIN_SEARCH_TEXT_LENGTH = 2; +const NUM_SKIN_TONES = 6; + +/* istanbul ignore next */ +const rIC = typeof requestIdleCallback === 'function' ? requestIdleCallback : setTimeout; + +// check for ZWJ (zero width joiner) character +function hasZwj (emoji) { + return emoji.unicode.includes('\u200d') +} + +// Find one good representative emoji from each version to test by checking its color. +// Ideally it should have color in the center. For some inspiration, see: +// https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/ +// +// Note that for certain versions (12.1, 13.1), there is no point in testing them explicitly, because +// all the emoji from this version are compound-emoji from previous versions. So they would pass a color +// test, even in browsers that display them as double emoji. (E.g. "face in clouds" might render as +// "face without mouth" plus "fog".) These emoji can only be filtered using the width test, +// which happens in checkZwjSupport.js. +const versionsAndTestEmoji = { + '๐ซ ': 14, + '๐ฅฒ': 13.1, // smiling face with tear, technically from v13 but see note above + '๐ฅป': 12.1, // sari, technically from v12 but see note above + '๐ฅฐ': 11, + '๐คฉ': 5, + '๐ฑโโ๏ธ': 4, + '๐คฃ': 3, + '๐๏ธโ๐จ๏ธ': 2, + '๐': 1, + '๐๏ธ': 0.7, + '๐': 0.6 +}; + +const TIMEOUT_BEFORE_LOADING_MESSAGE = 1000; // 1 second +const DEFAULT_SKIN_TONE_EMOJI = '๐๏ธ'; +const DEFAULT_NUM_COLUMNS = 8; + +// Based on https://fivethirtyeight.com/features/the-100-most-used-emojis/ and +// https://blog.emojipedia.org/facebook-reveals-most-and-least-used-emojis/ with +// a bit of my own curation. (E.g. avoid the "OK" gesture because of connotations: +// https://emojipedia.org/ok-hand/) +const MOST_COMMONLY_USED_EMOJI = [ + '๐', + '๐', + 'โฅ๏ธ', + '๐๏ธ', + '๐', + '๐', + '๐ญ', + 'โบ๏ธ', + '๐', + '๐ฉ', + '๐', + '๐', + '๐', + '๐' +]; + +// It's important to list Twemoji Mozilla before everything else, because Mozilla bundles their +// own font on some platforms (notably Windows and Linux as of this writing). Typically, Mozilla +// updates faster than the underlying OS, and we don't want to render older emoji in one font and +// newer emoji in another font: +// https://github.com/nolanlawson/emoji-picker-element/pull/268#issuecomment-1073347283 +const FONT_FAMILY = '"Twemoji Mozilla","Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol",' + + '"Noto Color Emoji","EmojiOne Color","Android Emoji",sans-serif'; + +/* istanbul ignore next */ +const DEFAULT_CATEGORY_SORTING = (a, b) => a < b ? -1 : a > b ? 1 : 0; + +// Test if an emoji is supported by rendering it to canvas and checking that the color is not black + +const getTextFeature = (text, color) => { + const canvas = document.createElement('canvas'); + canvas.width = canvas.height = 1; + + const ctx = canvas.getContext('2d'); + ctx.textBaseline = 'top'; + ctx.font = `100px ${FONT_FAMILY}`; + ctx.fillStyle = color; + ctx.scale(0.01, 0.01); + ctx.fillText(text, 0, 0); + + return ctx.getImageData(0, 0, 1, 1).data +}; + +const compareFeatures = (feature1, feature2) => { + const feature1Str = [...feature1].join(','); + const feature2Str = [...feature2].join(','); + // This is RGBA, so for 0,0,0, we are checking that the first RGB is not all zeroes. + // Most of the time when unsupported this is 0,0,0,0, but on Chrome on Mac it is + // 0,0,0,61 - there is a transparency here. + return feature1Str === feature2Str && !feature1Str.startsWith('0,0,0,') +}; + +function testColorEmojiSupported (text) { + // Render white and black and then compare them to each other and ensure they're the same + // color, and neither one is black. This shows that the emoji was rendered in color. + const feature1 = getTextFeature(text, '#000'); + const feature2 = getTextFeature(text, '#fff'); + return feature1 && feature2 && compareFeatures(feature1, feature2) +} + +// rather than check every emoji ever, which would be expensive, just check some representatives from the + +function determineEmojiSupportLevel () { + const entries = Object.entries(versionsAndTestEmoji); + try { + // start with latest emoji and work backwards + for (const [emoji, version] of entries) { + if (testColorEmojiSupported(emoji)) { + return version + } + } + } catch (e) { // canvas error + } finally { + } + // In case of an error, be generous and just assume all emoji are supported (e.g. for canvas errors + // due to anti-fingerprinting add-ons). Better to show some gray boxes than nothing at all. + return entries[0][1] // first one in the list is the most recent version +} + +// Check which emojis we know for sure aren't supported, based on Unicode version level +let promise; +const detectEmojiSupportLevel = () => { + if (!promise) { + // Delay so it can run while the IDB database is being created by the browser (on another thread). + // This helps especially with first load โ we want to start pre-populating the database on the main thread, + // and then wait for IDB to commit everything, and while waiting we run this check. + promise = new Promise(resolve => ( + rIC(() => ( + resolve(determineEmojiSupportLevel()) // delay so ideally this can run while IDB is first populating + )) + )); + } + return promise +}; +// determine which emojis containing ZWJ (zero width joiner) characters +// are supported (rendered as one glyph) rather than unsupported (rendered as two or more glyphs) +const supportedZwjEmojis = new Map(); + +const VARIATION_SELECTOR = '\ufe0f'; +const SKINTONE_MODIFIER = '\ud83c'; +const ZWJ = '\u200d'; +const LIGHT_SKIN_TONE = 0x1F3FB; +const LIGHT_SKIN_TONE_MODIFIER = 0xdffb; + +// TODO: this is a naive implementation, we can improve it later +// It's only used for the skintone picker, so as long as people don't customize with +// really exotic emoji then it should work fine +function applySkinTone (str, skinTone) { + if (skinTone === 0) { + return str + } + const zwjIndex = str.indexOf(ZWJ); + if (zwjIndex !== -1) { + return str.substring(0, zwjIndex) + + String.fromCodePoint(LIGHT_SKIN_TONE + skinTone - 1) + + str.substring(zwjIndex) + } + if (str.endsWith(VARIATION_SELECTOR)) { + str = str.substring(0, str.length - 1); + } + return str + SKINTONE_MODIFIER + String.fromCodePoint(LIGHT_SKIN_TONE_MODIFIER + skinTone - 1) +} + +function halt (event) { + event.preventDefault(); + event.stopPropagation(); +} + +// Implementation left/right or up/down navigation, circling back when you +// reach the start/end of the list +function incrementOrDecrement (decrement, val, arr) { + val += (decrement ? -1 : 1); + if (val < 0) { + val = arr.length - 1; + } else if (val >= arr.length) { + val = 0; + } + return val +} + +// like lodash's uniqBy but much smaller +function uniqBy (arr, func) { + const set = new Set(); + const res = []; + for (const item of arr) { + const key = func(item); + if (!set.has(key)) { + set.add(key); + res.push(item); + } + } + return res +} + +// We don't need all the data on every emoji, and there are specific things we need +// for the UI, so build a "view model" from the emoji object we got from the database + +function summarizeEmojisForUI (emojis, emojiSupportLevel) { + const toSimpleSkinsMap = skins => { + const res = {}; + for (const skin of skins) { + // ignore arrays like [1, 2] with multiple skin tones + // also ignore variants that are in an unsupported emoji version + // (these do exist - variants from a different version than their base emoji) + if (typeof skin.tone === 'number' && skin.version <= emojiSupportLevel) { + res[skin.tone] = skin.unicode; + } + } + return res + }; + + return emojis.map(({ unicode, skins, shortcodes, url, name, category }) => ({ + unicode, + name, + shortcodes, + url, + category, + id: unicode || name, + skins: skins && toSimpleSkinsMap(skins), + title: (shortcodes || []).join(', ') + })) +} + +// import rAF from one place so that the bundle size is a bit smaller +const rAF = requestAnimationFrame; + +// Svelte action to calculate the width of an element and auto-update + +let resizeObserverSupported = typeof ResizeObserver === 'function'; + +function calculateWidth (node, onUpdate) { + let resizeObserver; + if (resizeObserverSupported) { + resizeObserver = new ResizeObserver(entries => ( + onUpdate(entries[0].contentRect.width) + )); + resizeObserver.observe(node); + } else { // just set the width once, don't bother trying to track it + rAF(() => ( + onUpdate(node.getBoundingClientRect().width) + )); + } + + // cleanup function (called on destroy) + return { + destroy () { + if (resizeObserver) { + resizeObserver.disconnect(); + } + } + } +} + +// get the width of the text inside of a DOM node, via https://stackoverflow.com/a/59525891/680742 +function calculateTextWidth (node) { + /* istanbul ignore else */ + { + const range = document.createRange(); + range.selectNode(node.firstChild); + return range.getBoundingClientRect().width + } +} + +let baselineEmojiWidth; + +function checkZwjSupport (zwjEmojisToCheck, baselineEmoji, emojiToDomNode) { + for (const emoji of zwjEmojisToCheck) { + const domNode = emojiToDomNode(emoji); + const emojiWidth = calculateTextWidth(domNode); + if (typeof baselineEmojiWidth === 'undefined') { // calculate the baseline emoji width only once + baselineEmojiWidth = calculateTextWidth(baselineEmoji); + } + // On Windows, some supported emoji are ~50% bigger than the baseline emoji, but what we really want to guard + // against are the ones that are 2x the size, because those are truly broken (person with red hair = person with + // floating red wig, black cat = cat with black square, polar bear = bear with snowflake, etc.) + // So here we set the threshold at 1.8 times the size of the baseline emoji. + const supported = emojiWidth / 1.8 < baselineEmojiWidth; + supportedZwjEmojis.set(emoji.unicode, supported); + } +} + +// Measure after style/layout are complete + +const requestPostAnimationFrame = callback => { + rAF(() => { + setTimeout(callback); + }); +}; + +// like lodash's uniq + +function uniq (arr) { + return uniqBy(arr, _ => _) +} + +// Note we put this in its own function outside Picker.js to avoid Svelte doing an invalidation on the "setter" here. +// At best the invalidation is useless, at worst it can cause infinite loops: +// https://github.com/nolanlawson/emoji-picker-element/pull/180 +// https://github.com/sveltejs/svelte/issues/6521 +// Also note tabpanelElement can be null if the element is disconnected immediately after connected +function resetScrollTopIfPossible (element) { + if (element) { + element.scrollTop = 0; + } +} + +/* src/picker/components/Picker/Picker.svelte generated by Svelte v3.55.1 */ + +const { Map: Map_1 } = globals; + +function get_each_context(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[64] = list[i]; + child_ctx[66] = i; + return child_ctx; +} + +function get_each_context_1(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[67] = list[i]; + child_ctx[66] = i; + return child_ctx; +} + +function get_each_context_2(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[64] = list[i]; + child_ctx[66] = i; + return child_ctx; +} + +function get_each_context_3(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[70] = list[i]; + return child_ctx; +} + +function get_each_context_4(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[73] = list[i]; + child_ctx[66] = i; + return child_ctx; +} + +// (43:38) {#each skinTones as skinTone, i (skinTone)} +function create_each_block_4(key_1, ctx) { + let div; + let t_value = /*skinTone*/ ctx[73] + ""; + let t; + let div_id_value; + let div_class_value; + let div_aria_selected_value; + let div_title_value; + let div_aria_label_value; + + return { + key: key_1, + first: null, + c() { + div = element("div"); + t = text(t_value); + attr(div, "id", div_id_value = "skintone-" + /*i*/ ctx[66]); + + attr(div, "class", div_class_value = "emoji hide-focus " + (/*i*/ ctx[66] === /*activeSkinTone*/ ctx[20] + ? 'active' + : '')); + + attr(div, "aria-selected", div_aria_selected_value = /*i*/ ctx[66] === /*activeSkinTone*/ ctx[20]); + attr(div, "role", "option"); + attr(div, "title", div_title_value = /*i18n*/ ctx[0].skinTones[/*i*/ ctx[66]]); + attr(div, "tabindex", "-1"); + attr(div, "aria-label", div_aria_label_value = /*i18n*/ ctx[0].skinTones[/*i*/ ctx[66]]); + this.first = div; + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, t); + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (dirty[0] & /*skinTones*/ 512 && t_value !== (t_value = /*skinTone*/ ctx[73] + "")) set_data(t, t_value); + + if (dirty[0] & /*skinTones*/ 512 && div_id_value !== (div_id_value = "skintone-" + /*i*/ ctx[66])) { + attr(div, "id", div_id_value); + } + + if (dirty[0] & /*skinTones, activeSkinTone*/ 1049088 && div_class_value !== (div_class_value = "emoji hide-focus " + (/*i*/ ctx[66] === /*activeSkinTone*/ ctx[20] + ? 'active' + : ''))) { + attr(div, "class", div_class_value); + } + + if (dirty[0] & /*skinTones, activeSkinTone*/ 1049088 && div_aria_selected_value !== (div_aria_selected_value = /*i*/ ctx[66] === /*activeSkinTone*/ ctx[20])) { + attr(div, "aria-selected", div_aria_selected_value); + } + + if (dirty[0] & /*i18n, skinTones*/ 513 && div_title_value !== (div_title_value = /*i18n*/ ctx[0].skinTones[/*i*/ ctx[66]])) { + attr(div, "title", div_title_value); + } + + if (dirty[0] & /*i18n, skinTones*/ 513 && div_aria_label_value !== (div_aria_label_value = /*i18n*/ ctx[0].skinTones[/*i*/ ctx[66]])) { + attr(div, "aria-label", div_aria_label_value); + } + }, + d(detaching) { + if (detaching) detach(div); + } + }; +} + +// (53:33) {#each groups as group (group.id)} +function create_each_block_3(key_1, ctx) { + let button; + let div; + let t_value = /*group*/ ctx[70].emoji + ""; + let t; + let button_aria_controls_value; + let button_aria_label_value; + let button_aria_selected_value; + let button_title_value; + let mounted; + let dispose; + + function click_handler() { + return /*click_handler*/ ctx[50](/*group*/ ctx[70]); + } + + return { + key: key_1, + first: null, + c() { + button = element("button"); + div = element("div"); + t = text(t_value); + attr(div, "class", "nav-emoji emoji"); + attr(button, "role", "tab"); + attr(button, "class", "nav-button"); + attr(button, "aria-controls", button_aria_controls_value = "tab-" + /*group*/ ctx[70].id); + attr(button, "aria-label", button_aria_label_value = /*i18n*/ ctx[0].categories[/*group*/ ctx[70].name]); + attr(button, "aria-selected", button_aria_selected_value = !/*searchMode*/ ctx[4] && /*currentGroup*/ ctx[13].id === /*group*/ ctx[70].id); + attr(button, "title", button_title_value = /*i18n*/ ctx[0].categories[/*group*/ ctx[70].name]); + this.first = button; + }, + m(target, anchor) { + insert(target, button, anchor); + append(button, div); + append(div, t); + + if (!mounted) { + dispose = listen(button, "click", click_handler); + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (dirty[0] & /*groups*/ 4096 && t_value !== (t_value = /*group*/ ctx[70].emoji + "")) set_data(t, t_value); + + if (dirty[0] & /*groups*/ 4096 && button_aria_controls_value !== (button_aria_controls_value = "tab-" + /*group*/ ctx[70].id)) { + attr(button, "aria-controls", button_aria_controls_value); + } + + if (dirty[0] & /*i18n, groups*/ 4097 && button_aria_label_value !== (button_aria_label_value = /*i18n*/ ctx[0].categories[/*group*/ ctx[70].name])) { + attr(button, "aria-label", button_aria_label_value); + } + + if (dirty[0] & /*searchMode, currentGroup, groups*/ 12304 && button_aria_selected_value !== (button_aria_selected_value = !/*searchMode*/ ctx[4] && /*currentGroup*/ ctx[13].id === /*group*/ ctx[70].id)) { + attr(button, "aria-selected", button_aria_selected_value); + } + + if (dirty[0] & /*i18n, groups*/ 4097 && button_title_value !== (button_title_value = /*i18n*/ ctx[0].categories[/*group*/ ctx[70].name])) { + attr(button, "title", button_title_value); + } + }, + d(detaching) { + if (detaching) detach(button); + mounted = false; + dispose(); + } + }; +} + +// (94:100) {:else} +function create_else_block_1(ctx) { + let img; + let img_src_value; + + return { + c() { + img = element("img"); + attr(img, "class", "custom-emoji"); + if (!src_url_equal(img.src, img_src_value = /*emoji*/ ctx[64].url)) attr(img, "src", img_src_value); + attr(img, "alt", ""); + attr(img, "loading", "lazy"); + }, + m(target, anchor) { + insert(target, img, anchor); + }, + p(ctx, dirty) { + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && !src_url_equal(img.src, img_src_value = /*emoji*/ ctx[64].url)) { + attr(img, "src", img_src_value); + } + }, + d(detaching) { + if (detaching) detach(img); + } + }; +} + +// (94:40) {#if emoji.unicode} +function create_if_block_1(ctx) { + let t_value = /*unicodeWithSkin*/ ctx[27](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]) + ""; + let t; + + return { + c() { + t = text(t_value); + }, + m(target, anchor) { + insert(target, t, anchor); + }, + p(ctx, dirty) { + if (dirty[0] & /*currentEmojisWithCategories, currentSkinTone*/ 33024 && t_value !== (t_value = /*unicodeWithSkin*/ ctx[27](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]) + "")) set_data(t, t_value); + }, + d(detaching) { + if (detaching) detach(t); + } + }; +} + +// (89:53) {#each emojiWithCategory.emojis as emoji, i (emoji.id)} +function create_each_block_2(key_1, ctx) { + let button; + let button_role_value; + let button_aria_selected_value; + let button_aria_label_value; + let button_title_value; + let button_class_value; + let button_id_value; + + function select_block_type(ctx, dirty) { + if (/*emoji*/ ctx[64].unicode) return create_if_block_1; + return create_else_block_1; + } + + let current_block_type = select_block_type(ctx); + let if_block = current_block_type(ctx); + + return { + key: key_1, + first: null, + c() { + button = element("button"); + if_block.c(); + attr(button, "role", button_role_value = /*searchMode*/ ctx[4] ? 'option' : 'menuitem'); + + attr(button, "aria-selected", button_aria_selected_value = /*searchMode*/ ctx[4] + ? /*i*/ ctx[66] == /*activeSearchItem*/ ctx[5] + : ''); + + attr(button, "aria-label", button_aria_label_value = /*labelWithSkin*/ ctx[28](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8])); + attr(button, "title", button_title_value = /*emoji*/ ctx[64].title); + + attr(button, "class", button_class_value = "emoji " + (/*searchMode*/ ctx[4] && /*i*/ ctx[66] === /*activeSearchItem*/ ctx[5] + ? 'active' + : '')); + + attr(button, "id", button_id_value = "emo-" + /*emoji*/ ctx[64].id); + this.first = button; + }, + m(target, anchor) { + insert(target, button, anchor); + if_block.m(button, null); + }, + p(new_ctx, dirty) { + ctx = new_ctx; + + if (current_block_type === (current_block_type = select_block_type(ctx)) && if_block) { + if_block.p(ctx, dirty); + } else { + if_block.d(1); + if_block = current_block_type(ctx); + + if (if_block) { + if_block.c(); + if_block.m(button, null); + } + } + + if (dirty[0] & /*searchMode*/ 16 && button_role_value !== (button_role_value = /*searchMode*/ ctx[4] ? 'option' : 'menuitem')) { + attr(button, "role", button_role_value); + } + + if (dirty[0] & /*searchMode, currentEmojisWithCategories, activeSearchItem*/ 32816 && button_aria_selected_value !== (button_aria_selected_value = /*searchMode*/ ctx[4] + ? /*i*/ ctx[66] == /*activeSearchItem*/ ctx[5] + : '')) { + attr(button, "aria-selected", button_aria_selected_value); + } + + if (dirty[0] & /*currentEmojisWithCategories, currentSkinTone*/ 33024 && button_aria_label_value !== (button_aria_label_value = /*labelWithSkin*/ ctx[28](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]))) { + attr(button, "aria-label", button_aria_label_value); + } + + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && button_title_value !== (button_title_value = /*emoji*/ ctx[64].title)) { + attr(button, "title", button_title_value); + } + + if (dirty[0] & /*searchMode, currentEmojisWithCategories, activeSearchItem*/ 32816 && button_class_value !== (button_class_value = "emoji " + (/*searchMode*/ ctx[4] && /*i*/ ctx[66] === /*activeSearchItem*/ ctx[5] + ? 'active' + : ''))) { + attr(button, "class", button_class_value); + } + + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && button_id_value !== (button_id_value = "emo-" + /*emoji*/ ctx[64].id)) { + attr(button, "id", button_id_value); + } + }, + d(detaching) { + if (detaching) detach(button); + if_block.d(); + } + }; +} + +// (70:36) {#each currentEmojisWithCategories as emojiWithCategory, i (emojiWithCategory.category)} +function create_each_block_1(key_1, ctx) { + let div0; + + let t_value = (/*searchMode*/ ctx[4] + ? /*i18n*/ ctx[0].searchResultsLabel + : /*emojiWithCategory*/ ctx[67].category + ? /*emojiWithCategory*/ ctx[67].category + : /*currentEmojisWithCategories*/ ctx[15].length > 1 + ? /*i18n*/ ctx[0].categories.custom + : /*i18n*/ ctx[0].categories[/*currentGroup*/ ctx[13].name]) + ""; + + let t; + let div0_id_value; + let div0_class_value; + let div1; + let each_blocks = []; + let each_1_lookup = new Map_1(); + let div1_role_value; + let div1_aria_labelledby_value; + let div1_id_value; + let each_value_2 = /*emojiWithCategory*/ ctx[67].emojis; + const get_key = ctx => /*emoji*/ ctx[64].id; + + for (let i = 0; i < each_value_2.length; i += 1) { + let child_ctx = get_each_context_2(ctx, each_value_2, i); + let key = get_key(child_ctx); + each_1_lookup.set(key, each_blocks[i] = create_each_block_2(key, child_ctx)); + } + + return { + key: key_1, + first: null, + c() { + div0 = element("div"); + t = text(t_value); + div1 = element("div"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + attr(div0, "id", div0_id_value = "menu-label-" + /*i*/ ctx[66]); + + attr(div0, "class", div0_class_value = "category " + (/*currentEmojisWithCategories*/ ctx[15].length === 1 && /*currentEmojisWithCategories*/ ctx[15][0].category === '' + ? 'gone' + : '')); + + attr(div0, "aria-hidden", "true"); + attr(div1, "class", "emoji-menu"); + attr(div1, "role", div1_role_value = /*searchMode*/ ctx[4] ? 'listbox' : 'menu'); + attr(div1, "aria-labelledby", div1_aria_labelledby_value = "menu-label-" + /*i*/ ctx[66]); + attr(div1, "id", div1_id_value = /*searchMode*/ ctx[4] ? 'search-results' : ''); + this.first = div0; + }, + m(target, anchor) { + insert(target, div0, anchor); + append(div0, t); + insert(target, div1, anchor); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div1, null); + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + + if (dirty[0] & /*searchMode, i18n, currentEmojisWithCategories, currentGroup*/ 40977 && t_value !== (t_value = (/*searchMode*/ ctx[4] + ? /*i18n*/ ctx[0].searchResultsLabel + : /*emojiWithCategory*/ ctx[67].category + ? /*emojiWithCategory*/ ctx[67].category + : /*currentEmojisWithCategories*/ ctx[15].length > 1 + ? /*i18n*/ ctx[0].categories.custom + : /*i18n*/ ctx[0].categories[/*currentGroup*/ ctx[13].name]) + "")) set_data(t, t_value); + + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && div0_id_value !== (div0_id_value = "menu-label-" + /*i*/ ctx[66])) { + attr(div0, "id", div0_id_value); + } + + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && div0_class_value !== (div0_class_value = "category " + (/*currentEmojisWithCategories*/ ctx[15].length === 1 && /*currentEmojisWithCategories*/ ctx[15][0].category === '' + ? 'gone' + : ''))) { + attr(div0, "class", div0_class_value); + } + + if (dirty[0] & /*searchMode, currentEmojisWithCategories, activeSearchItem, labelWithSkin, currentSkinTone, unicodeWithSkin*/ 402686256) { + each_value_2 = /*emojiWithCategory*/ ctx[67].emojis; + each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx, each_value_2, each_1_lookup, div1, destroy_block, create_each_block_2, null, get_each_context_2); + } + + if (dirty[0] & /*searchMode*/ 16 && div1_role_value !== (div1_role_value = /*searchMode*/ ctx[4] ? 'listbox' : 'menu')) { + attr(div1, "role", div1_role_value); + } + + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && div1_aria_labelledby_value !== (div1_aria_labelledby_value = "menu-label-" + /*i*/ ctx[66])) { + attr(div1, "aria-labelledby", div1_aria_labelledby_value); + } + + if (dirty[0] & /*searchMode*/ 16 && div1_id_value !== (div1_id_value = /*searchMode*/ ctx[4] ? 'search-results' : '')) { + attr(div1, "id", div1_id_value); + } + }, + d(detaching) { + if (detaching) detach(div0); + if (detaching) detach(div1); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].d(); + } + } + }; +} + +// (103:94) {:else} +function create_else_block(ctx) { + let img; + let img_src_value; + + return { + c() { + img = element("img"); + attr(img, "class", "custom-emoji"); + if (!src_url_equal(img.src, img_src_value = /*emoji*/ ctx[64].url)) attr(img, "src", img_src_value); + attr(img, "alt", ""); + attr(img, "loading", "lazy"); + }, + m(target, anchor) { + insert(target, img, anchor); + }, + p(ctx, dirty) { + if (dirty[0] & /*currentFavorites*/ 1024 && !src_url_equal(img.src, img_src_value = /*emoji*/ ctx[64].url)) { + attr(img, "src", img_src_value); + } + }, + d(detaching) { + if (detaching) detach(img); + } + }; +} + +// (103:34) {#if emoji.unicode} +function create_if_block(ctx) { + let t_value = /*unicodeWithSkin*/ ctx[27](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]) + ""; + let t; + + return { + c() { + t = text(t_value); + }, + m(target, anchor) { + insert(target, t, anchor); + }, + p(ctx, dirty) { + if (dirty[0] & /*currentFavorites, currentSkinTone*/ 1280 && t_value !== (t_value = /*unicodeWithSkin*/ ctx[27](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]) + "")) set_data(t, t_value); + }, + d(detaching) { + if (detaching) detach(t); + } + }; +} + +// (99:102) {#each currentFavorites as emoji, i (emoji.id)} +function create_each_block(key_1, ctx) { + let button; + let button_aria_label_value; + let button_title_value; + let button_id_value; + + function select_block_type_1(ctx, dirty) { + if (/*emoji*/ ctx[64].unicode) return create_if_block; + return create_else_block; + } + + let current_block_type = select_block_type_1(ctx); + let if_block = current_block_type(ctx); + + return { + key: key_1, + first: null, + c() { + button = element("button"); + if_block.c(); + attr(button, "role", "menuitem"); + attr(button, "aria-label", button_aria_label_value = /*labelWithSkin*/ ctx[28](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8])); + attr(button, "title", button_title_value = /*emoji*/ ctx[64].title); + attr(button, "class", "emoji"); + attr(button, "id", button_id_value = "fav-" + /*emoji*/ ctx[64].id); + this.first = button; + }, + m(target, anchor) { + insert(target, button, anchor); + if_block.m(button, null); + }, + p(new_ctx, dirty) { + ctx = new_ctx; + + if (current_block_type === (current_block_type = select_block_type_1(ctx)) && if_block) { + if_block.p(ctx, dirty); + } else { + if_block.d(1); + if_block = current_block_type(ctx); + + if (if_block) { + if_block.c(); + if_block.m(button, null); + } + } + + if (dirty[0] & /*currentFavorites, currentSkinTone*/ 1280 && button_aria_label_value !== (button_aria_label_value = /*labelWithSkin*/ ctx[28](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]))) { + attr(button, "aria-label", button_aria_label_value); + } + + if (dirty[0] & /*currentFavorites*/ 1024 && button_title_value !== (button_title_value = /*emoji*/ ctx[64].title)) { + attr(button, "title", button_title_value); + } + + if (dirty[0] & /*currentFavorites*/ 1024 && button_id_value !== (button_id_value = "fav-" + /*emoji*/ ctx[64].id)) { + attr(button, "id", button_id_value); + } + }, + d(detaching) { + if (detaching) detach(button); + if_block.d(); + } + }; +} + +function create_fragment(ctx) { + let section; + let div0; + let div4; + let div1; + let input; + let input_placeholder_value; + let input_aria_expanded_value; + let input_aria_activedescendant_value; + let label; + let t0_value = /*i18n*/ ctx[0].searchLabel + ""; + let t0; + let span0; + let t1_value = /*i18n*/ ctx[0].searchDescription + ""; + let t1; + let div2; + let button0; + let t2; + let button0_class_value; + let div2_class_value; + let span1; + let t3_value = /*i18n*/ ctx[0].skinToneDescription + ""; + let t3; + let div3; + let each_blocks_3 = []; + let each0_lookup = new Map_1(); + let div3_class_value; + let div3_aria_label_value; + let div3_aria_activedescendant_value; + let div3_aria_hidden_value; + let div5; + let each_blocks_2 = []; + let each1_lookup = new Map_1(); + let div5_aria_label_value; + let div7; + let div6; + let div8; + let t4; + let div8_class_value; + let div10; + let div9; + let each_blocks_1 = []; + let each2_lookup = new Map_1(); + let div10_class_value; + let div10_role_value; + let div10_aria_label_value; + let div10_id_value; + let div11; + let each_blocks = []; + let each3_lookup = new Map_1(); + let div11_class_value; + let div11_aria_label_value; + let button1; + let section_aria_label_value; + let mounted; + let dispose; + let each_value_4 = /*skinTones*/ ctx[9]; + const get_key = ctx => /*skinTone*/ ctx[73]; + + for (let i = 0; i < each_value_4.length; i += 1) { + let child_ctx = get_each_context_4(ctx, each_value_4, i); + let key = get_key(child_ctx); + each0_lookup.set(key, each_blocks_3[i] = create_each_block_4(key, child_ctx)); + } + + let each_value_3 = /*groups*/ ctx[12]; + const get_key_1 = ctx => /*group*/ ctx[70].id; + + for (let i = 0; i < each_value_3.length; i += 1) { + let child_ctx = get_each_context_3(ctx, each_value_3, i); + let key = get_key_1(child_ctx); + each1_lookup.set(key, each_blocks_2[i] = create_each_block_3(key, child_ctx)); + } + + let each_value_1 = /*currentEmojisWithCategories*/ ctx[15]; + const get_key_2 = ctx => /*emojiWithCategory*/ ctx[67].category; + + for (let i = 0; i < each_value_1.length; i += 1) { + let child_ctx = get_each_context_1(ctx, each_value_1, i); + let key = get_key_2(child_ctx); + each2_lookup.set(key, each_blocks_1[i] = create_each_block_1(key, child_ctx)); + } + + let each_value = /*currentFavorites*/ ctx[10]; + const get_key_3 = ctx => /*emoji*/ ctx[64].id; + + for (let i = 0; i < each_value.length; i += 1) { + let child_ctx = get_each_context(ctx, each_value, i); + let key = get_key_3(child_ctx); + each3_lookup.set(key, each_blocks[i] = create_each_block(key, child_ctx)); + } + + return { + c() { + section = element("section"); + div0 = element("div"); + div4 = element("div"); + div1 = element("div"); + input = element("input"); + label = element("label"); + t0 = text(t0_value); + span0 = element("span"); + t1 = text(t1_value); + div2 = element("div"); + button0 = element("button"); + t2 = text(/*skinToneButtonText*/ ctx[21]); + span1 = element("span"); + t3 = text(t3_value); + div3 = element("div"); + + for (let i = 0; i < each_blocks_3.length; i += 1) { + each_blocks_3[i].c(); + } + + div5 = element("div"); + + for (let i = 0; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].c(); + } + + div7 = element("div"); + div6 = element("div"); + div8 = element("div"); + t4 = text(/*message*/ ctx[18]); + div10 = element("div"); + div9 = element("div"); + + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].c(); + } + + div11 = element("div"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + button1 = element("button"); + button1.textContent = "๐"; + attr(div0, "class", "pad-top"); + attr(input, "id", "search"); + attr(input, "class", "search"); + attr(input, "type", "search"); + attr(input, "role", "combobox"); + attr(input, "enterkeyhint", "search"); + attr(input, "placeholder", input_placeholder_value = /*i18n*/ ctx[0].searchLabel); + attr(input, "autocapitalize", "none"); + attr(input, "autocomplete", "off"); + attr(input, "spellcheck", "true"); + attr(input, "aria-expanded", input_aria_expanded_value = !!(/*searchMode*/ ctx[4] && /*currentEmojis*/ ctx[1].length)); + attr(input, "aria-controls", "search-results"); + attr(input, "aria-describedby", "search-description"); + attr(input, "aria-autocomplete", "list"); + + attr(input, "aria-activedescendant", input_aria_activedescendant_value = /*activeSearchItemId*/ ctx[26] + ? `emo-${/*activeSearchItemId*/ ctx[26]}` + : ''); + + attr(label, "class", "sr-only"); + attr(label, "for", "search"); + attr(span0, "id", "search-description"); + attr(span0, "class", "sr-only"); + attr(div1, "class", "search-wrapper"); + attr(button0, "id", "skintone-button"); + attr(button0, "class", button0_class_value = "emoji " + (/*skinTonePickerExpanded*/ ctx[6] ? 'hide-focus' : '')); + attr(button0, "aria-label", /*skinToneButtonLabel*/ ctx[23]); + attr(button0, "title", /*skinToneButtonLabel*/ ctx[23]); + attr(button0, "aria-describedby", "skintone-description"); + attr(button0, "aria-haspopup", "listbox"); + attr(button0, "aria-expanded", /*skinTonePickerExpanded*/ ctx[6]); + attr(button0, "aria-controls", "skintone-list"); + + attr(div2, "class", div2_class_value = "skintone-button-wrapper " + (/*skinTonePickerExpandedAfterAnimation*/ ctx[19] + ? 'expanded' + : '')); + + attr(span1, "id", "skintone-description"); + attr(span1, "class", "sr-only"); + attr(div3, "id", "skintone-list"); + + attr(div3, "class", div3_class_value = "skintone-list " + (/*skinTonePickerExpanded*/ ctx[6] + ? '' + : 'hidden no-animate')); + + set_style(div3, "transform", "translateY(" + (/*skinTonePickerExpanded*/ ctx[6] + ? 0 + : 'calc(-1 * var(--num-skintones) * var(--total-emoji-size))') + ")"); + + attr(div3, "role", "listbox"); + attr(div3, "aria-label", div3_aria_label_value = /*i18n*/ ctx[0].skinTonesLabel); + attr(div3, "aria-activedescendant", div3_aria_activedescendant_value = "skintone-" + /*activeSkinTone*/ ctx[20]); + attr(div3, "aria-hidden", div3_aria_hidden_value = !/*skinTonePickerExpanded*/ ctx[6]); + attr(div4, "class", "search-row"); + attr(div5, "class", "nav"); + attr(div5, "role", "tablist"); + set_style(div5, "grid-template-columns", "repeat(" + /*groups*/ ctx[12].length + ", 1fr)"); + attr(div5, "aria-label", div5_aria_label_value = /*i18n*/ ctx[0].categoriesLabel); + attr(div6, "class", "indicator"); + set_style(div6, "transform", "translateX(" + (/*isRtl*/ ctx[24] ? -1 : 1) * /*currentGroupIndex*/ ctx[11] * 100 + "%)"); + attr(div7, "class", "indicator-wrapper"); + attr(div8, "class", div8_class_value = "message " + (/*message*/ ctx[18] ? '' : 'gone')); + attr(div8, "role", "alert"); + attr(div8, "aria-live", "polite"); + + attr(div10, "class", div10_class_value = "tabpanel " + (!/*databaseLoaded*/ ctx[14] || /*message*/ ctx[18] + ? 'gone' + : '')); + + attr(div10, "role", div10_role_value = /*searchMode*/ ctx[4] ? 'region' : 'tabpanel'); + + attr(div10, "aria-label", div10_aria_label_value = /*searchMode*/ ctx[4] + ? /*i18n*/ ctx[0].searchResultsLabel + : /*i18n*/ ctx[0].categories[/*currentGroup*/ ctx[13].name]); + + attr(div10, "id", div10_id_value = /*searchMode*/ ctx[4] + ? '' + : `tab-${/*currentGroup*/ ctx[13].id}`); + + attr(div10, "tabindex", "0"); + attr(div11, "class", div11_class_value = "favorites emoji-menu " + (/*message*/ ctx[18] ? 'gone' : '')); + attr(div11, "role", "menu"); + attr(div11, "aria-label", div11_aria_label_value = /*i18n*/ ctx[0].favoritesLabel); + set_style(div11, "padding-inline-end", /*scrollbarWidth*/ ctx[25] + "px"); + attr(button1, "aria-hidden", "true"); + attr(button1, "tabindex", "-1"); + attr(button1, "class", "abs-pos hidden emoji"); + attr(section, "class", "picker"); + attr(section, "aria-label", section_aria_label_value = /*i18n*/ ctx[0].regionLabel); + attr(section, "style", /*pickerStyle*/ ctx[22]); + }, + m(target, anchor) { + insert(target, section, anchor); + append(section, div0); + append(section, div4); + append(div4, div1); + append(div1, input); + set_input_value(input, /*rawSearchText*/ ctx[2]); + append(div1, label); + append(label, t0); + append(div1, span0); + append(span0, t1); + append(div4, div2); + append(div2, button0); + append(button0, t2); + append(div4, span1); + append(span1, t3); + append(div4, div3); + + for (let i = 0; i < each_blocks_3.length; i += 1) { + each_blocks_3[i].m(div3, null); + } + + /*div3_binding*/ ctx[49](div3); + append(section, div5); + + for (let i = 0; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].m(div5, null); + } + + append(section, div7); + append(div7, div6); + append(section, div8); + append(div8, t4); + append(section, div10); + append(div10, div9); + + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].m(div9, null); + } + + /*div10_binding*/ ctx[51](div10); + append(section, div11); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div11, null); + } + + append(section, button1); + /*button1_binding*/ ctx[52](button1); + /*section_binding*/ ctx[53](section); + + if (!mounted) { + dispose = [ + listen(input, "input", /*input_input_handler*/ ctx[48]), + listen(input, "keydown", /*onSearchKeydown*/ ctx[30]), + listen(button0, "click", /*onClickSkinToneButton*/ ctx[35]), + listen(div3, "focusout", /*onSkinToneOptionsFocusOut*/ ctx[38]), + listen(div3, "click", /*onSkinToneOptionsClick*/ ctx[34]), + listen(div3, "keydown", /*onSkinToneOptionsKeydown*/ ctx[36]), + listen(div3, "keyup", /*onSkinToneOptionsKeyup*/ ctx[37]), + listen(div5, "keydown", /*onNavKeydown*/ ctx[32]), + action_destroyer(/*calculateEmojiGridStyle*/ ctx[29].call(null, div9)), + listen(div10, "click", /*onEmojiClick*/ ctx[33]), + listen(div11, "click", /*onEmojiClick*/ ctx[33]) + ]; + + mounted = true; + } + }, + p(ctx, dirty) { + if (dirty[0] & /*i18n*/ 1 && input_placeholder_value !== (input_placeholder_value = /*i18n*/ ctx[0].searchLabel)) { + attr(input, "placeholder", input_placeholder_value); + } + + if (dirty[0] & /*searchMode, currentEmojis*/ 18 && input_aria_expanded_value !== (input_aria_expanded_value = !!(/*searchMode*/ ctx[4] && /*currentEmojis*/ ctx[1].length))) { + attr(input, "aria-expanded", input_aria_expanded_value); + } + + if (dirty[0] & /*activeSearchItemId*/ 67108864 && input_aria_activedescendant_value !== (input_aria_activedescendant_value = /*activeSearchItemId*/ ctx[26] + ? `emo-${/*activeSearchItemId*/ ctx[26]}` + : '')) { + attr(input, "aria-activedescendant", input_aria_activedescendant_value); + } + + if (dirty[0] & /*rawSearchText*/ 4) { + set_input_value(input, /*rawSearchText*/ ctx[2]); + } + + if (dirty[0] & /*i18n*/ 1 && t0_value !== (t0_value = /*i18n*/ ctx[0].searchLabel + "")) set_data(t0, t0_value); + if (dirty[0] & /*i18n*/ 1 && t1_value !== (t1_value = /*i18n*/ ctx[0].searchDescription + "")) set_data(t1, t1_value); + if (dirty[0] & /*skinToneButtonText*/ 2097152) set_data(t2, /*skinToneButtonText*/ ctx[21]); + + if (dirty[0] & /*skinTonePickerExpanded*/ 64 && button0_class_value !== (button0_class_value = "emoji " + (/*skinTonePickerExpanded*/ ctx[6] ? 'hide-focus' : ''))) { + attr(button0, "class", button0_class_value); + } + + if (dirty[0] & /*skinToneButtonLabel*/ 8388608) { + attr(button0, "aria-label", /*skinToneButtonLabel*/ ctx[23]); + } + + if (dirty[0] & /*skinToneButtonLabel*/ 8388608) { + attr(button0, "title", /*skinToneButtonLabel*/ ctx[23]); + } + + if (dirty[0] & /*skinTonePickerExpanded*/ 64) { + attr(button0, "aria-expanded", /*skinTonePickerExpanded*/ ctx[6]); + } + + if (dirty[0] & /*skinTonePickerExpandedAfterAnimation*/ 524288 && div2_class_value !== (div2_class_value = "skintone-button-wrapper " + (/*skinTonePickerExpandedAfterAnimation*/ ctx[19] + ? 'expanded' + : ''))) { + attr(div2, "class", div2_class_value); + } + + if (dirty[0] & /*i18n*/ 1 && t3_value !== (t3_value = /*i18n*/ ctx[0].skinToneDescription + "")) set_data(t3, t3_value); + + if (dirty[0] & /*skinTones, activeSkinTone, i18n*/ 1049089) { + each_value_4 = /*skinTones*/ ctx[9]; + each_blocks_3 = update_keyed_each(each_blocks_3, dirty, get_key, 1, ctx, each_value_4, each0_lookup, div3, destroy_block, create_each_block_4, null, get_each_context_4); + } + + if (dirty[0] & /*skinTonePickerExpanded*/ 64 && div3_class_value !== (div3_class_value = "skintone-list " + (/*skinTonePickerExpanded*/ ctx[6] + ? '' + : 'hidden no-animate'))) { + attr(div3, "class", div3_class_value); + } + + if (dirty[0] & /*skinTonePickerExpanded*/ 64) { + set_style(div3, "transform", "translateY(" + (/*skinTonePickerExpanded*/ ctx[6] + ? 0 + : 'calc(-1 * var(--num-skintones) * var(--total-emoji-size))') + ")"); + } + + if (dirty[0] & /*i18n*/ 1 && div3_aria_label_value !== (div3_aria_label_value = /*i18n*/ ctx[0].skinTonesLabel)) { + attr(div3, "aria-label", div3_aria_label_value); + } + + if (dirty[0] & /*activeSkinTone*/ 1048576 && div3_aria_activedescendant_value !== (div3_aria_activedescendant_value = "skintone-" + /*activeSkinTone*/ ctx[20])) { + attr(div3, "aria-activedescendant", div3_aria_activedescendant_value); + } + + if (dirty[0] & /*skinTonePickerExpanded*/ 64 && div3_aria_hidden_value !== (div3_aria_hidden_value = !/*skinTonePickerExpanded*/ ctx[6])) { + attr(div3, "aria-hidden", div3_aria_hidden_value); + } + + if (dirty[0] & /*groups, i18n, searchMode, currentGroup*/ 12305 | dirty[1] & /*onNavClick*/ 1) { + each_value_3 = /*groups*/ ctx[12]; + each_blocks_2 = update_keyed_each(each_blocks_2, dirty, get_key_1, 1, ctx, each_value_3, each1_lookup, div5, destroy_block, create_each_block_3, null, get_each_context_3); + } + + if (dirty[0] & /*groups*/ 4096) { + set_style(div5, "grid-template-columns", "repeat(" + /*groups*/ ctx[12].length + ", 1fr)"); + } + + if (dirty[0] & /*i18n*/ 1 && div5_aria_label_value !== (div5_aria_label_value = /*i18n*/ ctx[0].categoriesLabel)) { + attr(div5, "aria-label", div5_aria_label_value); + } + + if (dirty[0] & /*isRtl, currentGroupIndex*/ 16779264) { + set_style(div6, "transform", "translateX(" + (/*isRtl*/ ctx[24] ? -1 : 1) * /*currentGroupIndex*/ ctx[11] * 100 + "%)"); + } + + if (dirty[0] & /*message*/ 262144) set_data(t4, /*message*/ ctx[18]); + + if (dirty[0] & /*message*/ 262144 && div8_class_value !== (div8_class_value = "message " + (/*message*/ ctx[18] ? '' : 'gone'))) { + attr(div8, "class", div8_class_value); + } + + if (dirty[0] & /*searchMode, currentEmojisWithCategories, activeSearchItem, labelWithSkin, currentSkinTone, unicodeWithSkin, i18n, currentGroup*/ 402694449) { + each_value_1 = /*currentEmojisWithCategories*/ ctx[15]; + each_blocks_1 = update_keyed_each(each_blocks_1, dirty, get_key_2, 1, ctx, each_value_1, each2_lookup, div9, destroy_block, create_each_block_1, null, get_each_context_1); + } + + if (dirty[0] & /*databaseLoaded, message*/ 278528 && div10_class_value !== (div10_class_value = "tabpanel " + (!/*databaseLoaded*/ ctx[14] || /*message*/ ctx[18] + ? 'gone' + : ''))) { + attr(div10, "class", div10_class_value); + } + + if (dirty[0] & /*searchMode*/ 16 && div10_role_value !== (div10_role_value = /*searchMode*/ ctx[4] ? 'region' : 'tabpanel')) { + attr(div10, "role", div10_role_value); + } + + if (dirty[0] & /*searchMode, i18n, currentGroup*/ 8209 && div10_aria_label_value !== (div10_aria_label_value = /*searchMode*/ ctx[4] + ? /*i18n*/ ctx[0].searchResultsLabel + : /*i18n*/ ctx[0].categories[/*currentGroup*/ ctx[13].name])) { + attr(div10, "aria-label", div10_aria_label_value); + } + + if (dirty[0] & /*searchMode, currentGroup*/ 8208 && div10_id_value !== (div10_id_value = /*searchMode*/ ctx[4] + ? '' + : `tab-${/*currentGroup*/ ctx[13].id}`)) { + attr(div10, "id", div10_id_value); + } + + if (dirty[0] & /*labelWithSkin, currentFavorites, currentSkinTone, unicodeWithSkin*/ 402654464) { + each_value = /*currentFavorites*/ ctx[10]; + each_blocks = update_keyed_each(each_blocks, dirty, get_key_3, 1, ctx, each_value, each3_lookup, div11, destroy_block, create_each_block, null, get_each_context); + } + + if (dirty[0] & /*message*/ 262144 && div11_class_value !== (div11_class_value = "favorites emoji-menu " + (/*message*/ ctx[18] ? 'gone' : ''))) { + attr(div11, "class", div11_class_value); + } + + if (dirty[0] & /*i18n*/ 1 && div11_aria_label_value !== (div11_aria_label_value = /*i18n*/ ctx[0].favoritesLabel)) { + attr(div11, "aria-label", div11_aria_label_value); + } + + if (dirty[0] & /*scrollbarWidth*/ 33554432) { + set_style(div11, "padding-inline-end", /*scrollbarWidth*/ ctx[25] + "px"); + } + + if (dirty[0] & /*i18n*/ 1 && section_aria_label_value !== (section_aria_label_value = /*i18n*/ ctx[0].regionLabel)) { + attr(section, "aria-label", section_aria_label_value); + } + + if (dirty[0] & /*pickerStyle*/ 4194304) { + attr(section, "style", /*pickerStyle*/ ctx[22]); + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) detach(section); + + for (let i = 0; i < each_blocks_3.length; i += 1) { + each_blocks_3[i].d(); + } + + /*div3_binding*/ ctx[49](null); + + for (let i = 0; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].d(); + } + + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].d(); + } + + /*div10_binding*/ ctx[51](null); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].d(); + } + + /*button1_binding*/ ctx[52](null); + /*section_binding*/ ctx[53](null); + mounted = false; + run_all(dispose); + } + }; +} + +function instance($$self, $$props, $$invalidate) { + let { skinToneEmoji } = $$props; + let { i18n } = $$props; + let { database } = $$props; + let { customEmoji } = $$props; + let { customCategorySorting } = $$props; + let { emojiVersion } = $$props; + + // private + let initialLoad = true; + + let currentEmojis = []; + let currentEmojisWithCategories = []; // eslint-disable-line no-unused-vars + let rawSearchText = ''; + let searchText = ''; + let rootElement; + let baselineEmoji; + let tabpanelElement; + let searchMode = false; // eslint-disable-line no-unused-vars + let activeSearchItem = -1; + let message; // eslint-disable-line no-unused-vars + let skinTonePickerExpanded = false; + let skinTonePickerExpandedAfterAnimation = false; // eslint-disable-line no-unused-vars + let skinToneDropdown; + let currentSkinTone = 0; + let activeSkinTone = 0; + let skinToneButtonText; // eslint-disable-line no-unused-vars + let pickerStyle; // eslint-disable-line no-unused-vars + let skinToneButtonLabel = ''; // eslint-disable-line no-unused-vars + let skinTones = []; + let currentFavorites = []; // eslint-disable-line no-unused-vars + let defaultFavoriteEmojis; + let numColumns = DEFAULT_NUM_COLUMNS; + let isRtl = false; // eslint-disable-line no-unused-vars + let scrollbarWidth = 0; // eslint-disable-line no-unused-vars + let currentGroupIndex = 0; + let groups$1 = groups; + let currentGroup; + let databaseLoaded = false; // eslint-disable-line no-unused-vars + let activeSearchItemId; // eslint-disable-line no-unused-vars + + // + // Utils/helpers + // + const focus = id => { + rootElement.getRootNode().getElementById(id).focus(); + }; + + // fire a custom event that crosses the shadow boundary + const fireEvent = (name, detail) => { + rootElement.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true })); + }; + + // eslint-disable-next-line no-unused-vars + const unicodeWithSkin = (emoji, currentSkinTone) => currentSkinTone && emoji.skins && emoji.skins[currentSkinTone] || emoji.unicode; + + // eslint-disable-next-line no-unused-vars + const labelWithSkin = (emoji, currentSkinTone) => uniq([ + emoji.name || unicodeWithSkin(emoji, currentSkinTone), + ...emoji.shortcodes || [] + ]).join(', '); + + // Detect a skintone option button + const isSkinToneOption = element => (/^skintone-/).test(element.id); + + // + // Determine the emoji support level (in requestIdleCallback) + // + onMount(() => { + if (!emojiVersion) { + detectEmojiSupportLevel().then(level => { + // Can't actually test emoji support in Jest/JSDom, emoji never render in color in Cairo + /* istanbul ignore next */ + if (!level) { + $$invalidate(18, message = i18n.emojiUnsupportedMessage); + } + }); + } + }); + + // + // Calculate the width of the emoji grid. This serves two purposes: + // 1) Re-calculate the --num-columns var because it may have changed + // 2) Re-calculate the scrollbar width because it may have changed + // (i.e. because the number of items changed) + // 3) Re-calculate whether we're in RTL mode or not. + // + // The benefit of doing this in one place is to align with rAF/ResizeObserver + // and do all the calculations in one go. RTL vs LTR is not strictly width-related, + // but since we're already reading the style here, and since it's already aligned with + // the rAF loop, this is the most appropriate place to do it perf-wise. + // + // eslint-disable-next-line no-unused-vars + function calculateEmojiGridStyle(node) { + return calculateWidth(node, width => { + /* istanbul ignore next */ + if ("production" !== 'test') { + // jsdom throws errors for this kind of fancy stuff + // read all the style/layout calculations we need to make + const style = getComputedStyle(rootElement); + + const newNumColumns = parseInt(style.getPropertyValue('--num-columns'), 10); + const newIsRtl = style.getPropertyValue('direction') === 'rtl'; + const parentWidth = node.parentElement.getBoundingClientRect().width; + const newScrollbarWidth = parentWidth - width; + + // write to Svelte variables + $$invalidate(47, numColumns = newNumColumns); + + $$invalidate(25, scrollbarWidth = newScrollbarWidth); // eslint-disable-line no-unused-vars + $$invalidate(24, isRtl = newIsRtl); // eslint-disable-line no-unused-vars + } + }); + } + + function checkZwjSupportAndUpdate(zwjEmojisToCheck) { + const rootNode = rootElement.getRootNode(); + const emojiToDomNode = emoji => rootNode.getElementById(`emo-${emoji.id}`); + checkZwjSupport(zwjEmojisToCheck, baselineEmoji, emojiToDomNode); + + // force update + $$invalidate(1, currentEmojis = currentEmojis); // eslint-disable-line no-self-assign + } + + function isZwjSupported(emoji) { + return !emoji.unicode || !hasZwj(emoji) || supportedZwjEmojis.get(emoji.unicode); + } + + async function filterEmojisByVersion(emojis) { + const emojiSupportLevel = emojiVersion || await detectEmojiSupportLevel(); + + // !version corresponds to custom emoji + return emojis.filter(({ version }) => !version || version <= emojiSupportLevel); + } + + async function summarizeEmojis(emojis) { + return summarizeEmojisForUI(emojis, emojiVersion || await detectEmojiSupportLevel()); + } + + async function getEmojisByGroup(group) { + + // -1 is custom emoji + const emoji = group === -1 + ? customEmoji + : await database.getEmojiByGroup(group); + + return summarizeEmojis(await filterEmojisByVersion(emoji)); + } + + async function getEmojisBySearchQuery(query) { + return summarizeEmojis(await filterEmojisByVersion(await database.getEmojiBySearchQuery(query))); + } + + // eslint-disable-next-line no-unused-vars + function onSearchKeydown(event) { + if (!searchMode || !currentEmojis.length) { + return; + } + + const goToNextOrPrevious = previous => { + halt(event); + $$invalidate(5, activeSearchItem = incrementOrDecrement(previous, activeSearchItem, currentEmojis)); + }; + + switch (event.key) { + case 'ArrowDown': + return goToNextOrPrevious(false); + case 'ArrowUp': + return goToNextOrPrevious(true); + case 'Enter': + if (activeSearchItem !== -1) { + halt(event); + return clickEmoji(currentEmojis[activeSearchItem].id); + } else if (currentEmojis.length) { + $$invalidate(5, activeSearchItem = 0); + } + } + } + + // + // Handle user input on nav + // + // eslint-disable-next-line no-unused-vars + function onNavClick(group) { + $$invalidate(2, rawSearchText = ''); + $$invalidate(45, searchText = ''); + $$invalidate(5, activeSearchItem = -1); + $$invalidate(11, currentGroupIndex = groups$1.findIndex(_ => _.id === group.id)); + } + + // eslint-disable-next-line no-unused-vars + function onNavKeydown(event) { + const { target, key } = event; + + const doFocus = el => { + if (el) { + halt(event); + el.focus(); + } + }; + + switch (key) { + case 'ArrowLeft': + return doFocus(target.previousSibling); + case 'ArrowRight': + return doFocus(target.nextSibling); + case 'Home': + return doFocus(target.parentElement.firstChild); + case 'End': + return doFocus(target.parentElement.lastChild); + } + } + + // + // Handle user input on an emoji + // + async function clickEmoji(unicodeOrName) { + const emoji = await database.getEmojiByUnicodeOrName(unicodeOrName); + const emojiSummary = [...currentEmojis, ...currentFavorites].find(_ => _.id === unicodeOrName); + const skinTonedUnicode = emojiSummary.unicode && unicodeWithSkin(emojiSummary, currentSkinTone); + await database.incrementFavoriteEmojiCount(unicodeOrName); + + fireEvent('emoji-click', { + emoji, + skinTone: currentSkinTone, + ...skinTonedUnicode && { unicode: skinTonedUnicode }, + ...emojiSummary.name && { name: emojiSummary.name } + }); + } + + // eslint-disable-next-line no-unused-vars + async function onEmojiClick(event) { + const { target } = event; + + if (!target.classList.contains('emoji')) { + return; + } + + halt(event); + const id = target.id.substring(4); // replace 'emo-' or 'fav-' prefix + + /* no await */ + clickEmoji(id); + } + + // + // Handle user input on the skintone picker + // + // eslint-disable-next-line no-unused-vars + async function onSkinToneOptionsClick(event) { + const { target } = event; + + if (!isSkinToneOption(target)) { + return; + } + + halt(event); + const skinTone = parseInt(target.id.slice(9), 10); // remove 'skintone-' prefix + $$invalidate(8, currentSkinTone = skinTone); + $$invalidate(6, skinTonePickerExpanded = false); + focus('skintone-button'); + fireEvent('skin-tone-change', { skinTone }); + + /* no await */ + database.setPreferredSkinTone(skinTone); + } + + // eslint-disable-next-line no-unused-vars + async function onClickSkinToneButton(event) { + $$invalidate(6, skinTonePickerExpanded = !skinTonePickerExpanded); + $$invalidate(20, activeSkinTone = currentSkinTone); + + if (skinTonePickerExpanded) { + halt(event); + rAF(() => focus(`skintone-${activeSkinTone}`)); + } + } + + // eslint-disable-next-line no-unused-vars + function onSkinToneOptionsKeydown(event) { + if (!skinTonePickerExpanded) { + return; + } + + const changeActiveSkinTone = async nextSkinTone => { + halt(event); + $$invalidate(20, activeSkinTone = nextSkinTone); + await tick(); + focus(`skintone-${activeSkinTone}`); + }; + + switch (event.key) { + case 'ArrowUp': + return changeActiveSkinTone(incrementOrDecrement(true, activeSkinTone, skinTones)); + case 'ArrowDown': + return changeActiveSkinTone(incrementOrDecrement(false, activeSkinTone, skinTones)); + case 'Home': + return changeActiveSkinTone(0); + case 'End': + return changeActiveSkinTone(skinTones.length - 1); + case 'Enter': + // enter on keydown, space on keyup. this is just how browsers work for buttons + // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html + return onSkinToneOptionsClick(event); + case 'Escape': + halt(event); + $$invalidate(6, skinTonePickerExpanded = false); + return focus('skintone-button'); + } + } + + // eslint-disable-next-line no-unused-vars + function onSkinToneOptionsKeyup(event) { + if (!skinTonePickerExpanded) { + return; + } + + switch (event.key) { + case ' ': + // enter on keydown, space on keyup. this is just how browsers work for buttons + // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html + return onSkinToneOptionsClick(event); + } + } + + // eslint-disable-next-line no-unused-vars + async function onSkinToneOptionsFocusOut(event) { + // On blur outside of the skintone options, collapse the skintone picker. + // Except if focus is just moving to another skintone option, e.g. pressing up/down to change focus + const { relatedTarget } = event; + + if (!relatedTarget || !isSkinToneOption(relatedTarget)) { + $$invalidate(6, skinTonePickerExpanded = false); + } + } + + function input_input_handler() { + rawSearchText = this.value; + $$invalidate(2, rawSearchText); + } + + function div3_binding($$value) { + binding_callbacks[$$value ? 'unshift' : 'push'](() => { + skinToneDropdown = $$value; + $$invalidate(7, skinToneDropdown); + }); + } + + const click_handler = group => onNavClick(group); + + function div10_binding($$value) { + binding_callbacks[$$value ? 'unshift' : 'push'](() => { + tabpanelElement = $$value; + $$invalidate(3, tabpanelElement); + }); + } + + function button1_binding($$value) { + binding_callbacks[$$value ? 'unshift' : 'push'](() => { + baselineEmoji = $$value; + $$invalidate(17, baselineEmoji); + }); + } + + function section_binding($$value) { + binding_callbacks[$$value ? 'unshift' : 'push'](() => { + rootElement = $$value; + $$invalidate(16, rootElement); + }); + } + + $$self.$$set = $$props => { + if ('skinToneEmoji' in $$props) $$invalidate(40, skinToneEmoji = $$props.skinToneEmoji); + if ('i18n' in $$props) $$invalidate(0, i18n = $$props.i18n); + if ('database' in $$props) $$invalidate(39, database = $$props.database); + if ('customEmoji' in $$props) $$invalidate(41, customEmoji = $$props.customEmoji); + if ('customCategorySorting' in $$props) $$invalidate(42, customCategorySorting = $$props.customCategorySorting); + if ('emojiVersion' in $$props) $$invalidate(43, emojiVersion = $$props.emojiVersion); + }; + + $$self.$$.update = () => { + if ($$self.$$.dirty[1] & /*customEmoji, database*/ 1280) { + /* eslint-enable no-unused-vars */ + // + // Set or update the customEmoji + // + { + if (customEmoji && database) { + $$invalidate(39, database.customEmoji = customEmoji, database); + } + } + } + + if ($$self.$$.dirty[0] & /*i18n*/ 1 | $$self.$$.dirty[1] & /*database*/ 256) { + // + // Set or update the database object + // + { + // show a Loading message if it takes a long time, or show an error if there's a network/IDB error + async function handleDatabaseLoading() { + let showingLoadingMessage = false; + + const timeoutHandle = setTimeout( + () => { + showingLoadingMessage = true; + $$invalidate(18, message = i18n.loadingMessage); + }, + TIMEOUT_BEFORE_LOADING_MESSAGE + ); + + try { + await database.ready(); + $$invalidate(14, databaseLoaded = true); // eslint-disable-line no-unused-vars + } catch(err) { + console.error(err); + $$invalidate(18, message = i18n.networkErrorMessage); + } finally { + clearTimeout(timeoutHandle); + + if (showingLoadingMessage) { + // Seems safer than checking the i18n string, which may change + showingLoadingMessage = false; + + $$invalidate(18, message = ''); // eslint-disable-line no-unused-vars + } + } + } + + if (database) { + /* no await */ + handleDatabaseLoading(); + } + } + } + + if ($$self.$$.dirty[0] & /*groups, currentGroupIndex*/ 6144 | $$self.$$.dirty[1] & /*customEmoji*/ 1024) { + { + if (customEmoji && customEmoji.length) { + $$invalidate(12, groups$1 = [customGroup, ...groups]); + } else if (groups$1 !== groups) { + if (currentGroupIndex) { + // If the current group is anything other than "custom" (which is first), decrement. + // This fixes the odd case where you set customEmoji, then pick a category, then unset customEmoji + $$invalidate(11, currentGroupIndex--, currentGroupIndex); + } + + $$invalidate(12, groups$1 = groups); + } + } + } + + if ($$self.$$.dirty[0] & /*rawSearchText*/ 4) { + /* eslint-enable no-unused-vars */ + // + // Handle user input on the search input + // + { + rIC(() => { + $$invalidate(45, searchText = (rawSearchText || '').trim()); // defer to avoid input delays, plus we can trim here + $$invalidate(5, activeSearchItem = -1); + }); + } + } + + if ($$self.$$.dirty[0] & /*groups, currentGroupIndex*/ 6144) { + // + // Update the current group based on the currentGroupIndex + // + $$invalidate(13, currentGroup = groups$1[currentGroupIndex]); + } + + if ($$self.$$.dirty[0] & /*databaseLoaded, currentGroup*/ 24576 | $$self.$$.dirty[1] & /*searchText*/ 16384) { + // + // Set or update the currentEmojis. Check for invalid ZWJ renderings + // (i.e. double emoji). + // + { + async function updateEmojis() { + + if (!databaseLoaded) { + $$invalidate(1, currentEmojis = []); + $$invalidate(4, searchMode = false); + } else if (searchText.length >= MIN_SEARCH_TEXT_LENGTH) { + const currentSearchText = searchText; + const newEmojis = await getEmojisBySearchQuery(currentSearchText); + + if (currentSearchText === searchText) { + // if the situation changes asynchronously, do not update + $$invalidate(1, currentEmojis = newEmojis); + + $$invalidate(4, searchMode = true); + } + } else if (currentGroup) { + const currentGroupId = currentGroup.id; + const newEmojis = await getEmojisByGroup(currentGroupId); + + if (currentGroupId === currentGroup.id) { + // if the situation changes asynchronously, do not update + $$invalidate(1, currentEmojis = newEmojis); + + $$invalidate(4, searchMode = false); + } + } + } + + /* no await */ + updateEmojis(); + } + } + + if ($$self.$$.dirty[0] & /*groups, searchMode*/ 4112) { + // + // Global styles for the entire picker + // + /* eslint-disable no-unused-vars */ + $$invalidate(22, pickerStyle = ` + --num-groups: ${groups$1.length}; + --indicator-opacity: ${searchMode ? 0 : 1}; + --num-skintones: ${NUM_SKIN_TONES};`); + } + + if ($$self.$$.dirty[0] & /*databaseLoaded*/ 16384 | $$self.$$.dirty[1] & /*database*/ 256) { + // + // Set or update the preferred skin tone + // + { + async function updatePreferredSkinTone() { + if (databaseLoaded) { + $$invalidate(8, currentSkinTone = await database.getPreferredSkinTone()); + } + } + + /* no await */ + updatePreferredSkinTone(); + } + } + + if ($$self.$$.dirty[1] & /*skinToneEmoji*/ 512) { + $$invalidate(9, skinTones = Array(NUM_SKIN_TONES).fill().map((_, i) => applySkinTone(skinToneEmoji, i))); + } + + if ($$self.$$.dirty[0] & /*skinTones, currentSkinTone*/ 768) { + /* eslint-disable no-unused-vars */ + $$invalidate(21, skinToneButtonText = skinTones[currentSkinTone]); + } + + if ($$self.$$.dirty[0] & /*i18n, currentSkinTone*/ 257) { + $$invalidate(23, skinToneButtonLabel = i18n.skinToneLabel.replace('{skinTone}', i18n.skinTones[currentSkinTone])); + } + + if ($$self.$$.dirty[0] & /*databaseLoaded*/ 16384 | $$self.$$.dirty[1] & /*database*/ 256) { + /* eslint-enable no-unused-vars */ + // + // Set or update the favorites emojis + // + { + async function updateDefaultFavoriteEmojis() { + $$invalidate(46, defaultFavoriteEmojis = (await Promise.all(MOST_COMMONLY_USED_EMOJI.map(unicode => database.getEmojiByUnicodeOrName(unicode)))).filter(Boolean)); // filter because in Jest tests we don't have all the emoji in the DB + } + + if (databaseLoaded) { + /* no await */ + updateDefaultFavoriteEmojis(); + } + } + } + + if ($$self.$$.dirty[0] & /*databaseLoaded*/ 16384 | $$self.$$.dirty[1] & /*database, numColumns, defaultFavoriteEmojis*/ 98560) { + { + async function updateFavorites() { + const dbFavorites = await database.getTopFavoriteEmoji(numColumns); + const favorites = await summarizeEmojis(uniqBy([...dbFavorites, ...defaultFavoriteEmojis], _ => _.unicode || _.name).slice(0, numColumns)); + $$invalidate(10, currentFavorites = favorites); + } + + if (databaseLoaded && defaultFavoriteEmojis) { + /* no await */ + updateFavorites(); + } + } + } + + if ($$self.$$.dirty[0] & /*currentEmojis, tabpanelElement*/ 10 | $$self.$$.dirty[1] & /*emojiVersion*/ 4096) { + // Some emojis have their ligatures rendered as two or more consecutive emojis + // We want to treat these the same as unsupported emojis, so we compare their + // widths against the baseline widths and remove them as necessary + { + const zwjEmojisToCheck = currentEmojis.filter(emoji => emoji.unicode).filter(emoji => hasZwj(emoji) && !supportedZwjEmojis.has(emoji.unicode)); // filter custom emoji + + if (!emojiVersion && zwjEmojisToCheck.length) { + // render now, check their length later + rAF(() => checkZwjSupportAndUpdate(zwjEmojisToCheck)); + } else { + $$invalidate(1, currentEmojis = emojiVersion + ? currentEmojis + : currentEmojis.filter(isZwjSupported)); + + // Reset scroll top to 0 when emojis change + rAF(() => resetScrollTopIfPossible(tabpanelElement)); + } + } + } + + if ($$self.$$.dirty[0] & /*currentEmojis, currentFavorites*/ 1026 | $$self.$$.dirty[1] & /*initialLoad*/ 8192) { + { + // consider initialLoad to be complete when the first tabpanel and favorites are rendered + /* istanbul ignore next */ + if ("production" !== 'production' || false) { + if (currentEmojis.length && currentFavorites.length && initialLoad) { + $$invalidate(44, initialLoad = false); + requestPostAnimationFrame(() => (void 0)); + } + } + } + } + + if ($$self.$$.dirty[0] & /*searchMode, currentEmojis*/ 18 | $$self.$$.dirty[1] & /*customCategorySorting*/ 2048) { + // + // Derive currentEmojisWithCategories from currentEmojis. This is always done even if there + // are no categories, because it's just easier to code the HTML this way. + // + { + function calculateCurrentEmojisWithCategories() { + if (searchMode) { + return [{ category: '', emojis: currentEmojis }]; + } + + const categoriesToEmoji = new Map(); + + for (const emoji of currentEmojis) { + const category = emoji.category || ''; + let emojis = categoriesToEmoji.get(category); + + if (!emojis) { + emojis = []; + categoriesToEmoji.set(category, emojis); + } + + emojis.push(emoji); + } + + return [...categoriesToEmoji.entries()].map(([category, emojis]) => ({ category, emojis })).sort((a, b) => customCategorySorting(a.category, b.category)); + } + + // eslint-disable-next-line no-unused-vars + $$invalidate(15, currentEmojisWithCategories = calculateCurrentEmojisWithCategories()); + } + } + + if ($$self.$$.dirty[0] & /*activeSearchItem, currentEmojis*/ 34) { + // + // Handle active search item (i.e. pressing up or down while searching) + // + /* eslint-disable no-unused-vars */ + $$invalidate(26, activeSearchItemId = activeSearchItem !== -1 && currentEmojis[activeSearchItem].id); + } + + if ($$self.$$.dirty[0] & /*skinTonePickerExpanded, skinToneDropdown*/ 192) { + // To make the animation nicer, change the z-index of the skintone picker button + // *after* the animation has played. This makes it appear that the picker box + // is expanding "below" the button + { + if (skinTonePickerExpanded) { + skinToneDropdown.addEventListener( + 'transitionend', + () => { + $$invalidate(19, skinTonePickerExpandedAfterAnimation = true); // eslint-disable-line no-unused-vars + }, + { once: true } + ); + } else { + $$invalidate(19, skinTonePickerExpandedAfterAnimation = false); // eslint-disable-line no-unused-vars + } + } + } + }; + + return [ + i18n, + currentEmojis, + rawSearchText, + tabpanelElement, + searchMode, + activeSearchItem, + skinTonePickerExpanded, + skinToneDropdown, + currentSkinTone, + skinTones, + currentFavorites, + currentGroupIndex, + groups$1, + currentGroup, + databaseLoaded, + currentEmojisWithCategories, + rootElement, + baselineEmoji, + message, + skinTonePickerExpandedAfterAnimation, + activeSkinTone, + skinToneButtonText, + pickerStyle, + skinToneButtonLabel, + isRtl, + scrollbarWidth, + activeSearchItemId, + unicodeWithSkin, + labelWithSkin, + calculateEmojiGridStyle, + onSearchKeydown, + onNavClick, + onNavKeydown, + onEmojiClick, + onSkinToneOptionsClick, + onClickSkinToneButton, + onSkinToneOptionsKeydown, + onSkinToneOptionsKeyup, + onSkinToneOptionsFocusOut, + database, + skinToneEmoji, + customEmoji, + customCategorySorting, + emojiVersion, + initialLoad, + searchText, + defaultFavoriteEmojis, + numColumns, + input_input_handler, + div3_binding, + click_handler, + div10_binding, + button1_binding, + section_binding + ]; +} + +class Picker extends SvelteComponent { + constructor(options) { + super(); + + init( + this, + options, + instance, + create_fragment, + safe_not_equal, + { + skinToneEmoji: 40, + i18n: 0, + database: 39, + customEmoji: 41, + customCategorySorting: 42, + emojiVersion: 43 + }, + null, + [-1, -1, -1] + ); + } +} + +const DEFAULT_DATA_SOURCE = 'https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json'; +const DEFAULT_LOCALE = 'en'; + +var enI18n = { + categoriesLabel: 'Categories', + emojiUnsupportedMessage: 'Your browser does not support color emoji.', + favoritesLabel: 'Favorites', + loadingMessage: 'Loadingโฆ', + networkErrorMessage: 'Could not load emoji.', + regionLabel: 'Emoji picker', + searchDescription: 'When search results are available, press up or down to select and enter to choose.', + searchLabel: 'Search', + searchResultsLabel: 'Search results', + skinToneDescription: 'When expanded, press up or down to select and enter to choose.', + skinToneLabel: 'Choose a skin tone (currently {skinTone})', + skinTonesLabel: 'Skin tones', + skinTones: [ + 'Default', + 'Light', + 'Medium-Light', + 'Medium', + 'Medium-Dark', + 'Dark' + ], + categories: { + custom: 'Custom', + 'smileys-emotion': 'Smileys and emoticons', + 'people-body': 'People and body', + 'animals-nature': 'Animals and nature', + 'food-drink': 'Food and drink', + 'travel-places': 'Travel and places', + activities: 'Activities', + objects: 'Objects', + symbols: 'Symbols', + flags: 'Flags' + } +}; + +const PROPS = [ + 'customEmoji', + 'customCategorySorting', + 'database', + 'dataSource', + 'i18n', + 'locale', + 'skinToneEmoji', + 'emojiVersion' +]; + +// Styles injected ourselves, so we can declare the FONT_FAMILY variable in one place +const EXTRA_STYLES = `:host{--emoji-font-family:${FONT_FAMILY}}`; + +class PickerElement extends HTMLElement { + constructor (props) { + super(); + this.attachShadow({ mode: 'open' }); + const style = document.createElement('style'); + style.textContent = ":host{--emoji-size:1.375rem;--emoji-padding:0.5rem;--category-emoji-size:var(--emoji-size);--category-emoji-padding:var(--emoji-padding);--indicator-height:3px;--input-border-radius:0.5rem;--input-border-size:1px;--input-font-size:1rem;--input-line-height:1.5;--input-padding:0.25rem;--num-columns:8;--outline-size:2px;--border-size:1px;--skintone-border-radius:1rem;--category-font-size:1rem;display:flex;width:min-content;height:400px}:host,:host(.light){color-scheme:light;--background:#fff;--border-color:#e0e0e0;--indicator-color:#385ac1;--input-border-color:#999;--input-font-color:#111;--input-placeholder-color:#999;--outline-color:#999;--category-font-color:#111;--button-active-background:#e6e6e6;--button-hover-background:#d9d9d9}:host(.dark){color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}@media (prefers-color-scheme:dark){:host{color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}}:host([hidden]){display:none}button{margin:0;padding:0;border:0;background:0 0;box-shadow:none;-webkit-tap-highlight-color:transparent}button::-moz-focus-inner{border:0}input{padding:0;margin:0;line-height:1.15;font-family:inherit}input[type=search]{-webkit-appearance:none}:focus{outline:var(--outline-color) solid var(--outline-size);outline-offset:calc(-1*var(--outline-size))}:host([data-js-focus-visible]) :focus:not([data-focus-visible-added]){outline:0}:focus:not(:focus-visible){outline:0}.hide-focus{outline:0}*{box-sizing:border-box}.picker{contain:content;display:flex;flex-direction:column;background:var(--background);border:var(--border-size) solid var(--border-color);width:100%;height:100%;overflow:hidden;--total-emoji-size:calc(var(--emoji-size) + (2 * var(--emoji-padding)));--total-category-emoji-size:calc(var(--category-emoji-size) + (2 * var(--category-emoji-padding)))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.hidden{opacity:0;pointer-events:none}.abs-pos{position:absolute;left:0;top:0}.gone{display:none!important}.skintone-button-wrapper,.skintone-list{background:var(--background);z-index:3}.skintone-button-wrapper.expanded{z-index:1}.skintone-list{position:absolute;inset-inline-end:0;top:0;z-index:2;overflow:visible;border-bottom:var(--border-size) solid var(--border-color);border-radius:0 0 var(--skintone-border-radius) var(--skintone-border-radius);will-change:transform;transition:transform .2s ease-in-out;transform-origin:center 0}@media (prefers-reduced-motion:reduce){.skintone-list{transition-duration:.001s}}@supports not (inset-inline-end:0){.skintone-list{right:0}}.skintone-list.no-animate{transition:none}.tabpanel{overflow-y:auto;-webkit-overflow-scrolling:touch;will-change:transform;min-height:0;flex:1;contain:content}.emoji-menu{display:grid;grid-template-columns:repeat(var(--num-columns),var(--total-emoji-size));justify-content:space-around;align-items:flex-start;width:100%}.category{padding:var(--emoji-padding);font-size:var(--category-font-size);color:var(--category-font-color)}.custom-emoji,.emoji,button.emoji{height:var(--total-emoji-size);width:var(--total-emoji-size)}.emoji,button.emoji{font-size:var(--emoji-size);display:flex;align-items:center;justify-content:center;border-radius:100%;line-height:1;overflow:hidden;font-family:var(--emoji-font-family);cursor:pointer}@media (hover:hover) and (pointer:fine){.emoji:hover,button.emoji:hover{background:var(--button-hover-background)}}.emoji.active,.emoji:active,button.emoji.active,button.emoji:active{background:var(--button-active-background)}.custom-emoji{padding:var(--emoji-padding);object-fit:contain;pointer-events:none;background-repeat:no-repeat;background-position:center center;background-size:var(--emoji-size) var(--emoji-size)}.nav,.nav-button{align-items:center}.nav{display:grid;justify-content:space-between;contain:content}.nav-button{display:flex;justify-content:center}.nav-emoji{font-size:var(--category-emoji-size);width:var(--total-category-emoji-size);height:var(--total-category-emoji-size)}.indicator-wrapper{display:flex;border-bottom:1px solid var(--border-color)}.indicator{width:calc(100%/var(--num-groups));height:var(--indicator-height);opacity:var(--indicator-opacity);background-color:var(--indicator-color);will-change:transform,opacity;transition:opacity .1s linear,transform .25s ease-in-out}@media (prefers-reduced-motion:reduce){.indicator{will-change:opacity;transition:opacity .1s linear}}.pad-top,input.search{background:var(--background);width:100%}.pad-top{height:var(--emoji-padding);z-index:3}.search-row{display:flex;align-items:center;position:relative;padding-inline-start:var(--emoji-padding);padding-bottom:var(--emoji-padding)}.search-wrapper{flex:1;min-width:0}input.search{padding:var(--input-padding);border-radius:var(--input-border-radius);border:var(--input-border-size) solid var(--input-border-color);color:var(--input-font-color);font-size:var(--input-font-size);line-height:var(--input-line-height)}input.search::placeholder{color:var(--input-placeholder-color)}.favorites{display:flex;flex-direction:row;border-top:var(--border-size) solid var(--border-color);contain:content}.message{padding:var(--emoji-padding)}" + EXTRA_STYLES; + this.shadowRoot.appendChild(style); + this._ctx = { + // Set defaults + locale: DEFAULT_LOCALE, + dataSource: DEFAULT_DATA_SOURCE, + skinToneEmoji: DEFAULT_SKIN_TONE_EMOJI, + customCategorySorting: DEFAULT_CATEGORY_SORTING, + customEmoji: null, + i18n: enI18n, + emojiVersion: null, + ...props + }; + // Handle properties set before the element was upgraded + for (const prop of PROPS) { + if (prop !== 'database' && Object.prototype.hasOwnProperty.call(this, prop)) { + this._ctx[prop] = this[prop]; + delete this[prop]; + } + } + this._dbFlush(); // wait for a flush before creating the db, in case the user calls e.g. a setter or setAttribute + } + + connectedCallback () { + // The _cmp may be defined if the component was immediately disconnected and then reconnected. In that case, + // do nothing (preserve the state) + if (!this._cmp) { + this._cmp = new Picker({ + target: this.shadowRoot, + props: this._ctx + }); + } + } + + disconnectedCallback () { + // Check in a microtask if the element is still connected. If so, treat this as a "move" rather than a disconnect + // Inspired by Vue: https://vuejs.org/guide/extras/web-components.html#building-custom-elements-with-vue + Promise.resolve().then(() => { + // this._cmp may be defined if connect-disconnect-connect-disconnect occurs synchronously + if (!this.isConnected && this._cmp) { + this._cmp.$destroy(); + this._cmp = undefined; + + const { database } = this._ctx; + database.close() + // only happens if the database failed to load in the first place, so we don't care + .catch(err => console.error(err)); + } + }); + } + + static get observedAttributes () { + return ['locale', 'data-source', 'skin-tone-emoji', 'emoji-version'] // complex objects aren't supported, also use kebab-case + } + + attributeChangedCallback (attrName, oldValue, newValue) { + this._set( + // convert from kebab-case to camelcase + // see https://github.com/sveltejs/svelte/issues/3852#issuecomment-665037015 + attrName.replace(/-([a-z])/g, (_, up) => up.toUpperCase()), + // convert string attribute to float if necessary + attrName === 'emoji-version' ? parseFloat(newValue) : newValue + ); + } + + _set (prop, newValue) { + this._ctx[prop] = newValue; + if (this._cmp) { + this._cmp.$set({ [prop]: newValue }); + } + if (['locale', 'dataSource'].includes(prop)) { + this._dbFlush(); + } + } + + _dbCreate () { + const { locale, dataSource, database } = this._ctx; + // only create a new database if we really need to + if (!database || database.locale !== locale || database.dataSource !== dataSource) { + this._set('database', new Database({ locale, dataSource })); + } + } + + // Update the Database in one microtask if the locale/dataSource change. We do one microtask + // so we don't create two Databases if e.g. both the locale and the dataSource change + _dbFlush () { + Promise.resolve().then(() => ( + this._dbCreate() + )); + } +} + +const definitions = {}; + +for (const prop of PROPS) { + definitions[prop] = { + get () { + if (prop === 'database') { + // in rare cases, the microtask may not be flushed yet, so we need to instantiate the DB + // now if the user is asking for it + this._dbCreate(); + } + return this._ctx[prop] + }, + set (val) { + if (prop === 'database') { + throw new Error('database is read-only') + } + this._set(prop, val); + } + }; +} + +Object.defineProperties(PickerElement.prototype, definitions); + +/* istanbul ignore else */ +if (!customElements.get('emoji-picker')) { // if already defined, do nothing (e.g. same script imported twice) + customElements.define('emoji-picker', PickerElement); +} + +export { PickerElement as default }; diff --git a/app/static/scripts/emoji-picker-element/svelte.js b/app/static/scripts/emoji-picker-element/svelte.js new file mode 100644 index 0000000..ddc68ff --- /dev/null +++ b/app/static/scripts/emoji-picker-element/svelte.js @@ -0,0 +1,2294 @@ +import { SvelteComponent, init, safe_not_equal, element, text, attr, set_style, insert, append, set_input_value, listen, action_destroyer, set_data, update_keyed_each, destroy_block, noop, detach, run_all, globals, binding_callbacks, src_url_equal } from 'svelte/internal'; +import { onMount, tick } from 'svelte'; +import Database from './database.js'; + +// via https://unpkg.com/browse/emojibase-data@6.0.0/meta/groups.json +const allGroups = [ + [-1, 'โจ', 'custom'], + [0, '๐', 'smileys-emotion'], + [1, '๐', 'people-body'], + [3, '๐ฑ', 'animals-nature'], + [4, '๐', 'food-drink'], + [5, '๐ ๏ธ', 'travel-places'], + [6, 'โฝ', 'activities'], + [7, '๐', 'objects'], + [8, 'โ๏ธ', 'symbols'], + [9, '๐', 'flags'] +].map(([id, emoji, name]) => ({ id, emoji, name })); + +const groups = allGroups.slice(1); +const customGroup = allGroups[0]; + +const MIN_SEARCH_TEXT_LENGTH = 2; +const NUM_SKIN_TONES = 6; + +/* istanbul ignore next */ +const rIC = typeof requestIdleCallback === 'function' ? requestIdleCallback : setTimeout; + +// check for ZWJ (zero width joiner) character +function hasZwj (emoji) { + return emoji.unicode.includes('\u200d') +} + +// Find one good representative emoji from each version to test by checking its color. +// Ideally it should have color in the center. For some inspiration, see: +// https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/ +// +// Note that for certain versions (12.1, 13.1), there is no point in testing them explicitly, because +// all the emoji from this version are compound-emoji from previous versions. So they would pass a color +// test, even in browsers that display them as double emoji. (E.g. "face in clouds" might render as +// "face without mouth" plus "fog".) These emoji can only be filtered using the width test, +// which happens in checkZwjSupport.js. +const versionsAndTestEmoji = { + '๐ซ ': 14, + '๐ฅฒ': 13.1, // smiling face with tear, technically from v13 but see note above + '๐ฅป': 12.1, // sari, technically from v12 but see note above + '๐ฅฐ': 11, + '๐คฉ': 5, + '๐ฑโโ๏ธ': 4, + '๐คฃ': 3, + '๐๏ธโ๐จ๏ธ': 2, + '๐': 1, + '๐๏ธ': 0.7, + '๐': 0.6 +}; + +const TIMEOUT_BEFORE_LOADING_MESSAGE = 1000; // 1 second +const DEFAULT_SKIN_TONE_EMOJI = '๐๏ธ'; +const DEFAULT_NUM_COLUMNS = 8; + +// Based on https://fivethirtyeight.com/features/the-100-most-used-emojis/ and +// https://blog.emojipedia.org/facebook-reveals-most-and-least-used-emojis/ with +// a bit of my own curation. (E.g. avoid the "OK" gesture because of connotations: +// https://emojipedia.org/ok-hand/) +const MOST_COMMONLY_USED_EMOJI = [ + '๐', + '๐', + 'โฅ๏ธ', + '๐๏ธ', + '๐', + '๐', + '๐ญ', + 'โบ๏ธ', + '๐', + '๐ฉ', + '๐', + '๐', + '๐', + '๐' +]; + +// It's important to list Twemoji Mozilla before everything else, because Mozilla bundles their +// own font on some platforms (notably Windows and Linux as of this writing). Typically, Mozilla +// updates faster than the underlying OS, and we don't want to render older emoji in one font and +// newer emoji in another font: +// https://github.com/nolanlawson/emoji-picker-element/pull/268#issuecomment-1073347283 +const FONT_FAMILY = '"Twemoji Mozilla","Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol",' + + '"Noto Color Emoji","EmojiOne Color","Android Emoji",sans-serif'; + +/* istanbul ignore next */ +const DEFAULT_CATEGORY_SORTING = (a, b) => a < b ? -1 : a > b ? 1 : 0; + +// Test if an emoji is supported by rendering it to canvas and checking that the color is not black + +const getTextFeature = (text, color) => { + const canvas = document.createElement('canvas'); + canvas.width = canvas.height = 1; + + const ctx = canvas.getContext('2d'); + ctx.textBaseline = 'top'; + ctx.font = `100px ${FONT_FAMILY}`; + ctx.fillStyle = color; + ctx.scale(0.01, 0.01); + ctx.fillText(text, 0, 0); + + return ctx.getImageData(0, 0, 1, 1).data +}; + +const compareFeatures = (feature1, feature2) => { + const feature1Str = [...feature1].join(','); + const feature2Str = [...feature2].join(','); + // This is RGBA, so for 0,0,0, we are checking that the first RGB is not all zeroes. + // Most of the time when unsupported this is 0,0,0,0, but on Chrome on Mac it is + // 0,0,0,61 - there is a transparency here. + return feature1Str === feature2Str && !feature1Str.startsWith('0,0,0,') +}; + +function testColorEmojiSupported (text) { + // Render white and black and then compare them to each other and ensure they're the same + // color, and neither one is black. This shows that the emoji was rendered in color. + const feature1 = getTextFeature(text, '#000'); + const feature2 = getTextFeature(text, '#fff'); + return feature1 && feature2 && compareFeatures(feature1, feature2) +} + +// rather than check every emoji ever, which would be expensive, just check some representatives from the + +function determineEmojiSupportLevel () { + const entries = Object.entries(versionsAndTestEmoji); + try { + // start with latest emoji and work backwards + for (const [emoji, version] of entries) { + if (testColorEmojiSupported(emoji)) { + return version + } + } + } catch (e) { // canvas error + } finally { + } + // In case of an error, be generous and just assume all emoji are supported (e.g. for canvas errors + // due to anti-fingerprinting add-ons). Better to show some gray boxes than nothing at all. + return entries[0][1] // first one in the list is the most recent version +} + +// Check which emojis we know for sure aren't supported, based on Unicode version level +let promise; +const detectEmojiSupportLevel = () => { + if (!promise) { + // Delay so it can run while the IDB database is being created by the browser (on another thread). + // This helps especially with first load โ we want to start pre-populating the database on the main thread, + // and then wait for IDB to commit everything, and while waiting we run this check. + promise = new Promise(resolve => ( + rIC(() => ( + resolve(determineEmojiSupportLevel()) // delay so ideally this can run while IDB is first populating + )) + )); + } + return promise +}; +// determine which emojis containing ZWJ (zero width joiner) characters +// are supported (rendered as one glyph) rather than unsupported (rendered as two or more glyphs) +const supportedZwjEmojis = new Map(); + +const VARIATION_SELECTOR = '\ufe0f'; +const SKINTONE_MODIFIER = '\ud83c'; +const ZWJ = '\u200d'; +const LIGHT_SKIN_TONE = 0x1F3FB; +const LIGHT_SKIN_TONE_MODIFIER = 0xdffb; + +// TODO: this is a naive implementation, we can improve it later +// It's only used for the skintone picker, so as long as people don't customize with +// really exotic emoji then it should work fine +function applySkinTone (str, skinTone) { + if (skinTone === 0) { + return str + } + const zwjIndex = str.indexOf(ZWJ); + if (zwjIndex !== -1) { + return str.substring(0, zwjIndex) + + String.fromCodePoint(LIGHT_SKIN_TONE + skinTone - 1) + + str.substring(zwjIndex) + } + if (str.endsWith(VARIATION_SELECTOR)) { + str = str.substring(0, str.length - 1); + } + return str + SKINTONE_MODIFIER + String.fromCodePoint(LIGHT_SKIN_TONE_MODIFIER + skinTone - 1) +} + +function halt (event) { + event.preventDefault(); + event.stopPropagation(); +} + +// Implementation left/right or up/down navigation, circling back when you +// reach the start/end of the list +function incrementOrDecrement (decrement, val, arr) { + val += (decrement ? -1 : 1); + if (val < 0) { + val = arr.length - 1; + } else if (val >= arr.length) { + val = 0; + } + return val +} + +// like lodash's uniqBy but much smaller +function uniqBy (arr, func) { + const set = new Set(); + const res = []; + for (const item of arr) { + const key = func(item); + if (!set.has(key)) { + set.add(key); + res.push(item); + } + } + return res +} + +// We don't need all the data on every emoji, and there are specific things we need +// for the UI, so build a "view model" from the emoji object we got from the database + +function summarizeEmojisForUI (emojis, emojiSupportLevel) { + const toSimpleSkinsMap = skins => { + const res = {}; + for (const skin of skins) { + // ignore arrays like [1, 2] with multiple skin tones + // also ignore variants that are in an unsupported emoji version + // (these do exist - variants from a different version than their base emoji) + if (typeof skin.tone === 'number' && skin.version <= emojiSupportLevel) { + res[skin.tone] = skin.unicode; + } + } + return res + }; + + return emojis.map(({ unicode, skins, shortcodes, url, name, category }) => ({ + unicode, + name, + shortcodes, + url, + category, + id: unicode || name, + skins: skins && toSimpleSkinsMap(skins), + title: (shortcodes || []).join(', ') + })) +} + +// import rAF from one place so that the bundle size is a bit smaller +const rAF = requestAnimationFrame; + +// Svelte action to calculate the width of an element and auto-update + +let resizeObserverSupported = typeof ResizeObserver === 'function'; + +function calculateWidth (node, onUpdate) { + let resizeObserver; + if (resizeObserverSupported) { + resizeObserver = new ResizeObserver(entries => ( + onUpdate(entries[0].contentRect.width) + )); + resizeObserver.observe(node); + } else { // just set the width once, don't bother trying to track it + rAF(() => ( + onUpdate(node.getBoundingClientRect().width) + )); + } + + // cleanup function (called on destroy) + return { + destroy () { + if (resizeObserver) { + resizeObserver.disconnect(); + } + } + } +} + +// get the width of the text inside of a DOM node, via https://stackoverflow.com/a/59525891/680742 +function calculateTextWidth (node) { + /* istanbul ignore else */ + { + const range = document.createRange(); + range.selectNode(node.firstChild); + return range.getBoundingClientRect().width + } +} + +let baselineEmojiWidth; + +function checkZwjSupport (zwjEmojisToCheck, baselineEmoji, emojiToDomNode) { + for (const emoji of zwjEmojisToCheck) { + const domNode = emojiToDomNode(emoji); + const emojiWidth = calculateTextWidth(domNode); + if (typeof baselineEmojiWidth === 'undefined') { // calculate the baseline emoji width only once + baselineEmojiWidth = calculateTextWidth(baselineEmoji); + } + // On Windows, some supported emoji are ~50% bigger than the baseline emoji, but what we really want to guard + // against are the ones that are 2x the size, because those are truly broken (person with red hair = person with + // floating red wig, black cat = cat with black square, polar bear = bear with snowflake, etc.) + // So here we set the threshold at 1.8 times the size of the baseline emoji. + const supported = emojiWidth / 1.8 < baselineEmojiWidth; + supportedZwjEmojis.set(emoji.unicode, supported); + } +} + +// Measure after style/layout are complete + +const requestPostAnimationFrame = callback => { + rAF(() => { + setTimeout(callback); + }); +}; + +// like lodash's uniq + +function uniq (arr) { + return uniqBy(arr, _ => _) +} + +// Note we put this in its own function outside Picker.js to avoid Svelte doing an invalidation on the "setter" here. +// At best the invalidation is useless, at worst it can cause infinite loops: +// https://github.com/nolanlawson/emoji-picker-element/pull/180 +// https://github.com/sveltejs/svelte/issues/6521 +// Also note tabpanelElement can be null if the element is disconnected immediately after connected +function resetScrollTopIfPossible (element) { + if (element) { + element.scrollTop = 0; + } +} + +/* src/picker/components/Picker/Picker.svelte generated by Svelte v3.55.1 */ + +const { Map: Map_1 } = globals; + +function get_each_context(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[64] = list[i]; + child_ctx[66] = i; + return child_ctx; +} + +function get_each_context_1(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[67] = list[i]; + child_ctx[66] = i; + return child_ctx; +} + +function get_each_context_2(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[64] = list[i]; + child_ctx[66] = i; + return child_ctx; +} + +function get_each_context_3(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[70] = list[i]; + return child_ctx; +} + +function get_each_context_4(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[73] = list[i]; + child_ctx[66] = i; + return child_ctx; +} + +// (43:38) {#each skinTones as skinTone, i (skinTone)} +function create_each_block_4(key_1, ctx) { + let div; + let t_value = /*skinTone*/ ctx[73] + ""; + let t; + let div_id_value; + let div_class_value; + let div_aria_selected_value; + let div_title_value; + let div_aria_label_value; + + return { + key: key_1, + first: null, + c() { + div = element("div"); + t = text(t_value); + attr(div, "id", div_id_value = "skintone-" + /*i*/ ctx[66]); + + attr(div, "class", div_class_value = "emoji hide-focus " + (/*i*/ ctx[66] === /*activeSkinTone*/ ctx[20] + ? 'active' + : '')); + + attr(div, "aria-selected", div_aria_selected_value = /*i*/ ctx[66] === /*activeSkinTone*/ ctx[20]); + attr(div, "role", "option"); + attr(div, "title", div_title_value = /*i18n*/ ctx[0].skinTones[/*i*/ ctx[66]]); + attr(div, "tabindex", "-1"); + attr(div, "aria-label", div_aria_label_value = /*i18n*/ ctx[0].skinTones[/*i*/ ctx[66]]); + this.first = div; + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, t); + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (dirty[0] & /*skinTones*/ 512 && t_value !== (t_value = /*skinTone*/ ctx[73] + "")) set_data(t, t_value); + + if (dirty[0] & /*skinTones*/ 512 && div_id_value !== (div_id_value = "skintone-" + /*i*/ ctx[66])) { + attr(div, "id", div_id_value); + } + + if (dirty[0] & /*skinTones, activeSkinTone*/ 1049088 && div_class_value !== (div_class_value = "emoji hide-focus " + (/*i*/ ctx[66] === /*activeSkinTone*/ ctx[20] + ? 'active' + : ''))) { + attr(div, "class", div_class_value); + } + + if (dirty[0] & /*skinTones, activeSkinTone*/ 1049088 && div_aria_selected_value !== (div_aria_selected_value = /*i*/ ctx[66] === /*activeSkinTone*/ ctx[20])) { + attr(div, "aria-selected", div_aria_selected_value); + } + + if (dirty[0] & /*i18n, skinTones*/ 513 && div_title_value !== (div_title_value = /*i18n*/ ctx[0].skinTones[/*i*/ ctx[66]])) { + attr(div, "title", div_title_value); + } + + if (dirty[0] & /*i18n, skinTones*/ 513 && div_aria_label_value !== (div_aria_label_value = /*i18n*/ ctx[0].skinTones[/*i*/ ctx[66]])) { + attr(div, "aria-label", div_aria_label_value); + } + }, + d(detaching) { + if (detaching) detach(div); + } + }; +} + +// (53:33) {#each groups as group (group.id)} +function create_each_block_3(key_1, ctx) { + let button; + let div; + let t_value = /*group*/ ctx[70].emoji + ""; + let t; + let button_aria_controls_value; + let button_aria_label_value; + let button_aria_selected_value; + let button_title_value; + let mounted; + let dispose; + + function click_handler() { + return /*click_handler*/ ctx[50](/*group*/ ctx[70]); + } + + return { + key: key_1, + first: null, + c() { + button = element("button"); + div = element("div"); + t = text(t_value); + attr(div, "class", "nav-emoji emoji"); + attr(button, "role", "tab"); + attr(button, "class", "nav-button"); + attr(button, "aria-controls", button_aria_controls_value = "tab-" + /*group*/ ctx[70].id); + attr(button, "aria-label", button_aria_label_value = /*i18n*/ ctx[0].categories[/*group*/ ctx[70].name]); + attr(button, "aria-selected", button_aria_selected_value = !/*searchMode*/ ctx[4] && /*currentGroup*/ ctx[13].id === /*group*/ ctx[70].id); + attr(button, "title", button_title_value = /*i18n*/ ctx[0].categories[/*group*/ ctx[70].name]); + this.first = button; + }, + m(target, anchor) { + insert(target, button, anchor); + append(button, div); + append(div, t); + + if (!mounted) { + dispose = listen(button, "click", click_handler); + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (dirty[0] & /*groups*/ 4096 && t_value !== (t_value = /*group*/ ctx[70].emoji + "")) set_data(t, t_value); + + if (dirty[0] & /*groups*/ 4096 && button_aria_controls_value !== (button_aria_controls_value = "tab-" + /*group*/ ctx[70].id)) { + attr(button, "aria-controls", button_aria_controls_value); + } + + if (dirty[0] & /*i18n, groups*/ 4097 && button_aria_label_value !== (button_aria_label_value = /*i18n*/ ctx[0].categories[/*group*/ ctx[70].name])) { + attr(button, "aria-label", button_aria_label_value); + } + + if (dirty[0] & /*searchMode, currentGroup, groups*/ 12304 && button_aria_selected_value !== (button_aria_selected_value = !/*searchMode*/ ctx[4] && /*currentGroup*/ ctx[13].id === /*group*/ ctx[70].id)) { + attr(button, "aria-selected", button_aria_selected_value); + } + + if (dirty[0] & /*i18n, groups*/ 4097 && button_title_value !== (button_title_value = /*i18n*/ ctx[0].categories[/*group*/ ctx[70].name])) { + attr(button, "title", button_title_value); + } + }, + d(detaching) { + if (detaching) detach(button); + mounted = false; + dispose(); + } + }; +} + +// (94:100) {:else} +function create_else_block_1(ctx) { + let img; + let img_src_value; + + return { + c() { + img = element("img"); + attr(img, "class", "custom-emoji"); + if (!src_url_equal(img.src, img_src_value = /*emoji*/ ctx[64].url)) attr(img, "src", img_src_value); + attr(img, "alt", ""); + attr(img, "loading", "lazy"); + }, + m(target, anchor) { + insert(target, img, anchor); + }, + p(ctx, dirty) { + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && !src_url_equal(img.src, img_src_value = /*emoji*/ ctx[64].url)) { + attr(img, "src", img_src_value); + } + }, + d(detaching) { + if (detaching) detach(img); + } + }; +} + +// (94:40) {#if emoji.unicode} +function create_if_block_1(ctx) { + let t_value = /*unicodeWithSkin*/ ctx[27](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]) + ""; + let t; + + return { + c() { + t = text(t_value); + }, + m(target, anchor) { + insert(target, t, anchor); + }, + p(ctx, dirty) { + if (dirty[0] & /*currentEmojisWithCategories, currentSkinTone*/ 33024 && t_value !== (t_value = /*unicodeWithSkin*/ ctx[27](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]) + "")) set_data(t, t_value); + }, + d(detaching) { + if (detaching) detach(t); + } + }; +} + +// (89:53) {#each emojiWithCategory.emojis as emoji, i (emoji.id)} +function create_each_block_2(key_1, ctx) { + let button; + let button_role_value; + let button_aria_selected_value; + let button_aria_label_value; + let button_title_value; + let button_class_value; + let button_id_value; + + function select_block_type(ctx, dirty) { + if (/*emoji*/ ctx[64].unicode) return create_if_block_1; + return create_else_block_1; + } + + let current_block_type = select_block_type(ctx); + let if_block = current_block_type(ctx); + + return { + key: key_1, + first: null, + c() { + button = element("button"); + if_block.c(); + attr(button, "role", button_role_value = /*searchMode*/ ctx[4] ? 'option' : 'menuitem'); + + attr(button, "aria-selected", button_aria_selected_value = /*searchMode*/ ctx[4] + ? /*i*/ ctx[66] == /*activeSearchItem*/ ctx[5] + : ''); + + attr(button, "aria-label", button_aria_label_value = /*labelWithSkin*/ ctx[28](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8])); + attr(button, "title", button_title_value = /*emoji*/ ctx[64].title); + + attr(button, "class", button_class_value = "emoji " + (/*searchMode*/ ctx[4] && /*i*/ ctx[66] === /*activeSearchItem*/ ctx[5] + ? 'active' + : '')); + + attr(button, "id", button_id_value = "emo-" + /*emoji*/ ctx[64].id); + this.first = button; + }, + m(target, anchor) { + insert(target, button, anchor); + if_block.m(button, null); + }, + p(new_ctx, dirty) { + ctx = new_ctx; + + if (current_block_type === (current_block_type = select_block_type(ctx)) && if_block) { + if_block.p(ctx, dirty); + } else { + if_block.d(1); + if_block = current_block_type(ctx); + + if (if_block) { + if_block.c(); + if_block.m(button, null); + } + } + + if (dirty[0] & /*searchMode*/ 16 && button_role_value !== (button_role_value = /*searchMode*/ ctx[4] ? 'option' : 'menuitem')) { + attr(button, "role", button_role_value); + } + + if (dirty[0] & /*searchMode, currentEmojisWithCategories, activeSearchItem*/ 32816 && button_aria_selected_value !== (button_aria_selected_value = /*searchMode*/ ctx[4] + ? /*i*/ ctx[66] == /*activeSearchItem*/ ctx[5] + : '')) { + attr(button, "aria-selected", button_aria_selected_value); + } + + if (dirty[0] & /*currentEmojisWithCategories, currentSkinTone*/ 33024 && button_aria_label_value !== (button_aria_label_value = /*labelWithSkin*/ ctx[28](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]))) { + attr(button, "aria-label", button_aria_label_value); + } + + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && button_title_value !== (button_title_value = /*emoji*/ ctx[64].title)) { + attr(button, "title", button_title_value); + } + + if (dirty[0] & /*searchMode, currentEmojisWithCategories, activeSearchItem*/ 32816 && button_class_value !== (button_class_value = "emoji " + (/*searchMode*/ ctx[4] && /*i*/ ctx[66] === /*activeSearchItem*/ ctx[5] + ? 'active' + : ''))) { + attr(button, "class", button_class_value); + } + + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && button_id_value !== (button_id_value = "emo-" + /*emoji*/ ctx[64].id)) { + attr(button, "id", button_id_value); + } + }, + d(detaching) { + if (detaching) detach(button); + if_block.d(); + } + }; +} + +// (70:36) {#each currentEmojisWithCategories as emojiWithCategory, i (emojiWithCategory.category)} +function create_each_block_1(key_1, ctx) { + let div0; + + let t_value = (/*searchMode*/ ctx[4] + ? /*i18n*/ ctx[0].searchResultsLabel + : /*emojiWithCategory*/ ctx[67].category + ? /*emojiWithCategory*/ ctx[67].category + : /*currentEmojisWithCategories*/ ctx[15].length > 1 + ? /*i18n*/ ctx[0].categories.custom + : /*i18n*/ ctx[0].categories[/*currentGroup*/ ctx[13].name]) + ""; + + let t; + let div0_id_value; + let div0_class_value; + let div1; + let each_blocks = []; + let each_1_lookup = new Map_1(); + let div1_role_value; + let div1_aria_labelledby_value; + let div1_id_value; + let each_value_2 = /*emojiWithCategory*/ ctx[67].emojis; + const get_key = ctx => /*emoji*/ ctx[64].id; + + for (let i = 0; i < each_value_2.length; i += 1) { + let child_ctx = get_each_context_2(ctx, each_value_2, i); + let key = get_key(child_ctx); + each_1_lookup.set(key, each_blocks[i] = create_each_block_2(key, child_ctx)); + } + + return { + key: key_1, + first: null, + c() { + div0 = element("div"); + t = text(t_value); + div1 = element("div"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + attr(div0, "id", div0_id_value = "menu-label-" + /*i*/ ctx[66]); + + attr(div0, "class", div0_class_value = "category " + (/*currentEmojisWithCategories*/ ctx[15].length === 1 && /*currentEmojisWithCategories*/ ctx[15][0].category === '' + ? 'gone' + : '')); + + attr(div0, "aria-hidden", "true"); + attr(div1, "class", "emoji-menu"); + attr(div1, "role", div1_role_value = /*searchMode*/ ctx[4] ? 'listbox' : 'menu'); + attr(div1, "aria-labelledby", div1_aria_labelledby_value = "menu-label-" + /*i*/ ctx[66]); + attr(div1, "id", div1_id_value = /*searchMode*/ ctx[4] ? 'search-results' : ''); + this.first = div0; + }, + m(target, anchor) { + insert(target, div0, anchor); + append(div0, t); + insert(target, div1, anchor); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div1, null); + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + + if (dirty[0] & /*searchMode, i18n, currentEmojisWithCategories, currentGroup*/ 40977 && t_value !== (t_value = (/*searchMode*/ ctx[4] + ? /*i18n*/ ctx[0].searchResultsLabel + : /*emojiWithCategory*/ ctx[67].category + ? /*emojiWithCategory*/ ctx[67].category + : /*currentEmojisWithCategories*/ ctx[15].length > 1 + ? /*i18n*/ ctx[0].categories.custom + : /*i18n*/ ctx[0].categories[/*currentGroup*/ ctx[13].name]) + "")) set_data(t, t_value); + + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && div0_id_value !== (div0_id_value = "menu-label-" + /*i*/ ctx[66])) { + attr(div0, "id", div0_id_value); + } + + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && div0_class_value !== (div0_class_value = "category " + (/*currentEmojisWithCategories*/ ctx[15].length === 1 && /*currentEmojisWithCategories*/ ctx[15][0].category === '' + ? 'gone' + : ''))) { + attr(div0, "class", div0_class_value); + } + + if (dirty[0] & /*searchMode, currentEmojisWithCategories, activeSearchItem, labelWithSkin, currentSkinTone, unicodeWithSkin*/ 402686256) { + each_value_2 = /*emojiWithCategory*/ ctx[67].emojis; + each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx, each_value_2, each_1_lookup, div1, destroy_block, create_each_block_2, null, get_each_context_2); + } + + if (dirty[0] & /*searchMode*/ 16 && div1_role_value !== (div1_role_value = /*searchMode*/ ctx[4] ? 'listbox' : 'menu')) { + attr(div1, "role", div1_role_value); + } + + if (dirty[0] & /*currentEmojisWithCategories*/ 32768 && div1_aria_labelledby_value !== (div1_aria_labelledby_value = "menu-label-" + /*i*/ ctx[66])) { + attr(div1, "aria-labelledby", div1_aria_labelledby_value); + } + + if (dirty[0] & /*searchMode*/ 16 && div1_id_value !== (div1_id_value = /*searchMode*/ ctx[4] ? 'search-results' : '')) { + attr(div1, "id", div1_id_value); + } + }, + d(detaching) { + if (detaching) detach(div0); + if (detaching) detach(div1); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].d(); + } + } + }; +} + +// (103:94) {:else} +function create_else_block(ctx) { + let img; + let img_src_value; + + return { + c() { + img = element("img"); + attr(img, "class", "custom-emoji"); + if (!src_url_equal(img.src, img_src_value = /*emoji*/ ctx[64].url)) attr(img, "src", img_src_value); + attr(img, "alt", ""); + attr(img, "loading", "lazy"); + }, + m(target, anchor) { + insert(target, img, anchor); + }, + p(ctx, dirty) { + if (dirty[0] & /*currentFavorites*/ 1024 && !src_url_equal(img.src, img_src_value = /*emoji*/ ctx[64].url)) { + attr(img, "src", img_src_value); + } + }, + d(detaching) { + if (detaching) detach(img); + } + }; +} + +// (103:34) {#if emoji.unicode} +function create_if_block(ctx) { + let t_value = /*unicodeWithSkin*/ ctx[27](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]) + ""; + let t; + + return { + c() { + t = text(t_value); + }, + m(target, anchor) { + insert(target, t, anchor); + }, + p(ctx, dirty) { + if (dirty[0] & /*currentFavorites, currentSkinTone*/ 1280 && t_value !== (t_value = /*unicodeWithSkin*/ ctx[27](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]) + "")) set_data(t, t_value); + }, + d(detaching) { + if (detaching) detach(t); + } + }; +} + +// (99:102) {#each currentFavorites as emoji, i (emoji.id)} +function create_each_block(key_1, ctx) { + let button; + let button_aria_label_value; + let button_title_value; + let button_id_value; + + function select_block_type_1(ctx, dirty) { + if (/*emoji*/ ctx[64].unicode) return create_if_block; + return create_else_block; + } + + let current_block_type = select_block_type_1(ctx); + let if_block = current_block_type(ctx); + + return { + key: key_1, + first: null, + c() { + button = element("button"); + if_block.c(); + attr(button, "role", "menuitem"); + attr(button, "aria-label", button_aria_label_value = /*labelWithSkin*/ ctx[28](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8])); + attr(button, "title", button_title_value = /*emoji*/ ctx[64].title); + attr(button, "class", "emoji"); + attr(button, "id", button_id_value = "fav-" + /*emoji*/ ctx[64].id); + this.first = button; + }, + m(target, anchor) { + insert(target, button, anchor); + if_block.m(button, null); + }, + p(new_ctx, dirty) { + ctx = new_ctx; + + if (current_block_type === (current_block_type = select_block_type_1(ctx)) && if_block) { + if_block.p(ctx, dirty); + } else { + if_block.d(1); + if_block = current_block_type(ctx); + + if (if_block) { + if_block.c(); + if_block.m(button, null); + } + } + + if (dirty[0] & /*currentFavorites, currentSkinTone*/ 1280 && button_aria_label_value !== (button_aria_label_value = /*labelWithSkin*/ ctx[28](/*emoji*/ ctx[64], /*currentSkinTone*/ ctx[8]))) { + attr(button, "aria-label", button_aria_label_value); + } + + if (dirty[0] & /*currentFavorites*/ 1024 && button_title_value !== (button_title_value = /*emoji*/ ctx[64].title)) { + attr(button, "title", button_title_value); + } + + if (dirty[0] & /*currentFavorites*/ 1024 && button_id_value !== (button_id_value = "fav-" + /*emoji*/ ctx[64].id)) { + attr(button, "id", button_id_value); + } + }, + d(detaching) { + if (detaching) detach(button); + if_block.d(); + } + }; +} + +function create_fragment(ctx) { + let section; + let div0; + let div4; + let div1; + let input; + let input_placeholder_value; + let input_aria_expanded_value; + let input_aria_activedescendant_value; + let label; + let t0_value = /*i18n*/ ctx[0].searchLabel + ""; + let t0; + let span0; + let t1_value = /*i18n*/ ctx[0].searchDescription + ""; + let t1; + let div2; + let button0; + let t2; + let button0_class_value; + let div2_class_value; + let span1; + let t3_value = /*i18n*/ ctx[0].skinToneDescription + ""; + let t3; + let div3; + let each_blocks_3 = []; + let each0_lookup = new Map_1(); + let div3_class_value; + let div3_aria_label_value; + let div3_aria_activedescendant_value; + let div3_aria_hidden_value; + let div5; + let each_blocks_2 = []; + let each1_lookup = new Map_1(); + let div5_aria_label_value; + let div7; + let div6; + let div8; + let t4; + let div8_class_value; + let div10; + let div9; + let each_blocks_1 = []; + let each2_lookup = new Map_1(); + let div10_class_value; + let div10_role_value; + let div10_aria_label_value; + let div10_id_value; + let div11; + let each_blocks = []; + let each3_lookup = new Map_1(); + let div11_class_value; + let div11_aria_label_value; + let button1; + let section_aria_label_value; + let mounted; + let dispose; + let each_value_4 = /*skinTones*/ ctx[9]; + const get_key = ctx => /*skinTone*/ ctx[73]; + + for (let i = 0; i < each_value_4.length; i += 1) { + let child_ctx = get_each_context_4(ctx, each_value_4, i); + let key = get_key(child_ctx); + each0_lookup.set(key, each_blocks_3[i] = create_each_block_4(key, child_ctx)); + } + + let each_value_3 = /*groups*/ ctx[12]; + const get_key_1 = ctx => /*group*/ ctx[70].id; + + for (let i = 0; i < each_value_3.length; i += 1) { + let child_ctx = get_each_context_3(ctx, each_value_3, i); + let key = get_key_1(child_ctx); + each1_lookup.set(key, each_blocks_2[i] = create_each_block_3(key, child_ctx)); + } + + let each_value_1 = /*currentEmojisWithCategories*/ ctx[15]; + const get_key_2 = ctx => /*emojiWithCategory*/ ctx[67].category; + + for (let i = 0; i < each_value_1.length; i += 1) { + let child_ctx = get_each_context_1(ctx, each_value_1, i); + let key = get_key_2(child_ctx); + each2_lookup.set(key, each_blocks_1[i] = create_each_block_1(key, child_ctx)); + } + + let each_value = /*currentFavorites*/ ctx[10]; + const get_key_3 = ctx => /*emoji*/ ctx[64].id; + + for (let i = 0; i < each_value.length; i += 1) { + let child_ctx = get_each_context(ctx, each_value, i); + let key = get_key_3(child_ctx); + each3_lookup.set(key, each_blocks[i] = create_each_block(key, child_ctx)); + } + + return { + c() { + section = element("section"); + div0 = element("div"); + div4 = element("div"); + div1 = element("div"); + input = element("input"); + label = element("label"); + t0 = text(t0_value); + span0 = element("span"); + t1 = text(t1_value); + div2 = element("div"); + button0 = element("button"); + t2 = text(/*skinToneButtonText*/ ctx[21]); + span1 = element("span"); + t3 = text(t3_value); + div3 = element("div"); + + for (let i = 0; i < each_blocks_3.length; i += 1) { + each_blocks_3[i].c(); + } + + div5 = element("div"); + + for (let i = 0; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].c(); + } + + div7 = element("div"); + div6 = element("div"); + div8 = element("div"); + t4 = text(/*message*/ ctx[18]); + div10 = element("div"); + div9 = element("div"); + + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].c(); + } + + div11 = element("div"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + button1 = element("button"); + button1.textContent = "๐"; + attr(div0, "class", "pad-top"); + attr(input, "id", "search"); + attr(input, "class", "search"); + attr(input, "type", "search"); + attr(input, "role", "combobox"); + attr(input, "enterkeyhint", "search"); + attr(input, "placeholder", input_placeholder_value = /*i18n*/ ctx[0].searchLabel); + attr(input, "autocapitalize", "none"); + attr(input, "autocomplete", "off"); + attr(input, "spellcheck", "true"); + attr(input, "aria-expanded", input_aria_expanded_value = !!(/*searchMode*/ ctx[4] && /*currentEmojis*/ ctx[1].length)); + attr(input, "aria-controls", "search-results"); + attr(input, "aria-describedby", "search-description"); + attr(input, "aria-autocomplete", "list"); + + attr(input, "aria-activedescendant", input_aria_activedescendant_value = /*activeSearchItemId*/ ctx[26] + ? `emo-${/*activeSearchItemId*/ ctx[26]}` + : ''); + + attr(label, "class", "sr-only"); + attr(label, "for", "search"); + attr(span0, "id", "search-description"); + attr(span0, "class", "sr-only"); + attr(div1, "class", "search-wrapper"); + attr(button0, "id", "skintone-button"); + attr(button0, "class", button0_class_value = "emoji " + (/*skinTonePickerExpanded*/ ctx[6] ? 'hide-focus' : '')); + attr(button0, "aria-label", /*skinToneButtonLabel*/ ctx[23]); + attr(button0, "title", /*skinToneButtonLabel*/ ctx[23]); + attr(button0, "aria-describedby", "skintone-description"); + attr(button0, "aria-haspopup", "listbox"); + attr(button0, "aria-expanded", /*skinTonePickerExpanded*/ ctx[6]); + attr(button0, "aria-controls", "skintone-list"); + + attr(div2, "class", div2_class_value = "skintone-button-wrapper " + (/*skinTonePickerExpandedAfterAnimation*/ ctx[19] + ? 'expanded' + : '')); + + attr(span1, "id", "skintone-description"); + attr(span1, "class", "sr-only"); + attr(div3, "id", "skintone-list"); + + attr(div3, "class", div3_class_value = "skintone-list " + (/*skinTonePickerExpanded*/ ctx[6] + ? '' + : 'hidden no-animate')); + + set_style(div3, "transform", "translateY(" + (/*skinTonePickerExpanded*/ ctx[6] + ? 0 + : 'calc(-1 * var(--num-skintones) * var(--total-emoji-size))') + ")"); + + attr(div3, "role", "listbox"); + attr(div3, "aria-label", div3_aria_label_value = /*i18n*/ ctx[0].skinTonesLabel); + attr(div3, "aria-activedescendant", div3_aria_activedescendant_value = "skintone-" + /*activeSkinTone*/ ctx[20]); + attr(div3, "aria-hidden", div3_aria_hidden_value = !/*skinTonePickerExpanded*/ ctx[6]); + attr(div4, "class", "search-row"); + attr(div5, "class", "nav"); + attr(div5, "role", "tablist"); + set_style(div5, "grid-template-columns", "repeat(" + /*groups*/ ctx[12].length + ", 1fr)"); + attr(div5, "aria-label", div5_aria_label_value = /*i18n*/ ctx[0].categoriesLabel); + attr(div6, "class", "indicator"); + set_style(div6, "transform", "translateX(" + (/*isRtl*/ ctx[24] ? -1 : 1) * /*currentGroupIndex*/ ctx[11] * 100 + "%)"); + attr(div7, "class", "indicator-wrapper"); + attr(div8, "class", div8_class_value = "message " + (/*message*/ ctx[18] ? '' : 'gone')); + attr(div8, "role", "alert"); + attr(div8, "aria-live", "polite"); + + attr(div10, "class", div10_class_value = "tabpanel " + (!/*databaseLoaded*/ ctx[14] || /*message*/ ctx[18] + ? 'gone' + : '')); + + attr(div10, "role", div10_role_value = /*searchMode*/ ctx[4] ? 'region' : 'tabpanel'); + + attr(div10, "aria-label", div10_aria_label_value = /*searchMode*/ ctx[4] + ? /*i18n*/ ctx[0].searchResultsLabel + : /*i18n*/ ctx[0].categories[/*currentGroup*/ ctx[13].name]); + + attr(div10, "id", div10_id_value = /*searchMode*/ ctx[4] + ? '' + : `tab-${/*currentGroup*/ ctx[13].id}`); + + attr(div10, "tabindex", "0"); + attr(div11, "class", div11_class_value = "favorites emoji-menu " + (/*message*/ ctx[18] ? 'gone' : '')); + attr(div11, "role", "menu"); + attr(div11, "aria-label", div11_aria_label_value = /*i18n*/ ctx[0].favoritesLabel); + set_style(div11, "padding-inline-end", /*scrollbarWidth*/ ctx[25] + "px"); + attr(button1, "aria-hidden", "true"); + attr(button1, "tabindex", "-1"); + attr(button1, "class", "abs-pos hidden emoji"); + attr(section, "class", "picker"); + attr(section, "aria-label", section_aria_label_value = /*i18n*/ ctx[0].regionLabel); + attr(section, "style", /*pickerStyle*/ ctx[22]); + }, + m(target, anchor) { + insert(target, section, anchor); + append(section, div0); + append(section, div4); + append(div4, div1); + append(div1, input); + set_input_value(input, /*rawSearchText*/ ctx[2]); + append(div1, label); + append(label, t0); + append(div1, span0); + append(span0, t1); + append(div4, div2); + append(div2, button0); + append(button0, t2); + append(div4, span1); + append(span1, t3); + append(div4, div3); + + for (let i = 0; i < each_blocks_3.length; i += 1) { + each_blocks_3[i].m(div3, null); + } + + /*div3_binding*/ ctx[49](div3); + append(section, div5); + + for (let i = 0; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].m(div5, null); + } + + append(section, div7); + append(div7, div6); + append(section, div8); + append(div8, t4); + append(section, div10); + append(div10, div9); + + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].m(div9, null); + } + + /*div10_binding*/ ctx[51](div10); + append(section, div11); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div11, null); + } + + append(section, button1); + /*button1_binding*/ ctx[52](button1); + /*section_binding*/ ctx[53](section); + + if (!mounted) { + dispose = [ + listen(input, "input", /*input_input_handler*/ ctx[48]), + listen(input, "keydown", /*onSearchKeydown*/ ctx[30]), + listen(button0, "click", /*onClickSkinToneButton*/ ctx[35]), + listen(div3, "focusout", /*onSkinToneOptionsFocusOut*/ ctx[38]), + listen(div3, "click", /*onSkinToneOptionsClick*/ ctx[34]), + listen(div3, "keydown", /*onSkinToneOptionsKeydown*/ ctx[36]), + listen(div3, "keyup", /*onSkinToneOptionsKeyup*/ ctx[37]), + listen(div5, "keydown", /*onNavKeydown*/ ctx[32]), + action_destroyer(/*calculateEmojiGridStyle*/ ctx[29].call(null, div9)), + listen(div10, "click", /*onEmojiClick*/ ctx[33]), + listen(div11, "click", /*onEmojiClick*/ ctx[33]) + ]; + + mounted = true; + } + }, + p(ctx, dirty) { + if (dirty[0] & /*i18n*/ 1 && input_placeholder_value !== (input_placeholder_value = /*i18n*/ ctx[0].searchLabel)) { + attr(input, "placeholder", input_placeholder_value); + } + + if (dirty[0] & /*searchMode, currentEmojis*/ 18 && input_aria_expanded_value !== (input_aria_expanded_value = !!(/*searchMode*/ ctx[4] && /*currentEmojis*/ ctx[1].length))) { + attr(input, "aria-expanded", input_aria_expanded_value); + } + + if (dirty[0] & /*activeSearchItemId*/ 67108864 && input_aria_activedescendant_value !== (input_aria_activedescendant_value = /*activeSearchItemId*/ ctx[26] + ? `emo-${/*activeSearchItemId*/ ctx[26]}` + : '')) { + attr(input, "aria-activedescendant", input_aria_activedescendant_value); + } + + if (dirty[0] & /*rawSearchText*/ 4) { + set_input_value(input, /*rawSearchText*/ ctx[2]); + } + + if (dirty[0] & /*i18n*/ 1 && t0_value !== (t0_value = /*i18n*/ ctx[0].searchLabel + "")) set_data(t0, t0_value); + if (dirty[0] & /*i18n*/ 1 && t1_value !== (t1_value = /*i18n*/ ctx[0].searchDescription + "")) set_data(t1, t1_value); + if (dirty[0] & /*skinToneButtonText*/ 2097152) set_data(t2, /*skinToneButtonText*/ ctx[21]); + + if (dirty[0] & /*skinTonePickerExpanded*/ 64 && button0_class_value !== (button0_class_value = "emoji " + (/*skinTonePickerExpanded*/ ctx[6] ? 'hide-focus' : ''))) { + attr(button0, "class", button0_class_value); + } + + if (dirty[0] & /*skinToneButtonLabel*/ 8388608) { + attr(button0, "aria-label", /*skinToneButtonLabel*/ ctx[23]); + } + + if (dirty[0] & /*skinToneButtonLabel*/ 8388608) { + attr(button0, "title", /*skinToneButtonLabel*/ ctx[23]); + } + + if (dirty[0] & /*skinTonePickerExpanded*/ 64) { + attr(button0, "aria-expanded", /*skinTonePickerExpanded*/ ctx[6]); + } + + if (dirty[0] & /*skinTonePickerExpandedAfterAnimation*/ 524288 && div2_class_value !== (div2_class_value = "skintone-button-wrapper " + (/*skinTonePickerExpandedAfterAnimation*/ ctx[19] + ? 'expanded' + : ''))) { + attr(div2, "class", div2_class_value); + } + + if (dirty[0] & /*i18n*/ 1 && t3_value !== (t3_value = /*i18n*/ ctx[0].skinToneDescription + "")) set_data(t3, t3_value); + + if (dirty[0] & /*skinTones, activeSkinTone, i18n*/ 1049089) { + each_value_4 = /*skinTones*/ ctx[9]; + each_blocks_3 = update_keyed_each(each_blocks_3, dirty, get_key, 1, ctx, each_value_4, each0_lookup, div3, destroy_block, create_each_block_4, null, get_each_context_4); + } + + if (dirty[0] & /*skinTonePickerExpanded*/ 64 && div3_class_value !== (div3_class_value = "skintone-list " + (/*skinTonePickerExpanded*/ ctx[6] + ? '' + : 'hidden no-animate'))) { + attr(div3, "class", div3_class_value); + } + + if (dirty[0] & /*skinTonePickerExpanded*/ 64) { + set_style(div3, "transform", "translateY(" + (/*skinTonePickerExpanded*/ ctx[6] + ? 0 + : 'calc(-1 * var(--num-skintones) * var(--total-emoji-size))') + ")"); + } + + if (dirty[0] & /*i18n*/ 1 && div3_aria_label_value !== (div3_aria_label_value = /*i18n*/ ctx[0].skinTonesLabel)) { + attr(div3, "aria-label", div3_aria_label_value); + } + + if (dirty[0] & /*activeSkinTone*/ 1048576 && div3_aria_activedescendant_value !== (div3_aria_activedescendant_value = "skintone-" + /*activeSkinTone*/ ctx[20])) { + attr(div3, "aria-activedescendant", div3_aria_activedescendant_value); + } + + if (dirty[0] & /*skinTonePickerExpanded*/ 64 && div3_aria_hidden_value !== (div3_aria_hidden_value = !/*skinTonePickerExpanded*/ ctx[6])) { + attr(div3, "aria-hidden", div3_aria_hidden_value); + } + + if (dirty[0] & /*groups, i18n, searchMode, currentGroup*/ 12305 | dirty[1] & /*onNavClick*/ 1) { + each_value_3 = /*groups*/ ctx[12]; + each_blocks_2 = update_keyed_each(each_blocks_2, dirty, get_key_1, 1, ctx, each_value_3, each1_lookup, div5, destroy_block, create_each_block_3, null, get_each_context_3); + } + + if (dirty[0] & /*groups*/ 4096) { + set_style(div5, "grid-template-columns", "repeat(" + /*groups*/ ctx[12].length + ", 1fr)"); + } + + if (dirty[0] & /*i18n*/ 1 && div5_aria_label_value !== (div5_aria_label_value = /*i18n*/ ctx[0].categoriesLabel)) { + attr(div5, "aria-label", div5_aria_label_value); + } + + if (dirty[0] & /*isRtl, currentGroupIndex*/ 16779264) { + set_style(div6, "transform", "translateX(" + (/*isRtl*/ ctx[24] ? -1 : 1) * /*currentGroupIndex*/ ctx[11] * 100 + "%)"); + } + + if (dirty[0] & /*message*/ 262144) set_data(t4, /*message*/ ctx[18]); + + if (dirty[0] & /*message*/ 262144 && div8_class_value !== (div8_class_value = "message " + (/*message*/ ctx[18] ? '' : 'gone'))) { + attr(div8, "class", div8_class_value); + } + + if (dirty[0] & /*searchMode, currentEmojisWithCategories, activeSearchItem, labelWithSkin, currentSkinTone, unicodeWithSkin, i18n, currentGroup*/ 402694449) { + each_value_1 = /*currentEmojisWithCategories*/ ctx[15]; + each_blocks_1 = update_keyed_each(each_blocks_1, dirty, get_key_2, 1, ctx, each_value_1, each2_lookup, div9, destroy_block, create_each_block_1, null, get_each_context_1); + } + + if (dirty[0] & /*databaseLoaded, message*/ 278528 && div10_class_value !== (div10_class_value = "tabpanel " + (!/*databaseLoaded*/ ctx[14] || /*message*/ ctx[18] + ? 'gone' + : ''))) { + attr(div10, "class", div10_class_value); + } + + if (dirty[0] & /*searchMode*/ 16 && div10_role_value !== (div10_role_value = /*searchMode*/ ctx[4] ? 'region' : 'tabpanel')) { + attr(div10, "role", div10_role_value); + } + + if (dirty[0] & /*searchMode, i18n, currentGroup*/ 8209 && div10_aria_label_value !== (div10_aria_label_value = /*searchMode*/ ctx[4] + ? /*i18n*/ ctx[0].searchResultsLabel + : /*i18n*/ ctx[0].categories[/*currentGroup*/ ctx[13].name])) { + attr(div10, "aria-label", div10_aria_label_value); + } + + if (dirty[0] & /*searchMode, currentGroup*/ 8208 && div10_id_value !== (div10_id_value = /*searchMode*/ ctx[4] + ? '' + : `tab-${/*currentGroup*/ ctx[13].id}`)) { + attr(div10, "id", div10_id_value); + } + + if (dirty[0] & /*labelWithSkin, currentFavorites, currentSkinTone, unicodeWithSkin*/ 402654464) { + each_value = /*currentFavorites*/ ctx[10]; + each_blocks = update_keyed_each(each_blocks, dirty, get_key_3, 1, ctx, each_value, each3_lookup, div11, destroy_block, create_each_block, null, get_each_context); + } + + if (dirty[0] & /*message*/ 262144 && div11_class_value !== (div11_class_value = "favorites emoji-menu " + (/*message*/ ctx[18] ? 'gone' : ''))) { + attr(div11, "class", div11_class_value); + } + + if (dirty[0] & /*i18n*/ 1 && div11_aria_label_value !== (div11_aria_label_value = /*i18n*/ ctx[0].favoritesLabel)) { + attr(div11, "aria-label", div11_aria_label_value); + } + + if (dirty[0] & /*scrollbarWidth*/ 33554432) { + set_style(div11, "padding-inline-end", /*scrollbarWidth*/ ctx[25] + "px"); + } + + if (dirty[0] & /*i18n*/ 1 && section_aria_label_value !== (section_aria_label_value = /*i18n*/ ctx[0].regionLabel)) { + attr(section, "aria-label", section_aria_label_value); + } + + if (dirty[0] & /*pickerStyle*/ 4194304) { + attr(section, "style", /*pickerStyle*/ ctx[22]); + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) detach(section); + + for (let i = 0; i < each_blocks_3.length; i += 1) { + each_blocks_3[i].d(); + } + + /*div3_binding*/ ctx[49](null); + + for (let i = 0; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].d(); + } + + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].d(); + } + + /*div10_binding*/ ctx[51](null); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].d(); + } + + /*button1_binding*/ ctx[52](null); + /*section_binding*/ ctx[53](null); + mounted = false; + run_all(dispose); + } + }; +} + +function instance($$self, $$props, $$invalidate) { + let { skinToneEmoji } = $$props; + let { i18n } = $$props; + let { database } = $$props; + let { customEmoji } = $$props; + let { customCategorySorting } = $$props; + let { emojiVersion } = $$props; + + // private + let initialLoad = true; + + let currentEmojis = []; + let currentEmojisWithCategories = []; // eslint-disable-line no-unused-vars + let rawSearchText = ''; + let searchText = ''; + let rootElement; + let baselineEmoji; + let tabpanelElement; + let searchMode = false; // eslint-disable-line no-unused-vars + let activeSearchItem = -1; + let message; // eslint-disable-line no-unused-vars + let skinTonePickerExpanded = false; + let skinTonePickerExpandedAfterAnimation = false; // eslint-disable-line no-unused-vars + let skinToneDropdown; + let currentSkinTone = 0; + let activeSkinTone = 0; + let skinToneButtonText; // eslint-disable-line no-unused-vars + let pickerStyle; // eslint-disable-line no-unused-vars + let skinToneButtonLabel = ''; // eslint-disable-line no-unused-vars + let skinTones = []; + let currentFavorites = []; // eslint-disable-line no-unused-vars + let defaultFavoriteEmojis; + let numColumns = DEFAULT_NUM_COLUMNS; + let isRtl = false; // eslint-disable-line no-unused-vars + let scrollbarWidth = 0; // eslint-disable-line no-unused-vars + let currentGroupIndex = 0; + let groups$1 = groups; + let currentGroup; + let databaseLoaded = false; // eslint-disable-line no-unused-vars + let activeSearchItemId; // eslint-disable-line no-unused-vars + + // + // Utils/helpers + // + const focus = id => { + rootElement.getRootNode().getElementById(id).focus(); + }; + + // fire a custom event that crosses the shadow boundary + const fireEvent = (name, detail) => { + rootElement.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true })); + }; + + // eslint-disable-next-line no-unused-vars + const unicodeWithSkin = (emoji, currentSkinTone) => currentSkinTone && emoji.skins && emoji.skins[currentSkinTone] || emoji.unicode; + + // eslint-disable-next-line no-unused-vars + const labelWithSkin = (emoji, currentSkinTone) => uniq([ + emoji.name || unicodeWithSkin(emoji, currentSkinTone), + ...emoji.shortcodes || [] + ]).join(', '); + + // Detect a skintone option button + const isSkinToneOption = element => (/^skintone-/).test(element.id); + + // + // Determine the emoji support level (in requestIdleCallback) + // + onMount(() => { + if (!emojiVersion) { + detectEmojiSupportLevel().then(level => { + // Can't actually test emoji support in Jest/JSDom, emoji never render in color in Cairo + /* istanbul ignore next */ + if (!level) { + $$invalidate(18, message = i18n.emojiUnsupportedMessage); + } + }); + } + }); + + // + // Calculate the width of the emoji grid. This serves two purposes: + // 1) Re-calculate the --num-columns var because it may have changed + // 2) Re-calculate the scrollbar width because it may have changed + // (i.e. because the number of items changed) + // 3) Re-calculate whether we're in RTL mode or not. + // + // The benefit of doing this in one place is to align with rAF/ResizeObserver + // and do all the calculations in one go. RTL vs LTR is not strictly width-related, + // but since we're already reading the style here, and since it's already aligned with + // the rAF loop, this is the most appropriate place to do it perf-wise. + // + // eslint-disable-next-line no-unused-vars + function calculateEmojiGridStyle(node) { + return calculateWidth(node, width => { + /* istanbul ignore next */ + if ("production" !== 'test') { + // jsdom throws errors for this kind of fancy stuff + // read all the style/layout calculations we need to make + const style = getComputedStyle(rootElement); + + const newNumColumns = parseInt(style.getPropertyValue('--num-columns'), 10); + const newIsRtl = style.getPropertyValue('direction') === 'rtl'; + const parentWidth = node.parentElement.getBoundingClientRect().width; + const newScrollbarWidth = parentWidth - width; + + // write to Svelte variables + $$invalidate(47, numColumns = newNumColumns); + + $$invalidate(25, scrollbarWidth = newScrollbarWidth); // eslint-disable-line no-unused-vars + $$invalidate(24, isRtl = newIsRtl); // eslint-disable-line no-unused-vars + } + }); + } + + function checkZwjSupportAndUpdate(zwjEmojisToCheck) { + const rootNode = rootElement.getRootNode(); + const emojiToDomNode = emoji => rootNode.getElementById(`emo-${emoji.id}`); + checkZwjSupport(zwjEmojisToCheck, baselineEmoji, emojiToDomNode); + + // force update + $$invalidate(1, currentEmojis = currentEmojis); // eslint-disable-line no-self-assign + } + + function isZwjSupported(emoji) { + return !emoji.unicode || !hasZwj(emoji) || supportedZwjEmojis.get(emoji.unicode); + } + + async function filterEmojisByVersion(emojis) { + const emojiSupportLevel = emojiVersion || await detectEmojiSupportLevel(); + + // !version corresponds to custom emoji + return emojis.filter(({ version }) => !version || version <= emojiSupportLevel); + } + + async function summarizeEmojis(emojis) { + return summarizeEmojisForUI(emojis, emojiVersion || await detectEmojiSupportLevel()); + } + + async function getEmojisByGroup(group) { + + // -1 is custom emoji + const emoji = group === -1 + ? customEmoji + : await database.getEmojiByGroup(group); + + return summarizeEmojis(await filterEmojisByVersion(emoji)); + } + + async function getEmojisBySearchQuery(query) { + return summarizeEmojis(await filterEmojisByVersion(await database.getEmojiBySearchQuery(query))); + } + + // eslint-disable-next-line no-unused-vars + function onSearchKeydown(event) { + if (!searchMode || !currentEmojis.length) { + return; + } + + const goToNextOrPrevious = previous => { + halt(event); + $$invalidate(5, activeSearchItem = incrementOrDecrement(previous, activeSearchItem, currentEmojis)); + }; + + switch (event.key) { + case 'ArrowDown': + return goToNextOrPrevious(false); + case 'ArrowUp': + return goToNextOrPrevious(true); + case 'Enter': + if (activeSearchItem !== -1) { + halt(event); + return clickEmoji(currentEmojis[activeSearchItem].id); + } else if (currentEmojis.length) { + $$invalidate(5, activeSearchItem = 0); + } + } + } + + // + // Handle user input on nav + // + // eslint-disable-next-line no-unused-vars + function onNavClick(group) { + $$invalidate(2, rawSearchText = ''); + $$invalidate(45, searchText = ''); + $$invalidate(5, activeSearchItem = -1); + $$invalidate(11, currentGroupIndex = groups$1.findIndex(_ => _.id === group.id)); + } + + // eslint-disable-next-line no-unused-vars + function onNavKeydown(event) { + const { target, key } = event; + + const doFocus = el => { + if (el) { + halt(event); + el.focus(); + } + }; + + switch (key) { + case 'ArrowLeft': + return doFocus(target.previousSibling); + case 'ArrowRight': + return doFocus(target.nextSibling); + case 'Home': + return doFocus(target.parentElement.firstChild); + case 'End': + return doFocus(target.parentElement.lastChild); + } + } + + // + // Handle user input on an emoji + // + async function clickEmoji(unicodeOrName) { + const emoji = await database.getEmojiByUnicodeOrName(unicodeOrName); + const emojiSummary = [...currentEmojis, ...currentFavorites].find(_ => _.id === unicodeOrName); + const skinTonedUnicode = emojiSummary.unicode && unicodeWithSkin(emojiSummary, currentSkinTone); + await database.incrementFavoriteEmojiCount(unicodeOrName); + + fireEvent('emoji-click', { + emoji, + skinTone: currentSkinTone, + ...skinTonedUnicode && { unicode: skinTonedUnicode }, + ...emojiSummary.name && { name: emojiSummary.name } + }); + } + + // eslint-disable-next-line no-unused-vars + async function onEmojiClick(event) { + const { target } = event; + + if (!target.classList.contains('emoji')) { + return; + } + + halt(event); + const id = target.id.substring(4); // replace 'emo-' or 'fav-' prefix + + /* no await */ + clickEmoji(id); + } + + // + // Handle user input on the skintone picker + // + // eslint-disable-next-line no-unused-vars + async function onSkinToneOptionsClick(event) { + const { target } = event; + + if (!isSkinToneOption(target)) { + return; + } + + halt(event); + const skinTone = parseInt(target.id.slice(9), 10); // remove 'skintone-' prefix + $$invalidate(8, currentSkinTone = skinTone); + $$invalidate(6, skinTonePickerExpanded = false); + focus('skintone-button'); + fireEvent('skin-tone-change', { skinTone }); + + /* no await */ + database.setPreferredSkinTone(skinTone); + } + + // eslint-disable-next-line no-unused-vars + async function onClickSkinToneButton(event) { + $$invalidate(6, skinTonePickerExpanded = !skinTonePickerExpanded); + $$invalidate(20, activeSkinTone = currentSkinTone); + + if (skinTonePickerExpanded) { + halt(event); + rAF(() => focus(`skintone-${activeSkinTone}`)); + } + } + + // eslint-disable-next-line no-unused-vars + function onSkinToneOptionsKeydown(event) { + if (!skinTonePickerExpanded) { + return; + } + + const changeActiveSkinTone = async nextSkinTone => { + halt(event); + $$invalidate(20, activeSkinTone = nextSkinTone); + await tick(); + focus(`skintone-${activeSkinTone}`); + }; + + switch (event.key) { + case 'ArrowUp': + return changeActiveSkinTone(incrementOrDecrement(true, activeSkinTone, skinTones)); + case 'ArrowDown': + return changeActiveSkinTone(incrementOrDecrement(false, activeSkinTone, skinTones)); + case 'Home': + return changeActiveSkinTone(0); + case 'End': + return changeActiveSkinTone(skinTones.length - 1); + case 'Enter': + // enter on keydown, space on keyup. this is just how browsers work for buttons + // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html + return onSkinToneOptionsClick(event); + case 'Escape': + halt(event); + $$invalidate(6, skinTonePickerExpanded = false); + return focus('skintone-button'); + } + } + + // eslint-disable-next-line no-unused-vars + function onSkinToneOptionsKeyup(event) { + if (!skinTonePickerExpanded) { + return; + } + + switch (event.key) { + case ' ': + // enter on keydown, space on keyup. this is just how browsers work for buttons + // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html + return onSkinToneOptionsClick(event); + } + } + + // eslint-disable-next-line no-unused-vars + async function onSkinToneOptionsFocusOut(event) { + // On blur outside of the skintone options, collapse the skintone picker. + // Except if focus is just moving to another skintone option, e.g. pressing up/down to change focus + const { relatedTarget } = event; + + if (!relatedTarget || !isSkinToneOption(relatedTarget)) { + $$invalidate(6, skinTonePickerExpanded = false); + } + } + + function input_input_handler() { + rawSearchText = this.value; + $$invalidate(2, rawSearchText); + } + + function div3_binding($$value) { + binding_callbacks[$$value ? 'unshift' : 'push'](() => { + skinToneDropdown = $$value; + $$invalidate(7, skinToneDropdown); + }); + } + + const click_handler = group => onNavClick(group); + + function div10_binding($$value) { + binding_callbacks[$$value ? 'unshift' : 'push'](() => { + tabpanelElement = $$value; + $$invalidate(3, tabpanelElement); + }); + } + + function button1_binding($$value) { + binding_callbacks[$$value ? 'unshift' : 'push'](() => { + baselineEmoji = $$value; + $$invalidate(17, baselineEmoji); + }); + } + + function section_binding($$value) { + binding_callbacks[$$value ? 'unshift' : 'push'](() => { + rootElement = $$value; + $$invalidate(16, rootElement); + }); + } + + $$self.$$set = $$props => { + if ('skinToneEmoji' in $$props) $$invalidate(40, skinToneEmoji = $$props.skinToneEmoji); + if ('i18n' in $$props) $$invalidate(0, i18n = $$props.i18n); + if ('database' in $$props) $$invalidate(39, database = $$props.database); + if ('customEmoji' in $$props) $$invalidate(41, customEmoji = $$props.customEmoji); + if ('customCategorySorting' in $$props) $$invalidate(42, customCategorySorting = $$props.customCategorySorting); + if ('emojiVersion' in $$props) $$invalidate(43, emojiVersion = $$props.emojiVersion); + }; + + $$self.$$.update = () => { + if ($$self.$$.dirty[1] & /*customEmoji, database*/ 1280) { + /* eslint-enable no-unused-vars */ + // + // Set or update the customEmoji + // + { + if (customEmoji && database) { + $$invalidate(39, database.customEmoji = customEmoji, database); + } + } + } + + if ($$self.$$.dirty[0] & /*i18n*/ 1 | $$self.$$.dirty[1] & /*database*/ 256) { + // + // Set or update the database object + // + { + // show a Loading message if it takes a long time, or show an error if there's a network/IDB error + async function handleDatabaseLoading() { + let showingLoadingMessage = false; + + const timeoutHandle = setTimeout( + () => { + showingLoadingMessage = true; + $$invalidate(18, message = i18n.loadingMessage); + }, + TIMEOUT_BEFORE_LOADING_MESSAGE + ); + + try { + await database.ready(); + $$invalidate(14, databaseLoaded = true); // eslint-disable-line no-unused-vars + } catch(err) { + console.error(err); + $$invalidate(18, message = i18n.networkErrorMessage); + } finally { + clearTimeout(timeoutHandle); + + if (showingLoadingMessage) { + // Seems safer than checking the i18n string, which may change + showingLoadingMessage = false; + + $$invalidate(18, message = ''); // eslint-disable-line no-unused-vars + } + } + } + + if (database) { + /* no await */ + handleDatabaseLoading(); + } + } + } + + if ($$self.$$.dirty[0] & /*groups, currentGroupIndex*/ 6144 | $$self.$$.dirty[1] & /*customEmoji*/ 1024) { + { + if (customEmoji && customEmoji.length) { + $$invalidate(12, groups$1 = [customGroup, ...groups]); + } else if (groups$1 !== groups) { + if (currentGroupIndex) { + // If the current group is anything other than "custom" (which is first), decrement. + // This fixes the odd case where you set customEmoji, then pick a category, then unset customEmoji + $$invalidate(11, currentGroupIndex--, currentGroupIndex); + } + + $$invalidate(12, groups$1 = groups); + } + } + } + + if ($$self.$$.dirty[0] & /*rawSearchText*/ 4) { + /* eslint-enable no-unused-vars */ + // + // Handle user input on the search input + // + { + rIC(() => { + $$invalidate(45, searchText = (rawSearchText || '').trim()); // defer to avoid input delays, plus we can trim here + $$invalidate(5, activeSearchItem = -1); + }); + } + } + + if ($$self.$$.dirty[0] & /*groups, currentGroupIndex*/ 6144) { + // + // Update the current group based on the currentGroupIndex + // + $$invalidate(13, currentGroup = groups$1[currentGroupIndex]); + } + + if ($$self.$$.dirty[0] & /*databaseLoaded, currentGroup*/ 24576 | $$self.$$.dirty[1] & /*searchText*/ 16384) { + // + // Set or update the currentEmojis. Check for invalid ZWJ renderings + // (i.e. double emoji). + // + { + async function updateEmojis() { + + if (!databaseLoaded) { + $$invalidate(1, currentEmojis = []); + $$invalidate(4, searchMode = false); + } else if (searchText.length >= MIN_SEARCH_TEXT_LENGTH) { + const currentSearchText = searchText; + const newEmojis = await getEmojisBySearchQuery(currentSearchText); + + if (currentSearchText === searchText) { + // if the situation changes asynchronously, do not update + $$invalidate(1, currentEmojis = newEmojis); + + $$invalidate(4, searchMode = true); + } + } else if (currentGroup) { + const currentGroupId = currentGroup.id; + const newEmojis = await getEmojisByGroup(currentGroupId); + + if (currentGroupId === currentGroup.id) { + // if the situation changes asynchronously, do not update + $$invalidate(1, currentEmojis = newEmojis); + + $$invalidate(4, searchMode = false); + } + } + } + + /* no await */ + updateEmojis(); + } + } + + if ($$self.$$.dirty[0] & /*groups, searchMode*/ 4112) { + // + // Global styles for the entire picker + // + /* eslint-disable no-unused-vars */ + $$invalidate(22, pickerStyle = ` + --num-groups: ${groups$1.length}; + --indicator-opacity: ${searchMode ? 0 : 1}; + --num-skintones: ${NUM_SKIN_TONES};`); + } + + if ($$self.$$.dirty[0] & /*databaseLoaded*/ 16384 | $$self.$$.dirty[1] & /*database*/ 256) { + // + // Set or update the preferred skin tone + // + { + async function updatePreferredSkinTone() { + if (databaseLoaded) { + $$invalidate(8, currentSkinTone = await database.getPreferredSkinTone()); + } + } + + /* no await */ + updatePreferredSkinTone(); + } + } + + if ($$self.$$.dirty[1] & /*skinToneEmoji*/ 512) { + $$invalidate(9, skinTones = Array(NUM_SKIN_TONES).fill().map((_, i) => applySkinTone(skinToneEmoji, i))); + } + + if ($$self.$$.dirty[0] & /*skinTones, currentSkinTone*/ 768) { + /* eslint-disable no-unused-vars */ + $$invalidate(21, skinToneButtonText = skinTones[currentSkinTone]); + } + + if ($$self.$$.dirty[0] & /*i18n, currentSkinTone*/ 257) { + $$invalidate(23, skinToneButtonLabel = i18n.skinToneLabel.replace('{skinTone}', i18n.skinTones[currentSkinTone])); + } + + if ($$self.$$.dirty[0] & /*databaseLoaded*/ 16384 | $$self.$$.dirty[1] & /*database*/ 256) { + /* eslint-enable no-unused-vars */ + // + // Set or update the favorites emojis + // + { + async function updateDefaultFavoriteEmojis() { + $$invalidate(46, defaultFavoriteEmojis = (await Promise.all(MOST_COMMONLY_USED_EMOJI.map(unicode => database.getEmojiByUnicodeOrName(unicode)))).filter(Boolean)); // filter because in Jest tests we don't have all the emoji in the DB + } + + if (databaseLoaded) { + /* no await */ + updateDefaultFavoriteEmojis(); + } + } + } + + if ($$self.$$.dirty[0] & /*databaseLoaded*/ 16384 | $$self.$$.dirty[1] & /*database, numColumns, defaultFavoriteEmojis*/ 98560) { + { + async function updateFavorites() { + const dbFavorites = await database.getTopFavoriteEmoji(numColumns); + const favorites = await summarizeEmojis(uniqBy([...dbFavorites, ...defaultFavoriteEmojis], _ => _.unicode || _.name).slice(0, numColumns)); + $$invalidate(10, currentFavorites = favorites); + } + + if (databaseLoaded && defaultFavoriteEmojis) { + /* no await */ + updateFavorites(); + } + } + } + + if ($$self.$$.dirty[0] & /*currentEmojis, tabpanelElement*/ 10 | $$self.$$.dirty[1] & /*emojiVersion*/ 4096) { + // Some emojis have their ligatures rendered as two or more consecutive emojis + // We want to treat these the same as unsupported emojis, so we compare their + // widths against the baseline widths and remove them as necessary + { + const zwjEmojisToCheck = currentEmojis.filter(emoji => emoji.unicode).filter(emoji => hasZwj(emoji) && !supportedZwjEmojis.has(emoji.unicode)); // filter custom emoji + + if (!emojiVersion && zwjEmojisToCheck.length) { + // render now, check their length later + rAF(() => checkZwjSupportAndUpdate(zwjEmojisToCheck)); + } else { + $$invalidate(1, currentEmojis = emojiVersion + ? currentEmojis + : currentEmojis.filter(isZwjSupported)); + + // Reset scroll top to 0 when emojis change + rAF(() => resetScrollTopIfPossible(tabpanelElement)); + } + } + } + + if ($$self.$$.dirty[0] & /*currentEmojis, currentFavorites*/ 1026 | $$self.$$.dirty[1] & /*initialLoad*/ 8192) { + { + // consider initialLoad to be complete when the first tabpanel and favorites are rendered + /* istanbul ignore next */ + if ("production" !== 'production' || false) { + if (currentEmojis.length && currentFavorites.length && initialLoad) { + $$invalidate(44, initialLoad = false); + requestPostAnimationFrame(() => (void 0)); + } + } + } + } + + if ($$self.$$.dirty[0] & /*searchMode, currentEmojis*/ 18 | $$self.$$.dirty[1] & /*customCategorySorting*/ 2048) { + // + // Derive currentEmojisWithCategories from currentEmojis. This is always done even if there + // are no categories, because it's just easier to code the HTML this way. + // + { + function calculateCurrentEmojisWithCategories() { + if (searchMode) { + return [{ category: '', emojis: currentEmojis }]; + } + + const categoriesToEmoji = new Map(); + + for (const emoji of currentEmojis) { + const category = emoji.category || ''; + let emojis = categoriesToEmoji.get(category); + + if (!emojis) { + emojis = []; + categoriesToEmoji.set(category, emojis); + } + + emojis.push(emoji); + } + + return [...categoriesToEmoji.entries()].map(([category, emojis]) => ({ category, emojis })).sort((a, b) => customCategorySorting(a.category, b.category)); + } + + // eslint-disable-next-line no-unused-vars + $$invalidate(15, currentEmojisWithCategories = calculateCurrentEmojisWithCategories()); + } + } + + if ($$self.$$.dirty[0] & /*activeSearchItem, currentEmojis*/ 34) { + // + // Handle active search item (i.e. pressing up or down while searching) + // + /* eslint-disable no-unused-vars */ + $$invalidate(26, activeSearchItemId = activeSearchItem !== -1 && currentEmojis[activeSearchItem].id); + } + + if ($$self.$$.dirty[0] & /*skinTonePickerExpanded, skinToneDropdown*/ 192) { + // To make the animation nicer, change the z-index of the skintone picker button + // *after* the animation has played. This makes it appear that the picker box + // is expanding "below" the button + { + if (skinTonePickerExpanded) { + skinToneDropdown.addEventListener( + 'transitionend', + () => { + $$invalidate(19, skinTonePickerExpandedAfterAnimation = true); // eslint-disable-line no-unused-vars + }, + { once: true } + ); + } else { + $$invalidate(19, skinTonePickerExpandedAfterAnimation = false); // eslint-disable-line no-unused-vars + } + } + } + }; + + return [ + i18n, + currentEmojis, + rawSearchText, + tabpanelElement, + searchMode, + activeSearchItem, + skinTonePickerExpanded, + skinToneDropdown, + currentSkinTone, + skinTones, + currentFavorites, + currentGroupIndex, + groups$1, + currentGroup, + databaseLoaded, + currentEmojisWithCategories, + rootElement, + baselineEmoji, + message, + skinTonePickerExpandedAfterAnimation, + activeSkinTone, + skinToneButtonText, + pickerStyle, + skinToneButtonLabel, + isRtl, + scrollbarWidth, + activeSearchItemId, + unicodeWithSkin, + labelWithSkin, + calculateEmojiGridStyle, + onSearchKeydown, + onNavClick, + onNavKeydown, + onEmojiClick, + onSkinToneOptionsClick, + onClickSkinToneButton, + onSkinToneOptionsKeydown, + onSkinToneOptionsKeyup, + onSkinToneOptionsFocusOut, + database, + skinToneEmoji, + customEmoji, + customCategorySorting, + emojiVersion, + initialLoad, + searchText, + defaultFavoriteEmojis, + numColumns, + input_input_handler, + div3_binding, + click_handler, + div10_binding, + button1_binding, + section_binding + ]; +} + +class Picker extends SvelteComponent { + constructor(options) { + super(); + + init( + this, + options, + instance, + create_fragment, + safe_not_equal, + { + skinToneEmoji: 40, + i18n: 0, + database: 39, + customEmoji: 41, + customCategorySorting: 42, + emojiVersion: 43 + }, + null, + [-1, -1, -1] + ); + } +} + +const DEFAULT_DATA_SOURCE = 'https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json'; +const DEFAULT_LOCALE = 'en'; + +var enI18n = { + categoriesLabel: 'Categories', + emojiUnsupportedMessage: 'Your browser does not support color emoji.', + favoritesLabel: 'Favorites', + loadingMessage: 'Loadingโฆ', + networkErrorMessage: 'Could not load emoji.', + regionLabel: 'Emoji picker', + searchDescription: 'When search results are available, press up or down to select and enter to choose.', + searchLabel: 'Search', + searchResultsLabel: 'Search results', + skinToneDescription: 'When expanded, press up or down to select and enter to choose.', + skinToneLabel: 'Choose a skin tone (currently {skinTone})', + skinTonesLabel: 'Skin tones', + skinTones: [ + 'Default', + 'Light', + 'Medium-Light', + 'Medium', + 'Medium-Dark', + 'Dark' + ], + categories: { + custom: 'Custom', + 'smileys-emotion': 'Smileys and emoticons', + 'people-body': 'People and body', + 'animals-nature': 'Animals and nature', + 'food-drink': 'Food and drink', + 'travel-places': 'Travel and places', + activities: 'Activities', + objects: 'Objects', + symbols: 'Symbols', + flags: 'Flags' + } +}; + +const PROPS = [ + 'customEmoji', + 'customCategorySorting', + 'database', + 'dataSource', + 'i18n', + 'locale', + 'skinToneEmoji', + 'emojiVersion' +]; + +// Styles injected ourselves, so we can declare the FONT_FAMILY variable in one place +const EXTRA_STYLES = `:host{--emoji-font-family:${FONT_FAMILY}}`; + +class PickerElement extends HTMLElement { + constructor (props) { + super(); + this.attachShadow({ mode: 'open' }); + const style = document.createElement('style'); + style.textContent = ":host{--emoji-size:1.375rem;--emoji-padding:0.5rem;--category-emoji-size:var(--emoji-size);--category-emoji-padding:var(--emoji-padding);--indicator-height:3px;--input-border-radius:0.5rem;--input-border-size:1px;--input-font-size:1rem;--input-line-height:1.5;--input-padding:0.25rem;--num-columns:8;--outline-size:2px;--border-size:1px;--skintone-border-radius:1rem;--category-font-size:1rem;display:flex;width:min-content;height:400px}:host,:host(.light){color-scheme:light;--background:#fff;--border-color:#e0e0e0;--indicator-color:#385ac1;--input-border-color:#999;--input-font-color:#111;--input-placeholder-color:#999;--outline-color:#999;--category-font-color:#111;--button-active-background:#e6e6e6;--button-hover-background:#d9d9d9}:host(.dark){color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}@media (prefers-color-scheme:dark){:host{color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}}:host([hidden]){display:none}button{margin:0;padding:0;border:0;background:0 0;box-shadow:none;-webkit-tap-highlight-color:transparent}button::-moz-focus-inner{border:0}input{padding:0;margin:0;line-height:1.15;font-family:inherit}input[type=search]{-webkit-appearance:none}:focus{outline:var(--outline-color) solid var(--outline-size);outline-offset:calc(-1*var(--outline-size))}:host([data-js-focus-visible]) :focus:not([data-focus-visible-added]){outline:0}:focus:not(:focus-visible){outline:0}.hide-focus{outline:0}*{box-sizing:border-box}.picker{contain:content;display:flex;flex-direction:column;background:var(--background);border:var(--border-size) solid var(--border-color);width:100%;height:100%;overflow:hidden;--total-emoji-size:calc(var(--emoji-size) + (2 * var(--emoji-padding)));--total-category-emoji-size:calc(var(--category-emoji-size) + (2 * var(--category-emoji-padding)))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.hidden{opacity:0;pointer-events:none}.abs-pos{position:absolute;left:0;top:0}.gone{display:none!important}.skintone-button-wrapper,.skintone-list{background:var(--background);z-index:3}.skintone-button-wrapper.expanded{z-index:1}.skintone-list{position:absolute;inset-inline-end:0;top:0;z-index:2;overflow:visible;border-bottom:var(--border-size) solid var(--border-color);border-radius:0 0 var(--skintone-border-radius) var(--skintone-border-radius);will-change:transform;transition:transform .2s ease-in-out;transform-origin:center 0}@media (prefers-reduced-motion:reduce){.skintone-list{transition-duration:.001s}}@supports not (inset-inline-end:0){.skintone-list{right:0}}.skintone-list.no-animate{transition:none}.tabpanel{overflow-y:auto;-webkit-overflow-scrolling:touch;will-change:transform;min-height:0;flex:1;contain:content}.emoji-menu{display:grid;grid-template-columns:repeat(var(--num-columns),var(--total-emoji-size));justify-content:space-around;align-items:flex-start;width:100%}.category{padding:var(--emoji-padding);font-size:var(--category-font-size);color:var(--category-font-color)}.custom-emoji,.emoji,button.emoji{height:var(--total-emoji-size);width:var(--total-emoji-size)}.emoji,button.emoji{font-size:var(--emoji-size);display:flex;align-items:center;justify-content:center;border-radius:100%;line-height:1;overflow:hidden;font-family:var(--emoji-font-family);cursor:pointer}@media (hover:hover) and (pointer:fine){.emoji:hover,button.emoji:hover{background:var(--button-hover-background)}}.emoji.active,.emoji:active,button.emoji.active,button.emoji:active{background:var(--button-active-background)}.custom-emoji{padding:var(--emoji-padding);object-fit:contain;pointer-events:none;background-repeat:no-repeat;background-position:center center;background-size:var(--emoji-size) var(--emoji-size)}.nav,.nav-button{align-items:center}.nav{display:grid;justify-content:space-between;contain:content}.nav-button{display:flex;justify-content:center}.nav-emoji{font-size:var(--category-emoji-size);width:var(--total-category-emoji-size);height:var(--total-category-emoji-size)}.indicator-wrapper{display:flex;border-bottom:1px solid var(--border-color)}.indicator{width:calc(100%/var(--num-groups));height:var(--indicator-height);opacity:var(--indicator-opacity);background-color:var(--indicator-color);will-change:transform,opacity;transition:opacity .1s linear,transform .25s ease-in-out}@media (prefers-reduced-motion:reduce){.indicator{will-change:opacity;transition:opacity .1s linear}}.pad-top,input.search{background:var(--background);width:100%}.pad-top{height:var(--emoji-padding);z-index:3}.search-row{display:flex;align-items:center;position:relative;padding-inline-start:var(--emoji-padding);padding-bottom:var(--emoji-padding)}.search-wrapper{flex:1;min-width:0}input.search{padding:var(--input-padding);border-radius:var(--input-border-radius);border:var(--input-border-size) solid var(--input-border-color);color:var(--input-font-color);font-size:var(--input-font-size);line-height:var(--input-line-height)}input.search::placeholder{color:var(--input-placeholder-color)}.favorites{display:flex;flex-direction:row;border-top:var(--border-size) solid var(--border-color);contain:content}.message{padding:var(--emoji-padding)}" + EXTRA_STYLES; + this.shadowRoot.appendChild(style); + this._ctx = { + // Set defaults + locale: DEFAULT_LOCALE, + dataSource: DEFAULT_DATA_SOURCE, + skinToneEmoji: DEFAULT_SKIN_TONE_EMOJI, + customCategorySorting: DEFAULT_CATEGORY_SORTING, + customEmoji: null, + i18n: enI18n, + emojiVersion: null, + ...props + }; + // Handle properties set before the element was upgraded + for (const prop of PROPS) { + if (prop !== 'database' && Object.prototype.hasOwnProperty.call(this, prop)) { + this._ctx[prop] = this[prop]; + delete this[prop]; + } + } + this._dbFlush(); // wait for a flush before creating the db, in case the user calls e.g. a setter or setAttribute + } + + connectedCallback () { + // The _cmp may be defined if the component was immediately disconnected and then reconnected. In that case, + // do nothing (preserve the state) + if (!this._cmp) { + this._cmp = new Picker({ + target: this.shadowRoot, + props: this._ctx + }); + } + } + + disconnectedCallback () { + // Check in a microtask if the element is still connected. If so, treat this as a "move" rather than a disconnect + // Inspired by Vue: https://vuejs.org/guide/extras/web-components.html#building-custom-elements-with-vue + Promise.resolve().then(() => { + // this._cmp may be defined if connect-disconnect-connect-disconnect occurs synchronously + if (!this.isConnected && this._cmp) { + this._cmp.$destroy(); + this._cmp = undefined; + + const { database } = this._ctx; + database.close() + // only happens if the database failed to load in the first place, so we don't care + .catch(err => console.error(err)); + } + }); + } + + static get observedAttributes () { + return ['locale', 'data-source', 'skin-tone-emoji', 'emoji-version'] // complex objects aren't supported, also use kebab-case + } + + attributeChangedCallback (attrName, oldValue, newValue) { + this._set( + // convert from kebab-case to camelcase + // see https://github.com/sveltejs/svelte/issues/3852#issuecomment-665037015 + attrName.replace(/-([a-z])/g, (_, up) => up.toUpperCase()), + // convert string attribute to float if necessary + attrName === 'emoji-version' ? parseFloat(newValue) : newValue + ); + } + + _set (prop, newValue) { + this._ctx[prop] = newValue; + if (this._cmp) { + this._cmp.$set({ [prop]: newValue }); + } + if (['locale', 'dataSource'].includes(prop)) { + this._dbFlush(); + } + } + + _dbCreate () { + const { locale, dataSource, database } = this._ctx; + // only create a new database if we really need to + if (!database || database.locale !== locale || database.dataSource !== dataSource) { + this._set('database', new Database({ locale, dataSource })); + } + } + + // Update the Database in one microtask if the locale/dataSource change. We do one microtask + // so we don't create two Databases if e.g. both the locale and the dataSource change + _dbFlush () { + Promise.resolve().then(() => ( + this._dbCreate() + )); + } +} + +const definitions = {}; + +for (const prop of PROPS) { + definitions[prop] = { + get () { + if (prop === 'database') { + // in rare cases, the microtask may not be flushed yet, so we need to instantiate the DB + // now if the user is asking for it + this._dbCreate(); + } + return this._ctx[prop] + }, + set (val) { + if (prop === 'database') { + throw new Error('database is read-only') + } + this._set(prop, val); + } + }; +} + +Object.defineProperties(PickerElement.prototype, definitions); + +/* istanbul ignore else */ +if (!customElements.get('emoji-picker')) { // if already defined, do nothing (e.g. same script imported twice) + customElements.define('emoji-picker', PickerElement); +} + +export { PickerElement as default }; diff --git a/app/templates/base/scripts.html b/app/templates/base/scripts.html index 0f08ce6..09062fb 100644 --- a/app/templates/base/scripts.html +++ b/app/templates/base/scripts.html @@ -1,4 +1,4 @@ {% for s in scripts %} {% endfor %} - + diff --git a/app/templates/widgets/editor.html b/app/templates/widgets/editor.html index bb75b2e..2d30dc7 100644 --- a/app/templates/widgets/editor.html +++ b/app/templates/widgets/editor.html @@ -98,7 +98,7 @@