From 785842cde558db47a36aefd2753dbff2ceb21634 Mon Sep 17 00:00:00 2001 From: Yash Srivastav Date: Sun, 11 Dec 2016 05:43:26 +0530 Subject: [PATCH 1/5] Add emoji/nick/commands/chan autocomplete --- client/css/style.css | 33 +- client/js/libs/jquery/inputhistory.js | 2 +- client/js/libs/simplemap.json | 1434 +++++++++++++++++++++++++ client/js/lounge.js | 118 +- package.json | 2 + webpack.config.js | 5 + 6 files changed, 1582 insertions(+), 12 deletions(-) create mode 100644 client/js/libs/simplemap.json diff --git a/client/css/style.css b/client/css/style.css index 7fbd6492..522b319d 100644 --- a/client/css/style.css +++ b/client/css/style.css @@ -1486,7 +1486,8 @@ kbd { background: transparent; } -#context-menu { +#context-menu, +.textcomplete-menu { position: absolute; list-style: none; margin: 0; @@ -1505,7 +1506,8 @@ kbd { background-color: rgba(0, 0, 0, .1); } -.context-menu-item { +.context-menu-item, +.textcomplete-item { cursor: pointer; display: block; padding: 4px 8px; @@ -1514,15 +1516,38 @@ kbd { margin-bottom: 6px; } -.context-menu-item:hover { +.context-menu-item:hover, +.textcomplete-item:hover, +.textcomplete-menu .active { background-color: #f6f6f6; } -.context-menu-item:before { +.context-menu-item:before, +.textcomplete-item:before { width: 20px; display: inline-block; } +.textcomplete-item { + border-bottom-color: rgba(0, 0, 0, .1); + border-bottom-style: solid; + border-bottom-width: 1px; + margin-top: 0; + margin-bottom: 0; + padding: 10px 8px; +} + +.textcomplete-item a { + color: #333; +} + +.textcomplete-item .emoji { + margin-right: 8px; + width: 16px; + text-align: center; + display: inline-block; +} + /** * Tooltips v0.5.3 * See http://primercss.io/tooltips/ diff --git a/client/js/libs/jquery/inputhistory.js b/client/js/libs/jquery/inputhistory.js index 1f5b7bf8..778fa696 100644 --- a/client/js/libs/jquery/inputhistory.js +++ b/client/js/libs/jquery/inputhistory.js @@ -34,7 +34,7 @@ import jQuery from "jquery"; var key = e.which; switch (key) { case 13: // Enter - if (e.shiftKey) { + if (e.shiftKey || self.data("autocompleting")) { return; // multiline input } diff --git a/client/js/libs/simplemap.json b/client/js/libs/simplemap.json new file mode 100644 index 00000000..2f3f0567 --- /dev/null +++ b/client/js/libs/simplemap.json @@ -0,0 +1,1434 @@ +{ + "100": "๐Ÿ’ฏ", + "1234": "๐Ÿ”ข", + "grinning": "๐Ÿ˜€", + "grimacing": "๐Ÿ˜ฌ", + "grin": "๐Ÿ˜", + "joy": "๐Ÿ˜‚", + "rofl": "๐Ÿคฃ", + "smiley": "๐Ÿ˜ƒ", + "smile": "๐Ÿ˜„", + "sweat_smile": "๐Ÿ˜…", + "laughing": "๐Ÿ˜†", + "innocent": "๐Ÿ˜‡", + "wink": "๐Ÿ˜‰", + "blush": "๐Ÿ˜Š", + "slightly_smiling_face": "๐Ÿ™‚", + "upside_down_face": "๐Ÿ™ƒ", + "relaxed": "โ˜บ๏ธ", + "yum": "๐Ÿ˜‹", + "relieved": "๐Ÿ˜Œ", + "heart_eyes": "๐Ÿ˜", + "kissing_heart": "๐Ÿ˜˜", + "kissing": "๐Ÿ˜—", + "kissing_smiling_eyes": "๐Ÿ˜™", + "kissing_closed_eyes": "๐Ÿ˜š", + "stuck_out_tongue_winking_eye": "๐Ÿ˜œ", + "stuck_out_tongue_closed_eyes": "๐Ÿ˜", + "stuck_out_tongue": "๐Ÿ˜›", + "money_mouth_face": "๐Ÿค‘", + "nerd_face": "๐Ÿค“", + "sunglasses": "๐Ÿ˜Ž", + "clown_face": "๐Ÿคก", + "cowboy_hat_face": "๐Ÿค ", + "hugs": "๐Ÿค—", + "smirk": "๐Ÿ˜", + "no_mouth": "๐Ÿ˜ถ", + "neutral_face": "๐Ÿ˜", + "expressionless": "๐Ÿ˜‘", + "unamused": "๐Ÿ˜’", + "roll_eyes": "๐Ÿ™„", + "thinking": "๐Ÿค”", + "lying_face": "๐Ÿคฅ", + "flushed": "๐Ÿ˜ณ", + "disappointed": "๐Ÿ˜ž", + "worried": "๐Ÿ˜Ÿ", + "angry": "๐Ÿ˜ ", + "rage": "๐Ÿ˜ก", + "pensive": "๐Ÿ˜”", + "confused": "๐Ÿ˜•", + "slightly_frowning_face": "๐Ÿ™", + "frowning_face": "โ˜น", + "persevere": "๐Ÿ˜ฃ", + "confounded": "๐Ÿ˜–", + "tired_face": "๐Ÿ˜ซ", + "weary": "๐Ÿ˜ฉ", + "triumph": "๐Ÿ˜ค", + "open_mouth": "๐Ÿ˜ฎ", + "scream": "๐Ÿ˜ฑ", + "fearful": "๐Ÿ˜จ", + "cold_sweat": "๐Ÿ˜ฐ", + "hushed": "๐Ÿ˜ฏ", + "frowning": "๐Ÿ˜ฆ", + "anguished": "๐Ÿ˜ง", + "cry": "๐Ÿ˜ข", + "disappointed_relieved": "๐Ÿ˜ฅ", + "drooling_face": "๐Ÿคค", + "sleepy": "๐Ÿ˜ช", + "sweat": "๐Ÿ˜“", + "sob": "๐Ÿ˜ญ", + "dizzy_face": "๐Ÿ˜ต", + "astonished": "๐Ÿ˜ฒ", + "zipper_mouth_face": "๐Ÿค", + "nauseated_face": "๐Ÿคข", + "sneezing_face": "๐Ÿคง", + "mask": "๐Ÿ˜ท", + "face_with_thermometer": "๐Ÿค’", + "face_with_head_bandage": "๐Ÿค•", + "sleeping": "๐Ÿ˜ด", + "zzz": "๐Ÿ’ค", + "poop": "๐Ÿ’ฉ", + "smiling_imp": "๐Ÿ˜ˆ", + "imp": "๐Ÿ‘ฟ", + "japanese_ogre": "๐Ÿ‘น", + "japanese_goblin": "๐Ÿ‘บ", + "skull": "๐Ÿ’€", + "ghost": "๐Ÿ‘ป", + "alien": "๐Ÿ‘ฝ", + "robot": "๐Ÿค–", + "smiley_cat": "๐Ÿ˜บ", + "smile_cat": "๐Ÿ˜ธ", + "joy_cat": "๐Ÿ˜น", + "heart_eyes_cat": "๐Ÿ˜ป", + "smirk_cat": "๐Ÿ˜ผ", + "kissing_cat": "๐Ÿ˜ฝ", + "scream_cat": "๐Ÿ™€", + "crying_cat_face": "๐Ÿ˜ฟ", + "pouting_cat": "๐Ÿ˜พ", + "raised_hands": "๐Ÿ™Œ", + "clap": "๐Ÿ‘", + "wave": "๐Ÿ‘‹", + "call_me_hand": "๐Ÿค™", + "+1": "๐Ÿ‘", + "-1": "๐Ÿ‘Ž", + "facepunch": "๐Ÿ‘Š", + "fist": "โœŠ", + "fist_left": "๐Ÿค›", + "fist_right": "๐Ÿคœ", + "v": "โœŒ", + "ok_hand": "๐Ÿ‘Œ", + "raised_hand": "โœ‹", + "raised_back_of_hand": "๐Ÿคš", + "open_hands": "๐Ÿ‘", + "muscle": "๐Ÿ’ช", + "pray": "๐Ÿ™", + "handshake": "๐Ÿค", + "point_up": "โ˜", + "point_up_2": "๐Ÿ‘†", + "point_down": "๐Ÿ‘‡", + "point_left": "๐Ÿ‘ˆ", + "point_right": "๐Ÿ‘‰", + "fu": "๐Ÿ–•", + "raised_hand_with_fingers_splayed": "๐Ÿ–", + "metal": "๐Ÿค˜", + "crossed_fingers": "๐Ÿคž", + "vulcan_salute": "๐Ÿ––", + "writing_hand": "โœ", + "selfie": "๐Ÿคณ", + "nail_care": "๐Ÿ’…", + "lips": "๐Ÿ‘„", + "tongue": "๐Ÿ‘…", + "ear": "๐Ÿ‘‚", + "nose": "๐Ÿ‘ƒ", + "eye": "๐Ÿ‘", + "eyes": "๐Ÿ‘€", + "bust_in_silhouette": "๐Ÿ‘ค", + "busts_in_silhouette": "๐Ÿ‘ฅ", + "speaking_head": "๐Ÿ—ฃ", + "baby": "๐Ÿ‘ถ", + "boy": "๐Ÿ‘ฆ", + "girl": "๐Ÿ‘ง", + "man": "๐Ÿ‘จ", + "woman": "๐Ÿ‘ฉ", + "blonde_woman": "๐Ÿ‘ฑโ€โ™€๏ธ", + "blonde_man": "๐Ÿ‘ฑ", + "older_man": "๐Ÿ‘ด", + "older_woman": "๐Ÿ‘ต", + "man_with_gua_pi_mao": "๐Ÿ‘ฒ", + "woman_with_turban": "๐Ÿ‘ณโ€โ™€๏ธ", + "man_with_turban": "๐Ÿ‘ณ", + "policewoman": "๐Ÿ‘ฎโ€โ™€๏ธ", + "policeman": "๐Ÿ‘ฎ", + "construction_worker_woman": "๐Ÿ‘ทโ€โ™€๏ธ", + "construction_worker_man": "๐Ÿ‘ท", + "guardswoman": "๐Ÿ’‚โ€โ™€๏ธ", + "guardsman": "๐Ÿ’‚", + "female_detective": "๐Ÿ•ต๏ธโ€โ™€๏ธ", + "male_detective": "๐Ÿ•ต", + "woman_health_worker": "๐Ÿ‘ฉโ€โš•๏ธ", + "man_health_worker": "๐Ÿ‘จโ€โš•๏ธ", + "woman_farmer": "๐Ÿ‘ฉโ€๐ŸŒพ", + "man_farmer": "๐Ÿ‘จโ€๐ŸŒพ", + "woman_cook": "๐Ÿ‘ฉโ€๐Ÿณ", + "man_cook": "๐Ÿ‘จโ€๐Ÿณ", + "woman_student": "๐Ÿ‘ฉโ€๐ŸŽ“", + "man_student": "๐Ÿ‘จโ€๐ŸŽ“", + "woman_singer": "๐Ÿ‘ฉโ€๐ŸŽค", + "man_singer": "๐Ÿ‘จโ€๐ŸŽค", + "woman_teacher": "๐Ÿ‘ฉโ€๐Ÿซ", + "man_teacher": "๐Ÿ‘จโ€๐Ÿซ", + "woman_factory_worker": "๐Ÿ‘ฉโ€๐Ÿญ", + "man_factory_worker": "๐Ÿ‘จโ€๐Ÿญ", + "woman_technologist": "๐Ÿ‘ฉโ€๐Ÿ’ป", + "man_technologist": "๐Ÿ‘จโ€๐Ÿ’ป", + "woman_office_worker": "๐Ÿ‘ฉโ€๐Ÿ’ผ", + "man_office_worker": "๐Ÿ‘จโ€๐Ÿ’ผ", + "woman_mechanic": "๐Ÿ‘ฉโ€๐Ÿ”ง", + "man_mechanic": "๐Ÿ‘จโ€๐Ÿ”ง", + "woman_scientist": "๐Ÿ‘ฉโ€๐Ÿ”ฌ", + "man_scientist": "๐Ÿ‘จโ€๐Ÿ”ฌ", + "woman_artist": "๐Ÿ‘ฉโ€๐ŸŽจ", + "man_artist": "๐Ÿ‘จโ€๐ŸŽจ", + "woman_firefighter": "๐Ÿ‘ฉโ€๐Ÿš’", + "man_firefighter": "๐Ÿ‘จโ€๐Ÿš’", + "woman_pilot": "๐Ÿ‘ฉโ€โœˆ๏ธ", + "man_pilot": "๐Ÿ‘จโ€โœˆ๏ธ", + "woman_astronaut": "๐Ÿ‘ฉโ€๐Ÿš€", + "man_astronaut": "๐Ÿ‘จโ€๐Ÿš€", + "woman_judge": "๐Ÿ‘ฉโ€โš–๏ธ", + "man_judge": "๐Ÿ‘จโ€โš–๏ธ", + "mrs_claus": "๐Ÿคถ", + "santa": "๐ŸŽ…", + "angel": "๐Ÿ‘ผ", + "pregnant_woman": "๐Ÿคฐ", + "princess": "๐Ÿ‘ธ", + "prince": "๐Ÿคด", + "bride_with_veil": "๐Ÿ‘ฐ", + "man_in_tuxedo": "๐Ÿคต", + "running_woman": "๐Ÿƒโ€โ™€๏ธ", + "running_man": "๐Ÿƒ", + "walking_woman": "๐Ÿšถโ€โ™€๏ธ", + "walking_man": "๐Ÿšถ", + "dancer": "๐Ÿ’ƒ", + "man_dancing": "๐Ÿ•บ", + "dancing_women": "๐Ÿ‘ฏ", + "dancing_men": "๐Ÿ‘ฏโ€โ™‚๏ธ", + "couple": "๐Ÿ‘ซ", + "two_men_holding_hands": "๐Ÿ‘ฌ", + "two_women_holding_hands": "๐Ÿ‘ญ", + "bowing_woman": "๐Ÿ™‡โ€โ™€๏ธ", + "bowing_man": "๐Ÿ™‡", + "man_facepalming": "๐Ÿคฆ", + "woman_facepalming": "๐Ÿคฆโ€โ™€๏ธ", + "woman_shrugging": "๐Ÿคท", + "man_shrugging": "๐Ÿคทโ€โ™‚๏ธ", + "tipping_hand_woman": "๐Ÿ’", + "tipping_hand_man": "๐Ÿ’โ€โ™‚๏ธ", + "no_good_woman": "๐Ÿ™…", + "no_good_man": "๐Ÿ™…โ€โ™‚๏ธ", + "ok_woman": "๐Ÿ™†", + "ok_man": "๐Ÿ™†โ€โ™‚๏ธ", + "raising_hand_woman": "๐Ÿ™‹", + "raising_hand_man": "๐Ÿ™‹โ€โ™‚๏ธ", + "pouting_woman": "๐Ÿ™Ž", + "pouting_man": "๐Ÿ™Žโ€โ™‚๏ธ", + "frowning_woman": "๐Ÿ™", + "frowning_man": "๐Ÿ™โ€โ™‚๏ธ", + "haircut_woman": "๐Ÿ’‡", + "haircut_man": "๐Ÿ’‡โ€โ™‚๏ธ", + "massage_woman": "๐Ÿ’†", + "massage_man": "๐Ÿ’†โ€โ™‚๏ธ", + "couple_with_heart_woman_man": "๐Ÿ’‘", + "couple_with_heart_woman_woman": "๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘ฉ", + "couple_with_heart_man_man": "๐Ÿ‘จโ€โค๏ธโ€๐Ÿ‘จ", + "couplekiss_man_woman": "๐Ÿ’", + "couplekiss_woman_woman": "๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ", + "couplekiss_man_man": "๐Ÿ‘จโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ", + "family_man_woman_boy": "๐Ÿ‘ช", + "family_man_woman_girl": "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง", + "family_man_woman_girl_boy": "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", + "family_man_woman_boy_boy": "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", + "family_man_woman_girl_girl": "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง", + "family_woman_woman_boy": "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ", + "family_woman_woman_girl": "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ง", + "family_woman_woman_girl_boy": "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", + "family_woman_woman_boy_boy": "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", + "family_woman_woman_girl_girl": "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง", + "family_man_man_boy": "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆ", + "family_man_man_girl": "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ง", + "family_man_man_girl_boy": "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", + "family_man_man_boy_boy": "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", + "family_man_man_girl_girl": "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง", + "family_woman_boy": "๐Ÿ‘ฉโ€๐Ÿ‘ฆ", + "family_woman_girl": "๐Ÿ‘ฉโ€๐Ÿ‘ง", + "family_woman_girl_boy": "๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", + "family_woman_boy_boy": "๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", + "family_woman_girl_girl": "๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง", + "family_man_boy": "๐Ÿ‘จโ€๐Ÿ‘ฆ", + "family_man_girl": "๐Ÿ‘จโ€๐Ÿ‘ง", + "family_man_girl_boy": "๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", + "family_man_boy_boy": "๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", + "family_man_girl_girl": "๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง", + "womans_clothes": "๐Ÿ‘š", + "tshirt": "๐Ÿ‘•", + "jeans": "๐Ÿ‘–", + "necktie": "๐Ÿ‘”", + "dress": "๐Ÿ‘—", + "bikini": "๐Ÿ‘™", + "kimono": "๐Ÿ‘˜", + "lipstick": "๐Ÿ’„", + "kiss": "๐Ÿ’‹", + "footprints": "๐Ÿ‘ฃ", + "high_heel": "๐Ÿ‘ ", + "sandal": "๐Ÿ‘ก", + "boot": "๐Ÿ‘ข", + "mans_shoe": "๐Ÿ‘ž", + "athletic_shoe": "๐Ÿ‘Ÿ", + "womans_hat": "๐Ÿ‘’", + "tophat": "๐ŸŽฉ", + "rescue_worker_helmet": "โ›‘", + "mortar_board": "๐ŸŽ“", + "crown": "๐Ÿ‘‘", + "school_satchel": "๐ŸŽ’", + "pouch": "๐Ÿ‘", + "purse": "๐Ÿ‘›", + "handbag": "๐Ÿ‘œ", + "briefcase": "๐Ÿ’ผ", + "eyeglasses": "๐Ÿ‘“", + "dark_sunglasses": "๐Ÿ•ถ", + "ring": "๐Ÿ’", + "closed_umbrella": "๐ŸŒ‚", + "dog": "๐Ÿถ", + "cat": "๐Ÿฑ", + "mouse": "๐Ÿญ", + "hamster": "๐Ÿน", + "rabbit": "๐Ÿฐ", + "fox_face": "๐ŸฆŠ", + "bear": "๐Ÿป", + "panda_face": "๐Ÿผ", + "koala": "๐Ÿจ", + "tiger": "๐Ÿฏ", + "lion": "๐Ÿฆ", + "cow": "๐Ÿฎ", + "pig": "๐Ÿท", + "pig_nose": "๐Ÿฝ", + "frog": "๐Ÿธ", + "squid": "๐Ÿฆ‘", + "octopus": "๐Ÿ™", + "shrimp": "๐Ÿฆ", + "monkey_face": "๐Ÿต", + "gorilla": "๐Ÿฆ", + "see_no_evil": "๐Ÿ™ˆ", + "hear_no_evil": "๐Ÿ™‰", + "speak_no_evil": "๐Ÿ™Š", + "monkey": "๐Ÿ’", + "chicken": "๐Ÿ”", + "penguin": "๐Ÿง", + "bird": "๐Ÿฆ", + "baby_chick": "๐Ÿค", + "hatching_chick": "๐Ÿฃ", + "hatched_chick": "๐Ÿฅ", + "duck": "๐Ÿฆ†", + "eagle": "๐Ÿฆ…", + "owl": "๐Ÿฆ‰", + "bat": "๐Ÿฆ‡", + "wolf": "๐Ÿบ", + "boar": "๐Ÿ—", + "horse": "๐Ÿด", + "unicorn": "๐Ÿฆ„", + "honeybee": "๐Ÿ", + "bug": "๐Ÿ›", + "butterfly": "๐Ÿฆ‹", + "snail": "๐ŸŒ", + "beetle": "๐Ÿž", + "ant": "๐Ÿœ", + "spider": "๐Ÿ•ท", + "scorpion": "๐Ÿฆ‚", + "crab": "๐Ÿฆ€", + "snake": "๐Ÿ", + "lizard": "๐ŸฆŽ", + "turtle": "๐Ÿข", + "tropical_fish": "๐Ÿ ", + "fish": "๐ŸŸ", + "blowfish": "๐Ÿก", + "dolphin": "๐Ÿฌ", + "shark": "๐Ÿฆˆ", + "whale": "๐Ÿณ", + "whale2": "๐Ÿ‹", + "crocodile": "๐ŸŠ", + "leopard": "๐Ÿ†", + "tiger2": "๐Ÿ…", + "water_buffalo": "๐Ÿƒ", + "ox": "๐Ÿ‚", + "cow2": "๐Ÿ„", + "deer": "๐ŸฆŒ", + "dromedary_camel": "๐Ÿช", + "camel": "๐Ÿซ", + "elephant": "๐Ÿ˜", + "rhinoceros": "๐Ÿฆ", + "goat": "๐Ÿ", + "ram": "๐Ÿ", + "sheep": "๐Ÿ‘", + "racehorse": "๐ŸŽ", + "pig2": "๐Ÿ–", + "rat": "๐Ÿ€", + "mouse2": "๐Ÿ", + "rooster": "๐Ÿ“", + "turkey": "๐Ÿฆƒ", + "dove": "๐Ÿ•Š", + "dog2": "๐Ÿ•", + "poodle": "๐Ÿฉ", + "cat2": "๐Ÿˆ", + "rabbit2": "๐Ÿ‡", + "chipmunk": "๐Ÿฟ", + "paw_prints": "๐Ÿพ", + "dragon": "๐Ÿ‰", + "dragon_face": "๐Ÿฒ", + "cactus": "๐ŸŒต", + "christmas_tree": "๐ŸŽ„", + "evergreen_tree": "๐ŸŒฒ", + "deciduous_tree": "๐ŸŒณ", + "palm_tree": "๐ŸŒด", + "seedling": "๐ŸŒฑ", + "herb": "๐ŸŒฟ", + "shamrock": "โ˜˜", + "four_leaf_clover": "๐Ÿ€", + "bamboo": "๐ŸŽ", + "tanabata_tree": "๐ŸŽ‹", + "leaves": "๐Ÿƒ", + "fallen_leaf": "๐Ÿ‚", + "maple_leaf": "๐Ÿ", + "ear_of_rice": "๐ŸŒพ", + "hibiscus": "๐ŸŒบ", + "sunflower": "๐ŸŒป", + "rose": "๐ŸŒน", + "wilted_flower": "๐Ÿฅ€", + "tulip": "๐ŸŒท", + "blossom": "๐ŸŒผ", + "cherry_blossom": "๐ŸŒธ", + "bouquet": "๐Ÿ’", + "mushroom": "๐Ÿ„", + "chestnut": "๐ŸŒฐ", + "jack_o_lantern": "๐ŸŽƒ", + "shell": "๐Ÿš", + "spider_web": "๐Ÿ•ธ", + "earth_americas": "๐ŸŒŽ", + "earth_africa": "๐ŸŒ", + "earth_asia": "๐ŸŒ", + "full_moon": "๐ŸŒ•", + "waning_gibbous_moon": "๐ŸŒ–", + "last_quarter_moon": "๐ŸŒ—", + "waning_crescent_moon": "๐ŸŒ˜", + "new_moon": "๐ŸŒ‘", + "waxing_crescent_moon": "๐ŸŒ’", + "first_quarter_moon": "๐ŸŒ“", + "waxing_gibbous_moon": "๐ŸŒ”", + "new_moon_with_face": "๐ŸŒš", + "full_moon_with_face": "๐ŸŒ", + "first_quarter_moon_with_face": "๐ŸŒ›", + "last_quarter_moon_with_face": "๐ŸŒœ", + "sun_with_face": "๐ŸŒž", + "crescent_moon": "๐ŸŒ™", + "star": "โญ", + "star2": "๐ŸŒŸ", + "dizzy": "๐Ÿ’ซ", + "sparkles": "โœจ", + "comet": "โ˜„", + "sunny": "โ˜€๏ธ", + "sun_behind_small_cloud": "๐ŸŒค", + "partly_sunny": "โ›…", + "sun_behind_large_cloud": "๐ŸŒฅ", + "sun_behind_rain_cloud": "๐ŸŒฆ", + "cloud": "โ˜๏ธ", + "cloud_with_rain": "๐ŸŒง", + "cloud_with_lightning_and_rain": "โ›ˆ", + "cloud_with_lightning": "๐ŸŒฉ", + "zap": "โšก", + "fire": "๐Ÿ”ฅ", + "boom": "๐Ÿ’ฅ", + "snowflake": "โ„๏ธ", + "cloud_with_snow": "๐ŸŒจ", + "snowman": "โ›„", + "snowman_with_snow": "โ˜ƒ", + "wind_face": "๐ŸŒฌ", + "dash": "๐Ÿ’จ", + "tornado": "๐ŸŒช", + "fog": "๐ŸŒซ", + "open_umbrella": "โ˜‚", + "umbrella": "โ˜”", + "droplet": "๐Ÿ’ง", + "sweat_drops": "๐Ÿ’ฆ", + "ocean": "๐ŸŒŠ", + "green_apple": "๐Ÿ", + "apple": "๐ŸŽ", + "pear": "๐Ÿ", + "tangerine": "๐ŸŠ", + "lemon": "๐Ÿ‹", + "banana": "๐ŸŒ", + "watermelon": "๐Ÿ‰", + "grapes": "๐Ÿ‡", + "strawberry": "๐Ÿ“", + "melon": "๐Ÿˆ", + "cherries": "๐Ÿ’", + "peach": "๐Ÿ‘", + "pineapple": "๐Ÿ", + "kiwi_fruit": "๐Ÿฅ", + "avocado": "๐Ÿฅ‘", + "tomato": "๐Ÿ…", + "eggplant": "๐Ÿ†", + "cucumber": "๐Ÿฅ’", + "carrot": "๐Ÿฅ•", + "hot_pepper": "๐ŸŒถ", + "potato": "๐Ÿฅ”", + "corn": "๐ŸŒฝ", + "sweet_potato": "๐Ÿ ", + "peanuts": "๐Ÿฅœ", + "honey_pot": "๐Ÿฏ", + "croissant": "๐Ÿฅ", + "bread": "๐Ÿž", + "baguette_bread": "๐Ÿฅ–", + "cheese": "๐Ÿง€", + "egg": "๐Ÿฅš", + "bacon": "๐Ÿฅ“", + "pancakes": "๐Ÿฅž", + "poultry_leg": "๐Ÿ—", + "meat_on_bone": "๐Ÿ–", + "fried_shrimp": "๐Ÿค", + "fried_egg": "๐Ÿณ", + "hamburger": "๐Ÿ”", + "fries": "๐ŸŸ", + "stuffed_flatbread": "๐Ÿฅ™", + "hotdog": "๐ŸŒญ", + "pizza": "๐Ÿ•", + "spaghetti": "๐Ÿ", + "taco": "๐ŸŒฎ", + "burrito": "๐ŸŒฏ", + "green_salad": "๐Ÿฅ—", + "shallow_pan_of_food": "๐Ÿฅ˜", + "ramen": "๐Ÿœ", + "stew": "๐Ÿฒ", + "fish_cake": "๐Ÿฅ", + "sushi": "๐Ÿฃ", + "bento": "๐Ÿฑ", + "curry": "๐Ÿ›", + "rice_ball": "๐Ÿ™", + "rice": "๐Ÿš", + "rice_cracker": "๐Ÿ˜", + "oden": "๐Ÿข", + "dango": "๐Ÿก", + "shaved_ice": "๐Ÿง", + "ice_cream": "๐Ÿจ", + "icecream": "๐Ÿฆ", + "cake": "๐Ÿฐ", + "birthday": "๐ŸŽ‚", + "custard": "๐Ÿฎ", + "candy": "๐Ÿฌ", + "lollipop": "๐Ÿญ", + "chocolate_bar": "๐Ÿซ", + "popcorn": "๐Ÿฟ", + "doughnut": "๐Ÿฉ", + "cookie": "๐Ÿช", + "milk_glass": "๐Ÿฅ›", + "beer": "๐Ÿบ", + "beers": "๐Ÿป", + "clinking_glasses": "๐Ÿฅ‚", + "wine_glass": "๐Ÿท", + "tumbler_glass": "๐Ÿฅƒ", + "cocktail": "๐Ÿธ", + "tropical_drink": "๐Ÿน", + "champagne": "๐Ÿพ", + "sake": "๐Ÿถ", + "tea": "๐Ÿต", + "coffee": "โ˜•", + "baby_bottle": "๐Ÿผ", + "spoon": "๐Ÿฅ„", + "fork_and_knife": "๐Ÿด", + "plate_with_cutlery": "๐Ÿฝ", + "soccer": "โšฝ", + "basketball": "๐Ÿ€", + "football": "๐Ÿˆ", + "baseball": "โšพ", + "tennis": "๐ŸŽพ", + "volleyball": "๐Ÿ", + "rugby_football": "๐Ÿ‰", + "8ball": "๐ŸŽฑ", + "golf": "โ›ณ", + "golfing_woman": "๐ŸŒ๏ธโ€โ™€๏ธ", + "golfing_man": "๐ŸŒ", + "ping_pong": "๐Ÿ“", + "badminton": "๐Ÿธ", + "goal_net": "๐Ÿฅ…", + "ice_hockey": "๐Ÿ’", + "field_hockey": "๐Ÿ‘", + "cricket": "๐Ÿ", + "ski": "๐ŸŽฟ", + "skier": "โ›ท", + "snowboarder": "๐Ÿ‚", + "person_fencing": "๐Ÿคบ", + "women_wrestling": "๐Ÿคผโ€โ™€๏ธ", + "men_wrestling": "๐Ÿคผโ€โ™‚๏ธ", + "woman_cartwheeling": "๐Ÿคธโ€โ™€๏ธ", + "man_cartwheeling": "๐Ÿคธโ€โ™‚๏ธ", + "woman_playing_handball": "๐Ÿคพโ€โ™€๏ธ", + "man_playing_handball": "๐Ÿคพโ€โ™‚๏ธ", + "ice_skate": "โ›ธ", + "bow_and_arrow": "๐Ÿน", + "fishing_pole_and_fish": "๐ŸŽฃ", + "boxing_glove": "๐ŸฅŠ", + "martial_arts_uniform": "๐Ÿฅ‹", + "rowing_woman": "๐Ÿšฃโ€โ™€๏ธ", + "rowing_man": "๐Ÿšฃ", + "swimming_woman": "๐ŸŠโ€โ™€๏ธ", + "swimming_man": "๐ŸŠ", + "woman_playing_water_polo": "๐Ÿคฝโ€โ™€๏ธ", + "man_playing_water_polo": "๐Ÿคฝโ€โ™‚๏ธ", + "surfing_woman": "๐Ÿ„โ€โ™€๏ธ", + "surfing_man": "๐Ÿ„", + "bath": "๐Ÿ›€", + "basketball_woman": "โ›น๏ธโ€โ™€๏ธ", + "basketball_man": "โ›น", + "weight_lifting_woman": "๐Ÿ‹๏ธโ€โ™€๏ธ", + "weight_lifting_man": "๐Ÿ‹", + "biking_woman": "๐Ÿšดโ€โ™€๏ธ", + "biking_man": "๐Ÿšด", + "mountain_biking_woman": "๐Ÿšตโ€โ™€๏ธ", + "mountain_biking_man": "๐Ÿšต", + "horse_racing": "๐Ÿ‡", + "business_suit_levitating": "๐Ÿ•ด", + "trophy": "๐Ÿ†", + "running_shirt_with_sash": "๐ŸŽฝ", + "medal_sports": "๐Ÿ…", + "medal_military": "๐ŸŽ–", + "1st_place_medal": "๐Ÿฅ‡", + "2nd_place_medal": "๐Ÿฅˆ", + "3rd_place_medal": "๐Ÿฅ‰", + "reminder_ribbon": "๐ŸŽ—", + "rosette": "๐Ÿต", + "ticket": "๐ŸŽซ", + "tickets": "๐ŸŽŸ", + "performing_arts": "๐ŸŽญ", + "art": "๐ŸŽจ", + "circus_tent": "๐ŸŽช", + "woman_juggling": "๐Ÿคนโ€โ™€๏ธ", + "man_juggling": "๐Ÿคนโ€โ™‚๏ธ", + "microphone": "๐ŸŽค", + "headphones": "๐ŸŽง", + "musical_score": "๐ŸŽผ", + "musical_keyboard": "๐ŸŽน", + "drum": "๐Ÿฅ", + "saxophone": "๐ŸŽท", + "trumpet": "๐ŸŽบ", + "guitar": "๐ŸŽธ", + "violin": "๐ŸŽป", + "clapper": "๐ŸŽฌ", + "video_game": "๐ŸŽฎ", + "space_invader": "๐Ÿ‘พ", + "dart": "๐ŸŽฏ", + "game_die": "๐ŸŽฒ", + "slot_machine": "๐ŸŽฐ", + "bowling": "๐ŸŽณ", + "red_car": "๐Ÿš—", + "taxi": "๐Ÿš•", + "blue_car": "๐Ÿš™", + "bus": "๐ŸšŒ", + "trolleybus": "๐ŸšŽ", + "racing_car": "๐ŸŽ", + "police_car": "๐Ÿš“", + "ambulance": "๐Ÿš‘", + "fire_engine": "๐Ÿš’", + "minibus": "๐Ÿš", + "truck": "๐Ÿšš", + "articulated_lorry": "๐Ÿš›", + "tractor": "๐Ÿšœ", + "kick_scooter": "๐Ÿ›ด", + "motorcycle": "๐Ÿ", + "bike": "๐Ÿšฒ", + "motor_scooter": "๐Ÿ›ต", + "rotating_light": "๐Ÿšจ", + "oncoming_police_car": "๐Ÿš”", + "oncoming_bus": "๐Ÿš", + "oncoming_automobile": "๐Ÿš˜", + "oncoming_taxi": "๐Ÿš–", + "aerial_tramway": "๐Ÿšก", + "mountain_cableway": "๐Ÿš ", + "suspension_railway": "๐ŸšŸ", + "railway_car": "๐Ÿšƒ", + "train": "๐Ÿš‹", + "monorail": "๐Ÿš", + "bullettrain_side": "๐Ÿš„", + "bullettrain_front": "๐Ÿš…", + "light_rail": "๐Ÿšˆ", + "mountain_railway": "๐Ÿšž", + "steam_locomotive": "๐Ÿš‚", + "train2": "๐Ÿš†", + "metro": "๐Ÿš‡", + "tram": "๐ŸšŠ", + "station": "๐Ÿš‰", + "helicopter": "๐Ÿš", + "small_airplane": "๐Ÿ›ฉ", + "airplane": "โœˆ๏ธ", + "flight_departure": "๐Ÿ›ซ", + "flight_arrival": "๐Ÿ›ฌ", + "sailboat": "โ›ต", + "motor_boat": "๐Ÿ›ฅ", + "speedboat": "๐Ÿšค", + "ferry": "โ›ด", + "passenger_ship": "๐Ÿ›ณ", + "rocket": "๐Ÿš€", + "artificial_satellite": "๐Ÿ›ฐ", + "seat": "๐Ÿ’บ", + "canoe": "๐Ÿ›ถ", + "anchor": "โš“", + "construction": "๐Ÿšง", + "fuelpump": "โ›ฝ", + "busstop": "๐Ÿš", + "vertical_traffic_light": "๐Ÿšฆ", + "traffic_light": "๐Ÿšฅ", + "checkered_flag": "๐Ÿ", + "ship": "๐Ÿšข", + "ferris_wheel": "๐ŸŽก", + "roller_coaster": "๐ŸŽข", + "carousel_horse": "๐ŸŽ ", + "building_construction": "๐Ÿ—", + "foggy": "๐ŸŒ", + "tokyo_tower": "๐Ÿ—ผ", + "factory": "๐Ÿญ", + "fountain": "โ›ฒ", + "rice_scene": "๐ŸŽ‘", + "mountain": "โ›ฐ", + "mountain_snow": "๐Ÿ”", + "mount_fuji": "๐Ÿ—ป", + "volcano": "๐ŸŒ‹", + "japan": "๐Ÿ—พ", + "camping": "๐Ÿ•", + "tent": "โ›บ", + "national_park": "๐Ÿž", + "motorway": "๐Ÿ›ฃ", + "railway_track": "๐Ÿ›ค", + "sunrise": "๐ŸŒ…", + "sunrise_over_mountains": "๐ŸŒ„", + "desert": "๐Ÿœ", + "beach_umbrella": "๐Ÿ–", + "desert_island": "๐Ÿ", + "city_sunrise": "๐ŸŒ‡", + "city_sunset": "๐ŸŒ†", + "cityscape": "๐Ÿ™", + "night_with_stars": "๐ŸŒƒ", + "bridge_at_night": "๐ŸŒ‰", + "milky_way": "๐ŸŒŒ", + "stars": "๐ŸŒ ", + "sparkler": "๐ŸŽ‡", + "fireworks": "๐ŸŽ†", + "rainbow": "๐ŸŒˆ", + "houses": "๐Ÿ˜", + "european_castle": "๐Ÿฐ", + "japanese_castle": "๐Ÿฏ", + "stadium": "๐ŸŸ", + "statue_of_liberty": "๐Ÿ—ฝ", + "house": "๐Ÿ ", + "house_with_garden": "๐Ÿก", + "derelict_house": "๐Ÿš", + "office": "๐Ÿข", + "department_store": "๐Ÿฌ", + "post_office": "๐Ÿฃ", + "european_post_office": "๐Ÿค", + "hospital": "๐Ÿฅ", + "bank": "๐Ÿฆ", + "hotel": "๐Ÿจ", + "convenience_store": "๐Ÿช", + "school": "๐Ÿซ", + "love_hotel": "๐Ÿฉ", + "wedding": "๐Ÿ’’", + "classical_building": "๐Ÿ›", + "church": "โ›ช", + "mosque": "๐Ÿ•Œ", + "synagogue": "๐Ÿ•", + "kaaba": "๐Ÿ•‹", + "shinto_shrine": "โ›ฉ", + "watch": "โŒš", + "iphone": "๐Ÿ“ฑ", + "calling": "๐Ÿ“ฒ", + "computer": "๐Ÿ’ป", + "keyboard": "โŒจ", + "desktop_computer": "๐Ÿ–ฅ", + "printer": "๐Ÿ–จ", + "computer_mouse": "๐Ÿ–ฑ", + "trackball": "๐Ÿ–ฒ", + "joystick": "๐Ÿ•น", + "clamp": "๐Ÿ—œ", + "minidisc": "๐Ÿ’ฝ", + "floppy_disk": "๐Ÿ’พ", + "cd": "๐Ÿ’ฟ", + "dvd": "๐Ÿ“€", + "vhs": "๐Ÿ“ผ", + "camera": "๐Ÿ“ท", + "camera_flash": "๐Ÿ“ธ", + "video_camera": "๐Ÿ“น", + "movie_camera": "๐ŸŽฅ", + "film_projector": "๐Ÿ“ฝ", + "film_strip": "๐ŸŽž", + "telephone_receiver": "๐Ÿ“ž", + "phone": "โ˜Ž๏ธ", + "pager": "๐Ÿ“Ÿ", + "fax": "๐Ÿ“ ", + "tv": "๐Ÿ“บ", + "radio": "๐Ÿ“ป", + "studio_microphone": "๐ŸŽ™", + "level_slider": "๐ŸŽš", + "control_knobs": "๐ŸŽ›", + "stopwatch": "โฑ", + "timer_clock": "โฒ", + "alarm_clock": "โฐ", + "mantelpiece_clock": "๐Ÿ•ฐ", + "hourglass_flowing_sand": "โณ", + "hourglass": "โŒ›", + "satellite": "๐Ÿ“ก", + "battery": "๐Ÿ”‹", + "electric_plug": "๐Ÿ”Œ", + "bulb": "๐Ÿ’ก", + "flashlight": "๐Ÿ”ฆ", + "candle": "๐Ÿ•ฏ", + "wastebasket": "๐Ÿ—‘", + "oil_drum": "๐Ÿ›ข", + "money_with_wings": "๐Ÿ’ธ", + "dollar": "๐Ÿ’ต", + "yen": "๐Ÿ’ด", + "euro": "๐Ÿ’ถ", + "pound": "๐Ÿ’ท", + "moneybag": "๐Ÿ’ฐ", + "credit_card": "๐Ÿ’ณ", + "gem": "๐Ÿ’Ž", + "balance_scale": "โš–", + "wrench": "๐Ÿ”ง", + "hammer": "๐Ÿ”จ", + "hammer_and_pick": "โš’", + "hammer_and_wrench": "๐Ÿ› ", + "pick": "โ›", + "nut_and_bolt": "๐Ÿ”ฉ", + "gear": "โš™", + "chains": "โ›“", + "gun": "๐Ÿ”ซ", + "bomb": "๐Ÿ’ฃ", + "hocho": "๐Ÿ”ช", + "dagger": "๐Ÿ—ก", + "crossed_swords": "โš”", + "shield": "๐Ÿ›ก", + "smoking": "๐Ÿšฌ", + "skull_and_crossbones": "โ˜ ", + "coffin": "โšฐ", + "funeral_urn": "โšฑ", + "amphora": "๐Ÿบ", + "crystal_ball": "๐Ÿ”ฎ", + "prayer_beads": "๐Ÿ“ฟ", + "barber": "๐Ÿ’ˆ", + "alembic": "โš—", + "telescope": "๐Ÿ”ญ", + "microscope": "๐Ÿ”ฌ", + "hole": "๐Ÿ•ณ", + "pill": "๐Ÿ’Š", + "syringe": "๐Ÿ’‰", + "thermometer": "๐ŸŒก", + "label": "๐Ÿท", + "bookmark": "๐Ÿ”–", + "toilet": "๐Ÿšฝ", + "shower": "๐Ÿšฟ", + "bathtub": "๐Ÿ›", + "key": "๐Ÿ”‘", + "old_key": "๐Ÿ—", + "couch_and_lamp": "๐Ÿ›‹", + "sleeping_bed": "๐Ÿ›Œ", + "bed": "๐Ÿ›", + "door": "๐Ÿšช", + "bellhop_bell": "๐Ÿ›Ž", + "framed_picture": "๐Ÿ–ผ", + "world_map": "๐Ÿ—บ", + "parasol_on_ground": "โ›ฑ", + "moyai": "๐Ÿ—ฟ", + "shopping": "๐Ÿ›", + "shopping_cart": "๐Ÿ›’", + "balloon": "๐ŸŽˆ", + "flags": "๐ŸŽ", + "ribbon": "๐ŸŽ€", + "gift": "๐ŸŽ", + "confetti_ball": "๐ŸŽŠ", + "tada": "๐ŸŽ‰", + "dolls": "๐ŸŽŽ", + "wind_chime": "๐ŸŽ", + "crossed_flags": "๐ŸŽŒ", + "izakaya_lantern": "๐Ÿฎ", + "email": "โœ‰๏ธ", + "envelope_with_arrow": "๐Ÿ“ฉ", + "incoming_envelope": "๐Ÿ“จ", + "e-mail": "๐Ÿ“ง", + "love_letter": "๐Ÿ’Œ", + "postbox": "๐Ÿ“ฎ", + "mailbox_closed": "๐Ÿ“ช", + "mailbox": "๐Ÿ“ซ", + "mailbox_with_mail": "๐Ÿ“ฌ", + "mailbox_with_no_mail": "๐Ÿ“ญ", + "package": "๐Ÿ“ฆ", + "postal_horn": "๐Ÿ“ฏ", + "inbox_tray": "๐Ÿ“ฅ", + "outbox_tray": "๐Ÿ“ค", + "scroll": "๐Ÿ“œ", + "page_with_curl": "๐Ÿ“ƒ", + "bookmark_tabs": "๐Ÿ“‘", + "bar_chart": "๐Ÿ“Š", + "chart_with_upwards_trend": "๐Ÿ“ˆ", + "chart_with_downwards_trend": "๐Ÿ“‰", + "page_facing_up": "๐Ÿ“„", + "date": "๐Ÿ“…", + "calendar": "๐Ÿ“†", + "spiral_calendar": "๐Ÿ—“", + "card_index": "๐Ÿ“‡", + "card_file_box": "๐Ÿ—ƒ", + "ballot_box": "๐Ÿ—ณ", + "file_cabinet": "๐Ÿ—„", + "clipboard": "๐Ÿ“‹", + "spiral_notepad": "๐Ÿ—’", + "file_folder": "๐Ÿ“", + "open_file_folder": "๐Ÿ“‚", + "card_index_dividers": "๐Ÿ—‚", + "newspaper_roll": "๐Ÿ—ž", + "newspaper": "๐Ÿ“ฐ", + "notebook": "๐Ÿ““", + "closed_book": "๐Ÿ“•", + "green_book": "๐Ÿ“—", + "blue_book": "๐Ÿ“˜", + "orange_book": "๐Ÿ“™", + "notebook_with_decorative_cover": "๐Ÿ“”", + "ledger": "๐Ÿ“’", + "books": "๐Ÿ“š", + "open_book": "๐Ÿ“–", + "link": "๐Ÿ”—", + "paperclip": "๐Ÿ“Ž", + "paperclips": "๐Ÿ–‡", + "scissors": "โœ‚๏ธ", + "triangular_ruler": "๐Ÿ“", + "straight_ruler": "๐Ÿ“", + "pushpin": "๐Ÿ“Œ", + "round_pushpin": "๐Ÿ“", + "triangular_flag_on_post": "๐Ÿšฉ", + "white_flag": "๐Ÿณ", + "black_flag": "๐Ÿด", + "rainbow_flag": "๐Ÿณ๏ธโ€๐ŸŒˆ", + "closed_lock_with_key": "๐Ÿ”", + "lock": "๐Ÿ”’", + "unlock": "๐Ÿ”“", + "lock_with_ink_pen": "๐Ÿ”", + "pen": "๐Ÿ–Š", + "fountain_pen": "๐Ÿ–‹", + "black_nib": "โœ’๏ธ", + "memo": "๐Ÿ“", + "pencil2": "โœ๏ธ", + "crayon": "๐Ÿ–", + "paintbrush": "๐Ÿ–Œ", + "mag": "๐Ÿ”", + "mag_right": "๐Ÿ”Ž", + "heart": "โค๏ธ", + "yellow_heart": "๐Ÿ’›", + "green_heart": "๐Ÿ’š", + "blue_heart": "๐Ÿ’™", + "purple_heart": "๐Ÿ’œ", + "black_heart": "๐Ÿ–ค", + "broken_heart": "๐Ÿ’”", + "heavy_heart_exclamation": "โฃ", + "two_hearts": "๐Ÿ’•", + "revolving_hearts": "๐Ÿ’ž", + "heartbeat": "๐Ÿ’“", + "heartpulse": "๐Ÿ’—", + "sparkling_heart": "๐Ÿ’–", + "cupid": "๐Ÿ’˜", + "gift_heart": "๐Ÿ’", + "heart_decoration": "๐Ÿ’Ÿ", + "peace_symbol": "โ˜ฎ", + "latin_cross": "โœ", + "star_and_crescent": "โ˜ช", + "om": "๐Ÿ•‰", + "wheel_of_dharma": "โ˜ธ", + "star_of_david": "โœก", + "six_pointed_star": "๐Ÿ”ฏ", + "menorah": "๐Ÿ•Ž", + "yin_yang": "โ˜ฏ", + "orthodox_cross": "โ˜ฆ", + "place_of_worship": "๐Ÿ›", + "ophiuchus": "โ›Ž", + "aries": "โ™ˆ", + "taurus": "โ™‰", + "gemini": "โ™Š", + "cancer": "โ™‹", + "leo": "โ™Œ", + "virgo": "โ™", + "libra": "โ™Ž", + "scorpius": "โ™", + "sagittarius": "โ™", + "capricorn": "โ™‘", + "aquarius": "โ™’", + "pisces": "โ™“", + "id": "๐Ÿ†”", + "atom_symbol": "โš›", + "u7a7a": "๐Ÿˆณ", + "u5272": "๐Ÿˆน", + "radioactive": "โ˜ข", + "biohazard": "โ˜ฃ", + "mobile_phone_off": "๐Ÿ“ด", + "vibration_mode": "๐Ÿ“ณ", + "u6709": "๐Ÿˆถ", + "u7121": "๐Ÿˆš", + "u7533": "๐Ÿˆธ", + "u55b6": "๐Ÿˆบ", + "u6708": "๐Ÿˆท๏ธ", + "eight_pointed_black_star": "โœด๏ธ", + "vs": "๐Ÿ†š", + "accept": "๐Ÿ‰‘", + "white_flower": "๐Ÿ’ฎ", + "ideograph_advantage": "๐Ÿ‰", + "secret": "ใŠ™๏ธ", + "congratulations": "ใŠ—๏ธ", + "u5408": "๐Ÿˆด", + "u6e80": "๐Ÿˆต", + "u7981": "๐Ÿˆฒ", + "a": "๐Ÿ…ฐ๏ธ", + "b": "๐Ÿ…ฑ๏ธ", + "ab": "๐Ÿ†Ž", + "cl": "๐Ÿ†‘", + "o2": "๐Ÿ…พ๏ธ", + "sos": "๐Ÿ†˜", + "no_entry": "โ›”", + "name_badge": "๐Ÿ“›", + "no_entry_sign": "๐Ÿšซ", + "x": "โŒ", + "o": "โญ•", + "stop_sign": "๐Ÿ›‘", + "anger": "๐Ÿ’ข", + "hotsprings": "โ™จ๏ธ", + "no_pedestrians": "๐Ÿšท", + "do_not_litter": "๐Ÿšฏ", + "no_bicycles": "๐Ÿšณ", + "non-potable_water": "๐Ÿšฑ", + "underage": "๐Ÿ”ž", + "no_mobile_phones": "๐Ÿ“ต", + "exclamation": "โ—", + "grey_exclamation": "โ•", + "question": "โ“", + "grey_question": "โ”", + "bangbang": "โ€ผ๏ธ", + "interrobang": "โ‰๏ธ", + "low_brightness": "๐Ÿ”…", + "high_brightness": "๐Ÿ”†", + "trident": "๐Ÿ”ฑ", + "fleur_de_lis": "โšœ", + "part_alternation_mark": "ใ€ฝ๏ธ", + "warning": "โš ๏ธ", + "children_crossing": "๐Ÿšธ", + "beginner": "๐Ÿ”ฐ", + "recycle": "โ™ป๏ธ", + "u6307": "๐Ÿˆฏ", + "chart": "๐Ÿ’น", + "sparkle": "โ‡๏ธ", + "eight_spoked_asterisk": "โœณ๏ธ", + "negative_squared_cross_mark": "โŽ", + "white_check_mark": "โœ…", + "diamond_shape_with_a_dot_inside": "๐Ÿ’ ", + "cyclone": "๐ŸŒ€", + "loop": "โžฟ", + "globe_with_meridians": "๐ŸŒ", + "m": "โ“‚๏ธ", + "atm": "๐Ÿง", + "sa": "๐Ÿˆ‚๏ธ", + "passport_control": "๐Ÿ›‚", + "customs": "๐Ÿ›ƒ", + "baggage_claim": "๐Ÿ›„", + "left_luggage": "๐Ÿ›…", + "wheelchair": "โ™ฟ", + "no_smoking": "๐Ÿšญ", + "wc": "๐Ÿšพ", + "parking": "๐Ÿ…ฟ๏ธ", + "potable_water": "๐Ÿšฐ", + "mens": "๐Ÿšน", + "womens": "๐Ÿšบ", + "baby_symbol": "๐Ÿšผ", + "restroom": "๐Ÿšป", + "put_litter_in_its_place": "๐Ÿšฎ", + "cinema": "๐ŸŽฆ", + "signal_strength": "๐Ÿ“ถ", + "koko": "๐Ÿˆ", + "ng": "๐Ÿ†–", + "ok": "๐Ÿ†—", + "up": "๐Ÿ†™", + "cool": "๐Ÿ†’", + "new": "๐Ÿ†•", + "free": "๐Ÿ†“", + "zero": "0๏ธโƒฃ", + "one": "1๏ธโƒฃ", + "two": "2๏ธโƒฃ", + "three": "3๏ธโƒฃ", + "four": "4๏ธโƒฃ", + "five": "5๏ธโƒฃ", + "six": "6๏ธโƒฃ", + "seven": "7๏ธโƒฃ", + "eight": "8๏ธโƒฃ", + "nine": "9๏ธโƒฃ", + "keycap_ten": "๐Ÿ”Ÿ", + "asterisk": "*โƒฃ", + "arrow_forward": "โ–ถ๏ธ", + "pause_button": "โธ", + "next_track_button": "โญ", + "stop_button": "โน", + "record_button": "โบ", + "play_or_pause_button": "โฏ", + "previous_track_button": "โฎ", + "fast_forward": "โฉ", + "rewind": "โช", + "twisted_rightwards_arrows": "๐Ÿ”€", + "repeat": "๐Ÿ”", + "repeat_one": "๐Ÿ”‚", + "arrow_backward": "โ—€๏ธ", + "arrow_up_small": "๐Ÿ”ผ", + "arrow_down_small": "๐Ÿ”ฝ", + "arrow_double_up": "โซ", + "arrow_double_down": "โฌ", + "arrow_right": "โžก๏ธ", + "arrow_left": "โฌ…๏ธ", + "arrow_up": "โฌ†๏ธ", + "arrow_down": "โฌ‡๏ธ", + "arrow_upper_right": "โ†—๏ธ", + "arrow_lower_right": "โ†˜๏ธ", + "arrow_lower_left": "โ†™๏ธ", + "arrow_upper_left": "โ†–๏ธ", + "arrow_up_down": "โ†•๏ธ", + "left_right_arrow": "โ†”๏ธ", + "arrows_counterclockwise": "๐Ÿ”„", + "arrow_right_hook": "โ†ช๏ธ", + "leftwards_arrow_with_hook": "โ†ฉ๏ธ", + "arrow_heading_up": "โคด๏ธ", + "arrow_heading_down": "โคต๏ธ", + "hash": "#๏ธโƒฃ", + "information_source": "โ„น๏ธ", + "abc": "๐Ÿ”ค", + "abcd": "๐Ÿ”ก", + "capital_abcd": "๐Ÿ” ", + "symbols": "๐Ÿ”ฃ", + "musical_note": "๐ŸŽต", + "notes": "๐ŸŽถ", + "wavy_dash": "ใ€ฐ๏ธ", + "curly_loop": "โžฐ", + "heavy_check_mark": "โœ”๏ธ", + "arrows_clockwise": "๐Ÿ”ƒ", + "heavy_plus_sign": "โž•", + "heavy_minus_sign": "โž–", + "heavy_division_sign": "โž—", + "heavy_multiplication_x": "โœ–๏ธ", + "heavy_dollar_sign": "๐Ÿ’ฒ", + "currency_exchange": "๐Ÿ’ฑ", + "copyright": "ยฉ๏ธ", + "registered": "ยฎ๏ธ", + "tm": "โ„ข๏ธ", + "end": "๐Ÿ”š", + "back": "๐Ÿ”™", + "on": "๐Ÿ”›", + "top": "๐Ÿ”", + "soon": "๐Ÿ”œ", + "ballot_box_with_check": "โ˜‘๏ธ", + "radio_button": "๐Ÿ”˜", + "white_circle": "โšช", + "black_circle": "โšซ", + "red_circle": "๐Ÿ”ด", + "large_blue_circle": "๐Ÿ”ต", + "small_orange_diamond": "๐Ÿ”ธ", + "small_blue_diamond": "๐Ÿ”น", + "large_orange_diamond": "๐Ÿ”ถ", + "large_blue_diamond": "๐Ÿ”ท", + "small_red_triangle": "๐Ÿ”บ", + "black_small_square": "โ–ช๏ธ", + "white_small_square": "โ–ซ๏ธ", + "black_large_square": "โฌ›", + "white_large_square": "โฌœ", + "small_red_triangle_down": "๐Ÿ”ป", + "black_medium_square": "โ—ผ๏ธ", + "white_medium_square": "โ—ป๏ธ", + "black_medium_small_square": "โ—พ", + "white_medium_small_square": "โ—ฝ", + "black_square_button": "๐Ÿ”ฒ", + "white_square_button": "๐Ÿ”ณ", + "speaker": "๐Ÿ”ˆ", + "sound": "๐Ÿ”‰", + "loud_sound": "๐Ÿ”Š", + "mute": "๐Ÿ”‡", + "mega": "๐Ÿ“ฃ", + "loudspeaker": "๐Ÿ“ข", + "bell": "๐Ÿ””", + "no_bell": "๐Ÿ”•", + "black_joker": "๐Ÿƒ", + "mahjong": "๐Ÿ€„", + "spades": "โ™ ๏ธ", + "clubs": "โ™ฃ๏ธ", + "hearts": "โ™ฅ๏ธ", + "diamonds": "โ™ฆ๏ธ", + "flower_playing_cards": "๐ŸŽด", + "thought_balloon": "๐Ÿ’ญ", + "right_anger_bubble": "๐Ÿ—ฏ", + "speech_balloon": "๐Ÿ’ฌ", + "left_speech_bubble": "๐Ÿ—จ", + "clock1": "๐Ÿ•", + "clock2": "๐Ÿ•‘", + "clock3": "๐Ÿ•’", + "clock4": "๐Ÿ•“", + "clock5": "๐Ÿ•”", + "clock6": "๐Ÿ••", + "clock7": "๐Ÿ•–", + "clock8": "๐Ÿ•—", + "clock9": "๐Ÿ•˜", + "clock10": "๐Ÿ•™", + "clock11": "๐Ÿ•š", + "clock12": "๐Ÿ•›", + "clock130": "๐Ÿ•œ", + "clock230": "๐Ÿ•", + "clock330": "๐Ÿ•ž", + "clock430": "๐Ÿ•Ÿ", + "clock530": "๐Ÿ• ", + "clock630": "๐Ÿ•ก", + "clock730": "๐Ÿ•ข", + "clock830": "๐Ÿ•ฃ", + "clock930": "๐Ÿ•ค", + "clock1030": "๐Ÿ•ฅ", + "clock1130": "๐Ÿ•ฆ", + "clock1230": "๐Ÿ•ง", + "afghanistan": "๐Ÿ‡ฆ๐Ÿ‡ซ", + "aland_islands": "๐Ÿ‡ฆ๐Ÿ‡ฝ", + "albania": "๐Ÿ‡ฆ๐Ÿ‡ฑ", + "algeria": "๐Ÿ‡ฉ๐Ÿ‡ฟ", + "american_samoa": "๐Ÿ‡ฆ๐Ÿ‡ธ", + "andorra": "๐Ÿ‡ฆ๐Ÿ‡ฉ", + "angola": "๐Ÿ‡ฆ๐Ÿ‡ด", + "anguilla": "๐Ÿ‡ฆ๐Ÿ‡ฎ", + "antarctica": "๐Ÿ‡ฆ๐Ÿ‡ถ", + "antigua_barbuda": "๐Ÿ‡ฆ๐Ÿ‡ฌ", + "argentina": "๐Ÿ‡ฆ๐Ÿ‡ท", + "armenia": "๐Ÿ‡ฆ๐Ÿ‡ฒ", + "aruba": "๐Ÿ‡ฆ๐Ÿ‡ผ", + "australia": "๐Ÿ‡ฆ๐Ÿ‡บ", + "austria": "๐Ÿ‡ฆ๐Ÿ‡น", + "azerbaijan": "๐Ÿ‡ฆ๐Ÿ‡ฟ", + "bahamas": "๐Ÿ‡ง๐Ÿ‡ธ", + "bahrain": "๐Ÿ‡ง๐Ÿ‡ญ", + "bangladesh": "๐Ÿ‡ง๐Ÿ‡ฉ", + "barbados": "๐Ÿ‡ง๐Ÿ‡ง", + "belarus": "๐Ÿ‡ง๐Ÿ‡พ", + "belgium": "๐Ÿ‡ง๐Ÿ‡ช", + "belize": "๐Ÿ‡ง๐Ÿ‡ฟ", + "benin": "๐Ÿ‡ง๐Ÿ‡ฏ", + "bermuda": "๐Ÿ‡ง๐Ÿ‡ฒ", + "bhutan": "๐Ÿ‡ง๐Ÿ‡น", + "bolivia": "๐Ÿ‡ง๐Ÿ‡ด", + "caribbean_netherlands": "๐Ÿ‡ง๐Ÿ‡ถ", + "bosnia_herzegovina": "๐Ÿ‡ง๐Ÿ‡ฆ", + "botswana": "๐Ÿ‡ง๐Ÿ‡ผ", + "brazil": "๐Ÿ‡ง๐Ÿ‡ท", + "british_indian_ocean_territory": "๐Ÿ‡ฎ๐Ÿ‡ด", + "british_virgin_islands": "๐Ÿ‡ป๐Ÿ‡ฌ", + "brunei": "๐Ÿ‡ง๐Ÿ‡ณ", + "bulgaria": "๐Ÿ‡ง๐Ÿ‡ฌ", + "burkina_faso": "๐Ÿ‡ง๐Ÿ‡ซ", + "burundi": "๐Ÿ‡ง๐Ÿ‡ฎ", + "cape_verde": "๐Ÿ‡จ๐Ÿ‡ป", + "cambodia": "๐Ÿ‡ฐ๐Ÿ‡ญ", + "cameroon": "๐Ÿ‡จ๐Ÿ‡ฒ", + "canada": "๐Ÿ‡จ๐Ÿ‡ฆ", + "canary_islands": "๐Ÿ‡ฎ๐Ÿ‡จ", + "cayman_islands": "๐Ÿ‡ฐ๐Ÿ‡พ", + "central_african_republic": "๐Ÿ‡จ๐Ÿ‡ซ", + "chad": "๐Ÿ‡น๐Ÿ‡ฉ", + "chile": "๐Ÿ‡จ๐Ÿ‡ฑ", + "cn": "๐Ÿ‡จ๐Ÿ‡ณ", + "christmas_island": "๐Ÿ‡จ๐Ÿ‡ฝ", + "cocos_islands": "๐Ÿ‡จ๐Ÿ‡จ", + "colombia": "๐Ÿ‡จ๐Ÿ‡ด", + "comoros": "๐Ÿ‡ฐ๐Ÿ‡ฒ", + "congo_brazzaville": "๐Ÿ‡จ๐Ÿ‡ฌ", + "congo_kinshasa": "๐Ÿ‡จ๐Ÿ‡ฉ", + "cook_islands": "๐Ÿ‡จ๐Ÿ‡ฐ", + "costa_rica": "๐Ÿ‡จ๐Ÿ‡ท", + "croatia": "๐Ÿ‡ญ๐Ÿ‡ท", + "cuba": "๐Ÿ‡จ๐Ÿ‡บ", + "curacao": "๐Ÿ‡จ๐Ÿ‡ผ", + "cyprus": "๐Ÿ‡จ๐Ÿ‡พ", + "czech_republic": "๐Ÿ‡จ๐Ÿ‡ฟ", + "denmark": "๐Ÿ‡ฉ๐Ÿ‡ฐ", + "djibouti": "๐Ÿ‡ฉ๐Ÿ‡ฏ", + "dominica": "๐Ÿ‡ฉ๐Ÿ‡ฒ", + "dominican_republic": "๐Ÿ‡ฉ๐Ÿ‡ด", + "ecuador": "๐Ÿ‡ช๐Ÿ‡จ", + "egypt": "๐Ÿ‡ช๐Ÿ‡ฌ", + "el_salvador": "๐Ÿ‡ธ๐Ÿ‡ป", + "equatorial_guinea": "๐Ÿ‡ฌ๐Ÿ‡ถ", + "eritrea": "๐Ÿ‡ช๐Ÿ‡ท", + "estonia": "๐Ÿ‡ช๐Ÿ‡ช", + "ethiopia": "๐Ÿ‡ช๐Ÿ‡น", + "eu": "๐Ÿ‡ช๐Ÿ‡บ", + "falkland_islands": "๐Ÿ‡ซ๐Ÿ‡ฐ", + "faroe_islands": "๐Ÿ‡ซ๐Ÿ‡ด", + "fiji": "๐Ÿ‡ซ๐Ÿ‡ฏ", + "finland": "๐Ÿ‡ซ๐Ÿ‡ฎ", + "fr": "๐Ÿ‡ซ๐Ÿ‡ท", + "french_guiana": "๐Ÿ‡ฌ๐Ÿ‡ซ", + "french_polynesia": "๐Ÿ‡ต๐Ÿ‡ซ", + "french_southern_territories": "๐Ÿ‡น๐Ÿ‡ซ", + "gabon": "๐Ÿ‡ฌ๐Ÿ‡ฆ", + "gambia": "๐Ÿ‡ฌ๐Ÿ‡ฒ", + "georgia": "๐Ÿ‡ฌ๐Ÿ‡ช", + "de": "๐Ÿ‡ฉ๐Ÿ‡ช", + "ghana": "๐Ÿ‡ฌ๐Ÿ‡ญ", + "gibraltar": "๐Ÿ‡ฌ๐Ÿ‡ฎ", + "greece": "๐Ÿ‡ฌ๐Ÿ‡ท", + "greenland": "๐Ÿ‡ฌ๐Ÿ‡ฑ", + "grenada": "๐Ÿ‡ฌ๐Ÿ‡ฉ", + "guadeloupe": "๐Ÿ‡ฌ๐Ÿ‡ต", + "guam": "๐Ÿ‡ฌ๐Ÿ‡บ", + "guatemala": "๐Ÿ‡ฌ๐Ÿ‡น", + "guernsey": "๐Ÿ‡ฌ๐Ÿ‡ฌ", + "guinea": "๐Ÿ‡ฌ๐Ÿ‡ณ", + "guinea_bissau": "๐Ÿ‡ฌ๐Ÿ‡ผ", + "guyana": "๐Ÿ‡ฌ๐Ÿ‡พ", + "haiti": "๐Ÿ‡ญ๐Ÿ‡น", + "honduras": "๐Ÿ‡ญ๐Ÿ‡ณ", + "hong_kong": "๐Ÿ‡ญ๐Ÿ‡ฐ", + "hungary": "๐Ÿ‡ญ๐Ÿ‡บ", + "iceland": "๐Ÿ‡ฎ๐Ÿ‡ธ", + "india": "๐Ÿ‡ฎ๐Ÿ‡ณ", + "indonesia": "๐Ÿ‡ฎ๐Ÿ‡ฉ", + "iran": "๐Ÿ‡ฎ๐Ÿ‡ท", + "iraq": "๐Ÿ‡ฎ๐Ÿ‡ถ", + "ireland": "๐Ÿ‡ฎ๐Ÿ‡ช", + "isle_of_man": "๐Ÿ‡ฎ๐Ÿ‡ฒ", + "israel": "๐Ÿ‡ฎ๐Ÿ‡ฑ", + "it": "๐Ÿ‡ฎ๐Ÿ‡น", + "cote_divoire": "๐Ÿ‡จ๐Ÿ‡ฎ", + "jamaica": "๐Ÿ‡ฏ๐Ÿ‡ฒ", + "jp": "๐Ÿ‡ฏ๐Ÿ‡ต", + "jersey": "๐Ÿ‡ฏ๐Ÿ‡ช", + "jordan": "๐Ÿ‡ฏ๐Ÿ‡ด", + "kazakhstan": "๐Ÿ‡ฐ๐Ÿ‡ฟ", + "kenya": "๐Ÿ‡ฐ๐Ÿ‡ช", + "kiribati": "๐Ÿ‡ฐ๐Ÿ‡ฎ", + "kosovo": "๐Ÿ‡ฝ๐Ÿ‡ฐ", + "kuwait": "๐Ÿ‡ฐ๐Ÿ‡ผ", + "kyrgyzstan": "๐Ÿ‡ฐ๐Ÿ‡ฌ", + "laos": "๐Ÿ‡ฑ๐Ÿ‡ฆ", + "latvia": "๐Ÿ‡ฑ๐Ÿ‡ป", + "lebanon": "๐Ÿ‡ฑ๐Ÿ‡ง", + "lesotho": "๐Ÿ‡ฑ๐Ÿ‡ธ", + "liberia": "๐Ÿ‡ฑ๐Ÿ‡ท", + "libya": "๐Ÿ‡ฑ๐Ÿ‡พ", + "liechtenstein": "๐Ÿ‡ฑ๐Ÿ‡ฎ", + "lithuania": "๐Ÿ‡ฑ๐Ÿ‡น", + "luxembourg": "๐Ÿ‡ฑ๐Ÿ‡บ", + "macau": "๐Ÿ‡ฒ๐Ÿ‡ด", + "macedonia": "๐Ÿ‡ฒ๐Ÿ‡ฐ", + "madagascar": "๐Ÿ‡ฒ๐Ÿ‡ฌ", + "malawi": "๐Ÿ‡ฒ๐Ÿ‡ผ", + "malaysia": "๐Ÿ‡ฒ๐Ÿ‡พ", + "maldives": "๐Ÿ‡ฒ๐Ÿ‡ป", + "mali": "๐Ÿ‡ฒ๐Ÿ‡ฑ", + "malta": "๐Ÿ‡ฒ๐Ÿ‡น", + "marshall_islands": "๐Ÿ‡ฒ๐Ÿ‡ญ", + "martinique": "๐Ÿ‡ฒ๐Ÿ‡ถ", + "mauritania": "๐Ÿ‡ฒ๐Ÿ‡ท", + "mauritius": "๐Ÿ‡ฒ๐Ÿ‡บ", + "mayotte": "๐Ÿ‡พ๐Ÿ‡น", + "mexico": "๐Ÿ‡ฒ๐Ÿ‡ฝ", + "micronesia": "๐Ÿ‡ซ๐Ÿ‡ฒ", + "moldova": "๐Ÿ‡ฒ๐Ÿ‡ฉ", + "monaco": "๐Ÿ‡ฒ๐Ÿ‡จ", + "mongolia": "๐Ÿ‡ฒ๐Ÿ‡ณ", + "montenegro": "๐Ÿ‡ฒ๐Ÿ‡ช", + "montserrat": "๐Ÿ‡ฒ๐Ÿ‡ธ", + "morocco": "๐Ÿ‡ฒ๐Ÿ‡ฆ", + "mozambique": "๐Ÿ‡ฒ๐Ÿ‡ฟ", + "myanmar": "๐Ÿ‡ฒ๐Ÿ‡ฒ", + "namibia": "๐Ÿ‡ณ๐Ÿ‡ฆ", + "nauru": "๐Ÿ‡ณ๐Ÿ‡ท", + "nepal": "๐Ÿ‡ณ๐Ÿ‡ต", + "netherlands": "๐Ÿ‡ณ๐Ÿ‡ฑ", + "new_caledonia": "๐Ÿ‡ณ๐Ÿ‡จ", + "new_zealand": "๐Ÿ‡ณ๐Ÿ‡ฟ", + "nicaragua": "๐Ÿ‡ณ๐Ÿ‡ฎ", + "niger": "๐Ÿ‡ณ๐Ÿ‡ช", + "nigeria": "๐Ÿ‡ณ๐Ÿ‡ฌ", + "niue": "๐Ÿ‡ณ๐Ÿ‡บ", + "norfolk_island": "๐Ÿ‡ณ๐Ÿ‡ซ", + "northern_mariana_islands": "๐Ÿ‡ฒ๐Ÿ‡ต", + "north_korea": "๐Ÿ‡ฐ๐Ÿ‡ต", + "norway": "๐Ÿ‡ณ๐Ÿ‡ด", + "oman": "๐Ÿ‡ด๐Ÿ‡ฒ", + "pakistan": "๐Ÿ‡ต๐Ÿ‡ฐ", + "palau": "๐Ÿ‡ต๐Ÿ‡ผ", + "palestinian_territories": "๐Ÿ‡ต๐Ÿ‡ธ", + "panama": "๐Ÿ‡ต๐Ÿ‡ฆ", + "papua_new_guinea": "๐Ÿ‡ต๐Ÿ‡ฌ", + "paraguay": "๐Ÿ‡ต๐Ÿ‡พ", + "peru": "๐Ÿ‡ต๐Ÿ‡ช", + "philippines": "๐Ÿ‡ต๐Ÿ‡ญ", + "pitcairn_islands": "๐Ÿ‡ต๐Ÿ‡ณ", + "poland": "๐Ÿ‡ต๐Ÿ‡ฑ", + "portugal": "๐Ÿ‡ต๐Ÿ‡น", + "puerto_rico": "๐Ÿ‡ต๐Ÿ‡ท", + "qatar": "๐Ÿ‡ถ๐Ÿ‡ฆ", + "reunion": "๐Ÿ‡ท๐Ÿ‡ช", + "romania": "๐Ÿ‡ท๐Ÿ‡ด", + "ru": "๐Ÿ‡ท๐Ÿ‡บ", + "rwanda": "๐Ÿ‡ท๐Ÿ‡ผ", + "st_barthelemy": "๐Ÿ‡ง๐Ÿ‡ฑ", + "st_helena": "๐Ÿ‡ธ๐Ÿ‡ญ", + "st_kitts_nevis": "๐Ÿ‡ฐ๐Ÿ‡ณ", + "st_lucia": "๐Ÿ‡ฑ๐Ÿ‡จ", + "st_pierre_miquelon": "๐Ÿ‡ต๐Ÿ‡ฒ", + "st_vincent_grenadines": "๐Ÿ‡ป๐Ÿ‡จ", + "samoa": "๐Ÿ‡ผ๐Ÿ‡ธ", + "san_marino": "๐Ÿ‡ธ๐Ÿ‡ฒ", + "sao_tome_principe": "๐Ÿ‡ธ๐Ÿ‡น", + "saudi_arabia": "๐Ÿ‡ธ๐Ÿ‡ฆ", + "senegal": "๐Ÿ‡ธ๐Ÿ‡ณ", + "serbia": "๐Ÿ‡ท๐Ÿ‡ธ", + "seychelles": "๐Ÿ‡ธ๐Ÿ‡จ", + "sierra_leone": "๐Ÿ‡ธ๐Ÿ‡ฑ", + "singapore": "๐Ÿ‡ธ๐Ÿ‡ฌ", + "sint_maarten": "๐Ÿ‡ธ๐Ÿ‡ฝ", + "slovakia": "๐Ÿ‡ธ๐Ÿ‡ฐ", + "slovenia": "๐Ÿ‡ธ๐Ÿ‡ฎ", + "solomon_islands": "๐Ÿ‡ธ๐Ÿ‡ง", + "somalia": "๐Ÿ‡ธ๐Ÿ‡ด", + "south_africa": "๐Ÿ‡ฟ๐Ÿ‡ฆ", + "south_georgia_south_sandwich_islands": "๐Ÿ‡ฌ๐Ÿ‡ธ", + "kr": "๐Ÿ‡ฐ๐Ÿ‡ท", + "south_sudan": "๐Ÿ‡ธ๐Ÿ‡ธ", + "es": "๐Ÿ‡ช๐Ÿ‡ธ", + "sri_lanka": "๐Ÿ‡ฑ๐Ÿ‡ฐ", + "sudan": "๐Ÿ‡ธ๐Ÿ‡ฉ", + "suriname": "๐Ÿ‡ธ๐Ÿ‡ท", + "swaziland": "๐Ÿ‡ธ๐Ÿ‡ฟ", + "sweden": "๐Ÿ‡ธ๐Ÿ‡ช", + "switzerland": "๐Ÿ‡จ๐Ÿ‡ญ", + "syria": "๐Ÿ‡ธ๐Ÿ‡พ", + "taiwan": "๐Ÿ‡น๐Ÿ‡ผ", + "tajikistan": "๐Ÿ‡น๐Ÿ‡ฏ", + "tanzania": "๐Ÿ‡น๐Ÿ‡ฟ", + "thailand": "๐Ÿ‡น๐Ÿ‡ญ", + "timor_leste": "๐Ÿ‡น๐Ÿ‡ฑ", + "togo": "๐Ÿ‡น๐Ÿ‡ฌ", + "tokelau": "๐Ÿ‡น๐Ÿ‡ฐ", + "tonga": "๐Ÿ‡น๐Ÿ‡ด", + "trinidad_tobago": "๐Ÿ‡น๐Ÿ‡น", + "tunisia": "๐Ÿ‡น๐Ÿ‡ณ", + "tr": "๐Ÿ‡น๐Ÿ‡ท", + "turkmenistan": "๐Ÿ‡น๐Ÿ‡ฒ", + "turks_caicos_islands": "๐Ÿ‡น๐Ÿ‡จ", + "tuvalu": "๐Ÿ‡น๐Ÿ‡ป", + "uganda": "๐Ÿ‡บ๐Ÿ‡ฌ", + "ukraine": "๐Ÿ‡บ๐Ÿ‡ฆ", + "united_arab_emirates": "๐Ÿ‡ฆ๐Ÿ‡ช", + "uk": "๐Ÿ‡ฌ๐Ÿ‡ง", + "us": "๐Ÿ‡บ๐Ÿ‡ธ", + "us_virgin_islands": "๐Ÿ‡ป๐Ÿ‡ฎ", + "uruguay": "๐Ÿ‡บ๐Ÿ‡พ", + "uzbekistan": "๐Ÿ‡บ๐Ÿ‡ฟ", + "vanuatu": "๐Ÿ‡ป๐Ÿ‡บ", + "vatican_city": "๐Ÿ‡ป๐Ÿ‡ฆ", + "venezuela": "๐Ÿ‡ป๐Ÿ‡ช", + "vietnam": "๐Ÿ‡ป๐Ÿ‡ณ", + "wallis_futuna": "๐Ÿ‡ผ๐Ÿ‡ซ", + "western_sahara": "๐Ÿ‡ช๐Ÿ‡ญ", + "yemen": "๐Ÿ‡พ๐Ÿ‡ช", + "zambia": "๐Ÿ‡ฟ๐Ÿ‡ฒ", + "zimbabwe": "๐Ÿ‡ฟ๐Ÿ‡ผ" +} \ No newline at end of file diff --git a/client/js/lounge.js b/client/js/lounge.js index e9b78f2f..5c44ba3a 100644 --- a/client/js/lounge.js +++ b/client/js/lounge.js @@ -2,12 +2,14 @@ // vendor libraries require("jquery-ui/ui/widgets/sortable"); +require("jquery-textcomplete"); const $ = require("jquery"); const moment = require("moment"); const Mousetrap = require("mousetrap"); const URI = require("urijs"); // our libraries +const emojiMap = require("./libs/simplemap.json"); require("./libs/jquery/inputhistory"); require("./libs/jquery/stickyscroll"); require("./libs/jquery/tabcomplete"); @@ -41,6 +43,80 @@ $(function() { var favicon = $("#favicon"); + // Autocompletion Strategies + + var emojiStrategy = { + id: "emoji", + match: /\B:([-+\w]*)$/, + search: function(term, callback) { + callback($.map(Object.keys(emojiMap), function(e) { + return e.indexOf(term) === 0 ? e : null; + })); + }, + template: function(value) { + return `${emojiMap[value]} ${value}`; + }, + replace: function(value) { + return emojiMap[value]; + }, + index: 1 + }; + + var nicksStrategy = { + id: "nicks", + match: /\B(@([a-zA-Z_[\]\\^{}|`@][a-zA-Z0-9_[\]\\^{}|`-]*)?)$/, + search: function(term, callback) { + term = term.slice(1); + if (term[0] === "@") { + callback(completeNicks(term.slice(1)).map(function(val) { + return "@" + val; + })); + } else { + callback(completeNicks(term)); + } + }, + template: function(value) { + if (value[0] === "@") { + return value; + } + return "@" + value; + }, + replace: function(value) { + return value; + }, + index: 1 + }; + + var chanStrategy = { + id: "chans", + match: /\B((#|\+|&|![A-Z0-9]{5})([^\x00\x0A\x0D\x20\x2C\x3A]+(:[^\x00\x0A\x0D\x20\x2C\x3A]*)?)?)$/, + search: function(term, callback, match) { + callback(completeChans(match[0])); + }, + template: function(value) { + return value; + }, + replace: function(value) { + return value; + }, + index: 1 + }; + + var commandStrategy = { + id: "commands", + match: /^\/(\w*)$/, + search: function(term, callback) { + callback(completeCommands("/" + term)); + }, + template: function(value) { + return value; + }, + replace: function(value) { + return value; + }, + index: 1 + }; + socket.on("auth", function(data) { var login = $("#sign-in"); var token; @@ -638,7 +714,18 @@ $(function() { chat.find(".chan.active .chat").trigger("msg.sticky"); // fix growing }) - .tab(complete, {hint: false}); + .tab(completeNicks, {hint: false}) + .textcomplete([emojiStrategy, nicksStrategy, chanStrategy, commandStrategy], { + dropdownClassName: "textcomplete-menu", + placement: "top" + }).on({ + "textComplete:show": function() { + $(this).data("autocompleting", true); + }, + "textComplete:hide": function() { + $(this).data("autocompleting", false); + } + }); var focus = $.noop; if (!("ontouchstart" in window || navigator.maxTouchPoints > 0)) { @@ -1272,14 +1359,31 @@ $(function() { .find(".messages .msg, .date-marker").remove(); } - function complete(word) { - var words = constants.commands.slice(); + function completeNicks(word) { var users = chat.find(".active").find(".users"); - var nicks = users.data("nicks"); + var words = users.data("nicks"); - for (var i in nicks) { - words.push(nicks[i]); - } + return $.grep( + words, + function(w) { + return !w.toLowerCase().indexOf(word.toLowerCase()); + } + ); + } + + function completeCommands(word) { + var words = constants.commands.slice(); + + return $.grep( + words, + function(w) { + return !w.toLowerCase().indexOf(word.toLowerCase()); + } + ); + } + + function completeChans(word) { + var words = []; sidebar.find(".chan") .each(function() { diff --git a/package.json b/package.json index 447d0e43..6f31a1c6 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "express-handlebars": "3.0.0", "fs-extra": "2.1.2", "irc-framework": "2.8.0", + "json-loader": "0.5.4", "ldapjs": "1.0.1", "lodash": "4.17.4", "moment": "2.18.1", @@ -68,6 +69,7 @@ "handlebars": "4.0.6", "handlebars-loader": "1.5.0", "jquery": "3.2.1", + "jquery-textcomplete": "1.8.0", "jquery-ui": "1.12.1", "mocha": "3.3.0", "mousetrap": "1.6.1", diff --git a/webpack.config.js b/webpack.config.js index b54015cb..fb9e2fbf 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -13,6 +13,7 @@ let config = { "js/bundle.vendor.js": [ "handlebars/runtime", "jquery", + "jquery-textcomplete", "jquery-ui/ui/widgets/sortable", "moment", "mousetrap", @@ -46,6 +47,10 @@ let config = { } } }, + { + test: /\.json$/, + loader: "json-loader" + }, { test: /\.tpl$/, include: [ From 7229e0dda4d3565e78dd55eef4e9aa4de293d270 Mon Sep 17 00:00:00 2001 From: Yash Srivastav Date: Mon, 12 Dec 2016 05:12:33 +0530 Subject: [PATCH 2/5] Disable history completion during emoji completion --- client/js/libs/jquery/inputhistory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/js/libs/jquery/inputhistory.js b/client/js/libs/jquery/inputhistory.js index 778fa696..d6f98360 100644 --- a/client/js/libs/jquery/inputhistory.js +++ b/client/js/libs/jquery/inputhistory.js @@ -56,7 +56,7 @@ import jQuery from "jquery"; case 38: // Up case 40: // Down // NOTICE: This is specific to The Lounge. - if (e.ctrlKey || e.metaKey) { + if (e.ctrlKey || e.metaKey || self.data("autocompleting")) { break; } From 29d8bc9d3da29bac49f1d978eb8768744a1ab43e Mon Sep 17 00:00:00 2001 From: Yash Srivastav Date: Wed, 29 Mar 2017 11:05:40 +0530 Subject: [PATCH 3/5] Add Help for autocompletion --- client/index.html | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/client/index.html b/client/index.html index 1b40bfce..af4d3bcd 100644 --- a/client/index.html +++ b/client/index.html @@ -532,6 +532,48 @@ +

Autocompletion

+ +

Start typing the following characters followed by any letter to + trigger the autocompletion dropdown:

+ +
+
+ @ +
+
+

Nickname

+
+
+ +
+
+ # +
+
+

Chan

+
+
+ +
+
+ / +
+
+

Commands (see list of commands below)

+
+
+ +
+
+ : +
+
+

Emoji

+
+
+ +

Commands

All commands can be autocompleted with tab.

From e000ba45dfb594dfdf8dada5155ab6af30be21b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Astori?= Date: Tue, 25 Apr 2017 01:01:24 +0200 Subject: [PATCH 4/5] Improve details of emoji/chan/nick/command autocompletion - Make dropdown items match context menu items - Disable transparency on dropdown item links - Clean up help page additions - Better align help page autocompletion characters - Use ES6 features (`const`, arrow functions, method definition shorthands) - Use `Array#filter` instead of `$.map` - Do not display `@` in nick completion *when* only one `@` is used (to be less confusing and more consistent) --- client/css/style.css | 16 ++++------- client/index.html | 15 +++++----- client/js/lounge.js | 67 ++++++++++++++++++-------------------------- 3 files changed, 40 insertions(+), 58 deletions(-) diff --git a/client/css/style.css b/client/css/style.css index 522b319d..29323197 100644 --- a/client/css/style.css +++ b/client/css/style.css @@ -1338,8 +1338,7 @@ kbd { #help .help-item .subject { white-space: nowrap; - padding-right: 10px; - min-width: 150px; + padding-right: 15px; } #help .help-item .description p { @@ -1528,19 +1527,14 @@ kbd { display: inline-block; } -.textcomplete-item { - border-bottom-color: rgba(0, 0, 0, .1); - border-bottom-style: solid; - border-bottom-width: 1px; - margin-top: 0; - margin-bottom: 0; - padding: 10px 8px; -} - .textcomplete-item a { color: #333; } +.textcomplete-item a:hover { + opacity: 1; +} + .textcomplete-item .emoji { margin-right: 8px; width: 16px; diff --git a/client/index.html b/client/index.html index af4d3bcd..5103e0ba 100644 --- a/client/index.html +++ b/client/index.html @@ -534,15 +534,17 @@

Autocompletion

-

Start typing the following characters followed by any letter to - trigger the autocompletion dropdown:

+

+ Start typing the following characters followed by any letter to + trigger the autocompletion dropdown: +

@
-

Nickname

+

Nickname

@@ -551,7 +553,7 @@ #
-

Chan

+

Channel

@@ -560,7 +562,7 @@ /
-

Commands (see list of commands below)

+

Commands (see list of commands below)

@@ -569,11 +571,10 @@ :
-

Emoji

+

Emoji

-

Commands

All commands can be autocompleted with tab.

diff --git a/client/js/lounge.js b/client/js/lounge.js index 5c44ba3a..327808dd 100644 --- a/client/js/lounge.js +++ b/client/js/lounge.js @@ -45,73 +45,66 @@ $(function() { // Autocompletion Strategies - var emojiStrategy = { + const emojiStrategy = { id: "emoji", match: /\B:([-+\w]*)$/, - search: function(term, callback) { - callback($.map(Object.keys(emojiMap), function(e) { - return e.indexOf(term) === 0 ? e : null; - })); + search(term, callback) { + callback(Object.keys(emojiMap).filter(name => name.indexOf(term) === 0)); }, - template: function(value) { + template(value) { return `${emojiMap[value]} ${value}`; }, - replace: function(value) { + replace(value) { return emojiMap[value]; }, index: 1 }; - var nicksStrategy = { + const nicksStrategy = { id: "nicks", match: /\B(@([a-zA-Z_[\]\\^{}|`@][a-zA-Z0-9_[\]\\^{}|`-]*)?)$/, - search: function(term, callback) { + search(term, callback) { term = term.slice(1); if (term[0] === "@") { - callback(completeNicks(term.slice(1)).map(function(val) { - return "@" + val; - })); + callback(completeNicks(term.slice(1)).map(val => "@" + val)); } else { callback(completeNicks(term)); } }, - template: function(value) { - if (value[0] === "@") { - return value; - } - return "@" + value; + template(value) { + return value; }, - replace: function(value) { + replace(value) { return value; }, index: 1 }; - var chanStrategy = { + const chanStrategy = { id: "chans", match: /\B((#|\+|&|![A-Z0-9]{5})([^\x00\x0A\x0D\x20\x2C\x3A]+(:[^\x00\x0A\x0D\x20\x2C\x3A]*)?)?)$/, - search: function(term, callback, match) { + search(term, callback, match) { callback(completeChans(match[0])); }, - template: function(value) { + template(value) { return value; }, - replace: function(value) { + replace(value) { return value; }, index: 1 }; - var commandStrategy = { + const commandStrategy = { id: "commands", match: /^\/(\w*)$/, - search: function(term, callback) { + search(term, callback) { callback(completeCommands("/" + term)); }, - template: function(value) { + template(value) { return value; }, - replace: function(value) { + replace(value) { return value; }, index: 1 @@ -1360,34 +1353,30 @@ $(function() { } function completeNicks(word) { - var users = chat.find(".active").find(".users"); - var words = users.data("nicks"); + const users = chat.find(".active").find(".users"); + const words = users.data("nicks"); return $.grep( words, - function(w) { - return !w.toLowerCase().indexOf(word.toLowerCase()); - } + w => !w.toLowerCase().indexOf(word.toLowerCase()) ); } function completeCommands(word) { - var words = constants.commands.slice(); + const words = constants.commands.slice(); return $.grep( words, - function(w) { - return !w.toLowerCase().indexOf(word.toLowerCase()); - } + w => !w.toLowerCase().indexOf(word.toLowerCase()) ); } function completeChans(word) { - var words = []; + const words = []; sidebar.find(".chan") .each(function() { - var self = $(this); + const self = $(this); if (!self.hasClass("lobby")) { words.push(self.data("title")); } @@ -1395,9 +1384,7 @@ $(function() { return $.grep( words, - function(w) { - return !w.toLowerCase().indexOf(word.toLowerCase()); - } + w => !w.toLowerCase().indexOf(word.toLowerCase()) ); } From 5c3e15e17c0dc4a608f1a7f98bb8ff6dcbef7c54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Astori?= Date: Tue, 25 Apr 2017 22:31:37 +0200 Subject: [PATCH 5/5] Remove json-loader, unnecessary with Webpack v2 See these notes: - https://webpack.js.org/guides/migrating/#json-loader-is-not-required-anymore - https://github.com/webpack-contrib/json-loader#json-loader --- package.json | 1 - webpack.config.js | 4 ---- 2 files changed, 5 deletions(-) diff --git a/package.json b/package.json index 6f31a1c6..fc8693d7 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,6 @@ "express-handlebars": "3.0.0", "fs-extra": "2.1.2", "irc-framework": "2.8.0", - "json-loader": "0.5.4", "ldapjs": "1.0.1", "lodash": "4.17.4", "moment": "2.18.1", diff --git a/webpack.config.js b/webpack.config.js index fb9e2fbf..0cdd6833 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -47,10 +47,6 @@ let config = { } } }, - { - test: /\.json$/, - loader: "json-loader" - }, { test: /\.tpl$/, include: [