@banta/sdk 4.6.24 → 4.6.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/banta-sdk.umd.js +15 -7
- package/bundles/banta-sdk.umd.js.map +1 -1
- package/bundles/banta-sdk.umd.min.js +1 -1
- package/bundles/banta-sdk.umd.min.js.map +1 -1
- package/esm2015/lib/chat/banta-chat/banta-chat.component.js +7 -4
- package/esm2015/lib/emoji/emoji-selector-button.component.js +9 -5
- package/fesm2015/banta-sdk.js +13 -6
- package/fesm2015/banta-sdk.js.map +1 -1
- package/lib/chat/banta-chat/banta-chat.component.d.ts +2 -0
- package/lib/emoji/emoji-selector-button.component.d.ts +2 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../projects/sdk/src/lib/common/timestamp.component.ts","../../../projects/sdk/src/lib/common/lightbox/lightbox.component.ts","../../../projects/sdk/src/lib/common/markdown-to-html.pipe.ts","../../../projects/sdk/src/lib/common/trust-resource-url.pipe.ts","../../../projects/sdk/src/lib/common/mention-linker.pipe.ts","../../../projects/sdk/src/lib/common/attachment/attachment.component.ts","../../../projects/sdk/src/lib/common/attachments/attachments.component.ts","../../../projects/sdk/src/lib/common/common.module.ts","../../../node_modules/tslib/tslib.es6.js","../../../projects/sdk/src/lib/emoji/emojis.ts","../../../projects/sdk/src/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.ts","../../../projects/sdk/src/lib/emoji/emoji-selector-button.component.ts","../../../projects/sdk/src/lib/emoji/emoji.module.ts","../../../projects/sdk/src/lib/chat-backend-base.ts","../../../projects/sdk/src/lib/banta/banta.component.ts","../../../projects/sdk/src/lib/banta-logo.component.ts","../../../projects/sdk/src/lib/chat/chat-message/chat-message.component.ts","../../../projects/sdk/src/lib/chat/live-chat-message.component.ts","../../../projects/sdk/src/lib/chat/chat-view/chat-view.component.ts","../../../projects/sdk/src/lib/chat/banta-chat/banta-chat.component.ts","../../../projects/sdk/src/lib/chat/chat.module.ts","../../../projects/sdk/src/lib/live-message.component.ts","../../../projects/sdk/src/lib/comments/comment/comment.component.ts","../../../projects/sdk/src/lib/comments/comment-view/comment-view.component.ts","../../../projects/sdk/src/lib/comments/reply-send-options.directive.ts","../../../projects/sdk/src/lib/comments/banta-comments/banta-comments.component.ts","../../../projects/sdk/src/lib/comments/live-comment.component.ts","../../../projects/sdk/src/lib/comments/comment-field/comment-field.component.ts","../../../projects/sdk/src/lib/comments/comment-sort/comment-sort.component.ts","../../../projects/sdk/src/lib/comments/attachment-button/attachment-button.component.ts","../../../projects/sdk/src/lib/comments/attachment-scraper.directive.ts","../../../projects/sdk/src/lib/comments/comments.module.ts","../../../projects/sdk/src/lib/chat-source.ts","../../../projects/sdk/src/lib/sdk-options.ts","../../../projects/sdk/src/lib/chat-backend.ts","../../../projects/sdk/src/lib/url-attachments.ts","../../../projects/sdk/src/lib/youtube-attachments.ts","../../../projects/sdk/src/lib/giphy-attachments.ts","../../../projects/sdk/src/lib/tweet-attachments.ts","../../../projects/sdk/src/lib/banta-sdk.module.ts","../../../projects/sdk/src/lib/common/lazy-connection.ts"],"names":["TimestampComponent","this","relative","tooltip","updateInterval","showAbsolute","prototype","ngOnDestroy","clearInterval","Object","defineProperty","_value","v","update","_this","diff","Date","now","value","minute","hour","day","week","month","updateTime","months","Math","floor","weeks","days","hours","minutes","window","setInterval","Component","args","selector","template","Input","LightboxComponent","ngAfterViewInit","document","body","appendChild","containerElement","nativeElement","remove","close","isOpen","open","currentImage","images","ViewChild","marked.marked","use","extensions","name","level","start","src","_a","match","index","tokenizer","tokens","exec","type","raw","text","lexer","inlineTokens","trim","renderer","token","parser","parseInline","BantaMarkdownToHtmlPipe","sanitizer","marked.Renderer","headerPrefix","linkRenderer","link","href","title","call","replace","transform","bypassSecurityTrustHtml","DOMPurify.sanitize","parse","FORBID_TAGS","KEEP_CONTENT","Pipe","DomSanitizer","DOMPurify.addHook","node","setAttribute","hasAttribute","BantaTrustResourceUrlPipe","bypassSecurityTrustResourceUrl","BantaMentionLinkerPipe","links","i","max","length","mention","RegExp","escapeRegExp","formatLink","external","string","BantaAttachmentComponent","elementRef","loading","editing","loadingMessage","error","errorMessage","removed","Subject","activated","loaded","_viewLoaded","_attachment","checkLoad","ngOnInit","setTimeout","widgets","load","next","activate","_b","attachment","transientState","url","startsWith","card","player","ElementRef","Output","HostBinding","BantaAttachmentsComponent","loadedAttachments","WeakMap","markAttachmentLoaded","set","allAttachmentsLoaded","isAttachmentLoaded","has","attachments","every","x","removeAttachment","isImageAttachment","isCardAttachment","includes","showLightbox","image","lightbox","filter","map","style","attachmentId","COMPONENTS","NgModule","declarations","imports","CommonModule","MatIconModule","MatProgressSpinnerModule","MatButtonModule","exports","extendStatics","d","b","setPrototypeOf","__proto__","Array","p","hasOwnProperty","__extends","TypeError","String","__","constructor","create","__decorate","decorators","target","key","desc","c","arguments","r","getOwnPropertyDescriptor","Reflect","decorate","__metadata","metadataKey","metadataValue","metadata","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","e","rejected","result","done","then","apply","__generator","f","y","t","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","n","op","pop","push","__values","o","s","m","__read","ar","__spread","concat","EMOJIS","grinning","keywords","char","category","grimacing","grin","joy","smiley","smile","sweat_smile","laughing","innocent","wink","blush","slightly_smiling","upside_down","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","nerd","sunglasses","hugging","smirk","no_mouth","neutral_face","expressionless","unamused","rolling_eyes","thinking","flushed","disappointed","worried","angry","rage","pensive","confused","slightly_sad","white_frowning","persevere","confounded","tired_face","weary","triumph","open_mouth","scream","fearful","cold_sweat","hushed","frowning","anguished","cry","disappointed_relieved","sleepy","sweat","sob","dizzy_face","astonished","zipper_mouth","mask","thermometer_face","bandage_face","sleeping","zzz","hankey","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","+1","minus1","facepunch","fist","ok_hand","hand","open_hands","muscle","pray","point_up","point_up_2","point_down","point_left","point_right","middle_finger","splayed_fingers","sign_of_horns","vulcan_salute","writing_hand","nail_care","lips","tongue","ear","nose","eye","eyes","bust_in_silhouette","busts_in_silhouette","speaking_head","baby","boy","girl","man","woman","person_with_blond_hair","older_man","older_woman","man_with_gua_pi_mao","man_with_turban","cop","construction_worker","guardsman","sleuth","santa","angel","princess","bride_with_veil","runner","walking","dancer","dancers","couple","two_men_holding_hands","two_women_holding_hands","bow","information_desk_person","no_good","ok_woman","raising_hand","person_with_pouting_face","person_frowning","haircut","massage","couple_with_heart","female_couple_with_heart","male_couple_with_heart","couplekiss","female_couplekiss","male_couplekiss","family","family_man_woman_girl","family_man_woman_girl_boy","family_man_woman_boys","family_man_woman_girls","family_women_boy","family_women_girl","family_women_girl_boy","family_women_boys","family_women_girls","family_men_boy","family_men_girl","family_men_girl_boy","family_men_boys","family_men_girls","womans_clothes","shirt","jeans","necktie","dress","bikini","kimono","lipstick","kiss","footprints","high_heel","sandal","boot","mans_shoe","athletic_shoe","womans_hat","tophat","helmet","mortar_board","crown","school_satchel","pouch","purse","handbag","briefcase","eyeglasses","dark_sunglasses","ring","closed_umbrella","dog","cat","mouse","hamster","rabbit","bear","panda_face","koala","tiger","lion_face","cow","pig","pig_nose","frog","octopus","monkey_face","see_no_evil","hear_no_evil","speak_no_evil","monkey","chicken","penguin","bird","baby_chick","hatching_chick","hatched_chick","wolf","boar","horse","unicorn_face","bee","bug","snail","beetle","ant","spider","scorpion","crab","snake","turtle","tropical_fish","fish","blowfish","dolphin","whale","whale2","crocodile","leopard","tiger2","water_buffalo","ox","cow2","dromedary_camel","camel","elephant","goat","ram","sheep","racehorse","pig2","rat","mouse2","rooster","turkey","dove_of_peace","dog2","poodle","cat2","rabbit2","chipmunk","feet","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","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","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","white_sun_with_small_cloud","partly_sunny","white_sun_behind_cloud","white_sun_behind_cloud_with_rain","cloud","cloud_with_rain","thunder_cloud_and_rain","cloud_with_lightning","zap","fire","boom","snowflake","cloud_with_snow","snowman","snowman_with_snow","wind_blowing_face","dash","cloud_with_tornado","fog","umbrella_without_rain","umbrella","droplet","sweat_drops","ocean","green_apple","apple","pear","tangerine","lemon","banana","watermelon","grapes","strawberry","melon","cherries","peach","pineapple","tomato","eggplant","hot_pepper","corn","sweet_potato","honey_pot","bread","cheese_wedge","poultry_leg","meat_on_bone","fried_shrimp","egg","hamburger","fries","hot_dog","pizza","spaghetti","taco","burrito","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","beer","beers","wine_glass","cocktail","tropical_drink","bottle","sake","tea","coffee","baby_bottle","fork_and_knife","fork_and_knife_with_plate","soccer","basketball","football","baseball","tennis","volleyball","rugby_football","8ball","golf","golfer","table_tennis","badminton","ice_hockey","field_hockey","cricket","ski","skier","snowboarder","ice_skate","bow_and_arrow","fishing_pole_and_fish","rowboat","swimmer","surfer","bath","person_with_ball","weight_lifter","bicyclist","mountain_bicyclist","horse_racing","man_levitating","trophy","running_shirt_with_sash","sports_medal","military_medal","reminder_ribbon","rosette","ticket","admission_ticket","performing_arts","art","circus_tent","microphone","headphones","musical_score","musical_keyboard","saxophone","trumpet","guitar","violin","clapper","video_game","space_invader","dart","game_die","slot_machine","bowling","car","taxi","blue_car","bus","trolleybus","racing_car","police_car","ambulance","fire_engine","minibus","truck","articulated_lorry","tractor","racing_motorcycle","bike","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","airplane_departure","airplane_arrival","boat","motor_boat","speedboat","ferry","passenger_ship","rocket","artificial_satellite","seat","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","snow_capped_mountain","mount_fuji","volcano","japan","camping","tent","national_park","motorway","railway_track","sunrise","sunrise_over_mountains","desert","beach_with_umbrella","desert_island","city_sunrise","city_sunset","cityscape","night_with_stars","bridge_at_night","milky_way","stars","sparkler","fireworks","rainbow","buildings","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","museum","church","mosque","synagogue","kaaba","shinto_shrine","watch","iphone","calling","computer","keyboard","desktop_computer","printer","three_button_mouse","trackball","joystick","compression","minidisc","floppy_disk","cd","dvd","vhs","camera","camera_with_flash","video_camera","movie_camera","film_projector","film_frames","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","scales","wrench","hammer","hammer_and_pick","hammer_and_wrench","pick","nut_and_bolt","gear","chains","gun","bomb","hocho","dagger_knife","crossed_swords","shield","smoking","skull_and_crossbones","coffin","funeral_urn","amphora","crystal_ball","prayer_beads","barber","alembic","telescope","microscope","hole","pill","syringe","thermometer","bookmark","toilet","shower","bathtub","old_key","couch_and_lamp","sleeping_accommodation","bed","door","bellhop_bell","frame_with_picture","world_map","umbrella_on_ground","moyai","shopping_bags","balloon","flags","ribbon","gift","confetti_ball","tada","dolls","wind_chime","crossed_flags","izakaya_lantern","envelope","envelope_with_arrow","incoming_envelope","email","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_pad","card_index","card_file_box","ballot_box_with_ballot","file_cabinet","clipboard","spiral_note_pad","file_folder","open_file_folder","card_index_dividers","rolled_up_newspaper","newspaper","notebook","closed_book","green_book","blue_book","orange_book","notebook_with_decorative_cover","ledger","books","book","paperclip","linked_paperclips","scissors","triangular_ruler","straight_ruler","pushpin","round_pushpin","triangular_flag_on_post","waving_white_flag","waving_black_flag","closed_lock_with_key","lock","unlock","lock_with_ink_pen","lower_left_ballpoint_pen","lower_left_fountain_pen","black_nib","memo","pencil2","lower_left_crayon","lower_left_paintbrush","mag","mag_right","heart","yellow_heart","green_heart","blue_heart","purple_heart","broken_heart","heavy_heart_exclamation_mark_ornament","two_hearts","revolving_hearts","heartbeat","heartpulse","sparkling_heart","cupid","gift_heart","heart_decoration","peace_symbol","latin_cross","star_and_crescent","om_symbol","wheel_of_dharma","star_of_david","six_pointed_star","menorah_with_nine_branches","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_sign","biohazard_sign","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","ab","cl","o2","sos","no_entry","name_badge","no_entry_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","100","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","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","one","two","three","four","five","six","seven","eight","nine","keycap_ten","keycap_star","1234","arrow_forward","double_vertical_bar","black_right_pointing_triangle_with_double_vertical_bar","black_square_for_stop","black_circle_for_record","black_right_pointing_double_triangle_with_vertical_bar","black_left_pointing_double_triangle_with_vertical_bar","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","af","ax","al","dz","as","ad","ao","ai","aq","ag","am","aw","au","at","az","bs","bh","bd","bb","by","be","bz","bj","bm","bt","bo","bq","ba","bw","br","io","vg","bn","bg","bf","bi","cv","kh","cm","ca","ic","ky","cf","td","chile","cn","cx","cc","co","km","cg","drc","ck","cr","hr","cu","cw","cy","cz","dk","dj","dm","do","ec","eg","sv","gq","er","ee","et","eu","fk","fo","fj","fi","fr","gf","pf","tf","ga","gm","ge","de","gh","gi","gr","gl","gd","gp","gu","gt","gg","gn","gw","gy","ht","hn","hk","hu","is","in","indonesia","ir","iq","ie","im","il","it","ci","jm","jp","je","jo","kz","ke","ki","xk","kw","kg","la","lv","lb","ls","lr","ly","li","lt","lu","mo","mk","mg","mw","my","mv","ml","mt","mh","mq","mr","mu","yt","mx","fm","md","mc","mn","me","ms","ma","mz","mm","na","nr","np","nl","nc","nz","ni","ne","nigeria","nu","nf","mp","kp","no","om","pk","pw","ps","pa","pg","py","pe","ph","pn","pl","pt","pr","qa","re","ro","ru","rw","bl","sh","kn","lc","pm","vc","ws","sm","st","saudi_arabia","sn","rs","sc","sl","sg","sx","sk","si","sb","so","za","gs","kr","ss","es","lk","sd","sr","sz","se","ch","sy","tw","tj","tz","th","tl","tg","tk","to","tt","tn","tr","turkmenistan","tc","tuvalu","ug","ua","ae","gb","us","vi","uy","uz","vu","va","ve","vn","wf","eh","ye","zm","zw","octocat","shipit","bowtie","neckbeard","metal","fu","trollface","godmode","goberserk","finnadie","feelsgood","rage1","rage2","rage3","rage4","suspect","hurtrealbad","EmojiSelectorPanelComponent","activeCategory","searchResults","searchVisible","selected","_searchQuery","keys","k","splice","console","log","humanize","str","toUpperCase","select","pairs","object","hideSearch","showSearch","cats","categoryIcons","people","animals_and_nature","travel_and_places","activity","food_and_drink","objects","_c","pair","emoji","icon","emojis","html","twemoji","categories","EmojiSelectorButtonComponent","overlay","_selected","showEmojiPanel","overlayX","overlayY","overlayRef","insert","dispose","show","positionStrategy","position","flexibleConnectedTo","withPositions","originX","originY","withFlexibleDimensions","hasBackdrop","disposeOnNavigation","scrollStrategy","scrollStrategies","reposition","autoClose","backdropClick","subscribe","keydownEvents","event","attach","selectorPanelTemplate","Overlay","FormsModule","MatFormFieldModule","MatInputModule","OverlayModule","PortalModule","ChatBackendBase","_userChanged","BehaviorSubject","_attachmentScrapers","_attachmentResolvers","_user","user","registerAttachmentScraper","scraper","registerAttachmentResolver","resolver","slice","BantaComponent","backend","matDialog","_subs","Subscription","auxOpen","auxTitle","auxMode","mobileFocus","newNotifications","chatLabel","commentsLabel","_signInSelected","pointOpen","pointSubChat","newPointSubMessage","genericAvatarUrl","add","userChanged","currentUser","notificationsChanged","notifs","notifications","newNotification","notif","sendPointSubMessage","message","sentAt","likes","send","e_1","goToMessage","targetMessage","parentMessageId","parentMessage","getMessage","topicId","e_2","dir","viewType","getViewType","getSourceForThread","refreshMessage","firehose","jumpToMessage","pointUnfocus","unsubscribe","showAux","mode","showNotifications","_topicID","connectToTopic","getSourceForTopic","firehoseSource","pointSource","showSignIn","closeAux","endsWith","upvoteMessage","showProfile","profileUser","username","sendReport","alert","reportMessage","reportedMessage","MatDialog","static","ChatMessageComponent","_reported","_upvoted","_userSelected","avatarForUser","avatarUrl","upvote","report","selectUser","LiveChatMessageComponent","_message","originalId","watchMessage","ChatViewComponent","_sourceSubs","_selected$","asObservable","_reported$","_upvoted$","_userSelected$","_received","_received$","messages","maxMessages","emptyLabel","_source","messageReceived","msg","messageSent","getInitialMessages","getExistingMessages","forEach","reverse","sortMessages","sorter","source","sort","addMessage","shift","isScrolledToLatest","scrollToLatest","messageContainer","el","scrollTop","scrollHeight","offsetHeight","jumpTo","messageElement","querySelector","scrollIntoView","behavior","flashMessage","flashedMessageId","mentionsMe","selectMessage","selectMessageUser","BantaChatComponent","signInLabel","sendLabel","permissionDeniedLabel","messageFieldPlaceholder","_permissionDeniedError","_permissionDeniedError$","_signInSelected$","newMessage","identifier","setSourceFromTopicID","topicID","onReceived","sendPermissionError","insertEmoji","onKeyDown","chatView","likeMessage","sendMessage","location","undefined","shouldInterceptMessageSend","EmojiModule","LiveMessageComponent","CommentComponent","_liked","_unliked","_shared","_avatarSelected","_usernameSelected","maxLength","isNew","visible","showReplyAction","isLoaded","mine","_editStarted","_deleted","_editEnded","_edited","randomTime","random","markAttachmentsLoaded","highlighted","waitForLoad","pipe","take","toPromise","_d","saveEdit","editedMessage","endEditing","startEdit","delete","like","unlike","share","selectUsername","selectAvatar","submessages","submessageCount","CommentViewComponent","_messageEdited","showEmptyState","allowReplies","customMenuItems","menuMessage","customSortEnabled","sourceLoaded","markSourceLoaded","maxVisibleMessages","newestLast","isViewingMore","isLoadingMore","hasMore","newMessages","olderMessages","sortOrderChanged","from","commentsQuery","isMessageLoadedInContext","find","loadMessageInContext","showMore","pageSize","items","findIndex","startIndex","getCommentComponentForMessage","Error","comments","sortOrder","CommentsOrder","NEWEST","bantaSourceDebug","unlikeMessage","sharedMessage","startEditing","deleteMessage","messageIdentity","chatMessage","showNew","naturalOrder","overflow","lastMessage","loadAfter","destination","bucket","unshift","pagingCursor","incrementPagingCursors","maxPagingCursor","_e","_f","group","group_1","group_1_1","Number","waitForAllCommentsToLoad","all","LIKES","OLDEST","ViewChildren","Directive","BantaCommentsComponent","activatedRoute","matSnackBar","ngZone","isMobileSized","viewReady","markViewReady","_loadingMessage","loadingMessageVisible","showLoadingScreen","_loadingMessageIndex","maxCommentLength","loadingMessages","useInlineReplies","markLoaded","_editAvatarSelected","_sourceIsOwned","_sortOrder","selectedMessageVisible","replyLabel","sendingLabel","postCommentLabel","postReplyLabel","allowAttachments","toString","participants","hashtags","hashtag","description","loadingSharedComment","sharedCommentMissing","handleBackendException","sendReply","selectedMessageThread","handleBackendExceptionAsAlert","prefix","sendPermissionDenied","startLoading","commentID","search","substring","split","reduce","decodeURIComponent","sharedCommentID","callback","size","getBoundingClientRect","run","width","height","ResizeObserver","resizeObserver","observe","clientWidth","clientHeight","disconnect","loadingStartedAt","messageChangedAt","updateLoading","_loadingTimer","threadView","commentView","threadViewQuery","waitForThreadView","changes","state","_sourceSubscription","navigateToSharedComment","lastSharedCommentID","addParticipant","messageObserved","messageUpdated","selectedMessage","hidden","unselectMessage","duration","scrollToComment","commentId","comment","inline","block","ready","get","e_3","element","thread","handlePermissionDenied","scrollToMessage","liking","e_4","userState","liked","e_5","toggleSelectedMessage","warn","showEditAvatar","shareMessage","confirm","e_6","editMessage","newText","e_7","e_8","ActivatedRoute","MatSnackBar","NgZone","ContentChild","BantaReplySendOptionsDirective","read","TemplateRef","LiveCommentComponent","CommentFieldComponent","chatBackend","canComment","signInSelected","editAvatarSelected","sending","expandError","_text","placeholder","textChanged","autocompleteVisible","autocompleteOptions","autoCompleteSelected","chatMessageAttachments","connectionStateChanged","transientMessage","autocompleteEl","showAutoComplete","options","pos","autocompleteContainerEl","left","scrollX","scrollY","activateAutoComplete","option","action","dismissAutoComplete","completionFunc","completionPrefix","indicateError","sendError","clearTimeout","errorTimeout","innerWidth","some","isValidMessage","hasPendingAttachments","autocomplete","replacement","textareaEl","selectionStart","stopPropagation","preventDefault","ctrlKey","startAutoComplete","displayName","onBlur","submit","focus","addedAttachment","attachmentError","indexOf","alertError","CommentSortComponent","commentsOrder","_sortChange","_sort","AttachmentButtonComponent","cdnProvider","_addedAttachment","_attachmentError","fileInput","click","fileChange","currentTarget","files","file","publicURL","uploading","uploadImage","CDNProvider","AttachmentScraperDirective","attachmentsChange","scrapeDebounce","fragments","Map","addEventListener","scrapeTimeout","scrape","foundFragments","_g","attachmentScrapers","_h","findFragments","fragments_1","fragments_1_1","fragment","resolution","removedFragments","_j","_k","removedFragments_1","removedFragments_1_1","removedFragment","attachmentResolvers","resolveFragment","_m","_o","_p","TextFieldModule","MatMenuModule","BantaCommonModule","MatTooltipModule","MatSelectModule","ChatSource","parentIdentifier","_super_1","subscription","_state","_connectionStateChanged","messageMap","_messageReceived","_messageUpdated","_messageSent","_messageObserved","markReady","bind","socket","_super","subscribeToTopic","authenticate","mapOrUpdateMessages","mapOrUpdateMessage","existingMessage","assign","peer","ensureConnection","reason","messageId","onPermissions","permissions","bantaPermissionsDebug","onChatMessage","count","getCount","SocketRPC","RpcEvent","BANTA_SDK_OPTIONS","ChatBackend","serviceUrl","connectToService","DurableSocket","onopen","onclose","code","onerror","getSourceCountForTopic","fetch","response","status","json","messageCount","getSubMessage","handler","getCardForUrl","method","headers","Content-Type","JSON","stringify","Injectable","Inject","URL_REGEX","UrlAttachmentScraper","item","offset","UrlAttachmentResolver","urlCard","YouTubeAttachmentResolver","videoId","GiphyAttachmentResolver","gifId","TweetAttachmentResolver","BantaSdkModule","script","createElement","async","configure","ngModule","providers","provide","useValue","useClass","CommentsModule","ChatModule","MatDialogModule","MatSnackBarModule","BantaLogoComponent","Observable","observer","subject","stop","publish","refCount"],"mappings":"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","sourcesContent":["import { Component, Input } from \"@angular/core\";\r\n\r\n@Component({\r\n selector: 'banta-timestamp',\r\n template: `\r\n <span *ngIf=\"showAbsolute\" [title]=\"value | date : 'short'\">\r\n {{value | date : 'shortDate'}}\r\n </span>\r\n <span *ngIf=\"!showAbsolute\" [title]=\"value | date : 'short'\">\r\n {{relative}}\r\n </span>\r\n `,\r\n styles: [``]\r\n})\r\nexport class TimestampComponent {\r\n private _value : number;\r\n relative = '';\r\n tooltip = '';\r\n\r\n private updateInterval = null;\r\n\r\n ngOnDestroy() {\r\n if (this.updateInterval)\r\n clearInterval(this.updateInterval);\r\n }\r\n\r\n @Input()\r\n get value() {\r\n return this._value;\r\n }\r\n\r\n showAbsolute = false;\r\n\r\n update() {\r\n \r\n let now = Date.now();\r\n let diff = now - this.value;\r\n let minute = 1000*60;\r\n let hour = minute * 60;\r\n let day = hour * 24;\r\n let week = day * 7;\r\n let month = day * 30;\r\n let year = day * 365;\r\n this.showAbsolute = false;\r\n let updateTime = 0;\r\n\r\n if (diff > year) {\r\n this.showAbsolute = true;\r\n this.relative = 'abs';\r\n return;\r\n }\r\n\r\n if (diff > month) {\r\n let months = Math.floor(diff / month);\r\n\r\n if (months === 1)\r\n this.relative = `${months} month ago`;\r\n else\r\n this.relative = `${months} months ago`;\r\n \r\n } else if (diff > week) {\r\n let weeks = Math.floor(diff / week);\r\n\r\n if (weeks === 1)\r\n this.relative = `${weeks} week ago`;\r\n else\r\n this.relative = `${weeks} weeks ago`;\r\n } else if (diff > day) {\r\n let days = Math.floor(diff / day);\r\n if (days === 1)\r\n this.relative = `${days} day ago`;\r\n else\r\n this.relative = `${days} days ago`;\r\n } else if (diff > hour) {\r\n let hours = Math.floor(diff / hour);\r\n if (hours === 1)\r\n this.relative = `${hours} hour ago`;\r\n else\r\n this.relative = `${hours} hours ago`;\r\n \r\n updateTime = 1000 * 60 * 30;\r\n } else if (diff > minute) {\r\n let minutes = Math.floor(diff / minute);\r\n if (minutes === 1)\r\n this.relative = `${minutes} minute ago`;\r\n else\r\n this.relative = `${minutes} minutes ago`;\r\n updateTime = 1000 * 45;\r\n } else if (diff > 30_000) {\r\n this.relative = `about a minute ago`;\r\n updateTime = 1000 * 60;\r\n } else {\r\n this.relative = `just now`;\r\n updateTime = 1000 * 30;\r\n }\r\n \r\n if (typeof window !== 'undefined') {\r\n clearInterval(this.updateInterval);\r\n if (updateTime > 0) {\r\n this.updateInterval = setInterval(() => this.update());\r\n }\r\n }\r\n }\r\n\r\n set value(v) {\r\n this._value = v;\r\n this.update();\r\n }\r\n}","import { Component, ElementRef, ViewChild } from \"@angular/core\";\r\n\r\n@Component({\r\n selector: 'banta-lightbox',\r\n templateUrl: './lightbox.component.html',\r\n styleUrls: ['./lightbox.component.scss']\r\n})\r\nexport class LightboxComponent {\r\n @ViewChild('container') \r\n containerElement: ElementRef<HTMLDivElement>;\r\n\r\n ngAfterViewInit() {\r\n if (typeof window !== 'undefined') {\r\n document.body.appendChild(this.containerElement.nativeElement);\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.containerElement.nativeElement.remove();\r\n }\r\n\r\n images: string[];\r\n currentImage: string;\r\n\r\n isOpen: boolean;\r\n\r\n close() {\r\n this.isOpen = false;\r\n }\r\n\r\n open(currentImage: string, images: string[]) {\r\n this.currentImage = currentImage;\r\n this.images = images;\r\n this.isOpen = true;\r\n }\r\n}","import { Pipe, PipeTransform } from '@angular/core';\r\nimport * as marked from 'marked';\r\nimport * as DOMPurify from 'dompurify';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\nconst underline = {\r\n name: 'underline',\r\n level: 'inline', // Is this a block-level or inline-level tokenizer?\r\n start(src) { return src.match(/\\+\\+/)?.index; }, // Hint to Marked.js to stop and check for a match\r\n tokenizer(src, tokens) {\r\n const rule = /^\\+\\+(.*?)\\+\\+/; // Regex for the complete token\r\n const match = rule.exec(src);\r\n if (match) {\r\n return { // Token to generate\r\n type: 'underline', // Should match \"name\" above\r\n raw: match[0], // Text to consume from the source\r\n text: this.lexer.inlineTokens(match[1].trim()), // Additional custom properties\r\n };\r\n }\r\n },\r\n renderer(token) {\r\n return `<u>${this.parser.parseInline(token.text)}</u>`;\r\n }\r\n};\r\n\r\nmarked.marked.use({\r\n extensions: [underline]\r\n});\r\n\r\n@Pipe({\r\n name: 'markdownToHtml'\r\n})\r\nexport class BantaMarkdownToHtmlPipe implements PipeTransform {\r\n constructor(\r\n private sanitizer: DomSanitizer\r\n ) {\r\n this.renderer = new marked.Renderer({\r\n headerPrefix: ''\r\n });\r\n const linkRenderer = this.renderer.link;\r\n this.renderer.link = (href, title, text) => {\r\n const html = linkRenderer.call(this.renderer, href, title, text);\r\n return html.replace(/^<a /, '<a target=\"_blank\" rel=\"noopener\" ');\r\n };\r\n }\r\n\r\n renderer: marked.Renderer;\r\n transform(value: string) {\r\n if (!value)\r\n return '';\r\n\r\n return this.sanitizer.bypassSecurityTrustHtml(\r\n DOMPurify.sanitize(\r\n marked.marked.parse(value, {\r\n renderer: this.renderer\r\n }),\r\n {\r\n FORBID_TAGS: ['h1', 'h2', 'h3', 'h4'],\r\n KEEP_CONTENT: true\r\n }\r\n )\r\n );\r\n }\r\n}\r\n\r\n// https://github.com/cure53/DOMPurify/blob/e1c19cf6407d782b666cb1d02a6af191f9cbc09e/demos/hooks-target-blank-demo.html\r\n// Add a hook to make all links open a new window\r\n\r\nDOMPurify.addHook('afterSanitizeAttributes', function(node: HTMLElement & { target?: string }) {\r\n // set all elements owning target to target=_blank\r\n if ('target' in node) {\r\n node.setAttribute('target','_blank');\r\n // prevent https://www.owasp.org/index.php/Reverse_Tabnabbing\r\n node.setAttribute('rel', 'noopener noreferrer');\r\n }\r\n // set non-HTML/MathML links to xlink:show=new\r\n if (!node.hasAttribute('target')\r\n && (node.hasAttribute('xlink:href')\r\n || node.hasAttribute('href'))) {\r\n node.setAttribute('xlink:show', 'new');\r\n }\r\n});","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n@Pipe({\r\n name: 'trustResourceUrl'\r\n})\r\nexport class BantaTrustResourceUrlPipe implements PipeTransform {\r\n constructor(\r\n private sanitizer: DomSanitizer\r\n ) {\r\n }\r\n\r\n transform(value: string) {\r\n if (!value)\r\n return undefined;\r\n\r\n return this.sanitizer.bypassSecurityTrustResourceUrl(value);\r\n }\r\n}","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { ChatMessageMention } from '@banta/common';\r\n\r\n@Pipe({\r\n name: 'mentionLinker'\r\n})\r\nexport class BantaMentionLinkerPipe implements PipeTransform {\r\n transform(value: string, links?: ChatMessageMention[]) {\r\n if (!value)\r\n return '';\r\n\r\n if (!links)\r\n return value;\r\n\r\n let text = value;\r\n\r\n for (let i = 0, max = links.length; i < max; ++i) {\r\n let mention = links[i];\r\n text = text.replace(new RegExp(`${this.escapeRegExp(mention.text)}`, `gi`), `@{${i + 1}}`);\r\n }\r\n\r\n text = text.replace(/@\\{(\\d+)\\}/g, (text, i) => links[i - 1] ? this.formatLink(links[i - 1]) : text);\r\n\r\n return text;\r\n }\r\n\r\n formatLink(link: ChatMessageMention) {\r\n return `<a${ link.external ? ` target=\"_blank\" rel=\"noopener\"` : `` } href=\"${link.link}\">${link.text}</a>`;\r\n }\r\n\r\n /**\r\n * https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex\r\n */\r\n escapeRegExp(string) {\r\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\r\n }\r\n}","import { Component, ElementRef, HostBinding, Input, Output } from \"@angular/core\";\r\nimport { ChatMessageAttachment } from \"@banta/common\";\r\nimport { Subject } from \"rxjs\";\r\n\r\n@Component({\r\n selector: 'banta-attachment',\r\n templateUrl: './attachment.component.html',\r\n styleUrls: ['./attachment.component.scss']\r\n})\r\nexport class BantaAttachmentComponent {\r\n constructor(\r\n private elementRef: ElementRef<HTMLElement>\r\n ) {\r\n\r\n }\r\n\r\n private _attachment: ChatMessageAttachment;\r\n @Input() get attachment() { return this._attachment; }\r\n set attachment(value) {\r\n this._attachment = value;\r\n this.checkLoad();\r\n }\r\n @Input() loading = false;\r\n @Input() editing = false;\r\n @Input() loadingMessage: string = 'Please wait...';\r\n @Input() error = false;\r\n @Input() errorMessage: string = 'An error has occurred';\r\n @Output() removed = new Subject<void>();\r\n @Output() activated = new Subject<void>();\r\n @Output() loaded = new Subject<void>();\r\n\r\n ngOnInit() {\r\n if (typeof window !== 'undefined') {\r\n setTimeout(() => {\r\n if (!window['twttr'])\r\n return;\r\n window['twttr'].widgets.load();\r\n }, 100);\r\n }\r\n }\r\n\r\n private _viewLoaded = false;\r\n ngAfterViewInit() {\r\n this._viewLoaded = true;\r\n this.checkLoad();\r\n }\r\n\r\n private checkLoad() {\r\n if (!this._attachment || !this._viewLoaded || !this.elementRef?.nativeElement)\r\n return;\r\n\r\n if (typeof window === 'undefined')\r\n this.loaded.next();\r\n else\r\n setTimeout(() => this.loaded.next(), 250);\r\n }\r\n\r\n activate() {\r\n this.activated.next();\r\n }\r\n\r\n remove() {\r\n this.removed.next();\r\n }\r\n\r\n get isError() {\r\n return this.error || this.attachment?.transientState?.error;\r\n }\r\n\r\n get theErrorMessage() {\r\n return this.errorMessage || this.attachment?.transientState?.errorMessage;\r\n }\r\n\r\n @HostBinding('class.loading')\r\n get isLoading() {\r\n return this.loading || !this.attachment || this.attachment.transientState?.loading || !this.attachment.url;\r\n }\r\n\r\n get isImageAttachment() {\r\n if (this.attachment.type.startsWith('image/'))\r\n return true;\r\n return false;\r\n }\r\n\r\n get hasFrame() {\r\n if (!this.attachment)\r\n return false;\r\n\r\n return this.attachment.type === 'iframe' || (\r\n this.attachment.type === 'card' \r\n && this.attachment.card.player\r\n );\r\n }\r\n\r\n get frameUrl() {\r\n if (!this.attachment)\r\n return undefined;\r\n \r\n if (this.attachment.type === 'iframe') {\r\n return this.attachment.url;\r\n } else if (this.attachment.type === 'card') {\r\n return this.attachment.card.player;\r\n }\r\n }\r\n}","import { Component, Input, Output, ViewChild } from \"@angular/core\";\r\nimport { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { Subject } from \"rxjs\";\r\nimport { LightboxComponent } from \"../lightbox/lightbox.component\";\r\n\r\n@Component({\r\n selector: 'banta-attachments',\r\n templateUrl: './attachments.component.html',\r\n styleUrls: ['./attachments.component.scss']\r\n})\r\nexport class BantaAttachmentsComponent {\r\n @Input() attachments: ChatMessageAttachment[];\r\n @Input() editing = false;\r\n @ViewChild('lightbox') lightbox: LightboxComponent;\r\n @Output() remove = new Subject<ChatMessageAttachment>();\r\n @Output() loaded = new Subject<void>();\r\n\r\n loadedAttachments = new WeakMap<ChatMessageAttachment, boolean>();\r\n\r\n ngAfterViewInit() {\r\n\r\n }\r\n\r\n markAttachmentLoaded(attachment: ChatMessageAttachment) {\r\n this.loadedAttachments.set(attachment, true);\r\n\r\n if (this.allAttachmentsLoaded)\r\n this.loaded.next();\r\n }\r\n\r\n isAttachmentLoaded(attachment: ChatMessageAttachment) {\r\n return this.loadedAttachments.has(attachment);\r\n }\r\n\r\n get allAttachmentsLoaded() {\r\n return this.attachments.every(x => this.isAttachmentLoaded(x));\r\n }\r\n\r\n removeAttachment(attachment: ChatMessageAttachment) {\r\n this.remove.next(attachment);\r\n }\r\n\r\n isImageAttachment(attachment: ChatMessageAttachment) {\r\n if (attachment.type.startsWith('image/'))\r\n return true;\r\n return false;\r\n }\r\n\r\n isCardAttachment(attachment: ChatMessageAttachment) {\r\n if (['card'].includes(attachment.type))\r\n return true;\r\n return false;\r\n }\r\n\r\n showLightbox(image: ChatMessageAttachment) {\r\n this.lightbox.open(\r\n image.url,\r\n this.attachments\r\n .filter(x => x.type === 'image/png')\r\n .map(x => x.url)\r\n )\r\n }\r\n\r\n get inlineAttachments() {\r\n return this.attachments.filter(x => x.type !== 'card' && (x.style === 'inline' || !x.style));\r\n }\r\n\r\n get blockAttachments() {\r\n return this.attachments.filter(x => x.style === 'block' || x.type === 'card');\r\n }\r\n\r\n attachmentId(index: number, attachment: ChatMessageAttachment) {\r\n return attachment.url;\r\n }\r\n}","import { NgModule } from '@angular/core';\r\nimport { TimestampComponent } from './timestamp.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { LightboxComponent } from './lightbox/lightbox.component';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { BantaMarkdownToHtmlPipe } from './markdown-to-html.pipe';\r\nimport { BantaAttachmentsComponent } from './attachments/attachments.component';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { BantaTrustResourceUrlPipe } from './trust-resource-url.pipe';\r\nimport { BantaAttachmentComponent } from './attachment/attachment.component';\r\nimport { BantaMentionLinkerPipe } from './mention-linker.pipe';\r\n\r\nconst COMPONENTS = [\r\n TimestampComponent,\r\n LightboxComponent,\r\n BantaMarkdownToHtmlPipe,\r\n BantaMentionLinkerPipe,\r\n BantaTrustResourceUrlPipe,\r\n BantaAttachmentComponent,\r\n BantaAttachmentsComponent\r\n];\r\n\r\n@NgModule({\r\n declarations: COMPONENTS,\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatProgressSpinnerModule,\r\n MatButtonModule\r\n ],\r\n exports: COMPONENTS\r\n})\r\nexport class BantaCommonModule {\r\n}","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","export const EMOJIS = {\r\n \"grinning\": {\r\n \"keywords\": [\"face\", \"smile\", \"happy\", \"joy\", \":D\", \"grin\"],\r\n \"char\": \"😀\",\r\n \"category\": \"people\"\r\n },\r\n \"grimacing\": {\r\n \"keywords\": [\"face\", \"grimace\", \"teeth\"],\r\n \"char\": \"😬\",\r\n \"category\": \"people\"\r\n },\r\n \"grin\": {\r\n \"keywords\": [\"face\", \"happy\", \"smile\", \"joy\", \"kawaii\"],\r\n \"char\": \"😁\",\r\n \"category\": \"people\"\r\n },\r\n \"joy\": {\r\n \"keywords\": [\"face\", \"cry\", \"tears\", \"weep\", \"happy\", \"happytears\", \"haha\"],\r\n \"char\": \"😂\",\r\n \"category\": \"people\"\r\n },\r\n \"smiley\": {\r\n \"keywords\": [\"face\", \"happy\", \"joy\", \"haha\", \":D\", \":)\", \"smile\", \"funny\"],\r\n \"char\": \"😃\",\r\n \"category\": \"people\"\r\n },\r\n \"smile\": {\r\n \"keywords\": [\"face\", \"happy\", \"joy\", \"funny\", \"haha\", \"laugh\", \"like\", \":D\", \":)\"],\r\n \"char\": \"😄\",\r\n \"category\": \"people\"\r\n },\r\n \"sweat_smile\": {\r\n \"keywords\": [\"face\", \"hot\", \"happy\", \"laugh\", \"sweat\", \"smile\", \"relief\"],\r\n \"char\": \"😅\",\r\n \"category\": \"people\"\r\n },\r\n \"laughing\": {\r\n \"keywords\": [\"happy\", \"joy\", \"lol\", \"satisfied\", \"haha\", \"face\", \"glad\", \"XD\", \"laugh\"],\r\n \"char\": \"😆\",\r\n \"category\": \"people\"\r\n },\r\n \"innocent\": {\r\n \"keywords\": [\"face\", \"angel\", \"heaven\", \"halo\"],\r\n \"char\": \"😇\",\r\n \"category\": \"people\"\r\n },\r\n \"wink\": {\r\n \"keywords\": [\"face\", \"happy\", \"mischievous\", \"secret\", \";)\", \"smile\"],\r\n \"char\": \"😉\",\r\n \"category\": \"people\"\r\n },\r\n \"blush\": {\r\n \"keywords\": [\"face\", \"smile\", \"happy\", \"flushed\", \"crush\", \"embarrassed\", \"shy\", \"joy\"],\r\n \"char\": \"😊\",\r\n \"category\": \"people\"\r\n },\r\n \"slightly_smiling\": {\r\n \"keywords\": [\"face\", \"smile\"],\r\n \"char\": \"🙂\",\r\n \"category\": \"people\"\r\n },\r\n \"upside_down\": {\r\n \"keywords\": [\"face\", \"flipped\", \"silly\", \"smile\"],\r\n \"char\": \"🙃\",\r\n \"category\": \"people\"\r\n },\r\n \"relaxed\": {\r\n \"keywords\": [\"face\", \"blush\", \"massage\", \"happiness\"],\r\n \"char\": \"☺️\",\r\n \"category\": \"people\"\r\n },\r\n \"yum\": {\r\n \"keywords\": [\"happy\", \"joy\", \"tongue\", \"smile\", \"face\", \"silly\", \"yummy\", \"nom\"],\r\n \"char\": \"😋\",\r\n \"category\": \"people\"\r\n },\r\n \"relieved\": {\r\n \"keywords\": [\"face\", \"relaxed\", \"phew\", \"massage\", \"happiness\"],\r\n \"char\": \"😌\",\r\n \"category\": \"people\"\r\n },\r\n \"heart_eyes\": {\r\n \"keywords\": [\"face\", \"love\", \"like\", \"affection\", \"valentines\", \"infatuation\", \"crush\", \"heart\"],\r\n \"char\": \"😍\",\r\n \"category\": \"people\"\r\n },\r\n \"kissing_heart\": {\r\n \"keywords\": [\"face\", \"love\", \"like\", \"affection\", \"valentines\", \"infatuation\", \"kiss\"],\r\n \"char\": \"😘\",\r\n \"category\": \"people\"\r\n },\r\n \"kissing\": {\r\n \"keywords\": [\"love\", \"like\", \"face\", \"3\", \"valentines\", \"infatuation\", \"kiss\"],\r\n \"char\": \"😗\",\r\n \"category\": \"people\"\r\n },\r\n \"kissing_smiling_eyes\": {\r\n \"keywords\": [\"face\", \"affection\", \"valentines\", \"infatuation\", \"kiss\"],\r\n \"char\": \"😙\",\r\n \"category\": \"people\"\r\n },\r\n \"kissing_closed_eyes\": {\r\n \"keywords\": [\"face\", \"love\", \"like\", \"affection\", \"valentines\", \"infatuation\", \"kiss\"],\r\n \"char\": \"😚\",\r\n \"category\": \"people\"\r\n },\r\n \"stuck_out_tongue_winking_eye\": {\r\n \"keywords\": [\"face\", \"prank\", \"childish\", \"playful\", \"mischievous\", \"smile\", \"wink\", \"tongue\"],\r\n \"char\": \"😜\",\r\n \"category\": \"people\"\r\n },\r\n \"stuck_out_tongue_closed_eyes\": {\r\n \"keywords\": [\"face\", \"prank\", \"playful\", \"mischievous\", \"smile\", \"tongue\"],\r\n \"char\": \"😝\",\r\n \"category\": \"people\"\r\n },\r\n \"stuck_out_tongue\": {\r\n \"keywords\": [\"face\", \"prank\", \"childish\", \"playful\", \"mischievous\", \"smile\", \"tongue\"],\r\n \"char\": \"😛\",\r\n \"category\": \"people\"\r\n },\r\n \"money_mouth\": {\r\n \"keywords\": [\"face\", \"rich\", \"dollar\", \"money\"],\r\n \"char\": \"🤑\",\r\n \"category\": \"people\"\r\n },\r\n \"nerd\": {\r\n \"keywords\": [\"face\", \"nerdy\", \"geek\", \"dork\"],\r\n \"char\": \"🤓\",\r\n \"category\": \"people\"\r\n },\r\n \"sunglasses\": {\r\n \"keywords\": [\"face\", \"cool\", \"smile\", \"summer\", \"beach\", \"sunglass\"],\r\n \"char\": \"😎\",\r\n \"category\": \"people\"\r\n },\r\n \"hugging\": {\r\n \"keywords\": [\"face\", \"smile\", \"hug\"],\r\n \"char\": \"🤗\",\r\n \"category\": \"people\"\r\n },\r\n \"smirk\": {\r\n \"keywords\": [\"face\", \"smile\", \"mean\", \"prank\", \"smug\", \"sarcasm\"],\r\n \"char\": \"😏\",\r\n \"category\": \"people\"\r\n },\r\n \"no_mouth\": {\r\n \"keywords\": [\"face\", \"hellokitty\"],\r\n \"char\": \"😶\",\r\n \"category\": \"people\"\r\n },\r\n \"neutral_face\": {\r\n \"keywords\": [\"indifference\", \"meh\", \":|\", \"neutral\"],\r\n \"char\": \"😐\",\r\n \"category\": \"people\"\r\n },\r\n \"expressionless\": {\r\n \"keywords\": [\"face\", \"indifferent\", \"-_-\", \"meh\", \"deadpan\"],\r\n \"char\": \"😑\",\r\n \"category\": \"people\"\r\n },\r\n \"unamused\": {\r\n \"keywords\": [\"indifference\", \"bored\", \"straight face\", \"serious\", \"sarcasm\"],\r\n \"char\": \"😒\",\r\n \"category\": \"people\"\r\n },\r\n \"rolling_eyes\": {\r\n \"keywords\": [\"face\", \"eyeroll\", \"frustrated\"],\r\n \"char\": \"🙄\",\r\n \"category\": \"people\"\r\n },\r\n \"thinking\": {\r\n \"keywords\": [\"face\", \"hmmm\", \"think\", \"consider\"],\r\n \"char\": \"🤔\",\r\n \"category\": \"people\"\r\n },\r\n \"flushed\": {\r\n \"keywords\": [\"face\", \"blush\", \"shy\", \"flattered\"],\r\n \"char\": \"😳\",\r\n \"category\": \"people\"\r\n },\r\n \"disappointed\": {\r\n \"keywords\": [\"face\", \"sad\", \"upset\", \"depressed\", \":(\"],\r\n \"char\": \"😞\",\r\n \"category\": \"people\"\r\n },\r\n \"worried\": {\r\n \"keywords\": [\"face\", \"concern\", \"nervous\", \":(\"],\r\n \"char\": \"😟\",\r\n \"category\": \"people\"\r\n },\r\n \"angry\": {\r\n \"keywords\": [\"mad\", \"face\", \"annoyed\", \"frustrated\"],\r\n \"char\": \"😠\",\r\n \"category\": \"people\"\r\n },\r\n \"rage\": {\r\n \"keywords\": [\"angry\", \"mad\", \"hate\", \"despise\"],\r\n \"char\": \"😡\",\r\n \"category\": \"people\"\r\n },\r\n \"pensive\": {\r\n \"keywords\": [\"face\", \"sad\", \"depressed\", \"okay\", \"upset\"],\r\n \"char\": \"😔\",\r\n \"category\": \"people\"\r\n },\r\n \"confused\": {\r\n \"keywords\": [\"face\", \"indifference\", \"huh\", \"weird\", \"hmmm\", \":/\"],\r\n \"char\": \"😕\",\r\n \"category\": \"people\"\r\n },\r\n \"slightly_sad\": {\r\n \"keywords\": [\"face\", \"frowning\", \"disappointed\", \"sad\", \"upset\"],\r\n \"char\": \"🙁\",\r\n \"category\": \"people\"\r\n },\r\n \"white_frowning\": {\r\n \"keywords\": [\"face\", \"sad\", \"upset\", \"frown\"],\r\n \"char\": \"☹\",\r\n \"category\": \"people\"\r\n },\r\n \"persevere\": {\r\n \"keywords\": [\"face\", \"sick\", \"no\", \"upset\", \"oops\"],\r\n \"char\": \"😣\",\r\n \"category\": \"people\"\r\n },\r\n \"confounded\": {\r\n \"keywords\": [\"face\", \"confused\", \"sick\", \"unwell\", \"oops\", \":S\"],\r\n \"char\": \"😖\",\r\n \"category\": \"people\"\r\n },\r\n \"tired_face\": {\r\n \"keywords\": [\"sick\", \"whine\", \"upset\", \"frustrated\"],\r\n \"char\": \"😫\",\r\n \"category\": \"people\"\r\n },\r\n \"weary\": {\r\n \"keywords\": [\"face\", \"tired\", \"sleepy\", \"sad\", \"frustrated\", \"upset\"],\r\n \"char\": \"😩\",\r\n \"category\": \"people\"\r\n },\r\n \"triumph\": {\r\n \"keywords\": [\"face\", \"gas\", \"phew\", \"proud\", \"pride\"],\r\n \"char\": \"😤\",\r\n \"category\": \"people\"\r\n },\r\n \"open_mouth\": {\r\n \"keywords\": [\"face\", \"surprise\", \"impressed\", \"wow\", \"whoa\", \":O\"],\r\n \"char\": \"😮\",\r\n \"category\": \"people\"\r\n },\r\n \"scream\": {\r\n \"keywords\": [\"face\", \"munch\", \"scared\", \"omg\"],\r\n \"char\": \"😱\",\r\n \"category\": \"people\"\r\n },\r\n \"fearful\": {\r\n \"keywords\": [\"face\", \"scared\", \"terrified\", \"nervous\", \"oops\", \"huh\"],\r\n \"char\": \"😨\",\r\n \"category\": \"people\"\r\n },\r\n \"cold_sweat\": {\r\n \"keywords\": [\"face\", \"nervous\", \"sweat\"],\r\n \"char\": \"😰\",\r\n \"category\": \"people\"\r\n },\r\n \"hushed\": {\r\n \"keywords\": [\"face\", \"woo\", \"shh\"],\r\n \"char\": \"😯\",\r\n \"category\": \"people\"\r\n },\r\n \"frowning\": {\r\n \"keywords\": [\"face\", \"aw\", \"what\"],\r\n \"char\": \"😦\",\r\n \"category\": \"people\"\r\n },\r\n \"anguished\": {\r\n \"keywords\": [\"face\", \"stunned\", \"nervous\"],\r\n \"char\": \"😧\",\r\n \"category\": \"people\"\r\n },\r\n \"cry\": {\r\n \"keywords\": [\"face\", \"tears\", \"sad\", \"depressed\", \"upset\", \":'(\"],\r\n \"char\": \"😢\",\r\n \"category\": \"people\"\r\n },\r\n \"disappointed_relieved\": {\r\n \"keywords\": [\"face\", \"phew\", \"sweat\", \"nervous\"],\r\n \"char\": \"😥\",\r\n \"category\": \"people\"\r\n },\r\n \"sleepy\": {\r\n \"keywords\": [\"face\", \"tired\", \"rest\", \"nap\"],\r\n \"char\": \"😪\",\r\n \"category\": \"people\"\r\n },\r\n \"sweat\": {\r\n \"keywords\": [\"face\", \"hot\", \"sad\", \"tired\", \"exercise\"],\r\n \"char\": \"😓\",\r\n \"category\": \"people\"\r\n },\r\n \"sob\": {\r\n \"keywords\": [\"face\", \"cry\", \"tears\", \"sad\", \"upset\", \"depressed\"],\r\n \"char\": \"😭\",\r\n \"category\": \"people\"\r\n },\r\n \"dizzy_face\": {\r\n \"keywords\": [\"spent\", \"unconscious\", \"xox\", \"dizzy\"],\r\n \"char\": \"😵\",\r\n \"category\": \"people\"\r\n },\r\n \"astonished\": {\r\n \"keywords\": [\"face\", \"xox\", \"surprised\", \"poisoned\"],\r\n \"char\": \"😲\",\r\n \"category\": \"people\"\r\n },\r\n \"zipper_mouth\": {\r\n \"keywords\": [\"face\", \"sealed\", \"zipper\", \"secret\"],\r\n \"char\": \"🤐\",\r\n \"category\": \"people\"\r\n },\r\n \"mask\": {\r\n \"keywords\": [\"face\", \"sick\", \"ill\", \"disease\"],\r\n \"char\": \"😷\",\r\n \"category\": \"people\"\r\n },\r\n \"thermometer_face\": {\r\n \"keywords\": [\"sick\", \"temperature\", \"thermometer\", \"cold\"],\r\n \"char\": \"🤒\",\r\n \"category\": \"people\"\r\n },\r\n \"bandage_face\": {\r\n \"keywords\": [\"injured\", \"clumsy\", \"bandage\", \"hurt\"],\r\n \"char\": \"🤕\",\r\n \"category\": \"people\"\r\n },\r\n \"sleeping\": {\r\n \"keywords\": [\"face\", \"tired\", \"sleepy\", \"night\", \"zzz\"],\r\n \"char\": \"😴\",\r\n \"category\": \"people\"\r\n },\r\n \"zzz\": {\r\n \"keywords\": [\"sleepy\", \"tired\"],\r\n \"char\": \"💤\",\r\n \"category\": \"people\"\r\n },\r\n \"hankey\": {\r\n \"keywords\": [\"poop\", \"shitface\", \"fail\", \"turd\", \"shit\"],\r\n \"char\": \"💩\",\r\n \"category\": \"people\"\r\n },\r\n \"smiling_imp\": {\r\n \"keywords\": [\"devil\", \"horns\"],\r\n \"char\": \"😈\",\r\n \"category\": \"people\"\r\n },\r\n \"imp\": {\r\n \"keywords\": [\"devil\", \"angry\", \"horns\"],\r\n \"char\": \"👿\",\r\n \"category\": \"people\"\r\n },\r\n \"japanese_ogre\": {\r\n \"keywords\": [\"monster\", \"red\", \"mask\", \"halloween\", \"scary\", \"creepy\", \"devil\", \"demon\", \"japanese\", \"ogre\"],\r\n \"char\": \"👹\",\r\n \"category\": \"people\"\r\n },\r\n \"japanese_goblin\": {\r\n \"keywords\": [\"red\", \"evil\", \"mask\", \"monster\", \"scary\", \"creepy\", \"japanese\", \"goblin\"],\r\n \"char\": \"👺\",\r\n \"category\": \"people\"\r\n },\r\n \"skull\": {\r\n \"keywords\": [\"dead\", \"skeleton\", \"creepy\"],\r\n \"char\": \"💀\",\r\n \"category\": \"people\"\r\n },\r\n \"ghost\": {\r\n \"keywords\": [\"halloween\", \"spooky\", \"scary\"],\r\n \"char\": \"👻\",\r\n \"category\": \"people\"\r\n },\r\n \"alien\": {\r\n \"keywords\": [\"UFO\", \"paul\", \"weird\", \"outer_space\"],\r\n \"char\": \"👽\",\r\n \"category\": \"people\"\r\n },\r\n \"robot\": {\r\n \"keywords\": [\"computer\", \"machine\"],\r\n \"char\": \"🤖\",\r\n \"category\": \"people\"\r\n },\r\n \"smiley_cat\": {\r\n \"keywords\": [\"animal\", \"cats\", \"happy\", \"smile\"],\r\n \"char\": \"😺\",\r\n \"category\": \"people\"\r\n },\r\n \"smile_cat\": {\r\n \"keywords\": [\"animal\", \"cats\", \"smile\"],\r\n \"char\": \"😸\",\r\n \"category\": \"people\"\r\n },\r\n \"joy_cat\": {\r\n \"keywords\": [\"animal\", \"cats\", \"haha\", \"happy\", \"tears\"],\r\n \"char\": \"😹\",\r\n \"category\": \"people\"\r\n },\r\n \"heart_eyes_cat\": {\r\n \"keywords\": [\"animal\", \"love\", \"like\", \"affection\", \"cats\", \"valentines\", \"heart\"],\r\n \"char\": \"😻\",\r\n \"category\": \"people\"\r\n },\r\n \"smirk_cat\": {\r\n \"keywords\": [\"animal\", \"cats\", \"smirk\"],\r\n \"char\": \"😼\",\r\n \"category\": \"people\"\r\n },\r\n \"kissing_cat\": {\r\n \"keywords\": [\"animal\", \"cats\", \"kiss\"],\r\n \"char\": \"😽\",\r\n \"category\": \"people\"\r\n },\r\n \"scream_cat\": {\r\n \"keywords\": [\"animal\", \"cats\", \"munch\", \"scared\", \"scream\"],\r\n \"char\": \"🙀\",\r\n \"category\": \"people\"\r\n },\r\n \"crying_cat_face\": {\r\n \"keywords\": [\"animal\", \"tears\", \"weep\", \"sad\", \"cats\", \"upset\", \"cry\"],\r\n \"char\": \"😿\",\r\n \"category\": \"people\"\r\n },\r\n \"pouting_cat\": {\r\n \"keywords\": [\"animal\", \"cats\"],\r\n \"char\": \"😾\",\r\n \"category\": \"people\"\r\n },\r\n \"raised_hands\": {\r\n \"keywords\": [\"gesture\", \"hooray\", \"yea\", \"celebration\", \"hands\"],\r\n \"char\": \"🙌\",\r\n \"category\": \"people\"\r\n },\r\n \"clap\": {\r\n \"keywords\": [\"hands\", \"praise\", \"applause\", \"congrats\", \"yay\"],\r\n \"char\": \"👏\",\r\n \"category\": \"people\"\r\n },\r\n \"wave\": {\r\n \"keywords\": [\"hands\", \"gesture\", \"goodbye\", \"solong\", \"farewell\", \"hello\", \"palm\"],\r\n \"char\": \"👋\",\r\n \"category\": \"people\"\r\n },\r\n \"+1\": {\r\n \"keywords\": [\"thumbsup\", \"yes\", \"awesome\", \"good\", \"agree\", \"accept\", \"cool\", \"hand\", \"like\"],\r\n \"char\": \"👍\",\r\n \"category\": \"people\"\r\n },\r\n \"minus1\": { // TODO: should be \"-1\", fix TS bug\r\n \"keywords\": [\"thumbsdown\", \"no\", \"dislike\", \"hand\"],\r\n \"char\": \"👎\",\r\n \"category\": \"people\"\r\n },\r\n \"facepunch\": {\r\n \"keywords\": [\"angry\", \"violence\", \"fist\", \"hit\", \"attack\", \"hand\"],\r\n \"char\": \"👊\",\r\n \"category\": \"people\"\r\n },\r\n \"fist\": {\r\n \"keywords\": [\"fingers\", \"hand\", \"grasp\"],\r\n \"char\": \"✊\",\r\n \"category\": \"people\"\r\n },\r\n \"v\": {\r\n \"keywords\": [\"fingers\", \"ohyeah\", \"hand\", \"peace\", \"victory\", \"two\"],\r\n \"char\": \"✌️\",\r\n \"category\": \"people\"\r\n },\r\n \"ok_hand\": {\r\n \"keywords\": [\"fingers\", \"limbs\", \"perfect\", \"ok\"],\r\n \"char\": \"👌\",\r\n \"category\": \"people\"\r\n },\r\n \"hand\": {\r\n \"keywords\": [\"fingers\", \"stop\", \"highfive\", \"palm\", \"ban\", \"raised_hand\"],\r\n \"char\": \"✋\",\r\n \"category\": \"people\"\r\n },\r\n \"open_hands\": {\r\n \"keywords\": [\"fingers\", \"butterfly\", \"hands\", \"open\"],\r\n \"char\": \"👐\",\r\n \"category\": \"people\"\r\n },\r\n \"muscle\": {\r\n \"keywords\": [\"arm\", \"flex\", \"hand\", \"summer\", \"strong\", \"biceps\"],\r\n \"char\": \"💪\",\r\n \"category\": \"people\"\r\n },\r\n \"pray\": {\r\n \"keywords\": [\"please\", \"hope\", \"wish\", \"namaste\", \"highfive\"],\r\n \"char\": \"🙏\",\r\n \"category\": \"people\"\r\n },\r\n \"point_up\": {\r\n \"keywords\": [\"hand\", \"fingers\", \"direction\", \"up\"],\r\n \"char\": \"☝️\",\r\n \"category\": \"people\"\r\n },\r\n \"point_up_2\": {\r\n \"keywords\": [\"fingers\", \"hand\", \"direction\", \"up\"],\r\n \"char\": \"👆\",\r\n \"category\": \"people\"\r\n },\r\n \"point_down\": {\r\n \"keywords\": [\"fingers\", \"hand\", \"direction\", \"down\"],\r\n \"char\": \"👇\",\r\n \"category\": \"people\"\r\n },\r\n \"point_left\": {\r\n \"keywords\": [\"direction\", \"fingers\", \"hand\", \"left\"],\r\n \"char\": \"👈\",\r\n \"category\": \"people\"\r\n },\r\n \"point_right\": {\r\n \"keywords\": [\"fingers\", \"hand\", \"direction\", \"right\"],\r\n \"char\": \"👉\",\r\n \"category\": \"people\"\r\n },\r\n \"middle_finger\": {\r\n \"keywords\": [\"hand\", \"fingers\", \"rude\"],\r\n \"char\": \"🖕\",\r\n \"category\": \"people\"\r\n },\r\n \"splayed_fingers\": {\r\n \"keywords\": [\"hand\", \"fingers\", \"palm\"],\r\n \"char\": \"🖐\",\r\n \"category\": \"people\"\r\n },\r\n \"sign_of_horns\": {\r\n \"keywords\": [\"hand\", \"fingers\", \"evil_eye\", \"metal\", \"rock_on\"],\r\n \"char\": \"🤘\",\r\n \"category\": \"people\"\r\n },\r\n \"vulcan_salute\": {\r\n \"keywords\": [\"hand\", \"fingers\", \"spock\", \"star trek\"],\r\n \"char\": \"🖖\",\r\n \"category\": \"people\"\r\n },\r\n \"writing_hand\": {\r\n \"keywords\": [\"pen\", \"stationery\", \"write\"],\r\n \"char\": \"✍\",\r\n \"category\": \"people\"\r\n },\r\n \"nail_care\": {\r\n \"keywords\": [\"beauty\", \"manicure\", \"finger\", \"fashion\", \"nail\"],\r\n \"char\": \"💅\",\r\n \"category\": \"people\"\r\n },\r\n \"lips\": {\r\n \"keywords\": [\"mouth\", \"kiss\"],\r\n \"char\": \"👄\",\r\n \"category\": \"people\"\r\n },\r\n \"tongue\": {\r\n \"keywords\": [\"mouth\", \"playful\"],\r\n \"char\": \"👅\",\r\n \"category\": \"people\"\r\n },\r\n \"ear\": {\r\n \"keywords\": [\"face\", \"hear\", \"sound\", \"listen\"],\r\n \"char\": \"👂\",\r\n \"category\": \"people\"\r\n },\r\n \"nose\": {\r\n \"keywords\": [\"smell\", \"sniff\"],\r\n \"char\": \"👃\",\r\n \"category\": \"people\"\r\n },\r\n \"eye\": {\r\n \"keywords\": [\"face\", \"look\", \"see\", \"watch\", \"stare\"],\r\n \"char\": \"👁\",\r\n \"category\": \"people\"\r\n },\r\n \"eyes\": {\r\n \"keywords\": [\"look\", \"watch\", \"stalk\", \"peek\", \"see\"],\r\n \"char\": \"👀\",\r\n \"category\": \"people\"\r\n },\r\n \"bust_in_silhouette\": {\r\n \"keywords\": [\"user\", \"person\", \"human\"],\r\n \"char\": \"👤\",\r\n \"category\": \"people\"\r\n },\r\n \"busts_in_silhouette\": {\r\n \"keywords\": [\"user\", \"person\", \"human\", \"group\", \"team\"],\r\n \"char\": \"👥\",\r\n \"category\": \"people\"\r\n },\r\n \"speaking_head\": {\r\n \"keywords\": [\"user\", \"person\", \"human\"],\r\n \"char\": \"🗣\",\r\n \"category\": \"people\"\r\n },\r\n \"baby\": {\r\n \"keywords\": [\"child\", \"boy\", \"girl\", \"toddler\"],\r\n \"char\": \"👶\",\r\n \"category\": \"people\"\r\n },\r\n \"boy\": {\r\n \"keywords\": [\"man\", \"male\", \"guy\", \"teenager\"],\r\n \"char\": \"👦\",\r\n \"category\": \"people\"\r\n },\r\n \"girl\": {\r\n \"keywords\": [\"female\", \"woman\", \"teenager\"],\r\n \"char\": \"👧\",\r\n \"category\": \"people\"\r\n },\r\n \"man\": {\r\n \"keywords\": [\"mustache\", \"father\", \"dad\", \"guy\", \"classy\", \"sir\", \"moustache\"],\r\n \"char\": \"👨\",\r\n \"category\": \"people\"\r\n },\r\n \"woman\": {\r\n \"keywords\": [\"female\", \"girls\", \"lady\"],\r\n \"char\": \"👩\",\r\n \"category\": \"people\"\r\n },\r\n \"person_with_blond_hair\": {\r\n \"keywords\": [\"man\", \"male\", \"boy\", \"blonde\", \"guy\", \"person\"],\r\n \"char\": \"👱\",\r\n \"category\": \"people\"\r\n },\r\n \"older_man\": {\r\n \"keywords\": [\"human\", \"male\", \"men\", \"old\", \"elder\", \"senior\"],\r\n \"char\": \"👴\",\r\n \"category\": \"people\"\r\n },\r\n \"older_woman\": {\r\n \"keywords\": [\"human\", \"female\", \"women\", \"lady\", \"old\", \"elder\", \"senior\"],\r\n \"char\": \"👵\",\r\n \"category\": \"people\"\r\n },\r\n \"man_with_gua_pi_mao\": {\r\n \"keywords\": [\"male\", \"boy\", \"chinese\"],\r\n \"char\": \"👲\",\r\n \"category\": \"people\"\r\n },\r\n \"man_with_turban\": {\r\n \"keywords\": [\"male\", \"indian\", \"hinduism\", \"arabs\"],\r\n \"char\": \"👳\",\r\n \"category\": \"people\"\r\n },\r\n \"cop\": {\r\n \"keywords\": [\"man\", \"police\", \"law\", \"legal\", \"enforcement\", \"arrest\", \"911\"],\r\n \"char\": \"👮\",\r\n \"category\": \"people\"\r\n },\r\n \"construction_worker\": {\r\n \"keywords\": [\"male\", \"human\", \"wip\", \"guy\", \"build\", \"construction\", \"worker\", \"labor\"],\r\n \"char\": \"👷\",\r\n \"category\": \"people\"\r\n },\r\n \"guardsman\": {\r\n \"keywords\": [\"uk\", \"gb\", \"british\", \"male\", \"guy\", \"royal\"],\r\n \"char\": \"💂\",\r\n \"category\": \"people\"\r\n },\r\n \"sleuth\": {\r\n \"keywords\": [\"human\", \"spy\", \"detective\"],\r\n \"char\": \"🕵\",\r\n \"category\": \"people\"\r\n },\r\n \"santa\": {\r\n \"keywords\": [\"festival\", \"man\", \"male\", \"xmas\", \"father christmas\"],\r\n \"char\": \"🎅\",\r\n \"category\": \"people\"\r\n },\r\n \"angel\": {\r\n \"keywords\": [\"heaven\", \"wings\", \"halo\"],\r\n \"char\": \"👼\",\r\n \"category\": \"people\"\r\n },\r\n \"princess\": {\r\n \"keywords\": [\"girl\", \"woman\", \"female\", \"blond\", \"crown\", \"royal\", \"queen\"],\r\n \"char\": \"👸\",\r\n \"category\": \"people\"\r\n },\r\n \"bride_with_veil\": {\r\n \"keywords\": [\"couple\", \"marriage\", \"wedding\", \"woman\", \"bride\"],\r\n \"char\": \"👰\",\r\n \"category\": \"people\"\r\n },\r\n \"runner\": {\r\n \"keywords\": [\"man\", \"walking\", \"exercise\", \"race\", \"running\"],\r\n \"char\": \"🏃\",\r\n \"category\": \"people\"\r\n },\r\n \"walking\": {\r\n \"keywords\": [\"human\", \"feet\", \"steps\"],\r\n \"char\": \"🚶\",\r\n \"category\": \"people\"\r\n },\r\n \"dancer\": {\r\n \"keywords\": [\"female\", \"girl\", \"woman\", \"fun\"],\r\n \"char\": \"💃\",\r\n \"category\": \"people\"\r\n },\r\n \"dancers\": {\r\n \"keywords\": [\"female\", \"bunny\", \"women\", \"girls\"],\r\n \"char\": \"👯\",\r\n \"category\": \"people\"\r\n },\r\n \"couple\": {\r\n \"keywords\": [\"pair\", \"people\", \"human\", \"love\", \"date\", \"dating\", \"like\", \"affection\", \"valentines\", \"marriage\"],\r\n \"char\": \"👫\",\r\n \"category\": \"people\"\r\n },\r\n \"two_men_holding_hands\": {\r\n \"keywords\": [\"pair\", \"couple\", \"love\", \"like\", \"bromance\", \"friendship\", \"people\", \"human\"],\r\n \"char\": \"👬\",\r\n \"category\": \"people\"\r\n },\r\n \"two_women_holding_hands\": {\r\n \"keywords\": [\"pair\", \"friendship\", \"couple\", \"love\", \"like\", \"female\", \"people\", \"human\"],\r\n \"char\": \"👭\",\r\n \"category\": \"people\"\r\n },\r\n \"bow\": {\r\n \"keywords\": [\"man\", \"male\", \"boy\"],\r\n \"char\": \"🙇\",\r\n \"category\": \"people\"\r\n },\r\n \"information_desk_person\": {\r\n \"keywords\": [\"female\", \"girl\", \"woman\", \"human\", \"information\"],\r\n \"char\": \"💁\",\r\n \"category\": \"people\"\r\n },\r\n \"no_good\": {\r\n \"keywords\": [\"female\", \"girl\", \"woman\", \"nope\"],\r\n \"char\": \"🙅\",\r\n \"category\": \"people\"\r\n },\r\n \"ok_woman\": {\r\n \"keywords\": [\"women\", \"girl\", \"female\", \"pink\", \"human\", \"woman\"],\r\n \"char\": \"🙆\",\r\n \"category\": \"people\"\r\n },\r\n \"raising_hand\": {\r\n \"keywords\": [\"female\", \"girl\", \"woman\"],\r\n \"char\": \"🙋\",\r\n \"category\": \"people\"\r\n },\r\n \"person_with_pouting_face\": {\r\n \"keywords\": [\"female\", \"girl\", \"woman\"],\r\n \"char\": \"🙎\",\r\n \"category\": \"people\"\r\n },\r\n \"person_frowning\": {\r\n \"keywords\": [\"female\", \"girl\", \"woman\", \"sad\", \"depressed\", \"discouraged\", \"unhappy\"],\r\n \"char\": \"🙍\",\r\n \"category\": \"people\"\r\n },\r\n \"haircut\": {\r\n \"keywords\": [\"female\", \"girl\", \"woman\"],\r\n \"char\": \"💇\",\r\n \"category\": \"people\"\r\n },\r\n \"massage\": {\r\n \"keywords\": [\"female\", \"girl\", \"woman\", \"head\"],\r\n \"char\": \"💆\",\r\n \"category\": \"people\"\r\n },\r\n \"couple_with_heart\": {\r\n \"keywords\": [\"pair\", \"love\", \"like\", \"affection\", \"human\", \"dating\", \"valentines\", \"marriage\"],\r\n \"char\": \"💑\",\r\n \"category\": \"people\"\r\n },\r\n \"female_couple_with_heart\": {\r\n \"keywords\": [\"pair\", \"love\", \"like\", \"affection\", \"human\", \"dating\", \"valentines\", \"marriage\"],\r\n \"char\": \"👩❤️👩\",\r\n \"category\": \"people\"\r\n },\r\n \"male_couple_with_heart\": {\r\n \"keywords\": [\"pair\", \"love\", \"like\", \"affection\", \"human\", \"dating\", \"valentines\", \"marriage\"],\r\n \"char\": \"👨❤️👨\",\r\n \"category\": \"people\"\r\n },\r\n \"couplekiss\": {\r\n \"keywords\": [\"pair\", \"valentines\", \"love\", \"like\", \"dating\", \"marriage\"],\r\n \"char\": \"💏\",\r\n \"category\": \"people\"\r\n },\r\n \"female_couplekiss\": {\r\n \"keywords\": [\"pair\", \"valentines\", \"love\", \"like\", \"dating\", \"marriage\"],\r\n \"char\": \"👩❤️💋👩\",\r\n \"category\": \"people\"\r\n },\r\n \"male_couplekiss\": {\r\n \"keywords\": [\"pair\", \"valentines\", \"love\", \"like\", \"dating\", \"marriage\"],\r\n \"char\": \"👨❤️💋👨\",\r\n \"category\": \"people\"\r\n },\r\n \"family\": {\r\n \"keywords\": [\"home\", \"parents\", \"child\", \"mom\", \"dad\", \"father\", \"mother\", \"people\", \"human\"],\r\n \"char\": \"👪\",\r\n \"category\": \"people\"\r\n },\r\n \"family_man_woman_girl\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"child\"],\r\n \"char\": \"👨👩👧\",\r\n \"category\": \"people\"\r\n },\r\n \"family_man_woman_girl_boy\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👨👩👧👦\",\r\n \"category\": \"people\"\r\n },\r\n \"family_man_woman_boys\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👨👩👦👦\",\r\n \"category\": \"people\"\r\n },\r\n \"family_man_woman_girls\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👨👩👧👧\",\r\n \"category\": \"people\"\r\n },\r\n \"family_women_boy\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👩👩👦\",\r\n \"category\": \"people\"\r\n },\r\n \"family_women_girl\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👩👩👧\",\r\n \"category\": \"people\"\r\n },\r\n \"family_women_girl_boy\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👩👩👧👦\",\r\n \"category\": \"people\"\r\n },\r\n \"family_women_boys\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👩👩👦👦\",\r\n \"category\": \"people\"\r\n },\r\n \"family_women_girls\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👩👩👧👧\",\r\n \"category\": \"people\"\r\n },\r\n \"family_men_boy\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👨👨👦\",\r\n \"category\": \"people\"\r\n },\r\n \"family_men_girl\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👨👨👧\",\r\n \"category\": \"people\"\r\n },\r\n \"family_men_girl_boy\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👨👨👧👦\",\r\n \"category\": \"people\"\r\n },\r\n \"family_men_boys\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👨👨👦👦\",\r\n \"category\": \"people\"\r\n },\r\n \"family_men_girls\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👨👨👧👧\",\r\n \"category\": \"people\"\r\n },\r\n \"womans_clothes\": {\r\n \"keywords\": [\"fashion\", \"shopping\", \"female\"],\r\n \"char\": \"👚\",\r\n \"category\": \"people\"\r\n },\r\n \"shirt\": {\r\n \"keywords\": [\"fashion\", \"cloth\", \"casual\", \"tshirt\", \"tee\"],\r\n \"char\": \"👕\",\r\n \"category\": \"people\"\r\n },\r\n \"jeans\": {\r\n \"keywords\": [\"fashion\", \"shopping\"],\r\n \"char\": \"👖\",\r\n \"category\": \"people\"\r\n },\r\n \"necktie\": {\r\n \"keywords\": [\"shirt\", \"suitup\", \"formal\", \"fashion\", \"cloth\", \"business\"],\r\n \"char\": \"👔\",\r\n \"category\": \"people\"\r\n },\r\n \"dress\": {\r\n \"keywords\": [\"clothes\", \"fashion\", \"shopping\"],\r\n \"char\": \"👗\",\r\n \"category\": \"people\"\r\n },\r\n \"bikini\": {\r\n \"keywords\": [\"swimming\", \"female\", \"woman\", \"girl\", \"fashion\", \"beach\", \"summer\"],\r\n \"char\": \"👙\",\r\n \"category\": \"people\"\r\n },\r\n \"kimono\": {\r\n \"keywords\": [\"dress\", \"fashion\", \"women\", \"female\", \"japanese\"],\r\n \"char\": \"👘\",\r\n \"category\": \"people\"\r\n },\r\n \"lipstick\": {\r\n \"keywords\": [\"female\", \"girl\", \"fashion\", \"woman\"],\r\n \"char\": \"💄\",\r\n \"category\": \"people\"\r\n },\r\n \"kiss\": {\r\n \"keywords\": [\"face\", \"lips\", \"love\", \"like\", \"affection\", \"valentines\"],\r\n \"char\": \"💋\",\r\n \"category\": \"people\"\r\n },\r\n \"footprints\": {\r\n \"keywords\": [\"feet\", \"tracking\", \"walking\", \"beach\"],\r\n \"char\": \"👣\",\r\n \"category\": \"people\"\r\n },\r\n \"high_heel\": {\r\n \"keywords\": [\"fashion\", \"shoes\", \"female\", \"pumps\", \"stiletto\"],\r\n \"char\": \"👠\",\r\n \"category\": \"people\"\r\n },\r\n \"sandal\": {\r\n \"keywords\": [\"shoes\", \"fashion\", \"flip flops\"],\r\n \"char\": \"👡\",\r\n \"category\": \"people\"\r\n },\r\n \"boot\": {\r\n \"keywords\": [\"shoes\", \"fashion\"],\r\n \"char\": \"👢\",\r\n \"category\": \"people\"\r\n },\r\n \"mans_shoe\": {\r\n \"keywords\": [\"fashion\", \"male\"],\r\n \"char\": \"👞\",\r\n \"category\": \"people\"\r\n },\r\n \"athletic_shoe\": {\r\n \"keywords\": [\"shoes\", \"sports\", \"sneakers\"],\r\n \"char\": \"👟\",\r\n \"category\": \"people\"\r\n },\r\n \"womans_hat\": {\r\n \"keywords\": [\"fashion\", \"accessories\", \"female\", \"lady\", \"spring\"],\r\n \"char\": \"👒\",\r\n \"category\": \"people\"\r\n },\r\n \"tophat\": {\r\n \"keywords\": [\"magic\", \"gentleman\", \"classy\", \"circus\"],\r\n \"char\": \"🎩\",\r\n \"category\": \"people\"\r\n },\r\n \"helmet\": {\r\n \"keywords\": [\"construction\", \"build\"],\r\n \"char\": \"⛑\",\r\n \"category\": \"people\"\r\n },\r\n \"mortar_board\": {\r\n \"keywords\": [\"school\", \"college\", \"degree\", \"university\", \"graduation\", \"cap\", \"hat\", \"legal\", \"learn\", \"education\"],\r\n \"char\": \"🎓\",\r\n \"category\": \"people\"\r\n },\r\n \"crown\": {\r\n \"keywords\": [\"king\", \"kod\", \"leader\", \"royalty\", \"lord\"],\r\n \"char\": \"👑\",\r\n \"category\": \"people\"\r\n },\r\n \"school_satchel\": {\r\n \"keywords\": [\"student\", \"education\", \"bag\", \"backpack\"],\r\n \"char\": \"🎒\",\r\n \"category\": \"people\"\r\n },\r\n \"pouch\": {\r\n \"keywords\": [\"bag\", \"accessories\", \"shopping\"],\r\n \"char\": \"👝\",\r\n \"category\": \"people\"\r\n },\r\n \"purse\": {\r\n \"keywords\": [\"fashion\", \"accessories\", \"money\", \"sales\", \"shopping\"],\r\n \"char\": \"👛\",\r\n \"category\": \"people\"\r\n },\r\n \"handbag\": {\r\n \"keywords\": [\"fashion\", \"accessory\", \"accessories\", \"shopping\"],\r\n \"char\": \"👜\",\r\n \"category\": \"people\"\r\n },\r\n \"briefcase\": {\r\n \"keywords\": [\"business\", \"documents\", \"work\", \"law\", \"legal\"],\r\n \"char\": \"💼\",\r\n \"category\": \"people\"\r\n },\r\n \"eyeglasses\": {\r\n \"keywords\": [\"fashion\", \"accessories\", \"eyesight\", \"nerdy\", \"dork\", \"geek\"],\r\n \"char\": \"👓\",\r\n \"category\": \"people\"\r\n },\r\n \"dark_sunglasses\": {\r\n \"keywords\": [\"face\", \"cool\", \"accessories\"],\r\n \"char\": \"🕶\",\r\n \"category\": \"people\"\r\n },\r\n \"ring\": {\r\n \"keywords\": [\"wedding\", \"propose\", \"marriage\", \"valentines\", \"diamond\", \"fashion\", \"jewelry\", \"gem\", \"engagement\"],\r\n \"char\": \"💍\",\r\n \"category\": \"people\"\r\n },\r\n \"closed_umbrella\": {\r\n \"keywords\": [\"weather\", \"rain\", \"drizzle\"],\r\n \"char\": \"🌂\",\r\n \"category\": \"people\"\r\n },\r\n \"dog\": {\r\n \"keywords\": [\"animal\", \"friend\", \"nature\", \"woof\", \"puppy\", \"pet\", \"faithful\"],\r\n \"char\": \"🐶\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cat\": {\r\n \"keywords\": [\"animal\", \"meow\", \"nature\", \"pet\", \"kitten\"],\r\n \"char\": \"🐱\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"mouse\": {\r\n \"keywords\": [\"animal\", \"nature\", \"cheese\", \"rodent\"],\r\n \"char\": \"🐭\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"hamster\": {\r\n \"keywords\": [\"animal\", \"nature\"],\r\n \"char\": \"🐹\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"rabbit\": {\r\n \"keywords\": [\"animal\", \"nature\", \"pet\", \"spring\", \"magic\", \"bunny\"],\r\n \"char\": \"🐰\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"bear\": {\r\n \"keywords\": [\"animal\", \"nature\", \"wild\"],\r\n \"char\": \"🐻\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"panda_face\": {\r\n \"keywords\": [\"animal\", \"nature\", \"panda\"],\r\n \"char\": \"🐼\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"koala\": {\r\n \"keywords\": [\"animal\", \"nature\"],\r\n \"char\": \"🐨\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"tiger\": {\r\n \"keywords\": [\"animal\", \"cat\", \"danger\", \"wild\", \"nature\", \"roar\"],\r\n \"char\": \"🐯\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"lion_face\": {\r\n \"keywords\": [\"animal\", \"nature\"],\r\n \"char\": \"🦁\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cow\": {\r\n \"keywords\": [\"beef\", \"ox\", \"animal\", \"nature\", \"moo\", \"milk\"],\r\n \"char\": \"🐮\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"pig\": {\r\n \"keywords\": [\"animal\", \"oink\", \"nature\"],\r\n \"char\": \"🐷\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"pig_nose\": {\r\n \"keywords\": [\"animal\", \"oink\"],\r\n \"char\": \"🐽\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"frog\": {\r\n \"keywords\": [\"animal\", \"nature\", \"croak\", \"toad\"],\r\n \"char\": \"🐸\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"octopus\": {\r\n \"keywords\": [\"animal\", \"creature\", \"ocean\", \"sea\", \"nature\", \"beach\"],\r\n \"char\": \"🐙\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"monkey_face\": {\r\n \"keywords\": [\"animal\", \"nature\", \"circus\"],\r\n \"char\": \"🐵\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"see_no_evil\": {\r\n \"keywords\": [\"monkey\", \"animal\", \"nature\", \"haha\"],\r\n \"char\": \"🙈\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"hear_no_evil\": {\r\n \"keywords\": [\"animal\", \"monkey\", \"nature\"],\r\n \"char\": \"🙉\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"speak_no_evil\": {\r\n \"keywords\": [\"monkey\", \"animal\", \"nature\", \"omg\"],\r\n \"char\": \"🙊\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"monkey\": {\r\n \"keywords\": [\"animal\", \"nature\", \"banana\", \"circus\"],\r\n \"char\": \"🐒\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"chicken\": {\r\n \"keywords\": [\"animal\", \"cluck\", \"nature\", \"bird\"],\r\n \"char\": \"🐔\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"penguin\": {\r\n \"keywords\": [\"animal\", \"nature\"],\r\n \"char\": \"🐧\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"bird\": {\r\n \"keywords\": [\"animal\", \"nature\", \"fly\", \"tweet\", \"spring\"],\r\n \"char\": \"🐦\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"baby_chick\": {\r\n \"keywords\": [\"animal\", \"chicken\", \"bird\"],\r\n \"char\": \"🐤\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"hatching_chick\": {\r\n \"keywords\": [\"animal\", \"chicken\", \"egg\", \"born\", \"baby\", \"bird\"],\r\n \"char\": \"🐣\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"hatched_chick\": {\r\n \"keywords\": [\"animal\", \"chicken\", \"baby\", \"bird\"],\r\n \"char\": \"🐥\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"wolf\": {\r\n \"keywords\": [\"animal\", \"nature\", \"wild\"],\r\n \"char\": \"🐺\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"boar\": {\r\n \"keywords\": [\"animal\", \"nature\"],\r\n \"char\": \"🐗\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"horse\": {\r\n \"keywords\": [\"animal\", \"brown\", \"nature\"],\r\n \"char\": \"🐴\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"unicorn_face\": {\r\n \"keywords\": [\"animal\", \"nature\", \"mystical\"],\r\n \"char\": \"🦄\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"bee\": {\r\n \"keywords\": [\"animal\", \"insect\", \"nature\", \"bug\", \"spring\", \"honey\"],\r\n \"char\": \"🐝\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"bug\": {\r\n \"keywords\": [\"animal\", \"insect\", \"nature\", \"worm\"],\r\n \"char\": \"🐛\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"snail\": {\r\n \"keywords\": [\"slow\", \"animal\", \"shell\"],\r\n \"char\": \"🐌\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"beetle\": {\r\n \"keywords\": [\"animal\", \"insect\", \"nature\", \"ladybug\"],\r\n \"char\": \"🐞\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"ant\": {\r\n \"keywords\": [\"animal\", \"insect\", \"nature\", \"bug\"],\r\n \"char\": \"🐜\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"spider\": {\r\n \"keywords\": [\"animal\", \"arachnid\"],\r\n \"char\": \"🕷\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"scorpion\": {\r\n \"keywords\": [\"animal\", \"arachnid\"],\r\n \"char\": \"🦂\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"crab\": {\r\n \"keywords\": [\"animal\", \"crustacean\"],\r\n \"char\": \"🦀\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"snake\": {\r\n \"keywords\": [\"animal\", \"evil\", \"nature\", \"hiss\", \"python\"],\r\n \"char\": \"🐍\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"turtle\": {\r\n \"keywords\": [\"animal\", \"slow\", \"nature\", \"tortoise\"],\r\n \"char\": \"🐢\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"tropical_fish\": {\r\n \"keywords\": [\"animal\", \"swim\", \"ocean\", \"beach\", \"nemo\"],\r\n \"char\": \"🐠\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"fish\": {\r\n \"keywords\": [\"animal\", \"food\", \"nature\"],\r\n \"char\": \"🐟\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"blowfish\": {\r\n \"keywords\": [\"animal\", \"nature\", \"food\", \"sea\", \"ocean\"],\r\n \"char\": \"🐡\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"dolphin\": {\r\n \"keywords\": [\"animal\", \"nature\", \"fish\", \"sea\", \"ocean\", \"flipper\", \"fins\", \"beach\"],\r\n \"char\": \"🐬\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"whale\": {\r\n \"keywords\": [\"animal\", \"nature\", \"sea\", \"ocean\"],\r\n \"char\": \"🐳\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"whale2\": {\r\n \"keywords\": [\"animal\", \"nature\", \"sea\", \"ocean\"],\r\n \"char\": \"🐋\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"crocodile\": {\r\n \"keywords\": [\"animal\", \"nature\", \"reptile\", \"lizard\", \"alligator\"],\r\n \"char\": \"🐊\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"leopard\": {\r\n \"keywords\": [\"animal\", \"nature\"],\r\n \"char\": \"🐆\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"tiger2\": {\r\n \"keywords\": [\"animal\", \"nature\", \"roar\"],\r\n \"char\": \"🐅\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"water_buffalo\": {\r\n \"keywords\": [\"animal\", \"nature\", \"ox\", \"cow\"],\r\n \"char\": \"🐃\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"ox\": {\r\n \"keywords\": [\"animal\", \"cow\", \"beef\"],\r\n \"char\": \"🐂\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cow2\": {\r\n \"keywords\": [\"beef\", \"ox\", \"animal\", \"nature\", \"moo\", \"milk\"],\r\n \"char\": \"🐄\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"dromedary_camel\": {\r\n \"keywords\": [\"animal\", \"hot\", \"desert\", \"hump\"],\r\n \"char\": \"🐪\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"camel\": {\r\n \"keywords\": [\"animal\", \"nature\", \"hot\", \"desert\", \"hump\"],\r\n \"char\": \"🐫\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"elephant\": {\r\n \"keywords\": [\"animal\", \"nature\", \"nose\", \"thailand\", \"circus\"],\r\n \"char\": \"🐘\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"goat\": {\r\n \"keywords\": [\"animal\", \"nature\"],\r\n \"char\": \"🐐\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"ram\": {\r\n \"keywords\": [\"animal\", \"sheep\", \"nature\"],\r\n \"char\": \"🐏\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"sheep\": {\r\n \"keywords\": [\"animal\", \"nature\", \"wool\", \"shipit\"],\r\n \"char\": \"🐑\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"racehorse\": {\r\n \"keywords\": [\"animal\", \"gamble\", \"luck\"],\r\n \"char\": \"🐎\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"pig2\": {\r\n \"keywords\": [\"animal\", \"nature\"],\r\n \"char\": \"🐖\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"rat\": {\r\n \"keywords\": [\"animal\", \"mouse\", \"rodent\"],\r\n \"char\": \"🐀\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"mouse2\": {\r\n \"keywords\": [\"animal\", \"nature\", \"rodent\"],\r\n \"char\": \"🐁\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"rooster\": {\r\n \"keywords\": [\"animal\", \"nature\", \"chicken\"],\r\n \"char\": \"🐓\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"turkey\": {\r\n \"keywords\": [\"animal\", \"bird\"],\r\n \"char\": \"🦃\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"dove_of_peace\": {\r\n \"keywords\": [\"animal\", \"bird\"],\r\n \"char\": \"🕊\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"dog2\": {\r\n \"keywords\": [\"animal\", \"nature\", \"friend\", \"doge\", \"pet\", \"faithful\"],\r\n \"char\": \"🐕\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"poodle\": {\r\n \"keywords\": [\"dog\", \"animal\", \"101\", \"nature\", \"pet\"],\r\n \"char\": \"🐩\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cat2\": {\r\n \"keywords\": [\"animal\", \"meow\", \"pet\", \"cats\"],\r\n \"char\": \"🐈\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"rabbit2\": {\r\n \"keywords\": [\"animal\", \"nature\", \"pet\", \"magic\", \"spring\"],\r\n \"char\": \"🐇\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"chipmunk\": {\r\n \"keywords\": [\"animal\", \"nature\", \"rodent\", \"squirrel\"],\r\n \"char\": \"🐿\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"feet\": {\r\n \"keywords\": [\"animal\", \"tracking\", \"footprints\", \"dog\", \"cat\", \"pet\", \"paw_prints\"],\r\n \"char\": \"🐾\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"dragon\": {\r\n \"keywords\": [\"animal\", \"myth\", \"nature\", \"chinese\", \"green\"],\r\n \"char\": \"🐉\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"dragon_face\": {\r\n \"keywords\": [\"animal\", \"myth\", \"nature\", \"chinese\", \"green\"],\r\n \"char\": \"🐲\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cactus\": {\r\n \"keywords\": [\"vegetable\", \"plant\", \"nature\"],\r\n \"char\": \"🌵\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"christmas_tree\": {\r\n \"keywords\": [\"festival\", \"vacation\", \"december\", \"xmas\", \"celebration\"],\r\n \"char\": \"🎄\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"evergreen_tree\": {\r\n \"keywords\": [\"plant\", \"nature\"],\r\n \"char\": \"🌲\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"deciduous_tree\": {\r\n \"keywords\": [\"plant\", \"nature\"],\r\n \"char\": \"🌳\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"palm_tree\": {\r\n \"keywords\": [\"plant\", \"vegetable\", \"nature\", \"summer\", \"beach\", \"mojito\", \"tropical\"],\r\n \"char\": \"🌴\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"seedling\": {\r\n \"keywords\": [\"plant\", \"nature\", \"grass\", \"lawn\", \"spring\"],\r\n \"char\": \"🌱\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"herb\": {\r\n \"keywords\": [\"vegetable\", \"plant\", \"medicine\", \"weed\", \"grass\", \"lawn\"],\r\n \"char\": \"🌿\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"shamrock\": {\r\n \"keywords\": [\"vegetable\", \"plant\", \"nature\", \"irish\", \"clover\"],\r\n \"char\": \"☘\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"four_leaf_clover\": {\r\n \"keywords\": [\"vegetable\", \"plant\", \"nature\", \"lucky\", \"irish\"],\r\n \"char\": \"🍀\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"bamboo\": {\r\n \"keywords\": [\"plant\", \"nature\", \"vegetable\", \"panda\", \"pine_decoration\"],\r\n \"char\": \"🎍\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"tanabata_tree\": {\r\n \"keywords\": [\"plant\", \"nature\", \"branch\", \"summer\"],\r\n \"char\": \"🎋\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"leaves\": {\r\n \"keywords\": [\"nature\", \"plant\", \"tree\", \"vegetable\", \"grass\", \"lawn\", \"spring\"],\r\n \"char\": \"🍃\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"fallen_leaf\": {\r\n \"keywords\": [\"nature\", \"plant\", \"vegetable\", \"leaves\"],\r\n \"char\": \"🍂\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"maple_leaf\": {\r\n \"keywords\": [\"nature\", \"plant\", \"vegetable\", \"canada\", \"fall\"],\r\n \"char\": \"🍁\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"ear_of_rice\": {\r\n \"keywords\": [\"nature\", \"plant\"],\r\n \"char\": \"🌾\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"hibiscus\": {\r\n \"keywords\": [\"plant\", \"vegetable\", \"flowers\", \"beach\"],\r\n \"char\": \"🌺\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"sunflower\": {\r\n \"keywords\": [\"nature\", \"plant\", \"fall\"],\r\n \"char\": \"🌻\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"rose\": {\r\n \"keywords\": [\"flowers\", \"valentines\", \"love\", \"spring\"],\r\n \"char\": \"🌹\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"tulip\": {\r\n \"keywords\": [\"flowers\", \"plant\", \"nature\", \"summer\", \"spring\"],\r\n \"char\": \"🌷\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"blossom\": {\r\n \"keywords\": [\"nature\", \"flowers\", \"yellow\"],\r\n \"char\": \"🌼\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cherry_blossom\": {\r\n \"keywords\": [\"nature\", \"plant\", \"spring\", \"flower\"],\r\n \"char\": \"🌸\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"bouquet\": {\r\n \"keywords\": [\"flowers\", \"nature\", \"spring\"],\r\n \"char\": \"💐\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"mushroom\": {\r\n \"keywords\": [\"plant\", \"vegetable\"],\r\n \"char\": \"🍄\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"chestnut\": {\r\n \"keywords\": [\"food\", \"squirrel\"],\r\n \"char\": \"🌰\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"jack_o_lantern\": {\r\n \"keywords\": [\"halloween\", \"light\", \"pumpkin\", \"creepy\", \"fall\"],\r\n \"char\": \"🎃\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"shell\": {\r\n \"keywords\": [\"nature\", \"sea\", \"beach\"],\r\n \"char\": \"🐚\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"spider_web\": {\r\n \"keywords\": [\"animal\", \"insect\", \"arachnid\", \"silk\"],\r\n \"char\": \"🕸\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"earth_americas\": {\r\n \"keywords\": [\"globe\", \"world\", \"USA\", \"international\"],\r\n \"char\": \"🌎\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"earth_africa\": {\r\n \"keywords\": [\"globe\", \"world\", \"international\"],\r\n \"char\": \"🌍\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"earth_asia\": {\r\n \"keywords\": [\"globe\", \"world\", \"east\", \"international\"],\r\n \"char\": \"🌏\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"full_moon\": {\r\n \"keywords\": [\"nature\", \"yellow\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\"],\r\n \"char\": \"🌕\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"waning_gibbous_moon\": {\r\n \"keywords\": [\"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\", \"waxing_gibbous_moon\"],\r\n \"char\": \"🌖\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"last_quarter_moon\": {\r\n \"keywords\": [\"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\"],\r\n \"char\": \"🌗\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"waning_crescent_moon\": {\r\n \"keywords\": [\"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\"],\r\n \"char\": \"🌘\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"new_moon\": {\r\n \"keywords\": [\"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\"],\r\n \"char\": \"🌑\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"waxing_crescent_moon\": {\r\n \"keywords\": [\"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\"],\r\n \"char\": \"🌒\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"first_quarter_moon\": {\r\n \"keywords\": [\"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\"],\r\n \"char\": \"🌓\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"moon\": {\r\n \"keywords\": [\"nature\", \"night\", \"sky\", \"gray\", \"twilight\", \"planet\", \"space\", \"evening\", \"sleep\"],\r\n \"char\": \"🌔\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"new_moon_with_face\": {\r\n \"keywords\": [\"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\"],\r\n \"char\": \"🌚\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"full_moon_with_face\": {\r\n \"keywords\": [\"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\"],\r\n \"char\": \"🌝\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"first_quarter_moon_with_face\": {\r\n \"keywords\": [\"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\"],\r\n \"char\": \"🌛\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"last_quarter_moon_with_face\": {\r\n \"keywords\": [\"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\"],\r\n \"char\": \"🌜\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"sun_with_face\": {\r\n \"keywords\": [\"nature\", \"morning\", \"sky\"],\r\n \"char\": \"🌞\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"crescent_moon\": {\r\n \"keywords\": [\"night\", \"sleep\", \"sky\", \"evening\", \"magic\"],\r\n \"char\": \"🌙\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"star\": {\r\n \"keywords\": [\"night\", \"yellow\"],\r\n \"char\": \"⭐\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"star2\": {\r\n \"keywords\": [\"night\", \"sparkle\", \"awesome\", \"good\", \"magic\"],\r\n \"char\": \"🌟\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"dizzy\": {\r\n \"keywords\": [\"star\", \"sparkle\", \"shoot\", \"magic\"],\r\n \"char\": \"💫\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"sparkles\": {\r\n \"keywords\": [\"stars\", \"shine\", \"shiny\", \"cool\", \"awesome\", \"good\", \"magic\"],\r\n \"char\": \"✨\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"comet\": {\r\n \"keywords\": [\"space\"],\r\n \"char\": \"☄\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"sunny\": {\r\n \"keywords\": [\"weather\", \"nature\", \"brightness\", \"summer\", \"beach\", \"spring\"],\r\n \"char\": \"☀️\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"white_sun_with_small_cloud\": {\r\n \"keywords\": [\"weather\"],\r\n \"char\": \"🌤\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"partly_sunny\": {\r\n \"keywords\": [\"weather\", \"nature\", \"cloudy\", \"morning\", \"fall\", \"spring\"],\r\n \"char\": \"⛅\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"white_sun_behind_cloud\": {\r\n \"keywords\": [\"weather\"],\r\n \"char\": \"🌥\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"white_sun_behind_cloud_with_rain\": {\r\n \"keywords\": [\"weather\"],\r\n \"char\": \"🌦\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cloud\": {\r\n \"keywords\": [\"weather\", \"sky\"],\r\n \"char\": \"☁️\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cloud_with_rain\": {\r\n \"keywords\": [\"weather\"],\r\n \"char\": \"🌧\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"thunder_cloud_and_rain\": {\r\n \"keywords\": [\"weather\", \"lightning\"],\r\n \"char\": \"⛈\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cloud_with_lightning\": {\r\n \"keywords\": [\"weather\", \"thunder\"],\r\n \"char\": \"🌩\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"zap\": {\r\n \"keywords\": [\"thunder\", \"weather\", \"lightning bolt\", \"fast\"],\r\n \"char\": \"⚡\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"fire\": {\r\n \"keywords\": [\"hot\", \"cook\", \"flame\"],\r\n \"char\": \"🔥\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"boom\": {\r\n \"keywords\": [\"bomb\", \"explode\", \"explosion\", \"collision\", \"blown\"],\r\n \"char\": \"💥\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"snowflake\": {\r\n \"keywords\": [\"winter\", \"season\", \"cold\", \"weather\", \"christmas\", \"xmas\"],\r\n \"char\": \"❄️\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cloud_with_snow\": {\r\n \"keywords\": [\"weather\"],\r\n \"char\": \"🌨\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"snowman\": {\r\n \"keywords\": [\"winter\", \"season\", \"cold\", \"weather\", \"christmas\", \"xmas\", \"frozen\", \"without_snow\"],\r\n \"char\": \"⛄\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"snowman_with_snow\": {\r\n \"keywords\": [\"winter\", \"season\", \"cold\", \"weather\", \"christmas\", \"xmas\", \"frozen\"],\r\n \"char\": \"☃\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"wind_blowing_face\": {\r\n \"keywords\": [\"gust\", \"air\"],\r\n \"char\": \"🌬\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"dash\": {\r\n \"keywords\": [\"wind\", \"air\", \"fast\", \"shoo\", \"fart\", \"smoke\", \"puff\"],\r\n \"char\": \"💨\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cloud_with_tornado\": {\r\n \"keywords\": [\"weather\", \"cyclone\", \"twister\"],\r\n \"char\": \"🌪\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"fog\": {\r\n \"keywords\": [\"weather\"],\r\n \"char\": \"🌫\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"umbrella_without_rain\": {\r\n \"keywords\": [\"weather\", \"spring\"],\r\n \"char\": \"☂\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"umbrella\": {\r\n \"keywords\": [\"rainy\", \"weather\", \"spring\"],\r\n \"char\": \"☔\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"droplet\": {\r\n \"keywords\": [\"water\", \"drip\", \"faucet\", \"spring\"],\r\n \"char\": \"💧\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"sweat_drops\": {\r\n \"keywords\": [\"water\", \"drip\", \"oops\"],\r\n \"char\": \"💦\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"ocean\": {\r\n \"keywords\": [\"sea\", \"water\", \"wave\", \"nature\", \"tsunami\", \"disaster\"],\r\n \"char\": \"🌊\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"green_apple\": {\r\n \"keywords\": [\"fruit\", \"nature\"],\r\n \"char\": \"🍏\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"apple\": {\r\n \"keywords\": [\"fruit\", \"mac\", \"school\"],\r\n \"char\": \"🍎\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"pear\": {\r\n \"keywords\": [\"fruit\", \"nature\", \"food\"],\r\n \"char\": \"🍐\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"tangerine\": {\r\n \"keywords\": [\"food\", \"fruit\", \"nature\", \"orange\"],\r\n \"char\": \"🍊\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"lemon\": {\r\n \"keywords\": [\"fruit\", \"nature\"],\r\n \"char\": \"🍋\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"banana\": {\r\n \"keywords\": [\"fruit\", \"food\", \"monkey\"],\r\n \"char\": \"🍌\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"watermelon\": {\r\n \"keywords\": [\"fruit\", \"food\", \"picnic\", \"summer\"],\r\n \"char\": \"🍉\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"grapes\": {\r\n \"keywords\": [\"fruit\", \"food\", \"wine\"],\r\n \"char\": \"🍇\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"strawberry\": {\r\n \"keywords\": [\"fruit\", \"food\", \"nature\"],\r\n \"char\": \"🍓\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"melon\": {\r\n \"keywords\": [\"fruit\", \"nature\", \"food\"],\r\n \"char\": \"🍈\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"cherries\": {\r\n \"keywords\": [\"food\", \"fruit\"],\r\n \"char\": \"🍒\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"peach\": {\r\n \"keywords\": [\"fruit\", \"nature\", \"food\"],\r\n \"char\": \"🍑\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"pineapple\": {\r\n \"keywords\": [\"fruit\", \"nature\", \"food\"],\r\n \"char\": \"🍍\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"tomato\": {\r\n \"keywords\": [\"fruit\", \"vegetable\", \"nature\", \"food\"],\r\n \"char\": \"🍅\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"eggplant\": {\r\n \"keywords\": [\"vegetable\", \"nature\", \"food\", \"aubergine\"],\r\n \"char\": \"🍆\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"hot_pepper\": {\r\n \"keywords\": [\"food\", \"spicy\", \"chilli\", \"chili\"],\r\n \"char\": \"🌶\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"corn\": {\r\n \"keywords\": [\"food\", \"vegetable\", \"plant\"],\r\n \"char\": \"🌽\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"sweet_potato\": {\r\n \"keywords\": [\"food\", \"nature\"],\r\n \"char\": \"🍠\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"honey_pot\": {\r\n \"keywords\": [\"bees\", \"sweet\", \"kitchen\"],\r\n \"char\": \"🍯\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"bread\": {\r\n \"keywords\": [\"food\", \"wheat\", \"breakfast\", \"toast\"],\r\n \"char\": \"🍞\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"cheese_wedge\": {\r\n \"keywords\": [\"food\", \"chadder\"],\r\n \"char\": \"🧀\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"poultry_leg\": {\r\n \"keywords\": [\"food\", \"meat\", \"drumstick\", \"bird\", \"chicken\", \"turkey\"],\r\n \"char\": \"🍗\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"meat_on_bone\": {\r\n \"keywords\": [\"good\", \"food\", \"drumstick\"],\r\n \"char\": \"🍖\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"fried_shrimp\": {\r\n \"keywords\": [\"food\", \"animal\", \"appetizer\", \"summer\"],\r\n \"char\": \"🍤\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"egg\": {\r\n \"keywords\": [\"food\", \"breakfast\", \"kitchen\"],\r\n \"char\": \"🍳\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"hamburger\": {\r\n \"keywords\": [\"meat\", \"fast food\", \"beef\", \"cheeseburger\", \"mcdonalds\", \"burger king\"],\r\n \"char\": \"🍔\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"fries\": {\r\n \"keywords\": [\"chips\", \"snack\", \"fast food\"],\r\n \"char\": \"🍟\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"hot_dog\": {\r\n \"keywords\": [\"food\", \"frankfurter\", \"hotdog\"],\r\n \"char\": \"🌭\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"pizza\": {\r\n \"keywords\": [\"food\", \"party\"],\r\n \"char\": \"🍕\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"spaghetti\": {\r\n \"keywords\": [\"food\", \"italian\", \"noodle\"],\r\n \"char\": \"🍝\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"taco\": {\r\n \"keywords\": [\"food\", \"mexican\"],\r\n \"char\": \"🌮\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"burrito\": {\r\n \"keywords\": [\"food\", \"mexican\"],\r\n \"char\": \"🌯\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"ramen\": {\r\n \"keywords\": [\"food\", \"japanese\", \"noodle\", \"chopsticks\"],\r\n \"char\": \"🍜\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"stew\": {\r\n \"keywords\": [\"food\", \"meat\", \"soup\"],\r\n \"char\": \"🍲\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"fish_cake\": {\r\n \"keywords\": [\"food\", \"japan\", \"sea\", \"beach\"],\r\n \"char\": \"🍥\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"sushi\": {\r\n \"keywords\": [\"food\", \"fish\", \"japanese\", \"rice\"],\r\n \"char\": \"🍣\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"bento\": {\r\n \"keywords\": [\"food\", \"japanese\", \"box\"],\r\n \"char\": \"🍱\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"curry\": {\r\n \"keywords\": [\"food\", \"spicy\", \"hot\", \"indian\"],\r\n \"char\": \"🍛\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"rice_ball\": {\r\n \"keywords\": [\"food\", \"japanese\"],\r\n \"char\": \"🍙\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"rice\": {\r\n \"keywords\": [\"food\", \"china\", \"asian\"],\r\n \"char\": \"🍚\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"rice_cracker\": {\r\n \"keywords\": [\"food\", \"japanese\"],\r\n \"char\": \"🍘\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"oden\": {\r\n \"keywords\": [\"food\", \"japanese\"],\r\n \"char\": \"🍢\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"dango\": {\r\n \"keywords\": [\"food\", \"dessert\", \"sweet\", \"japanese\", \"barbecue\", \"meat\"],\r\n \"char\": \"🍡\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"shaved_ice\": {\r\n \"keywords\": [\"hot\", \"dessert\", \"summer\"],\r\n \"char\": \"🍧\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"ice_cream\": {\r\n \"keywords\": [\"food\", \"hot\", \"dessert\"],\r\n \"char\": \"🍨\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"icecream\": {\r\n \"keywords\": [\"food\", \"hot\", \"dessert\", \"summer\"],\r\n \"char\": \"🍦\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"cake\": {\r\n \"keywords\": [\"food\", \"dessert\"],\r\n \"char\": \"🍰\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"birthday\": {\r\n \"keywords\": [\"food\", \"dessert\", \"cake\"],\r\n \"char\": \"🎂\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"custard\": {\r\n \"keywords\": [\"dessert\", \"food\"],\r\n \"char\": \"🍮\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"candy\": {\r\n \"keywords\": [\"snack\", \"dessert\", \"sweet\", \"lolly\"],\r\n \"char\": \"🍬\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"lollipop\": {\r\n \"keywords\": [\"food\", \"snack\", \"candy\", \"sweet\"],\r\n \"char\": \"🍭\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"chocolate_bar\": {\r\n \"keywords\": [\"food\", \"snack\", \"dessert\", \"sweet\"],\r\n \"char\": \"🍫\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"popcorn\": {\r\n \"keywords\": [\"food\", \"movie theater\", \"films\", \"snack\"],\r\n \"char\": \"🍿\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"doughnut\": {\r\n \"keywords\": [\"food\", \"dessert\", \"snack\", \"sweet\", \"donut\"],\r\n \"char\": \"🍩\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"cookie\": {\r\n \"keywords\": [\"food\", \"snack\", \"oreo\", \"chocolate\", \"sweet\", \"dessert\"],\r\n \"char\": \"🍪\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"beer\": {\r\n \"keywords\": [\"relax\", \"beverage\", \"drink\", \"drunk\", \"party\", \"pub\", \"summer\", \"alcohol\", \"booze\"],\r\n \"char\": \"🍺\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"beers\": {\r\n \"keywords\": [\"relax\", \"beverage\", \"drink\", \"drunk\", \"party\", \"pub\", \"summer\", \"alcohol\", \"booze\"],\r\n \"char\": \"🍻\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"wine_glass\": {\r\n \"keywords\": [\"drink\", \"beverage\", \"drunk\", \"alcohol\", \"booze\"],\r\n \"char\": \"🍷\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"cocktail\": {\r\n \"keywords\": [\"drink\", \"drunk\", \"alcohol\", \"beverage\", \"booze\", \"mojito\"],\r\n \"char\": \"🍸\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"tropical_drink\": {\r\n \"keywords\": [\"beverage\", \"cocktail\", \"summer\", \"beach\", \"alcohol\", \"booze\", \"mojito\"],\r\n \"char\": \"🍹\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"bottle\": {\r\n \"keywords\": [\"drink\", \"wine\", \"champagne\"],\r\n \"char\": \"🍾\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"sake\": {\r\n \"keywords\": [\"wine\", \"drink\", \"drunk\", \"beverage\", \"japanese\", \"alcohol\", \"booze\"],\r\n \"char\": \"🍶\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"tea\": {\r\n \"keywords\": [\"drink\", \"bowl\", \"breakfast\", \"green\", \"british\"],\r\n \"char\": \"🍵\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"coffee\": {\r\n \"keywords\": [\"beverage\", \"caffeine\", \"latte\", \"espresso\"],\r\n \"char\": \"☕\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"baby_bottle\": {\r\n \"keywords\": [\"food\", \"container\", \"milk\"],\r\n \"char\": \"🍼\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"fork_and_knife\": {\r\n \"keywords\": [\"cutlery\", \"kitchen\"],\r\n \"char\": \"🍴\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"fork_and_knife_with_plate\": {\r\n \"keywords\": [\"food\", \"eat\", \"meal\", \"lunch\", \"dinner\", \"restaurant\"],\r\n \"char\": \"🍽\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"soccer\": {\r\n \"keywords\": [\"sports\", \"football\"],\r\n \"char\": \"⚽\",\r\n \"category\": \"activity\"\r\n },\r\n \"basketball\": {\r\n \"keywords\": [\"sports\", \"balls\", \"NBA\"],\r\n \"char\": \"🏀\",\r\n \"category\": \"activity\"\r\n },\r\n \"football\": {\r\n \"keywords\": [\"sports\", \"balls\", \"NFL\"],\r\n \"char\": \"🏈\",\r\n \"category\": \"activity\"\r\n },\r\n \"baseball\": {\r\n \"keywords\": [\"sports\", \"balls\"],\r\n \"char\": \"⚾\",\r\n \"category\": \"activity\"\r\n },\r\n \"tennis\": {\r\n \"keywords\": [\"sports\", \"balls\", \"green\"],\r\n \"char\": \"🎾\",\r\n \"category\": \"activity\"\r\n },\r\n \"volleyball\": {\r\n \"keywords\": [\"sports\", \"balls\"],\r\n \"char\": \"🏐\",\r\n \"category\": \"activity\"\r\n },\r\n \"rugby_football\": {\r\n \"keywords\": [\"sports\", \"team\"],\r\n \"char\": \"🏉\",\r\n \"category\": \"activity\"\r\n },\r\n \"8ball\": {\r\n \"keywords\": [\"pool\", \"hobby\", \"game\", \"luck\", \"magic\"],\r\n \"char\": \"🎱\",\r\n \"category\": \"activity\"\r\n },\r\n \"golf\": {\r\n \"keywords\": [\"sports\", \"business\", \"flag\", \"hole\", \"summer\"],\r\n \"char\": \"⛳\",\r\n \"category\": \"activity\"\r\n },\r\n \"golfer\": {\r\n \"keywords\": [\"sports\", \"business\"],\r\n \"char\": \"🏌\",\r\n \"category\": \"activity\"\r\n },\r\n \"table_tennis\": {\r\n \"keywords\": [\"sports\", \"pingpong\"],\r\n \"char\": \"🏓\",\r\n \"category\": \"activity\"\r\n },\r\n \"badminton\": {\r\n \"keywords\": [\"sports\"],\r\n \"char\": \"🏸\",\r\n \"category\": \"activity\"\r\n },\r\n \"ice_hockey\": {\r\n \"keywords\": [\"sports\"],\r\n \"char\": \"🏒\",\r\n \"category\": \"activity\"\r\n },\r\n \"field_hockey\": {\r\n \"keywords\": [\"sports\"],\r\n \"char\": \"🏑\",\r\n \"category\": \"activity\"\r\n },\r\n \"cricket\": {\r\n \"keywords\": [\"sports\"],\r\n \"char\": \"🏏\",\r\n \"category\": \"activity\"\r\n },\r\n \"ski\": {\r\n \"keywords\": [\"sports\", \"winter\", \"cold\", \"snow\"],\r\n \"char\": \"🎿\",\r\n \"category\": \"activity\"\r\n },\r\n \"skier\": {\r\n \"keywords\": [\"sports\", \"winter\", \"snow\"],\r\n \"char\": \"⛷\",\r\n \"category\": \"activity\"\r\n },\r\n \"snowboarder\": {\r\n \"keywords\": [\"sports\", \"winter\"],\r\n \"char\": \"🏂\",\r\n \"category\": \"activity\"\r\n },\r\n \"ice_skate\": {\r\n \"keywords\": [\"sports\"],\r\n \"char\": \"⛸\",\r\n \"category\": \"activity\"\r\n },\r\n \"bow_and_arrow\": {\r\n \"keywords\": [\"sports\"],\r\n \"char\": \"🏹\",\r\n \"category\": \"activity\"\r\n },\r\n \"fishing_pole_and_fish\": {\r\n \"keywords\": [\"food\", \"hobby\", \"summer\"],\r\n \"char\": \"🎣\",\r\n \"category\": \"activity\"\r\n },\r\n \"rowboat\": {\r\n \"keywords\": [\"sports\", \"hobby\", \"water\", \"ship\"],\r\n \"char\": \"🚣\",\r\n \"category\": \"activity\"\r\n },\r\n \"swimmer\": {\r\n \"keywords\": [\"sports\", \"exercise\", \"human\", \"athlete\", \"water\", \"summer\"],\r\n \"char\": \"🏊\",\r\n \"category\": \"activity\"\r\n },\r\n \"surfer\": {\r\n \"keywords\": [\"sports\", \"ocean\", \"sea\", \"summer\", \"beach\"],\r\n \"char\": \"🏄\",\r\n \"category\": \"activity\"\r\n },\r\n \"bath\": {\r\n \"keywords\": [\"clean\", \"shower\", \"bathroom\"],\r\n \"char\": \"🛀\",\r\n \"category\": \"activity\"\r\n },\r\n \"person_with_ball\": {\r\n \"keywords\": [\"sports\", \"human\"],\r\n \"char\": \"⛹\",\r\n \"category\": \"activity\"\r\n },\r\n \"weight_lifter\": {\r\n \"keywords\": [\"sports\", \"training\", \"exercise\"],\r\n \"char\": \"🏋\",\r\n \"category\": \"activity\"\r\n },\r\n \"bicyclist\": {\r\n \"keywords\": [\"sports\", \"bike\", \"exercise\", \"hipster\"],\r\n \"char\": \"🚴\",\r\n \"category\": \"activity\"\r\n },\r\n \"mountain_bicyclist\": {\r\n \"keywords\": [\"transportation\", \"sports\", \"human\", \"race\", \"bike\"],\r\n \"char\": \"🚵\",\r\n \"category\": \"activity\"\r\n },\r\n \"horse_racing\": {\r\n \"keywords\": [\"animal\", \"betting\", \"competition\", \"gambling\", \"luck\"],\r\n \"char\": \"🏇\",\r\n \"category\": \"activity\"\r\n },\r\n \"man_levitating\": {\r\n \"keywords\": [\"suit\", \"business\", \"levitate\", \"hover\", \"jump\"],\r\n \"char\": \"🕴\",\r\n \"category\": \"activity\"\r\n },\r\n \"trophy\": {\r\n \"keywords\": [\"win\", \"award\", \"contest\", \"place\", \"ftw\", \"ceremony\"],\r\n \"char\": \"🏆\",\r\n \"category\": \"activity\"\r\n },\r\n \"running_shirt_with_sash\": {\r\n \"keywords\": [\"play\", \"pageant\"],\r\n \"char\": \"🎽\",\r\n \"category\": \"activity\"\r\n },\r\n \"sports_medal\": {\r\n \"keywords\": [\"award\", \"winning\"],\r\n \"char\": \"🏅\",\r\n \"category\": \"activity\"\r\n },\r\n \"military_medal\": {\r\n \"keywords\": [\"award\", \"winning\", \"army\"],\r\n \"char\": \"🎖\",\r\n \"category\": \"activity\"\r\n },\r\n \"reminder_ribbon\": {\r\n \"keywords\": [\"sports\", \"cause\", \"support\", \"awareness\"],\r\n \"char\": \"🎗\",\r\n \"category\": \"activity\"\r\n },\r\n \"rosette\": {\r\n \"keywords\": [\"flower\", \"decoration\", \"military\"],\r\n \"char\": \"🏵\",\r\n \"category\": \"activity\"\r\n },\r\n \"ticket\": {\r\n \"keywords\": [\"event\", \"concert\", \"pass\"],\r\n \"char\": \"🎫\",\r\n \"category\": \"activity\"\r\n },\r\n \"admission_ticket\": {\r\n \"keywords\": [\"sports\", \"concert\", \"entrance\"],\r\n \"char\": \"🎟\",\r\n \"category\": \"activity\"\r\n },\r\n \"performing_arts\": {\r\n \"keywords\": [\"acting\", \"theater\", \"drama\"],\r\n \"char\": \"🎭\",\r\n \"category\": \"activity\"\r\n },\r\n \"art\": {\r\n \"keywords\": [\"design\", \"paint\", \"draw\", \"colors\"],\r\n \"char\": \"🎨\",\r\n \"category\": \"activity\"\r\n },\r\n \"circus_tent\": {\r\n \"keywords\": [\"festival\", \"carnival\", \"party\"],\r\n \"char\": \"🎪\",\r\n \"category\": \"activity\"\r\n },\r\n \"microphone\": {\r\n \"keywords\": [\"sound\", \"music\", \"PA\"],\r\n \"char\": \"🎤\",\r\n \"category\": \"activity\"\r\n },\r\n \"headphones\": {\r\n \"keywords\": [\"music\", \"score\", \"gadgets\"],\r\n \"char\": \"🎧\",\r\n \"category\": \"activity\"\r\n },\r\n \"musical_score\": {\r\n \"keywords\": [\"treble\", \"clef\"],\r\n \"char\": \"🎼\",\r\n \"category\": \"activity\"\r\n },\r\n \"musical_keyboard\": {\r\n \"keywords\": [\"piano\", \"instrument\"],\r\n \"char\": \"🎹\",\r\n \"category\": \"activity\"\r\n },\r\n \"saxophone\": {\r\n \"keywords\": [\"music\", \"instrument\", \"jazz\", \"blues\"],\r\n \"char\": \"🎷\",\r\n \"category\": \"activity\"\r\n },\r\n \"trumpet\": {\r\n \"keywords\": [\"music\", \"brass\"],\r\n \"char\": \"🎺\",\r\n \"category\": \"activity\"\r\n },\r\n \"guitar\": {\r\n \"keywords\": [\"music\", \"instrument\"],\r\n \"char\": \"🎸\",\r\n \"category\": \"activity\"\r\n },\r\n \"violin\": {\r\n \"keywords\": [\"music\", \"instrument\", \"orchestra\", \"symphony\"],\r\n \"char\": \"🎻\",\r\n \"category\": \"activity\"\r\n },\r\n \"clapper\": {\r\n \"keywords\": [\"movie\", \"film\", \"record\"],\r\n \"char\": \"🎬\",\r\n \"category\": \"activity\"\r\n },\r\n \"video_game\": {\r\n \"keywords\": [\"play\", \"console\", \"PS4\", \"controller\"],\r\n \"char\": \"🎮\",\r\n \"category\": \"activity\"\r\n },\r\n \"space_invader\": {\r\n \"keywords\": [\"game\", \"arcade\", \"play\"],\r\n \"char\": \"👾\",\r\n \"category\": \"activity\"\r\n },\r\n \"dart\": {\r\n \"keywords\": [\"game\", \"play\", \"bar\"],\r\n \"char\": \"🎯\",\r\n \"category\": \"activity\"\r\n },\r\n \"game_die\": {\r\n \"keywords\": [\"dice\", \"random\", \"tabletop\", \"play\", \"luck\"],\r\n \"char\": \"🎲\",\r\n \"category\": \"activity\"\r\n },\r\n \"slot_machine\": {\r\n \"keywords\": [\"bet\", \"gamble\", \"vegas\", \"fruit machine\", \"luck\", \"casino\"],\r\n \"char\": \"🎰\",\r\n \"category\": \"activity\"\r\n },\r\n \"bowling\": {\r\n \"keywords\": [\"sports\", \"fun\", \"play\"],\r\n \"char\": \"🎳\",\r\n \"category\": \"activity\"\r\n },\r\n \"car\": {\r\n \"keywords\": [\"red\", \"transportation\", \"vehicle\"],\r\n \"char\": \"🚗\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"taxi\": {\r\n \"keywords\": [\"uber\", \"vehicle\", \"cars\", \"transportation\"],\r\n \"char\": \"🚕\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"blue_car\": {\r\n \"keywords\": [\"transportation\", \"vehicle\"],\r\n \"char\": \"🚙\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"bus\": {\r\n \"keywords\": [\"car\", \"vehicle\", \"transportation\"],\r\n \"char\": \"🚌\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"trolleybus\": {\r\n \"keywords\": [\"bart\", \"transportation\", \"vehicle\"],\r\n \"char\": \"🚎\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"racing_car\": {\r\n \"keywords\": [\"sports\", \"race\", \"fast\", \"formula\", \"f1\"],\r\n \"char\": \"🏎\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"police_car\": {\r\n \"keywords\": [\"vehicle\", \"cars\", \"transportation\", \"law\", \"legal\", \"enforcement\"],\r\n \"char\": \"🚓\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"ambulance\": {\r\n \"keywords\": [\"health\", \"911\", \"hospital\"],\r\n \"char\": \"🚑\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"fire_engine\": {\r\n \"keywords\": [\"transportation\", \"cars\", \"vehicle\"],\r\n \"char\": \"🚒\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"minibus\": {\r\n \"keywords\": [\"vehicle\", \"car\", \"transportation\"],\r\n \"char\": \"🚐\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"truck\": {\r\n \"keywords\": [\"cars\", \"transportation\"],\r\n \"char\": \"🚚\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"articulated_lorry\": {\r\n \"keywords\": [\"vehicle\", \"cars\", \"transportation\", \"express\"],\r\n \"char\": \"🚛\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"tractor\": {\r\n \"keywords\": [\"vehicle\", \"car\", \"farming\", \"agriculture\"],\r\n \"char\": \"🚜\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"racing_motorcycle\": {\r\n \"keywords\": [\"race\", \"sports\", \"fast\"],\r\n \"char\": \"🏍\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"bike\": {\r\n \"keywords\": [\"sports\", \"bicycle\", \"exercise\", \"hipster\"],\r\n \"char\": \"🚲\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"rotating_light\": {\r\n \"keywords\": [\"police\", \"ambulance\", \"911\", \"emergency\", \"alert\", \"error\", \"pinged\", \"law\", \"legal\"],\r\n \"char\": \"🚨\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"oncoming_police_car\": {\r\n \"keywords\": [\"vehicle\", \"law\", \"legal\", \"enforcement\", \"911\"],\r\n \"char\": \"🚔\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"oncoming_bus\": {\r\n \"keywords\": [\"vehicle\", \"transportation\"],\r\n \"char\": \"🚍\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"oncoming_automobile\": {\r\n \"keywords\": [\"car\", \"vehicle\", \"transportation\"],\r\n \"char\": \"🚘\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"oncoming_taxi\": {\r\n \"keywords\": [\"vehicle\", \"cars\", \"uber\"],\r\n \"char\": \"🚖\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"aerial_tramway\": {\r\n \"keywords\": [\"transportation\", \"vehicle\", \"ski\"],\r\n \"char\": \"🚡\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"mountain_cableway\": {\r\n \"keywords\": [\"transportation\", \"vehicle\", \"ski\"],\r\n \"char\": \"🚠\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"suspension_railway\": {\r\n \"keywords\": [\"vehicle\", \"transportation\"],\r\n \"char\": \"🚟\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"railway_car\": {\r\n \"keywords\": [\"transportation\", \"vehicle\"],\r\n \"char\": \"🚃\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"train\": {\r\n \"keywords\": [\"transportation\", \"vehicle\", \"carriage\", \"public\", \"travel\"],\r\n \"char\": \"🚋\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"monorail\": {\r\n \"keywords\": [\"transportation\", \"vehicle\"],\r\n \"char\": \"🚝\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"bullettrain_side\": {\r\n \"keywords\": [\"transportation\", \"vehicle\"],\r\n \"char\": \"🚄\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"bullettrain_front\": {\r\n \"keywords\": [\"transportation\", \"vehicle\", \"speed\", \"fast\", \"public\", \"travel\"],\r\n \"char\": \"🚅\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"light_rail\": {\r\n \"keywords\": [\"transportation\", \"vehicle\"],\r\n \"char\": \"🚈\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"mountain_railway\": {\r\n \"keywords\": [\"transportation\", \"vehicle\"],\r\n \"char\": \"🚞\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"steam_locomotive\": {\r\n \"keywords\": [\"transportation\", \"vehicle\", \"train\"],\r\n \"char\": \"🚂\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"train2\": {\r\n \"keywords\": [\"transportation\", \"vehicle\"],\r\n \"char\": \"🚆\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"metro\": {\r\n \"keywords\": [\"transportation\", \"blue-square\", \"mrt\", \"underground\", \"tube\"],\r\n \"char\": \"🚇\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"tram\": {\r\n \"keywords\": [\"transportation\", \"vehicle\"],\r\n \"char\": \"🚊\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"station\": {\r\n \"keywords\": [\"transportation\", \"vehicle\", \"public\"],\r\n \"char\": \"🚉\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"helicopter\": {\r\n \"keywords\": [\"transportation\", \"vehicle\", \"fly\"],\r\n \"char\": \"🚁\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"small_airplane\": {\r\n \"keywords\": [\"flight\", \"transportation\", \"fly\", \"vehicle\"],\r\n \"char\": \"🛩\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"airplane\": {\r\n \"keywords\": [\"vehicle\", \"transportation\", \"flight\", \"fly\"],\r\n \"char\": \"✈️\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"airplane_departure\": {\r\n \"keywords\": [\"airport\", \"flight\", \"landing\"],\r\n \"char\": \"🛫\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"airplane_arrival\": {\r\n \"keywords\": [\"airport\", \"flight\", \"boarding\"],\r\n \"char\": \"🛬\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"boat\": {\r\n \"keywords\": [\"ship\", \"summer\", \"transportation\", \"water\", \"sailing\", \"sailboat\"],\r\n \"char\": \"⛵\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"motor_boat\": {\r\n \"keywords\": [\"ship\"],\r\n \"char\": \"🛥\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"speedboat\": {\r\n \"keywords\": [\"ship\", \"transportation\", \"vehicle\", \"summer\"],\r\n \"char\": \"🚤\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"ferry\": {\r\n \"keywords\": [\"boat\", \"ship\", \"yacht\"],\r\n \"char\": \"⛴\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"passenger_ship\": {\r\n \"keywords\": [\"yacht\", \"cruise\", \"ferry\"],\r\n \"char\": \"🛳\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"rocket\": {\r\n \"keywords\": [\"launch\", \"ship\", \"staffmode\", \"NASA\", \"outer space\", \"outer_space\", \"fly\"],\r\n \"char\": \"🚀\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"artificial_satellite\": {\r\n \"keywords\": [\"communication\", \"gps\", \"orbit\", \"spaceflight\", \"NASA\", \"ISS\"],\r\n \"char\": \"🛰\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"seat\": {\r\n \"keywords\": [\"sit\", \"airplane\", \"transport\", \"bus\", \"flight\", \"fly\"],\r\n \"char\": \"💺\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"anchor\": {\r\n \"keywords\": [\"ship\", \"ferry\", \"sea\", \"boat\"],\r\n \"char\": \"⚓\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"construction\": {\r\n \"keywords\": [\"wip\", \"progress\", \"caution\", \"warning\"],\r\n \"char\": \"🚧\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"fuelpump\": {\r\n \"keywords\": [\"gas station\", \"petroleum\"],\r\n \"char\": \"⛽\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"busstop\": {\r\n \"keywords\": [\"transportation\", \"wait\"],\r\n \"char\": \"🚏\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"vertical_traffic_light\": {\r\n \"keywords\": [\"transportation\", \"driving\"],\r\n \"char\": \"🚦\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"traffic_light\": {\r\n \"keywords\": [\"transportation\", \"signal\"],\r\n \"char\": \"🚥\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"checkered_flag\": {\r\n \"keywords\": [\"contest\", \"finishline\", \"race\", \"gokart\"],\r\n \"char\": \"🏁\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"ship\": {\r\n \"keywords\": [\"transportation\", \"titanic\", \"deploy\"],\r\n \"char\": \"🚢\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"ferris_wheel\": {\r\n \"keywords\": [\"photo\", \"carnival\", \"londoneye\"],\r\n \"char\": \"🎡\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"roller_coaster\": {\r\n \"keywords\": [\"carnival\", \"playground\", \"photo\", \"fun\"],\r\n \"char\": \"🎢\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"carousel_horse\": {\r\n \"keywords\": [\"photo\", \"carnival\"],\r\n \"char\": \"🎠\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"building_construction\": {\r\n \"keywords\": [\"wip\", \"working\", \"progress\"],\r\n \"char\": \"🏗\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"foggy\": {\r\n \"keywords\": [\"photo\", \"mountain\"],\r\n \"char\": \"🌁\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"tokyo_tower\": {\r\n \"keywords\": [\"photo\", \"japanese\"],\r\n \"char\": \"🗼\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"factory\": {\r\n \"keywords\": [\"building\", \"industry\", \"pollution\", \"smoke\"],\r\n \"char\": \"🏭\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"fountain\": {\r\n \"keywords\": [\"photo\", \"summer\", \"water\", \"fresh\"],\r\n \"char\": \"⛲\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"rice_scene\": {\r\n \"keywords\": [\"photo\", \"japan\", \"asia\", \"tsukimi\"],\r\n \"char\": \"🎑\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"mountain\": {\r\n \"keywords\": [\"photo\", \"nature\", \"environment\"],\r\n \"char\": \"⛰\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"snow_capped_mountain\": {\r\n \"keywords\": [\"photo\", \"nature\", \"environment\", \"winter\", \"cold\"],\r\n \"char\": \"🏔\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"mount_fuji\": {\r\n \"keywords\": [\"photo\", \"mountain\", \"nature\", \"japanese\"],\r\n \"char\": \"🗻\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"volcano\": {\r\n \"keywords\": [\"photo\", \"nature\", \"disaster\"],\r\n \"char\": \"🌋\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"japan\": {\r\n \"keywords\": [\"nation\", \"country\", \"japanese\", \"asia\"],\r\n \"char\": \"🗾\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"camping\": {\r\n \"keywords\": [\"photo\", \"outdoors\", \"tent\"],\r\n \"char\": \"🏕\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"tent\": {\r\n \"keywords\": [\"photo\", \"camping\", \"outdoors\"],\r\n \"char\": \"⛺\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"national_park\": {\r\n \"keywords\": [\"photo\", \"environment\", \"nature\"],\r\n \"char\": \"🏞\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"motorway\": {\r\n \"keywords\": [\"road\", \"cupertino\", \"interstate\", \"highway\"],\r\n \"char\": \"🛣\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"railway_track\": {\r\n \"keywords\": [\"train\", \"transportation\"],\r\n \"char\": \"🛤\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"sunrise\": {\r\n \"keywords\": [\"morning\", \"view\", \"vacation\", \"photo\"],\r\n \"char\": \"🌅\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"sunrise_over_mountains\": {\r\n \"keywords\": [\"view\", \"vacation\", \"photo\"],\r\n \"char\": \"🌄\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"desert\": {\r\n \"keywords\": [\"photo\", \"warm\", \"saharah\"],\r\n \"char\": \"🏜\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"beach_with_umbrella\": {\r\n \"keywords\": [\"weather\", \"summer\", \"sunny\", \"sand\", \"mojito\"],\r\n \"char\": \"🏖\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"desert_island\": {\r\n \"keywords\": [\"photo\", \"tropical\", \"mojito\"],\r\n \"char\": \"🏝\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"city_sunrise\": {\r\n \"keywords\": [\"photo\", \"good morning\", \"dawn\"],\r\n \"char\": \"🌇\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"city_sunset\": {\r\n \"keywords\": [\"photo\", \"evening\", \"sky\", \"buildings\"],\r\n \"char\": \"🌆\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"cityscape\": {\r\n \"keywords\": [\"photo\", \"night life\", \"urban\"],\r\n \"char\": \"🏙\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"night_with_stars\": {\r\n \"keywords\": [\"evening\", \"city\", \"downtown\"],\r\n \"char\": \"🌃\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"bridge_at_night\": {\r\n \"keywords\": [\"photo\", \"sanfrancisco\"],\r\n \"char\": \"🌉\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"milky_way\": {\r\n \"keywords\": [\"photo\", \"space\", \"stars\"],\r\n \"char\": \"🌌\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"stars\": {\r\n \"keywords\": [\"night\", \"photo\"],\r\n \"char\": \"🌠\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"sparkler\": {\r\n \"keywords\": [\"stars\", \"night\", \"shine\"],\r\n \"char\": \"🎇\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"fireworks\": {\r\n \"keywords\": [\"photo\", \"festival\", \"carnival\", \"congratulations\"],\r\n \"char\": \"🎆\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"rainbow\": {\r\n \"keywords\": [\"nature\", \"happy\", \"unicorn\", \"photo\", \"sky\", \"spring\"],\r\n \"char\": \"🌈\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"buildings\": {\r\n \"keywords\": [\"houses\", \"photo\"],\r\n \"char\": \"🏘\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"european_castle\": {\r\n \"keywords\": [\"building\", \"royalty\", \"history\"],\r\n \"char\": \"🏰\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"japanese_castle\": {\r\n \"keywords\": [\"photo\", \"building\"],\r\n \"char\": \"🏯\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"stadium\": {\r\n \"keywords\": [\"photo\", \"place\", \"sports\", \"concert\", \"venue\"],\r\n \"char\": \"🏟\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"statue_of_liberty\": {\r\n \"keywords\": [\"american\", \"newyork\"],\r\n \"char\": \"🗽\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"house\": {\r\n \"keywords\": [\"building\", \"home\"],\r\n \"char\": \"🏠\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"house_with_garden\": {\r\n \"keywords\": [\"home\", \"plant\", \"nature\"],\r\n \"char\": \"🏡\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"derelict_house\": {\r\n \"keywords\": [\"abandon\", \"evict\", \"broken\", \"building\"],\r\n \"char\": \"🏚\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"office\": {\r\n \"keywords\": [\"building\", \"bureau\", \"work\"],\r\n \"char\": \"🏢\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"department_store\": {\r\n \"keywords\": [\"building\", \"shopping\", \"mall\"],\r\n \"char\": \"🏬\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"post_office\": {\r\n \"keywords\": [\"building\", \"email\", \"communication\"],\r\n \"char\": \"🏣\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"european_post_office\": {\r\n \"keywords\": [\"building\", \"email\"],\r\n \"char\": \"🏤\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"hospital\": {\r\n \"keywords\": [\"building\", \"health\", \"surgery\", \"doctor\"],\r\n \"char\": \"🏥\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"bank\": {\r\n \"keywords\": [\"building\", \"money\", \"sales\", \"cash\", \"business\", \"enterprise\"],\r\n \"char\": \"🏦\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"hotel\": {\r\n \"keywords\": [\"building\", \"accomodation\", \"checkin\"],\r\n \"char\": \"🏨\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"convenience_store\": {\r\n \"keywords\": [\"building\", \"shopping\", \"groceries\"],\r\n \"char\": \"🏪\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"school\": {\r\n \"keywords\": [\"building\", \"student\", \"education\", \"learn\", \"teach\"],\r\n \"char\": \"🏫\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"love_hotel\": {\r\n \"keywords\": [\"like\", \"affection\", \"dating\"],\r\n \"char\": \"🏩\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"wedding\": {\r\n \"keywords\": [\"love\", \"like\", \"affection\", \"couple\", \"marriage\", \"bride\", \"groom\"],\r\n \"char\": \"💒\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"museum\": {\r\n \"keywords\": [\"art\", \"culture\", \"history\"],\r\n \"char\": \"🏛\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"church\": {\r\n \"keywords\": [\"building\", \"religion\", \"christ\"],\r\n \"char\": \"⛪\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"mosque\": {\r\n \"keywords\": [\"islam\", \"worship\", \"minaret\"],\r\n \"char\": \"🕌\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"synagogue\": {\r\n \"keywords\": [\"judaism\", \"worship\", \"temple\", \"jewish\"],\r\n \"char\": \"🕍\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"kaaba\": {\r\n \"keywords\": [\"mecca\", \"mosque\", \"islam\"],\r\n \"char\": \"🕋\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"shinto_shrine\": {\r\n \"keywords\": [\"temple\", \"japan\", \"kyoto\"],\r\n \"char\": \"⛩\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"watch\": {\r\n \"keywords\": [\"time\", \"accessories\"],\r\n \"char\": \"⌚\",\r\n \"category\": \"objects\"\r\n },\r\n \"iphone\": {\r\n \"keywords\": [\"technology\", \"apple\", \"gadgets\", \"dial\"],\r\n \"char\": \"📱\",\r\n \"category\": \"objects\"\r\n },\r\n \"calling\": {\r\n \"keywords\": [\"iphone\", \"incoming\"],\r\n \"char\": \"📲\",\r\n \"category\": \"objects\"\r\n },\r\n \"computer\": {\r\n \"keywords\": [\"technology\", \"laptop\", \"screen\", \"display\", \"monitor\"],\r\n \"char\": \"💻\",\r\n \"category\": \"objects\"\r\n },\r\n \"keyboard\": {\r\n \"keywords\": [\"technology\", \"computer\", \"type\", \"input\", \"text\"],\r\n \"char\": \"⌨\",\r\n \"category\": \"objects\"\r\n },\r\n \"desktop_computer\": {\r\n \"keywords\": [\"technology\", \"computing\", \"screen\"],\r\n \"char\": \"🖥\",\r\n \"category\": \"objects\"\r\n },\r\n \"printer\": {\r\n \"keywords\": [\"paper\", \"ink\"],\r\n \"char\": \"🖨\",\r\n \"category\": \"objects\"\r\n },\r\n \"three_button_mouse\": {\r\n \"keywords\": [\"click\"],\r\n \"char\": \"🖱\",\r\n \"category\": \"objects\"\r\n },\r\n \"trackball\": {\r\n \"keywords\": [\"technology\", \"trackpad\"],\r\n \"char\": \"🖲\",\r\n \"category\": \"objects\"\r\n },\r\n \"joystick\": {\r\n \"keywords\": [\"game\", \"play\"],\r\n \"char\": \"🕹\",\r\n \"category\": \"objects\"\r\n },\r\n \"compression\": {\r\n \"keywords\": [\"tool\"],\r\n \"char\": \"🗜\",\r\n \"category\": \"objects\"\r\n },\r\n \"minidisc\": {\r\n \"keywords\": [\"technology\", \"record\", \"data\", \"disk\", \"90s\"],\r\n \"char\": \"💽\",\r\n \"category\": \"objects\"\r\n },\r\n \"floppy_disk\": {\r\n \"keywords\": [\"oldschool\", \"technology\", \"save\", \"90s\", \"80s\"],\r\n \"char\": \"💾\",\r\n \"category\": \"objects\"\r\n },\r\n \"cd\": {\r\n \"keywords\": [\"technology\", \"dvd\", \"disk\", \"disc\", \"90s\"],\r\n \"char\": \"💿\",\r\n \"category\": \"objects\"\r\n },\r\n \"dvd\": {\r\n \"keywords\": [\"cd\", \"disk\", \"disc\"],\r\n \"char\": \"📀\",\r\n \"category\": \"objects\"\r\n },\r\n \"vhs\": {\r\n \"keywords\": [\"record\", \"video\", \"oldschool\", \"90s\", \"80s\"],\r\n \"char\": \"📼\",\r\n \"category\": \"objects\"\r\n },\r\n \"camera\": {\r\n \"keywords\": [\"gadgets\", \"photography\"],\r\n \"char\": \"📷\",\r\n \"category\": \"objects\"\r\n },\r\n \"camera_with_flash\": {\r\n \"keywords\": [\"photography\", \"gadgets\"],\r\n \"char\": \"📸\",\r\n \"category\": \"objects\"\r\n },\r\n \"video_camera\": {\r\n \"keywords\": [\"film\", \"record\"],\r\n \"char\": \"📹\",\r\n \"category\": \"objects\"\r\n },\r\n \"movie_camera\": {\r\n \"keywords\": [\"film\", \"record\"],\r\n \"char\": \"🎥\",\r\n \"category\": \"objects\"\r\n },\r\n \"film_projector\": {\r\n \"keywords\": [\"video\", \"tape\", \"record\", \"movie\"],\r\n \"char\": \"📽\",\r\n \"category\": \"objects\"\r\n },\r\n \"film_frames\": {\r\n \"keywords\": [\"movie\"],\r\n \"char\": \"🎞\",\r\n \"category\": \"objects\"\r\n },\r\n \"telephone_receiver\": {\r\n \"keywords\": [\"technology\", \"communication\", \"dial\"],\r\n \"char\": \"📞\",\r\n \"category\": \"objects\"\r\n },\r\n \"phone\": {\r\n \"keywords\": [\"technology\", \"communication\", \"dial\", \"telephone\"],\r\n \"char\": \"☎️\",\r\n \"category\": \"objects\"\r\n },\r\n \"pager\": {\r\n \"keywords\": [\"bbcall\", \"oldschool\", \"90s\"],\r\n \"char\": \"📟\",\r\n \"category\": \"objects\"\r\n },\r\n \"fax\": {\r\n \"keywords\": [\"communication\", \"technology\"],\r\n \"char\": \"📠\",\r\n \"category\": \"objects\"\r\n },\r\n \"tv\": {\r\n \"keywords\": [\"technology\", \"program\", \"oldschool\", \"show\", \"television\"],\r\n \"char\": \"📺\",\r\n \"category\": \"objects\"\r\n },\r\n \"radio\": {\r\n \"keywords\": [\"communication\", \"music\", \"podcast\", \"program\"],\r\n \"char\": \"📻\",\r\n \"category\": \"objects\"\r\n },\r\n \"studio_microphone\": {\r\n \"keywords\": [\"singer\", \"recording\", \"artist\"],\r\n \"char\": \"🎙\",\r\n \"category\": \"objects\"\r\n },\r\n \"level_slider\": {\r\n \"keywords\": [\"scale\"],\r\n \"char\": \"🎚\",\r\n \"category\": \"objects\"\r\n },\r\n \"control_knobs\": {\r\n \"keywords\": [\"dial\"],\r\n \"char\": \"🎛\",\r\n \"category\": \"objects\"\r\n },\r\n \"stopwatch\": {\r\n \"keywords\": [\"time\", \"deadline\"],\r\n \"char\": \"⏱\",\r\n \"category\": \"objects\"\r\n },\r\n \"timer_clock\": {\r\n \"keywords\": [\"alarm\"],\r\n \"char\": \"⏲\",\r\n \"category\": \"objects\"\r\n },\r\n \"alarm_clock\": {\r\n \"keywords\": [\"time\", \"wake\"],\r\n \"char\": \"⏰\",\r\n \"category\": \"objects\"\r\n },\r\n \"mantelpiece_clock\": {\r\n \"keywords\": [\"time\"],\r\n \"char\": \"🕰\",\r\n \"category\": \"objects\"\r\n },\r\n \"hourglass_flowing_sand\": {\r\n \"keywords\": [\"oldschool\", \"time\", \"countdown\"],\r\n \"char\": \"⏳\",\r\n \"category\": \"objects\"\r\n },\r\n \"hourglass\": {\r\n \"keywords\": [\"time\", \"clock\", \"oldschool\", \"limit\", \"exam\", \"quiz\", \"test\"],\r\n \"char\": \"⌛\",\r\n \"category\": \"objects\"\r\n },\r\n \"satellite\": {\r\n \"keywords\": [\"communication\", \"future\", \"radio\", \"space\"],\r\n \"char\": \"📡\",\r\n \"category\": \"objects\"\r\n },\r\n \"battery\": {\r\n \"keywords\": [\"power\", \"energy\", \"sustain\"],\r\n \"char\": \"🔋\",\r\n \"category\": \"objects\"\r\n },\r\n \"electric_plug\": {\r\n \"keywords\": [\"charger\", \"power\"],\r\n \"char\": \"🔌\",\r\n \"category\": \"objects\"\r\n },\r\n \"bulb\": {\r\n \"keywords\": [\"light\", \"electricity\", \"idea\"],\r\n \"char\": \"💡\",\r\n \"category\": \"objects\"\r\n },\r\n \"flashlight\": {\r\n \"keywords\": [\"dark\", \"camping\", \"sight\", \"night\"],\r\n \"char\": \"🔦\",\r\n \"category\": \"objects\"\r\n },\r\n \"candle\": {\r\n \"keywords\": [\"fire\", \"wax\"],\r\n \"char\": \"🕯\",\r\n \"category\": \"objects\"\r\n },\r\n \"wastebasket\": {\r\n \"keywords\": [\"bin\", \"trash\", \"rubbish\", \"garbage\", \"toss\"],\r\n \"char\": \"🗑\",\r\n \"category\": \"objects\"\r\n },\r\n \"oil_drum\": {\r\n \"keywords\": [\"barrell\"],\r\n \"char\": \"🛢\",\r\n \"category\": \"objects\"\r\n },\r\n \"money_with_wings\": {\r\n \"keywords\": [\"dollar\", \"bills\", \"payment\", \"sale\"],\r\n \"char\": \"💸\",\r\n \"category\": \"objects\"\r\n },\r\n \"dollar\": {\r\n \"keywords\": [\"money\", \"sales\", \"bill\", \"currency\"],\r\n \"char\": \"💵\",\r\n \"category\": \"objects\"\r\n },\r\n \"yen\": {\r\n \"keywords\": [\"money\", \"sales\", \"japanese\", \"dollar\", \"currency\"],\r\n \"char\": \"💴\",\r\n \"category\": \"objects\"\r\n },\r\n \"euro\": {\r\n \"keywords\": [\"money\", \"sales\", \"dollar\", \"currency\"],\r\n \"char\": \"💶\",\r\n \"category\": \"objects\"\r\n },\r\n \"pound\": {\r\n \"keywords\": [\"british\", \"sterling\", \"money\", \"sales\", \"bills\", \"uk\", \"england\", \"currency\"],\r\n \"char\": \"💷\",\r\n \"category\": \"objects\"\r\n },\r\n \"moneybag\": {\r\n \"keywords\": [\"dollar\", \"payment\", \"coins\", \"sale\"],\r\n \"char\": \"💰\",\r\n \"category\": \"objects\"\r\n },\r\n \"credit_card\": {\r\n \"keywords\": [\"money\", \"sales\", \"dollar\", \"bill\", \"payment\", \"shopping\"],\r\n \"char\": \"💳\",\r\n \"category\": \"objects\"\r\n },\r\n \"gem\": {\r\n \"keywords\": [\"blue\", \"ruby\", \"diamond\", \"jewelry\"],\r\n \"char\": \"💎\",\r\n \"category\": \"objects\"\r\n },\r\n \"scales\": {\r\n \"keywords\": [\"law\", \"fairness\", \"weight\"],\r\n \"char\": \"⚖\",\r\n \"category\": \"objects\"\r\n },\r\n \"wrench\": {\r\n \"keywords\": [\"tools\", \"diy\", \"ikea\", \"fix\", \"maintainer\"],\r\n \"char\": \"🔧\",\r\n \"category\": \"objects\"\r\n },\r\n \"hammer\": {\r\n \"keywords\": [\"tools\", \"build\", \"create\"],\r\n \"char\": \"🔨\",\r\n \"category\": \"objects\"\r\n },\r\n \"hammer_and_pick\": {\r\n \"keywords\": [\"tools\", \"build\", \"create\"],\r\n \"char\": \"⚒\",\r\n \"category\": \"objects\"\r\n },\r\n \"hammer_and_wrench\": {\r\n \"keywords\": [\"tools\", \"build\", \"create\"],\r\n \"char\": \"🛠\",\r\n \"category\": \"objects\"\r\n },\r\n \"pick\": {\r\n \"keywords\": [\"tools\", \"dig\"],\r\n \"char\": \"⛏\",\r\n \"category\": \"objects\"\r\n },\r\n \"nut_and_bolt\": {\r\n \"keywords\": [\"handy\", \"tools\", \"fix\"],\r\n \"char\": \"🔩\",\r\n \"category\": \"objects\"\r\n },\r\n \"gear\": {\r\n \"keywords\": [\"cog\"],\r\n \"char\": \"⚙\",\r\n \"category\": \"objects\"\r\n },\r\n \"chains\": {\r\n \"keywords\": [\"lock\", \"arrest\"],\r\n \"char\": \"⛓\",\r\n \"category\": \"objects\"\r\n },\r\n \"gun\": {\r\n \"keywords\": [\"violence\", \"weapon\", \"pistol\", \"revolver\"],\r\n \"char\": \"🔫\",\r\n \"category\": \"objects\"\r\n },\r\n \"bomb\": {\r\n \"keywords\": [\"boom\", \"explode\", \"explosion\", \"terrorism\"],\r\n \"char\": \"💣\",\r\n \"category\": \"objects\"\r\n },\r\n \"hocho\": {\r\n \"keywords\": [\"knife\", \"blade\", \"cutlery\", \"kitchen\", \"weapon\"],\r\n \"char\": \"🔪\",\r\n \"category\": \"objects\"\r\n },\r\n \"dagger_knife\": {\r\n \"keywords\": [\"weapon\"],\r\n \"char\": \"🗡\",\r\n \"category\": \"objects\"\r\n },\r\n \"crossed_swords\": {\r\n \"keywords\": [\"weapon\"],\r\n \"char\": \"⚔\",\r\n \"category\": \"objects\"\r\n },\r\n \"shield\": {\r\n \"keywords\": [\"protection\", \"security\"],\r\n \"char\": \"🛡\",\r\n \"category\": \"objects\"\r\n },\r\n \"smoking\": {\r\n \"keywords\": [\"kills\", \"tobacco\", \"cigarette\", \"joint\", \"smoke\"],\r\n \"char\": \"🚬\",\r\n \"category\": \"objects\"\r\n },\r\n \"skull_and_crossbones\": {\r\n \"keywords\": [\"poison\", \"danger\", \"deadly\", \"scary\"],\r\n \"char\": \"☠\",\r\n \"category\": \"objects\"\r\n },\r\n \"coffin\": {\r\n \"keywords\": [\"vampire\", \"dead\", \"die\", \"death\", \"rip\", \"graveyard\", \"cemetery\"],\r\n \"char\": \"⚰\",\r\n \"category\": \"objects\"\r\n },\r\n \"funeral_urn\": {\r\n \"keywords\": [\"dead\", \"die\", \"death\", \"rip\", \"ashes\"],\r\n \"char\": \"⚱\",\r\n \"category\": \"objects\"\r\n },\r\n \"amphora\": {\r\n \"keywords\": [\"vase\", \"jar\"],\r\n \"char\": \"🏺\",\r\n \"category\": \"objects\"\r\n },\r\n \"crystal_ball\": {\r\n \"keywords\": [\"disco\", \"party\", \"magic\", \"circus\", \"fortune_teller\"],\r\n \"char\": \"🔮\",\r\n \"category\": \"objects\"\r\n },\r\n \"prayer_beads\": {\r\n \"keywords\": [\"dhikr\", \"religious\"],\r\n \"char\": \"📿\",\r\n \"category\": \"objects\"\r\n },\r\n \"barber\": {\r\n \"keywords\": [\"hair\", \"salon\", \"style\"],\r\n \"char\": \"💈\",\r\n \"category\": \"objects\"\r\n },\r\n \"alembic\": {\r\n \"keywords\": [\"distilling\", \"science\", \"experiment\"],\r\n \"char\": \"⚗\",\r\n \"category\": \"objects\"\r\n },\r\n \"telescope\": {\r\n \"keywords\": [\"stars\", \"space\", \"zoom\"],\r\n \"char\": \"🔭\",\r\n \"category\": \"objects\"\r\n },\r\n \"microscope\": {\r\n \"keywords\": [\"laboratory\", \"experiment\", \"zoomin\", \"science\", \"study\"],\r\n \"char\": \"🔬\",\r\n \"category\": \"objects\"\r\n },\r\n \"hole\": {\r\n \"keywords\": [\"embarrassing\"],\r\n \"char\": \"🕳\",\r\n \"category\": \"objects\"\r\n },\r\n \"pill\": {\r\n \"keywords\": [\"health\", \"medicine\", \"doctor\", \"pharmacy\", \"drug\"],\r\n \"char\": \"💊\",\r\n \"category\": \"objects\"\r\n },\r\n \"syringe\": {\r\n \"keywords\": [\"health\", \"hospital\", \"drugs\", \"blood\", \"medicine\", \"needle\", \"doctor\", \"nurse\"],\r\n \"char\": \"💉\",\r\n \"category\": \"objects\"\r\n },\r\n \"thermometer\": {\r\n \"keywords\": [\"weather\", \"temperature\", \"hot\", \"cold\"],\r\n \"char\": \"🌡\",\r\n \"category\": \"objects\"\r\n },\r\n \"label\": {\r\n \"keywords\": [\"sale\", \"tag\"],\r\n \"char\": \"🏷\",\r\n \"category\": \"objects\"\r\n },\r\n \"bookmark\": {\r\n \"keywords\": [\"favorite\", \"label\", \"save\"],\r\n \"char\": \"🔖\",\r\n \"category\": \"objects\"\r\n },\r\n \"toilet\": {\r\n \"keywords\": [\"restroom\", \"wc\", \"washroom\", \"bathroom\", \"potty\"],\r\n \"char\": \"🚽\",\r\n \"category\": \"objects\"\r\n },\r\n \"shower\": {\r\n \"keywords\": [\"clean\", \"water\", \"bathroom\"],\r\n \"char\": \"🚿\",\r\n \"category\": \"objects\"\r\n },\r\n \"bathtub\": {\r\n \"keywords\": [\"clean\", \"shower\", \"bathroom\"],\r\n \"char\": \"🛁\",\r\n \"category\": \"objects\"\r\n },\r\n \"key\": {\r\n \"keywords\": [\"lock\", \"door\", \"password\"],\r\n \"char\": \"🔑\",\r\n \"category\": \"objects\"\r\n },\r\n \"old_key\": {\r\n \"keywords\": [\"lock\", \"door\", \"password\"],\r\n \"char\": \"🗝\",\r\n \"category\": \"objects\"\r\n },\r\n \"couch_and_lamp\": {\r\n \"keywords\": [\"read\", \"chill\"],\r\n \"char\": \"🛋\",\r\n \"category\": \"objects\"\r\n },\r\n \"sleeping_accommodation\": {\r\n \"keywords\": [\"bed\", \"rest\"],\r\n \"char\": \"🛌\",\r\n \"category\": \"objects\"\r\n },\r\n \"bed\": {\r\n \"keywords\": [\"sleep\", \"rest\"],\r\n \"char\": \"🛏\",\r\n \"category\": \"objects\"\r\n },\r\n \"door\": {\r\n \"keywords\": [\"house\", \"entry\", \"exit\"],\r\n \"char\": \"🚪\",\r\n \"category\": \"objects\"\r\n },\r\n \"bellhop_bell\": {\r\n \"keywords\": [\"service\"],\r\n \"char\": \"🛎\",\r\n \"category\": \"objects\"\r\n },\r\n \"frame_with_picture\": {\r\n \"keywords\": [\"photography\"],\r\n \"char\": \"🖼\",\r\n \"category\": \"objects\"\r\n },\r\n \"world_map\": {\r\n \"keywords\": [\"location\", \"direction\"],\r\n \"char\": \"🗺\",\r\n \"category\": \"objects\"\r\n },\r\n \"umbrella_on_ground\": {\r\n \"keywords\": [\"weather\", \"summer\"],\r\n \"char\": \"⛱\",\r\n \"category\": \"objects\"\r\n },\r\n \"moyai\": {\r\n \"keywords\": [\"rock\", \"easter island\", \"moai\"],\r\n \"char\": \"🗿\",\r\n \"category\": \"objects\"\r\n },\r\n \"shopping_bags\": {\r\n \"keywords\": [\"mall\", \"buy\", \"purchase\"],\r\n \"char\": \"🛍\",\r\n \"category\": \"objects\"\r\n },\r\n \"balloon\": {\r\n \"keywords\": [\"party\", \"celebration\", \"birthday\", \"circus\"],\r\n \"char\": \"🎈\",\r\n \"category\": \"objects\"\r\n },\r\n \"flags\": {\r\n \"keywords\": [\"fish\", \"japanese\", \"koinobori\", \"carp\", \"banner\"],\r\n \"char\": \"🎏\",\r\n \"category\": \"objects\"\r\n },\r\n \"ribbon\": {\r\n \"keywords\": [\"decoration\", \"pink\", \"girl\", \"bowtie\"],\r\n \"char\": \"🎀\",\r\n \"category\": \"objects\"\r\n },\r\n \"gift\": {\r\n \"keywords\": [\"present\", \"birthday\", \"christmas\", \"xmas\"],\r\n \"char\": \"🎁\",\r\n \"category\": \"objects\"\r\n },\r\n \"confetti_ball\": {\r\n \"keywords\": [\"festival\", \"party\", \"birthday\", \"circus\"],\r\n \"char\": \"🎊\",\r\n \"category\": \"objects\"\r\n },\r\n \"tada\": {\r\n \"keywords\": [\"party\", \"contulations\", \"birthday\", \"magic\", \"circus\"],\r\n \"char\": \"🎉\",\r\n \"category\": \"objects\"\r\n },\r\n \"dolls\": {\r\n \"keywords\": [\"japanese\", \"toy\", \"kimono\"],\r\n \"char\": \"🎎\",\r\n \"category\": \"objects\"\r\n },\r\n \"wind_chime\": {\r\n \"keywords\": [\"nature\", \"ding\", \"spring\", \"bell\"],\r\n \"char\": \"🎐\",\r\n \"category\": \"objects\"\r\n },\r\n \"crossed_flags\": {\r\n \"keywords\": [\"japanese\", \"nation\", \"country\", \"border\"],\r\n \"char\": \"🎌\",\r\n \"category\": \"objects\"\r\n },\r\n \"izakaya_lantern\": {\r\n \"keywords\": [\"light\", \"paper\", \"halloween\", \"spooky\"],\r\n \"char\": \"🏮\",\r\n \"category\": \"objects\"\r\n },\r\n \"envelope\": {\r\n \"keywords\": [\"letter\", \"postal\", \"inbox\", \"communication\"],\r\n \"char\": \"✉️\",\r\n \"category\": \"objects\"\r\n },\r\n \"envelope_with_arrow\": {\r\n \"keywords\": [\"email\", \"communication\"],\r\n \"char\": \"📩\",\r\n \"category\": \"objects\"\r\n },\r\n \"incoming_envelope\": {\r\n \"keywords\": [\"email\", \"inbox\"],\r\n \"char\": \"📨\",\r\n \"category\": \"objects\"\r\n },\r\n \"email\": {\r\n \"keywords\": [\"communication\", \"inbox\"],\r\n \"char\": \"📧\",\r\n \"category\": \"objects\"\r\n },\r\n \"love_letter\": {\r\n \"keywords\": [\"email\", \"like\", \"affection\", \"envelope\", \"valentines\"],\r\n \"char\": \"💌\",\r\n \"category\": \"objects\"\r\n },\r\n \"postbox\": {\r\n \"keywords\": [\"email\", \"letter\", \"envelope\"],\r\n \"char\": \"📮\",\r\n \"category\": \"objects\"\r\n },\r\n \"mailbox_closed\": {\r\n \"keywords\": [\"email\", \"communication\", \"inbox\"],\r\n \"char\": \"📪\",\r\n \"category\": \"objects\"\r\n },\r\n \"mailbox\": {\r\n \"keywords\": [\"email\", \"inbox\", \"communication\"],\r\n \"char\": \"📫\",\r\n \"category\": \"objects\"\r\n },\r\n \"mailbox_with_mail\": {\r\n \"keywords\": [\"email\", \"inbox\", \"communication\"],\r\n \"char\": \"📬\",\r\n \"category\": \"objects\"\r\n },\r\n \"mailbox_with_no_mail\": {\r\n \"keywords\": [\"email\", \"inbox\"],\r\n \"char\": \"📭\",\r\n \"category\": \"objects\"\r\n },\r\n \"package\": {\r\n \"keywords\": [\"mail\", \"gift\", \"cardboard\", \"box\", \"moving\"],\r\n \"char\": \"📦\",\r\n \"category\": \"objects\"\r\n },\r\n \"postal_horn\": {\r\n \"keywords\": [\"instrument\", \"music\"],\r\n \"char\": \"📯\",\r\n \"category\": \"objects\"\r\n },\r\n \"inbox_tray\": {\r\n \"keywords\": [\"email\", \"documents\"],\r\n \"char\": \"📥\",\r\n \"category\": \"objects\"\r\n },\r\n \"outbox_tray\": {\r\n \"keywords\": [\"inbox\", \"email\"],\r\n \"char\": \"📤\",\r\n \"category\": \"objects\"\r\n },\r\n \"scroll\": {\r\n \"keywords\": [\"documents\", \"ancient\", \"history\", \"paper\"],\r\n \"char\": \"📜\",\r\n \"category\": \"objects\"\r\n },\r\n \"page_with_curl\": {\r\n \"keywords\": [\"documents\", \"office\", \"paper\"],\r\n \"char\": \"📃\",\r\n \"category\": \"objects\"\r\n },\r\n \"bookmark_tabs\": {\r\n \"keywords\": [\"favorite\", \"save\", \"order\", \"tidy\"],\r\n \"char\": \"📑\",\r\n \"category\": \"objects\"\r\n },\r\n \"bar_chart\": {\r\n \"keywords\": [\"graph\", \"presentation\", \"stats\"],\r\n \"char\": \"📊\",\r\n \"category\": \"objects\"\r\n },\r\n \"chart_with_upwards_trend\": {\r\n \"keywords\": [\"graph\", \"presentation\", \"stats\", \"recovery\", \"business\", \"economics\", \"money\", \"sales\", \"good\", \"success\"],\r\n \"char\": \"📈\",\r\n \"category\": \"objects\"\r\n },\r\n \"chart_with_downwards_trend\": {\r\n \"keywords\": [\"graph\", \"presentation\", \"stats\", \"recession\", \"business\", \"economics\", \"money\", \"sales\", \"bad\", \"failure\"],\r\n \"char\": \"📉\",\r\n \"category\": \"objects\"\r\n },\r\n \"page_facing_up\": {\r\n \"keywords\": [\"documents\", \"office\", \"paper\", \"information\"],\r\n \"char\": \"📄\",\r\n \"category\": \"objects\"\r\n },\r\n \"date\": {\r\n \"keywords\": [\"calendar\", \"schedule\"],\r\n \"char\": \"📅\",\r\n \"category\": \"objects\"\r\n },\r\n \"calendar\": {\r\n \"keywords\": [\"schedule\", \"date\", \"planning\"],\r\n \"char\": \"📆\",\r\n \"category\": \"objects\"\r\n },\r\n \"spiral_calendar_pad\": {\r\n \"keywords\": [\"date\", \"schedule\", \"planning\"],\r\n \"char\": \"🗓\",\r\n \"category\": \"objects\"\r\n },\r\n \"card_index\": {\r\n \"keywords\": [\"business\", \"stationery\"],\r\n \"char\": \"📇\",\r\n \"category\": \"objects\"\r\n },\r\n \"card_file_box\": {\r\n \"keywords\": [\"business\", \"stationery\"],\r\n \"char\": \"🗃\",\r\n \"category\": \"objects\"\r\n },\r\n \"ballot_box_with_ballot\": {\r\n \"keywords\": [\"election\", \"vote\"],\r\n \"char\": \"🗳\",\r\n \"category\": \"objects\"\r\n },\r\n \"file_cabinet\": {\r\n \"keywords\": [\"filing\", \"organizing\"],\r\n \"char\": \"🗄\",\r\n \"category\": \"objects\"\r\n },\r\n \"clipboard\": {\r\n \"keywords\": [\"stationery\", \"documents\"],\r\n \"char\": \"📋\",\r\n \"category\": \"objects\"\r\n },\r\n \"spiral_note_pad\": {\r\n \"keywords\": [\"memo\", \"stationery\"],\r\n \"char\": \"🗒\",\r\n \"category\": \"objects\"\r\n },\r\n \"file_folder\": {\r\n \"keywords\": [\"documents\", \"business\", \"office\"],\r\n \"char\": \"📁\",\r\n \"category\": \"objects\"\r\n },\r\n \"open_file_folder\": {\r\n \"keywords\": [\"documents\", \"load\"],\r\n \"char\": \"📂\",\r\n \"category\": \"objects\"\r\n },\r\n \"card_index_dividers\": {\r\n \"keywords\": [\"organizing\", \"business\", \"stationery\"],\r\n \"char\": \"🗂\",\r\n \"category\": \"objects\"\r\n },\r\n \"rolled_up_newspaper\": {\r\n \"keywords\": [\"press\", \"headline\"],\r\n \"char\": \"🗞\",\r\n \"category\": \"objects\"\r\n },\r\n \"newspaper\": {\r\n \"keywords\": [\"press\", \"headline\"],\r\n \"char\": \"📰\",\r\n \"category\": \"objects\"\r\n },\r\n \"notebook\": {\r\n \"keywords\": [\"stationery\", \"record\", \"notes\", \"paper\", \"study\"],\r\n \"char\": \"📓\",\r\n \"category\": \"objects\"\r\n },\r\n \"closed_book\": {\r\n \"keywords\": [\"read\", \"library\", \"knowledge\", \"textbook\", \"learn\"],\r\n \"char\": \"📕\",\r\n \"category\": \"objects\"\r\n },\r\n \"green_book\": {\r\n \"keywords\": [\"read\", \"library\", \"knowledge\", \"study\"],\r\n \"char\": \"📗\",\r\n \"category\": \"objects\"\r\n },\r\n \"blue_book\": {\r\n \"keywords\": [\"read\", \"library\", \"knowledge\", \"learn\", \"study\"],\r\n \"char\": \"📘\",\r\n \"category\": \"objects\"\r\n },\r\n \"orange_book\": {\r\n \"keywords\": [\"read\", \"library\", \"knowledge\", \"textbook\", \"study\"],\r\n \"char\": \"📙\",\r\n \"category\": \"objects\"\r\n },\r\n \"notebook_with_decorative_cover\": {\r\n \"keywords\": [\"classroom\", \"notes\", \"record\", \"paper\", \"study\"],\r\n \"char\": \"📔\",\r\n \"category\": \"objects\"\r\n },\r\n \"ledger\": {\r\n \"keywords\": [\"notes\", \"paper\"],\r\n \"char\": \"📒\",\r\n \"category\": \"objects\"\r\n },\r\n \"books\": {\r\n \"keywords\": [\"literature\", \"library\", \"study\"],\r\n \"char\": \"📚\",\r\n \"category\": \"objects\"\r\n },\r\n \"book\": {\r\n \"keywords\": [\"open_book\", \"read\", \"library\", \"knowledge\", \"literature\", \"learn\", \"study\"],\r\n \"char\": \"📖\",\r\n \"category\": \"objects\"\r\n },\r\n \"link\": {\r\n \"keywords\": [\"rings\", \"url\"],\r\n \"char\": \"🔗\",\r\n \"category\": \"objects\"\r\n },\r\n \"paperclip\": {\r\n \"keywords\": [\"documents\", \"stationery\"],\r\n \"char\": \"📎\",\r\n \"category\": \"objects\"\r\n },\r\n \"linked_paperclips\": {\r\n \"keywords\": [\"documents\", \"stationery\"],\r\n \"char\": \"🖇\",\r\n \"category\": \"objects\"\r\n },\r\n \"scissors\": {\r\n \"keywords\": [\"stationery\", \"cut\"],\r\n \"char\": \"✂️\",\r\n \"category\": \"objects\"\r\n },\r\n \"triangular_ruler\": {\r\n \"keywords\": [\"stationery\", \"math\", \"architect\", \"sketch\"],\r\n \"char\": \"📐\",\r\n \"category\": \"objects\"\r\n },\r\n \"straight_ruler\": {\r\n \"keywords\": [\"stationery\", \"calculate\", \"length\", \"math\", \"school\", \"drawing\", \"architect\", \"sketch\"],\r\n \"char\": \"📏\",\r\n \"category\": \"objects\"\r\n },\r\n \"pushpin\": {\r\n \"keywords\": [\"stationery\", \"mark\", \"here\"],\r\n \"char\": \"📌\",\r\n \"category\": \"objects\"\r\n },\r\n \"round_pushpin\": {\r\n \"keywords\": [\"stationery\", \"location\", \"map\", \"here\"],\r\n \"char\": \"📍\",\r\n \"category\": \"objects\"\r\n },\r\n \"triangular_flag_on_post\": {\r\n \"keywords\": [\"mark\", \"milestone\", \"place\"],\r\n \"char\": \"🚩\",\r\n \"category\": \"objects\"\r\n },\r\n \"waving_white_flag\": {\r\n \"keywords\": [\"losing\", \"loser\", \"lost\", \"surrender\", \"give up\", \"fail\"],\r\n \"char\": \"🏳\",\r\n \"category\": \"objects\"\r\n },\r\n \"waving_black_flag\": {\r\n \"keywords\": [\"pirate\"],\r\n \"char\": \"🏴\",\r\n \"category\": \"objects\"\r\n },\r\n \"closed_lock_with_key\": {\r\n \"keywords\": [\"security\", \"privacy\"],\r\n \"char\": \"🔐\",\r\n \"category\": \"objects\"\r\n },\r\n \"lock\": {\r\n \"keywords\": [\"security\", \"password\", \"padlock\"],\r\n \"char\": \"🔒\",\r\n \"category\": \"objects\"\r\n },\r\n \"unlock\": {\r\n \"keywords\": [\"privacy\", \"security\"],\r\n \"char\": \"🔓\",\r\n \"category\": \"objects\"\r\n },\r\n \"lock_with_ink_pen\": {\r\n \"keywords\": [\"security\", \"secret\"],\r\n \"char\": \"🔏\",\r\n \"category\": \"objects\"\r\n },\r\n \"lower_left_ballpoint_pen\": {\r\n \"keywords\": [\"stationery\", \"writing\", \"write\"],\r\n \"char\": \"🖊\",\r\n \"category\": \"objects\"\r\n },\r\n \"lower_left_fountain_pen\": {\r\n \"keywords\": [\"stationery\", \"writing\", \"write\"],\r\n \"char\": \"🖋\",\r\n \"category\": \"objects\"\r\n },\r\n \"black_nib\": {\r\n \"keywords\": [\"pen\", \"stationery\", \"writing\", \"write\"],\r\n \"char\": \"✒️\",\r\n \"category\": \"objects\"\r\n },\r\n \"memo\": {\r\n \"keywords\": [\"write\", \"documents\", \"stationery\", \"pencil\", \"paper\", \"writing\", \"legal\", \"exam\", \"quiz\", \"test\", \"study\"],\r\n \"char\": \"📝\",\r\n \"category\": \"objects\"\r\n },\r\n \"pencil2\": {\r\n \"keywords\": [\"stationery\", \"write\", \"paper\", \"writing\", \"school\", \"study\"],\r\n \"char\": \"✏️\",\r\n \"category\": \"objects\"\r\n },\r\n \"lower_left_crayon\": {\r\n \"keywords\": [\"drawing\", \"creativity\"],\r\n \"char\": \"🖍\",\r\n \"category\": \"objects\"\r\n },\r\n \"lower_left_paintbrush\": {\r\n \"keywords\": [\"drawing\", \"creativity\", \"art\"],\r\n \"char\": \"🖌\",\r\n \"category\": \"objects\"\r\n },\r\n \"mag\": {\r\n \"keywords\": [\"search\", \"zoom\", \"find\", \"detective\"],\r\n \"char\": \"🔍\",\r\n \"category\": \"objects\"\r\n },\r\n \"mag_right\": {\r\n \"keywords\": [\"search\", \"zoom\", \"find\", \"detective\"],\r\n \"char\": \"🔎\",\r\n \"category\": \"objects\"\r\n },\r\n \"heart\": {\r\n \"keywords\": [\"love\", \"like\", \"valentines\"],\r\n \"char\": \"❤️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"yellow_heart\": {\r\n \"keywords\": [\"love\", \"like\", \"affection\", \"valentines\"],\r\n \"char\": \"💛\",\r\n \"category\": \"symbols\"\r\n },\r\n \"green_heart\": {\r\n \"keywords\": [\"love\", \"like\", \"affection\", \"valentines\"],\r\n \"char\": \"💚\",\r\n \"category\": \"symbols\"\r\n },\r\n \"blue_heart\": {\r\n \"keywords\": [\"love\", \"like\", \"affection\", \"valentines\"],\r\n \"char\": \"💙\",\r\n \"category\": \"symbols\"\r\n },\r\n \"purple_heart\": {\r\n \"keywords\": [\"love\", \"like\", \"affection\", \"valentines\"],\r\n \"char\": \"💜\",\r\n \"category\": \"symbols\"\r\n },\r\n \"broken_heart\": {\r\n \"keywords\": [\"sad\", \"sorry\", \"break\", \"heart\", \"heartbreak\"],\r\n \"char\": \"💔\",\r\n \"category\": \"symbols\"\r\n },\r\n \"heavy_heart_exclamation_mark_ornament\": {\r\n \"keywords\": [\"decoration\", \"love\"],\r\n \"char\": \"❣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"two_hearts\": {\r\n \"keywords\": [\"love\", \"like\", \"affection\", \"valentines\", \"heart\"],\r\n \"char\": \"💕\",\r\n \"category\": \"symbols\"\r\n },\r\n \"revolving_hearts\": {\r\n \"keywords\": [\"love\", \"like\", \"affection\", \"valentines\"],\r\n \"char\": \"💞\",\r\n \"category\": \"symbols\"\r\n },\r\n \"heartbeat\": {\r\n \"keywords\": [\"love\", \"like\", \"affection\", \"valentines\", \"pink\", \"heart\"],\r\n \"char\": \"💓\",\r\n \"category\": \"symbols\"\r\n },\r\n \"heartpulse\": {\r\n \"keywords\": [\"like\", \"love\", \"affection\", \"valentines\", \"pink\"],\r\n \"char\": \"💗\",\r\n \"category\": \"symbols\"\r\n },\r\n \"sparkling_heart\": {\r\n \"keywords\": [\"love\", \"like\", \"affection\", \"valentines\"],\r\n \"char\": \"💖\",\r\n \"category\": \"symbols\"\r\n },\r\n \"cupid\": {\r\n \"keywords\": [\"love\", \"like\", \"heart\", \"affection\", \"valentines\"],\r\n \"char\": \"💘\",\r\n \"category\": \"symbols\"\r\n },\r\n \"gift_heart\": {\r\n \"keywords\": [\"love\", \"valentines\"],\r\n \"char\": \"💝\",\r\n \"category\": \"symbols\"\r\n },\r\n \"heart_decoration\": {\r\n \"keywords\": [\"purple-square\", \"love\", \"like\"],\r\n \"char\": \"💟\",\r\n \"category\": \"symbols\"\r\n },\r\n \"peace_symbol\": {\r\n \"keywords\": [\"hippie\"],\r\n \"char\": \"☮\",\r\n \"category\": \"symbols\"\r\n },\r\n \"latin_cross\": {\r\n \"keywords\": [\"christianity\"],\r\n \"char\": \"✝\",\r\n \"category\": \"symbols\"\r\n },\r\n \"star_and_crescent\": {\r\n \"keywords\": [\"islam\"],\r\n \"char\": \"☪\",\r\n \"category\": \"symbols\"\r\n },\r\n \"om_symbol\": {\r\n \"keywords\": [\"hinduism\", \"buddhism\", \"sikhism\", \"jainism\"],\r\n \"char\": \"🕉\",\r\n \"category\": \"symbols\"\r\n },\r\n \"wheel_of_dharma\": {\r\n \"keywords\": [\"hinduism\", \"buddhism\", \"sikhism\", \"jainism\"],\r\n \"char\": \"☸\",\r\n \"category\": \"symbols\"\r\n },\r\n \"star_of_david\": {\r\n \"keywords\": [\"judaism\"],\r\n \"char\": \"✡\",\r\n \"category\": \"symbols\"\r\n },\r\n \"six_pointed_star\": {\r\n \"keywords\": [\"purple-square\", \"religion\", \"jewish\", \"hexagram\"],\r\n \"char\": \"🔯\",\r\n \"category\": \"symbols\"\r\n },\r\n \"menorah_with_nine_branches\": {\r\n \"keywords\": [\"hanukkah\", \"candles\", \"jewish\"],\r\n \"char\": \"🕎\",\r\n \"category\": \"symbols\"\r\n },\r\n \"yin_yang\": {\r\n \"keywords\": [\"balance\"],\r\n \"char\": \"☯\",\r\n \"category\": \"symbols\"\r\n },\r\n \"orthodox_cross\": {\r\n \"keywords\": [\"suppedaneum\", \"religion\"],\r\n \"char\": \"☦\",\r\n \"category\": \"symbols\"\r\n },\r\n \"place_of_worship\": {\r\n \"keywords\": [\"religion\", \"church\", \"temple\", \"prayer\"],\r\n \"char\": \"🛐\",\r\n \"category\": \"symbols\"\r\n },\r\n \"ophiuchus\": {\r\n \"keywords\": [\"sign\", \"purple-square\", \"constellation\", \"astrology\"],\r\n \"char\": \"⛎\",\r\n \"category\": \"symbols\"\r\n },\r\n \"aries\": {\r\n \"keywords\": [\"sign\", \"purple-square\", \"zodiac\", \"astrology\"],\r\n \"char\": \"♈\",\r\n \"category\": \"symbols\"\r\n },\r\n \"taurus\": {\r\n \"keywords\": [\"purple-square\", \"sign\", \"zodiac\", \"astrology\"],\r\n \"char\": \"♉\",\r\n \"category\": \"symbols\"\r\n },\r\n \"gemini\": {\r\n \"keywords\": [\"sign\", \"zodiac\", \"purple-square\", \"astrology\"],\r\n \"char\": \"♊\",\r\n \"category\": \"symbols\"\r\n },\r\n \"cancer\": {\r\n \"keywords\": [\"sign\", \"zodiac\", \"purple-square\", \"astrology\"],\r\n \"char\": \"♋\",\r\n \"category\": \"symbols\"\r\n },\r\n \"leo\": {\r\n \"keywords\": [\"sign\", \"purple-square\", \"zodiac\", \"astrology\"],\r\n \"char\": \"♌\",\r\n \"category\": \"symbols\"\r\n },\r\n \"virgo\": {\r\n \"keywords\": [\"sign\", \"zodiac\", \"purple-square\", \"astrology\"],\r\n \"char\": \"♍\",\r\n \"category\": \"symbols\"\r\n },\r\n \"libra\": {\r\n \"keywords\": [\"sign\", \"purple-square\", \"zodiac\", \"astrology\"],\r\n \"char\": \"♎\",\r\n \"category\": \"symbols\"\r\n },\r\n \"scorpius\": {\r\n \"keywords\": [\"sign\", \"zodiac\", \"purple-square\", \"astrology\", \"scorpio\"],\r\n \"char\": \"♏\",\r\n \"category\": \"symbols\"\r\n },\r\n \"sagittarius\": {\r\n \"keywords\": [\"sign\", \"zodiac\", \"purple-square\", \"astrology\"],\r\n \"char\": \"♐\",\r\n \"category\": \"symbols\"\r\n },\r\n \"capricorn\": {\r\n \"keywords\": [\"sign\", \"zodiac\", \"purple-square\", \"astrology\"],\r\n \"char\": \"♑\",\r\n \"category\": \"symbols\"\r\n },\r\n \"aquarius\": {\r\n \"keywords\": [\"sign\", \"purple-square\", \"zodiac\", \"astrology\"],\r\n \"char\": \"♒\",\r\n \"category\": \"symbols\"\r\n },\r\n \"pisces\": {\r\n \"keywords\": [\"purple-square\", \"sign\", \"zodiac\", \"astrology\"],\r\n \"char\": \"♓\",\r\n \"category\": \"symbols\"\r\n },\r\n \"id\": {\r\n \"keywords\": [\"purple-square\", \"words\"],\r\n \"char\": \"🆔\",\r\n \"category\": \"symbols\"\r\n },\r\n \"atom_symbol\": {\r\n \"keywords\": [\"science\"],\r\n \"char\": \"⚛\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u7a7a\": {\r\n \"keywords\": [\"kanji\", \"japanese\", \"chinese\", \"empty\", \"sky\", \"blue-square\"],\r\n \"char\": \"🈳\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u5272\": {\r\n \"keywords\": [\"cut\", \"divide\", \"chinese\", \"kanji\", \"pink-square\"],\r\n \"char\": \"🈹\",\r\n \"category\": \"symbols\"\r\n },\r\n \"radioactive_sign\": {\r\n \"keywords\": [\"nuclear\", \"danger\"],\r\n \"char\": \"☢\",\r\n \"category\": \"symbols\"\r\n },\r\n \"biohazard_sign\": {\r\n \"keywords\": [\"danger\"],\r\n \"char\": \"☣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"mobile_phone_off\": {\r\n \"keywords\": [\"mute\", \"orange-square\", \"silence\", \"quiet\"],\r\n \"char\": \"📴\",\r\n \"category\": \"symbols\"\r\n },\r\n \"vibration_mode\": {\r\n \"keywords\": [\"orange-square\", \"phone\"],\r\n \"char\": \"📳\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u6709\": {\r\n \"keywords\": [\"orange-square\", \"chinese\", \"have\", \"kanji\"],\r\n \"char\": \"🈶\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u7121\": {\r\n \"keywords\": [\"nothing\", \"chinese\", \"kanji\", \"japanese\", \"orange-square\"],\r\n \"char\": \"🈚\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u7533\": {\r\n \"keywords\": [\"chinese\", \"japanese\", \"kanji\", \"orange-square\"],\r\n \"char\": \"🈸\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u55b6\": {\r\n \"keywords\": [\"japanese\", \"opening hours\", \"orange-square\"],\r\n \"char\": \"🈺\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u6708\": {\r\n \"keywords\": [\"chinese\", \"month\", \"moon\", \"japanese\", \"orange-square\", \"kanji\"],\r\n \"char\": \"🈷️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"eight_pointed_black_star\": {\r\n \"keywords\": [\"orange-square\", \"shape\", \"polygon\"],\r\n \"char\": \"✴️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"vs\": {\r\n \"keywords\": [\"words\", \"orange-square\"],\r\n \"char\": \"🆚\",\r\n \"category\": \"symbols\"\r\n },\r\n \"accept\": {\r\n \"keywords\": [\"ok\", \"good\", \"chinese\", \"kanji\", \"agree\", \"yes\", \"orange-circle\"],\r\n \"char\": \"🉑\",\r\n \"category\": \"symbols\"\r\n },\r\n \"white_flower\": {\r\n \"keywords\": [\"japanese\", \"spring\"],\r\n \"char\": \"💮\",\r\n \"category\": \"symbols\"\r\n },\r\n \"ideograph_advantage\": {\r\n \"keywords\": [\"chinese\", \"kanji\", \"obtain\", \"get\", \"circle\"],\r\n \"char\": \"🉐\",\r\n \"category\": \"symbols\"\r\n },\r\n \"secret\": {\r\n \"keywords\": [\"privacy\", \"chinese\", \"sshh\", \"kanji\", \"red-circle\"],\r\n \"char\": \"㊙️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"congratulations\": {\r\n \"keywords\": [\"chinese\", \"kanji\", \"japanese\", \"red-circle\"],\r\n \"char\": \"㊗️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u5408\": {\r\n \"keywords\": [\"japanese\", \"chinese\", \"join\", \"kanji\", \"red-square\"],\r\n \"char\": \"🈴\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u6e80\": {\r\n \"keywords\": [\"full\", \"chinese\", \"japanese\", \"red-square\", \"kanji\"],\r\n \"char\": \"🈵\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u7981\": {\r\n \"keywords\": [\"kanji\", \"japanese\", \"chinese\", \"forbidden\", \"limit\", \"restricted\", \"red-square\"],\r\n \"char\": \"🈲\",\r\n \"category\": \"symbols\"\r\n },\r\n \"a\": {\r\n \"keywords\": [\"red-square\", \"alphabet\", \"letter\"],\r\n \"char\": \"🅰️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"b\": {\r\n \"keywords\": [\"red-square\", \"alphabet\", \"letter\"],\r\n \"char\": \"🅱️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"ab\": {\r\n \"keywords\": [\"red-square\", \"alphabet\"],\r\n \"char\": \"🆎\",\r\n \"category\": \"symbols\"\r\n },\r\n \"cl\": {\r\n \"keywords\": [\"alphabet\", \"words\", \"red-square\"],\r\n \"char\": \"🆑\",\r\n \"category\": \"symbols\"\r\n },\r\n \"o2\": {\r\n \"keywords\": [\"alphabet\", \"red-square\", \"letter\"],\r\n \"char\": \"🅾️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"sos\": {\r\n \"keywords\": [\"help\", \"red-square\", \"words\", \"emergency\", \"911\"],\r\n \"char\": \"🆘\",\r\n \"category\": \"symbols\"\r\n },\r\n \"no_entry\": {\r\n \"keywords\": [\"limit\", \"security\", \"privacy\", \"bad\", \"denied\", \"stop\", \"circle\"],\r\n \"char\": \"⛔\",\r\n \"category\": \"symbols\"\r\n },\r\n \"name_badge\": {\r\n \"keywords\": [\"fire\", \"forbid\"],\r\n \"char\": \"📛\",\r\n \"category\": \"symbols\"\r\n },\r\n \"no_entry_sign\": {\r\n \"keywords\": [\"forbid\", \"stop\", \"limit\", \"denied\", \"disallow\", \"circle\"],\r\n \"char\": \"🚫\",\r\n \"category\": \"symbols\"\r\n },\r\n \"x\": {\r\n \"keywords\": [\"no\", \"delete\", \"remove\", \"cancel\"],\r\n \"char\": \"❌\",\r\n \"category\": \"symbols\"\r\n },\r\n \"o\": {\r\n \"keywords\": [\"circle\", \"round\"],\r\n \"char\": \"⭕\",\r\n \"category\": \"symbols\"\r\n },\r\n \"anger\": {\r\n \"keywords\": [\"angry\", \"mad\"],\r\n \"char\": \"💢\",\r\n \"category\": \"symbols\"\r\n },\r\n \"hotsprings\": {\r\n \"keywords\": [\"bath\", \"warm\", \"relax\"],\r\n \"char\": \"♨️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"no_pedestrians\": {\r\n \"keywords\": [\"rules\", \"crossing\", \"walking\", \"circle\"],\r\n \"char\": \"🚷\",\r\n \"category\": \"symbols\"\r\n },\r\n \"do_not_litter\": {\r\n \"keywords\": [\"trash\", \"bin\", \"garbage\", \"circle\"],\r\n \"char\": \"🚯\",\r\n \"category\": \"symbols\"\r\n },\r\n \"no_bicycles\": {\r\n \"keywords\": [\"cyclist\", \"prohibited\", \"circle\"],\r\n \"char\": \"🚳\",\r\n \"category\": \"symbols\"\r\n },\r\n \"non-potable_water\": {\r\n \"keywords\": [\"drink\", \"faucet\", \"tap\", \"circle\"],\r\n \"char\": \"🚱\",\r\n \"category\": \"symbols\"\r\n },\r\n \"underage\": {\r\n \"keywords\": [\"18\", \"drink\", \"pub\", \"night\", \"minor\", \"circle\"],\r\n \"char\": \"🔞\",\r\n \"category\": \"symbols\"\r\n },\r\n \"no_mobile_phones\": {\r\n \"keywords\": [\"iphone\", \"mute\", \"circle\"],\r\n \"char\": \"📵\",\r\n \"category\": \"symbols\"\r\n },\r\n \"exclamation\": {\r\n \"keywords\": [\"heavy_exclamation_mark\", \"danger\", \"surprise\", \"punctuation\", \"wow\", \"warning\"],\r\n \"char\": \"❗\",\r\n \"category\": \"symbols\"\r\n },\r\n \"grey_exclamation\": {\r\n \"keywords\": [\"surprise\", \"punctuation\", \"gray\", \"wow\", \"warning\"],\r\n \"char\": \"❕\",\r\n \"category\": \"symbols\"\r\n },\r\n \"question\": {\r\n \"keywords\": [\"doubt\", \"confused\"],\r\n \"char\": \"❓\",\r\n \"category\": \"symbols\"\r\n },\r\n \"grey_question\": {\r\n \"keywords\": [\"doubts\", \"gray\", \"huh\", \"confused\"],\r\n \"char\": \"❔\",\r\n \"category\": \"symbols\"\r\n },\r\n \"bangbang\": {\r\n \"keywords\": [\"exclamation\", \"surprise\"],\r\n \"char\": \"‼️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"interrobang\": {\r\n \"keywords\": [\"wat\", \"punctuation\", \"surprise\"],\r\n \"char\": \"⁉️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"100\": {\r\n \"keywords\": [\"score\", \"perfect\", \"numbers\", \"century\", \"exam\", \"quiz\", \"test\", \"pass\", \"hundred\"],\r\n \"char\": \"💯\",\r\n \"category\": \"symbols\"\r\n },\r\n \"low_brightness\": {\r\n \"keywords\": [\"sun\", \"afternoon\", \"warm\", \"summer\"],\r\n \"char\": \"🔅\",\r\n \"category\": \"symbols\"\r\n },\r\n \"high_brightness\": {\r\n \"keywords\": [\"sun\", \"light\"],\r\n \"char\": \"🔆\",\r\n \"category\": \"symbols\"\r\n },\r\n \"trident\": {\r\n \"keywords\": [\"weapon\", \"spear\"],\r\n \"char\": \"🔱\",\r\n \"category\": \"symbols\"\r\n },\r\n \"fleur_de_lis\": {\r\n \"keywords\": [\"decorative\", \"scout\"],\r\n \"char\": \"⚜\",\r\n \"category\": \"symbols\"\r\n },\r\n \"part_alternation_mark\": {\r\n \"keywords\": [\"graph\", \"presentation\", \"stats\", \"business\", \"economics\", \"bad\"],\r\n \"char\": \"〽️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"warning\": {\r\n \"keywords\": [\"exclamation\", \"wip\", \"alert\", \"error\", \"problem\", \"issue\"],\r\n \"char\": \"⚠️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"children_crossing\": {\r\n \"keywords\": [\"school\", \"warning\", \"danger\", \"sign\", \"driving\", \"yellow-diamond\"],\r\n \"char\": \"🚸\",\r\n \"category\": \"symbols\"\r\n },\r\n \"beginner\": {\r\n \"keywords\": [\"badge\", \"shield\"],\r\n \"char\": \"🔰\",\r\n \"category\": \"symbols\"\r\n },\r\n \"recycle\": {\r\n \"keywords\": [\"arrow\", \"environment\", \"garbage\", \"trash\"],\r\n \"char\": \"♻️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u6307\": {\r\n \"keywords\": [\"chinese\", \"point\", \"green-square\", \"kanji\"],\r\n \"char\": \"🈯\",\r\n \"category\": \"symbols\"\r\n },\r\n \"chart\": {\r\n \"keywords\": [\"green-square\", \"graph\", \"presentation\", \"stats\"],\r\n \"char\": \"💹\",\r\n \"category\": \"symbols\"\r\n },\r\n \"sparkle\": {\r\n \"keywords\": [\"stars\", \"green-square\", \"awesome\", \"good\", \"fireworks\"],\r\n \"char\": \"❇️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"eight_spoked_asterisk\": {\r\n \"keywords\": [\"star\", \"sparkle\", \"green-square\"],\r\n \"char\": \"✳️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"negative_squared_cross_mark\": {\r\n \"keywords\": [\"x\", \"green-square\", \"no\", \"deny\"],\r\n \"char\": \"❎\",\r\n \"category\": \"symbols\"\r\n },\r\n \"white_check_mark\": {\r\n \"keywords\": [\"green-square\", \"ok\", \"agree\", \"vote\", \"election\", \"answer\"],\r\n \"char\": \"✅\",\r\n \"category\": \"symbols\"\r\n },\r\n \"diamond_shape_with_a_dot_inside\": {\r\n \"keywords\": [\"jewel\", \"blue\", \"gem\", \"crystal\", \"fancy\"],\r\n \"char\": \"💠\",\r\n \"category\": \"symbols\"\r\n },\r\n \"cyclone\": {\r\n \"keywords\": [\"weather\", \"swirl\", \"blue\", \"cloud\", \"vortex\", \"spiral\", \"whirlpool\", \"spin\"],\r\n \"char\": \"🌀\",\r\n \"category\": \"symbols\"\r\n },\r\n \"loop\": {\r\n \"keywords\": [\"tape\", \"cassette\"],\r\n \"char\": \"➿\",\r\n \"category\": \"symbols\"\r\n },\r\n \"globe_with_meridians\": {\r\n \"keywords\": [\"earth\", \"international\", \"world\", \"internet\", \"interweb\", \"i18n\"],\r\n \"char\": \"🌐\",\r\n \"category\": \"symbols\"\r\n },\r\n \"m\": {\r\n \"keywords\": [\"alphabet\", \"blue-circle\", \"letter\"],\r\n \"char\": \"Ⓜ️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"atm\": {\r\n \"keywords\": [\"money\", \"sales\", \"cash\", \"blue-square\", \"payment\", \"bank\"],\r\n \"char\": \"🏧\",\r\n \"category\": \"symbols\"\r\n },\r\n \"sa\": {\r\n \"keywords\": [\"japanese\", \"blue-square\", \"katakana\"],\r\n \"char\": \"🈂️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"passport_control\": {\r\n \"keywords\": [\"custom\", \"blue-square\"],\r\n \"char\": \"🛂\",\r\n \"category\": \"symbols\"\r\n },\r\n \"customs\": {\r\n \"keywords\": [\"passport\", \"border\", \"blue-square\"],\r\n \"char\": \"🛃\",\r\n \"category\": \"symbols\"\r\n },\r\n \"baggage_claim\": {\r\n \"keywords\": [\"blue-square\", \"airport\", \"transport\"],\r\n \"char\": \"🛄\",\r\n \"category\": \"symbols\"\r\n },\r\n \"left_luggage\": {\r\n \"keywords\": [\"blue-square\", \"travel\"],\r\n \"char\": \"🛅\",\r\n \"category\": \"symbols\"\r\n },\r\n \"wheelchair\": {\r\n \"keywords\": [\"blue-square\", \"disabled\", \"a11y\", \"accessibility\"],\r\n \"char\": \"♿\",\r\n \"category\": \"symbols\"\r\n },\r\n \"no_smoking\": {\r\n \"keywords\": [\"cigarette\", \"blue-square\", \"smell\", \"smoke\"],\r\n \"char\": \"🚭\",\r\n \"category\": \"symbols\"\r\n },\r\n \"wc\": {\r\n \"keywords\": [\"toilet\", \"restroom\", \"blue-square\"],\r\n \"char\": \"🚾\",\r\n \"category\": \"symbols\"\r\n },\r\n \"parking\": {\r\n \"keywords\": [\"cars\", \"blue-square\", \"alphabet\", \"letter\"],\r\n \"char\": \"🅿️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"potable_water\": {\r\n \"keywords\": [\"blue-square\", \"liquid\", \"restroom\", \"cleaning\", \"faucet\"],\r\n \"char\": \"🚰\",\r\n \"category\": \"symbols\"\r\n },\r\n \"mens\": {\r\n \"keywords\": [\"toilet\", \"restroom\", \"wc\", \"blue-square\", \"gender\", \"male\"],\r\n \"char\": \"🚹\",\r\n \"category\": \"symbols\"\r\n },\r\n \"womens\": {\r\n \"keywords\": [\"purple-square\", \"woman\", \"female\", \"toilet\", \"loo\", \"restroom\", \"gender\"],\r\n \"char\": \"🚺\",\r\n \"category\": \"symbols\"\r\n },\r\n \"baby_symbol\": {\r\n \"keywords\": [\"orange-square\", \"child\"],\r\n \"char\": \"🚼\",\r\n \"category\": \"symbols\"\r\n },\r\n \"restroom\": {\r\n \"keywords\": [\"blue-square\", \"toilet\", \"refresh\", \"wc\", \"gender\"],\r\n \"char\": \"🚻\",\r\n \"category\": \"symbols\"\r\n },\r\n \"put_litter_in_its_place\": {\r\n \"keywords\": [\"blue-square\", \"sign\", \"human\", \"info\"],\r\n \"char\": \"🚮\",\r\n \"category\": \"symbols\"\r\n },\r\n \"cinema\": {\r\n \"keywords\": [\"blue-square\", \"record\", \"film\", \"movie\", \"curtain\", \"stage\", \"theater\"],\r\n \"char\": \"🎦\",\r\n \"category\": \"symbols\"\r\n },\r\n \"signal_strength\": {\r\n \"keywords\": [\"blue-square\", \"reception\", \"phone\", \"internet\", \"connection\", \"wifi\", \"bluetooth\", \"bars\"],\r\n \"char\": \"📶\",\r\n \"category\": \"symbols\"\r\n },\r\n \"koko\": {\r\n \"keywords\": [\"blue-square\", \"here\", \"katakana\", \"japanese\", \"destination\"],\r\n \"char\": \"🈁\",\r\n \"category\": \"symbols\"\r\n },\r\n \"ng\": {\r\n \"keywords\": [\"blue-square\", \"words\", \"shape\", \"icon\"],\r\n \"char\": \"🆖\",\r\n \"category\": \"symbols\"\r\n },\r\n \"ok\": {\r\n \"keywords\": [\"good\", \"agree\", \"yes\", \"blue-square\"],\r\n \"char\": \"🆗\",\r\n \"category\": \"symbols\"\r\n },\r\n \"up\": {\r\n \"keywords\": [\"blue-square\", \"above\", \"high\"],\r\n \"char\": \"🆙\",\r\n \"category\": \"symbols\"\r\n },\r\n \"cool\": {\r\n \"keywords\": [\"words\", \"blue-square\"],\r\n \"char\": \"🆒\",\r\n \"category\": \"symbols\"\r\n },\r\n \"new\": {\r\n \"keywords\": [\"blue-square\", \"words\", \"start\"],\r\n \"char\": \"🆕\",\r\n \"category\": \"symbols\"\r\n },\r\n \"free\": {\r\n \"keywords\": [\"blue-square\", \"words\"],\r\n \"char\": \"🆓\",\r\n \"category\": \"symbols\"\r\n },\r\n \"zero\": {\r\n \"keywords\": [\"0\", \"numbers\", \"blue-square\", \"null\"],\r\n \"char\": \"0️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"one\": {\r\n \"keywords\": [\"blue-square\", \"numbers\", \"1\"],\r\n \"char\": \"1️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"two\": {\r\n \"keywords\": [\"numbers\", \"2\", \"prime\", \"blue-square\"],\r\n \"char\": \"2️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"three\": {\r\n \"keywords\": [\"3\", \"numbers\", \"prime\", \"blue-square\"],\r\n \"char\": \"3️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"four\": {\r\n \"keywords\": [\"4\", \"numbers\", \"blue-square\"],\r\n \"char\": \"4️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"five\": {\r\n \"keywords\": [\"5\", \"numbers\", \"blue-square\", \"prime\"],\r\n \"char\": \"5️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"six\": {\r\n \"keywords\": [\"6\", \"numbers\", \"blue-square\"],\r\n \"char\": \"6️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"seven\": {\r\n \"keywords\": [\"7\", \"numbers\", \"blue-square\", \"prime\"],\r\n \"char\": \"7️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"eight\": {\r\n \"keywords\": [\"8\", \"blue-square\", \"numbers\"],\r\n \"char\": \"8️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"nine\": {\r\n \"keywords\": [\"blue-square\", \"numbers\", \"9\"],\r\n \"char\": \"9️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"keycap_ten\": {\r\n \"keywords\": [\"numbers\", \"10\", \"blue-square\"],\r\n \"char\": \"🔟\",\r\n \"category\": \"symbols\"\r\n },\r\n \"keycap_star\": {\r\n \"keywords\": [\"asterisk\"],\r\n \"char\": \"*⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"1234\": {\r\n \"keywords\": [\"numbers\", \"blue-square\"],\r\n \"char\": \"🔢\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_forward\": {\r\n \"keywords\": [\"blue-square\", \"right\", \"direction\", \"play\"],\r\n \"char\": \"▶️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"double_vertical_bar\": {\r\n \"keywords\": [\"pause\", \"blue-square\"],\r\n \"char\": \"⏸\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_right_pointing_triangle_with_double_vertical_bar\": {\r\n \"keywords\": [\"forward\", \"next\", \"blue-square\"],\r\n \"char\": \"⏭\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_square_for_stop\": {\r\n \"keywords\": [\"blue-square\"],\r\n \"char\": \"⏹\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_circle_for_record\": {\r\n \"keywords\": [\"blue-square\"],\r\n \"char\": \"⏺\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_right_pointing_double_triangle_with_vertical_bar\": {\r\n \"keywords\": [\"blue-square\", \"play\", \"pause\"],\r\n \"char\": \"⏯\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_left_pointing_double_triangle_with_vertical_bar\": {\r\n \"keywords\": [\"backward\"],\r\n \"char\": \"⏮\",\r\n \"category\": \"symbols\"\r\n },\r\n \"fast_forward\": {\r\n \"keywords\": [\"blue-square\", \"play\", \"speed\", \"continue\"],\r\n \"char\": \"⏩\",\r\n \"category\": \"symbols\"\r\n },\r\n \"rewind\": {\r\n \"keywords\": [\"play\", \"blue-square\"],\r\n \"char\": \"⏪\",\r\n \"category\": \"symbols\"\r\n },\r\n \"twisted_rightwards_arrows\": {\r\n \"keywords\": [\"blue-square\", \"shuffle\", \"music\", \"random\"],\r\n \"char\": \"🔀\",\r\n \"category\": \"symbols\"\r\n },\r\n \"repeat\": {\r\n \"keywords\": [\"loop\", \"record\"],\r\n \"char\": \"🔁\",\r\n \"category\": \"symbols\"\r\n },\r\n \"repeat_one\": {\r\n \"keywords\": [\"blue-square\", \"loop\"],\r\n \"char\": \"🔂\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_backward\": {\r\n \"keywords\": [\"blue-square\", \"left\", \"direction\"],\r\n \"char\": \"◀️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_up_small\": {\r\n \"keywords\": [\"blue-square\", \"triangle\", \"direction\", \"point\", \"forward\", \"top\"],\r\n \"char\": \"🔼\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_down_small\": {\r\n \"keywords\": [\"blue-square\", \"direction\", \"bottom\"],\r\n \"char\": \"🔽\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_double_up\": {\r\n \"keywords\": [\"blue-square\", \"direction\", \"top\"],\r\n \"char\": \"⏫\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_double_down\": {\r\n \"keywords\": [\"blue-square\", \"direction\", \"bottom\"],\r\n \"char\": \"⏬\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_right\": {\r\n \"keywords\": [\"blue-square\", \"next\"],\r\n \"char\": \"➡️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_left\": {\r\n \"keywords\": [\"blue-square\", \"previous\", \"back\"],\r\n \"char\": \"⬅️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_up\": {\r\n \"keywords\": [\"blue-square\", \"continue\", \"top\", \"direction\"],\r\n \"char\": \"⬆️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_down\": {\r\n \"keywords\": [\"blue-square\", \"direction\", \"bottom\"],\r\n \"char\": \"⬇️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_upper_right\": {\r\n \"keywords\": [\"blue-square\", \"point\", \"direction\", \"diagonal\", \"northeast\"],\r\n \"char\": \"↗️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_lower_right\": {\r\n \"keywords\": [\"blue-square\", \"direction\", \"diagonal\", \"southeast\"],\r\n \"char\": \"↘️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_lower_left\": {\r\n \"keywords\": [\"blue-square\", \"direction\", \"diagonal\", \"southwest\"],\r\n \"char\": \"↙️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_upper_left\": {\r\n \"keywords\": [\"blue-square\", \"point\", \"direction\", \"diagonal\", \"northwest\"],\r\n \"char\": \"↖️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_up_down\": {\r\n \"keywords\": [\"blue-square\", \"direction\", \"way\", \"vertical\"],\r\n \"char\": \"↕️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"left_right_arrow\": {\r\n \"keywords\": [\"shape\", \"direction\", \"horizontal\", \"sideways\"],\r\n \"char\": \"↔️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrows_counterclockwise\": {\r\n \"keywords\": [\"blue-square\", \"sync\", \"cycle\"],\r\n \"char\": \"🔄\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_right_hook\": {\r\n \"keywords\": [\"blue-square\", \"return\", \"rotate\", \"direction\"],\r\n \"char\": \"↪️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"leftwards_arrow_with_hook\": {\r\n \"keywords\": [\"back\", \"return\", \"blue-square\", \"undo\", \"enter\"],\r\n \"char\": \"↩️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_heading_up\": {\r\n \"keywords\": [\"blue-square\", \"direction\", \"top\"],\r\n \"char\": \"⤴️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_heading_down\": {\r\n \"keywords\": [\"blue-square\", \"direction\", \"bottom\"],\r\n \"char\": \"⤵️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"hash\": {\r\n \"keywords\": [\"symbol\", \"blue-square\", \"twitter\"],\r\n \"char\": \"#️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"information_source\": {\r\n \"keywords\": [\"blue-square\", \"alphabet\", \"letter\"],\r\n \"char\": \"ℹ️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"abc\": {\r\n \"keywords\": [\"blue-square\", \"alphabet\"],\r\n \"char\": \"🔤\",\r\n \"category\": \"symbols\"\r\n },\r\n \"abcd\": {\r\n \"keywords\": [\"blue-square\", \"alphabet\"],\r\n \"char\": \"🔡\",\r\n \"category\": \"symbols\"\r\n },\r\n \"capital_abcd\": {\r\n \"keywords\": [\"alphabet\", \"words\", \"blue-square\"],\r\n \"char\": \"🔠\",\r\n \"category\": \"symbols\"\r\n },\r\n \"symbols\": {\r\n \"keywords\": [\"blue-square\", \"music\", \"note\", \"ampersand\", \"percent\", \"glyphs\", \"characters\"],\r\n \"char\": \"🔣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"musical_note\": {\r\n \"keywords\": [\"score\", \"tone\", \"sound\"],\r\n \"char\": \"🎵\",\r\n \"category\": \"symbols\"\r\n },\r\n \"notes\": {\r\n \"keywords\": [\"music\", \"score\"],\r\n \"char\": \"🎶\",\r\n \"category\": \"symbols\"\r\n },\r\n \"wavy_dash\": {\r\n \"keywords\": [\"draw\", \"line\", \"moustache\", \"mustache\", \"squiggle\", \"scribble\"],\r\n \"char\": \"〰️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"curly_loop\": {\r\n \"keywords\": [\"scribble\", \"draw\", \"shape\", \"squiggle\"],\r\n \"char\": \"➰\",\r\n \"category\": \"symbols\"\r\n },\r\n \"heavy_check_mark\": {\r\n \"keywords\": [\"ok\", \"nike\", \"answer\", \"yes\", \"tick\"],\r\n \"char\": \"✔️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrows_clockwise\": {\r\n \"keywords\": [\"sync\", \"cycle\", \"round\", \"repeat\"],\r\n \"char\": \"🔃\",\r\n \"category\": \"symbols\"\r\n },\r\n \"heavy_plus_sign\": {\r\n \"keywords\": [\"math\", \"calculation\", \"addition\", \"more\", \"increase\"],\r\n \"char\": \"➕\",\r\n \"category\": \"symbols\"\r\n },\r\n \"heavy_minus_sign\": {\r\n \"keywords\": [\"math\", \"calculation\", \"subtract\", \"less\"],\r\n \"char\": \"➖\",\r\n \"category\": \"symbols\"\r\n },\r\n \"heavy_division_sign\": {\r\n \"keywords\": [\"divide\", \"math\", \"calculation\"],\r\n \"char\": \"➗\",\r\n \"category\": \"symbols\"\r\n },\r\n \"heavy_multiplication_x\": {\r\n \"keywords\": [\"math\", \"calculation\"],\r\n \"char\": \"✖️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"heavy_dollar_sign\": {\r\n \"keywords\": [\"money\", \"sales\", \"payment\", \"currency\", \"buck\"],\r\n \"char\": \"💲\",\r\n \"category\": \"symbols\"\r\n },\r\n \"currency_exchange\": {\r\n \"keywords\": [\"money\", \"sales\", \"dollar\", \"travel\"],\r\n \"char\": \"💱\",\r\n \"category\": \"symbols\"\r\n },\r\n \"copyright\": {\r\n \"keywords\": [\"ip\", \"license\", \"circle\", \"law\", \"legal\"],\r\n \"char\": \"©️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"registered\": {\r\n \"keywords\": [\"alphabet\", \"circle\"],\r\n \"char\": \"®️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"tm\": {\r\n \"keywords\": [\"trademark\", \"brand\", \"law\", \"legal\"],\r\n \"char\": \"™️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"end\": {\r\n \"keywords\": [\"words\", \"arrow\"],\r\n \"char\": \"🔚\",\r\n \"category\": \"symbols\"\r\n },\r\n \"back\": {\r\n \"keywords\": [\"arrow\", \"words\", \"return\"],\r\n \"char\": \"🔙\",\r\n \"category\": \"symbols\"\r\n },\r\n \"on\": {\r\n \"keywords\": [\"arrow\", \"words\"],\r\n \"char\": \"🔛\",\r\n \"category\": \"symbols\"\r\n },\r\n \"top\": {\r\n \"keywords\": [\"words\", \"blue-square\"],\r\n \"char\": \"🔝\",\r\n \"category\": \"symbols\"\r\n },\r\n \"soon\": {\r\n \"keywords\": [\"arrow\", \"words\"],\r\n \"char\": \"🔜\",\r\n \"category\": \"symbols\"\r\n },\r\n \"ballot_box_with_check\": {\r\n \"keywords\": [\"ok\", \"agree\", \"confirm\", \"black-square\", \"vote\", \"election\", \"yes\"],\r\n \"char\": \"☑️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"radio_button\": {\r\n \"keywords\": [\"input\", \"old\", \"music\", \"circle\"],\r\n \"char\": \"🔘\",\r\n \"category\": \"symbols\"\r\n },\r\n \"white_circle\": {\r\n \"keywords\": [\"shape\", \"round\"],\r\n \"char\": \"⚪\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_circle\": {\r\n \"keywords\": [\"shape\", \"button\", \"round\"],\r\n \"char\": \"⚫\",\r\n \"category\": \"symbols\"\r\n },\r\n \"red_circle\": {\r\n \"keywords\": [\"shape\", \"error\", \"danger\"],\r\n \"char\": \"🔴\",\r\n \"category\": \"symbols\"\r\n },\r\n \"large_blue_circle\": {\r\n \"keywords\": [\"shape\", \"icon\", \"button\"],\r\n \"char\": \"🔵\",\r\n \"category\": \"symbols\"\r\n },\r\n \"small_orange_diamond\": {\r\n \"keywords\": [\"shape\", \"jewel\", \"gem\"],\r\n \"char\": \"🔸\",\r\n \"category\": \"symbols\"\r\n },\r\n \"small_blue_diamond\": {\r\n \"keywords\": [\"shape\", \"jewel\", \"gem\"],\r\n \"char\": \"🔹\",\r\n \"category\": \"symbols\"\r\n },\r\n \"large_orange_diamond\": {\r\n \"keywords\": [\"shape\", \"jewel\", \"gem\"],\r\n \"char\": \"🔶\",\r\n \"category\": \"symbols\"\r\n },\r\n \"large_blue_diamond\": {\r\n \"keywords\": [\"shape\", \"jewel\", \"gem\"],\r\n \"char\": \"🔷\",\r\n \"category\": \"symbols\"\r\n },\r\n \"small_red_triangle\": {\r\n \"keywords\": [\"shape\", \"direction\", \"up\", \"top\"],\r\n \"char\": \"🔺\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_small_square\": {\r\n \"keywords\": [\"shape\", \"icon\"],\r\n \"char\": \"▪️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"white_small_square\": {\r\n \"keywords\": [\"shape\", \"icon\"],\r\n \"char\": \"▫️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_large_square\": {\r\n \"keywords\": [\"shape\", \"icon\", \"button\"],\r\n \"char\": \"⬛\",\r\n \"category\": \"symbols\"\r\n },\r\n \"white_large_square\": {\r\n \"keywords\": [\"shape\", \"icon\", \"stone\", \"button\"],\r\n \"char\": \"⬜\",\r\n \"category\": \"symbols\"\r\n },\r\n \"small_red_triangle_down\": {\r\n \"keywords\": [\"shape\", \"direction\", \"bottom\"],\r\n \"char\": \"🔻\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_medium_square\": {\r\n \"keywords\": [\"shape\", \"button\", \"icon\"],\r\n \"char\": \"◼️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"white_medium_square\": {\r\n \"keywords\": [\"shape\", \"stone\", \"icon\"],\r\n \"char\": \"◻️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_medium_small_square\": {\r\n \"keywords\": [\"icon\", \"shape\", \"button\"],\r\n \"char\": \"◾\",\r\n \"category\": \"symbols\"\r\n },\r\n \"white_medium_small_square\": {\r\n \"keywords\": [\"shape\", \"stone\", \"icon\", \"button\"],\r\n \"char\": \"◽\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_square_button\": {\r\n \"keywords\": [\"shape\", \"input\", \"frame\"],\r\n \"char\": \"🔲\",\r\n \"category\": \"symbols\"\r\n },\r\n \"white_square_button\": {\r\n \"keywords\": [\"shape\", \"input\"],\r\n \"char\": \"🔳\",\r\n \"category\": \"symbols\"\r\n },\r\n \"speaker\": {\r\n \"keywords\": [\"sound\", \"volume\", \"silence\", \"broadcast\"],\r\n \"char\": \"🔈\",\r\n \"category\": \"symbols\"\r\n },\r\n \"sound\": {\r\n \"keywords\": [\"volume\", \"speaker\", \"broadcast\"],\r\n \"char\": \"🔉\",\r\n \"category\": \"symbols\"\r\n },\r\n \"loud_sound\": {\r\n \"keywords\": [\"volume\", \"noise\", \"noisy\", \"speaker\", \"broadcast\"],\r\n \"char\": \"🔊\",\r\n \"category\": \"symbols\"\r\n },\r\n \"mute\": {\r\n \"keywords\": [\"sound\", \"volume\", \"silence\", \"quiet\"],\r\n \"char\": \"🔇\",\r\n \"category\": \"symbols\"\r\n },\r\n \"mega\": {\r\n \"keywords\": [\"sound\", \"speaker\", \"volume\"],\r\n \"char\": \"📣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"loudspeaker\": {\r\n \"keywords\": [\"volume\", \"sound\"],\r\n \"char\": \"📢\",\r\n \"category\": \"symbols\"\r\n },\r\n \"bell\": {\r\n \"keywords\": [\"sound\", \"notification\", \"christmas\", \"xmas\", \"chime\"],\r\n \"char\": \"🔔\",\r\n \"category\": \"symbols\"\r\n },\r\n \"no_bell\": {\r\n \"keywords\": [\"sound\", \"volume\", \"mute\", \"quiet\", \"silent\"],\r\n \"char\": \"🔕\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_joker\": {\r\n \"keywords\": [\"poker\", \"cards\", \"game\", \"play\", \"magic\"],\r\n \"char\": \"🃏\",\r\n \"category\": \"symbols\"\r\n },\r\n \"mahjong\": {\r\n \"keywords\": [\"game\", \"play\", \"chinese\", \"kanji\"],\r\n \"char\": \"🀄\",\r\n \"category\": \"symbols\"\r\n },\r\n \"spades\": {\r\n \"keywords\": [\"poker\", \"cards\", \"suits\", \"magic\"],\r\n \"char\": \"♠️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clubs\": {\r\n \"keywords\": [\"poker\", \"cards\", \"magic\", \"suits\"],\r\n \"char\": \"♣️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"hearts\": {\r\n \"keywords\": [\"poker\", \"cards\", \"magic\", \"suits\"],\r\n \"char\": \"♥️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"diamonds\": {\r\n \"keywords\": [\"poker\", \"cards\", \"magic\", \"suits\"],\r\n \"char\": \"♦️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"flower_playing_cards\": {\r\n \"keywords\": [\"game\", \"sunset\", \"red\"],\r\n \"char\": \"🎴\",\r\n \"category\": \"symbols\"\r\n },\r\n \"thought_balloon\": {\r\n \"keywords\": [\"bubble\", \"cloud\", \"speech\", \"thinking\"],\r\n \"char\": \"💭\",\r\n \"category\": \"symbols\"\r\n },\r\n \"right_anger_bubble\": {\r\n \"keywords\": [\"caption\", \"speech\", \"thinking\", \"mad\"],\r\n \"char\": \"🗯\",\r\n \"category\": \"symbols\"\r\n },\r\n \"speech_balloon\": {\r\n \"keywords\": [\"bubble\", \"words\", \"message\", \"talk\", \"chatting\"],\r\n \"char\": \"💬\",\r\n \"category\": \"symbols\"\r\n },\r\n \"left_speech_bubble\": {\r\n \"keywords\": [\"words\", \"message\", \"talk\", \"chatting\"],\r\n \"char\": \"🗨\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock1\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕐\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock2\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕑\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock3\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕒\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock4\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕓\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock5\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕔\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock6\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\", \"dawn\", \"dusk\"],\r\n \"char\": \"🕕\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock7\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕖\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock8\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕗\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock9\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕘\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock10\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕙\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock11\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕚\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock12\": {\r\n \"keywords\": [\"time\", \"noon\", \"midnight\", \"midday\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕛\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock130\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕜\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock230\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕝\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock330\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕞\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock430\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕟\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock530\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕠\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock630\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕡\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock730\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕢\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock830\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock930\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕤\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock1030\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕥\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock1130\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕦\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock1230\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕧\",\r\n \"category\": \"symbols\"\r\n },\r\n \"af\": {\r\n \"keywords\": [\"afghanistan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇫\",\r\n \"category\": \"flags\"\r\n },\r\n \"ax\": {\r\n \"keywords\": [\"Åland\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇽\",\r\n \"category\": \"flags\"\r\n },\r\n \"al\": {\r\n \"keywords\": [\"albania\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇱\",\r\n \"category\": \"flags\"\r\n },\r\n \"dz\": {\r\n \"keywords\": [\"algeria\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇩🇿\",\r\n \"category\": \"flags\"\r\n },\r\n \"as\": {\r\n \"keywords\": [\"american\", \"samoa\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"ad\": {\r\n \"keywords\": [\"andorra\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇩\",\r\n \"category\": \"flags\"\r\n },\r\n \"ao\": {\r\n \"keywords\": [\"angola\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"ai\": {\r\n \"keywords\": [\"anguilla\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇮\",\r\n \"category\": \"flags\"\r\n },\r\n \"aq\": {\r\n \"keywords\": [\"antarctica\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇶\",\r\n \"category\": \"flags\"\r\n },\r\n \"ag\": {\r\n \"keywords\": [\"antigua\", \"barbuda\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"ar\": {\r\n \"keywords\": [\"argentina\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"am\": {\r\n \"keywords\": [\"armenia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"aw\": {\r\n \"keywords\": [\"aruba\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇼\",\r\n \"category\": \"flags\"\r\n },\r\n \"au\": {\r\n \"keywords\": [\"australia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇺\",\r\n \"category\": \"flags\"\r\n },\r\n \"at\": {\r\n \"keywords\": [\"austria\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"az\": {\r\n \"keywords\": [\"azerbaijan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇿\",\r\n \"category\": \"flags\"\r\n },\r\n \"bs\": {\r\n \"keywords\": [\"bahamas\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"bh\": {\r\n \"keywords\": [\"bahrain\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇭\",\r\n \"category\": \"flags\"\r\n },\r\n \"bd\": {\r\n \"keywords\": [\"bangladesh\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇩\",\r\n \"category\": \"flags\"\r\n },\r\n \"bb\": {\r\n \"keywords\": [\"barbados\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇧\",\r\n \"category\": \"flags\"\r\n },\r\n \"by\": {\r\n \"keywords\": [\"belarus\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇾\",\r\n \"category\": \"flags\"\r\n },\r\n \"be\": {\r\n \"keywords\": [\"belgium\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"bz\": {\r\n \"keywords\": [\"belize\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇿\",\r\n \"category\": \"flags\"\r\n },\r\n \"bj\": {\r\n \"keywords\": [\"benin\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇯\",\r\n \"category\": \"flags\"\r\n },\r\n \"bm\": {\r\n \"keywords\": [\"bermuda\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"bt\": {\r\n \"keywords\": [\"bhutan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"bo\": {\r\n \"keywords\": [\"bolivia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"bq\": {\r\n \"keywords\": [\"bonaire\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇶\",\r\n \"category\": \"flags\"\r\n },\r\n \"ba\": {\r\n \"keywords\": [\"bosnia\", \"herzegovina\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"bw\": {\r\n \"keywords\": [\"botswana\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇼\",\r\n \"category\": \"flags\"\r\n },\r\n \"br\": {\r\n \"keywords\": [\"brazil\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"io\": {\r\n \"keywords\": [\"british\", \"indian\", \"ocean\", \"territory\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"vg\": {\r\n \"keywords\": [\"british\", \"virgin\", \"islands\", \"bvi\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇻🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"bn\": {\r\n \"keywords\": [\"brunei\", \"darussalam\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"bg\": {\r\n \"keywords\": [\"bulgaria\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"bf\": {\r\n \"keywords\": [\"burkina\", \"faso\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇫\",\r\n \"category\": \"flags\"\r\n },\r\n \"bi\": {\r\n \"keywords\": [\"burundi\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇮\",\r\n \"category\": \"flags\"\r\n },\r\n \"cv\": {\r\n \"keywords\": [\"cabo\", \"verde\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇻\",\r\n \"category\": \"flags\"\r\n },\r\n \"kh\": {\r\n \"keywords\": [\"cambodia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇭\",\r\n \"category\": \"flags\"\r\n },\r\n \"cm\": {\r\n \"keywords\": [\"cameroon\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"ca\": {\r\n \"keywords\": [\"canada\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"ic\": {\r\n \"keywords\": [\"canary\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇨\",\r\n \"category\": \"flags\"\r\n },\r\n \"ky\": {\r\n \"keywords\": [\"cayman\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇾\",\r\n \"category\": \"flags\"\r\n },\r\n \"cf\": {\r\n \"keywords\": [\"central\", \"african\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇫\",\r\n \"category\": \"flags\"\r\n },\r\n \"td\": {\r\n \"keywords\": [\"chad\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇩\",\r\n \"category\": \"flags\"\r\n },\r\n \"chile\": {\r\n \"keywords\": [\"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇱\",\r\n \"category\": \"flags\"\r\n },\r\n \"cn\": {\r\n \"keywords\": [\"china\", \"chinese\", \"prc\", \"flag\", \"country\", \"nation\", \"banner\"],\r\n \"char\": \"🇨🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"cx\": {\r\n \"keywords\": [\"christmas\", \"island\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇽\",\r\n \"category\": \"flags\"\r\n },\r\n \"cc\": {\r\n \"keywords\": [\"cocos\", \"keeling\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇨\",\r\n \"category\": \"flags\"\r\n },\r\n \"co\": {\r\n \"keywords\": [\"colombia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"km\": {\r\n \"keywords\": [\"comoros\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"cg\": {\r\n \"keywords\": [\"congo\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"drc\": {\r\n \"keywords\": [\"congo\", \"democratic\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇩\",\r\n \"category\": \"flags\"\r\n },\r\n \"ck\": {\r\n \"keywords\": [\"cook\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇰\",\r\n \"category\": \"flags\"\r\n },\r\n \"cr\": {\r\n \"keywords\": [\"costa\", \"rica\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"hr\": {\r\n \"keywords\": [\"croatia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇭🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"cu\": {\r\n \"keywords\": [\"cuba\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇺\",\r\n \"category\": \"flags\"\r\n },\r\n \"cw\": {\r\n \"keywords\": [\"curaçao\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇼\",\r\n \"category\": \"flags\"\r\n },\r\n \"cy\": {\r\n \"keywords\": [\"cyprus\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇾\",\r\n \"category\": \"flags\"\r\n },\r\n \"cz\": {\r\n \"keywords\": [\"czech_republic\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇿\",\r\n \"category\": \"flags\"\r\n },\r\n \"dk\": {\r\n \"keywords\": [\"denmark\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇩🇰\",\r\n \"category\": \"flags\"\r\n },\r\n \"dj\": {\r\n \"keywords\": [\"djibouti\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇩🇯\",\r\n \"category\": \"flags\"\r\n },\r\n \"dm\": {\r\n \"keywords\": [\"dominica\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇩🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"do\": {\r\n \"keywords\": [\"dominican\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇩🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"ec\": {\r\n \"keywords\": [\"ecuador\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇪🇨\",\r\n \"category\": \"flags\"\r\n },\r\n \"eg\": {\r\n \"keywords\": [\"egypt\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇪🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"sv\": {\r\n \"keywords\": [\"el\", \"salvador\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇻\",\r\n \"category\": \"flags\"\r\n },\r\n \"gq\": {\r\n \"keywords\": [\"equatorial\", \"guinea\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇶\",\r\n \"category\": \"flags\"\r\n },\r\n \"er\": {\r\n \"keywords\": [\"eritrea\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇪🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"ee\": {\r\n \"keywords\": [\"estonia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇪🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"et\": {\r\n \"keywords\": [\"ethiopia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇪🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"eu\": {\r\n \"keywords\": [\"european\", \"union\", \"flag\", \"banner\"],\r\n \"char\": \"🇪🇺\",\r\n \"category\": \"flags\"\r\n },\r\n \"fk\": {\r\n \"keywords\": [\"falkland\", \"islands\", \"malvinas\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇫🇰\",\r\n \"category\": \"flags\"\r\n },\r\n \"fo\": {\r\n \"keywords\": [\"faroe\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇫🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"fj\": {\r\n \"keywords\": [\"fiji\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇫🇯\",\r\n \"category\": \"flags\"\r\n },\r\n \"fi\": {\r\n \"keywords\": [\"finland\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇫🇮\",\r\n \"category\": \"flags\"\r\n },\r\n \"fr\": {\r\n \"keywords\": [\"banner\", \"flag\", \"nation\", \"france\", \"french\", \"country\"],\r\n \"char\": \"🇫🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"gf\": {\r\n \"keywords\": [\"french\", \"guiana\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇫\",\r\n \"category\": \"flags\"\r\n },\r\n \"pf\": {\r\n \"keywords\": [\"french\", \"polynesia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇫\",\r\n \"category\": \"flags\"\r\n },\r\n \"tf\": {\r\n \"keywords\": [\"french\", \"southern\", \"territories\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇫\",\r\n \"category\": \"flags\"\r\n },\r\n \"ga\": {\r\n \"keywords\": [\"gabon\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"gm\": {\r\n \"keywords\": [\"gambia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"ge\": {\r\n \"keywords\": [\"georgia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"de\": {\r\n \"keywords\": [\"german\", \"nation\", \"flag\", \"country\", \"banner\"],\r\n \"char\": \"🇩🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"gh\": {\r\n \"keywords\": [\"ghana\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇭\",\r\n \"category\": \"flags\"\r\n },\r\n \"gi\": {\r\n \"keywords\": [\"gibraltar\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇮\",\r\n \"category\": \"flags\"\r\n },\r\n \"gr\": {\r\n \"keywords\": [\"greece\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"gl\": {\r\n \"keywords\": [\"greenland\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇱\",\r\n \"category\": \"flags\"\r\n },\r\n \"gd\": {\r\n \"keywords\": [\"grenada\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇩\",\r\n \"category\": \"flags\"\r\n },\r\n \"gp\": {\r\n \"keywords\": [\"guadeloupe\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇵\",\r\n \"category\": \"flags\"\r\n },\r\n \"gu\": {\r\n \"keywords\": [\"guam\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇺\",\r\n \"category\": \"flags\"\r\n },\r\n \"gt\": {\r\n \"keywords\": [\"guatemala\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"gg\": {\r\n \"keywords\": [\"guernsey\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"gn\": {\r\n \"keywords\": [\"guinea\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"gw\": {\r\n \"keywords\": [\"guinea\", \"bissau\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇼\",\r\n \"category\": \"flags\"\r\n },\r\n \"gy\": {\r\n \"keywords\": [\"guyana\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇾\",\r\n \"category\": \"flags\"\r\n },\r\n \"ht\": {\r\n \"keywords\": [\"haiti\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇭🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"hn\": {\r\n \"keywords\": [\"honduras\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇭🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"hk\": {\r\n \"keywords\": [\"hong\", \"kong\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇭🇰\",\r\n \"category\": \"flags\"\r\n },\r\n \"hu\": {\r\n \"keywords\": [\"hungary\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇭🇺\",\r\n \"category\": \"flags\"\r\n },\r\n \"is\": {\r\n \"keywords\": [\"iceland\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"in\": {\r\n \"keywords\": [\"india\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"indonesia\": {\r\n \"keywords\": [\"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇩\",\r\n \"category\": \"flags\"\r\n },\r\n \"ir\": {\r\n \"keywords\": [\"iran,\", \"islamic\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"iq\": {\r\n \"keywords\": [\"iraq\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇶\",\r\n \"category\": \"flags\"\r\n },\r\n \"ie\": {\r\n \"keywords\": [\"ireland\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"im\": {\r\n \"keywords\": [\"isle\", \"man\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"il\": {\r\n \"keywords\": [\"israel\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇱\",\r\n \"category\": \"flags\"\r\n },\r\n \"it\": {\r\n \"keywords\": [\"italy\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"ci\": {\r\n \"keywords\": [\"ivory\", \"coast\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇮\",\r\n \"category\": \"flags\"\r\n },\r\n \"jm\": {\r\n \"keywords\": [\"jamaica\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇯🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"jp\": {\r\n \"keywords\": [\"japanese\", \"nation\", \"flag\", \"country\", \"banner\"],\r\n \"char\": \"🇯🇵\",\r\n \"category\": \"flags\"\r\n },\r\n \"je\": {\r\n \"keywords\": [\"jersey\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇯🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"jo\": {\r\n \"keywords\": [\"jordan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇯🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"kz\": {\r\n \"keywords\": [\"kazakhstan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇿\",\r\n \"category\": \"flags\"\r\n },\r\n \"ke\": {\r\n \"keywords\": [\"kenya\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"ki\": {\r\n \"keywords\": [\"kiribati\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇮\",\r\n \"category\": \"flags\"\r\n },\r\n \"xk\": {\r\n \"keywords\": [\"kosovo\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇽🇰\",\r\n \"category\": \"flags\"\r\n },\r\n \"kw\": {\r\n \"keywords\": [\"kuwait\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇼\",\r\n \"category\": \"flags\"\r\n },\r\n \"kg\": {\r\n \"keywords\": [\"kyrgyzstan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"la\": {\r\n \"keywords\": [\"lao\", \"democratic\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"lv\": {\r\n \"keywords\": [\"latvia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇻\",\r\n \"category\": \"flags\"\r\n },\r\n \"lb\": {\r\n \"keywords\": [\"lebanon\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇧\",\r\n \"category\": \"flags\"\r\n },\r\n \"ls\": {\r\n \"keywords\": [\"lesotho\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"lr\": {\r\n \"keywords\": [\"liberia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"ly\": {\r\n \"keywords\": [\"libya\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇾\",\r\n \"category\": \"flags\"\r\n },\r\n \"li\": {\r\n \"keywords\": [\"liechtenstein\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇮\",\r\n \"category\": \"flags\"\r\n },\r\n \"lt\": {\r\n \"keywords\": [\"lithuania\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"lu\": {\r\n \"keywords\": [\"luxembourg\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇺\",\r\n \"category\": \"flags\"\r\n },\r\n \"mo\": {\r\n \"keywords\": [\"macao\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"mk\": {\r\n \"keywords\": [\"macedonia,\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇰\",\r\n \"category\": \"flags\"\r\n },\r\n \"mg\": {\r\n \"keywords\": [\"madagascar\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"mw\": {\r\n \"keywords\": [\"malawi\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇼\",\r\n \"category\": \"flags\"\r\n },\r\n \"my\": {\r\n \"keywords\": [\"malaysia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇾\",\r\n \"category\": \"flags\"\r\n },\r\n \"mv\": {\r\n \"keywords\": [\"maldives\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇻\",\r\n \"category\": \"flags\"\r\n },\r\n \"ml\": {\r\n \"keywords\": [\"mali\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇱\",\r\n \"category\": \"flags\"\r\n },\r\n \"mt\": {\r\n \"keywords\": [\"malta\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"mh\": {\r\n \"keywords\": [\"marshall\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇭\",\r\n \"category\": \"flags\"\r\n },\r\n \"mq\": {\r\n \"keywords\": [\"martinique\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇶\",\r\n \"category\": \"flags\"\r\n },\r\n \"mr\": {\r\n \"keywords\": [\"mauritania\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"mu\": {\r\n \"keywords\": [\"mauritius\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇺\",\r\n \"category\": \"flags\"\r\n },\r\n \"yt\": {\r\n \"keywords\": [\"mayotte\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇾🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"mx\": {\r\n \"keywords\": [\"mexico\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇽\",\r\n \"category\": \"flags\"\r\n },\r\n \"fm\": {\r\n \"keywords\": [\"micronesia,\", \"federated\", \"states\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇫🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"md\": {\r\n \"keywords\": [\"moldova,\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇩\",\r\n \"category\": \"flags\"\r\n },\r\n \"mc\": {\r\n \"keywords\": [\"monaco\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇨\",\r\n \"category\": \"flags\"\r\n },\r\n \"mn\": {\r\n \"keywords\": [\"mongolia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"me\": {\r\n \"keywords\": [\"montenegro\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"ms\": {\r\n \"keywords\": [\"montserrat\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"ma\": {\r\n \"keywords\": [\"morocco\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"mz\": {\r\n \"keywords\": [\"mozambique\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇿\",\r\n \"category\": \"flags\"\r\n },\r\n \"mm\": {\r\n \"keywords\": [\"myanmar\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"na\": {\r\n \"keywords\": [\"namibia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"nr\": {\r\n \"keywords\": [\"nauru\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"np\": {\r\n \"keywords\": [\"nepal\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇵\",\r\n \"category\": \"flags\"\r\n },\r\n \"nl\": {\r\n \"keywords\": [\"netherlands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇱\",\r\n \"category\": \"flags\"\r\n },\r\n \"nc\": {\r\n \"keywords\": [\"new\", \"caledonia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇨\",\r\n \"category\": \"flags\"\r\n },\r\n \"nz\": {\r\n \"keywords\": [\"new\", \"zealand\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇿\",\r\n \"category\": \"flags\"\r\n },\r\n \"ni\": {\r\n \"keywords\": [\"nicaragua\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇮\",\r\n \"category\": \"flags\"\r\n },\r\n \"ne\": {\r\n \"keywords\": [\"niger\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"nigeria\": {\r\n \"keywords\": [\"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"nu\": {\r\n \"keywords\": [\"niue\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇺\",\r\n \"category\": \"flags\"\r\n },\r\n \"nf\": {\r\n \"keywords\": [\"norfolk\", \"island\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇫\",\r\n \"category\": \"flags\"\r\n },\r\n \"mp\": {\r\n \"keywords\": [\"northern\", \"mariana\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇵\",\r\n \"category\": \"flags\"\r\n },\r\n \"kp\": {\r\n \"keywords\": [\"north\", \"korea\", \"nation\", \"flag\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇵\",\r\n \"category\": \"flags\"\r\n },\r\n \"no\": {\r\n \"keywords\": [\"norway\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"om\": {\r\n \"keywords\": [\"oman\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇴🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"pk\": {\r\n \"keywords\": [\"pakistan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇰\",\r\n \"category\": \"flags\"\r\n },\r\n \"pw\": {\r\n \"keywords\": [\"palau\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇼\",\r\n \"category\": \"flags\"\r\n },\r\n \"ps\": {\r\n \"keywords\": [\"palestine\", \"palestinian\", \"territories\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"pa\": {\r\n \"keywords\": [\"panama\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"pg\": {\r\n \"keywords\": [\"papua\", \"new\", \"guinea\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"py\": {\r\n \"keywords\": [\"paraguay\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇾\",\r\n \"category\": \"flags\"\r\n },\r\n \"pe\": {\r\n \"keywords\": [\"peru\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"ph\": {\r\n \"keywords\": [\"philippines\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇭\",\r\n \"category\": \"flags\"\r\n },\r\n \"pn\": {\r\n \"keywords\": [\"pitcairn\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"pl\": {\r\n \"keywords\": [\"poland\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇱\",\r\n \"category\": \"flags\"\r\n },\r\n \"pt\": {\r\n \"keywords\": [\"portugal\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"pr\": {\r\n \"keywords\": [\"puerto\", \"rico\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"qa\": {\r\n \"keywords\": [\"qatar\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇶🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"re\": {\r\n \"keywords\": [\"réunion\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇷🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"ro\": {\r\n \"keywords\": [\"romania\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇷🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"ru\": {\r\n \"keywords\": [\"russian\", \"federation\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇷🇺\",\r\n \"category\": \"flags\"\r\n },\r\n \"rw\": {\r\n \"keywords\": [\"rwanda\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇷🇼\",\r\n \"category\": \"flags\"\r\n },\r\n \"bl\": {\r\n \"keywords\": [\"saint\", \"barthélemy\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇱\",\r\n \"category\": \"flags\"\r\n },\r\n \"sh\": {\r\n \"keywords\": [\"saint\", \"helena\", \"ascension\", \"tristan\", \"cunha\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇭\",\r\n \"category\": \"flags\"\r\n },\r\n \"kn\": {\r\n \"keywords\": [\"saint\", \"kitts\", \"nevis\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"lc\": {\r\n \"keywords\": [\"saint\", \"lucia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇨\",\r\n \"category\": \"flags\"\r\n },\r\n \"pm\": {\r\n \"keywords\": [\"saint\", \"pierre\", \"miquelon\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"vc\": {\r\n \"keywords\": [\"saint\", \"vincent\", \"grenadines\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇻🇨\",\r\n \"category\": \"flags\"\r\n },\r\n \"ws\": {\r\n \"keywords\": [\"samoa\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇼🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"sm\": {\r\n \"keywords\": [\"san\", \"marino\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"st\": {\r\n \"keywords\": [\"sao\", \"tome\", \"principe\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"saudi_arabia\": {\r\n \"keywords\": [\"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"sn\": {\r\n \"keywords\": [\"senegal\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"rs\": {\r\n \"keywords\": [\"serbia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇷🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"sc\": {\r\n \"keywords\": [\"seychelles\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇨\",\r\n \"category\": \"flags\"\r\n },\r\n \"sl\": {\r\n \"keywords\": [\"sierra\", \"leone\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇱\",\r\n \"category\": \"flags\"\r\n },\r\n \"sg\": {\r\n \"keywords\": [\"singapore\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"sx\": {\r\n \"keywords\": [\"sint\", \"maarten\", \"dutch\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇽\",\r\n \"category\": \"flags\"\r\n },\r\n \"sk\": {\r\n \"keywords\": [\"slovakia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇰\",\r\n \"category\": \"flags\"\r\n },\r\n \"si\": {\r\n \"keywords\": [\"slovenia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇮\",\r\n \"category\": \"flags\"\r\n },\r\n \"sb\": {\r\n \"keywords\": [\"solomon\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇧\",\r\n \"category\": \"flags\"\r\n },\r\n \"so\": {\r\n \"keywords\": [\"somalia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"za\": {\r\n \"keywords\": [\"south\", \"africa\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇿🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"gs\": {\r\n \"keywords\": [\"south\", \"georgia\", \"sandwich\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"kr\": {\r\n \"keywords\": [\"south\", \"korea\", \"nation\", \"flag\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"ss\": {\r\n \"keywords\": [\"south\", \"sudan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"es\": {\r\n \"keywords\": [\"spain\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇪🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"lk\": {\r\n \"keywords\": [\"sri\", \"lanka\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇰\",\r\n \"category\": \"flags\"\r\n },\r\n \"sd\": {\r\n \"keywords\": [\"sudan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇩\",\r\n \"category\": \"flags\"\r\n },\r\n \"sr\": {\r\n \"keywords\": [\"suriname\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"sz\": {\r\n \"keywords\": [\"swaziland\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇿\",\r\n \"category\": \"flags\"\r\n },\r\n \"se\": {\r\n \"keywords\": [\"sweden\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"ch\": {\r\n \"keywords\": [\"switzerland\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇭\",\r\n \"category\": \"flags\"\r\n },\r\n \"sy\": {\r\n \"keywords\": [\"syrian\", \"arab\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇾\",\r\n \"category\": \"flags\"\r\n },\r\n \"tw\": {\r\n \"keywords\": [\"taiwan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇼\",\r\n \"category\": \"flags\"\r\n },\r\n \"tj\": {\r\n \"keywords\": [\"tajikistan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇯\",\r\n \"category\": \"flags\"\r\n },\r\n \"tz\": {\r\n \"keywords\": [\"tanzania,\", \"united\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇿\",\r\n \"category\": \"flags\"\r\n },\r\n \"th\": {\r\n \"keywords\": [\"thailand\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇭\",\r\n \"category\": \"flags\"\r\n },\r\n \"tl\": {\r\n \"keywords\": [\"timor\", \"leste\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇱\",\r\n \"category\": \"flags\"\r\n },\r\n \"tg\": {\r\n \"keywords\": [\"togo\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"tk\": {\r\n \"keywords\": [\"tokelau\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇰\",\r\n \"category\": \"flags\"\r\n },\r\n \"to\": {\r\n \"keywords\": [\"tonga\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"tt\": {\r\n \"keywords\": [\"trinidad\", \"tobago\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"tn\": {\r\n \"keywords\": [\"tunisia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"tr\": {\r\n \"keywords\": [\"turkey\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"turkmenistan\": {\r\n \"keywords\": [\"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"tc\": {\r\n \"keywords\": [\"turks\", \"caicos\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇨\",\r\n \"category\": \"flags\"\r\n },\r\n \"tuvalu\": {\r\n \"keywords\": [\"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇻\",\r\n \"category\": \"flags\"\r\n },\r\n \"ug\": {\r\n \"keywords\": [\"uganda\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇺🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"ua\": {\r\n \"keywords\": [\"ukraine\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇺🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"ae\": {\r\n \"keywords\": [\"united\", \"arab\", \"emirates\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"gb\": {\r\n \"keywords\": [\"united\", \"kingdom\", \"great\", \"britain\", \"northern\", \"ireland\", \"flag\", \"nation\", \"country\", \"banner\", \"british\", \"UK\", \"english\", \"england\", \"union jack\"],\r\n \"char\": \"🇬🇧\",\r\n \"category\": \"flags\"\r\n },\r\n \"us\": {\r\n \"keywords\": [\"united\", \"states\", \"america\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇺🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"vi\": {\r\n \"keywords\": [\"virgin\", \"islands\", \"us\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇻🇮\",\r\n \"category\": \"flags\"\r\n },\r\n \"uy\": {\r\n \"keywords\": [\"uruguay\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇺🇾\",\r\n \"category\": \"flags\"\r\n },\r\n \"uz\": {\r\n \"keywords\": [\"uzbekistan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇺🇿\",\r\n \"category\": \"flags\"\r\n },\r\n \"vu\": {\r\n \"keywords\": [\"vanuatu\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇻🇺\",\r\n \"category\": \"flags\"\r\n },\r\n \"va\": {\r\n \"keywords\": [\"vatican\", \"city\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇻🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"ve\": {\r\n \"keywords\": [\"venezuela\", \"bolivarian\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇻🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"vn\": {\r\n \"keywords\": [\"viet\", \"nam\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇻🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"wf\": {\r\n \"keywords\": [\"wallis\", \"futuna\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇼🇫\",\r\n \"category\": \"flags\"\r\n },\r\n \"eh\": {\r\n \"keywords\": [\"western\", \"sahara\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇪🇭\",\r\n \"category\": \"flags\"\r\n },\r\n \"ye\": {\r\n \"keywords\": [\"yemen\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇾🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"zm\": {\r\n \"keywords\": [\"zambia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇿🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"zw\": {\r\n \"keywords\": [\"zimbabwe\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇿🇼\",\r\n \"category\": \"flags\"\r\n },\r\n \"octocat\": {\r\n \"keywords\": [\"animal\", \"octopus\", \"github\", \"custom_\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"shipit\": {\r\n \"keywords\": [\"squirrel\", \"detective\", \"animal\", \"sherlock\", \"inspector\", \"custom_\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"bowtie\": {\r\n \"keywords\": [\"face\", \"formal\", \"fashion\", \"suit\", \"classy\", \"magic\", \"circus\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"neckbeard\": {\r\n \"keywords\": [\"nerdy\", \"face\", \"custom_\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"metal\": {\r\n \"keywords\": [\"fingers\", \"rocknroll\", \"concert\", \"band\", \"custom_\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"fu\": {\r\n \"keywords\": [\"fuck\", \"finger\", \"dislike\", \"thumbsdown\", \"disapprove\", \"no\", \"custom_\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"trollface\": {\r\n \"keywords\": [\"internet\", \"meme\", \"custom_\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"godmode\": {\r\n \"keywords\": [\"doom\", \"oldschool\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"goberserk\": {\r\n \"keywords\": [\"doom\", \"rage\", \"bloody\", \"hurt\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"finnadie\": {\r\n \"keywords\": [\"doom\", \"oldschool\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"feelsgood\": {\r\n \"keywords\": [\"doom\", \"oldschool\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"rage1\": {\r\n \"keywords\": [\"angry\", \"mad\", \"hate\", \"despise\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"rage2\": {\r\n \"keywords\": [\"angry\", \"mad\", \"hate\", \"despise\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"rage3\": {\r\n \"keywords\": [\"angry\", \"mad\", \"hate\", \"despise\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"rage4\": {\r\n \"keywords\": [\"angry\", \"mad\", \"hate\", \"despise\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"suspect\": {\r\n \"keywords\": [\"mad\", \"custom_\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"hurtrealbad\": {\r\n \"keywords\": [\"mad\", \"injured\", \"doom\", \"oldschool\", \"custom_\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n }\r\n}","declare var twemoji: {\r\n parse(str: string, options?: { folder: string, ext: string }): string;\r\n}\r\n\r\nimport { Component, OnInit, Output } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { Subject } from 'rxjs';\r\n\r\ninterface Emoji {\r\n\tkeywords : string[];\r\n\tchar : string;\r\n\thtml? : SafeHtml;\r\n\tcategory : string;\r\n}\r\n\r\nimport { EMOJIS } from '../emojis';\r\n\r\n@Component({\r\n\tselector: 'emoji-selector-panel',\r\n\ttemplateUrl: './emoji-selector-panel.component.html',\r\n\tstyleUrls: ['./emoji-selector-panel.component.scss']\r\n})\r\nexport class EmojiSelectorPanelComponent implements OnInit {\r\n\r\n\tconstructor(\r\n\t\tprivate sanitizer : DomSanitizer\r\n\t) { }\r\n\r\n\tcategories : any[];\r\n\tactiveCategory : string = 'people';\r\n\tsearchResults : any[] = [];\r\n searchVisible = false;\r\n\t\r\n\t@Output()\r\n\tprivate selected : Subject<string> = new Subject();\r\n\r\n\tprivate _searchQuery : string;\r\n\r\n\tget searchQuery() {\r\n\t\treturn this._searchQuery;\r\n\t}\r\n\r\n\tset searchQuery(value) {\r\n\t\tthis._searchQuery = value;\r\n\t\tsetTimeout(() => {\r\n\t\t\tthis.searchResults = Object.keys(EMOJIS).filter(k => k.includes(value)).map(k => EMOJIS[k]);\r\n\t\t\tthis.searchResults.splice(50, this.searchResults.length);\r\n\t\t\tconsole.log(`looking for '${value}' => ${this.searchResults.length} results`);\r\n\t\t});\r\n\t}\r\n\r\n\thumanize(str : string) {\r\n\t\treturn str.replace(/(^| )[a-z]/g, k => k.toUpperCase()).replace(/_/g, ' ');\r\n\t}\r\n\r\n\tselect(char : string) {\r\n\t\tthis.selected.next(char);\r\n\t}\r\n\r\n\tpairs(object) {\r\n\t\treturn Object.keys(object).map(key => [key, object[key]]);\r\n\t}\r\n\r\n\thideSearch() {\r\n\t\t// because of the \"outside click detection\"\r\n setTimeout(() => {\r\n this.searchVisible = false;\r\n });\r\n\t}\r\n\t\r\n showSearch() {\r\n\t\t// because of the \"outside click detection\"\r\n setTimeout(() => {\r\n this.searchVisible = true;\r\n });\r\n }\r\n\r\n\tngOnInit() {\r\n\r\n\t\tlet cats = {};\r\n\t\tlet categoryIcons = {\r\n\t\t\tsymbols: 'warning',\r\n\t\t\tpeople: 'people',\r\n\t\t\tanimals_and_nature: 'nature',\r\n\t\t\ttravel_and_places: 'location_on',\r\n\t\t\tactivity: 'local_activity',\r\n\t\t\tfood_and_drink: 'restaurant',\r\n\t\t\tobjects: 'computer',\r\n\t\t\tflags: 'flag'\r\n\t\t};\r\n\t\tfor (let pair of this.pairs(EMOJIS)) {\r\n\t\t\tlet name = pair[0];\r\n\t\t\tlet emoji : Emoji = pair[1];\r\n\r\n\t\t\tif (!cats[emoji.category]) {\r\n\t\t\t\tcats[emoji.category] = {\r\n\t\t\t\t\tname: emoji.category,\r\n\t\t\t\t\ticon: categoryIcons[emoji.category] || 'code',\r\n\t\t\t\t\temojis: []\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\temoji.html = this.sanitizer.bypassSecurityTrustHtml(twemoji.parse(emoji.char || ''));\r\n\r\n\t\t\tcats[emoji.category].emojis.push(emoji);\r\n\t\t}\r\n\r\n\t\tthis.categories = this.pairs(cats).map(pair => pair[1]);\r\n\t}\r\n\r\n}\r\n","/// <reference types=\"@types/resize-observer-browser\" />\r\n\r\nimport { FlexibleConnectedPositionStrategy, Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { ComponentPortal, TemplatePortal } from '@angular/cdk/portal';\r\nimport { Component, ElementRef, HostBinding, Output, ViewChild, Input } from '@angular/core';\r\nimport { Subject, Observable } from 'rxjs';\r\nimport { EmojiSelectorPanelComponent } from './emoji-selector-panel/emoji-selector-panel.component';\r\n\r\n@Component({\r\n selector: 'emoji-selector-button',\r\n template: `\r\n <button #button type=\"button\" mat-icon-button (click)=\"show()\">\r\n <mat-icon>emoji_emotions</mat-icon>\r\n </button>\r\n <ng-template cdkPortal #selectorPanelTemplate=\"cdkPortal\">\r\n <emoji-selector-panel \r\n #panel\r\n (selected)=\"insert($event)\"\r\n ></emoji-selector-panel>\r\n </ng-template>\r\n `,\r\n styles: [`\r\n :host {\r\n display: block;\r\n position: relative;\r\n }\r\n\r\n button {\r\n color: #666\r\n }\r\n `]\r\n})\r\nexport class EmojiSelectorButtonComponent {\r\n constructor(\r\n private elementRef: ElementRef<HTMLElement>,\r\n private overlay: Overlay\r\n ) {\r\n }\r\n\r\n @ViewChild('selectorPanelTemplate') selectorPanelTemplate: TemplatePortal<any>;\r\n\r\n private _selected = new Subject<string>();\r\n showEmojiPanel = false;\r\n\r\n @Output()\r\n get selected() : Observable<string> {\r\n return this._selected;\r\n }\r\n\r\n private overlayRef: OverlayRef;\r\n\r\n get isOpen() {\r\n return this.overlayRef;\r\n }\r\n\r\n /**\r\n * Insert the given emoji.\r\n * @param str \r\n */\r\n insert(str) {\r\n this._selected.next(str);\r\n }\r\n\r\n close() {\r\n if (this.overlayRef) {\r\n this.overlayRef.dispose();\r\n this.overlayRef = null;\r\n return;\r\n }\r\n }\r\n\r\n @Input() overlayX: 'start' | 'center' | 'end' = 'end';\r\n @Input() overlayY: 'top' | 'center' | 'bottom' = 'top';\r\n\r\n show() {\r\n if (this.isOpen) {\r\n this.close();\r\n }\r\n\r\n this.overlayRef = this.overlay.create({\r\n positionStrategy: this.overlay.position()\r\n .flexibleConnectedTo(this.elementRef)\r\n .withPositions([\r\n { \r\n originX: 'end', \r\n originY: 'bottom',\r\n overlayX: this.overlayX,\r\n overlayY: this.overlayY\r\n }\r\n ])\r\n .withFlexibleDimensions(true),\r\n hasBackdrop: true,\r\n disposeOnNavigation: true,\r\n scrollStrategy: this.overlay.scrollStrategies.reposition({\r\n autoClose: true\r\n })\r\n });\r\n\r\n this.overlayRef.backdropClick().subscribe(() => {\r\n this.close();\r\n })\r\n\r\n this.overlayRef.keydownEvents().subscribe(event => {\r\n if (event.key === 'Escape') {\r\n this.close();\r\n }\r\n });\r\n this.overlayRef.attach(this.selectorPanelTemplate);\r\n }\r\n}","import { NgModule } from '@angular/core';\r\nimport { EmojiSelectorPanelComponent } from './emoji-selector-panel/emoji-selector-panel.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { EmojiSelectorButtonComponent } from './emoji-selector-button.component';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport { PortalModule } from '@angular/cdk/portal';\r\n\r\nconst COMPONENTS = [\r\n EmojiSelectorPanelComponent,\r\n EmojiSelectorButtonComponent\r\n];\r\n\r\n@NgModule({\r\n declarations: COMPONENTS,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n OverlayModule,\r\n PortalModule\r\n ],\r\n exports: COMPONENTS\r\n})\r\nexport class EmojiModule {\r\n\r\n}","import { BehaviorSubject, Observable } from 'rxjs';\r\nimport { ChatMessage, Vote, CommentsOrder, Notification, User, UrlCard } from '@banta/common';\r\nimport { ChatSourceBase } from './chat-source-base';\r\nimport { AttachmentResolver, AttachmentScraper } from './attachment-scraper';\r\n\r\nexport interface ChatSourceOptions {\r\n sortOrder: CommentsOrder;\r\n}\r\n\r\nexport abstract class ChatBackendBase {\r\n constructor() {\r\n }\r\n \r\n abstract getSourceForTopic(topicId : string, options?: ChatSourceOptions) : Promise<ChatSourceBase>;\r\n abstract getSourceForThread(topicId : string, messageId : string, options?: ChatSourceOptions) : Promise<ChatSourceBase>;\r\n abstract getSourceCountForTopic(topicId: string): Promise<number>\r\n abstract refreshMessage(message : ChatMessage): Promise<ChatMessage>;\r\n abstract getMessage(topicId : string, messageId : string): Promise<ChatMessage>;\r\n abstract getSubMessage(topicId : string, parentMessageId : string, messageId : string): Promise<ChatMessage>;\r\n abstract watchMessage(message : ChatMessage, handler : (message : ChatMessage) => void) : () => void;\r\n abstract getCardForUrl(url: string): Promise<UrlCard>;\r\n readonly notificationsChanged : Observable<Notification[]>;\r\n readonly newNotification : Observable<Notification>;\r\n \r\n private _userChanged = new BehaviorSubject<User>(null);\r\n private _user : User;\r\n \r\n get userChanged() : Observable<User> {\r\n return this._userChanged;\r\n }\r\n \r\n set user(user : User) {\r\n this._user = user;\r\n this._userChanged.next(user);\r\n }\r\n\r\n get user() {\r\n return this._user;\r\n }\r\n \r\n private _attachmentScrapers: AttachmentScraper[] = [];\r\n private _attachmentResolvers: AttachmentResolver[] = [];\r\n\r\n registerAttachmentScraper(scraper: AttachmentScraper) {\r\n this._attachmentScrapers.push(scraper);\r\n }\r\n\r\n registerAttachmentResolver(resolver: AttachmentResolver) {\r\n this._attachmentResolvers.push(resolver);\r\n }\r\n\r\n get attachmentScrapers() {\r\n return this._attachmentScrapers.slice();\r\n }\r\n\r\n get attachmentResolvers() {\r\n return this._attachmentResolvers.slice();\r\n }\r\n}","import { Component, Input, ViewChild, HostBinding } from \"@angular/core\";\r\nimport { NewMessageForm, ChatMessage, User, Notification } from '@banta/common';\r\nimport { Subject, Observable, Subscription } from 'rxjs';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { BantaChatComponent } from '../chat';\r\nimport { Output } from \"@angular/core\";\r\nimport { ChatBackendBase } from \"../chat-backend-base\";\r\nimport { ChatSourceBase } from \"../chat-source-base\";\r\n\r\n/**\r\n * Unified chat and comments component\r\n */\r\n@Component({\r\n selector: `banta`,\r\n templateUrl: './banta.component.html',\r\n styleUrls: [ './banta.component.scss' ]\r\n})\r\nexport class BantaComponent {\r\n constructor(\r\n private backend : ChatBackendBase,\r\n private matDialog : MatDialog\r\n ) {\r\n }\r\n\r\n firehoseSource : ChatSourceBase;\r\n pointSource : ChatSourceBase;\r\n\r\n private _topicID : string;\r\n private _subs = new Subscription();\r\n\r\n auxOpen = false;\r\n auxTitle = 'Notifications';\r\n auxMode = 'notifications';\r\n\r\n ngOnInit() {\r\n this._subs.add(this.backend.userChanged.subscribe(user => this.currentUser = user));\r\n this._subs.add(this.backend.notificationsChanged.subscribe(notifs => this.notifications = notifs));\r\n this._subs.add(this.backend.newNotification.subscribe(notif => {\r\n this.newNotifications = true;\r\n }));\r\n }\r\n \r\n mobileFocus : string = null;\r\n\r\n async sendPointSubMessage() {\r\n let text = (this.newPointSubMessage.message || '').trim();\r\n this.newPointSubMessage.message = '';\r\n\r\n if (text === '')\r\n return;\r\n \r\n let message : ChatMessage = {\r\n user: null,\r\n sentAt: Date.now(),\r\n likes: 0,\r\n message: text\r\n };\r\n\r\n try {\r\n await this.pointSubChat.send(message);\r\n } catch (e) {\r\n console.error(`Failed to send point sub-message:`);\r\n console.error(e);\r\n }\r\n }\r\n\r\n @ViewChild('firehose', { static: true })\r\n firehose : BantaChatComponent;\r\n\r\n async goToMessage(message : ChatMessage) {\r\n\r\n let targetMessage = message;\r\n\r\n if (message.parentMessageId) {\r\n // jump to the parent message thread...\r\n\r\n let parentMessage: ChatMessage;\r\n \r\n try {\r\n parentMessage = await this.backend.getMessage(message.topicId, message.parentMessageId);\r\n } catch (e) {\r\n console.error(`Received exception while fetching parent message:`);\r\n console.error(e);\r\n }\r\n\r\n if (!parentMessage) {\r\n console.error(`Failed to look up parent message ${message.topicId}/${message.parentMessageId}`);\r\n console.error(`Original message was:`);\r\n console.dir(targetMessage);\r\n return;\r\n }\r\n\r\n message = parentMessage;\r\n }\r\n\r\n let viewType = this.getViewType(message);\r\n\r\n if (viewType === 'comment') {\r\n if (this.pointSubChat) {\r\n if (this.pointSubChat.close)\r\n this.pointSubChat.close();\r\n this.pointSubChat = null;\r\n }\r\n this.mobileFocus = 'points';\r\n this.pointOpen = message;\r\n this.pointSubChat = await this.backend.getSourceForThread(message.topicId, message.id);\r\n this.pointOpen = await this.backend.refreshMessage(message);\r\n this.newPointSubMessage = {};\r\n } else if (viewType === 'chat') {\r\n this.mobileFocus = 'firehose';\r\n this.firehose.jumpToMessage(message);\r\n }\r\n }\r\n\r\n notifications : Notification[];\r\n newNotifications = false;\r\n \r\n pointUnfocus() {\r\n this.pointOpen = null;\r\n if (this.pointSubChat) {\r\n if (this.pointSubChat.close)\r\n this.pointSubChat.close();\r\n this.pointSubChat = null;\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this._subs.unsubscribe();\r\n }\r\n\r\n showAux(title : string, mode : string) {\r\n this.auxOpen = true;\r\n this.auxTitle = title;\r\n this.auxMode = mode;\r\n this.mobileFocus = 'aux';\r\n }\r\n\r\n showNotifications() {\r\n this.showAux('Notifications', 'notifications');\r\n }\r\n\r\n @Input()\r\n get topicID() : string {\r\n return this._topicID;\r\n }\r\n\r\n @Input() chatLabel = 'Chat';\r\n @Input() commentsLabel = 'Comments';\r\n\r\n set topicID(value) {\r\n this._topicID = value;\r\n\r\n this.close();\r\n this.connectToTopic(this._topicID);\r\n }\r\n\r\n private async connectToTopic(id : string) {\r\n this.firehoseSource = await this.backend.getSourceForTopic(`${id}_firehose`);\r\n this.pointSource = await this.backend.getSourceForTopic(`${id}_thepoint`);\r\n }\r\n\r\n private _signInSelected = new Subject<void>();\r\n\r\n @Output()\r\n get signInSelected(): Observable<void> {\r\n return this._signInSelected;\r\n }\r\n\r\n showSignIn() {\r\n this._signInSelected.next();\r\n }\r\n\r\n close() {\r\n if (this.firehoseSource) {\r\n if (this.firehoseSource.close)\r\n this.firehoseSource.close();\r\n this.firehoseSource = null;\r\n }\r\n\r\n if (this.pointSource) {\r\n if (this.pointSource.close)\r\n this.pointSource.close();\r\n this.pointSource = null;\r\n }\r\n }\r\n\r\n @HostBinding('class.point-focus')\r\n get hasPoint() {\r\n return this.pointOpen != null;\r\n }\r\n\r\n pointOpen : ChatMessage = null;\r\n pointSubChat : ChatSourceBase = null;\r\n\r\n closeAux() {\r\n this.auxOpen = false;\r\n this.mobileFocus = 'firehose';\r\n }\r\n\r\n getViewType(message : ChatMessage) {\r\n if (message.topicId.endsWith('_firehose'))\r\n return 'chat';\r\n else if (message.topicId.endsWith('_thepoint'))\r\n return 'comment';\r\n\r\n return 'comment';\r\n }\r\n\r\n async upvoteMessage(message : ChatMessage) {\r\n // TODO\r\n //await this.backend.likeMessage(message.id);\r\n }\r\n\r\n showProfile(user : User) {\r\n this.profileUser = user;\r\n this.showAux(`@${user.username}'s Profile`, 'profile');\r\n }\r\n\r\n profileUser : User;\r\n \r\n reportedMessage : ChatMessage;\r\n\r\n sendReport(message : ChatMessage) {\r\n this.auxOpen = false;\r\n alert('would send report');\r\n }\r\n\r\n reportMessage(message : ChatMessage) {\r\n this.reportedMessage = message;\r\n this.showAux(`Report message from @${message.user.username}`, 'report');\r\n }\r\n\r\n currentUser : User;\r\n\r\n newPointSubMessage : NewMessageForm = {};\r\n\r\n genericAvatarUrl = 'https://gravatar.com/avatar/915c804e0be607a4ad766ddadea5c48a?s=512&d=https://codepen.io/assets/avatars/user-avatar-512x512-6e240cf350d2f1cc07c2bed234c3a3bb5f1b237023c204c782622e80d6b212ba.png';\r\n}","import { Component } from \"@angular/core\";\r\n\r\n@Component({\r\n selector: 'banta-logo',\r\n template: `banta`,\r\n styles: [\r\n `\r\n :host {\r\n font-family: 'Odibee Sans', sans-serif;\r\n font-size: 40pt;\r\n }\r\n\r\n :host.small {\r\n font-size: 30pt;\r\n }\r\n `\r\n ]\r\n})\r\nexport class BantaLogoComponent {\r\n\r\n}","import { Component, Input, Output } from \"@angular/core\";\r\nimport { User, ChatMessage } from '@banta/common';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'banta-chat-message',\r\n templateUrl: './chat-message.component.html',\r\n styleUrls: ['./chat-message.component.scss']\r\n})\r\nexport class ChatMessageComponent {\r\n private _selected = new Subject<void>();\r\n private _reported = new Subject<void>();\r\n private _upvoted = new Subject<void>();\r\n private _userSelected = new Subject<User>();\r\n\r\n @Input()\r\n message : ChatMessage;\r\n \r\n @Output() \r\n get userSelected() {\r\n return this._userSelected;\r\n }\r\n\r\n @Output()\r\n get selected() {\r\n return this._selected;\r\n }\r\n\r\n @Output()\r\n get reported() {\r\n return this._reported;\r\n }\r\n\r\n @Output()\r\n get upvoted() {\r\n return this._upvoted;\r\n }\r\n\r\n avatarForUser(user : User) {\r\n if (user && user.avatarUrl) {\r\n let url = user.avatarUrl;\r\n return `url(${url})`;\r\n }\r\n\r\n return null;\r\n }\r\n \r\n upvote() {\r\n this._upvoted.next();\r\n }\r\n\r\n report() {\r\n this._reported.next();\r\n }\r\n\r\n select() {\r\n this._selected.next();\r\n }\r\n \r\n selectUser() {\r\n this._userSelected.next();\r\n }\r\n\r\n}","import { Component, Input, Output } from '@angular/core';\r\nimport { ChatMessage } from '@banta/common';\r\nimport { Subject, Observable } from 'rxjs';\r\nimport { ChatBackendBase } from '../chat-backend-base';\r\n\r\n@Component({\r\n selector: 'banta-live-chat-message',\r\n template: `\r\n <banta-chat-message \r\n *ngIf=\"message\"\r\n [message]=\"message\"\r\n (upvoted)=\"upvote()\"\r\n (reported)=\"report()\"\r\n (selected)=\"select()\"\r\n ></banta-chat-message>\r\n `,\r\n styles: [``]\r\n})\r\nexport class LiveChatMessageComponent {\r\n constructor(\r\n private backend : ChatBackendBase\r\n ) {\r\n\r\n }\r\n\r\n private _message : ChatMessage;\r\n private _upvoted = new Subject<void>();\r\n private _reported = new Subject<void>();\r\n private _selected = new Subject<void>();\r\n\r\n @Output()\r\n get upvoted() : Observable<void> {\r\n return this._upvoted;\r\n }\r\n \r\n @Output()\r\n get reported() : Observable<void> {\r\n return this._reported;\r\n }\r\n\r\n @Output()\r\n get selected() : Observable<void> {\r\n return this._selected;\r\n }\r\n \r\n @Input()\r\n get message() : ChatMessage {\r\n return this._message;\r\n }\r\n\r\n private unsubscribe : Function;\r\n\r\n set message(value) {\r\n let originalId = null;\r\n if (this._message)\r\n originalId = this._message.id;\r\n \r\n this._message = value;\r\n\r\n if (value && originalId === value.id) {\r\n return;\r\n }\r\n\r\n if (this.unsubscribe)\r\n this.unsubscribe();\r\n \r\n if (value) {\r\n this.unsubscribe = this.backend.watchMessage(value, message => this.message = message);\r\n }\r\n }\r\n\r\n report() {\r\n this._reported.next();\r\n }\r\n \r\n upvote() {\r\n this._upvoted.next();\r\n }\r\n\r\n select() {\r\n this._selected.next();\r\n }\r\n}","import { Component, Input, ViewChild, ElementRef, Output } from \"@angular/core\";\r\nimport { User, ChatMessage } from '@banta/common';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport { ChatBackendBase } from \"../../chat-backend-base\";\r\nimport { ChatSourceBase } from \"../../chat-source-base\";\r\n\r\n@Component({\r\n selector: 'banta-chat-view',\r\n templateUrl: './chat-view.component.html',\r\n styleUrls: ['./chat-view.component.scss']\r\n})\r\nexport class ChatViewComponent {\r\n constructor(\r\n private backend: ChatBackendBase,\r\n private elementRef : ElementRef<HTMLElement>\r\n ) {\r\n\r\n }\r\n\r\n private _sourceSubs = new Subscription();\r\n private _source : ChatSourceBase;\r\n\r\n @Input()\r\n get source() {\r\n return this._source;\r\n }\r\n\r\n private _selected = new Subject<ChatMessage>();\r\n private _selected$ = this._selected.asObservable();\r\n private _reported = new Subject<ChatMessage>();\r\n private _reported$ = this._reported.asObservable();\r\n private _upvoted = new Subject<ChatMessage>();\r\n private _upvoted$ = this._upvoted.asObservable();\r\n private _userSelected = new Subject<ChatMessage>();\r\n private _userSelected$ = this._userSelected.asObservable();\r\n private _received = new Subject<ChatMessage>();\r\n private _received$ = this._received.asObservable();\r\n\r\n @Output() get selected() { return this._selected$; }\r\n @Output() get userSelected() { return this._userSelected$; }\r\n @Output() get reported() { return this._reported$; }\r\n @Output() get upvoted() { return this._upvoted$; }\r\n @Output() get received() { return this._received$; }\r\n\r\n set source(value) {\r\n if (this._sourceSubs) {\r\n this._sourceSubs.unsubscribe();\r\n this._sourceSubs = null;\r\n }\r\n\r\n this._source = value;\r\n\r\n this.messages = [];\r\n\r\n if (value) {\r\n this._sourceSubs = new Subscription();\r\n this.messages = value.messages.slice();\r\n\r\n console.log(`Source set:`);\r\n console.dir(value);\r\n\r\n console.log(`Messages loaded:`);\r\n console.dir(this.messages); \r\n \r\n this._sourceSubs.add(this._source.messageReceived.subscribe(msg => this.messageReceived(msg)));\r\n this._sourceSubs.add(this._source.messageSent.subscribe(msg => this.messageSent(msg)));\r\n\r\n this._sourceSubs.add(\r\n this.backend.userChanged\r\n .subscribe(user => this.currentUser = user)\r\n );\r\n \r\n this.getInitialMessages();\r\n }\r\n }\r\n\r\n private async getInitialMessages() {\r\n let messages = (await this._source.getExistingMessages());\r\n messages.forEach(m => m.transientState ??= {});\r\n this.messages = messages.slice().reverse();\r\n this.sortMessages();\r\n }\r\n\r\n private sortMessages() {\r\n if (!this.source)\r\n return;\r\n \r\n let sorter: (a: ChatMessage, b: ChatMessage) => number;\r\n\r\n sorter = (a, b) => (a.sentAt - b.sentAt);\r\n\r\n this.messages.sort(sorter);\r\n }\r\n\r\n messages : ChatMessage[] = [];\r\n currentUser : User;\r\n\r\n @ViewChild('messageContainer')\r\n messageContainer : ElementRef<HTMLElement>;\r\n\r\n @Input() maxMessages : number = 200;\r\n @Input() emptyLabel = 'Be the first to chat';\r\n\r\n private addMessage(message : ChatMessage) {\r\n if (this.messages.length > this.maxMessages + 1) {\r\n while (this.messages.length > this.maxMessages)\r\n this.messages.shift();\r\n }\r\n\r\n this.messages.push(message);\r\n this.sortMessages();\r\n }\r\n\r\n private messageReceived(message : ChatMessage) {\r\n this.addMessage(message);\r\n this._received.next(message);\r\n\r\n if (this.isScrolledToLatest())\r\n setTimeout(() => this.scrollToLatest());\r\n }\r\n\r\n isScrolledToLatest() {\r\n if (!this.messageContainer)\r\n return false;\r\n\r\n let el = this.messageContainer.nativeElement;\r\n let currentScroll = el.scrollTop;\r\n let currentTotal = el.scrollHeight - el.offsetHeight;\r\n \r\n return currentScroll > currentTotal - 10;\r\n }\r\n\r\n private messageSent(message : ChatMessage) {\r\n this.addMessage(message);\r\n \r\n if (!this.messageContainer)\r\n return;\r\n\r\n setTimeout(() => this.scrollToLatest());\r\n }\r\n\r\n scrollToLatest() {\r\n if (!this.messageContainer)\r\n return;\r\n \r\n let el = this.messageContainer.nativeElement;\r\n el.scrollTop = el.scrollHeight;\r\n }\r\n\r\n jumpTo(message : ChatMessage) {\r\n let element = this.elementRef.nativeElement;\r\n let messageElement = element.querySelector(`banta-chat-message[data-id=\"${message.id}\"]`)\r\n\r\n if (!messageElement) {\r\n alert(`could not find message ${message.id}`);\r\n return;\r\n }\r\n\r\n messageElement.scrollIntoView({ behavior: 'smooth' });\r\n\r\n this.flashMessage(message);\r\n }\r\n\r\n flashMessage(message : ChatMessage) {\r\n if (!message)\r\n return;\r\n \r\n this.flashedMessageId = message.id;\r\n //setTimeout(() => this.flashedMessageId = null, 250);\r\n }\r\n\r\n flashedMessageId : string;\r\n\r\n\r\n mentionsMe(message : ChatMessage) {\r\n if (!this.currentUser)\r\n return false;\r\n\r\n if (message.message.includes(`@${this.currentUser.username}`))\r\n return true;\r\n \r\n return false;\r\n }\r\n \r\n upvoteMessage(message : ChatMessage) {\r\n this._upvoted.next(message);\r\n }\r\n\r\n reportMessage(message : ChatMessage) {\r\n this._reported.next(message);\r\n }\r\n\r\n selectMessage(message : ChatMessage) {\r\n this._selected.next(message);\r\n }\r\n\r\n selectMessageUser(message : ChatMessage) {\r\n this._userSelected.next(message);\r\n }\r\n\r\n avatarForUser(user : User) {\r\n if (user && user.avatarUrl) {\r\n let url = user.avatarUrl;\r\n return `url(${url})`;\r\n }\r\n\r\n return null;\r\n }\r\n}","import { Component, Input, Output, ViewChild } from \"@angular/core\";\r\nimport { Subject, Observable, Subscription } from 'rxjs';\r\n\r\nimport { User, ChatMessage, NewMessageForm } from '@banta/common';\r\nimport { ChatViewComponent } from '../chat-view/chat-view.component';\r\nimport { ChatBackendBase } from \"../../chat-backend-base\";\r\nimport { ChatSourceBase } from \"../../chat-source-base\";\r\n\r\n/**\r\n * Chat component\r\n */\r\n@Component({\r\n selector: 'banta-chat',\r\n templateUrl: './banta-chat.component.html',\r\n styleUrls: ['./banta-chat.component.scss']\r\n})\r\nexport class BantaChatComponent {\r\n constructor(\r\n private backend : ChatBackendBase\r\n ) {\r\n }\r\n\r\n private _source : ChatSourceBase;\r\n private _subs = new Subscription();\r\n user : User = null;\r\n\r\n @Input() shouldInterceptMessageSend?: (message: ChatMessage, source: ChatSourceBase) => boolean | Promise<boolean>;\r\n\r\n\r\n ngOnInit() {\r\n this._subs.add(this.backend.userChanged.subscribe(user => this.user = user));\r\n }\r\n\r\n ngOnDestroy() {\r\n this._subs.unsubscribe();\r\n }\r\n\r\n @Input()\r\n get source() : ChatSourceBase {\r\n return this._source;\r\n }\r\n\r\n set source(value) {\r\n this._source = value;\r\n }\r\n\r\n @Input()\r\n get topicID() : string {\r\n return this._source.identifier;\r\n }\r\n\r\n set topicID(value) {\r\n this.setSourceFromTopicID(value);\r\n }\r\n\r\n private async setSourceFromTopicID(topicID : string) {\r\n if (this._source && this._source.close)\r\n this._source.close();\r\n this._source = null;\r\n this._source = await this.backend.getSourceForTopic(topicID);\r\n }\r\n\r\n @Input() signInLabel = 'Sign In';\r\n @Input() sendLabel = 'Send';\r\n @Input() permissionDeniedLabel = 'Send';\r\n @Input() messageFieldPlaceholder = 'Chat';\r\n @Input() emptyLabel = 'Be the first to chat';\r\n\r\n private _selected = new Subject<ChatMessage>();\r\n private _selected$ = this._selected.asObservable();\r\n private _reported = new Subject<ChatMessage>();\r\n private _reported$ = this._reported.asObservable();\r\n private _upvoted = new Subject<ChatMessage>();\r\n private _upvoted$ = this._upvoted.asObservable();\r\n private _userSelected = new Subject<ChatMessage>();\r\n private _userSelected$ = this._userSelected.asObservable();\r\n private _permissionDeniedError = new Subject<string>();\r\n private _permissionDeniedError$ = this._permissionDeniedError.asObservable();\r\n private _signInSelected = new Subject<void>();\r\n private _signInSelected$ = this._signInSelected.asObservable();\r\n private _received = new Subject<ChatMessage>();\r\n private _received$ = this._received.asObservable();\r\n\r\n @Output() get selected() { return this._selected$; }\r\n @Output() get reported() { return this._reported$; }\r\n @Output() get upvoted() { return this._upvoted$; }\r\n @Output() get userSelected() { return this._userSelected$; }\r\n @Output() get permissionDeniedError() { return this._permissionDeniedError$; }\r\n @Output() get signInSelected() { return this._signInSelected$; }\r\n @Output() get received() { return this._received$; }\r\n\r\n onReceived(message: ChatMessage) {\r\n this._received.next(message);\r\n }\r\n\r\n showEmojiPanel = false;\r\n\r\n showSignIn() {\r\n this._signInSelected.next();\r\n }\r\n\r\n sendPermissionError(message: string) {\r\n this._permissionDeniedError.next(message);\r\n }\r\n\r\n insertEmoji(emoji) {\r\n let message = this.newMessage.message || '';\r\n\r\n this.newMessage.message = message + emoji;\r\n }\r\n\r\n onKeyDown(event : KeyboardEvent) {\r\n // TODO\r\n }\r\n\r\n @ViewChild('chatView', { static: true })\r\n chatView : ChatViewComponent;\r\n\r\n jumpToMessage(message : ChatMessage) {\r\n if (this.chatView)\r\n this.chatView.jumpTo(message);\r\n }\r\n\r\n select(message : ChatMessage) {\r\n this._selected.next(message);\r\n }\r\n\r\n selectUser(message : ChatMessage) {\r\n this._userSelected.next(message);\r\n }\r\n\r\n report(message : ChatMessage) {\r\n this._reported.next(message);\r\n }\r\n\r\n async upvote(message : ChatMessage) {\r\n await this.source.likeMessage(message.id);\r\n this._upvoted.next(message);\r\n }\r\n\r\n get canChat() {\r\n if (!this.user)\r\n return false;\r\n\r\n // TODO\r\n // if (!this.user.permissions)\r\n // return true;\r\n\r\n // if (!this.user.permissions.canChat)\r\n // return true;\r\n\r\n // return this.user.permissions?.canChat(this.source);\r\n \r\n return true;\r\n }\r\n\r\n newMessage : NewMessageForm = {};\r\n\r\n async sendMessage() {\r\n if (!this.source)\r\n return;\r\n\r\n let text = (this.newMessage.message || '').trim();\r\n this.newMessage.message = '';\r\n\r\n if (text === '')\r\n return;\r\n\r\n let message : ChatMessage = {\r\n user: null,\r\n sentAt: Date.now(),\r\n likes: 0,\r\n url: typeof window !== 'undefined' ? location.href : undefined,\r\n message: text\r\n };\r\n\r\n try {\r\n const intercept = await this.shouldInterceptMessageSend?.(message, this.source);\r\n if (!intercept) {\r\n await this.source.send(message);\r\n }\r\n } catch (e) {\r\n console.error(`Failed to send message: `, message);\r\n console.error(e);\r\n }\r\n }\r\n}\r\n","import { NgModule } from \"@angular/core\";\r\nimport { ChatMessageComponent } from './chat-message/chat-message.component';\r\nimport { ChatViewComponent } from './chat-view/chat-view.component';\r\nimport { BantaChatComponent } from './banta-chat/banta-chat.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { EmojiModule } from '../emoji';\r\nimport { LiveChatMessageComponent } from './live-chat-message.component';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\nconst COMPONENTS = [\r\n ChatMessageComponent,\r\n LiveChatMessageComponent,\r\n ChatViewComponent,\r\n BantaChatComponent\r\n];\r\n\r\n@NgModule({\r\n declarations: COMPONENTS,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n EmojiModule\r\n ],\r\n exports: COMPONENTS\r\n})\r\nexport class ChatModule {\r\n}","import { Component, Input, Output } from \"@angular/core\";\r\nimport { ChatMessage } from '@banta/common';\r\nimport { Subject, Observable } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'banta-live-message',\r\n template: `\r\n <ng-container *ngIf=\"message\">\r\n <banta-live-chat-message\r\n *ngIf=\"viewType === 'chat'\"\r\n [message]=\"message\"\r\n (upvoted)=\"upvote(message)\"\r\n (reported)=\"report(message)\"\r\n (selected)=\"select(message)\">\r\n </banta-live-chat-message>\r\n\r\n <banta-live-comment \r\n *ngIf=\"viewType === 'comment'\"\r\n [message]=\"message\"\r\n (upvoted)=\"upvote(message)\"\r\n (reported)=\"report(message)\"\r\n (selected)=\"select(message)\">\r\n </banta-live-comment>\r\n </ng-container>\r\n `,\r\n styles: [``]\r\n})\r\nexport class LiveMessageComponent {\r\n constructor() {\r\n\r\n }\r\n\r\n private _message : ChatMessage;\r\n private _upvoted = new Subject<void>();\r\n private _reported = new Subject<void>();\r\n private _selected = new Subject<void>();\r\n\r\n viewType : string;\r\n\r\n @Output() \r\n get upvoted(): Observable<void> {\r\n return this._upvoted;\r\n }\r\n\r\n @Output() \r\n get reported(): Observable<void> {\r\n return this._reported;\r\n }\r\n \r\n @Output() \r\n get selected(): Observable<void> {\r\n return this._selected;\r\n }\r\n\r\n @Input()\r\n get message() : ChatMessage {\r\n return this._message;\r\n }\r\n\r\n set message(value) {\r\n this._message = value;\r\n this.viewType = this.getViewType(value);\r\n }\r\n\r\n private getViewType(message : ChatMessage) {\r\n if (message.topicId.endsWith('_firehose'))\r\n return 'chat';\r\n else if (message.topicId.endsWith('_thepoint'))\r\n return 'comment';\r\n\r\n return 'comment';\r\n }\r\n\r\n upvote() {\r\n this._upvoted.next();\r\n }\r\n\r\n report() {\r\n this._reported.next();\r\n }\r\n\r\n select() {\r\n this._selected.next();\r\n }\r\n\r\n}","import { Component, Output, Input, HostBinding, ElementRef } from \"@angular/core\";\r\nimport { Subject } from 'rxjs';\r\nimport { ChatMessage, ChatPermissions, User } from '@banta/common';\r\nimport { MessageMenuItem } from \"../../message-menu-item\";\r\nimport { take } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'banta-comment',\r\n templateUrl: './comment.component.html',\r\n styleUrls: ['./comment.component.scss']\r\n})\r\nexport class CommentComponent {\r\n constructor(\r\n private elementRef: ElementRef<HTMLElement>\r\n ) {\r\n }\r\n\r\n get element() {\r\n return this.elementRef.nativeElement;\r\n }\r\n\r\n private _reported = new Subject<void>();\r\n private _selected = new Subject<void>();\r\n private _liked = new Subject<void>();\r\n private _unliked = new Subject<void>();\r\n\r\n private _shared = new Subject<ChatMessage>();\r\n\r\n\tprivate _userSelected = new Subject<void>();\r\n\tprivate _avatarSelected = new Subject<User>();\r\n\tprivate _usernameSelected = new Subject<User>();\r\n\r\n @Input() maxLength: number = 1500;\r\n \r\n ngOnInit() {\r\n let maxTime = 100;\r\n let minTime = 0;\r\n let randomTime = minTime + Math.random() * (maxTime - minTime);\r\n\r\n setTimeout(() => {\r\n this.isNew = true;\r\n this.visible = true;\r\n setTimeout(() => this.isNew = false, 1000);\r\n }, randomTime);\r\n }\r\n\r\n markAttachmentsLoaded() {\r\n this.isLoaded = true;\r\n this.loaded.next();\r\n }\r\n\r\n @HostBinding('class.new')\r\n isNew = false;\r\n\r\n @HostBinding('class.highlighted')\r\n get isHighlighted() {\r\n return this.message?.transientState?.highlighted ?? false;\r\n }\r\n\r\n @HostBinding('class.visible')\r\n visible = false;\r\n\r\n private _message : ChatMessage;\r\n @Input()\r\n get message() {\r\n return this._message;\r\n }\r\n\r\n set message(value) {\r\n this._message = value;\r\n if (this._message.attachments?.length > 0) {\r\n this.isLoaded = false;\r\n } else {\r\n this.isLoaded = true;\r\n this.loaded.next();\r\n }\r\n }\r\n\r\n @Input()\r\n customMenuItems: MessageMenuItem[];\r\n\r\n @Input()\r\n showReplyAction = true;\r\n\r\n @Output()\r\n loaded = new Subject<void>();\r\n\r\n private isLoaded = false;\r\n\r\n async waitForLoad() {\r\n if (this.isLoaded)\r\n return true;\r\n await this.loaded.pipe(take(1)).toPromise();\r\n }\r\n\r\n\t@Output()\r\n get userSelected() {\r\n return this._userSelected.asObservable();\r\n }\r\n\r\n @Output()\r\n get usernameSelected() {\r\n return this._usernameSelected.asObservable();\r\n }\r\n\r\n\t@Output()\r\n\tget avatarSelected() {\r\n\t\treturn this._avatarSelected.asObservable();\r\n\t}\r\n\r\n @Output()\r\n get reported() {\r\n return this._reported.asObservable();\r\n }\r\n\r\n @Input() permissions: ChatPermissions;\r\n @Input() mine = false;\r\n \r\n @Input() editing = false;\r\n editedMessage: string;\r\n\r\n saveEdit() {\r\n this._edited.next(this.editedMessage);\r\n }\r\n\r\n endEditing() {\r\n this._editEnded.next();\r\n }\r\n\r\n startEdit() {\r\n this._editStarted.next();\r\n this.editedMessage = this.message.message;\r\n }\r\n\r\n delete() {\r\n this._deleted.next();\r\n }\r\n\r\n @Output()\r\n get liked() {\r\n return this._liked.asObservable();\r\n }\r\n\r\n @Output()\r\n get unliked() {\r\n return this._unliked.asObservable();\r\n }\r\n\r\n @Output()\r\n get selected() {\r\n return this._selected.asObservable();\r\n }\r\n\r\n private _editStarted = new Subject<void>();\r\n private _deleted = new Subject<void>();\r\n private _editEnded = new Subject<void>();\r\n private _edited = new Subject<string>();\r\n \r\n\r\n @Output() get edited() { return this._edited.asObservable(); }\r\n @Output() get deleted() { return this._deleted.asObservable(); }\r\n @Output() get editStarted() { return this._editStarted.asObservable(); }\r\n @Output() get editEnded() { return this._editEnded.asObservable(); }\r\n @Output() get shared(){ return this._shared.asObservable(); }\r\n\r\n @Input() genericAvatarUrl: string;\r\n\r\n @HostBinding('attr.data-comment-id') get commentId() { return this.message?.id; }\r\n\r\n report() {\r\n this._reported.next();\r\n }\r\n\r\n like() {\r\n this._liked.next();\r\n }\r\n\r\n unlike() {\r\n this._unliked.next();\r\n }\r\n\r\n share() {\r\n this._shared.next(this.message);\r\n }\r\n\r\n select() {\r\n this._selected.next();\r\n }\r\n\r\n\tselectUser() {\r\n this._userSelected.next();\r\n }\r\n\r\n selectUsername(user: User) {\r\n this._usernameSelected.next(user);\r\n\t\tthis.selectUser();\r\n }\r\n\r\n\tselectAvatar(user: User) {\r\n\t\tthis._avatarSelected.next(user);\r\n\t\tthis.selectUser();\r\n\t}\r\n\r\n avatarForUser(user : User) {\r\n let url = this.genericAvatarUrl;\r\n\r\n if (user && user.avatarUrl) {\r\n url = user.avatarUrl;\r\n }\r\n\r\n return `url(${url})`;\r\n }\r\n\r\n get replyCount() {\r\n return this.message.submessages?.length || this.message.submessageCount || 0;\r\n }\r\n}\r\n","import { Component, Input, ViewChild, ElementRef, Output, HostBinding, ViewChildren, QueryList } from \"@angular/core\";\r\nimport { User, ChatMessage, CommentsOrder } from '@banta/common';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport { ChatBackendBase } from \"../../chat-backend-base\";\r\nimport { ChatSourceBase } from \"../../chat-source-base\";\r\nimport { MessageMenuItem } from \"../../message-menu-item\";\r\nimport { CommentComponent } from \"../comment/comment.component\";\r\n\r\nexport interface EditEvent {\r\n message: ChatMessage;\r\n newMessage: string;\r\n}\r\n\r\n@Component({\r\n selector: 'banta-comment-view',\r\n templateUrl: './comment-view.component.html',\r\n styleUrls: ['./comment-view.component.scss']\r\n})\r\nexport class CommentViewComponent {\r\n constructor(\r\n private backend: ChatBackendBase\r\n ) {\r\n\r\n }\r\n\r\n private _sourceSubs = new Subscription();\r\n private _source: ChatSourceBase;\r\n private _selected = new Subject<ChatMessage>();\r\n private _liked = new Subject<ChatMessage>();\r\n private _unliked = new Subject<ChatMessage>();\r\n private _reported = new Subject<ChatMessage>();\r\n private _userSelected = new Subject<ChatMessage>();\r\n private _usernameSelected = new Subject<User>();\r\n private _avatarSelected = new Subject<User>();\r\n private _shared = new Subject<ChatMessage>();\r\n private _deleted = new Subject<ChatMessage>();\r\n private _messageEdited = new Subject<EditEvent>();\r\n\r\n @Input()\r\n showEmptyState = true;\r\n\r\n @Input()\r\n allowReplies = true;\r\n\r\n @Input() customMenuItems: MessageMenuItem[] = [];\r\n\r\n @ViewChildren(CommentComponent)\r\n commentsQuery: QueryList<CommentComponent>;\r\n\r\n get comments() {\r\n return Array.from(this.commentsQuery);\r\n }\r\n\r\n /**\r\n * Returns true if this message can be found within one of the message buffers (older, current, newer)\r\n * @param message \r\n */\r\n isMessageLoadedInContext(message: ChatMessage) {\r\n return this.olderMessages.find(x => x.id === message.id)\r\n || this.messages.find(x => x.id === message.id)\r\n || this.newMessages.find(x => x.id === message.id);\r\n }\r\n\r\n async loadMessageInContext(message: ChatMessage) {\r\n await this.sourceLoaded;\r\n \r\n console.log(`Loading message ${message.id} in context...`);\r\n while (this.hasMore && !this.isMessageLoadedInContext(message)) {\r\n console.log(`...Need to load more comments to find ${message.id}`);\r\n await this.showMore();\r\n }\r\n\r\n if (!this.isMessageLoadedInContext(message)) {\r\n console.error(`Error while loading message in context: Failed to find message ${message.id}, maybe it was deleted!`);\r\n return false;\r\n }\r\n\r\n let pageSize = this.maxVisibleMessages;\r\n let items = [].concat(this.olderMessages, this.messages, this.newMessages);\r\n let index = items.findIndex(x => x.id === message.id);\r\n\r\n if (index < 0) {\r\n console.error(`Error while loading message in context: Message was not present in message list!`);\r\n return false;\r\n }\r\n\r\n let startIndex = Math.max(0, index - pageSize / 2); \r\n this.newMessages = items.splice(0, startIndex);\r\n this.messages = items.splice(0, pageSize);\r\n this.olderMessages = items;\r\n this.isViewingMore = true;\r\n }\r\n\r\n /**\r\n * Get the CommentComponent instantiated for the given ChatMessage,\r\n * if it exists in the current view. Note that messages which are not \r\n * currently shown to the user will not return a CommentComponent.\r\n * @param message \r\n * @returns \r\n */\r\n getCommentComponentForMessage(message: ChatMessage) {\r\n if (!message)\r\n throw new Error(`You must pass a valid ChatMessage`);\r\n return this.comments.find(x => x.message?.id === message.id);\r\n }\r\n\r\n @Input()\r\n @HostBinding('class.fixed-height')\r\n fixedHeight: boolean;\r\n\r\n @Input()\r\n selectedMessage: ChatMessage;\r\n \r\n @Output()\r\n get selected() {\r\n return this._selected;\r\n }\r\n\r\n @Output() \r\n get messageEdited() {\r\n return this._messageEdited.asObservable();\r\n }\r\n\r\n saveEdit(message: ChatMessage, newMessage: string) {\r\n this._messageEdited.next({ message, newMessage });\r\n }\r\n\r\n @Output() get userSelected() { return this._userSelected; }\r\n @Output() get reported() { return this._reported; }\r\n @Output() get liked() { return this._liked; }\r\n @Output() get unliked() { return this._unliked; }\r\n @Output() get usernameSelected() { return this._usernameSelected; }\r\n @Output() get avatarSelected() { return this._avatarSelected; }\r\n @Output() get shared() { return this._shared; }\r\n @Output() get deleted() { return this._deleted; }\r\n\r\n menuMessage: ChatMessage = null;\r\n messages: ChatMessage[] = [];\r\n currentUser: User;\r\n\r\n @Input()\r\n get source() {\r\n return this._source;\r\n }\r\n\r\n likeMessage(message: ChatMessage) {\r\n this._liked.next(message);\r\n }\r\n\r\n unlikeMessage(message: ChatMessage) {\r\n this._unliked.next(message);\r\n }\r\n\r\n reportMessage(message: ChatMessage) {\r\n this._reported.next(message);\r\n }\r\n\r\n selectMessage(message: ChatMessage) {\r\n this._selected.next(message);\r\n }\r\n\r\n selectMessageUser(message: ChatMessage) {\r\n this._userSelected.next(message);\r\n }\r\n\r\n selectUsername(user: User) {\r\n this._usernameSelected.next(user);\r\n }\r\n\r\n selectAvatar(user: User) {\r\n this._avatarSelected.next(user);\r\n }\r\n\r\n sharedMessage(message: ChatMessage) {\r\n this._shared.next(message);\r\n }\r\n\r\n startEditing(message: ChatMessage) {\r\n this.messages.forEach(m => m.transientState.editing = false);\r\n message.transientState.editing = true;\r\n }\r\n\r\n deleteMessage(message: ChatMessage) {\r\n this._deleted.next(message);\r\n }\r\n\r\n customSortEnabled = false;\r\n\r\n markSourceLoaded: () => void;\r\n sourceLoaded = new Promise<void>(r => this.markSourceLoaded = r);\r\n\r\n set source(value) {\r\n this.customSortEnabled = value?.sortOrder !== CommentsOrder.NEWEST;\r\n this.newMessages = [];\r\n this.olderMessages = [];\r\n\r\n (window as any).bantaSourceDebug = value;\r\n\r\n if (this._sourceSubs) {\r\n this._sourceSubs.unsubscribe();\r\n this._sourceSubs = null;\r\n }\r\n this._source = value;\r\n\r\n if (value) {\r\n const messages = (value.messages || []).slice();\r\n this.messages = messages;\r\n this.olderMessages = messages.splice(this.maxVisibleMessages, messages.length);\r\n this.hasMore = true; //this.olderMessages.length > 0;\r\n\r\n this._sourceSubs = new Subscription();\r\n this._sourceSubs.add(this._source.messageReceived.subscribe(msg => this.messageReceived(msg)));\r\n this._sourceSubs.add(this._source.messageSent.subscribe(msg => this.messageSent(msg)));\r\n\r\n this._sourceSubs.add(\r\n this.backend.userChanged.subscribe(user => this.currentUser = user)\r\n );\r\n\r\n this.getInitialMessages();\r\n }\r\n }\r\n\r\n private async getInitialMessages() {\r\n let messages = (await this._source.getExistingMessages());\r\n messages.forEach(m => m.transientState ??= {});\r\n this.messages = this.newestLast ? messages.slice().reverse() : messages;\r\n this.sortMessages();\r\n if (this.markSourceLoaded)\r\n this.markSourceLoaded();\r\n }\r\n\r\n @Input()\r\n genericAvatarUrl: string;\r\n\r\n @ViewChild('messageContainer')\r\n messageContainer: ElementRef<HTMLElement>;\r\n\r\n @Input()\r\n maxMessages = 2000;\r\n\r\n @Input()\r\n maxVisibleMessages: number = 200;\r\n\r\n @Input()\r\n newestLast = false;\r\n\r\n isViewingMore = false;\r\n isLoadingMore = false;\r\n hasMore = false;\r\n\r\n newMessages: ChatMessage[] = [];\r\n olderMessages: ChatMessage[] = [];\r\n\r\n messageIdentity(index: number, chatMessage: ChatMessage) {\r\n return chatMessage.id;\r\n }\r\n\r\n @Output()\r\n sortOrderChanged = new Subject<CommentsOrder>();\r\n\r\n async showNew() {\r\n let naturalOrder = CommentsOrder.NEWEST;\r\n if (this.source && this.source.sortOrder !== naturalOrder) {\r\n this.sortOrderChanged.next(naturalOrder);\r\n return;\r\n }\r\n\r\n this.isViewingMore = false;\r\n\r\n if (this.newestLast)\r\n this.messages = this.messages.concat(this.newMessages.splice(0, this.newMessages.length));\r\n else\r\n this.messages = this.newMessages.splice(0, this.newMessages.length).concat(this.messages);\r\n let overflow = this.messages.splice(this.maxVisibleMessages, this.messages.length);\r\n this.olderMessages = overflow.concat(this.olderMessages);\r\n this.olderMessages.splice(this.maxMessages - this.maxVisibleMessages, this.olderMessages.length);\r\n this.hasMore = this.olderMessages.length > 0;\r\n }\r\n\r\n async showMore() {\r\n this.isViewingMore = true;\r\n\r\n if (this.olderMessages.length > 0) {\r\n this.isLoadingMore = false;\r\n this.messages = this.messages.concat(this.olderMessages.splice(0, 50));\r\n }\r\n this.isLoadingMore = true;\r\n\r\n let nextPageSize = 20;\r\n let lastMessage: ChatMessage;\r\n\r\n if (this.newestLast) {\r\n lastMessage = this.olderMessages[0] ?? this.messages[0];\r\n } else {\r\n lastMessage = this.olderMessages[this.olderMessages.length - 1] ?? this.messages[this.messages.length - 1];\r\n }\r\n\r\n if (!lastMessage) {\r\n this.isLoadingMore = false;\r\n this.hasMore = false;\r\n return;\r\n }\r\n\r\n let messages = await this.source.loadAfter(lastMessage, nextPageSize);\r\n\r\n if (this.newestLast)\r\n messages = messages.slice().reverse();\r\n \r\n messages.forEach(m => m.transientState ??= {});\r\n\r\n if (this.newestLast)\r\n this.messages = messages.concat(this.messages);\r\n else\r\n this.messages = this.messages.concat(messages);\r\n this.isLoadingMore = false;\r\n if (messages.length === 0) {\r\n console.log(`Reached the end of the list.`);\r\n this.hasMore = false;\r\n }\r\n }\r\n\r\n private addMessage(message: ChatMessage) {\r\n\r\n if (!message.transientState)\r\n message.transientState ??= {};\r\n \r\n let destination = this.messages;\r\n let bucket = this.olderMessages;\r\n let newestLast = this.newestLast;\r\n\r\n if (this.isViewingMore) {\r\n destination = this.newMessages;\r\n bucket = null;\r\n }\r\n\r\n \r\n if (newestLast) {\r\n destination.push(message);\r\n let overflow = destination.splice(this.maxVisibleMessages, destination.length);\r\n bucket?.push(...overflow);\r\n } else {\r\n destination.unshift(message);\r\n let overflow = destination.splice(this.maxVisibleMessages, destination.length);\r\n bucket?.unshift(...overflow);\r\n }\r\n\r\n if (bucket?.length > 0)\r\n this.hasMore = true;\r\n\r\n message.pagingCursor = String(this.incrementPagingCursors());\r\n this.sortMessages();\r\n }\r\n\r\n private incrementPagingCursors() {\r\n if (this.source.sortOrder !== CommentsOrder.NEWEST)\r\n return;\r\n \r\n let maxPagingCursor = 0;\r\n for (let group of [this.messages, this.olderMessages, this.newMessages]) {\r\n for (let message of group) {\r\n if (message.pagingCursor) {\r\n let pagingCursor = Number(message.pagingCursor) + 1;\r\n if (pagingCursor > maxPagingCursor)\r\n maxPagingCursor = pagingCursor;\r\n message.pagingCursor = String(pagingCursor);\r\n }\r\n }\r\n }\r\n\r\n return maxPagingCursor;\r\n }\r\n\r\n /**\r\n * Wait for all currently visible comments to be fully loaded, including all attachments.\r\n * Doing this will prevent layout shift when scrolling to a specific comment.\r\n */\r\n async waitForAllCommentsToLoad() {\r\n await new Promise(r => setTimeout(r, 100));\r\n await this.sourceLoaded;\r\n await Promise.all(this.comments.map(x => x.waitForLoad()));\r\n }\r\n\r\n private sortMessages() {\r\n if (!this.source)\r\n return;\r\n \r\n let sorter: (a: ChatMessage, b: ChatMessage) => number;\r\n\r\n if (this.source.sortOrder === CommentsOrder.LIKES)\r\n sorter = (a, b) => b.likes - a.likes;\r\n else if (this.source.sortOrder === CommentsOrder.NEWEST)\r\n sorter = (a, b) => (b.sentAt - a.sentAt) * (this.newestLast ? -1 : 1);\r\n else if (this.source.sortOrder === CommentsOrder.OLDEST)\r\n sorter = (a, b) => (a.sentAt - b.sentAt) * (this.newestLast ? -1 : 1);\r\n\r\n this.messages.sort(sorter);\r\n this.olderMessages.sort(sorter);\r\n this.newMessages.sort(sorter);\r\n }\r\n\r\n private messageReceived(message: ChatMessage) {\r\n this.addMessage(message);\r\n\r\n if (this.isScrolledToLatest())\r\n setTimeout(() => this.scrollToLatest());\r\n }\r\n\r\n isScrolledToLatest() {\r\n if (!this.messageContainer)\r\n return false;\r\n\r\n const el = this.messageContainer.nativeElement;\r\n const currentScroll = el.scrollTop;\r\n const currentTotal = el.scrollHeight - el.offsetHeight;\r\n\r\n return currentScroll > currentTotal - 10;\r\n }\r\n\r\n private messageSent(message: ChatMessage) {\r\n this.addMessage(message);\r\n\r\n if (!this.messageContainer)\r\n return;\r\n\r\n this.scrollToLatest();\r\n }\r\n\r\n scrollToLatest() {\r\n if (!this.messageContainer)\r\n return;\r\n\r\n const el = this.messageContainer.nativeElement;\r\n el.scrollTop = el.scrollHeight;\r\n }\r\n\r\n mentionsMe(message: ChatMessage) {\r\n if (!this.currentUser)\r\n return false;\r\n\r\n if (message.message.includes(`@${this.currentUser.username}`))\r\n return true;\r\n\r\n return false;\r\n }\r\n}\r\n","import { Directive } from \"@angular/core\";\r\n\r\n@Directive({\r\n selector: `[bantaReplySendOptions]`\r\n})\r\nexport class BantaReplySendOptionsDirective {}","/// <reference types=\"@types/resize-observer-browser\" />\r\n\r\nimport { Component, ContentChild, ElementRef, HostBinding, Input, NgZone, Output, QueryList, TemplateRef, ViewChild, ViewChildren } from '@angular/core';\r\nimport { User, ChatMessage, CommentsOrder } from '@banta/common';\r\nimport { HashTag } from '../comment-field/comment-field.component';\r\nimport { Subject, Observable, Subscription } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\n\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { ChatBackendBase } from '../../chat-backend-base';\r\nimport { ChatSourceBase } from '../../chat-source-base';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { BantaReplySendOptionsDirective } from '../reply-send-options.directive';\r\nimport { MessageMenuItem } from '../../message-menu-item';\r\nimport { CommentViewComponent } from '../comment-view/comment-view.component';\r\nimport { CommentComponent } from '../comment/comment.component';\r\n\r\n/**\r\n * Comments component\r\n */\r\n@Component({\r\n selector: 'banta-comments',\r\n templateUrl: './banta-comments.component.html',\r\n styleUrls: ['./banta-comments.component.scss']\r\n})\r\nexport class BantaCommentsComponent {\r\n constructor(\r\n private backend: ChatBackendBase,\r\n private elementRef: ElementRef<HTMLElement>,\r\n private activatedRoute: ActivatedRoute,\r\n private matSnackBar: MatSnackBar,\r\n private ngZone: NgZone\r\n ) {\r\n this.sendMessage = async (message: ChatMessage) => {\r\n try {\r\n const intercept = await this.shouldInterceptMessageSend?.(message, this.source);\r\n if (!intercept) {\r\n await this.source.send(message);\r\n }\r\n\r\n if (this.source.sortOrder !== CommentsOrder.NEWEST) {\r\n this.sortOrder = CommentsOrder.NEWEST;\r\n }\r\n return true;\r\n } catch (e) {\r\n this.handleBackendException(e, 'Could not send: ');\r\n }\r\n }\r\n\r\n this.sendReply = async (message: ChatMessage) => {\r\n try {\r\n const intercept = await this.shouldInterceptMessageSend?.(message, this.selectedMessageThread);\r\n if (!intercept) {\r\n await this.selectedMessageThread.send(message);\r\n }\r\n return true;\r\n } catch (e) {\r\n this.handleBackendException(e, 'Could not send reply: ');\r\n }\r\n }\r\n }\r\n\r\n get element() {\r\n return this.elementRef.nativeElement;\r\n }\r\n\r\n private handleBackendExceptionAsAlert(e: Error, prefix: string = '') {\r\n try {\r\n this.handleBackendException(e, prefix);\r\n } catch (e) {\r\n alert(e.message);\r\n }\r\n }\r\n\r\n private handleBackendException(e: Error, prefix: string = '') {\r\n let errorMessage = e.message;\r\n\r\n if (errorMessage.startsWith('permission-denied|')) {\r\n errorMessage = errorMessage.replace(/^permission-denied\\|/, '');\r\n\r\n if (errorMessage.startsWith(`app-handle|`)) {\r\n // If this is an error during authorizeAction on the backend, pass control to the user-provided \r\n // permission-denied handler.\r\n\r\n this.sendPermissionDenied(errorMessage.replace(/^app-handle\\|/, ''));\r\n return;\r\n }\r\n }\r\n\r\n throw new Error(`${prefix}${errorMessage}`);\r\n }\r\n\r\n // Lifecycle Events / Initialization\r\n\r\n ngOnInit() {\r\n this._subs.add(this.backend.userChanged.subscribe(user => this.user = user));\r\n this.startLoading();\r\n\r\n if (typeof window !== 'undefined') {\r\n let queryString = window.location.search.substring(1);\r\n let query = queryString.split('&')\r\n .map(s => s.split('='))\r\n .reduce((o, [k, v]) => (o[decodeURIComponent(k)] = decodeURIComponent(v), o), {})\r\n ;\r\n\r\n const commentID = query['comment'];\r\n if (commentID) {\r\n this.sharedCommentID = commentID;\r\n }\r\n }\r\n }\r\n\r\n private resizeObserver: ResizeObserver;\r\n private width: number;\r\n private height: number;\r\n\r\n @HostBinding('class.banta-mobile')\r\n isMobileSized: boolean = false;\r\n\r\n @ContentChild(BantaReplySendOptionsDirective, {read: TemplateRef}) \r\n sendReplyOptionsTemplate: any;\r\n\r\n markViewReady: () => void;\r\n viewReady = new Promise<void>(r => this.markViewReady = r);\r\n\r\n ngAfterViewInit() {\r\n if (typeof window !== 'undefined') {\r\n let callback = () => {\r\n let size = this.elementRef.nativeElement.getBoundingClientRect();\r\n this.ngZone.run(() => {\r\n setTimeout(() => {\r\n this.width = size.width;\r\n this.height = size.height;\r\n this.isMobileSized = this.width < 500;\r\n });\r\n })\r\n };\r\n\r\n if (typeof ResizeObserver !== 'undefined') {\r\n this.resizeObserver = new ResizeObserver(callback);\r\n this.resizeObserver.observe(this.elementRef.nativeElement);\r\n } else {\r\n // One check is better than nothing!\r\n setTimeout(() => {\r\n this.width = this.elementRef.nativeElement.clientWidth;\r\n this.height = this.elementRef.nativeElement.clientHeight;\r\n this.isMobileSized = this.width < 500;\r\n }, 1000);\r\n }\r\n\r\n callback();\r\n }\r\n\r\n this.markViewReady();\r\n }\r\n\r\n ngOnDestroy() {\r\n this._subs.unsubscribe();\r\n if (this.resizeObserver)\r\n this.resizeObserver.disconnect();\r\n }\r\n\r\n private async setSourceFromTopicID(topicID: string) {\r\n if (typeof window === 'undefined')\r\n return;\r\n\r\n setTimeout(async () => {\r\n console.log(`[banta-comments] Subscribing to topic source '${topicID}'`);\r\n this.source = await this.backend.getSourceForTopic(topicID, { sortOrder: this.sortOrder });\r\n this._sourceIsOwned = true;\r\n });\r\n }\r\n\r\n // Loading Screen\r\n private _loadingMessage = '';\r\n loadingMessageVisible = false;\r\n\r\n get loadingMessage() {\r\n return this._loadingMessage;\r\n }\r\n\r\n set loadingMessage(value) {\r\n this.loadingMessageVisible = false;\r\n setTimeout(() => {\r\n this._loadingMessage = value;\r\n this._loadingMessage = value;\r\n setTimeout(() => {\r\n this.loadingMessageVisible = true;\r\n })\r\n }, 500);\r\n }\r\n\r\n loading: boolean = true;\r\n showLoadingScreen = false;\r\n loadingStartedAt: number;\r\n messageChangedAt: number;\r\n sharedCommentID: string;\r\n lastSharedCommentID: string;\r\n\r\n @Input() customMenuItems: MessageMenuItem[] = [];\r\n\r\n private async startLoading() {\r\n this.loadingStartedAt = this.messageChangedAt = Date.now();\r\n\r\n if (this.updateLoading()) return;\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 100));\r\n if (this.updateLoading()) return;\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 250));\r\n if (this.updateLoading()) return;\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 500));\r\n if (this.updateLoading()) return;\r\n\r\n console.log(`[Banta] Loading is taking a long time! Showing loading screen.`);\r\n this.showLoadingScreen = true;\r\n if (typeof window !== 'undefined')\r\n this._loadingTimer = setInterval(() => this.updateLoading(), 1000);\r\n }\r\n \r\n private _loadingTimer;\r\n private _loadingMessageIndex = 0;\r\n\r\n @Input() maxCommentLength: number = 1500;\r\n @Input() loadingMessages: string[] = [\r\n `Just a second...`,\r\n `We're definitely working on it.`,\r\n `There's no need to refresh.`,\r\n `It's definitely worth the wait!`,\r\n `This has never happened before.`,\r\n `We'll keep trying, but it's not looking great. \r\n Commenting & chat services may be down. \r\n If you continue to experience issues, please contact support.\r\n `\r\n ];\r\n\r\n @Input() useInlineReplies = true;\r\n\r\n /**\r\n * Access the CommentViewComponent for this BantaCommentsComponent. \r\n * CommentViewComponent is responsible for interacting with the ChatSource \r\n * object and rendering comments as CommentComponents. It is the source of \r\n * truth for which CommentComponent corresponds to which ChatMessage. \r\n * \r\n * Note that this CommentViewComponent is only for the top level comments.\r\n * Replies are handled by a separate CommentViewComponent which can be \r\n * retrieved using the threadView property.\r\n */\r\n @ViewChild('commentView')\r\n commentView: CommentViewComponent;\r\n\r\n @ViewChildren(CommentViewComponent)\r\n threadViewQuery: QueryList<CommentViewComponent>;\r\n\r\n /**\r\n * Attempts to find the CommentComponent that corresponds to the given ChatMessage.\r\n * The ChatMessage could be a top-level message in this conversation, or a reply, \r\n * but note that a CommentComponent will only exist for a reply if the user has \r\n * the relevant reply thread open.\r\n * @param message The message to look for\r\n */\r\n getCommentComponentForMessage(message: ChatMessage): CommentComponent {\r\n if (message.parentMessageId)\r\n return this.threadView?.getCommentComponentForMessage(message);\r\n else\r\n return this.commentView.getCommentComponentForMessage(message)\r\n }\r\n\r\n /**\r\n * Access the CommentViewComponent corresponding to the currently open reply thread.\r\n * This is not the top level comments, but instead the reply thread that the user has \r\n * opened (only one set of replies can be open at a time).\r\n * \r\n * For details about what CommentViewComponent affords you, see the commentView property.\r\n */\r\n get threadView() {\r\n return Array.from(this.threadViewQuery).filter(x => x !== this.commentView)[0];\r\n }\r\n\r\n async waitForThreadView() {\r\n if (this.threadView)\r\n return this.threadView;\r\n \r\n await this.threadViewQuery.changes.pipe(take(1)).toPromise();\r\n return this.threadView;\r\n }\r\n\r\n markLoaded: () => void;\r\n loaded = new Promise<void>(r => this.markLoaded = r);\r\n\r\n private updateLoading(): boolean {\r\n if (this.source?.state && this.source?.state !== 'connecting') {\r\n clearInterval(this._loadingTimer);\r\n this.loadingMessage = `Here we go!`;\r\n setTimeout(() => {\r\n this.loading = false;\r\n this.markLoaded();\r\n }, 750);\r\n return true;\r\n }\r\n\r\n let messageSwitchTime = 5*1000;\r\n if (this.messageChangedAt + messageSwitchTime < Date.now()) {\r\n if (this.loadingMessages[this._loadingMessageIndex]) {\r\n this.loadingMessage = this.loadingMessages[this._loadingMessageIndex++];\r\n this.messageChangedAt = Date.now();\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n // Properties\r\n\r\n private _signInSelected = new Subject<void>();\r\n private _permissionDeniedError = new Subject<string>();\r\n private _editAvatarSelected = new Subject<void>();\r\n private _upvoted = new Subject<ChatMessage>();\r\n private _reported = new Subject<ChatMessage>();\r\n private _selected = new Subject<ChatMessage>();\r\n private _userSelected = new Subject<ChatMessage>();\r\n private _shared = new Subject<ChatMessage>();\r\n private _usernameSelected = new Subject<User>();\r\n private _avatarSelected = new Subject<User>();\r\n private _source: ChatSourceBase;\r\n\r\n /**\r\n * Track whether we created this source. If we did not (ie it was passed in from the caller),\r\n * then we are not responsible for calling close(). If we do own it though, we will call close() \r\n * when we are done with it.\r\n */\r\n private _sourceIsOwned = false;\r\n private _subs = new Subscription();\r\n private _sortOrder: CommentsOrder = CommentsOrder.NEWEST;\r\n private _topicID: string;\r\n \r\n user: User;\r\n selectedMessage: ChatMessage;\r\n selectedMessageThread: ChatSourceBase;\r\n selectedMessageVisible = false;\r\n\r\n // Inputs\r\n\r\n @Input() signInLabel = 'Sign In';\r\n @Input() sendLabel = 'Send';\r\n @Input() replyLabel = 'Reply';\r\n @Input() sendingLabel = 'Sending';\r\n @Input() permissionDeniedLabel = 'Send';\r\n @Input() postCommentLabel = 'Post a comment';\r\n @Input() postReplyLabel = 'Post a reply';\r\n @Input() allowAttachments = true;\r\n @Input() fixedHeight: boolean;\r\n @Input() maxMessages: number;\r\n @Input() maxVisibleMessages: number = 20;\r\n @Input() genericAvatarUrl = `https://gravatar.com/avatar/${Date.now().toString(16)}?s=512&d=robohash`;\r\n\r\n @Input() shouldInterceptMessageSend?: (message: ChatMessage, source: ChatSourceBase) => boolean | Promise<boolean>;\r\n @Input() participants: User[] = [];\r\n\r\n private _sourceSubscription: Subscription;\r\n\r\n @Input()\r\n get source(): ChatSourceBase { return this._source; }\r\n set source(value) { \r\n if (this._source && this._sourceIsOwned) {\r\n this._source.close();\r\n this._sourceSubscription?.unsubscribe();\r\n this._source = null;\r\n this.participants = [];\r\n }\r\n\r\n this._source = value;\r\n this._sourceIsOwned = false; // Assume we don't own this source.\r\n this._sourceSubscription = new Subscription();\r\n \r\n if (value) {\r\n if (this.sharedCommentID) {\r\n this.navigateToSharedComment(this.sharedCommentID);\r\n this.lastSharedCommentID = this.sharedCommentID;\r\n this.sharedCommentID = null;\r\n }\r\n\r\n this._source.messages.forEach(m => this.addParticipant(m));\r\n\r\n this._sourceSubscription.add(this._source.messageReceived.subscribe(m => this.addParticipant(m)));\r\n this._sourceSubscription.add(this._source.messageSent.subscribe(m => this.addParticipant(m)));\r\n this._sourceSubscription.add(this._source.messageObserved.subscribe(m => this.addParticipant(m)));\r\n this._sourceSubscription.add(\r\n this._source.messageUpdated.subscribe(msg => {\r\n console.log(`comments received message: `, msg);\r\n if (msg.id === this.selectedMessage?.id && msg.hidden) {\r\n this.unselectMessage();\r\n this.matSnackBar.open(\r\n \"The thread you were viewing was removed.\",\r\n undefined,\r\n {\r\n duration: 2500\r\n }\r\n )\r\n }\r\n })\r\n );\r\n\r\n }\r\n }\r\n @Input() \r\n hashtags: HashTag[] = [\r\n {hashtag: 'error', description: 'Cause an error'},\r\n {hashtag: 'timeout', description: 'Cause a slow timeout error'},\r\n {hashtag: 'slow', description: 'Be slow when this message is posted'},\r\n ];\r\n @Input()\r\n get topicID(): string { return this._topicID; }\r\n set topicID(value) {\r\n if (this._topicID !== value) {\r\n this._topicID = value;\r\n setTimeout(() => this.setSourceFromTopicID(value));\r\n }\r\n }\r\n\r\n // Outputs\r\n\r\n @Output() get signInSelected(): Observable<void> { return this._signInSelected; }\r\n @Output() get editAvatarSelected() { return this._editAvatarSelected; }\r\n @Output() get permissionDeniedError(): Observable<string> { return this._permissionDeniedError; }\r\n @Output() get upvoted() { return this._upvoted.asObservable(); }\r\n @Output() get reported() { return this._reported.asObservable(); }\r\n @Output() get selected() { return this._selected.asObservable(); }\r\n @Output() get userSelected() { return this._userSelected.asObservable(); }\r\n @Output() get usernameSelected() { return this._usernameSelected.asObservable(); }\r\n @Output() get avatarSelected() { return this._avatarSelected.asObservable(); }\r\n @Output() get shared() { return this._shared.asObservable(); }\r\n\r\n get sortOrder() { return this._sortOrder; }\r\n set sortOrder(value) {\r\n if (this._sortOrder !== value) {\r\n this._sortOrder = value;\r\n setTimeout(() => {\r\n this.setSourceFromTopicID(this.topicID);\r\n });\r\n }\r\n }\r\n\r\n sendMessage: (message: ChatMessage) => void;\r\n sendReply: (message: ChatMessage) => void;\r\n\r\n // UI Interactions\r\n\r\n async scrollToComment(commentId: ChatMessage['id']) {\r\n if (typeof window === 'undefined')\r\n return;\r\n \r\n await this.commentView.waitForAllCommentsToLoad();\r\n\r\n const comment = document.querySelector(`[data-comment-id=\"${commentId}\"]`);\r\n if (comment) {\r\n comment.scrollIntoView({\r\n inline: 'center',\r\n block: 'center'\r\n });\r\n }\r\n }\r\n\r\n loadingSharedComment = false;\r\n sharedCommentMissing = false;\r\n\r\n async navigateToSharedComment(id: string) {\r\n this.loadingSharedComment = true;\r\n await new Promise(r => setTimeout(r, 10));\r\n this.sharedCommentMissing = false;\r\n let source = this.source;\r\n\r\n await source.ready;\r\n await this.viewReady;\r\n await this.loaded;\r\n \r\n console.log(`Navigating to shared comment with ID '${id}'...`);\r\n let message: ChatMessage;\r\n \r\n try {\r\n message = await this.source.get(id);\r\n } catch (e) {\r\n console.error(`Failed to find comment from URL: ${e.message}`);\r\n this.sharedCommentMissing = true;\r\n this.loadingSharedComment = false;\r\n\r\n if (typeof window !== 'undefined') {\r\n setTimeout(() => {\r\n let notice = this.element.querySelector('.loading-comment');\r\n notice.scrollIntoView({\r\n block: 'center',\r\n inline: 'center'\r\n });\r\n }, 200);\r\n }\r\n return;\r\n }\r\n\r\n message.transientState ??= {};\r\n\r\n // If there is a parent message, we should instead focus that and let the \r\n // scrollToComment and highlight do the work.\r\n\r\n if (message.parentMessageId) {\r\n\r\n let parentMessage = await this.source.get(message.parentMessageId);\r\n parentMessage.transientState ??= {};\r\n \r\n // Make sure that this message is loaded and visible to the user\r\n await this.commentView.loadMessageInContext(parentMessage);\r\n \r\n let thread = await this.selectMessage(parentMessage); \r\n\r\n // Need to re-retrieve the message within the new chat source to affect its\r\n // transient state.\r\n await thread.ready;\r\n \r\n // Make sure that this message is loaded and visible to the user\r\n await this.waitForThreadView();\r\n await this.threadView.loadMessageInContext(message);\r\n\r\n message = await thread.get(message.id);\r\n message.transientState ??= {};\r\n message.transientState.highlighted = true;\r\n console.dir(message);\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 500));\r\n\r\n } else {\r\n // Make sure that this message is loaded and visible to the user\r\n await this.commentView.loadMessageInContext(message);\r\n\r\n message.transientState ??= {};\r\n message.transientState.highlighted = true;\r\n }\r\n\r\n this.loadingSharedComment = false;\r\n await this.scrollToComment(id);\r\n }\r\n\r\n handlePermissionDenied(errorMessage: string) {\r\n // This is what other components call when handling permission errors\r\n \r\n if (errorMessage.startsWith(`app-handle|`)) {\r\n // If this is an error during authorizeAction on the backend, pass control to the user-provided \r\n // permission-denied handler.\r\n\r\n this.sendPermissionDenied(errorMessage.replace(/^app-handle\\|/, ''));\r\n return;\r\n }\r\n\r\n alert(errorMessage);\r\n }\r\n\r\n sendPermissionDenied(message: string) {\r\n this._permissionDeniedError.next(message);\r\n }\r\n\r\n scrollToMessage(message: ChatMessage) {\r\n let el = this.elementRef.nativeElement.querySelector(`[data-comment-id=\"${message.id}\"]`);\r\n if (!el)\r\n return;\r\n el.scrollIntoView({block: 'center', inline: 'start'});\r\n }\r\n\r\n private addParticipant(message: ChatMessage) {\r\n if (!message || !message.user || !message.user.id)\r\n return;\r\n\r\n let existing = this.participants.find(x => x.id === message.user.id);\r\n if (existing)\r\n return;\r\n this.participants.push(message.user);\r\n }\r\n\r\n // Actions\r\n\r\n async likeMessage(source: ChatSourceBase, message: ChatMessage) {\r\n if (!this.user) {\r\n await this.showSignIn();\r\n return;\r\n }\r\n\r\n this._upvoted.next(message);\r\n message.transientState.liking = true;\r\n \r\n try {\r\n await source.likeMessage(message.id);\r\n } catch (e) {\r\n this.handleBackendExceptionAsAlert(e, 'Could not like this message: ');\r\n } finally {\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 250));\r\n message.transientState.liking = false;\r\n }\r\n }\r\n\r\n async unlikeMessage(source: ChatSourceBase, message: ChatMessage) {\r\n if (!this.user) {\r\n await this.showSignIn();\r\n return;\r\n }\r\n\r\n this._upvoted.next(message);\r\n message.transientState.liking = true;\r\n\r\n if (message.userState?.liked)\r\n message.likes = (message.likes || 0) - 1;\r\n\r\n try {\r\n await source.unlikeMessage(message.id);\r\n } catch (e) {\r\n this.handleBackendExceptionAsAlert(e, 'Failed to unlike this message: ');\r\n }\r\n\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 250));\r\n message.transientState.liking = false;\r\n }\r\n\r\n async reportMessage(message: ChatMessage) {\r\n this._reported.next(message);\r\n }\r\n\r\n async unselectMessage() {\r\n let message = this.selectedMessage;\r\n\r\n this._selected.next(null);\r\n this.selectedMessage = null;\r\n if (this.selectedMessageThread) {\r\n if (this.selectedMessageThread.close)\r\n this.selectedMessageThread.close();\r\n this.selectedMessageThread = null;\r\n }\r\n\r\n if (message)\r\n setTimeout(() => this.scrollToMessage(message));\r\n }\r\n\r\n async toggleSelectedMessage(message: ChatMessage) {\r\n if (this.selectedMessage === message) {\r\n await this.unselectMessage();\r\n } else {\r\n await this.selectMessage(message);\r\n }\r\n }\r\n\r\n async selectMessage(message: ChatMessage) {\r\n if (this.selectedMessage === message) {\r\n console.log(`[Banta] Thread ${this.topicID}/${message.id} is already open.`);\r\n return this.selectedMessageThread;\r\n }\r\n\r\n this._selected.next(message);\r\n\r\n console.log(`[Banta] Opening thread for ${this.topicID}/${message.id}...`);\r\n let selectedMessageThread = await this.backend.getSourceForThread(this.topicID, message.id);\r\n\r\n if (!selectedMessageThread) {\r\n console.warn(`Failed to locate thread for message ${this.topicID}/${message.id}!`);\r\n return null;\r\n }\r\n\r\n console.log(`[Banta] Thread opened for ${this.topicID}/${message.id}.`);\r\n\r\n setTimeout(() => this.selectedMessageVisible = true);\r\n setTimeout(async () => {\r\n this.selectedMessage = message;\r\n this.selectedMessageThread = selectedMessageThread;\r\n }, 250);\r\n\r\n return selectedMessageThread;\r\n }\r\n\r\n async showSignIn() {\r\n this._signInSelected.next();\r\n }\r\n\r\n async showEditAvatar() {\r\n this._editAvatarSelected.next();\r\n }\r\n\r\n async selectMessageUser(message: ChatMessage) {\r\n this._userSelected.next(message);\r\n }\r\n\r\n async selectUsername(user: User) {\r\n this._usernameSelected.next(user);\r\n }\r\n\r\n async selectAvatar(user: User) {\r\n this._avatarSelected.next(user);\r\n }\r\n\r\n async shareMessage(message: ChatMessage) {\r\n this._shared.next(message);\r\n }\r\n\r\n async deleteMessage(message: ChatMessage) {\r\n if (!this.user) {\r\n await this.showSignIn();\r\n return;\r\n }\r\n\r\n if (!confirm(\"Are you sure you want to delete this comment? You cannot undo this action.\"))\r\n return;\r\n\r\n try {\r\n await this.source.deleteMessage(message.id);\r\n\r\n if (this.selectedMessage?.id === message.id)\r\n this.unselectMessage();\r\n\r\n } catch (e) {\r\n this.handleBackendExceptionAsAlert(e, `Could not delete message: `);\r\n }\r\n }\r\n\r\n async editMessage(source: ChatSourceBase, message: ChatMessage, newText: string) {\r\n if (!this.user) {\r\n await this.showSignIn();\r\n return;\r\n }\r\n\r\n try {\r\n await source.editMessage(message.id, newText);\r\n } catch (e) {\r\n this.handleBackendExceptionAsAlert(e, 'Could not edit this message: ');\r\n return;\r\n }\r\n\r\n message.message = newText;\r\n message.transientState.editing = false;\r\n }\r\n\r\n async startEditing(message: ChatMessage) {\r\n this.selectedMessage.transientState.editing = false;\r\n message.transientState.editing = true;\r\n }\r\n\r\n async saveEdit(message: ChatMessage, text: string) {\r\n if (!this.user) {\r\n await this.showSignIn();\r\n return;\r\n }\r\n \r\n try {\r\n await this.source.editMessage(message.id, text);\r\n message.transientState.editing = false;\r\n } catch (e) {\r\n this.handleBackendExceptionAsAlert(e, `Could not edit message: `);\r\n }\r\n }\r\n}\r\n","import { Component, Input, Output } from '@angular/core';\r\nimport { ChatMessage } from '@banta/common';\r\nimport { Subject, Observable } from 'rxjs';\r\nimport { ChatBackendBase } from '../chat-backend-base';\r\n\r\n@Component({\r\n selector: 'banta-live-comment',\r\n template: `\r\n <banta-comment \r\n *ngIf=\"message\"\r\n [message]=\"message\"\r\n (upvoted)=\"upvote()\"\r\n (reported)=\"report()\"\r\n (selected)=\"select()\"\r\n ></banta-comment>\r\n `,\r\n styles: [``]\r\n})\r\nexport class LiveCommentComponent {\r\n constructor(\r\n private backend : ChatBackendBase\r\n ) {\r\n\r\n }\r\n\r\n private _message : ChatMessage;\r\n private _upvoted = new Subject<void>();\r\n private _reported = new Subject<void>();\r\n private _selected = new Subject<void>();\r\n\r\n @Output()\r\n get upvoted() : Observable<void> {\r\n return this._upvoted;\r\n }\r\n \r\n @Output()\r\n get reported() : Observable<void> {\r\n return this._reported;\r\n }\r\n\r\n @Output()\r\n get selected() : Observable<void> {\r\n return this._selected;\r\n }\r\n \r\n @Input()\r\n get message() : ChatMessage {\r\n return this._message;\r\n }\r\n\r\n private unsubscribe : Function;\r\n\r\n set message(value) {\r\n let originalId = null;\r\n if (this._message)\r\n originalId = this._message.id;\r\n \r\n this._message = value;\r\n\r\n if (value && originalId === value.id) {\r\n return;\r\n }\r\n \r\n if (this.unsubscribe)\r\n this.unsubscribe();\r\n \r\n if (value) {\r\n this.unsubscribe = this.backend.watchMessage(value, message => this.message = message);\r\n }\r\n }\r\n\r\n report() {\r\n this._reported.next();\r\n }\r\n \r\n upvote() {\r\n this._upvoted.next();\r\n }\r\n\r\n select() {\r\n this._selected.next();\r\n }\r\n}","import { Component, ElementRef, HostBinding, Input, Output, ViewChild } from \"@angular/core\";\r\nimport { ChatMessage, ChatMessageAttachment, User } from \"@banta/common\";\r\nimport { Observable, Subject, Subscription } from \"rxjs\";\r\nimport { ChatBackendBase } from \"../../chat-backend-base\";\r\nimport { ChatSourceBase } from \"../../chat-source-base\";\r\nimport { AttachmentFragment } from \"../../attachment-scraper\";\r\nimport { EMOJIS } from \"../../emoji\";\r\n\r\nexport interface AutoCompleteOption {\r\n label : string;\r\n action? : () => void;\r\n}\r\n\r\nexport interface HashTag {\r\n hashtag : string;\r\n description : string;\r\n}\r\n\r\ninterface AttachmentFragmentState {\r\n fragment: AttachmentFragment;\r\n resolution: Promise<ChatMessageAttachment>;\r\n}\r\n\r\n@Component({\r\n selector: 'banta-comment-field',\r\n templateUrl: './comment-field.component.html',\r\n styleUrls: ['./comment-field.component.scss']\r\n})\r\nexport class CommentFieldComponent {\r\n constructor(private chatBackend: ChatBackendBase) {\r\n }\r\n\r\n private _source : ChatSourceBase;\r\n @Input() \r\n get source() : ChatSourceBase {\r\n return this._source;\r\n }\r\n\r\n set source(value) {\r\n if (this._source) {\r\n this._subs?.unsubscribe();\r\n this._source = null;\r\n }\r\n\r\n this._source = value;\r\n this._subs = new Subscription();\r\n if (this._source) {\r\n setTimeout(() => {\r\n if (this._source.connectionStateChanged) {\r\n this._subs.add(this._source.connectionStateChanged.subscribe(state => {\r\n if (state === 'lost') {\r\n this.transientMessage = `Reconnecting...`;\r\n } else if (state === 'restored') {\r\n this.transientMessage = undefined;\r\n } else if (state === 'connecting') {\r\n this.transientMessage = `Connecting...`;\r\n }\r\n }));\r\n }\r\n });\r\n }\r\n }\r\n\r\n private _subs = new Subscription();\r\n @Input() user : User;\r\n\r\n @HostBinding('class.can-comment')\r\n @Input() \r\n canComment = true;\r\n @Input() allowAttachments = false;\r\n\r\n @Output() signInSelected = new Subject<void>();\r\n @Output() editAvatarSelected = new Subject<void>();\r\n\r\n sending = false;\r\n sendError : Error;\r\n expandError = false;\r\n @Input() transientMessage: string;\r\n\r\n private _text : string = '';\r\n get text() {\r\n return this._text;\r\n }\r\n\r\n set text(value) {\r\n this._text = value;\r\n }\r\n\r\n @Input() sendLabel = 'Send';\r\n @Input() sendingLabel = 'Sending';\r\n @Input() label = 'Post a comment';\r\n @Input() permissionDeniedLabel = 'Unavailable';\r\n @Input() signInLabel = 'Sign In';\r\n @Input() maxLength = 1500;\r\n @Input() placeholder = '';\r\n @Output() textChanged = new Subject<void>();\r\n @Input() shouldInterceptMessageSend?: (message: ChatMessage, source: ChatSourceBase) => boolean | Promise<boolean>;\r\n\r\n @ViewChild('autocomplete') autocompleteEl : ElementRef<HTMLElement>;\r\n @ViewChild('autocompleteContainer') autocompleteContainerEl : ElementRef<HTMLElement>;\r\n @ViewChild('textarea') textareaEl : ElementRef<HTMLTextAreaElement>;\r\n\r\n @Input() hashtags : HashTag[];\r\n @Input() participants : User[] = [];\r\n @Input() genericAvatarUrl: string;\r\n\r\n get userAvatarUrl() {\r\n return this.user?.avatarUrl || this.genericAvatarUrl;\r\n }\r\n private _permissionDeniedError = new Subject<string>();\r\n\r\n @Output()\r\n get permissionDeniedError(): Observable<string> {\r\n return this._permissionDeniedError;\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (typeof window !== 'undefined') {\r\n let root = document.body.querySelector('[ng-version]') || document.body;\r\n root.appendChild(this.autocompleteEl.nativeElement);\r\n }\r\n }\r\n\r\n sendPermissionDenied(message: string) {\r\n this._permissionDeniedError.next(message);\r\n }\r\n\r\n showAutoComplete(options : AutoCompleteOption[]) {\r\n if (typeof window === 'undefined')\r\n return;\r\n \r\n this.autoCompleteSelected = 0;\r\n this.autocompleteOptions = options;\r\n let pos = this.autocompleteContainerEl.nativeElement.getBoundingClientRect();\r\n let size = this.autocompleteEl.nativeElement.getBoundingClientRect();\r\n\r\n this.autocompleteEl.nativeElement.style.left = `${window.scrollX + pos.left}px`;\r\n this.autocompleteEl.nativeElement.style.top = `${window.scrollY + pos.top}px`;\r\n this.autocompleteEl.nativeElement.style.width = `${pos.width}px`;\r\n this.autocompleteVisible = true;\r\n }\r\n\r\n autocompleteVisible = false;\r\n autocompleteOptions : AutoCompleteOption[] = [];\r\n\r\n activateAutoComplete(option : AutoCompleteOption) {\r\n option.action();\r\n this.dismissAutoComplete();\r\n }\r\n\r\n dismissAutoComplete() {\r\n this.autocompleteVisible = false;\r\n this.completionFunc = null;\r\n this.completionPrefix = '';\r\n }\r\n\r\n private errorTimeout;\r\n indicateError(message : string) {\r\n this.sendError = new Error(message);\r\n this.expandError = false;\r\n clearTimeout(this.errorTimeout);\r\n this.errorTimeout = setTimeout(() => {\r\n this.expandError = true;\r\n this.errorTimeout = setTimeout(() => {\r\n this.expandError = false;\r\n }, 5*1000);\r\n }, 100);\r\n\r\n // On mobile, just show an alert dialog\r\n if (typeof window !== 'undefined' && window.innerWidth < 430)\r\n alert(message);\r\n }\r\n\r\n completionFunc : (str : string) => AutoCompleteOption[];\r\n\r\n completionPrefix : string;\r\n autoCompleteSelected : number = 0;\r\n\r\n get isValidMessage() {\r\n return (this.text || this.chatMessageAttachments.length > 0);\r\n }\r\n\r\n get hasPendingAttachments() {\r\n return this.chatMessageAttachments.some(x => x.transientState);\r\n }\r\n\r\n get sendButtonEnabled() {\r\n if (!this.canComment) {\r\n // In this case, we want to enable the button because we want to be able to \r\n // send the permissionDenied message up to the host.\r\n return true;\r\n }\r\n\r\n return this.isValidMessage\r\n && !this.hasPendingAttachments\r\n && !this.sending\r\n ;\r\n }\r\n async autocomplete(replacement : string) {\r\n let el = this.textareaEl.nativeElement;\r\n this.text = this.text.slice(0, el.selectionStart - this.completionPrefix.length) + replacement + this.text.slice(el.selectionStart);\r\n }\r\n\r\n async insert(str : string) {\r\n let el = this.textareaEl.nativeElement;\r\n this.text = this.text.slice(0, el.selectionStart) + str + this.text.slice(el.selectionStart);\r\n }\r\n\r\n async onKeyDown(event : KeyboardEvent) {\r\n if (this.autocompleteVisible) {\r\n if (event.key === 'Escape') {\r\n this.dismissAutoComplete();\r\n return;\r\n }\r\n\r\n if (event.key === 'Shift') {\r\n return;\r\n }\r\n\r\n if (event.key === 'Enter') {\r\n if (this.autocompleteOptions[this.autoCompleteSelected]) {\r\n this.activateAutoComplete(this.autocompleteOptions[this.autoCompleteSelected]);\r\n event.stopPropagation();\r\n event.preventDefault();\r\n return;\r\n }\r\n }\r\n\r\n if (event.key === 'ArrowUp') {\r\n if (this.autoCompleteSelected === 0)\r\n this.autoCompleteSelected = this.autocompleteOptions.length - 1;\r\n else\r\n this.autoCompleteSelected = this.autoCompleteSelected - 1;\r\n event.stopPropagation();\r\n event.preventDefault();\r\n return;\r\n } else if (event.key === 'ArrowDown') {\r\n this.autoCompleteSelected = (this.autoCompleteSelected + 1) % this.autocompleteOptions.length;\r\n event.stopPropagation();\r\n event.preventDefault();\r\n return;\r\n }\r\n }\r\n\r\n if (event.key === 'Enter' && event.ctrlKey) {\r\n await this.sendMessage();\r\n return;\r\n }\r\n\r\n if (this.completionFunc) {\r\n if (event.key === 'Backspace') {\r\n this.completionPrefix = this.completionPrefix.slice(0, this.completionPrefix.length - 1);\r\n\r\n if (this.completionPrefix === '') {\r\n this.dismissAutoComplete();\r\n return;\r\n }\r\n } else if (event.key === ' ' || event.key.length > 1) {\r\n this.dismissAutoComplete();\r\n return;\r\n } else {\r\n this.completionPrefix += event.key;\r\n }\r\n\r\n this.showAutoComplete(this.completionFunc(this.completionPrefix));\r\n } else {\r\n if (event.key === ':') {\r\n this.startAutoComplete(event, prefix => {\r\n prefix = prefix.slice(1);\r\n\r\n // makes :-), :-( etc work (as they are \":)\" etc in the db)\r\n if (prefix.startsWith('-'))\r\n prefix = prefix.slice(1);\r\n\r\n return Object.keys(EMOJIS)\r\n .filter(k => k.includes(prefix) || EMOJIS[k].keywords.some(kw => kw.includes(prefix)))\r\n .map(k => ({\r\n label: `${EMOJIS[k].char} ${k}`,\r\n action: () => this.autocomplete(EMOJIS[k].char)\r\n }))\r\n .slice(0, 5)\r\n ;\r\n });\r\n } else if (event.key === '@') {\r\n this.startAutoComplete(event, prefix => {\r\n prefix = prefix.slice(1);\r\n return this.participants.filter(x => x.username.includes(prefix))\r\n .map(p => ({\r\n label: `@${p.username} -- ${p.displayName}`,\r\n action: () => this.autocomplete(`@${p.username}`)\r\n }))\r\n ;\r\n });\r\n } else if (event.key === '#') {\r\n this.startAutoComplete(event, prefix => {\r\n prefix = prefix.slice(1);\r\n\r\n return this.hashtags\r\n .filter(ht => ht.hashtag.includes(prefix))\r\n .map(ht => ({\r\n label: `#${ht.hashtag}${ht.description ? ` -- ${ht.description}` : ``}`,\r\n action: () => this.autocomplete(`#${ht.hashtag}`)\r\n }))\r\n .slice(0, 5)\r\n ;\r\n });\r\n }\r\n }\r\n }\r\n\r\n startAutoComplete(event : KeyboardEvent, completionFunc : (str : string) => AutoCompleteOption[]) {\r\n this.completionPrefix = event.key;\r\n this.completionFunc = completionFunc;\r\n this.showAutoComplete(this.completionFunc(this.completionPrefix));\r\n }\r\n\r\n onBlur() {\r\n setTimeout(() => this.dismissAutoComplete(), 250);\r\n }\r\n\r\n insertEmoji(text : string) {\r\n this.text += text;\r\n }\r\n\r\n showSignIn() {\r\n this.signInSelected.next();\r\n }\r\n\r\n showEditAvatar() {\r\n this.editAvatarSelected.next();\r\n }\r\n\r\n @Input()\r\n submit: (message: ChatMessage) => boolean;\r\n\r\n async sendMessage() {\r\n if (!this.source)\r\n return;\r\n\r\n this.sending = true;\r\n this.sendError = null;\r\n try {\r\n let text = (this.text || '').trim();\r\n\r\n if (this.canComment && !this.isValidMessage)\r\n return;\r\n\r\n let message : ChatMessage = {\r\n user: this.user,\r\n sentAt: Date.now(),\r\n url: typeof window !== 'undefined' ? location.href : undefined,\r\n likes: 0,\r\n message: text,\r\n attachments: this.chatMessageAttachments.filter(x => x.url)\r\n };\r\n\r\n try {\r\n await this.submit(message);\r\n this.text = '';\r\n this.chatMessageAttachments = [];\r\n } catch (e) {\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 1000));\r\n this.indicateError(e.message);\r\n }\r\n\r\n } finally {\r\n this.sending = false;\r\n setTimeout(() => {\r\n this.textareaEl.nativeElement.focus();\r\n }, 100);\r\n }\r\n }\r\n\r\n chatMessageAttachments: ChatMessageAttachment[] = [];\r\n\r\n addedAttachment(attachment: ChatMessageAttachment) {\r\n this.chatMessageAttachments.push(attachment);\r\n }\r\n\r\n attachmentError(attachment: ChatMessageAttachment) {\r\n setTimeout(() => {\r\n this.chatMessageAttachments = this.chatMessageAttachments.filter(x => x !== attachment);\r\n }, 3000);\r\n }\r\n\r\n\tremoveAttachment(attachment: ChatMessageAttachment) {\r\n let index = this.chatMessageAttachments.indexOf(attachment);\r\n if (index >= 0)\r\n\t\t this.chatMessageAttachments.splice(index, 1);\r\n\t}\r\n\r\n alertError() {\r\n if (!this.sendError)\r\n return;\r\n alert(this.sendError.message);\r\n }\r\n}\r\n","import { Component, Input, Output } from '@angular/core';\r\nimport { CommentsOrder } from \"@banta/common\";\r\nimport { Subject } from \"rxjs\";\r\n\r\n@Component({\r\n selector: 'banta-comment-sort',\r\n templateUrl: './comment-sort.component.html',\r\n styleUrls: ['./comment-sort.component.scss']\r\n})\r\nexport class CommentSortComponent {\r\n\r\n commentsOrder = CommentsOrder;\r\n private _sortChange = new Subject<CommentsOrder>();\r\n private _sort: CommentsOrder = CommentsOrder.LIKES;\r\n\r\n @Input() \r\n get sort() { \r\n return this._sort;\r\n }\r\n\r\n set sort(value) {\r\n if (this._sort !== value) {\r\n this._sort = value;\r\n setTimeout(() => this._sortChange.next(value));\r\n }\r\n }\r\n\r\n @Output()\r\n get sortChange() {\r\n return this._sortChange.asObservable();\r\n }\r\n}\r\n","import { Component, ElementRef, Output, ViewChild } from '@angular/core';\r\nimport { CDNProvider, ChatMessageAttachment } from '@banta/common';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'banta-attachment-button',\r\n templateUrl: './attachment-button.component.html',\r\n styleUrls: ['./attachment-button.component.scss']\r\n})\r\nexport class AttachmentButtonComponent {\r\n\r\n constructor(\r\n private cdnProvider: CDNProvider,\r\n ) {\r\n }\r\n\r\n private _addedAttachment = new Subject<ChatMessageAttachment>();\r\n private _attachmentError = new Subject<ChatMessageAttachment>();\r\n\r\n @ViewChild('fileUpload', { static: false }) fileInput: ElementRef;\r\n\r\n @Output() get addedAttachment() { return this._addedAttachment.asObservable(); }\r\n @Output() get attachmentError() { return this._attachmentError.asObservable(); }\r\n\r\n show() {\r\n (this.fileInput.nativeElement as HTMLInputElement).click();\r\n }\r\n\r\n async fileChange(event: Event): Promise<void> {\r\n const element = (event.currentTarget as HTMLInputElement);\r\n if (element.files.length) {\r\n console.log('[Banta] File Added to comment');\r\n const file = element.files[0];\r\n let publicURL: string;\r\n \r\n let attachment: ChatMessageAttachment = {\r\n type: file.type,\r\n url: undefined,\r\n transientState: {\r\n uploading: true,\r\n error: false,\r\n errorMessage: undefined\r\n }\r\n }\r\n\r\n this._addedAttachment.next(attachment);\r\n\r\n try {\r\n publicURL = await this.cdnProvider.uploadImage(file);\r\n } catch (e) {\r\n attachment.transientState.error = true;\r\n attachment.transientState.errorMessage = \"Failed to upload\";\r\n\r\n console.error(`[Banta] Caught an error while uploading image to CDN:`);\r\n console.error(e);\r\n alert(`Failed to upload image. Please try again later.`);\r\n\r\n this._attachmentError.next(attachment);\r\n return;\r\n }\r\n\r\n // If no URL was returned, then an error must have occurred. Presumably the CDN\r\n // provider has conveyed an error to the user.\r\n if (!publicURL)\r\n return;\r\n \r\n attachment.url = publicURL;\r\n attachment.transientState = undefined;\r\n }\r\n\r\n }\r\n\r\n}\r\n","import { Directive, ElementRef, Input, Output } from \"@angular/core\";\r\nimport { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { Subject } from \"rxjs\";\r\nimport { AttachmentFragment } from \"../attachment-scraper\";\r\nimport { ChatBackendBase } from \"../chat-backend-base\";\r\n\r\ninterface AttachmentFragmentState {\r\n fragment: AttachmentFragment;\r\n resolution: Promise<ChatMessageAttachment>;\r\n}\r\n\r\n@Directive({\r\n selector: '[attachmentScraper]'\r\n})\r\nexport class AttachmentScraperDirective {\r\n constructor(\r\n private elementRef: ElementRef<HTMLTextAreaElement>,\r\n private chatBackend: ChatBackendBase\r\n ) {\r\n }\r\n\r\n @Input() attachments: ChatMessageAttachment[] = [];\r\n @Output() attachmentsChange = new Subject<ChatMessageAttachment[]>();\r\n ngOnInit() {\r\n if (typeof window === 'undefined')\r\n return;\r\n \r\n this.element.addEventListener('keydown', () => {\r\n clearTimeout(this.scrapeTimeout);\r\n this.scrapeTimeout = setTimeout(() => this.scrape(), this.scrapeDebounce);\r\n });\r\n }\r\n\r\n get element() {\r\n return this.elementRef?.nativeElement;\r\n }\r\n\r\n get text() {\r\n return this.element.value;\r\n }\r\n\r\n\r\n private scrapeTimeout;\r\n private scrapeDebounce = 1500;\r\n private fragments = new Map<string, AttachmentFragmentState>();\r\n private scrape() {\r\n let message: ChatMessage = {\r\n likes: 0,\r\n message: this.text,\r\n sentAt: undefined,\r\n user: null,\r\n attachments: this.attachments\r\n };\r\n\r\n let foundFragments: string[] = [];\r\n\r\n for (let scraper of this.chatBackend.attachmentScrapers) {\r\n let fragments = scraper.findFragments(message);\r\n if (!fragments) {\r\n console.error(`Attachment fragment scraper ${scraper.constructor.name} is implemented incorrectly: Returned null instead of array`);\r\n continue;\r\n }\r\n for (let fragment of fragments) {\r\n foundFragments.push(fragment.text);\r\n if (!this.fragments.has(fragment.text)) {\r\n console.log(`Scraped new fragment:`);\r\n console.dir(fragment);\r\n this.fragments.set(fragment.text, {\r\n fragment,\r\n resolution: undefined\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Remove fragments that are no longer in the message.\r\n let removedFragments: string[] = [];\r\n for (let [key] of this.fragments) {\r\n if (!foundFragments.includes(key))\r\n removedFragments.push(key);\r\n }\r\n for (let removedFragment of removedFragments) {\r\n console.log(`Removed fragment: ${removedFragment}`);\r\n this.fragments.delete(removedFragment);\r\n }\r\n\r\n // Process any fragments that are not yet resolved (or being \r\n // resolved)\r\n\r\n for (let [key, state] of this.fragments) {\r\n if (state.resolution)\r\n continue;\r\n\r\n state.resolution = new Promise(async (resolve, reject) => {\r\n console.log(`Resolving fragment ${key}`);\r\n for (let resolver of this.chatBackend.attachmentResolvers) {\r\n console.log(`- Trying resolver ${resolver.constructor.name}...`);\r\n try {\r\n let attachment = await resolver.resolveFragment(message, state.fragment);\r\n if (attachment) {\r\n console.log(`Resolved fragment ${key} into attachment:`);\r\n console.dir(attachment);\r\n this.attachments.push(attachment);\r\n this.attachmentsChange.next(this.attachments.slice());\r\n resolve(attachment);\r\n break;\r\n }\r\n } catch (e) {\r\n console.error(`Caught error during attachment resolver ${resolver.constructor.name}:`);\r\n console.error(e);\r\n continue;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n}","import { NgModule } from '@angular/core';\r\nimport { CommentComponent } from './comment/comment.component';\r\nimport { CommentViewComponent } from './comment-view/comment-view.component';\r\nimport { BantaCommentsComponent } from './banta-comments/banta-comments.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { BantaCommonModule } from '../common';\r\nimport { LiveCommentComponent } from './live-comment.component';\r\nimport { EmojiModule } from '../emoji';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { TextFieldModule } from '@angular/cdk/text-field';\r\nimport { CommentFieldComponent } from './comment-field/comment-field.component';\r\nimport {MatTooltipModule} from '@angular/material/tooltip';\r\nimport {CommentSortComponent} from \"./comment-sort/comment-sort.component\";\r\nimport {MatSelectModule} from \"@angular/material/select\";\r\nimport { AttachmentButtonComponent } from './attachment-button/attachment-button.component';\r\nimport { BantaReplySendOptionsDirective } from './reply-send-options.directive';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport { PortalModule } from '@angular/cdk/portal';\r\nimport { AttachmentScraperDirective } from './attachment-scraper.directive';\r\n\r\nconst COMPONENTS = [\r\n CommentComponent,\r\n CommentViewComponent,\r\n BantaCommentsComponent,\r\n LiveCommentComponent,\r\n CommentFieldComponent,\r\n CommentSortComponent,\r\n AttachmentButtonComponent,\r\n BantaReplySendOptionsDirective,\r\n AttachmentScraperDirective\r\n];\r\n\r\n@NgModule({\r\n declarations: COMPONENTS,\r\n imports: [\r\n CommonModule,\r\n TextFieldModule,\r\n FormsModule,\r\n MatIconModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatButtonModule,\r\n MatMenuModule,\r\n MatProgressSpinnerModule,\r\n BantaCommonModule,\r\n EmojiModule,\r\n MatTooltipModule,\r\n MatSelectModule,\r\n OverlayModule,\r\n PortalModule\r\n ],\r\n exports: COMPONENTS\r\n})\r\nexport class CommentsModule {\r\n}\r\n","import { ChatMessage, ChatPermissions, CommentsOrder, DurableSocket, User } from \"@banta/common\";\r\nimport { Observable, Subject, Subscription } from \"rxjs\";\r\nimport { RpcEvent, SocketRPC } from \"@banta/common\";\r\nimport { ChatSourceBase } from \"./chat-source-base\";\r\nimport { ChatBackend } from \"./chat-backend\";\r\n\r\nexport class ChatSource extends SocketRPC implements ChatSourceBase {\r\n constructor(\r\n readonly backend: ChatBackend,\r\n readonly identifier: string,\r\n readonly parentIdentifier: string,\r\n readonly sortOrder: CommentsOrder\r\n ) {\r\n super();\r\n this.ready = new Promise<void>(resolve => this.markReady = resolve);\r\n }\r\n\r\n private subscription = new Subscription();\r\n private markReady: () => void;\r\n\r\n ready: Promise<void>;\r\n\r\n permissions: ChatPermissions;\r\n private _state: 'connected' | 'connecting' | 'lost' | 'restored' = 'connecting';\r\n\r\n get state() {\r\n return this._state;\r\n }\r\n\r\n set state(value) {\r\n this._state = value;\r\n setTimeout(() => this._connectionStateChanged.next(this._state));\r\n }\r\n\r\n private _connectionStateChanged = new Subject<'connected' | 'connecting' | 'lost' | 'restored'>();\r\n get connectionStateChanged() {\r\n return this._connectionStateChanged.asObservable();\r\n }\r\n\r\n async bind(socket: DurableSocket): Promise<this> {\r\n super.bind(socket);\r\n this.state = 'connected';\r\n this.markReady();\r\n\r\n await this.subscribeToTopic();\r\n this.subscription.add(this.backend.userChanged.subscribe(() => this.authenticate()));\r\n\r\n socket.addEventListener('open', async () => {\r\n this.state = 'connected';\r\n });\r\n\r\n socket.addEventListener('lost', async () => {\r\n this.state = 'lost';\r\n });\r\n\r\n socket.addEventListener('restore', async () => {\r\n this.state = 'restored';\r\n await this.authenticate();\r\n await this.subscribeToTopic();\r\n });\r\n\r\n return this;\r\n }\r\n\r\n private mapOrUpdateMessages(messages: ChatMessage[]): ChatMessage[] {\r\n return messages.map(message => this.mapOrUpdateMessage(message));\r\n }\r\n\r\n private mapOrUpdateMessage(message: ChatMessage): ChatMessage {\r\n let existingMessage = this.messageMap.get(message.id);\r\n if (existingMessage) {\r\n message = Object.assign(existingMessage, message);\r\n } else {\r\n this.messageMap.set(message.id, message);\r\n this._messageObserved.next(message);\r\n }\r\n\r\n return message;\r\n }\r\n\r\n async getExistingMessages(): Promise<ChatMessage[]> {\r\n let messages = await this.peer.getExistingMessages();\r\n messages = this.mapOrUpdateMessages(messages);\r\n return messages;\r\n }\r\n\r\n private async ensureConnection(errorMessage?: string) {\r\n let reason = `Connection to chat services is not currently available.`;\r\n if (this.state !== 'connected' && this.state !== 'restored') {\r\n if (errorMessage)\r\n throw new Error(`${errorMessage}: ${reason}`);\r\n else\r\n throw new Error(`${reason}`);\r\n }\r\n }\r\n\r\n async editMessage(messageId: string, text: string): Promise<void> {\r\n await this.ensureConnection();\r\n await this.peer.editMessage(messageId, text);\r\n }\r\n\r\n async subscribeToTopic() {\r\n await this.peer.subscribe(this.identifier, this.parentIdentifier, this.sortOrder);\r\n }\r\n\r\n async authenticate() {\r\n if (this.backend.user) {\r\n try {\r\n await this.peer.authenticate(this.backend.user?.token);\r\n } catch (e) {\r\n console.error(`Could not authenticate with Banta server:`);\r\n console.error(e);\r\n }\r\n }\r\n }\r\n\r\n close(): void {\r\n super.close();\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n @RpcEvent()\r\n onPermissions(permissions: ChatPermissions) {\r\n (window as any).bantaPermissionsDebug = permissions;\r\n this.permissions = permissions;\r\n }\r\n\r\n @RpcEvent()\r\n onChatMessage(message: ChatMessage) {\r\n if (this.messageMap.has(message.id)) {\r\n return this.mapOrUpdateMessage(message);\r\n } else if (!message.hidden) {\r\n // Only process non-hidden messages through here. \r\n // Hidden messages may be sent to us when they become hidden (ie moderation is occurring).\r\n // But if we never had the message to begin with, we should discard it.\r\n this.messageMap.set(message.id, message);\r\n this._messageReceived.next(message);\r\n }\r\n }\r\n\r\n private messageMap = new Map<string, ChatMessage>();\r\n private _messageReceived = new Subject<ChatMessage>();\r\n private _messageUpdated = new Subject<ChatMessage>();\r\n private _messageSent = new Subject<ChatMessage>();\r\n private _messageObserved = new Subject<ChatMessage>();\r\n\r\n get messageReceived() { return this._messageReceived.asObservable(); }\r\n get messageUpdated() { return this._messageUpdated.asObservable(); }\r\n get messageSent() { return this._messageSent.asObservable(); }\r\n get messageObserved() { return this._messageObserved.asObservable(); }\r\n\r\n messages: ChatMessage[] = [];\r\n\r\n async send(message: ChatMessage): Promise<ChatMessage> {\r\n await this.ensureConnection();\r\n return await this.peer.sendMessage(message);\r\n }\r\n\r\n async loadAfter(message: ChatMessage, count: number): Promise<ChatMessage[]> {\r\n if (!message)\r\n return;\r\n\r\n if (!message.pagingCursor)\r\n return [];\r\n \r\n return this.mapOrUpdateMessages(\r\n await this.peer.loadAfter(Number(message.pagingCursor), count)\r\n );\r\n }\r\n\r\n async get(id: string): Promise<ChatMessage> {\r\n if (this.messageMap.has(id))\r\n return this.messageMap.get(id);\r\n \r\n await this.ensureConnection(`Could not get message`);\r\n let message = await this.peer.getMessage(id);\r\n\r\n if (this.messageMap.has(id)) {\r\n let existingMessage = this.messageMap.get(id);\r\n Object.assign(existingMessage, message);\r\n message = existingMessage;\r\n } else {\r\n this.messageMap.set(id, message);\r\n }\r\n\r\n return message;\r\n }\r\n\r\n async getCount(): Promise<number> {\r\n return await this.peer.getCount();\r\n }\r\n\r\n async likeMessage(messageId: string): Promise<void> {\r\n await this.ensureConnection();\r\n return await this.peer.likeMessage(messageId);\r\n }\r\n\r\n async unlikeMessage(messageId: string): Promise<void> {\r\n await this.ensureConnection();\r\n return await this.peer.unlikeMessage(messageId);\r\n }\r\n\r\n async deleteMessage(messageId: string): Promise<void> {\r\n await this.ensureConnection();\r\n return await this.peer.deleteMessage(messageId);\r\n }\r\n\r\n}","import { InjectionToken } from \"@angular/core\";\r\n\r\nexport interface SdkOptions {\r\n serviceUrl?: string;\r\n}\r\n\r\nexport const BANTA_SDK_OPTIONS = 'BANTA_SDK_OPTIONS';","import { Inject, Injectable } from \"@angular/core\";\r\nimport { ChatMessage, CommentsOrder, DurableSocket, Notification, UrlCard, User, Vote } from \"@banta/common\";\r\nimport { Observable } from \"rxjs\";\r\nimport { ChatBackendBase, ChatSourceOptions } from \"./chat-backend-base\";\r\nimport { ChatSource } from \"./chat-source\";\r\nimport { ChatSourceBase } from \"./chat-source-base\";\r\nimport { BANTA_SDK_OPTIONS, SdkOptions } from \"./sdk-options\";\r\n\r\n@Injectable()\r\nexport class ChatBackend extends ChatBackendBase {\r\n constructor(\r\n @Inject(BANTA_SDK_OPTIONS) private options: SdkOptions\r\n ) {\r\n super();\r\n }\r\n\r\n get serviceUrl() {\r\n return `${this.options?.serviceUrl ?? 'http://localhost:3422'}`;\r\n }\r\n\r\n private async connectToService() {\r\n let socket = new DurableSocket(`${this.serviceUrl.replace(/^http/, 'ws')}/socket`);\r\n await new Promise<void>((resolve, reject) => {\r\n socket.onopen = () => {\r\n resolve();\r\n }\r\n\r\n socket.onclose = e => {\r\n if (e.code === 503) {\r\n console.error(`Failed to connect to chat service!`);\r\n reject(e);\r\n }\r\n }\r\n });\r\n\r\n socket.onerror = undefined;\r\n\r\n return socket;\r\n }\r\n\r\n async getSourceForTopic(topicId: string, options?: ChatSourceOptions): Promise<ChatSourceBase> {\r\n return await new ChatSource(this, topicId, undefined, options?.sortOrder || CommentsOrder.NEWEST)\r\n .bind(await this.connectToService());\r\n }\r\n\r\n async getSourceForThread(topicId: string, messageId: string, options?: ChatSourceOptions): Promise<ChatSource> {\r\n return await new ChatSource(this, topicId, messageId, options?.sortOrder || CommentsOrder.NEWEST)\r\n .bind(await this.connectToService());\r\n }\r\n\r\n async getSourceCountForTopic(topicId: string): Promise<number> {\r\n let response = await fetch(`${this.serviceUrl}/topics/${topicId}`)\r\n\r\n if (response.status >= 400)\r\n return 0;\r\n\r\n let topic = await response.json();\r\n return topic.messageCount || 0;\r\n }\r\n\r\n refreshMessage(message: ChatMessage): Promise<ChatMessage> {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n \r\n getMessage(topicId: string, messageId: string): Promise<ChatMessage> {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n getSubMessage(topicId: string, parentMessageId: string, messageId: string): Promise<ChatMessage> {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n watchMessage(message: ChatMessage, handler: (message: ChatMessage) => void): () => void {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n notificationsChanged: Observable<Notification[]>;\r\n newNotification: Observable<Notification>;\r\n \r\n async getCardForUrl(url: string): Promise<UrlCard> {\r\n let response = await fetch(`${this.serviceUrl}/urls`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify({\r\n url\r\n })\r\n });\r\n\r\n if (response.status == 404)\r\n return null;\r\n \r\n if (response.status >= 400)\r\n throw new Error(`Failed to retrieve URL card: ${response.status}. Body: '${await response.text()}'`);\r\n\r\n return await response.json();\r\n }\r\n}","import { Injectable } from \"@angular/core\";\r\nimport { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { AttachmentFragment, AttachmentResolver, AttachmentScraper } from \"./attachment-scraper\";\r\nimport { ChatBackendBase } from \"./chat-backend-base\";\r\n\r\nconst URL_REGEX = new RegExp('(?!mailto:)(?:(?:http|https|ftp)://)(?:\\\\S+(?::\\\\S*)?@)?(?:(?:(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}(?:\\\\.(?:[0-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))|(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]+-?)*[a-z\\\\u00a1-\\\\uffff0-9]+)(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]+-?)*[a-z\\\\u00a1-\\\\uffff0-9]+)*(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,})))|localhost)(?::\\\\d{2,5})?(?:(/|\\\\?|#)[^\\\\s]*)?', 'ig');\r\n\r\nexport class UrlAttachmentScraper implements AttachmentScraper {\r\n findFragments(message: ChatMessage): AttachmentFragment[] {\r\n // If a message already has a URL attachment, don't add another one.\r\n if (message.attachments && message.attachments.filter(x => x.type === 'url').length > 0)\r\n return null;\r\n\r\n return (Array.from(message.message.match(URL_REGEX) ?? []))\r\n .reduce((a, item) => (a.includes(item) ? undefined : a.push(item), a), [])\r\n .map(url => ({\r\n text: url, \r\n offset: message.message.indexOf(url),\r\n type: 'url'\r\n }))\r\n ;\r\n }\r\n}\r\n\r\n@Injectable()\r\nexport class UrlAttachmentResolver implements AttachmentResolver {\r\n constructor(private backend: ChatBackendBase) {\r\n }\r\n\r\n async resolveFragment(message: ChatMessage, fragment: AttachmentFragment): Promise<ChatMessageAttachment> {\r\n if (fragment.type !== 'url')\r\n return null;\r\n\r\n let urlCard = await this.backend.getCardForUrl(fragment.text);\r\n if (urlCard) {\r\n return {\r\n type: 'card',\r\n url: fragment.text,\r\n card: urlCard,\r\n style: 'block'\r\n }\r\n }\r\n }\r\n\r\n}","import { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { AttachmentFragment, AttachmentResolver } from \"./attachment-scraper\";\r\n\r\nexport class YouTubeAttachmentResolver implements AttachmentResolver {\r\n async resolveFragment(message: ChatMessage, fragment: AttachmentFragment): Promise<ChatMessageAttachment> {\r\n if (fragment.type !== 'url')\r\n return null;\r\n\r\n let videoId: string;\r\n\r\n if (fragment.text.match(/https?:\\/\\/(www\\.|m\\.)?youtube.com\\/watch\\?v=/)) {\r\n let match = /watch\\?v=([^&]+)/.exec(fragment.text);\r\n if (match) {\r\n videoId = match[1];\r\n }\r\n }\r\n\r\n if (videoId) {\r\n return {\r\n type: 'iframe',\r\n url: `https://www.youtube.com/embed/${videoId}`,\r\n style: 'block'\r\n };\r\n }\r\n return null;\r\n }\r\n}\r\n","import { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { AttachmentFragment, AttachmentResolver } from \"./attachment-scraper\";\r\n\r\nexport class GiphyAttachmentResolver implements AttachmentResolver {\r\n async resolveFragment(message: ChatMessage, fragment: AttachmentFragment): Promise<ChatMessageAttachment> {\r\n if (fragment.type === 'url' && fragment.text.startsWith('https://giphy.com/gifs')) {\r\n let gifId = /[^-\\/]+$/.exec(fragment.text)?.toString();\r\n if (!gifId)\r\n return null;\r\n\r\n return {\r\n type: 'iframe',\r\n url: `https://giphy.com/embed/${gifId}`,\r\n style: 'inline'\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n}","import { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { AttachmentFragment, AttachmentResolver } from \"./attachment-scraper\";\r\n\r\nexport class TweetAttachmentResolver implements AttachmentResolver {\r\n async resolveFragment(message: ChatMessage, fragment: AttachmentFragment): Promise<ChatMessageAttachment> {\r\n if (fragment.type === 'url' && fragment.text.startsWith('https://twitter.com/')) {\r\n return {\r\n type: 'tweet',\r\n url: fragment.text,\r\n style: 'block'\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n}","import { ModuleWithProviders, NgModule } from '@angular/core';\r\nimport { CommentsModule } from './comments';\r\nimport { ChatModule } from './chat';\r\nimport { EmojiModule } from './emoji';\r\nimport { BantaComponent } from './banta/banta.component';\r\nimport { BantaLogoComponent } from './banta-logo.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { BantaCommonModule } from './common/common.module';\r\nimport { LiveMessageComponent } from './live-message.component';\r\nimport { MatButtonModule } from \"@angular/material/button\";\r\nimport { MatIconModule } from \"@angular/material/icon\";\r\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\r\nimport { MatMenuModule } from \"@angular/material/menu\";\r\nimport { MatDialogModule } from \"@angular/material/dialog\";\r\nimport { MatSnackBarModule } from \"@angular/material/snack-bar\";\r\nimport { MatFormFieldModule } from \"@angular/material/form-field\";\r\nimport { MatInputModule } from \"@angular/material/input\";\r\nimport { MatProgressSpinnerModule } from \"@angular/material/progress-spinner\";\r\nimport { ChatBackend } from './chat-backend';\r\nimport { SdkOptions } from './sdk-options';\r\nimport { BANTA_SDK_OPTIONS } from './sdk-options';\r\nimport { ChatBackendBase } from './chat-backend-base';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport { PortalModule } from '@angular/cdk/portal';\r\nimport { UrlAttachmentResolver, UrlAttachmentScraper } from './url-attachments';\r\nimport { YouTubeAttachmentResolver } from './youtube-attachments';\r\nimport { GiphyAttachmentResolver } from './giphy-attachments';\r\nimport { TweetAttachmentResolver } from './tweet-attachments';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n BantaCommonModule,\r\n CommentsModule,\r\n ChatModule,\r\n EmojiModule,\r\n \r\n MatIconModule,\r\n MatButtonModule,\r\n MatTooltipModule,\r\n MatMenuModule,\r\n MatDialogModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatProgressSpinnerModule,\r\n MatSnackBarModule,\r\n OverlayModule,\r\n PortalModule\r\n ],\r\n declarations: [\r\n BantaComponent,\r\n BantaLogoComponent,\r\n LiveMessageComponent\r\n ],\r\n exports: [\r\n BantaComponent,\r\n BantaLogoComponent,\r\n LiveMessageComponent,\r\n BantaCommonModule,\r\n ChatModule,\r\n CommentsModule,\r\n EmojiModule\r\n ]\r\n})\r\nexport class BantaSdkModule {\r\n constructor(\r\n chatBackend: ChatBackendBase\r\n ) {\r\n if (typeof window !== 'undefined') {\r\n if (!document.querySelector('script[src=\"https://platform.twitter.com/widgets.js\"]')) {\r\n let script = document.createElement('script');\r\n script.src = 'https://platform.twitter.com/widgets.js';\r\n script.async = true;\r\n document.body.appendChild(script);\r\n }\r\n }\r\n\r\n chatBackend.registerAttachmentScraper(new UrlAttachmentScraper());\r\n chatBackend.registerAttachmentResolver(new GiphyAttachmentResolver());\r\n chatBackend.registerAttachmentResolver(new YouTubeAttachmentResolver());\r\n chatBackend.registerAttachmentResolver(new TweetAttachmentResolver());\r\n chatBackend.registerAttachmentResolver(new UrlAttachmentResolver(chatBackend));\r\n }\r\n \r\n static configure(options?: SdkOptions): ModuleWithProviders<BantaSdkModule> {\r\n return {\r\n ngModule: BantaSdkModule,\r\n providers: [\r\n { \r\n provide: BANTA_SDK_OPTIONS, \r\n useValue: options || {}\r\n },\r\n { provide: ChatBackendBase, useClass: ChatBackend }\r\n ]\r\n }\r\n }\r\n}","import { Subject, Observable, ConnectableObservable } from 'rxjs';\r\nimport { publish } from 'rxjs/operators';\r\n\r\nexport interface LazyConnectionOptions<T> {\r\n start : (subject : Subject<T>) => void;\r\n stop : () => void;\r\n}\r\n\r\nexport function lazyConnection<T>(options : LazyConnectionOptions<T>): Observable<T> {\r\n\r\n let obs = new Observable(observer => {\r\n let subject = new Subject<T>();\r\n let subscription = subject.subscribe(observer);\r\n\r\n options.start(subject);\r\n return () => {\r\n subscription.unsubscribe();\r\n options.stop();\r\n };\r\n });\r\n \r\n return (<ConnectableObservable<T>>obs.pipe(publish())).refCount();\r\n}"]}
|
|
1
|
+
{"version":3,"sources":["../../../projects/sdk/src/lib/common/timestamp.component.ts","../../../projects/sdk/src/lib/common/lightbox/lightbox.component.ts","../../../projects/sdk/src/lib/common/markdown-to-html.pipe.ts","../../../projects/sdk/src/lib/common/trust-resource-url.pipe.ts","../../../projects/sdk/src/lib/common/mention-linker.pipe.ts","../../../projects/sdk/src/lib/common/attachment/attachment.component.ts","../../../projects/sdk/src/lib/common/attachments/attachments.component.ts","../../../projects/sdk/src/lib/common/common.module.ts","../../../node_modules/tslib/tslib.es6.js","../../../projects/sdk/src/lib/emoji/emojis.ts","../../../projects/sdk/src/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.ts","../../../projects/sdk/src/lib/emoji/emoji-selector-button.component.ts","../../../projects/sdk/src/lib/emoji/emoji.module.ts","../../../projects/sdk/src/lib/chat-backend-base.ts","../../../projects/sdk/src/lib/banta/banta.component.ts","../../../projects/sdk/src/lib/banta-logo.component.ts","../../../projects/sdk/src/lib/chat/chat-message/chat-message.component.ts","../../../projects/sdk/src/lib/chat/live-chat-message.component.ts","../../../projects/sdk/src/lib/chat/chat-view/chat-view.component.ts","../../../projects/sdk/src/lib/chat/banta-chat/banta-chat.component.ts","../../../projects/sdk/src/lib/chat/chat.module.ts","../../../projects/sdk/src/lib/live-message.component.ts","../../../projects/sdk/src/lib/comments/comment/comment.component.ts","../../../projects/sdk/src/lib/comments/comment-view/comment-view.component.ts","../../../projects/sdk/src/lib/comments/reply-send-options.directive.ts","../../../projects/sdk/src/lib/comments/banta-comments/banta-comments.component.ts","../../../projects/sdk/src/lib/comments/live-comment.component.ts","../../../projects/sdk/src/lib/comments/comment-field/comment-field.component.ts","../../../projects/sdk/src/lib/comments/comment-sort/comment-sort.component.ts","../../../projects/sdk/src/lib/comments/attachment-button/attachment-button.component.ts","../../../projects/sdk/src/lib/comments/attachment-scraper.directive.ts","../../../projects/sdk/src/lib/comments/comments.module.ts","../../../projects/sdk/src/lib/chat-source.ts","../../../projects/sdk/src/lib/sdk-options.ts","../../../projects/sdk/src/lib/chat-backend.ts","../../../projects/sdk/src/lib/url-attachments.ts","../../../projects/sdk/src/lib/youtube-attachments.ts","../../../projects/sdk/src/lib/giphy-attachments.ts","../../../projects/sdk/src/lib/tweet-attachments.ts","../../../projects/sdk/src/lib/banta-sdk.module.ts","../../../projects/sdk/src/lib/common/lazy-connection.ts"],"names":["TimestampComponent","this","relative","tooltip","updateInterval","showAbsolute","prototype","ngOnDestroy","clearInterval","Object","defineProperty","_value","v","update","_this","diff","Date","now","value","minute","hour","day","week","month","updateTime","months","Math","floor","weeks","days","hours","minutes","window","setInterval","Component","args","selector","template","Input","LightboxComponent","ngAfterViewInit","document","body","appendChild","containerElement","nativeElement","remove","close","isOpen","open","currentImage","images","ViewChild","marked.marked","use","extensions","name","level","start","src","_a","match","index","tokenizer","tokens","exec","type","raw","text","lexer","inlineTokens","trim","renderer","token","parser","parseInline","BantaMarkdownToHtmlPipe","sanitizer","marked.Renderer","headerPrefix","linkRenderer","link","href","title","call","replace","transform","bypassSecurityTrustHtml","DOMPurify.sanitize","parse","FORBID_TAGS","KEEP_CONTENT","Pipe","DomSanitizer","DOMPurify.addHook","node","setAttribute","hasAttribute","BantaTrustResourceUrlPipe","bypassSecurityTrustResourceUrl","BantaMentionLinkerPipe","links","i","max","length","mention","RegExp","escapeRegExp","formatLink","external","string","BantaAttachmentComponent","elementRef","loading","editing","loadingMessage","error","errorMessage","removed","Subject","activated","loaded","_viewLoaded","_attachment","checkLoad","ngOnInit","setTimeout","widgets","load","next","activate","_b","attachment","transientState","url","startsWith","card","player","ElementRef","Output","HostBinding","BantaAttachmentsComponent","loadedAttachments","WeakMap","markAttachmentLoaded","set","allAttachmentsLoaded","isAttachmentLoaded","has","attachments","every","x","removeAttachment","isImageAttachment","isCardAttachment","includes","showLightbox","image","lightbox","filter","map","style","attachmentId","COMPONENTS","NgModule","declarations","imports","CommonModule","MatIconModule","MatProgressSpinnerModule","MatButtonModule","exports","extendStatics","d","b","setPrototypeOf","__proto__","Array","p","hasOwnProperty","__extends","TypeError","String","__","constructor","create","__decorate","decorators","target","key","desc","c","arguments","r","getOwnPropertyDescriptor","Reflect","decorate","__metadata","metadataKey","metadataValue","metadata","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","e","rejected","result","done","then","apply","__generator","f","y","t","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","n","op","pop","push","__values","o","s","m","__read","ar","__spread","concat","EMOJIS","grinning","keywords","char","category","grimacing","grin","joy","smiley","smile","sweat_smile","laughing","innocent","wink","blush","slightly_smiling","upside_down","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","nerd","sunglasses","hugging","smirk","no_mouth","neutral_face","expressionless","unamused","rolling_eyes","thinking","flushed","disappointed","worried","angry","rage","pensive","confused","slightly_sad","white_frowning","persevere","confounded","tired_face","weary","triumph","open_mouth","scream","fearful","cold_sweat","hushed","frowning","anguished","cry","disappointed_relieved","sleepy","sweat","sob","dizzy_face","astonished","zipper_mouth","mask","thermometer_face","bandage_face","sleeping","zzz","hankey","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","+1","minus1","facepunch","fist","ok_hand","hand","open_hands","muscle","pray","point_up","point_up_2","point_down","point_left","point_right","middle_finger","splayed_fingers","sign_of_horns","vulcan_salute","writing_hand","nail_care","lips","tongue","ear","nose","eye","eyes","bust_in_silhouette","busts_in_silhouette","speaking_head","baby","boy","girl","man","woman","person_with_blond_hair","older_man","older_woman","man_with_gua_pi_mao","man_with_turban","cop","construction_worker","guardsman","sleuth","santa","angel","princess","bride_with_veil","runner","walking","dancer","dancers","couple","two_men_holding_hands","two_women_holding_hands","bow","information_desk_person","no_good","ok_woman","raising_hand","person_with_pouting_face","person_frowning","haircut","massage","couple_with_heart","female_couple_with_heart","male_couple_with_heart","couplekiss","female_couplekiss","male_couplekiss","family","family_man_woman_girl","family_man_woman_girl_boy","family_man_woman_boys","family_man_woman_girls","family_women_boy","family_women_girl","family_women_girl_boy","family_women_boys","family_women_girls","family_men_boy","family_men_girl","family_men_girl_boy","family_men_boys","family_men_girls","womans_clothes","shirt","jeans","necktie","dress","bikini","kimono","lipstick","kiss","footprints","high_heel","sandal","boot","mans_shoe","athletic_shoe","womans_hat","tophat","helmet","mortar_board","crown","school_satchel","pouch","purse","handbag","briefcase","eyeglasses","dark_sunglasses","ring","closed_umbrella","dog","cat","mouse","hamster","rabbit","bear","panda_face","koala","tiger","lion_face","cow","pig","pig_nose","frog","octopus","monkey_face","see_no_evil","hear_no_evil","speak_no_evil","monkey","chicken","penguin","bird","baby_chick","hatching_chick","hatched_chick","wolf","boar","horse","unicorn_face","bee","bug","snail","beetle","ant","spider","scorpion","crab","snake","turtle","tropical_fish","fish","blowfish","dolphin","whale","whale2","crocodile","leopard","tiger2","water_buffalo","ox","cow2","dromedary_camel","camel","elephant","goat","ram","sheep","racehorse","pig2","rat","mouse2","rooster","turkey","dove_of_peace","dog2","poodle","cat2","rabbit2","chipmunk","feet","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","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","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","white_sun_with_small_cloud","partly_sunny","white_sun_behind_cloud","white_sun_behind_cloud_with_rain","cloud","cloud_with_rain","thunder_cloud_and_rain","cloud_with_lightning","zap","fire","boom","snowflake","cloud_with_snow","snowman","snowman_with_snow","wind_blowing_face","dash","cloud_with_tornado","fog","umbrella_without_rain","umbrella","droplet","sweat_drops","ocean","green_apple","apple","pear","tangerine","lemon","banana","watermelon","grapes","strawberry","melon","cherries","peach","pineapple","tomato","eggplant","hot_pepper","corn","sweet_potato","honey_pot","bread","cheese_wedge","poultry_leg","meat_on_bone","fried_shrimp","egg","hamburger","fries","hot_dog","pizza","spaghetti","taco","burrito","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","beer","beers","wine_glass","cocktail","tropical_drink","bottle","sake","tea","coffee","baby_bottle","fork_and_knife","fork_and_knife_with_plate","soccer","basketball","football","baseball","tennis","volleyball","rugby_football","8ball","golf","golfer","table_tennis","badminton","ice_hockey","field_hockey","cricket","ski","skier","snowboarder","ice_skate","bow_and_arrow","fishing_pole_and_fish","rowboat","swimmer","surfer","bath","person_with_ball","weight_lifter","bicyclist","mountain_bicyclist","horse_racing","man_levitating","trophy","running_shirt_with_sash","sports_medal","military_medal","reminder_ribbon","rosette","ticket","admission_ticket","performing_arts","art","circus_tent","microphone","headphones","musical_score","musical_keyboard","saxophone","trumpet","guitar","violin","clapper","video_game","space_invader","dart","game_die","slot_machine","bowling","car","taxi","blue_car","bus","trolleybus","racing_car","police_car","ambulance","fire_engine","minibus","truck","articulated_lorry","tractor","racing_motorcycle","bike","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","airplane_departure","airplane_arrival","boat","motor_boat","speedboat","ferry","passenger_ship","rocket","artificial_satellite","seat","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","snow_capped_mountain","mount_fuji","volcano","japan","camping","tent","national_park","motorway","railway_track","sunrise","sunrise_over_mountains","desert","beach_with_umbrella","desert_island","city_sunrise","city_sunset","cityscape","night_with_stars","bridge_at_night","milky_way","stars","sparkler","fireworks","rainbow","buildings","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","museum","church","mosque","synagogue","kaaba","shinto_shrine","watch","iphone","calling","computer","keyboard","desktop_computer","printer","three_button_mouse","trackball","joystick","compression","minidisc","floppy_disk","cd","dvd","vhs","camera","camera_with_flash","video_camera","movie_camera","film_projector","film_frames","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","scales","wrench","hammer","hammer_and_pick","hammer_and_wrench","pick","nut_and_bolt","gear","chains","gun","bomb","hocho","dagger_knife","crossed_swords","shield","smoking","skull_and_crossbones","coffin","funeral_urn","amphora","crystal_ball","prayer_beads","barber","alembic","telescope","microscope","hole","pill","syringe","thermometer","bookmark","toilet","shower","bathtub","old_key","couch_and_lamp","sleeping_accommodation","bed","door","bellhop_bell","frame_with_picture","world_map","umbrella_on_ground","moyai","shopping_bags","balloon","flags","ribbon","gift","confetti_ball","tada","dolls","wind_chime","crossed_flags","izakaya_lantern","envelope","envelope_with_arrow","incoming_envelope","email","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_pad","card_index","card_file_box","ballot_box_with_ballot","file_cabinet","clipboard","spiral_note_pad","file_folder","open_file_folder","card_index_dividers","rolled_up_newspaper","newspaper","notebook","closed_book","green_book","blue_book","orange_book","notebook_with_decorative_cover","ledger","books","book","paperclip","linked_paperclips","scissors","triangular_ruler","straight_ruler","pushpin","round_pushpin","triangular_flag_on_post","waving_white_flag","waving_black_flag","closed_lock_with_key","lock","unlock","lock_with_ink_pen","lower_left_ballpoint_pen","lower_left_fountain_pen","black_nib","memo","pencil2","lower_left_crayon","lower_left_paintbrush","mag","mag_right","heart","yellow_heart","green_heart","blue_heart","purple_heart","broken_heart","heavy_heart_exclamation_mark_ornament","two_hearts","revolving_hearts","heartbeat","heartpulse","sparkling_heart","cupid","gift_heart","heart_decoration","peace_symbol","latin_cross","star_and_crescent","om_symbol","wheel_of_dharma","star_of_david","six_pointed_star","menorah_with_nine_branches","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_sign","biohazard_sign","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","ab","cl","o2","sos","no_entry","name_badge","no_entry_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","100","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","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","one","two","three","four","five","six","seven","eight","nine","keycap_ten","keycap_star","1234","arrow_forward","double_vertical_bar","black_right_pointing_triangle_with_double_vertical_bar","black_square_for_stop","black_circle_for_record","black_right_pointing_double_triangle_with_vertical_bar","black_left_pointing_double_triangle_with_vertical_bar","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","af","ax","al","dz","as","ad","ao","ai","aq","ag","am","aw","au","at","az","bs","bh","bd","bb","by","be","bz","bj","bm","bt","bo","bq","ba","bw","br","io","vg","bn","bg","bf","bi","cv","kh","cm","ca","ic","ky","cf","td","chile","cn","cx","cc","co","km","cg","drc","ck","cr","hr","cu","cw","cy","cz","dk","dj","dm","do","ec","eg","sv","gq","er","ee","et","eu","fk","fo","fj","fi","fr","gf","pf","tf","ga","gm","ge","de","gh","gi","gr","gl","gd","gp","gu","gt","gg","gn","gw","gy","ht","hn","hk","hu","is","in","indonesia","ir","iq","ie","im","il","it","ci","jm","jp","je","jo","kz","ke","ki","xk","kw","kg","la","lv","lb","ls","lr","ly","li","lt","lu","mo","mk","mg","mw","my","mv","ml","mt","mh","mq","mr","mu","yt","mx","fm","md","mc","mn","me","ms","ma","mz","mm","na","nr","np","nl","nc","nz","ni","ne","nigeria","nu","nf","mp","kp","no","om","pk","pw","ps","pa","pg","py","pe","ph","pn","pl","pt","pr","qa","re","ro","ru","rw","bl","sh","kn","lc","pm","vc","ws","sm","st","saudi_arabia","sn","rs","sc","sl","sg","sx","sk","si","sb","so","za","gs","kr","ss","es","lk","sd","sr","sz","se","ch","sy","tw","tj","tz","th","tl","tg","tk","to","tt","tn","tr","turkmenistan","tc","tuvalu","ug","ua","ae","gb","us","vi","uy","uz","vu","va","ve","vn","wf","eh","ye","zm","zw","octocat","shipit","bowtie","neckbeard","metal","fu","trollface","godmode","goberserk","finnadie","feelsgood","rage1","rage2","rage3","rage4","suspect","hurtrealbad","EmojiSelectorPanelComponent","activeCategory","searchResults","searchVisible","selected","_searchQuery","keys","k","splice","console","log","humanize","str","toUpperCase","select","pairs","object","hideSearch","showSearch","cats","categoryIcons","people","animals_and_nature","travel_and_places","activity","food_and_drink","objects","_c","pair","emoji","icon","emojis","html","twemoji","categories","EmojiSelectorButtonComponent","overlay","_selected","showEmojiPanel","overlayX","overlayY","originX","originY","overlayRef","insert","dispose","show","positionStrategy","position","flexibleConnectedTo","withPositions","withFlexibleDimensions","hasBackdrop","disposeOnNavigation","scrollStrategy","scrollStrategies","reposition","autoClose","backdropClick","subscribe","keydownEvents","event","attach","selectorPanelTemplate","Overlay","FormsModule","MatFormFieldModule","MatInputModule","OverlayModule","PortalModule","ChatBackendBase","_userChanged","BehaviorSubject","_attachmentScrapers","_attachmentResolvers","_user","user","registerAttachmentScraper","scraper","registerAttachmentResolver","resolver","slice","BantaComponent","backend","matDialog","_subs","Subscription","auxOpen","auxTitle","auxMode","mobileFocus","newNotifications","chatLabel","commentsLabel","_signInSelected","pointOpen","pointSubChat","newPointSubMessage","genericAvatarUrl","add","userChanged","currentUser","notificationsChanged","notifs","notifications","newNotification","notif","sendPointSubMessage","message","sentAt","likes","send","e_1","goToMessage","targetMessage","parentMessageId","parentMessage","getMessage","topicId","e_2","dir","viewType","getViewType","getSourceForThread","refreshMessage","firehose","jumpToMessage","pointUnfocus","unsubscribe","showAux","mode","showNotifications","_topicID","connectToTopic","getSourceForTopic","firehoseSource","pointSource","showSignIn","closeAux","endsWith","upvoteMessage","showProfile","profileUser","username","sendReport","alert","reportMessage","reportedMessage","MatDialog","static","ChatMessageComponent","_reported","_upvoted","_userSelected","avatarForUser","avatarUrl","upvote","report","selectUser","LiveChatMessageComponent","_message","originalId","watchMessage","ChatViewComponent","_sourceSubs","_selected$","asObservable","_reported$","_upvoted$","_userSelected$","_received","_received$","messages","maxMessages","emptyLabel","_source","messageReceived","msg","messageSent","getInitialMessages","getExistingMessages","forEach","reverse","sortMessages","sorter","source","sort","addMessage","shift","isScrolledToLatest","scrollToLatest","messageContainer","el","scrollTop","scrollHeight","offsetHeight","jumpTo","messageElement","querySelector","scrollIntoView","behavior","flashMessage","flashedMessageId","mentionsMe","selectMessage","selectMessageUser","BantaChatComponent","signInLabel","sendLabel","permissionDeniedLabel","messageFieldPlaceholder","_permissionDeniedError","_permissionDeniedError$","_signInSelected$","newMessage","identifier","setSourceFromTopicID","topicID","onReceived","sendPermissionError","insertEmoji","onKeyDown","chatView","likeMessage","sendMessage","location","undefined","shouldInterceptMessageSend","inputElementRef","focus","EmojiModule","LiveMessageComponent","CommentComponent","_liked","_unliked","_shared","_avatarSelected","_usernameSelected","maxLength","isNew","visible","showReplyAction","isLoaded","mine","_editStarted","_deleted","_editEnded","_edited","randomTime","random","markAttachmentsLoaded","highlighted","waitForLoad","pipe","take","toPromise","_d","saveEdit","editedMessage","endEditing","startEdit","delete","like","unlike","share","selectUsername","selectAvatar","submessages","submessageCount","CommentViewComponent","_messageEdited","showEmptyState","allowReplies","customMenuItems","menuMessage","customSortEnabled","sourceLoaded","markSourceLoaded","maxVisibleMessages","newestLast","isViewingMore","isLoadingMore","hasMore","newMessages","olderMessages","sortOrderChanged","from","commentsQuery","isMessageLoadedInContext","find","loadMessageInContext","showMore","pageSize","items","findIndex","startIndex","getCommentComponentForMessage","Error","comments","sortOrder","CommentsOrder","NEWEST","bantaSourceDebug","unlikeMessage","sharedMessage","startEditing","deleteMessage","messageIdentity","chatMessage","showNew","naturalOrder","overflow","lastMessage","loadAfter","destination","bucket","unshift","pagingCursor","incrementPagingCursors","maxPagingCursor","_e","_f","group","group_1","group_1_1","Number","waitForAllCommentsToLoad","all","LIKES","OLDEST","ViewChildren","Directive","BantaCommentsComponent","activatedRoute","matSnackBar","ngZone","isMobileSized","viewReady","markViewReady","_loadingMessage","loadingMessageVisible","showLoadingScreen","_loadingMessageIndex","maxCommentLength","loadingMessages","useInlineReplies","markLoaded","_editAvatarSelected","_sourceIsOwned","_sortOrder","selectedMessageVisible","replyLabel","sendingLabel","postCommentLabel","postReplyLabel","allowAttachments","toString","participants","hashtags","hashtag","description","loadingSharedComment","sharedCommentMissing","handleBackendException","sendReply","selectedMessageThread","handleBackendExceptionAsAlert","prefix","sendPermissionDenied","startLoading","commentID","search","substring","split","reduce","decodeURIComponent","sharedCommentID","callback","size","getBoundingClientRect","run","width","height","ResizeObserver","resizeObserver","observe","clientWidth","clientHeight","disconnect","loadingStartedAt","messageChangedAt","updateLoading","_loadingTimer","threadView","commentView","threadViewQuery","waitForThreadView","changes","state","_sourceSubscription","navigateToSharedComment","lastSharedCommentID","addParticipant","messageObserved","messageUpdated","selectedMessage","hidden","unselectMessage","duration","scrollToComment","commentId","comment","inline","block","ready","get","e_3","element","thread","handlePermissionDenied","scrollToMessage","liking","e_4","userState","liked","e_5","toggleSelectedMessage","warn","showEditAvatar","shareMessage","confirm","e_6","editMessage","newText","e_7","e_8","ActivatedRoute","MatSnackBar","NgZone","ContentChild","BantaReplySendOptionsDirective","read","TemplateRef","LiveCommentComponent","CommentFieldComponent","chatBackend","canComment","signInSelected","editAvatarSelected","sending","expandError","_text","placeholder","textChanged","autocompleteVisible","autocompleteOptions","autoCompleteSelected","chatMessageAttachments","connectionStateChanged","transientMessage","autocompleteEl","showAutoComplete","options","pos","autocompleteContainerEl","left","scrollX","scrollY","activateAutoComplete","option","action","dismissAutoComplete","completionFunc","completionPrefix","indicateError","sendError","clearTimeout","errorTimeout","innerWidth","some","isValidMessage","hasPendingAttachments","autocomplete","replacement","textareaEl","selectionStart","stopPropagation","preventDefault","ctrlKey","startAutoComplete","displayName","onBlur","submit","addedAttachment","attachmentError","indexOf","alertError","CommentSortComponent","commentsOrder","_sortChange","_sort","AttachmentButtonComponent","cdnProvider","_addedAttachment","_attachmentError","fileInput","click","fileChange","currentTarget","files","file","publicURL","uploading","uploadImage","CDNProvider","AttachmentScraperDirective","attachmentsChange","scrapeDebounce","fragments","Map","addEventListener","scrapeTimeout","scrape","foundFragments","_g","attachmentScrapers","_h","findFragments","fragments_1","fragments_1_1","fragment","resolution","removedFragments","_j","_k","removedFragments_1","removedFragments_1_1","removedFragment","attachmentResolvers","resolveFragment","_m","_o","_p","TextFieldModule","MatMenuModule","BantaCommonModule","MatTooltipModule","MatSelectModule","ChatSource","parentIdentifier","_super_1","subscription","_state","_connectionStateChanged","messageMap","_messageReceived","_messageUpdated","_messageSent","_messageObserved","markReady","bind","socket","_super","subscribeToTopic","authenticate","mapOrUpdateMessages","mapOrUpdateMessage","existingMessage","assign","peer","ensureConnection","reason","messageId","onPermissions","permissions","bantaPermissionsDebug","onChatMessage","count","getCount","SocketRPC","RpcEvent","BANTA_SDK_OPTIONS","ChatBackend","serviceUrl","connectToService","DurableSocket","onopen","onclose","code","onerror","getSourceCountForTopic","fetch","response","status","json","messageCount","getSubMessage","handler","getCardForUrl","method","headers","Content-Type","JSON","stringify","Injectable","Inject","URL_REGEX","UrlAttachmentScraper","item","offset","UrlAttachmentResolver","urlCard","YouTubeAttachmentResolver","videoId","GiphyAttachmentResolver","gifId","TweetAttachmentResolver","BantaSdkModule","script","createElement","async","configure","ngModule","providers","provide","useValue","useClass","CommentsModule","ChatModule","MatDialogModule","MatSnackBarModule","BantaLogoComponent","Observable","observer","subject","stop","publish","refCount"],"mappings":"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","sourcesContent":["import { Component, Input } from \"@angular/core\";\r\n\r\n@Component({\r\n selector: 'banta-timestamp',\r\n template: `\r\n <span *ngIf=\"showAbsolute\" [title]=\"value | date : 'short'\">\r\n {{value | date : 'shortDate'}}\r\n </span>\r\n <span *ngIf=\"!showAbsolute\" [title]=\"value | date : 'short'\">\r\n {{relative}}\r\n </span>\r\n `,\r\n styles: [``]\r\n})\r\nexport class TimestampComponent {\r\n private _value : number;\r\n relative = '';\r\n tooltip = '';\r\n\r\n private updateInterval = null;\r\n\r\n ngOnDestroy() {\r\n if (this.updateInterval)\r\n clearInterval(this.updateInterval);\r\n }\r\n\r\n @Input()\r\n get value() {\r\n return this._value;\r\n }\r\n\r\n showAbsolute = false;\r\n\r\n update() {\r\n \r\n let now = Date.now();\r\n let diff = now - this.value;\r\n let minute = 1000*60;\r\n let hour = minute * 60;\r\n let day = hour * 24;\r\n let week = day * 7;\r\n let month = day * 30;\r\n let year = day * 365;\r\n this.showAbsolute = false;\r\n let updateTime = 0;\r\n\r\n if (diff > year) {\r\n this.showAbsolute = true;\r\n this.relative = 'abs';\r\n return;\r\n }\r\n\r\n if (diff > month) {\r\n let months = Math.floor(diff / month);\r\n\r\n if (months === 1)\r\n this.relative = `${months} month ago`;\r\n else\r\n this.relative = `${months} months ago`;\r\n \r\n } else if (diff > week) {\r\n let weeks = Math.floor(diff / week);\r\n\r\n if (weeks === 1)\r\n this.relative = `${weeks} week ago`;\r\n else\r\n this.relative = `${weeks} weeks ago`;\r\n } else if (diff > day) {\r\n let days = Math.floor(diff / day);\r\n if (days === 1)\r\n this.relative = `${days} day ago`;\r\n else\r\n this.relative = `${days} days ago`;\r\n } else if (diff > hour) {\r\n let hours = Math.floor(diff / hour);\r\n if (hours === 1)\r\n this.relative = `${hours} hour ago`;\r\n else\r\n this.relative = `${hours} hours ago`;\r\n \r\n updateTime = 1000 * 60 * 30;\r\n } else if (diff > minute) {\r\n let minutes = Math.floor(diff / minute);\r\n if (minutes === 1)\r\n this.relative = `${minutes} minute ago`;\r\n else\r\n this.relative = `${minutes} minutes ago`;\r\n updateTime = 1000 * 45;\r\n } else if (diff > 30_000) {\r\n this.relative = `about a minute ago`;\r\n updateTime = 1000 * 60;\r\n } else {\r\n this.relative = `just now`;\r\n updateTime = 1000 * 30;\r\n }\r\n \r\n if (typeof window !== 'undefined') {\r\n clearInterval(this.updateInterval);\r\n if (updateTime > 0) {\r\n this.updateInterval = setInterval(() => this.update());\r\n }\r\n }\r\n }\r\n\r\n set value(v) {\r\n this._value = v;\r\n this.update();\r\n }\r\n}","import { Component, ElementRef, ViewChild } from \"@angular/core\";\r\n\r\n@Component({\r\n selector: 'banta-lightbox',\r\n templateUrl: './lightbox.component.html',\r\n styleUrls: ['./lightbox.component.scss']\r\n})\r\nexport class LightboxComponent {\r\n @ViewChild('container') \r\n containerElement: ElementRef<HTMLDivElement>;\r\n\r\n ngAfterViewInit() {\r\n if (typeof window !== 'undefined') {\r\n document.body.appendChild(this.containerElement.nativeElement);\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.containerElement.nativeElement.remove();\r\n }\r\n\r\n images: string[];\r\n currentImage: string;\r\n\r\n isOpen: boolean;\r\n\r\n close() {\r\n this.isOpen = false;\r\n }\r\n\r\n open(currentImage: string, images: string[]) {\r\n this.currentImage = currentImage;\r\n this.images = images;\r\n this.isOpen = true;\r\n }\r\n}","import { Pipe, PipeTransform } from '@angular/core';\r\nimport * as marked from 'marked';\r\nimport * as DOMPurify from 'dompurify';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\nconst underline = {\r\n name: 'underline',\r\n level: 'inline', // Is this a block-level or inline-level tokenizer?\r\n start(src) { return src.match(/\\+\\+/)?.index; }, // Hint to Marked.js to stop and check for a match\r\n tokenizer(src, tokens) {\r\n const rule = /^\\+\\+(.*?)\\+\\+/; // Regex for the complete token\r\n const match = rule.exec(src);\r\n if (match) {\r\n return { // Token to generate\r\n type: 'underline', // Should match \"name\" above\r\n raw: match[0], // Text to consume from the source\r\n text: this.lexer.inlineTokens(match[1].trim()), // Additional custom properties\r\n };\r\n }\r\n },\r\n renderer(token) {\r\n return `<u>${this.parser.parseInline(token.text)}</u>`;\r\n }\r\n};\r\n\r\nmarked.marked.use({\r\n extensions: [underline]\r\n});\r\n\r\n@Pipe({\r\n name: 'markdownToHtml'\r\n})\r\nexport class BantaMarkdownToHtmlPipe implements PipeTransform {\r\n constructor(\r\n private sanitizer: DomSanitizer\r\n ) {\r\n this.renderer = new marked.Renderer({\r\n headerPrefix: ''\r\n });\r\n const linkRenderer = this.renderer.link;\r\n this.renderer.link = (href, title, text) => {\r\n const html = linkRenderer.call(this.renderer, href, title, text);\r\n return html.replace(/^<a /, '<a target=\"_blank\" rel=\"noopener\" ');\r\n };\r\n }\r\n\r\n renderer: marked.Renderer;\r\n transform(value: string) {\r\n if (!value)\r\n return '';\r\n\r\n return this.sanitizer.bypassSecurityTrustHtml(\r\n DOMPurify.sanitize(\r\n marked.marked.parse(value, {\r\n renderer: this.renderer\r\n }),\r\n {\r\n FORBID_TAGS: ['h1', 'h2', 'h3', 'h4'],\r\n KEEP_CONTENT: true\r\n }\r\n )\r\n );\r\n }\r\n}\r\n\r\n// https://github.com/cure53/DOMPurify/blob/e1c19cf6407d782b666cb1d02a6af191f9cbc09e/demos/hooks-target-blank-demo.html\r\n// Add a hook to make all links open a new window\r\n\r\nDOMPurify.addHook('afterSanitizeAttributes', function(node: HTMLElement & { target?: string }) {\r\n // set all elements owning target to target=_blank\r\n if ('target' in node) {\r\n node.setAttribute('target','_blank');\r\n // prevent https://www.owasp.org/index.php/Reverse_Tabnabbing\r\n node.setAttribute('rel', 'noopener noreferrer');\r\n }\r\n // set non-HTML/MathML links to xlink:show=new\r\n if (!node.hasAttribute('target')\r\n && (node.hasAttribute('xlink:href')\r\n || node.hasAttribute('href'))) {\r\n node.setAttribute('xlink:show', 'new');\r\n }\r\n});","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n@Pipe({\r\n name: 'trustResourceUrl'\r\n})\r\nexport class BantaTrustResourceUrlPipe implements PipeTransform {\r\n constructor(\r\n private sanitizer: DomSanitizer\r\n ) {\r\n }\r\n\r\n transform(value: string) {\r\n if (!value)\r\n return undefined;\r\n\r\n return this.sanitizer.bypassSecurityTrustResourceUrl(value);\r\n }\r\n}","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { ChatMessageMention } from '@banta/common';\r\n\r\n@Pipe({\r\n name: 'mentionLinker'\r\n})\r\nexport class BantaMentionLinkerPipe implements PipeTransform {\r\n transform(value: string, links?: ChatMessageMention[]) {\r\n if (!value)\r\n return '';\r\n\r\n if (!links)\r\n return value;\r\n\r\n let text = value;\r\n\r\n for (let i = 0, max = links.length; i < max; ++i) {\r\n let mention = links[i];\r\n text = text.replace(new RegExp(`${this.escapeRegExp(mention.text)}`, `gi`), `@{${i + 1}}`);\r\n }\r\n\r\n text = text.replace(/@\\{(\\d+)\\}/g, (text, i) => links[i - 1] ? this.formatLink(links[i - 1]) : text);\r\n\r\n return text;\r\n }\r\n\r\n formatLink(link: ChatMessageMention) {\r\n return `<a${ link.external ? ` target=\"_blank\" rel=\"noopener\"` : `` } href=\"${link.link}\">${link.text}</a>`;\r\n }\r\n\r\n /**\r\n * https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex\r\n */\r\n escapeRegExp(string) {\r\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\r\n }\r\n}","import { Component, ElementRef, HostBinding, Input, Output } from \"@angular/core\";\r\nimport { ChatMessageAttachment } from \"@banta/common\";\r\nimport { Subject } from \"rxjs\";\r\n\r\n@Component({\r\n selector: 'banta-attachment',\r\n templateUrl: './attachment.component.html',\r\n styleUrls: ['./attachment.component.scss']\r\n})\r\nexport class BantaAttachmentComponent {\r\n constructor(\r\n private elementRef: ElementRef<HTMLElement>\r\n ) {\r\n\r\n }\r\n\r\n private _attachment: ChatMessageAttachment;\r\n @Input() get attachment() { return this._attachment; }\r\n set attachment(value) {\r\n this._attachment = value;\r\n this.checkLoad();\r\n }\r\n @Input() loading = false;\r\n @Input() editing = false;\r\n @Input() loadingMessage: string = 'Please wait...';\r\n @Input() error = false;\r\n @Input() errorMessage: string = 'An error has occurred';\r\n @Output() removed = new Subject<void>();\r\n @Output() activated = new Subject<void>();\r\n @Output() loaded = new Subject<void>();\r\n\r\n ngOnInit() {\r\n if (typeof window !== 'undefined') {\r\n setTimeout(() => {\r\n if (!window['twttr'])\r\n return;\r\n window['twttr'].widgets.load();\r\n }, 100);\r\n }\r\n }\r\n\r\n private _viewLoaded = false;\r\n ngAfterViewInit() {\r\n this._viewLoaded = true;\r\n this.checkLoad();\r\n }\r\n\r\n private checkLoad() {\r\n if (!this._attachment || !this._viewLoaded || !this.elementRef?.nativeElement)\r\n return;\r\n\r\n if (typeof window === 'undefined')\r\n this.loaded.next();\r\n else\r\n setTimeout(() => this.loaded.next(), 250);\r\n }\r\n\r\n activate() {\r\n this.activated.next();\r\n }\r\n\r\n remove() {\r\n this.removed.next();\r\n }\r\n\r\n get isError() {\r\n return this.error || this.attachment?.transientState?.error;\r\n }\r\n\r\n get theErrorMessage() {\r\n return this.errorMessage || this.attachment?.transientState?.errorMessage;\r\n }\r\n\r\n @HostBinding('class.loading')\r\n get isLoading() {\r\n return this.loading || !this.attachment || this.attachment.transientState?.loading || !this.attachment.url;\r\n }\r\n\r\n get isImageAttachment() {\r\n if (this.attachment.type.startsWith('image/'))\r\n return true;\r\n return false;\r\n }\r\n\r\n get hasFrame() {\r\n if (!this.attachment)\r\n return false;\r\n\r\n return this.attachment.type === 'iframe' || (\r\n this.attachment.type === 'card' \r\n && this.attachment.card.player\r\n );\r\n }\r\n\r\n get frameUrl() {\r\n if (!this.attachment)\r\n return undefined;\r\n \r\n if (this.attachment.type === 'iframe') {\r\n return this.attachment.url;\r\n } else if (this.attachment.type === 'card') {\r\n return this.attachment.card.player;\r\n }\r\n }\r\n}","import { Component, Input, Output, ViewChild } from \"@angular/core\";\r\nimport { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { Subject } from \"rxjs\";\r\nimport { LightboxComponent } from \"../lightbox/lightbox.component\";\r\n\r\n@Component({\r\n selector: 'banta-attachments',\r\n templateUrl: './attachments.component.html',\r\n styleUrls: ['./attachments.component.scss']\r\n})\r\nexport class BantaAttachmentsComponent {\r\n @Input() attachments: ChatMessageAttachment[];\r\n @Input() editing = false;\r\n @ViewChild('lightbox') lightbox: LightboxComponent;\r\n @Output() remove = new Subject<ChatMessageAttachment>();\r\n @Output() loaded = new Subject<void>();\r\n\r\n loadedAttachments = new WeakMap<ChatMessageAttachment, boolean>();\r\n\r\n ngAfterViewInit() {\r\n\r\n }\r\n\r\n markAttachmentLoaded(attachment: ChatMessageAttachment) {\r\n this.loadedAttachments.set(attachment, true);\r\n\r\n if (this.allAttachmentsLoaded)\r\n this.loaded.next();\r\n }\r\n\r\n isAttachmentLoaded(attachment: ChatMessageAttachment) {\r\n return this.loadedAttachments.has(attachment);\r\n }\r\n\r\n get allAttachmentsLoaded() {\r\n return this.attachments.every(x => this.isAttachmentLoaded(x));\r\n }\r\n\r\n removeAttachment(attachment: ChatMessageAttachment) {\r\n this.remove.next(attachment);\r\n }\r\n\r\n isImageAttachment(attachment: ChatMessageAttachment) {\r\n if (attachment.type.startsWith('image/'))\r\n return true;\r\n return false;\r\n }\r\n\r\n isCardAttachment(attachment: ChatMessageAttachment) {\r\n if (['card'].includes(attachment.type))\r\n return true;\r\n return false;\r\n }\r\n\r\n showLightbox(image: ChatMessageAttachment) {\r\n this.lightbox.open(\r\n image.url,\r\n this.attachments\r\n .filter(x => x.type === 'image/png')\r\n .map(x => x.url)\r\n )\r\n }\r\n\r\n get inlineAttachments() {\r\n return this.attachments.filter(x => x.type !== 'card' && (x.style === 'inline' || !x.style));\r\n }\r\n\r\n get blockAttachments() {\r\n return this.attachments.filter(x => x.style === 'block' || x.type === 'card');\r\n }\r\n\r\n attachmentId(index: number, attachment: ChatMessageAttachment) {\r\n return attachment.url;\r\n }\r\n}","import { NgModule } from '@angular/core';\r\nimport { TimestampComponent } from './timestamp.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { LightboxComponent } from './lightbox/lightbox.component';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { BantaMarkdownToHtmlPipe } from './markdown-to-html.pipe';\r\nimport { BantaAttachmentsComponent } from './attachments/attachments.component';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { BantaTrustResourceUrlPipe } from './trust-resource-url.pipe';\r\nimport { BantaAttachmentComponent } from './attachment/attachment.component';\r\nimport { BantaMentionLinkerPipe } from './mention-linker.pipe';\r\n\r\nconst COMPONENTS = [\r\n TimestampComponent,\r\n LightboxComponent,\r\n BantaMarkdownToHtmlPipe,\r\n BantaMentionLinkerPipe,\r\n BantaTrustResourceUrlPipe,\r\n BantaAttachmentComponent,\r\n BantaAttachmentsComponent\r\n];\r\n\r\n@NgModule({\r\n declarations: COMPONENTS,\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatProgressSpinnerModule,\r\n MatButtonModule\r\n ],\r\n exports: COMPONENTS\r\n})\r\nexport class BantaCommonModule {\r\n}","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","export const EMOJIS = {\r\n \"grinning\": {\r\n \"keywords\": [\"face\", \"smile\", \"happy\", \"joy\", \":D\", \"grin\"],\r\n \"char\": \"😀\",\r\n \"category\": \"people\"\r\n },\r\n \"grimacing\": {\r\n \"keywords\": [\"face\", \"grimace\", \"teeth\"],\r\n \"char\": \"😬\",\r\n \"category\": \"people\"\r\n },\r\n \"grin\": {\r\n \"keywords\": [\"face\", \"happy\", \"smile\", \"joy\", \"kawaii\"],\r\n \"char\": \"😁\",\r\n \"category\": \"people\"\r\n },\r\n \"joy\": {\r\n \"keywords\": [\"face\", \"cry\", \"tears\", \"weep\", \"happy\", \"happytears\", \"haha\"],\r\n \"char\": \"😂\",\r\n \"category\": \"people\"\r\n },\r\n \"smiley\": {\r\n \"keywords\": [\"face\", \"happy\", \"joy\", \"haha\", \":D\", \":)\", \"smile\", \"funny\"],\r\n \"char\": \"😃\",\r\n \"category\": \"people\"\r\n },\r\n \"smile\": {\r\n \"keywords\": [\"face\", \"happy\", \"joy\", \"funny\", \"haha\", \"laugh\", \"like\", \":D\", \":)\"],\r\n \"char\": \"😄\",\r\n \"category\": \"people\"\r\n },\r\n \"sweat_smile\": {\r\n \"keywords\": [\"face\", \"hot\", \"happy\", \"laugh\", \"sweat\", \"smile\", \"relief\"],\r\n \"char\": \"😅\",\r\n \"category\": \"people\"\r\n },\r\n \"laughing\": {\r\n \"keywords\": [\"happy\", \"joy\", \"lol\", \"satisfied\", \"haha\", \"face\", \"glad\", \"XD\", \"laugh\"],\r\n \"char\": \"😆\",\r\n \"category\": \"people\"\r\n },\r\n \"innocent\": {\r\n \"keywords\": [\"face\", \"angel\", \"heaven\", \"halo\"],\r\n \"char\": \"😇\",\r\n \"category\": \"people\"\r\n },\r\n \"wink\": {\r\n \"keywords\": [\"face\", \"happy\", \"mischievous\", \"secret\", \";)\", \"smile\"],\r\n \"char\": \"😉\",\r\n \"category\": \"people\"\r\n },\r\n \"blush\": {\r\n \"keywords\": [\"face\", \"smile\", \"happy\", \"flushed\", \"crush\", \"embarrassed\", \"shy\", \"joy\"],\r\n \"char\": \"😊\",\r\n \"category\": \"people\"\r\n },\r\n \"slightly_smiling\": {\r\n \"keywords\": [\"face\", \"smile\"],\r\n \"char\": \"🙂\",\r\n \"category\": \"people\"\r\n },\r\n \"upside_down\": {\r\n \"keywords\": [\"face\", \"flipped\", \"silly\", \"smile\"],\r\n \"char\": \"🙃\",\r\n \"category\": \"people\"\r\n },\r\n \"relaxed\": {\r\n \"keywords\": [\"face\", \"blush\", \"massage\", \"happiness\"],\r\n \"char\": \"☺️\",\r\n \"category\": \"people\"\r\n },\r\n \"yum\": {\r\n \"keywords\": [\"happy\", \"joy\", \"tongue\", \"smile\", \"face\", \"silly\", \"yummy\", \"nom\"],\r\n \"char\": \"😋\",\r\n \"category\": \"people\"\r\n },\r\n \"relieved\": {\r\n \"keywords\": [\"face\", \"relaxed\", \"phew\", \"massage\", \"happiness\"],\r\n \"char\": \"😌\",\r\n \"category\": \"people\"\r\n },\r\n \"heart_eyes\": {\r\n \"keywords\": [\"face\", \"love\", \"like\", \"affection\", \"valentines\", \"infatuation\", \"crush\", \"heart\"],\r\n \"char\": \"😍\",\r\n \"category\": \"people\"\r\n },\r\n \"kissing_heart\": {\r\n \"keywords\": [\"face\", \"love\", \"like\", \"affection\", \"valentines\", \"infatuation\", \"kiss\"],\r\n \"char\": \"😘\",\r\n \"category\": \"people\"\r\n },\r\n \"kissing\": {\r\n \"keywords\": [\"love\", \"like\", \"face\", \"3\", \"valentines\", \"infatuation\", \"kiss\"],\r\n \"char\": \"😗\",\r\n \"category\": \"people\"\r\n },\r\n \"kissing_smiling_eyes\": {\r\n \"keywords\": [\"face\", \"affection\", \"valentines\", \"infatuation\", \"kiss\"],\r\n \"char\": \"😙\",\r\n \"category\": \"people\"\r\n },\r\n \"kissing_closed_eyes\": {\r\n \"keywords\": [\"face\", \"love\", \"like\", \"affection\", \"valentines\", \"infatuation\", \"kiss\"],\r\n \"char\": \"😚\",\r\n \"category\": \"people\"\r\n },\r\n \"stuck_out_tongue_winking_eye\": {\r\n \"keywords\": [\"face\", \"prank\", \"childish\", \"playful\", \"mischievous\", \"smile\", \"wink\", \"tongue\"],\r\n \"char\": \"😜\",\r\n \"category\": \"people\"\r\n },\r\n \"stuck_out_tongue_closed_eyes\": {\r\n \"keywords\": [\"face\", \"prank\", \"playful\", \"mischievous\", \"smile\", \"tongue\"],\r\n \"char\": \"😝\",\r\n \"category\": \"people\"\r\n },\r\n \"stuck_out_tongue\": {\r\n \"keywords\": [\"face\", \"prank\", \"childish\", \"playful\", \"mischievous\", \"smile\", \"tongue\"],\r\n \"char\": \"😛\",\r\n \"category\": \"people\"\r\n },\r\n \"money_mouth\": {\r\n \"keywords\": [\"face\", \"rich\", \"dollar\", \"money\"],\r\n \"char\": \"🤑\",\r\n \"category\": \"people\"\r\n },\r\n \"nerd\": {\r\n \"keywords\": [\"face\", \"nerdy\", \"geek\", \"dork\"],\r\n \"char\": \"🤓\",\r\n \"category\": \"people\"\r\n },\r\n \"sunglasses\": {\r\n \"keywords\": [\"face\", \"cool\", \"smile\", \"summer\", \"beach\", \"sunglass\"],\r\n \"char\": \"😎\",\r\n \"category\": \"people\"\r\n },\r\n \"hugging\": {\r\n \"keywords\": [\"face\", \"smile\", \"hug\"],\r\n \"char\": \"🤗\",\r\n \"category\": \"people\"\r\n },\r\n \"smirk\": {\r\n \"keywords\": [\"face\", \"smile\", \"mean\", \"prank\", \"smug\", \"sarcasm\"],\r\n \"char\": \"😏\",\r\n \"category\": \"people\"\r\n },\r\n \"no_mouth\": {\r\n \"keywords\": [\"face\", \"hellokitty\"],\r\n \"char\": \"😶\",\r\n \"category\": \"people\"\r\n },\r\n \"neutral_face\": {\r\n \"keywords\": [\"indifference\", \"meh\", \":|\", \"neutral\"],\r\n \"char\": \"😐\",\r\n \"category\": \"people\"\r\n },\r\n \"expressionless\": {\r\n \"keywords\": [\"face\", \"indifferent\", \"-_-\", \"meh\", \"deadpan\"],\r\n \"char\": \"😑\",\r\n \"category\": \"people\"\r\n },\r\n \"unamused\": {\r\n \"keywords\": [\"indifference\", \"bored\", \"straight face\", \"serious\", \"sarcasm\"],\r\n \"char\": \"😒\",\r\n \"category\": \"people\"\r\n },\r\n \"rolling_eyes\": {\r\n \"keywords\": [\"face\", \"eyeroll\", \"frustrated\"],\r\n \"char\": \"🙄\",\r\n \"category\": \"people\"\r\n },\r\n \"thinking\": {\r\n \"keywords\": [\"face\", \"hmmm\", \"think\", \"consider\"],\r\n \"char\": \"🤔\",\r\n \"category\": \"people\"\r\n },\r\n \"flushed\": {\r\n \"keywords\": [\"face\", \"blush\", \"shy\", \"flattered\"],\r\n \"char\": \"😳\",\r\n \"category\": \"people\"\r\n },\r\n \"disappointed\": {\r\n \"keywords\": [\"face\", \"sad\", \"upset\", \"depressed\", \":(\"],\r\n \"char\": \"😞\",\r\n \"category\": \"people\"\r\n },\r\n \"worried\": {\r\n \"keywords\": [\"face\", \"concern\", \"nervous\", \":(\"],\r\n \"char\": \"😟\",\r\n \"category\": \"people\"\r\n },\r\n \"angry\": {\r\n \"keywords\": [\"mad\", \"face\", \"annoyed\", \"frustrated\"],\r\n \"char\": \"😠\",\r\n \"category\": \"people\"\r\n },\r\n \"rage\": {\r\n \"keywords\": [\"angry\", \"mad\", \"hate\", \"despise\"],\r\n \"char\": \"😡\",\r\n \"category\": \"people\"\r\n },\r\n \"pensive\": {\r\n \"keywords\": [\"face\", \"sad\", \"depressed\", \"okay\", \"upset\"],\r\n \"char\": \"😔\",\r\n \"category\": \"people\"\r\n },\r\n \"confused\": {\r\n \"keywords\": [\"face\", \"indifference\", \"huh\", \"weird\", \"hmmm\", \":/\"],\r\n \"char\": \"😕\",\r\n \"category\": \"people\"\r\n },\r\n \"slightly_sad\": {\r\n \"keywords\": [\"face\", \"frowning\", \"disappointed\", \"sad\", \"upset\"],\r\n \"char\": \"🙁\",\r\n \"category\": \"people\"\r\n },\r\n \"white_frowning\": {\r\n \"keywords\": [\"face\", \"sad\", \"upset\", \"frown\"],\r\n \"char\": \"☹\",\r\n \"category\": \"people\"\r\n },\r\n \"persevere\": {\r\n \"keywords\": [\"face\", \"sick\", \"no\", \"upset\", \"oops\"],\r\n \"char\": \"😣\",\r\n \"category\": \"people\"\r\n },\r\n \"confounded\": {\r\n \"keywords\": [\"face\", \"confused\", \"sick\", \"unwell\", \"oops\", \":S\"],\r\n \"char\": \"😖\",\r\n \"category\": \"people\"\r\n },\r\n \"tired_face\": {\r\n \"keywords\": [\"sick\", \"whine\", \"upset\", \"frustrated\"],\r\n \"char\": \"😫\",\r\n \"category\": \"people\"\r\n },\r\n \"weary\": {\r\n \"keywords\": [\"face\", \"tired\", \"sleepy\", \"sad\", \"frustrated\", \"upset\"],\r\n \"char\": \"😩\",\r\n \"category\": \"people\"\r\n },\r\n \"triumph\": {\r\n \"keywords\": [\"face\", \"gas\", \"phew\", \"proud\", \"pride\"],\r\n \"char\": \"😤\",\r\n \"category\": \"people\"\r\n },\r\n \"open_mouth\": {\r\n \"keywords\": [\"face\", \"surprise\", \"impressed\", \"wow\", \"whoa\", \":O\"],\r\n \"char\": \"😮\",\r\n \"category\": \"people\"\r\n },\r\n \"scream\": {\r\n \"keywords\": [\"face\", \"munch\", \"scared\", \"omg\"],\r\n \"char\": \"😱\",\r\n \"category\": \"people\"\r\n },\r\n \"fearful\": {\r\n \"keywords\": [\"face\", \"scared\", \"terrified\", \"nervous\", \"oops\", \"huh\"],\r\n \"char\": \"😨\",\r\n \"category\": \"people\"\r\n },\r\n \"cold_sweat\": {\r\n \"keywords\": [\"face\", \"nervous\", \"sweat\"],\r\n \"char\": \"😰\",\r\n \"category\": \"people\"\r\n },\r\n \"hushed\": {\r\n \"keywords\": [\"face\", \"woo\", \"shh\"],\r\n \"char\": \"😯\",\r\n \"category\": \"people\"\r\n },\r\n \"frowning\": {\r\n \"keywords\": [\"face\", \"aw\", \"what\"],\r\n \"char\": \"😦\",\r\n \"category\": \"people\"\r\n },\r\n \"anguished\": {\r\n \"keywords\": [\"face\", \"stunned\", \"nervous\"],\r\n \"char\": \"😧\",\r\n \"category\": \"people\"\r\n },\r\n \"cry\": {\r\n \"keywords\": [\"face\", \"tears\", \"sad\", \"depressed\", \"upset\", \":'(\"],\r\n \"char\": \"😢\",\r\n \"category\": \"people\"\r\n },\r\n \"disappointed_relieved\": {\r\n \"keywords\": [\"face\", \"phew\", \"sweat\", \"nervous\"],\r\n \"char\": \"😥\",\r\n \"category\": \"people\"\r\n },\r\n \"sleepy\": {\r\n \"keywords\": [\"face\", \"tired\", \"rest\", \"nap\"],\r\n \"char\": \"😪\",\r\n \"category\": \"people\"\r\n },\r\n \"sweat\": {\r\n \"keywords\": [\"face\", \"hot\", \"sad\", \"tired\", \"exercise\"],\r\n \"char\": \"😓\",\r\n \"category\": \"people\"\r\n },\r\n \"sob\": {\r\n \"keywords\": [\"face\", \"cry\", \"tears\", \"sad\", \"upset\", \"depressed\"],\r\n \"char\": \"😭\",\r\n \"category\": \"people\"\r\n },\r\n \"dizzy_face\": {\r\n \"keywords\": [\"spent\", \"unconscious\", \"xox\", \"dizzy\"],\r\n \"char\": \"😵\",\r\n \"category\": \"people\"\r\n },\r\n \"astonished\": {\r\n \"keywords\": [\"face\", \"xox\", \"surprised\", \"poisoned\"],\r\n \"char\": \"😲\",\r\n \"category\": \"people\"\r\n },\r\n \"zipper_mouth\": {\r\n \"keywords\": [\"face\", \"sealed\", \"zipper\", \"secret\"],\r\n \"char\": \"🤐\",\r\n \"category\": \"people\"\r\n },\r\n \"mask\": {\r\n \"keywords\": [\"face\", \"sick\", \"ill\", \"disease\"],\r\n \"char\": \"😷\",\r\n \"category\": \"people\"\r\n },\r\n \"thermometer_face\": {\r\n \"keywords\": [\"sick\", \"temperature\", \"thermometer\", \"cold\"],\r\n \"char\": \"🤒\",\r\n \"category\": \"people\"\r\n },\r\n \"bandage_face\": {\r\n \"keywords\": [\"injured\", \"clumsy\", \"bandage\", \"hurt\"],\r\n \"char\": \"🤕\",\r\n \"category\": \"people\"\r\n },\r\n \"sleeping\": {\r\n \"keywords\": [\"face\", \"tired\", \"sleepy\", \"night\", \"zzz\"],\r\n \"char\": \"😴\",\r\n \"category\": \"people\"\r\n },\r\n \"zzz\": {\r\n \"keywords\": [\"sleepy\", \"tired\"],\r\n \"char\": \"💤\",\r\n \"category\": \"people\"\r\n },\r\n \"hankey\": {\r\n \"keywords\": [\"poop\", \"shitface\", \"fail\", \"turd\", \"shit\"],\r\n \"char\": \"💩\",\r\n \"category\": \"people\"\r\n },\r\n \"smiling_imp\": {\r\n \"keywords\": [\"devil\", \"horns\"],\r\n \"char\": \"😈\",\r\n \"category\": \"people\"\r\n },\r\n \"imp\": {\r\n \"keywords\": [\"devil\", \"angry\", \"horns\"],\r\n \"char\": \"👿\",\r\n \"category\": \"people\"\r\n },\r\n \"japanese_ogre\": {\r\n \"keywords\": [\"monster\", \"red\", \"mask\", \"halloween\", \"scary\", \"creepy\", \"devil\", \"demon\", \"japanese\", \"ogre\"],\r\n \"char\": \"👹\",\r\n \"category\": \"people\"\r\n },\r\n \"japanese_goblin\": {\r\n \"keywords\": [\"red\", \"evil\", \"mask\", \"monster\", \"scary\", \"creepy\", \"japanese\", \"goblin\"],\r\n \"char\": \"👺\",\r\n \"category\": \"people\"\r\n },\r\n \"skull\": {\r\n \"keywords\": [\"dead\", \"skeleton\", \"creepy\"],\r\n \"char\": \"💀\",\r\n \"category\": \"people\"\r\n },\r\n \"ghost\": {\r\n \"keywords\": [\"halloween\", \"spooky\", \"scary\"],\r\n \"char\": \"👻\",\r\n \"category\": \"people\"\r\n },\r\n \"alien\": {\r\n \"keywords\": [\"UFO\", \"paul\", \"weird\", \"outer_space\"],\r\n \"char\": \"👽\",\r\n \"category\": \"people\"\r\n },\r\n \"robot\": {\r\n \"keywords\": [\"computer\", \"machine\"],\r\n \"char\": \"🤖\",\r\n \"category\": \"people\"\r\n },\r\n \"smiley_cat\": {\r\n \"keywords\": [\"animal\", \"cats\", \"happy\", \"smile\"],\r\n \"char\": \"😺\",\r\n \"category\": \"people\"\r\n },\r\n \"smile_cat\": {\r\n \"keywords\": [\"animal\", \"cats\", \"smile\"],\r\n \"char\": \"😸\",\r\n \"category\": \"people\"\r\n },\r\n \"joy_cat\": {\r\n \"keywords\": [\"animal\", \"cats\", \"haha\", \"happy\", \"tears\"],\r\n \"char\": \"😹\",\r\n \"category\": \"people\"\r\n },\r\n \"heart_eyes_cat\": {\r\n \"keywords\": [\"animal\", \"love\", \"like\", \"affection\", \"cats\", \"valentines\", \"heart\"],\r\n \"char\": \"😻\",\r\n \"category\": \"people\"\r\n },\r\n \"smirk_cat\": {\r\n \"keywords\": [\"animal\", \"cats\", \"smirk\"],\r\n \"char\": \"😼\",\r\n \"category\": \"people\"\r\n },\r\n \"kissing_cat\": {\r\n \"keywords\": [\"animal\", \"cats\", \"kiss\"],\r\n \"char\": \"😽\",\r\n \"category\": \"people\"\r\n },\r\n \"scream_cat\": {\r\n \"keywords\": [\"animal\", \"cats\", \"munch\", \"scared\", \"scream\"],\r\n \"char\": \"🙀\",\r\n \"category\": \"people\"\r\n },\r\n \"crying_cat_face\": {\r\n \"keywords\": [\"animal\", \"tears\", \"weep\", \"sad\", \"cats\", \"upset\", \"cry\"],\r\n \"char\": \"😿\",\r\n \"category\": \"people\"\r\n },\r\n \"pouting_cat\": {\r\n \"keywords\": [\"animal\", \"cats\"],\r\n \"char\": \"😾\",\r\n \"category\": \"people\"\r\n },\r\n \"raised_hands\": {\r\n \"keywords\": [\"gesture\", \"hooray\", \"yea\", \"celebration\", \"hands\"],\r\n \"char\": \"🙌\",\r\n \"category\": \"people\"\r\n },\r\n \"clap\": {\r\n \"keywords\": [\"hands\", \"praise\", \"applause\", \"congrats\", \"yay\"],\r\n \"char\": \"👏\",\r\n \"category\": \"people\"\r\n },\r\n \"wave\": {\r\n \"keywords\": [\"hands\", \"gesture\", \"goodbye\", \"solong\", \"farewell\", \"hello\", \"palm\"],\r\n \"char\": \"👋\",\r\n \"category\": \"people\"\r\n },\r\n \"+1\": {\r\n \"keywords\": [\"thumbsup\", \"yes\", \"awesome\", \"good\", \"agree\", \"accept\", \"cool\", \"hand\", \"like\"],\r\n \"char\": \"👍\",\r\n \"category\": \"people\"\r\n },\r\n \"minus1\": { // TODO: should be \"-1\", fix TS bug\r\n \"keywords\": [\"thumbsdown\", \"no\", \"dislike\", \"hand\"],\r\n \"char\": \"👎\",\r\n \"category\": \"people\"\r\n },\r\n \"facepunch\": {\r\n \"keywords\": [\"angry\", \"violence\", \"fist\", \"hit\", \"attack\", \"hand\"],\r\n \"char\": \"👊\",\r\n \"category\": \"people\"\r\n },\r\n \"fist\": {\r\n \"keywords\": [\"fingers\", \"hand\", \"grasp\"],\r\n \"char\": \"✊\",\r\n \"category\": \"people\"\r\n },\r\n \"v\": {\r\n \"keywords\": [\"fingers\", \"ohyeah\", \"hand\", \"peace\", \"victory\", \"two\"],\r\n \"char\": \"✌️\",\r\n \"category\": \"people\"\r\n },\r\n \"ok_hand\": {\r\n \"keywords\": [\"fingers\", \"limbs\", \"perfect\", \"ok\"],\r\n \"char\": \"👌\",\r\n \"category\": \"people\"\r\n },\r\n \"hand\": {\r\n \"keywords\": [\"fingers\", \"stop\", \"highfive\", \"palm\", \"ban\", \"raised_hand\"],\r\n \"char\": \"✋\",\r\n \"category\": \"people\"\r\n },\r\n \"open_hands\": {\r\n \"keywords\": [\"fingers\", \"butterfly\", \"hands\", \"open\"],\r\n \"char\": \"👐\",\r\n \"category\": \"people\"\r\n },\r\n \"muscle\": {\r\n \"keywords\": [\"arm\", \"flex\", \"hand\", \"summer\", \"strong\", \"biceps\"],\r\n \"char\": \"💪\",\r\n \"category\": \"people\"\r\n },\r\n \"pray\": {\r\n \"keywords\": [\"please\", \"hope\", \"wish\", \"namaste\", \"highfive\"],\r\n \"char\": \"🙏\",\r\n \"category\": \"people\"\r\n },\r\n \"point_up\": {\r\n \"keywords\": [\"hand\", \"fingers\", \"direction\", \"up\"],\r\n \"char\": \"☝️\",\r\n \"category\": \"people\"\r\n },\r\n \"point_up_2\": {\r\n \"keywords\": [\"fingers\", \"hand\", \"direction\", \"up\"],\r\n \"char\": \"👆\",\r\n \"category\": \"people\"\r\n },\r\n \"point_down\": {\r\n \"keywords\": [\"fingers\", \"hand\", \"direction\", \"down\"],\r\n \"char\": \"👇\",\r\n \"category\": \"people\"\r\n },\r\n \"point_left\": {\r\n \"keywords\": [\"direction\", \"fingers\", \"hand\", \"left\"],\r\n \"char\": \"👈\",\r\n \"category\": \"people\"\r\n },\r\n \"point_right\": {\r\n \"keywords\": [\"fingers\", \"hand\", \"direction\", \"right\"],\r\n \"char\": \"👉\",\r\n \"category\": \"people\"\r\n },\r\n \"middle_finger\": {\r\n \"keywords\": [\"hand\", \"fingers\", \"rude\"],\r\n \"char\": \"🖕\",\r\n \"category\": \"people\"\r\n },\r\n \"splayed_fingers\": {\r\n \"keywords\": [\"hand\", \"fingers\", \"palm\"],\r\n \"char\": \"🖐\",\r\n \"category\": \"people\"\r\n },\r\n \"sign_of_horns\": {\r\n \"keywords\": [\"hand\", \"fingers\", \"evil_eye\", \"metal\", \"rock_on\"],\r\n \"char\": \"🤘\",\r\n \"category\": \"people\"\r\n },\r\n \"vulcan_salute\": {\r\n \"keywords\": [\"hand\", \"fingers\", \"spock\", \"star trek\"],\r\n \"char\": \"🖖\",\r\n \"category\": \"people\"\r\n },\r\n \"writing_hand\": {\r\n \"keywords\": [\"pen\", \"stationery\", \"write\"],\r\n \"char\": \"✍\",\r\n \"category\": \"people\"\r\n },\r\n \"nail_care\": {\r\n \"keywords\": [\"beauty\", \"manicure\", \"finger\", \"fashion\", \"nail\"],\r\n \"char\": \"💅\",\r\n \"category\": \"people\"\r\n },\r\n \"lips\": {\r\n \"keywords\": [\"mouth\", \"kiss\"],\r\n \"char\": \"👄\",\r\n \"category\": \"people\"\r\n },\r\n \"tongue\": {\r\n \"keywords\": [\"mouth\", \"playful\"],\r\n \"char\": \"👅\",\r\n \"category\": \"people\"\r\n },\r\n \"ear\": {\r\n \"keywords\": [\"face\", \"hear\", \"sound\", \"listen\"],\r\n \"char\": \"👂\",\r\n \"category\": \"people\"\r\n },\r\n \"nose\": {\r\n \"keywords\": [\"smell\", \"sniff\"],\r\n \"char\": \"👃\",\r\n \"category\": \"people\"\r\n },\r\n \"eye\": {\r\n \"keywords\": [\"face\", \"look\", \"see\", \"watch\", \"stare\"],\r\n \"char\": \"👁\",\r\n \"category\": \"people\"\r\n },\r\n \"eyes\": {\r\n \"keywords\": [\"look\", \"watch\", \"stalk\", \"peek\", \"see\"],\r\n \"char\": \"👀\",\r\n \"category\": \"people\"\r\n },\r\n \"bust_in_silhouette\": {\r\n \"keywords\": [\"user\", \"person\", \"human\"],\r\n \"char\": \"👤\",\r\n \"category\": \"people\"\r\n },\r\n \"busts_in_silhouette\": {\r\n \"keywords\": [\"user\", \"person\", \"human\", \"group\", \"team\"],\r\n \"char\": \"👥\",\r\n \"category\": \"people\"\r\n },\r\n \"speaking_head\": {\r\n \"keywords\": [\"user\", \"person\", \"human\"],\r\n \"char\": \"🗣\",\r\n \"category\": \"people\"\r\n },\r\n \"baby\": {\r\n \"keywords\": [\"child\", \"boy\", \"girl\", \"toddler\"],\r\n \"char\": \"👶\",\r\n \"category\": \"people\"\r\n },\r\n \"boy\": {\r\n \"keywords\": [\"man\", \"male\", \"guy\", \"teenager\"],\r\n \"char\": \"👦\",\r\n \"category\": \"people\"\r\n },\r\n \"girl\": {\r\n \"keywords\": [\"female\", \"woman\", \"teenager\"],\r\n \"char\": \"👧\",\r\n \"category\": \"people\"\r\n },\r\n \"man\": {\r\n \"keywords\": [\"mustache\", \"father\", \"dad\", \"guy\", \"classy\", \"sir\", \"moustache\"],\r\n \"char\": \"👨\",\r\n \"category\": \"people\"\r\n },\r\n \"woman\": {\r\n \"keywords\": [\"female\", \"girls\", \"lady\"],\r\n \"char\": \"👩\",\r\n \"category\": \"people\"\r\n },\r\n \"person_with_blond_hair\": {\r\n \"keywords\": [\"man\", \"male\", \"boy\", \"blonde\", \"guy\", \"person\"],\r\n \"char\": \"👱\",\r\n \"category\": \"people\"\r\n },\r\n \"older_man\": {\r\n \"keywords\": [\"human\", \"male\", \"men\", \"old\", \"elder\", \"senior\"],\r\n \"char\": \"👴\",\r\n \"category\": \"people\"\r\n },\r\n \"older_woman\": {\r\n \"keywords\": [\"human\", \"female\", \"women\", \"lady\", \"old\", \"elder\", \"senior\"],\r\n \"char\": \"👵\",\r\n \"category\": \"people\"\r\n },\r\n \"man_with_gua_pi_mao\": {\r\n \"keywords\": [\"male\", \"boy\", \"chinese\"],\r\n \"char\": \"👲\",\r\n \"category\": \"people\"\r\n },\r\n \"man_with_turban\": {\r\n \"keywords\": [\"male\", \"indian\", \"hinduism\", \"arabs\"],\r\n \"char\": \"👳\",\r\n \"category\": \"people\"\r\n },\r\n \"cop\": {\r\n \"keywords\": [\"man\", \"police\", \"law\", \"legal\", \"enforcement\", \"arrest\", \"911\"],\r\n \"char\": \"👮\",\r\n \"category\": \"people\"\r\n },\r\n \"construction_worker\": {\r\n \"keywords\": [\"male\", \"human\", \"wip\", \"guy\", \"build\", \"construction\", \"worker\", \"labor\"],\r\n \"char\": \"👷\",\r\n \"category\": \"people\"\r\n },\r\n \"guardsman\": {\r\n \"keywords\": [\"uk\", \"gb\", \"british\", \"male\", \"guy\", \"royal\"],\r\n \"char\": \"💂\",\r\n \"category\": \"people\"\r\n },\r\n \"sleuth\": {\r\n \"keywords\": [\"human\", \"spy\", \"detective\"],\r\n \"char\": \"🕵\",\r\n \"category\": \"people\"\r\n },\r\n \"santa\": {\r\n \"keywords\": [\"festival\", \"man\", \"male\", \"xmas\", \"father christmas\"],\r\n \"char\": \"🎅\",\r\n \"category\": \"people\"\r\n },\r\n \"angel\": {\r\n \"keywords\": [\"heaven\", \"wings\", \"halo\"],\r\n \"char\": \"👼\",\r\n \"category\": \"people\"\r\n },\r\n \"princess\": {\r\n \"keywords\": [\"girl\", \"woman\", \"female\", \"blond\", \"crown\", \"royal\", \"queen\"],\r\n \"char\": \"👸\",\r\n \"category\": \"people\"\r\n },\r\n \"bride_with_veil\": {\r\n \"keywords\": [\"couple\", \"marriage\", \"wedding\", \"woman\", \"bride\"],\r\n \"char\": \"👰\",\r\n \"category\": \"people\"\r\n },\r\n \"runner\": {\r\n \"keywords\": [\"man\", \"walking\", \"exercise\", \"race\", \"running\"],\r\n \"char\": \"🏃\",\r\n \"category\": \"people\"\r\n },\r\n \"walking\": {\r\n \"keywords\": [\"human\", \"feet\", \"steps\"],\r\n \"char\": \"🚶\",\r\n \"category\": \"people\"\r\n },\r\n \"dancer\": {\r\n \"keywords\": [\"female\", \"girl\", \"woman\", \"fun\"],\r\n \"char\": \"💃\",\r\n \"category\": \"people\"\r\n },\r\n \"dancers\": {\r\n \"keywords\": [\"female\", \"bunny\", \"women\", \"girls\"],\r\n \"char\": \"👯\",\r\n \"category\": \"people\"\r\n },\r\n \"couple\": {\r\n \"keywords\": [\"pair\", \"people\", \"human\", \"love\", \"date\", \"dating\", \"like\", \"affection\", \"valentines\", \"marriage\"],\r\n \"char\": \"👫\",\r\n \"category\": \"people\"\r\n },\r\n \"two_men_holding_hands\": {\r\n \"keywords\": [\"pair\", \"couple\", \"love\", \"like\", \"bromance\", \"friendship\", \"people\", \"human\"],\r\n \"char\": \"👬\",\r\n \"category\": \"people\"\r\n },\r\n \"two_women_holding_hands\": {\r\n \"keywords\": [\"pair\", \"friendship\", \"couple\", \"love\", \"like\", \"female\", \"people\", \"human\"],\r\n \"char\": \"👭\",\r\n \"category\": \"people\"\r\n },\r\n \"bow\": {\r\n \"keywords\": [\"man\", \"male\", \"boy\"],\r\n \"char\": \"🙇\",\r\n \"category\": \"people\"\r\n },\r\n \"information_desk_person\": {\r\n \"keywords\": [\"female\", \"girl\", \"woman\", \"human\", \"information\"],\r\n \"char\": \"💁\",\r\n \"category\": \"people\"\r\n },\r\n \"no_good\": {\r\n \"keywords\": [\"female\", \"girl\", \"woman\", \"nope\"],\r\n \"char\": \"🙅\",\r\n \"category\": \"people\"\r\n },\r\n \"ok_woman\": {\r\n \"keywords\": [\"women\", \"girl\", \"female\", \"pink\", \"human\", \"woman\"],\r\n \"char\": \"🙆\",\r\n \"category\": \"people\"\r\n },\r\n \"raising_hand\": {\r\n \"keywords\": [\"female\", \"girl\", \"woman\"],\r\n \"char\": \"🙋\",\r\n \"category\": \"people\"\r\n },\r\n \"person_with_pouting_face\": {\r\n \"keywords\": [\"female\", \"girl\", \"woman\"],\r\n \"char\": \"🙎\",\r\n \"category\": \"people\"\r\n },\r\n \"person_frowning\": {\r\n \"keywords\": [\"female\", \"girl\", \"woman\", \"sad\", \"depressed\", \"discouraged\", \"unhappy\"],\r\n \"char\": \"🙍\",\r\n \"category\": \"people\"\r\n },\r\n \"haircut\": {\r\n \"keywords\": [\"female\", \"girl\", \"woman\"],\r\n \"char\": \"💇\",\r\n \"category\": \"people\"\r\n },\r\n \"massage\": {\r\n \"keywords\": [\"female\", \"girl\", \"woman\", \"head\"],\r\n \"char\": \"💆\",\r\n \"category\": \"people\"\r\n },\r\n \"couple_with_heart\": {\r\n \"keywords\": [\"pair\", \"love\", \"like\", \"affection\", \"human\", \"dating\", \"valentines\", \"marriage\"],\r\n \"char\": \"💑\",\r\n \"category\": \"people\"\r\n },\r\n \"female_couple_with_heart\": {\r\n \"keywords\": [\"pair\", \"love\", \"like\", \"affection\", \"human\", \"dating\", \"valentines\", \"marriage\"],\r\n \"char\": \"👩❤️👩\",\r\n \"category\": \"people\"\r\n },\r\n \"male_couple_with_heart\": {\r\n \"keywords\": [\"pair\", \"love\", \"like\", \"affection\", \"human\", \"dating\", \"valentines\", \"marriage\"],\r\n \"char\": \"👨❤️👨\",\r\n \"category\": \"people\"\r\n },\r\n \"couplekiss\": {\r\n \"keywords\": [\"pair\", \"valentines\", \"love\", \"like\", \"dating\", \"marriage\"],\r\n \"char\": \"💏\",\r\n \"category\": \"people\"\r\n },\r\n \"female_couplekiss\": {\r\n \"keywords\": [\"pair\", \"valentines\", \"love\", \"like\", \"dating\", \"marriage\"],\r\n \"char\": \"👩❤️💋👩\",\r\n \"category\": \"people\"\r\n },\r\n \"male_couplekiss\": {\r\n \"keywords\": [\"pair\", \"valentines\", \"love\", \"like\", \"dating\", \"marriage\"],\r\n \"char\": \"👨❤️💋👨\",\r\n \"category\": \"people\"\r\n },\r\n \"family\": {\r\n \"keywords\": [\"home\", \"parents\", \"child\", \"mom\", \"dad\", \"father\", \"mother\", \"people\", \"human\"],\r\n \"char\": \"👪\",\r\n \"category\": \"people\"\r\n },\r\n \"family_man_woman_girl\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"child\"],\r\n \"char\": \"👨👩👧\",\r\n \"category\": \"people\"\r\n },\r\n \"family_man_woman_girl_boy\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👨👩👧👦\",\r\n \"category\": \"people\"\r\n },\r\n \"family_man_woman_boys\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👨👩👦👦\",\r\n \"category\": \"people\"\r\n },\r\n \"family_man_woman_girls\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👨👩👧👧\",\r\n \"category\": \"people\"\r\n },\r\n \"family_women_boy\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👩👩👦\",\r\n \"category\": \"people\"\r\n },\r\n \"family_women_girl\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👩👩👧\",\r\n \"category\": \"people\"\r\n },\r\n \"family_women_girl_boy\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👩👩👧👦\",\r\n \"category\": \"people\"\r\n },\r\n \"family_women_boys\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👩👩👦👦\",\r\n \"category\": \"people\"\r\n },\r\n \"family_women_girls\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👩👩👧👧\",\r\n \"category\": \"people\"\r\n },\r\n \"family_men_boy\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👨👨👦\",\r\n \"category\": \"people\"\r\n },\r\n \"family_men_girl\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👨👨👧\",\r\n \"category\": \"people\"\r\n },\r\n \"family_men_girl_boy\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👨👨👧👦\",\r\n \"category\": \"people\"\r\n },\r\n \"family_men_boys\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👨👨👦👦\",\r\n \"category\": \"people\"\r\n },\r\n \"family_men_girls\": {\r\n \"keywords\": [\"home\", \"parents\", \"people\", \"human\", \"children\"],\r\n \"char\": \"👨👨👧👧\",\r\n \"category\": \"people\"\r\n },\r\n \"womans_clothes\": {\r\n \"keywords\": [\"fashion\", \"shopping\", \"female\"],\r\n \"char\": \"👚\",\r\n \"category\": \"people\"\r\n },\r\n \"shirt\": {\r\n \"keywords\": [\"fashion\", \"cloth\", \"casual\", \"tshirt\", \"tee\"],\r\n \"char\": \"👕\",\r\n \"category\": \"people\"\r\n },\r\n \"jeans\": {\r\n \"keywords\": [\"fashion\", \"shopping\"],\r\n \"char\": \"👖\",\r\n \"category\": \"people\"\r\n },\r\n \"necktie\": {\r\n \"keywords\": [\"shirt\", \"suitup\", \"formal\", \"fashion\", \"cloth\", \"business\"],\r\n \"char\": \"👔\",\r\n \"category\": \"people\"\r\n },\r\n \"dress\": {\r\n \"keywords\": [\"clothes\", \"fashion\", \"shopping\"],\r\n \"char\": \"👗\",\r\n \"category\": \"people\"\r\n },\r\n \"bikini\": {\r\n \"keywords\": [\"swimming\", \"female\", \"woman\", \"girl\", \"fashion\", \"beach\", \"summer\"],\r\n \"char\": \"👙\",\r\n \"category\": \"people\"\r\n },\r\n \"kimono\": {\r\n \"keywords\": [\"dress\", \"fashion\", \"women\", \"female\", \"japanese\"],\r\n \"char\": \"👘\",\r\n \"category\": \"people\"\r\n },\r\n \"lipstick\": {\r\n \"keywords\": [\"female\", \"girl\", \"fashion\", \"woman\"],\r\n \"char\": \"💄\",\r\n \"category\": \"people\"\r\n },\r\n \"kiss\": {\r\n \"keywords\": [\"face\", \"lips\", \"love\", \"like\", \"affection\", \"valentines\"],\r\n \"char\": \"💋\",\r\n \"category\": \"people\"\r\n },\r\n \"footprints\": {\r\n \"keywords\": [\"feet\", \"tracking\", \"walking\", \"beach\"],\r\n \"char\": \"👣\",\r\n \"category\": \"people\"\r\n },\r\n \"high_heel\": {\r\n \"keywords\": [\"fashion\", \"shoes\", \"female\", \"pumps\", \"stiletto\"],\r\n \"char\": \"👠\",\r\n \"category\": \"people\"\r\n },\r\n \"sandal\": {\r\n \"keywords\": [\"shoes\", \"fashion\", \"flip flops\"],\r\n \"char\": \"👡\",\r\n \"category\": \"people\"\r\n },\r\n \"boot\": {\r\n \"keywords\": [\"shoes\", \"fashion\"],\r\n \"char\": \"👢\",\r\n \"category\": \"people\"\r\n },\r\n \"mans_shoe\": {\r\n \"keywords\": [\"fashion\", \"male\"],\r\n \"char\": \"👞\",\r\n \"category\": \"people\"\r\n },\r\n \"athletic_shoe\": {\r\n \"keywords\": [\"shoes\", \"sports\", \"sneakers\"],\r\n \"char\": \"👟\",\r\n \"category\": \"people\"\r\n },\r\n \"womans_hat\": {\r\n \"keywords\": [\"fashion\", \"accessories\", \"female\", \"lady\", \"spring\"],\r\n \"char\": \"👒\",\r\n \"category\": \"people\"\r\n },\r\n \"tophat\": {\r\n \"keywords\": [\"magic\", \"gentleman\", \"classy\", \"circus\"],\r\n \"char\": \"🎩\",\r\n \"category\": \"people\"\r\n },\r\n \"helmet\": {\r\n \"keywords\": [\"construction\", \"build\"],\r\n \"char\": \"⛑\",\r\n \"category\": \"people\"\r\n },\r\n \"mortar_board\": {\r\n \"keywords\": [\"school\", \"college\", \"degree\", \"university\", \"graduation\", \"cap\", \"hat\", \"legal\", \"learn\", \"education\"],\r\n \"char\": \"🎓\",\r\n \"category\": \"people\"\r\n },\r\n \"crown\": {\r\n \"keywords\": [\"king\", \"kod\", \"leader\", \"royalty\", \"lord\"],\r\n \"char\": \"👑\",\r\n \"category\": \"people\"\r\n },\r\n \"school_satchel\": {\r\n \"keywords\": [\"student\", \"education\", \"bag\", \"backpack\"],\r\n \"char\": \"🎒\",\r\n \"category\": \"people\"\r\n },\r\n \"pouch\": {\r\n \"keywords\": [\"bag\", \"accessories\", \"shopping\"],\r\n \"char\": \"👝\",\r\n \"category\": \"people\"\r\n },\r\n \"purse\": {\r\n \"keywords\": [\"fashion\", \"accessories\", \"money\", \"sales\", \"shopping\"],\r\n \"char\": \"👛\",\r\n \"category\": \"people\"\r\n },\r\n \"handbag\": {\r\n \"keywords\": [\"fashion\", \"accessory\", \"accessories\", \"shopping\"],\r\n \"char\": \"👜\",\r\n \"category\": \"people\"\r\n },\r\n \"briefcase\": {\r\n \"keywords\": [\"business\", \"documents\", \"work\", \"law\", \"legal\"],\r\n \"char\": \"💼\",\r\n \"category\": \"people\"\r\n },\r\n \"eyeglasses\": {\r\n \"keywords\": [\"fashion\", \"accessories\", \"eyesight\", \"nerdy\", \"dork\", \"geek\"],\r\n \"char\": \"👓\",\r\n \"category\": \"people\"\r\n },\r\n \"dark_sunglasses\": {\r\n \"keywords\": [\"face\", \"cool\", \"accessories\"],\r\n \"char\": \"🕶\",\r\n \"category\": \"people\"\r\n },\r\n \"ring\": {\r\n \"keywords\": [\"wedding\", \"propose\", \"marriage\", \"valentines\", \"diamond\", \"fashion\", \"jewelry\", \"gem\", \"engagement\"],\r\n \"char\": \"💍\",\r\n \"category\": \"people\"\r\n },\r\n \"closed_umbrella\": {\r\n \"keywords\": [\"weather\", \"rain\", \"drizzle\"],\r\n \"char\": \"🌂\",\r\n \"category\": \"people\"\r\n },\r\n \"dog\": {\r\n \"keywords\": [\"animal\", \"friend\", \"nature\", \"woof\", \"puppy\", \"pet\", \"faithful\"],\r\n \"char\": \"🐶\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cat\": {\r\n \"keywords\": [\"animal\", \"meow\", \"nature\", \"pet\", \"kitten\"],\r\n \"char\": \"🐱\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"mouse\": {\r\n \"keywords\": [\"animal\", \"nature\", \"cheese\", \"rodent\"],\r\n \"char\": \"🐭\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"hamster\": {\r\n \"keywords\": [\"animal\", \"nature\"],\r\n \"char\": \"🐹\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"rabbit\": {\r\n \"keywords\": [\"animal\", \"nature\", \"pet\", \"spring\", \"magic\", \"bunny\"],\r\n \"char\": \"🐰\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"bear\": {\r\n \"keywords\": [\"animal\", \"nature\", \"wild\"],\r\n \"char\": \"🐻\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"panda_face\": {\r\n \"keywords\": [\"animal\", \"nature\", \"panda\"],\r\n \"char\": \"🐼\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"koala\": {\r\n \"keywords\": [\"animal\", \"nature\"],\r\n \"char\": \"🐨\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"tiger\": {\r\n \"keywords\": [\"animal\", \"cat\", \"danger\", \"wild\", \"nature\", \"roar\"],\r\n \"char\": \"🐯\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"lion_face\": {\r\n \"keywords\": [\"animal\", \"nature\"],\r\n \"char\": \"🦁\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cow\": {\r\n \"keywords\": [\"beef\", \"ox\", \"animal\", \"nature\", \"moo\", \"milk\"],\r\n \"char\": \"🐮\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"pig\": {\r\n \"keywords\": [\"animal\", \"oink\", \"nature\"],\r\n \"char\": \"🐷\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"pig_nose\": {\r\n \"keywords\": [\"animal\", \"oink\"],\r\n \"char\": \"🐽\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"frog\": {\r\n \"keywords\": [\"animal\", \"nature\", \"croak\", \"toad\"],\r\n \"char\": \"🐸\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"octopus\": {\r\n \"keywords\": [\"animal\", \"creature\", \"ocean\", \"sea\", \"nature\", \"beach\"],\r\n \"char\": \"🐙\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"monkey_face\": {\r\n \"keywords\": [\"animal\", \"nature\", \"circus\"],\r\n \"char\": \"🐵\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"see_no_evil\": {\r\n \"keywords\": [\"monkey\", \"animal\", \"nature\", \"haha\"],\r\n \"char\": \"🙈\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"hear_no_evil\": {\r\n \"keywords\": [\"animal\", \"monkey\", \"nature\"],\r\n \"char\": \"🙉\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"speak_no_evil\": {\r\n \"keywords\": [\"monkey\", \"animal\", \"nature\", \"omg\"],\r\n \"char\": \"🙊\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"monkey\": {\r\n \"keywords\": [\"animal\", \"nature\", \"banana\", \"circus\"],\r\n \"char\": \"🐒\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"chicken\": {\r\n \"keywords\": [\"animal\", \"cluck\", \"nature\", \"bird\"],\r\n \"char\": \"🐔\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"penguin\": {\r\n \"keywords\": [\"animal\", \"nature\"],\r\n \"char\": \"🐧\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"bird\": {\r\n \"keywords\": [\"animal\", \"nature\", \"fly\", \"tweet\", \"spring\"],\r\n \"char\": \"🐦\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"baby_chick\": {\r\n \"keywords\": [\"animal\", \"chicken\", \"bird\"],\r\n \"char\": \"🐤\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"hatching_chick\": {\r\n \"keywords\": [\"animal\", \"chicken\", \"egg\", \"born\", \"baby\", \"bird\"],\r\n \"char\": \"🐣\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"hatched_chick\": {\r\n \"keywords\": [\"animal\", \"chicken\", \"baby\", \"bird\"],\r\n \"char\": \"🐥\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"wolf\": {\r\n \"keywords\": [\"animal\", \"nature\", \"wild\"],\r\n \"char\": \"🐺\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"boar\": {\r\n \"keywords\": [\"animal\", \"nature\"],\r\n \"char\": \"🐗\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"horse\": {\r\n \"keywords\": [\"animal\", \"brown\", \"nature\"],\r\n \"char\": \"🐴\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"unicorn_face\": {\r\n \"keywords\": [\"animal\", \"nature\", \"mystical\"],\r\n \"char\": \"🦄\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"bee\": {\r\n \"keywords\": [\"animal\", \"insect\", \"nature\", \"bug\", \"spring\", \"honey\"],\r\n \"char\": \"🐝\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"bug\": {\r\n \"keywords\": [\"animal\", \"insect\", \"nature\", \"worm\"],\r\n \"char\": \"🐛\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"snail\": {\r\n \"keywords\": [\"slow\", \"animal\", \"shell\"],\r\n \"char\": \"🐌\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"beetle\": {\r\n \"keywords\": [\"animal\", \"insect\", \"nature\", \"ladybug\"],\r\n \"char\": \"🐞\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"ant\": {\r\n \"keywords\": [\"animal\", \"insect\", \"nature\", \"bug\"],\r\n \"char\": \"🐜\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"spider\": {\r\n \"keywords\": [\"animal\", \"arachnid\"],\r\n \"char\": \"🕷\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"scorpion\": {\r\n \"keywords\": [\"animal\", \"arachnid\"],\r\n \"char\": \"🦂\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"crab\": {\r\n \"keywords\": [\"animal\", \"crustacean\"],\r\n \"char\": \"🦀\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"snake\": {\r\n \"keywords\": [\"animal\", \"evil\", \"nature\", \"hiss\", \"python\"],\r\n \"char\": \"🐍\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"turtle\": {\r\n \"keywords\": [\"animal\", \"slow\", \"nature\", \"tortoise\"],\r\n \"char\": \"🐢\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"tropical_fish\": {\r\n \"keywords\": [\"animal\", \"swim\", \"ocean\", \"beach\", \"nemo\"],\r\n \"char\": \"🐠\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"fish\": {\r\n \"keywords\": [\"animal\", \"food\", \"nature\"],\r\n \"char\": \"🐟\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"blowfish\": {\r\n \"keywords\": [\"animal\", \"nature\", \"food\", \"sea\", \"ocean\"],\r\n \"char\": \"🐡\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"dolphin\": {\r\n \"keywords\": [\"animal\", \"nature\", \"fish\", \"sea\", \"ocean\", \"flipper\", \"fins\", \"beach\"],\r\n \"char\": \"🐬\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"whale\": {\r\n \"keywords\": [\"animal\", \"nature\", \"sea\", \"ocean\"],\r\n \"char\": \"🐳\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"whale2\": {\r\n \"keywords\": [\"animal\", \"nature\", \"sea\", \"ocean\"],\r\n \"char\": \"🐋\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"crocodile\": {\r\n \"keywords\": [\"animal\", \"nature\", \"reptile\", \"lizard\", \"alligator\"],\r\n \"char\": \"🐊\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"leopard\": {\r\n \"keywords\": [\"animal\", \"nature\"],\r\n \"char\": \"🐆\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"tiger2\": {\r\n \"keywords\": [\"animal\", \"nature\", \"roar\"],\r\n \"char\": \"🐅\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"water_buffalo\": {\r\n \"keywords\": [\"animal\", \"nature\", \"ox\", \"cow\"],\r\n \"char\": \"🐃\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"ox\": {\r\n \"keywords\": [\"animal\", \"cow\", \"beef\"],\r\n \"char\": \"🐂\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cow2\": {\r\n \"keywords\": [\"beef\", \"ox\", \"animal\", \"nature\", \"moo\", \"milk\"],\r\n \"char\": \"🐄\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"dromedary_camel\": {\r\n \"keywords\": [\"animal\", \"hot\", \"desert\", \"hump\"],\r\n \"char\": \"🐪\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"camel\": {\r\n \"keywords\": [\"animal\", \"nature\", \"hot\", \"desert\", \"hump\"],\r\n \"char\": \"🐫\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"elephant\": {\r\n \"keywords\": [\"animal\", \"nature\", \"nose\", \"thailand\", \"circus\"],\r\n \"char\": \"🐘\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"goat\": {\r\n \"keywords\": [\"animal\", \"nature\"],\r\n \"char\": \"🐐\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"ram\": {\r\n \"keywords\": [\"animal\", \"sheep\", \"nature\"],\r\n \"char\": \"🐏\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"sheep\": {\r\n \"keywords\": [\"animal\", \"nature\", \"wool\", \"shipit\"],\r\n \"char\": \"🐑\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"racehorse\": {\r\n \"keywords\": [\"animal\", \"gamble\", \"luck\"],\r\n \"char\": \"🐎\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"pig2\": {\r\n \"keywords\": [\"animal\", \"nature\"],\r\n \"char\": \"🐖\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"rat\": {\r\n \"keywords\": [\"animal\", \"mouse\", \"rodent\"],\r\n \"char\": \"🐀\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"mouse2\": {\r\n \"keywords\": [\"animal\", \"nature\", \"rodent\"],\r\n \"char\": \"🐁\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"rooster\": {\r\n \"keywords\": [\"animal\", \"nature\", \"chicken\"],\r\n \"char\": \"🐓\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"turkey\": {\r\n \"keywords\": [\"animal\", \"bird\"],\r\n \"char\": \"🦃\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"dove_of_peace\": {\r\n \"keywords\": [\"animal\", \"bird\"],\r\n \"char\": \"🕊\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"dog2\": {\r\n \"keywords\": [\"animal\", \"nature\", \"friend\", \"doge\", \"pet\", \"faithful\"],\r\n \"char\": \"🐕\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"poodle\": {\r\n \"keywords\": [\"dog\", \"animal\", \"101\", \"nature\", \"pet\"],\r\n \"char\": \"🐩\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cat2\": {\r\n \"keywords\": [\"animal\", \"meow\", \"pet\", \"cats\"],\r\n \"char\": \"🐈\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"rabbit2\": {\r\n \"keywords\": [\"animal\", \"nature\", \"pet\", \"magic\", \"spring\"],\r\n \"char\": \"🐇\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"chipmunk\": {\r\n \"keywords\": [\"animal\", \"nature\", \"rodent\", \"squirrel\"],\r\n \"char\": \"🐿\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"feet\": {\r\n \"keywords\": [\"animal\", \"tracking\", \"footprints\", \"dog\", \"cat\", \"pet\", \"paw_prints\"],\r\n \"char\": \"🐾\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"dragon\": {\r\n \"keywords\": [\"animal\", \"myth\", \"nature\", \"chinese\", \"green\"],\r\n \"char\": \"🐉\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"dragon_face\": {\r\n \"keywords\": [\"animal\", \"myth\", \"nature\", \"chinese\", \"green\"],\r\n \"char\": \"🐲\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cactus\": {\r\n \"keywords\": [\"vegetable\", \"plant\", \"nature\"],\r\n \"char\": \"🌵\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"christmas_tree\": {\r\n \"keywords\": [\"festival\", \"vacation\", \"december\", \"xmas\", \"celebration\"],\r\n \"char\": \"🎄\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"evergreen_tree\": {\r\n \"keywords\": [\"plant\", \"nature\"],\r\n \"char\": \"🌲\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"deciduous_tree\": {\r\n \"keywords\": [\"plant\", \"nature\"],\r\n \"char\": \"🌳\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"palm_tree\": {\r\n \"keywords\": [\"plant\", \"vegetable\", \"nature\", \"summer\", \"beach\", \"mojito\", \"tropical\"],\r\n \"char\": \"🌴\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"seedling\": {\r\n \"keywords\": [\"plant\", \"nature\", \"grass\", \"lawn\", \"spring\"],\r\n \"char\": \"🌱\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"herb\": {\r\n \"keywords\": [\"vegetable\", \"plant\", \"medicine\", \"weed\", \"grass\", \"lawn\"],\r\n \"char\": \"🌿\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"shamrock\": {\r\n \"keywords\": [\"vegetable\", \"plant\", \"nature\", \"irish\", \"clover\"],\r\n \"char\": \"☘\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"four_leaf_clover\": {\r\n \"keywords\": [\"vegetable\", \"plant\", \"nature\", \"lucky\", \"irish\"],\r\n \"char\": \"🍀\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"bamboo\": {\r\n \"keywords\": [\"plant\", \"nature\", \"vegetable\", \"panda\", \"pine_decoration\"],\r\n \"char\": \"🎍\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"tanabata_tree\": {\r\n \"keywords\": [\"plant\", \"nature\", \"branch\", \"summer\"],\r\n \"char\": \"🎋\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"leaves\": {\r\n \"keywords\": [\"nature\", \"plant\", \"tree\", \"vegetable\", \"grass\", \"lawn\", \"spring\"],\r\n \"char\": \"🍃\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"fallen_leaf\": {\r\n \"keywords\": [\"nature\", \"plant\", \"vegetable\", \"leaves\"],\r\n \"char\": \"🍂\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"maple_leaf\": {\r\n \"keywords\": [\"nature\", \"plant\", \"vegetable\", \"canada\", \"fall\"],\r\n \"char\": \"🍁\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"ear_of_rice\": {\r\n \"keywords\": [\"nature\", \"plant\"],\r\n \"char\": \"🌾\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"hibiscus\": {\r\n \"keywords\": [\"plant\", \"vegetable\", \"flowers\", \"beach\"],\r\n \"char\": \"🌺\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"sunflower\": {\r\n \"keywords\": [\"nature\", \"plant\", \"fall\"],\r\n \"char\": \"🌻\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"rose\": {\r\n \"keywords\": [\"flowers\", \"valentines\", \"love\", \"spring\"],\r\n \"char\": \"🌹\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"tulip\": {\r\n \"keywords\": [\"flowers\", \"plant\", \"nature\", \"summer\", \"spring\"],\r\n \"char\": \"🌷\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"blossom\": {\r\n \"keywords\": [\"nature\", \"flowers\", \"yellow\"],\r\n \"char\": \"🌼\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cherry_blossom\": {\r\n \"keywords\": [\"nature\", \"plant\", \"spring\", \"flower\"],\r\n \"char\": \"🌸\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"bouquet\": {\r\n \"keywords\": [\"flowers\", \"nature\", \"spring\"],\r\n \"char\": \"💐\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"mushroom\": {\r\n \"keywords\": [\"plant\", \"vegetable\"],\r\n \"char\": \"🍄\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"chestnut\": {\r\n \"keywords\": [\"food\", \"squirrel\"],\r\n \"char\": \"🌰\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"jack_o_lantern\": {\r\n \"keywords\": [\"halloween\", \"light\", \"pumpkin\", \"creepy\", \"fall\"],\r\n \"char\": \"🎃\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"shell\": {\r\n \"keywords\": [\"nature\", \"sea\", \"beach\"],\r\n \"char\": \"🐚\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"spider_web\": {\r\n \"keywords\": [\"animal\", \"insect\", \"arachnid\", \"silk\"],\r\n \"char\": \"🕸\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"earth_americas\": {\r\n \"keywords\": [\"globe\", \"world\", \"USA\", \"international\"],\r\n \"char\": \"🌎\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"earth_africa\": {\r\n \"keywords\": [\"globe\", \"world\", \"international\"],\r\n \"char\": \"🌍\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"earth_asia\": {\r\n \"keywords\": [\"globe\", \"world\", \"east\", \"international\"],\r\n \"char\": \"🌏\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"full_moon\": {\r\n \"keywords\": [\"nature\", \"yellow\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\"],\r\n \"char\": \"🌕\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"waning_gibbous_moon\": {\r\n \"keywords\": [\"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\", \"waxing_gibbous_moon\"],\r\n \"char\": \"🌖\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"last_quarter_moon\": {\r\n \"keywords\": [\"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\"],\r\n \"char\": \"🌗\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"waning_crescent_moon\": {\r\n \"keywords\": [\"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\"],\r\n \"char\": \"🌘\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"new_moon\": {\r\n \"keywords\": [\"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\"],\r\n \"char\": \"🌑\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"waxing_crescent_moon\": {\r\n \"keywords\": [\"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\"],\r\n \"char\": \"🌒\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"first_quarter_moon\": {\r\n \"keywords\": [\"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\"],\r\n \"char\": \"🌓\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"moon\": {\r\n \"keywords\": [\"nature\", \"night\", \"sky\", \"gray\", \"twilight\", \"planet\", \"space\", \"evening\", \"sleep\"],\r\n \"char\": \"🌔\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"new_moon_with_face\": {\r\n \"keywords\": [\"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\"],\r\n \"char\": \"🌚\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"full_moon_with_face\": {\r\n \"keywords\": [\"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\"],\r\n \"char\": \"🌝\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"first_quarter_moon_with_face\": {\r\n \"keywords\": [\"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\"],\r\n \"char\": \"🌛\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"last_quarter_moon_with_face\": {\r\n \"keywords\": [\"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\"],\r\n \"char\": \"🌜\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"sun_with_face\": {\r\n \"keywords\": [\"nature\", \"morning\", \"sky\"],\r\n \"char\": \"🌞\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"crescent_moon\": {\r\n \"keywords\": [\"night\", \"sleep\", \"sky\", \"evening\", \"magic\"],\r\n \"char\": \"🌙\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"star\": {\r\n \"keywords\": [\"night\", \"yellow\"],\r\n \"char\": \"⭐\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"star2\": {\r\n \"keywords\": [\"night\", \"sparkle\", \"awesome\", \"good\", \"magic\"],\r\n \"char\": \"🌟\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"dizzy\": {\r\n \"keywords\": [\"star\", \"sparkle\", \"shoot\", \"magic\"],\r\n \"char\": \"💫\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"sparkles\": {\r\n \"keywords\": [\"stars\", \"shine\", \"shiny\", \"cool\", \"awesome\", \"good\", \"magic\"],\r\n \"char\": \"✨\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"comet\": {\r\n \"keywords\": [\"space\"],\r\n \"char\": \"☄\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"sunny\": {\r\n \"keywords\": [\"weather\", \"nature\", \"brightness\", \"summer\", \"beach\", \"spring\"],\r\n \"char\": \"☀️\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"white_sun_with_small_cloud\": {\r\n \"keywords\": [\"weather\"],\r\n \"char\": \"🌤\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"partly_sunny\": {\r\n \"keywords\": [\"weather\", \"nature\", \"cloudy\", \"morning\", \"fall\", \"spring\"],\r\n \"char\": \"⛅\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"white_sun_behind_cloud\": {\r\n \"keywords\": [\"weather\"],\r\n \"char\": \"🌥\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"white_sun_behind_cloud_with_rain\": {\r\n \"keywords\": [\"weather\"],\r\n \"char\": \"🌦\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cloud\": {\r\n \"keywords\": [\"weather\", \"sky\"],\r\n \"char\": \"☁️\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cloud_with_rain\": {\r\n \"keywords\": [\"weather\"],\r\n \"char\": \"🌧\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"thunder_cloud_and_rain\": {\r\n \"keywords\": [\"weather\", \"lightning\"],\r\n \"char\": \"⛈\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cloud_with_lightning\": {\r\n \"keywords\": [\"weather\", \"thunder\"],\r\n \"char\": \"🌩\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"zap\": {\r\n \"keywords\": [\"thunder\", \"weather\", \"lightning bolt\", \"fast\"],\r\n \"char\": \"⚡\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"fire\": {\r\n \"keywords\": [\"hot\", \"cook\", \"flame\"],\r\n \"char\": \"🔥\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"boom\": {\r\n \"keywords\": [\"bomb\", \"explode\", \"explosion\", \"collision\", \"blown\"],\r\n \"char\": \"💥\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"snowflake\": {\r\n \"keywords\": [\"winter\", \"season\", \"cold\", \"weather\", \"christmas\", \"xmas\"],\r\n \"char\": \"❄️\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cloud_with_snow\": {\r\n \"keywords\": [\"weather\"],\r\n \"char\": \"🌨\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"snowman\": {\r\n \"keywords\": [\"winter\", \"season\", \"cold\", \"weather\", \"christmas\", \"xmas\", \"frozen\", \"without_snow\"],\r\n \"char\": \"⛄\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"snowman_with_snow\": {\r\n \"keywords\": [\"winter\", \"season\", \"cold\", \"weather\", \"christmas\", \"xmas\", \"frozen\"],\r\n \"char\": \"☃\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"wind_blowing_face\": {\r\n \"keywords\": [\"gust\", \"air\"],\r\n \"char\": \"🌬\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"dash\": {\r\n \"keywords\": [\"wind\", \"air\", \"fast\", \"shoo\", \"fart\", \"smoke\", \"puff\"],\r\n \"char\": \"💨\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"cloud_with_tornado\": {\r\n \"keywords\": [\"weather\", \"cyclone\", \"twister\"],\r\n \"char\": \"🌪\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"fog\": {\r\n \"keywords\": [\"weather\"],\r\n \"char\": \"🌫\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"umbrella_without_rain\": {\r\n \"keywords\": [\"weather\", \"spring\"],\r\n \"char\": \"☂\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"umbrella\": {\r\n \"keywords\": [\"rainy\", \"weather\", \"spring\"],\r\n \"char\": \"☔\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"droplet\": {\r\n \"keywords\": [\"water\", \"drip\", \"faucet\", \"spring\"],\r\n \"char\": \"💧\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"sweat_drops\": {\r\n \"keywords\": [\"water\", \"drip\", \"oops\"],\r\n \"char\": \"💦\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"ocean\": {\r\n \"keywords\": [\"sea\", \"water\", \"wave\", \"nature\", \"tsunami\", \"disaster\"],\r\n \"char\": \"🌊\",\r\n \"category\": \"animals_and_nature\"\r\n },\r\n \"green_apple\": {\r\n \"keywords\": [\"fruit\", \"nature\"],\r\n \"char\": \"🍏\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"apple\": {\r\n \"keywords\": [\"fruit\", \"mac\", \"school\"],\r\n \"char\": \"🍎\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"pear\": {\r\n \"keywords\": [\"fruit\", \"nature\", \"food\"],\r\n \"char\": \"🍐\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"tangerine\": {\r\n \"keywords\": [\"food\", \"fruit\", \"nature\", \"orange\"],\r\n \"char\": \"🍊\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"lemon\": {\r\n \"keywords\": [\"fruit\", \"nature\"],\r\n \"char\": \"🍋\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"banana\": {\r\n \"keywords\": [\"fruit\", \"food\", \"monkey\"],\r\n \"char\": \"🍌\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"watermelon\": {\r\n \"keywords\": [\"fruit\", \"food\", \"picnic\", \"summer\"],\r\n \"char\": \"🍉\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"grapes\": {\r\n \"keywords\": [\"fruit\", \"food\", \"wine\"],\r\n \"char\": \"🍇\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"strawberry\": {\r\n \"keywords\": [\"fruit\", \"food\", \"nature\"],\r\n \"char\": \"🍓\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"melon\": {\r\n \"keywords\": [\"fruit\", \"nature\", \"food\"],\r\n \"char\": \"🍈\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"cherries\": {\r\n \"keywords\": [\"food\", \"fruit\"],\r\n \"char\": \"🍒\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"peach\": {\r\n \"keywords\": [\"fruit\", \"nature\", \"food\"],\r\n \"char\": \"🍑\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"pineapple\": {\r\n \"keywords\": [\"fruit\", \"nature\", \"food\"],\r\n \"char\": \"🍍\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"tomato\": {\r\n \"keywords\": [\"fruit\", \"vegetable\", \"nature\", \"food\"],\r\n \"char\": \"🍅\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"eggplant\": {\r\n \"keywords\": [\"vegetable\", \"nature\", \"food\", \"aubergine\"],\r\n \"char\": \"🍆\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"hot_pepper\": {\r\n \"keywords\": [\"food\", \"spicy\", \"chilli\", \"chili\"],\r\n \"char\": \"🌶\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"corn\": {\r\n \"keywords\": [\"food\", \"vegetable\", \"plant\"],\r\n \"char\": \"🌽\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"sweet_potato\": {\r\n \"keywords\": [\"food\", \"nature\"],\r\n \"char\": \"🍠\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"honey_pot\": {\r\n \"keywords\": [\"bees\", \"sweet\", \"kitchen\"],\r\n \"char\": \"🍯\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"bread\": {\r\n \"keywords\": [\"food\", \"wheat\", \"breakfast\", \"toast\"],\r\n \"char\": \"🍞\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"cheese_wedge\": {\r\n \"keywords\": [\"food\", \"chadder\"],\r\n \"char\": \"🧀\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"poultry_leg\": {\r\n \"keywords\": [\"food\", \"meat\", \"drumstick\", \"bird\", \"chicken\", \"turkey\"],\r\n \"char\": \"🍗\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"meat_on_bone\": {\r\n \"keywords\": [\"good\", \"food\", \"drumstick\"],\r\n \"char\": \"🍖\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"fried_shrimp\": {\r\n \"keywords\": [\"food\", \"animal\", \"appetizer\", \"summer\"],\r\n \"char\": \"🍤\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"egg\": {\r\n \"keywords\": [\"food\", \"breakfast\", \"kitchen\"],\r\n \"char\": \"🍳\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"hamburger\": {\r\n \"keywords\": [\"meat\", \"fast food\", \"beef\", \"cheeseburger\", \"mcdonalds\", \"burger king\"],\r\n \"char\": \"🍔\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"fries\": {\r\n \"keywords\": [\"chips\", \"snack\", \"fast food\"],\r\n \"char\": \"🍟\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"hot_dog\": {\r\n \"keywords\": [\"food\", \"frankfurter\", \"hotdog\"],\r\n \"char\": \"🌭\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"pizza\": {\r\n \"keywords\": [\"food\", \"party\"],\r\n \"char\": \"🍕\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"spaghetti\": {\r\n \"keywords\": [\"food\", \"italian\", \"noodle\"],\r\n \"char\": \"🍝\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"taco\": {\r\n \"keywords\": [\"food\", \"mexican\"],\r\n \"char\": \"🌮\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"burrito\": {\r\n \"keywords\": [\"food\", \"mexican\"],\r\n \"char\": \"🌯\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"ramen\": {\r\n \"keywords\": [\"food\", \"japanese\", \"noodle\", \"chopsticks\"],\r\n \"char\": \"🍜\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"stew\": {\r\n \"keywords\": [\"food\", \"meat\", \"soup\"],\r\n \"char\": \"🍲\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"fish_cake\": {\r\n \"keywords\": [\"food\", \"japan\", \"sea\", \"beach\"],\r\n \"char\": \"🍥\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"sushi\": {\r\n \"keywords\": [\"food\", \"fish\", \"japanese\", \"rice\"],\r\n \"char\": \"🍣\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"bento\": {\r\n \"keywords\": [\"food\", \"japanese\", \"box\"],\r\n \"char\": \"🍱\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"curry\": {\r\n \"keywords\": [\"food\", \"spicy\", \"hot\", \"indian\"],\r\n \"char\": \"🍛\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"rice_ball\": {\r\n \"keywords\": [\"food\", \"japanese\"],\r\n \"char\": \"🍙\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"rice\": {\r\n \"keywords\": [\"food\", \"china\", \"asian\"],\r\n \"char\": \"🍚\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"rice_cracker\": {\r\n \"keywords\": [\"food\", \"japanese\"],\r\n \"char\": \"🍘\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"oden\": {\r\n \"keywords\": [\"food\", \"japanese\"],\r\n \"char\": \"🍢\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"dango\": {\r\n \"keywords\": [\"food\", \"dessert\", \"sweet\", \"japanese\", \"barbecue\", \"meat\"],\r\n \"char\": \"🍡\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"shaved_ice\": {\r\n \"keywords\": [\"hot\", \"dessert\", \"summer\"],\r\n \"char\": \"🍧\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"ice_cream\": {\r\n \"keywords\": [\"food\", \"hot\", \"dessert\"],\r\n \"char\": \"🍨\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"icecream\": {\r\n \"keywords\": [\"food\", \"hot\", \"dessert\", \"summer\"],\r\n \"char\": \"🍦\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"cake\": {\r\n \"keywords\": [\"food\", \"dessert\"],\r\n \"char\": \"🍰\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"birthday\": {\r\n \"keywords\": [\"food\", \"dessert\", \"cake\"],\r\n \"char\": \"🎂\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"custard\": {\r\n \"keywords\": [\"dessert\", \"food\"],\r\n \"char\": \"🍮\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"candy\": {\r\n \"keywords\": [\"snack\", \"dessert\", \"sweet\", \"lolly\"],\r\n \"char\": \"🍬\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"lollipop\": {\r\n \"keywords\": [\"food\", \"snack\", \"candy\", \"sweet\"],\r\n \"char\": \"🍭\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"chocolate_bar\": {\r\n \"keywords\": [\"food\", \"snack\", \"dessert\", \"sweet\"],\r\n \"char\": \"🍫\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"popcorn\": {\r\n \"keywords\": [\"food\", \"movie theater\", \"films\", \"snack\"],\r\n \"char\": \"🍿\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"doughnut\": {\r\n \"keywords\": [\"food\", \"dessert\", \"snack\", \"sweet\", \"donut\"],\r\n \"char\": \"🍩\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"cookie\": {\r\n \"keywords\": [\"food\", \"snack\", \"oreo\", \"chocolate\", \"sweet\", \"dessert\"],\r\n \"char\": \"🍪\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"beer\": {\r\n \"keywords\": [\"relax\", \"beverage\", \"drink\", \"drunk\", \"party\", \"pub\", \"summer\", \"alcohol\", \"booze\"],\r\n \"char\": \"🍺\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"beers\": {\r\n \"keywords\": [\"relax\", \"beverage\", \"drink\", \"drunk\", \"party\", \"pub\", \"summer\", \"alcohol\", \"booze\"],\r\n \"char\": \"🍻\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"wine_glass\": {\r\n \"keywords\": [\"drink\", \"beverage\", \"drunk\", \"alcohol\", \"booze\"],\r\n \"char\": \"🍷\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"cocktail\": {\r\n \"keywords\": [\"drink\", \"drunk\", \"alcohol\", \"beverage\", \"booze\", \"mojito\"],\r\n \"char\": \"🍸\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"tropical_drink\": {\r\n \"keywords\": [\"beverage\", \"cocktail\", \"summer\", \"beach\", \"alcohol\", \"booze\", \"mojito\"],\r\n \"char\": \"🍹\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"bottle\": {\r\n \"keywords\": [\"drink\", \"wine\", \"champagne\"],\r\n \"char\": \"🍾\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"sake\": {\r\n \"keywords\": [\"wine\", \"drink\", \"drunk\", \"beverage\", \"japanese\", \"alcohol\", \"booze\"],\r\n \"char\": \"🍶\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"tea\": {\r\n \"keywords\": [\"drink\", \"bowl\", \"breakfast\", \"green\", \"british\"],\r\n \"char\": \"🍵\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"coffee\": {\r\n \"keywords\": [\"beverage\", \"caffeine\", \"latte\", \"espresso\"],\r\n \"char\": \"☕\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"baby_bottle\": {\r\n \"keywords\": [\"food\", \"container\", \"milk\"],\r\n \"char\": \"🍼\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"fork_and_knife\": {\r\n \"keywords\": [\"cutlery\", \"kitchen\"],\r\n \"char\": \"🍴\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"fork_and_knife_with_plate\": {\r\n \"keywords\": [\"food\", \"eat\", \"meal\", \"lunch\", \"dinner\", \"restaurant\"],\r\n \"char\": \"🍽\",\r\n \"category\": \"food_and_drink\"\r\n },\r\n \"soccer\": {\r\n \"keywords\": [\"sports\", \"football\"],\r\n \"char\": \"⚽\",\r\n \"category\": \"activity\"\r\n },\r\n \"basketball\": {\r\n \"keywords\": [\"sports\", \"balls\", \"NBA\"],\r\n \"char\": \"🏀\",\r\n \"category\": \"activity\"\r\n },\r\n \"football\": {\r\n \"keywords\": [\"sports\", \"balls\", \"NFL\"],\r\n \"char\": \"🏈\",\r\n \"category\": \"activity\"\r\n },\r\n \"baseball\": {\r\n \"keywords\": [\"sports\", \"balls\"],\r\n \"char\": \"⚾\",\r\n \"category\": \"activity\"\r\n },\r\n \"tennis\": {\r\n \"keywords\": [\"sports\", \"balls\", \"green\"],\r\n \"char\": \"🎾\",\r\n \"category\": \"activity\"\r\n },\r\n \"volleyball\": {\r\n \"keywords\": [\"sports\", \"balls\"],\r\n \"char\": \"🏐\",\r\n \"category\": \"activity\"\r\n },\r\n \"rugby_football\": {\r\n \"keywords\": [\"sports\", \"team\"],\r\n \"char\": \"🏉\",\r\n \"category\": \"activity\"\r\n },\r\n \"8ball\": {\r\n \"keywords\": [\"pool\", \"hobby\", \"game\", \"luck\", \"magic\"],\r\n \"char\": \"🎱\",\r\n \"category\": \"activity\"\r\n },\r\n \"golf\": {\r\n \"keywords\": [\"sports\", \"business\", \"flag\", \"hole\", \"summer\"],\r\n \"char\": \"⛳\",\r\n \"category\": \"activity\"\r\n },\r\n \"golfer\": {\r\n \"keywords\": [\"sports\", \"business\"],\r\n \"char\": \"🏌\",\r\n \"category\": \"activity\"\r\n },\r\n \"table_tennis\": {\r\n \"keywords\": [\"sports\", \"pingpong\"],\r\n \"char\": \"🏓\",\r\n \"category\": \"activity\"\r\n },\r\n \"badminton\": {\r\n \"keywords\": [\"sports\"],\r\n \"char\": \"🏸\",\r\n \"category\": \"activity\"\r\n },\r\n \"ice_hockey\": {\r\n \"keywords\": [\"sports\"],\r\n \"char\": \"🏒\",\r\n \"category\": \"activity\"\r\n },\r\n \"field_hockey\": {\r\n \"keywords\": [\"sports\"],\r\n \"char\": \"🏑\",\r\n \"category\": \"activity\"\r\n },\r\n \"cricket\": {\r\n \"keywords\": [\"sports\"],\r\n \"char\": \"🏏\",\r\n \"category\": \"activity\"\r\n },\r\n \"ski\": {\r\n \"keywords\": [\"sports\", \"winter\", \"cold\", \"snow\"],\r\n \"char\": \"🎿\",\r\n \"category\": \"activity\"\r\n },\r\n \"skier\": {\r\n \"keywords\": [\"sports\", \"winter\", \"snow\"],\r\n \"char\": \"⛷\",\r\n \"category\": \"activity\"\r\n },\r\n \"snowboarder\": {\r\n \"keywords\": [\"sports\", \"winter\"],\r\n \"char\": \"🏂\",\r\n \"category\": \"activity\"\r\n },\r\n \"ice_skate\": {\r\n \"keywords\": [\"sports\"],\r\n \"char\": \"⛸\",\r\n \"category\": \"activity\"\r\n },\r\n \"bow_and_arrow\": {\r\n \"keywords\": [\"sports\"],\r\n \"char\": \"🏹\",\r\n \"category\": \"activity\"\r\n },\r\n \"fishing_pole_and_fish\": {\r\n \"keywords\": [\"food\", \"hobby\", \"summer\"],\r\n \"char\": \"🎣\",\r\n \"category\": \"activity\"\r\n },\r\n \"rowboat\": {\r\n \"keywords\": [\"sports\", \"hobby\", \"water\", \"ship\"],\r\n \"char\": \"🚣\",\r\n \"category\": \"activity\"\r\n },\r\n \"swimmer\": {\r\n \"keywords\": [\"sports\", \"exercise\", \"human\", \"athlete\", \"water\", \"summer\"],\r\n \"char\": \"🏊\",\r\n \"category\": \"activity\"\r\n },\r\n \"surfer\": {\r\n \"keywords\": [\"sports\", \"ocean\", \"sea\", \"summer\", \"beach\"],\r\n \"char\": \"🏄\",\r\n \"category\": \"activity\"\r\n },\r\n \"bath\": {\r\n \"keywords\": [\"clean\", \"shower\", \"bathroom\"],\r\n \"char\": \"🛀\",\r\n \"category\": \"activity\"\r\n },\r\n \"person_with_ball\": {\r\n \"keywords\": [\"sports\", \"human\"],\r\n \"char\": \"⛹\",\r\n \"category\": \"activity\"\r\n },\r\n \"weight_lifter\": {\r\n \"keywords\": [\"sports\", \"training\", \"exercise\"],\r\n \"char\": \"🏋\",\r\n \"category\": \"activity\"\r\n },\r\n \"bicyclist\": {\r\n \"keywords\": [\"sports\", \"bike\", \"exercise\", \"hipster\"],\r\n \"char\": \"🚴\",\r\n \"category\": \"activity\"\r\n },\r\n \"mountain_bicyclist\": {\r\n \"keywords\": [\"transportation\", \"sports\", \"human\", \"race\", \"bike\"],\r\n \"char\": \"🚵\",\r\n \"category\": \"activity\"\r\n },\r\n \"horse_racing\": {\r\n \"keywords\": [\"animal\", \"betting\", \"competition\", \"gambling\", \"luck\"],\r\n \"char\": \"🏇\",\r\n \"category\": \"activity\"\r\n },\r\n \"man_levitating\": {\r\n \"keywords\": [\"suit\", \"business\", \"levitate\", \"hover\", \"jump\"],\r\n \"char\": \"🕴\",\r\n \"category\": \"activity\"\r\n },\r\n \"trophy\": {\r\n \"keywords\": [\"win\", \"award\", \"contest\", \"place\", \"ftw\", \"ceremony\"],\r\n \"char\": \"🏆\",\r\n \"category\": \"activity\"\r\n },\r\n \"running_shirt_with_sash\": {\r\n \"keywords\": [\"play\", \"pageant\"],\r\n \"char\": \"🎽\",\r\n \"category\": \"activity\"\r\n },\r\n \"sports_medal\": {\r\n \"keywords\": [\"award\", \"winning\"],\r\n \"char\": \"🏅\",\r\n \"category\": \"activity\"\r\n },\r\n \"military_medal\": {\r\n \"keywords\": [\"award\", \"winning\", \"army\"],\r\n \"char\": \"🎖\",\r\n \"category\": \"activity\"\r\n },\r\n \"reminder_ribbon\": {\r\n \"keywords\": [\"sports\", \"cause\", \"support\", \"awareness\"],\r\n \"char\": \"🎗\",\r\n \"category\": \"activity\"\r\n },\r\n \"rosette\": {\r\n \"keywords\": [\"flower\", \"decoration\", \"military\"],\r\n \"char\": \"🏵\",\r\n \"category\": \"activity\"\r\n },\r\n \"ticket\": {\r\n \"keywords\": [\"event\", \"concert\", \"pass\"],\r\n \"char\": \"🎫\",\r\n \"category\": \"activity\"\r\n },\r\n \"admission_ticket\": {\r\n \"keywords\": [\"sports\", \"concert\", \"entrance\"],\r\n \"char\": \"🎟\",\r\n \"category\": \"activity\"\r\n },\r\n \"performing_arts\": {\r\n \"keywords\": [\"acting\", \"theater\", \"drama\"],\r\n \"char\": \"🎭\",\r\n \"category\": \"activity\"\r\n },\r\n \"art\": {\r\n \"keywords\": [\"design\", \"paint\", \"draw\", \"colors\"],\r\n \"char\": \"🎨\",\r\n \"category\": \"activity\"\r\n },\r\n \"circus_tent\": {\r\n \"keywords\": [\"festival\", \"carnival\", \"party\"],\r\n \"char\": \"🎪\",\r\n \"category\": \"activity\"\r\n },\r\n \"microphone\": {\r\n \"keywords\": [\"sound\", \"music\", \"PA\"],\r\n \"char\": \"🎤\",\r\n \"category\": \"activity\"\r\n },\r\n \"headphones\": {\r\n \"keywords\": [\"music\", \"score\", \"gadgets\"],\r\n \"char\": \"🎧\",\r\n \"category\": \"activity\"\r\n },\r\n \"musical_score\": {\r\n \"keywords\": [\"treble\", \"clef\"],\r\n \"char\": \"🎼\",\r\n \"category\": \"activity\"\r\n },\r\n \"musical_keyboard\": {\r\n \"keywords\": [\"piano\", \"instrument\"],\r\n \"char\": \"🎹\",\r\n \"category\": \"activity\"\r\n },\r\n \"saxophone\": {\r\n \"keywords\": [\"music\", \"instrument\", \"jazz\", \"blues\"],\r\n \"char\": \"🎷\",\r\n \"category\": \"activity\"\r\n },\r\n \"trumpet\": {\r\n \"keywords\": [\"music\", \"brass\"],\r\n \"char\": \"🎺\",\r\n \"category\": \"activity\"\r\n },\r\n \"guitar\": {\r\n \"keywords\": [\"music\", \"instrument\"],\r\n \"char\": \"🎸\",\r\n \"category\": \"activity\"\r\n },\r\n \"violin\": {\r\n \"keywords\": [\"music\", \"instrument\", \"orchestra\", \"symphony\"],\r\n \"char\": \"🎻\",\r\n \"category\": \"activity\"\r\n },\r\n \"clapper\": {\r\n \"keywords\": [\"movie\", \"film\", \"record\"],\r\n \"char\": \"🎬\",\r\n \"category\": \"activity\"\r\n },\r\n \"video_game\": {\r\n \"keywords\": [\"play\", \"console\", \"PS4\", \"controller\"],\r\n \"char\": \"🎮\",\r\n \"category\": \"activity\"\r\n },\r\n \"space_invader\": {\r\n \"keywords\": [\"game\", \"arcade\", \"play\"],\r\n \"char\": \"👾\",\r\n \"category\": \"activity\"\r\n },\r\n \"dart\": {\r\n \"keywords\": [\"game\", \"play\", \"bar\"],\r\n \"char\": \"🎯\",\r\n \"category\": \"activity\"\r\n },\r\n \"game_die\": {\r\n \"keywords\": [\"dice\", \"random\", \"tabletop\", \"play\", \"luck\"],\r\n \"char\": \"🎲\",\r\n \"category\": \"activity\"\r\n },\r\n \"slot_machine\": {\r\n \"keywords\": [\"bet\", \"gamble\", \"vegas\", \"fruit machine\", \"luck\", \"casino\"],\r\n \"char\": \"🎰\",\r\n \"category\": \"activity\"\r\n },\r\n \"bowling\": {\r\n \"keywords\": [\"sports\", \"fun\", \"play\"],\r\n \"char\": \"🎳\",\r\n \"category\": \"activity\"\r\n },\r\n \"car\": {\r\n \"keywords\": [\"red\", \"transportation\", \"vehicle\"],\r\n \"char\": \"🚗\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"taxi\": {\r\n \"keywords\": [\"uber\", \"vehicle\", \"cars\", \"transportation\"],\r\n \"char\": \"🚕\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"blue_car\": {\r\n \"keywords\": [\"transportation\", \"vehicle\"],\r\n \"char\": \"🚙\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"bus\": {\r\n \"keywords\": [\"car\", \"vehicle\", \"transportation\"],\r\n \"char\": \"🚌\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"trolleybus\": {\r\n \"keywords\": [\"bart\", \"transportation\", \"vehicle\"],\r\n \"char\": \"🚎\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"racing_car\": {\r\n \"keywords\": [\"sports\", \"race\", \"fast\", \"formula\", \"f1\"],\r\n \"char\": \"🏎\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"police_car\": {\r\n \"keywords\": [\"vehicle\", \"cars\", \"transportation\", \"law\", \"legal\", \"enforcement\"],\r\n \"char\": \"🚓\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"ambulance\": {\r\n \"keywords\": [\"health\", \"911\", \"hospital\"],\r\n \"char\": \"🚑\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"fire_engine\": {\r\n \"keywords\": [\"transportation\", \"cars\", \"vehicle\"],\r\n \"char\": \"🚒\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"minibus\": {\r\n \"keywords\": [\"vehicle\", \"car\", \"transportation\"],\r\n \"char\": \"🚐\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"truck\": {\r\n \"keywords\": [\"cars\", \"transportation\"],\r\n \"char\": \"🚚\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"articulated_lorry\": {\r\n \"keywords\": [\"vehicle\", \"cars\", \"transportation\", \"express\"],\r\n \"char\": \"🚛\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"tractor\": {\r\n \"keywords\": [\"vehicle\", \"car\", \"farming\", \"agriculture\"],\r\n \"char\": \"🚜\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"racing_motorcycle\": {\r\n \"keywords\": [\"race\", \"sports\", \"fast\"],\r\n \"char\": \"🏍\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"bike\": {\r\n \"keywords\": [\"sports\", \"bicycle\", \"exercise\", \"hipster\"],\r\n \"char\": \"🚲\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"rotating_light\": {\r\n \"keywords\": [\"police\", \"ambulance\", \"911\", \"emergency\", \"alert\", \"error\", \"pinged\", \"law\", \"legal\"],\r\n \"char\": \"🚨\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"oncoming_police_car\": {\r\n \"keywords\": [\"vehicle\", \"law\", \"legal\", \"enforcement\", \"911\"],\r\n \"char\": \"🚔\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"oncoming_bus\": {\r\n \"keywords\": [\"vehicle\", \"transportation\"],\r\n \"char\": \"🚍\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"oncoming_automobile\": {\r\n \"keywords\": [\"car\", \"vehicle\", \"transportation\"],\r\n \"char\": \"🚘\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"oncoming_taxi\": {\r\n \"keywords\": [\"vehicle\", \"cars\", \"uber\"],\r\n \"char\": \"🚖\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"aerial_tramway\": {\r\n \"keywords\": [\"transportation\", \"vehicle\", \"ski\"],\r\n \"char\": \"🚡\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"mountain_cableway\": {\r\n \"keywords\": [\"transportation\", \"vehicle\", \"ski\"],\r\n \"char\": \"🚠\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"suspension_railway\": {\r\n \"keywords\": [\"vehicle\", \"transportation\"],\r\n \"char\": \"🚟\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"railway_car\": {\r\n \"keywords\": [\"transportation\", \"vehicle\"],\r\n \"char\": \"🚃\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"train\": {\r\n \"keywords\": [\"transportation\", \"vehicle\", \"carriage\", \"public\", \"travel\"],\r\n \"char\": \"🚋\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"monorail\": {\r\n \"keywords\": [\"transportation\", \"vehicle\"],\r\n \"char\": \"🚝\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"bullettrain_side\": {\r\n \"keywords\": [\"transportation\", \"vehicle\"],\r\n \"char\": \"🚄\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"bullettrain_front\": {\r\n \"keywords\": [\"transportation\", \"vehicle\", \"speed\", \"fast\", \"public\", \"travel\"],\r\n \"char\": \"🚅\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"light_rail\": {\r\n \"keywords\": [\"transportation\", \"vehicle\"],\r\n \"char\": \"🚈\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"mountain_railway\": {\r\n \"keywords\": [\"transportation\", \"vehicle\"],\r\n \"char\": \"🚞\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"steam_locomotive\": {\r\n \"keywords\": [\"transportation\", \"vehicle\", \"train\"],\r\n \"char\": \"🚂\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"train2\": {\r\n \"keywords\": [\"transportation\", \"vehicle\"],\r\n \"char\": \"🚆\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"metro\": {\r\n \"keywords\": [\"transportation\", \"blue-square\", \"mrt\", \"underground\", \"tube\"],\r\n \"char\": \"🚇\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"tram\": {\r\n \"keywords\": [\"transportation\", \"vehicle\"],\r\n \"char\": \"🚊\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"station\": {\r\n \"keywords\": [\"transportation\", \"vehicle\", \"public\"],\r\n \"char\": \"🚉\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"helicopter\": {\r\n \"keywords\": [\"transportation\", \"vehicle\", \"fly\"],\r\n \"char\": \"🚁\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"small_airplane\": {\r\n \"keywords\": [\"flight\", \"transportation\", \"fly\", \"vehicle\"],\r\n \"char\": \"🛩\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"airplane\": {\r\n \"keywords\": [\"vehicle\", \"transportation\", \"flight\", \"fly\"],\r\n \"char\": \"✈️\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"airplane_departure\": {\r\n \"keywords\": [\"airport\", \"flight\", \"landing\"],\r\n \"char\": \"🛫\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"airplane_arrival\": {\r\n \"keywords\": [\"airport\", \"flight\", \"boarding\"],\r\n \"char\": \"🛬\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"boat\": {\r\n \"keywords\": [\"ship\", \"summer\", \"transportation\", \"water\", \"sailing\", \"sailboat\"],\r\n \"char\": \"⛵\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"motor_boat\": {\r\n \"keywords\": [\"ship\"],\r\n \"char\": \"🛥\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"speedboat\": {\r\n \"keywords\": [\"ship\", \"transportation\", \"vehicle\", \"summer\"],\r\n \"char\": \"🚤\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"ferry\": {\r\n \"keywords\": [\"boat\", \"ship\", \"yacht\"],\r\n \"char\": \"⛴\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"passenger_ship\": {\r\n \"keywords\": [\"yacht\", \"cruise\", \"ferry\"],\r\n \"char\": \"🛳\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"rocket\": {\r\n \"keywords\": [\"launch\", \"ship\", \"staffmode\", \"NASA\", \"outer space\", \"outer_space\", \"fly\"],\r\n \"char\": \"🚀\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"artificial_satellite\": {\r\n \"keywords\": [\"communication\", \"gps\", \"orbit\", \"spaceflight\", \"NASA\", \"ISS\"],\r\n \"char\": \"🛰\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"seat\": {\r\n \"keywords\": [\"sit\", \"airplane\", \"transport\", \"bus\", \"flight\", \"fly\"],\r\n \"char\": \"💺\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"anchor\": {\r\n \"keywords\": [\"ship\", \"ferry\", \"sea\", \"boat\"],\r\n \"char\": \"⚓\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"construction\": {\r\n \"keywords\": [\"wip\", \"progress\", \"caution\", \"warning\"],\r\n \"char\": \"🚧\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"fuelpump\": {\r\n \"keywords\": [\"gas station\", \"petroleum\"],\r\n \"char\": \"⛽\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"busstop\": {\r\n \"keywords\": [\"transportation\", \"wait\"],\r\n \"char\": \"🚏\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"vertical_traffic_light\": {\r\n \"keywords\": [\"transportation\", \"driving\"],\r\n \"char\": \"🚦\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"traffic_light\": {\r\n \"keywords\": [\"transportation\", \"signal\"],\r\n \"char\": \"🚥\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"checkered_flag\": {\r\n \"keywords\": [\"contest\", \"finishline\", \"race\", \"gokart\"],\r\n \"char\": \"🏁\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"ship\": {\r\n \"keywords\": [\"transportation\", \"titanic\", \"deploy\"],\r\n \"char\": \"🚢\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"ferris_wheel\": {\r\n \"keywords\": [\"photo\", \"carnival\", \"londoneye\"],\r\n \"char\": \"🎡\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"roller_coaster\": {\r\n \"keywords\": [\"carnival\", \"playground\", \"photo\", \"fun\"],\r\n \"char\": \"🎢\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"carousel_horse\": {\r\n \"keywords\": [\"photo\", \"carnival\"],\r\n \"char\": \"🎠\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"building_construction\": {\r\n \"keywords\": [\"wip\", \"working\", \"progress\"],\r\n \"char\": \"🏗\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"foggy\": {\r\n \"keywords\": [\"photo\", \"mountain\"],\r\n \"char\": \"🌁\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"tokyo_tower\": {\r\n \"keywords\": [\"photo\", \"japanese\"],\r\n \"char\": \"🗼\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"factory\": {\r\n \"keywords\": [\"building\", \"industry\", \"pollution\", \"smoke\"],\r\n \"char\": \"🏭\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"fountain\": {\r\n \"keywords\": [\"photo\", \"summer\", \"water\", \"fresh\"],\r\n \"char\": \"⛲\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"rice_scene\": {\r\n \"keywords\": [\"photo\", \"japan\", \"asia\", \"tsukimi\"],\r\n \"char\": \"🎑\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"mountain\": {\r\n \"keywords\": [\"photo\", \"nature\", \"environment\"],\r\n \"char\": \"⛰\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"snow_capped_mountain\": {\r\n \"keywords\": [\"photo\", \"nature\", \"environment\", \"winter\", \"cold\"],\r\n \"char\": \"🏔\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"mount_fuji\": {\r\n \"keywords\": [\"photo\", \"mountain\", \"nature\", \"japanese\"],\r\n \"char\": \"🗻\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"volcano\": {\r\n \"keywords\": [\"photo\", \"nature\", \"disaster\"],\r\n \"char\": \"🌋\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"japan\": {\r\n \"keywords\": [\"nation\", \"country\", \"japanese\", \"asia\"],\r\n \"char\": \"🗾\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"camping\": {\r\n \"keywords\": [\"photo\", \"outdoors\", \"tent\"],\r\n \"char\": \"🏕\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"tent\": {\r\n \"keywords\": [\"photo\", \"camping\", \"outdoors\"],\r\n \"char\": \"⛺\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"national_park\": {\r\n \"keywords\": [\"photo\", \"environment\", \"nature\"],\r\n \"char\": \"🏞\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"motorway\": {\r\n \"keywords\": [\"road\", \"cupertino\", \"interstate\", \"highway\"],\r\n \"char\": \"🛣\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"railway_track\": {\r\n \"keywords\": [\"train\", \"transportation\"],\r\n \"char\": \"🛤\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"sunrise\": {\r\n \"keywords\": [\"morning\", \"view\", \"vacation\", \"photo\"],\r\n \"char\": \"🌅\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"sunrise_over_mountains\": {\r\n \"keywords\": [\"view\", \"vacation\", \"photo\"],\r\n \"char\": \"🌄\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"desert\": {\r\n \"keywords\": [\"photo\", \"warm\", \"saharah\"],\r\n \"char\": \"🏜\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"beach_with_umbrella\": {\r\n \"keywords\": [\"weather\", \"summer\", \"sunny\", \"sand\", \"mojito\"],\r\n \"char\": \"🏖\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"desert_island\": {\r\n \"keywords\": [\"photo\", \"tropical\", \"mojito\"],\r\n \"char\": \"🏝\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"city_sunrise\": {\r\n \"keywords\": [\"photo\", \"good morning\", \"dawn\"],\r\n \"char\": \"🌇\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"city_sunset\": {\r\n \"keywords\": [\"photo\", \"evening\", \"sky\", \"buildings\"],\r\n \"char\": \"🌆\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"cityscape\": {\r\n \"keywords\": [\"photo\", \"night life\", \"urban\"],\r\n \"char\": \"🏙\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"night_with_stars\": {\r\n \"keywords\": [\"evening\", \"city\", \"downtown\"],\r\n \"char\": \"🌃\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"bridge_at_night\": {\r\n \"keywords\": [\"photo\", \"sanfrancisco\"],\r\n \"char\": \"🌉\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"milky_way\": {\r\n \"keywords\": [\"photo\", \"space\", \"stars\"],\r\n \"char\": \"🌌\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"stars\": {\r\n \"keywords\": [\"night\", \"photo\"],\r\n \"char\": \"🌠\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"sparkler\": {\r\n \"keywords\": [\"stars\", \"night\", \"shine\"],\r\n \"char\": \"🎇\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"fireworks\": {\r\n \"keywords\": [\"photo\", \"festival\", \"carnival\", \"congratulations\"],\r\n \"char\": \"🎆\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"rainbow\": {\r\n \"keywords\": [\"nature\", \"happy\", \"unicorn\", \"photo\", \"sky\", \"spring\"],\r\n \"char\": \"🌈\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"buildings\": {\r\n \"keywords\": [\"houses\", \"photo\"],\r\n \"char\": \"🏘\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"european_castle\": {\r\n \"keywords\": [\"building\", \"royalty\", \"history\"],\r\n \"char\": \"🏰\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"japanese_castle\": {\r\n \"keywords\": [\"photo\", \"building\"],\r\n \"char\": \"🏯\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"stadium\": {\r\n \"keywords\": [\"photo\", \"place\", \"sports\", \"concert\", \"venue\"],\r\n \"char\": \"🏟\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"statue_of_liberty\": {\r\n \"keywords\": [\"american\", \"newyork\"],\r\n \"char\": \"🗽\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"house\": {\r\n \"keywords\": [\"building\", \"home\"],\r\n \"char\": \"🏠\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"house_with_garden\": {\r\n \"keywords\": [\"home\", \"plant\", \"nature\"],\r\n \"char\": \"🏡\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"derelict_house\": {\r\n \"keywords\": [\"abandon\", \"evict\", \"broken\", \"building\"],\r\n \"char\": \"🏚\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"office\": {\r\n \"keywords\": [\"building\", \"bureau\", \"work\"],\r\n \"char\": \"🏢\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"department_store\": {\r\n \"keywords\": [\"building\", \"shopping\", \"mall\"],\r\n \"char\": \"🏬\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"post_office\": {\r\n \"keywords\": [\"building\", \"email\", \"communication\"],\r\n \"char\": \"🏣\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"european_post_office\": {\r\n \"keywords\": [\"building\", \"email\"],\r\n \"char\": \"🏤\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"hospital\": {\r\n \"keywords\": [\"building\", \"health\", \"surgery\", \"doctor\"],\r\n \"char\": \"🏥\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"bank\": {\r\n \"keywords\": [\"building\", \"money\", \"sales\", \"cash\", \"business\", \"enterprise\"],\r\n \"char\": \"🏦\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"hotel\": {\r\n \"keywords\": [\"building\", \"accomodation\", \"checkin\"],\r\n \"char\": \"🏨\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"convenience_store\": {\r\n \"keywords\": [\"building\", \"shopping\", \"groceries\"],\r\n \"char\": \"🏪\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"school\": {\r\n \"keywords\": [\"building\", \"student\", \"education\", \"learn\", \"teach\"],\r\n \"char\": \"🏫\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"love_hotel\": {\r\n \"keywords\": [\"like\", \"affection\", \"dating\"],\r\n \"char\": \"🏩\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"wedding\": {\r\n \"keywords\": [\"love\", \"like\", \"affection\", \"couple\", \"marriage\", \"bride\", \"groom\"],\r\n \"char\": \"💒\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"museum\": {\r\n \"keywords\": [\"art\", \"culture\", \"history\"],\r\n \"char\": \"🏛\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"church\": {\r\n \"keywords\": [\"building\", \"religion\", \"christ\"],\r\n \"char\": \"⛪\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"mosque\": {\r\n \"keywords\": [\"islam\", \"worship\", \"minaret\"],\r\n \"char\": \"🕌\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"synagogue\": {\r\n \"keywords\": [\"judaism\", \"worship\", \"temple\", \"jewish\"],\r\n \"char\": \"🕍\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"kaaba\": {\r\n \"keywords\": [\"mecca\", \"mosque\", \"islam\"],\r\n \"char\": \"🕋\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"shinto_shrine\": {\r\n \"keywords\": [\"temple\", \"japan\", \"kyoto\"],\r\n \"char\": \"⛩\",\r\n \"category\": \"travel_and_places\"\r\n },\r\n \"watch\": {\r\n \"keywords\": [\"time\", \"accessories\"],\r\n \"char\": \"⌚\",\r\n \"category\": \"objects\"\r\n },\r\n \"iphone\": {\r\n \"keywords\": [\"technology\", \"apple\", \"gadgets\", \"dial\"],\r\n \"char\": \"📱\",\r\n \"category\": \"objects\"\r\n },\r\n \"calling\": {\r\n \"keywords\": [\"iphone\", \"incoming\"],\r\n \"char\": \"📲\",\r\n \"category\": \"objects\"\r\n },\r\n \"computer\": {\r\n \"keywords\": [\"technology\", \"laptop\", \"screen\", \"display\", \"monitor\"],\r\n \"char\": \"💻\",\r\n \"category\": \"objects\"\r\n },\r\n \"keyboard\": {\r\n \"keywords\": [\"technology\", \"computer\", \"type\", \"input\", \"text\"],\r\n \"char\": \"⌨\",\r\n \"category\": \"objects\"\r\n },\r\n \"desktop_computer\": {\r\n \"keywords\": [\"technology\", \"computing\", \"screen\"],\r\n \"char\": \"🖥\",\r\n \"category\": \"objects\"\r\n },\r\n \"printer\": {\r\n \"keywords\": [\"paper\", \"ink\"],\r\n \"char\": \"🖨\",\r\n \"category\": \"objects\"\r\n },\r\n \"three_button_mouse\": {\r\n \"keywords\": [\"click\"],\r\n \"char\": \"🖱\",\r\n \"category\": \"objects\"\r\n },\r\n \"trackball\": {\r\n \"keywords\": [\"technology\", \"trackpad\"],\r\n \"char\": \"🖲\",\r\n \"category\": \"objects\"\r\n },\r\n \"joystick\": {\r\n \"keywords\": [\"game\", \"play\"],\r\n \"char\": \"🕹\",\r\n \"category\": \"objects\"\r\n },\r\n \"compression\": {\r\n \"keywords\": [\"tool\"],\r\n \"char\": \"🗜\",\r\n \"category\": \"objects\"\r\n },\r\n \"minidisc\": {\r\n \"keywords\": [\"technology\", \"record\", \"data\", \"disk\", \"90s\"],\r\n \"char\": \"💽\",\r\n \"category\": \"objects\"\r\n },\r\n \"floppy_disk\": {\r\n \"keywords\": [\"oldschool\", \"technology\", \"save\", \"90s\", \"80s\"],\r\n \"char\": \"💾\",\r\n \"category\": \"objects\"\r\n },\r\n \"cd\": {\r\n \"keywords\": [\"technology\", \"dvd\", \"disk\", \"disc\", \"90s\"],\r\n \"char\": \"💿\",\r\n \"category\": \"objects\"\r\n },\r\n \"dvd\": {\r\n \"keywords\": [\"cd\", \"disk\", \"disc\"],\r\n \"char\": \"📀\",\r\n \"category\": \"objects\"\r\n },\r\n \"vhs\": {\r\n \"keywords\": [\"record\", \"video\", \"oldschool\", \"90s\", \"80s\"],\r\n \"char\": \"📼\",\r\n \"category\": \"objects\"\r\n },\r\n \"camera\": {\r\n \"keywords\": [\"gadgets\", \"photography\"],\r\n \"char\": \"📷\",\r\n \"category\": \"objects\"\r\n },\r\n \"camera_with_flash\": {\r\n \"keywords\": [\"photography\", \"gadgets\"],\r\n \"char\": \"📸\",\r\n \"category\": \"objects\"\r\n },\r\n \"video_camera\": {\r\n \"keywords\": [\"film\", \"record\"],\r\n \"char\": \"📹\",\r\n \"category\": \"objects\"\r\n },\r\n \"movie_camera\": {\r\n \"keywords\": [\"film\", \"record\"],\r\n \"char\": \"🎥\",\r\n \"category\": \"objects\"\r\n },\r\n \"film_projector\": {\r\n \"keywords\": [\"video\", \"tape\", \"record\", \"movie\"],\r\n \"char\": \"📽\",\r\n \"category\": \"objects\"\r\n },\r\n \"film_frames\": {\r\n \"keywords\": [\"movie\"],\r\n \"char\": \"🎞\",\r\n \"category\": \"objects\"\r\n },\r\n \"telephone_receiver\": {\r\n \"keywords\": [\"technology\", \"communication\", \"dial\"],\r\n \"char\": \"📞\",\r\n \"category\": \"objects\"\r\n },\r\n \"phone\": {\r\n \"keywords\": [\"technology\", \"communication\", \"dial\", \"telephone\"],\r\n \"char\": \"☎️\",\r\n \"category\": \"objects\"\r\n },\r\n \"pager\": {\r\n \"keywords\": [\"bbcall\", \"oldschool\", \"90s\"],\r\n \"char\": \"📟\",\r\n \"category\": \"objects\"\r\n },\r\n \"fax\": {\r\n \"keywords\": [\"communication\", \"technology\"],\r\n \"char\": \"📠\",\r\n \"category\": \"objects\"\r\n },\r\n \"tv\": {\r\n \"keywords\": [\"technology\", \"program\", \"oldschool\", \"show\", \"television\"],\r\n \"char\": \"📺\",\r\n \"category\": \"objects\"\r\n },\r\n \"radio\": {\r\n \"keywords\": [\"communication\", \"music\", \"podcast\", \"program\"],\r\n \"char\": \"📻\",\r\n \"category\": \"objects\"\r\n },\r\n \"studio_microphone\": {\r\n \"keywords\": [\"singer\", \"recording\", \"artist\"],\r\n \"char\": \"🎙\",\r\n \"category\": \"objects\"\r\n },\r\n \"level_slider\": {\r\n \"keywords\": [\"scale\"],\r\n \"char\": \"🎚\",\r\n \"category\": \"objects\"\r\n },\r\n \"control_knobs\": {\r\n \"keywords\": [\"dial\"],\r\n \"char\": \"🎛\",\r\n \"category\": \"objects\"\r\n },\r\n \"stopwatch\": {\r\n \"keywords\": [\"time\", \"deadline\"],\r\n \"char\": \"⏱\",\r\n \"category\": \"objects\"\r\n },\r\n \"timer_clock\": {\r\n \"keywords\": [\"alarm\"],\r\n \"char\": \"⏲\",\r\n \"category\": \"objects\"\r\n },\r\n \"alarm_clock\": {\r\n \"keywords\": [\"time\", \"wake\"],\r\n \"char\": \"⏰\",\r\n \"category\": \"objects\"\r\n },\r\n \"mantelpiece_clock\": {\r\n \"keywords\": [\"time\"],\r\n \"char\": \"🕰\",\r\n \"category\": \"objects\"\r\n },\r\n \"hourglass_flowing_sand\": {\r\n \"keywords\": [\"oldschool\", \"time\", \"countdown\"],\r\n \"char\": \"⏳\",\r\n \"category\": \"objects\"\r\n },\r\n \"hourglass\": {\r\n \"keywords\": [\"time\", \"clock\", \"oldschool\", \"limit\", \"exam\", \"quiz\", \"test\"],\r\n \"char\": \"⌛\",\r\n \"category\": \"objects\"\r\n },\r\n \"satellite\": {\r\n \"keywords\": [\"communication\", \"future\", \"radio\", \"space\"],\r\n \"char\": \"📡\",\r\n \"category\": \"objects\"\r\n },\r\n \"battery\": {\r\n \"keywords\": [\"power\", \"energy\", \"sustain\"],\r\n \"char\": \"🔋\",\r\n \"category\": \"objects\"\r\n },\r\n \"electric_plug\": {\r\n \"keywords\": [\"charger\", \"power\"],\r\n \"char\": \"🔌\",\r\n \"category\": \"objects\"\r\n },\r\n \"bulb\": {\r\n \"keywords\": [\"light\", \"electricity\", \"idea\"],\r\n \"char\": \"💡\",\r\n \"category\": \"objects\"\r\n },\r\n \"flashlight\": {\r\n \"keywords\": [\"dark\", \"camping\", \"sight\", \"night\"],\r\n \"char\": \"🔦\",\r\n \"category\": \"objects\"\r\n },\r\n \"candle\": {\r\n \"keywords\": [\"fire\", \"wax\"],\r\n \"char\": \"🕯\",\r\n \"category\": \"objects\"\r\n },\r\n \"wastebasket\": {\r\n \"keywords\": [\"bin\", \"trash\", \"rubbish\", \"garbage\", \"toss\"],\r\n \"char\": \"🗑\",\r\n \"category\": \"objects\"\r\n },\r\n \"oil_drum\": {\r\n \"keywords\": [\"barrell\"],\r\n \"char\": \"🛢\",\r\n \"category\": \"objects\"\r\n },\r\n \"money_with_wings\": {\r\n \"keywords\": [\"dollar\", \"bills\", \"payment\", \"sale\"],\r\n \"char\": \"💸\",\r\n \"category\": \"objects\"\r\n },\r\n \"dollar\": {\r\n \"keywords\": [\"money\", \"sales\", \"bill\", \"currency\"],\r\n \"char\": \"💵\",\r\n \"category\": \"objects\"\r\n },\r\n \"yen\": {\r\n \"keywords\": [\"money\", \"sales\", \"japanese\", \"dollar\", \"currency\"],\r\n \"char\": \"💴\",\r\n \"category\": \"objects\"\r\n },\r\n \"euro\": {\r\n \"keywords\": [\"money\", \"sales\", \"dollar\", \"currency\"],\r\n \"char\": \"💶\",\r\n \"category\": \"objects\"\r\n },\r\n \"pound\": {\r\n \"keywords\": [\"british\", \"sterling\", \"money\", \"sales\", \"bills\", \"uk\", \"england\", \"currency\"],\r\n \"char\": \"💷\",\r\n \"category\": \"objects\"\r\n },\r\n \"moneybag\": {\r\n \"keywords\": [\"dollar\", \"payment\", \"coins\", \"sale\"],\r\n \"char\": \"💰\",\r\n \"category\": \"objects\"\r\n },\r\n \"credit_card\": {\r\n \"keywords\": [\"money\", \"sales\", \"dollar\", \"bill\", \"payment\", \"shopping\"],\r\n \"char\": \"💳\",\r\n \"category\": \"objects\"\r\n },\r\n \"gem\": {\r\n \"keywords\": [\"blue\", \"ruby\", \"diamond\", \"jewelry\"],\r\n \"char\": \"💎\",\r\n \"category\": \"objects\"\r\n },\r\n \"scales\": {\r\n \"keywords\": [\"law\", \"fairness\", \"weight\"],\r\n \"char\": \"⚖\",\r\n \"category\": \"objects\"\r\n },\r\n \"wrench\": {\r\n \"keywords\": [\"tools\", \"diy\", \"ikea\", \"fix\", \"maintainer\"],\r\n \"char\": \"🔧\",\r\n \"category\": \"objects\"\r\n },\r\n \"hammer\": {\r\n \"keywords\": [\"tools\", \"build\", \"create\"],\r\n \"char\": \"🔨\",\r\n \"category\": \"objects\"\r\n },\r\n \"hammer_and_pick\": {\r\n \"keywords\": [\"tools\", \"build\", \"create\"],\r\n \"char\": \"⚒\",\r\n \"category\": \"objects\"\r\n },\r\n \"hammer_and_wrench\": {\r\n \"keywords\": [\"tools\", \"build\", \"create\"],\r\n \"char\": \"🛠\",\r\n \"category\": \"objects\"\r\n },\r\n \"pick\": {\r\n \"keywords\": [\"tools\", \"dig\"],\r\n \"char\": \"⛏\",\r\n \"category\": \"objects\"\r\n },\r\n \"nut_and_bolt\": {\r\n \"keywords\": [\"handy\", \"tools\", \"fix\"],\r\n \"char\": \"🔩\",\r\n \"category\": \"objects\"\r\n },\r\n \"gear\": {\r\n \"keywords\": [\"cog\"],\r\n \"char\": \"⚙\",\r\n \"category\": \"objects\"\r\n },\r\n \"chains\": {\r\n \"keywords\": [\"lock\", \"arrest\"],\r\n \"char\": \"⛓\",\r\n \"category\": \"objects\"\r\n },\r\n \"gun\": {\r\n \"keywords\": [\"violence\", \"weapon\", \"pistol\", \"revolver\"],\r\n \"char\": \"🔫\",\r\n \"category\": \"objects\"\r\n },\r\n \"bomb\": {\r\n \"keywords\": [\"boom\", \"explode\", \"explosion\", \"terrorism\"],\r\n \"char\": \"💣\",\r\n \"category\": \"objects\"\r\n },\r\n \"hocho\": {\r\n \"keywords\": [\"knife\", \"blade\", \"cutlery\", \"kitchen\", \"weapon\"],\r\n \"char\": \"🔪\",\r\n \"category\": \"objects\"\r\n },\r\n \"dagger_knife\": {\r\n \"keywords\": [\"weapon\"],\r\n \"char\": \"🗡\",\r\n \"category\": \"objects\"\r\n },\r\n \"crossed_swords\": {\r\n \"keywords\": [\"weapon\"],\r\n \"char\": \"⚔\",\r\n \"category\": \"objects\"\r\n },\r\n \"shield\": {\r\n \"keywords\": [\"protection\", \"security\"],\r\n \"char\": \"🛡\",\r\n \"category\": \"objects\"\r\n },\r\n \"smoking\": {\r\n \"keywords\": [\"kills\", \"tobacco\", \"cigarette\", \"joint\", \"smoke\"],\r\n \"char\": \"🚬\",\r\n \"category\": \"objects\"\r\n },\r\n \"skull_and_crossbones\": {\r\n \"keywords\": [\"poison\", \"danger\", \"deadly\", \"scary\"],\r\n \"char\": \"☠\",\r\n \"category\": \"objects\"\r\n },\r\n \"coffin\": {\r\n \"keywords\": [\"vampire\", \"dead\", \"die\", \"death\", \"rip\", \"graveyard\", \"cemetery\"],\r\n \"char\": \"⚰\",\r\n \"category\": \"objects\"\r\n },\r\n \"funeral_urn\": {\r\n \"keywords\": [\"dead\", \"die\", \"death\", \"rip\", \"ashes\"],\r\n \"char\": \"⚱\",\r\n \"category\": \"objects\"\r\n },\r\n \"amphora\": {\r\n \"keywords\": [\"vase\", \"jar\"],\r\n \"char\": \"🏺\",\r\n \"category\": \"objects\"\r\n },\r\n \"crystal_ball\": {\r\n \"keywords\": [\"disco\", \"party\", \"magic\", \"circus\", \"fortune_teller\"],\r\n \"char\": \"🔮\",\r\n \"category\": \"objects\"\r\n },\r\n \"prayer_beads\": {\r\n \"keywords\": [\"dhikr\", \"religious\"],\r\n \"char\": \"📿\",\r\n \"category\": \"objects\"\r\n },\r\n \"barber\": {\r\n \"keywords\": [\"hair\", \"salon\", \"style\"],\r\n \"char\": \"💈\",\r\n \"category\": \"objects\"\r\n },\r\n \"alembic\": {\r\n \"keywords\": [\"distilling\", \"science\", \"experiment\"],\r\n \"char\": \"⚗\",\r\n \"category\": \"objects\"\r\n },\r\n \"telescope\": {\r\n \"keywords\": [\"stars\", \"space\", \"zoom\"],\r\n \"char\": \"🔭\",\r\n \"category\": \"objects\"\r\n },\r\n \"microscope\": {\r\n \"keywords\": [\"laboratory\", \"experiment\", \"zoomin\", \"science\", \"study\"],\r\n \"char\": \"🔬\",\r\n \"category\": \"objects\"\r\n },\r\n \"hole\": {\r\n \"keywords\": [\"embarrassing\"],\r\n \"char\": \"🕳\",\r\n \"category\": \"objects\"\r\n },\r\n \"pill\": {\r\n \"keywords\": [\"health\", \"medicine\", \"doctor\", \"pharmacy\", \"drug\"],\r\n \"char\": \"💊\",\r\n \"category\": \"objects\"\r\n },\r\n \"syringe\": {\r\n \"keywords\": [\"health\", \"hospital\", \"drugs\", \"blood\", \"medicine\", \"needle\", \"doctor\", \"nurse\"],\r\n \"char\": \"💉\",\r\n \"category\": \"objects\"\r\n },\r\n \"thermometer\": {\r\n \"keywords\": [\"weather\", \"temperature\", \"hot\", \"cold\"],\r\n \"char\": \"🌡\",\r\n \"category\": \"objects\"\r\n },\r\n \"label\": {\r\n \"keywords\": [\"sale\", \"tag\"],\r\n \"char\": \"🏷\",\r\n \"category\": \"objects\"\r\n },\r\n \"bookmark\": {\r\n \"keywords\": [\"favorite\", \"label\", \"save\"],\r\n \"char\": \"🔖\",\r\n \"category\": \"objects\"\r\n },\r\n \"toilet\": {\r\n \"keywords\": [\"restroom\", \"wc\", \"washroom\", \"bathroom\", \"potty\"],\r\n \"char\": \"🚽\",\r\n \"category\": \"objects\"\r\n },\r\n \"shower\": {\r\n \"keywords\": [\"clean\", \"water\", \"bathroom\"],\r\n \"char\": \"🚿\",\r\n \"category\": \"objects\"\r\n },\r\n \"bathtub\": {\r\n \"keywords\": [\"clean\", \"shower\", \"bathroom\"],\r\n \"char\": \"🛁\",\r\n \"category\": \"objects\"\r\n },\r\n \"key\": {\r\n \"keywords\": [\"lock\", \"door\", \"password\"],\r\n \"char\": \"🔑\",\r\n \"category\": \"objects\"\r\n },\r\n \"old_key\": {\r\n \"keywords\": [\"lock\", \"door\", \"password\"],\r\n \"char\": \"🗝\",\r\n \"category\": \"objects\"\r\n },\r\n \"couch_and_lamp\": {\r\n \"keywords\": [\"read\", \"chill\"],\r\n \"char\": \"🛋\",\r\n \"category\": \"objects\"\r\n },\r\n \"sleeping_accommodation\": {\r\n \"keywords\": [\"bed\", \"rest\"],\r\n \"char\": \"🛌\",\r\n \"category\": \"objects\"\r\n },\r\n \"bed\": {\r\n \"keywords\": [\"sleep\", \"rest\"],\r\n \"char\": \"🛏\",\r\n \"category\": \"objects\"\r\n },\r\n \"door\": {\r\n \"keywords\": [\"house\", \"entry\", \"exit\"],\r\n \"char\": \"🚪\",\r\n \"category\": \"objects\"\r\n },\r\n \"bellhop_bell\": {\r\n \"keywords\": [\"service\"],\r\n \"char\": \"🛎\",\r\n \"category\": \"objects\"\r\n },\r\n \"frame_with_picture\": {\r\n \"keywords\": [\"photography\"],\r\n \"char\": \"🖼\",\r\n \"category\": \"objects\"\r\n },\r\n \"world_map\": {\r\n \"keywords\": [\"location\", \"direction\"],\r\n \"char\": \"🗺\",\r\n \"category\": \"objects\"\r\n },\r\n \"umbrella_on_ground\": {\r\n \"keywords\": [\"weather\", \"summer\"],\r\n \"char\": \"⛱\",\r\n \"category\": \"objects\"\r\n },\r\n \"moyai\": {\r\n \"keywords\": [\"rock\", \"easter island\", \"moai\"],\r\n \"char\": \"🗿\",\r\n \"category\": \"objects\"\r\n },\r\n \"shopping_bags\": {\r\n \"keywords\": [\"mall\", \"buy\", \"purchase\"],\r\n \"char\": \"🛍\",\r\n \"category\": \"objects\"\r\n },\r\n \"balloon\": {\r\n \"keywords\": [\"party\", \"celebration\", \"birthday\", \"circus\"],\r\n \"char\": \"🎈\",\r\n \"category\": \"objects\"\r\n },\r\n \"flags\": {\r\n \"keywords\": [\"fish\", \"japanese\", \"koinobori\", \"carp\", \"banner\"],\r\n \"char\": \"🎏\",\r\n \"category\": \"objects\"\r\n },\r\n \"ribbon\": {\r\n \"keywords\": [\"decoration\", \"pink\", \"girl\", \"bowtie\"],\r\n \"char\": \"🎀\",\r\n \"category\": \"objects\"\r\n },\r\n \"gift\": {\r\n \"keywords\": [\"present\", \"birthday\", \"christmas\", \"xmas\"],\r\n \"char\": \"🎁\",\r\n \"category\": \"objects\"\r\n },\r\n \"confetti_ball\": {\r\n \"keywords\": [\"festival\", \"party\", \"birthday\", \"circus\"],\r\n \"char\": \"🎊\",\r\n \"category\": \"objects\"\r\n },\r\n \"tada\": {\r\n \"keywords\": [\"party\", \"contulations\", \"birthday\", \"magic\", \"circus\"],\r\n \"char\": \"🎉\",\r\n \"category\": \"objects\"\r\n },\r\n \"dolls\": {\r\n \"keywords\": [\"japanese\", \"toy\", \"kimono\"],\r\n \"char\": \"🎎\",\r\n \"category\": \"objects\"\r\n },\r\n \"wind_chime\": {\r\n \"keywords\": [\"nature\", \"ding\", \"spring\", \"bell\"],\r\n \"char\": \"🎐\",\r\n \"category\": \"objects\"\r\n },\r\n \"crossed_flags\": {\r\n \"keywords\": [\"japanese\", \"nation\", \"country\", \"border\"],\r\n \"char\": \"🎌\",\r\n \"category\": \"objects\"\r\n },\r\n \"izakaya_lantern\": {\r\n \"keywords\": [\"light\", \"paper\", \"halloween\", \"spooky\"],\r\n \"char\": \"🏮\",\r\n \"category\": \"objects\"\r\n },\r\n \"envelope\": {\r\n \"keywords\": [\"letter\", \"postal\", \"inbox\", \"communication\"],\r\n \"char\": \"✉️\",\r\n \"category\": \"objects\"\r\n },\r\n \"envelope_with_arrow\": {\r\n \"keywords\": [\"email\", \"communication\"],\r\n \"char\": \"📩\",\r\n \"category\": \"objects\"\r\n },\r\n \"incoming_envelope\": {\r\n \"keywords\": [\"email\", \"inbox\"],\r\n \"char\": \"📨\",\r\n \"category\": \"objects\"\r\n },\r\n \"email\": {\r\n \"keywords\": [\"communication\", \"inbox\"],\r\n \"char\": \"📧\",\r\n \"category\": \"objects\"\r\n },\r\n \"love_letter\": {\r\n \"keywords\": [\"email\", \"like\", \"affection\", \"envelope\", \"valentines\"],\r\n \"char\": \"💌\",\r\n \"category\": \"objects\"\r\n },\r\n \"postbox\": {\r\n \"keywords\": [\"email\", \"letter\", \"envelope\"],\r\n \"char\": \"📮\",\r\n \"category\": \"objects\"\r\n },\r\n \"mailbox_closed\": {\r\n \"keywords\": [\"email\", \"communication\", \"inbox\"],\r\n \"char\": \"📪\",\r\n \"category\": \"objects\"\r\n },\r\n \"mailbox\": {\r\n \"keywords\": [\"email\", \"inbox\", \"communication\"],\r\n \"char\": \"📫\",\r\n \"category\": \"objects\"\r\n },\r\n \"mailbox_with_mail\": {\r\n \"keywords\": [\"email\", \"inbox\", \"communication\"],\r\n \"char\": \"📬\",\r\n \"category\": \"objects\"\r\n },\r\n \"mailbox_with_no_mail\": {\r\n \"keywords\": [\"email\", \"inbox\"],\r\n \"char\": \"📭\",\r\n \"category\": \"objects\"\r\n },\r\n \"package\": {\r\n \"keywords\": [\"mail\", \"gift\", \"cardboard\", \"box\", \"moving\"],\r\n \"char\": \"📦\",\r\n \"category\": \"objects\"\r\n },\r\n \"postal_horn\": {\r\n \"keywords\": [\"instrument\", \"music\"],\r\n \"char\": \"📯\",\r\n \"category\": \"objects\"\r\n },\r\n \"inbox_tray\": {\r\n \"keywords\": [\"email\", \"documents\"],\r\n \"char\": \"📥\",\r\n \"category\": \"objects\"\r\n },\r\n \"outbox_tray\": {\r\n \"keywords\": [\"inbox\", \"email\"],\r\n \"char\": \"📤\",\r\n \"category\": \"objects\"\r\n },\r\n \"scroll\": {\r\n \"keywords\": [\"documents\", \"ancient\", \"history\", \"paper\"],\r\n \"char\": \"📜\",\r\n \"category\": \"objects\"\r\n },\r\n \"page_with_curl\": {\r\n \"keywords\": [\"documents\", \"office\", \"paper\"],\r\n \"char\": \"📃\",\r\n \"category\": \"objects\"\r\n },\r\n \"bookmark_tabs\": {\r\n \"keywords\": [\"favorite\", \"save\", \"order\", \"tidy\"],\r\n \"char\": \"📑\",\r\n \"category\": \"objects\"\r\n },\r\n \"bar_chart\": {\r\n \"keywords\": [\"graph\", \"presentation\", \"stats\"],\r\n \"char\": \"📊\",\r\n \"category\": \"objects\"\r\n },\r\n \"chart_with_upwards_trend\": {\r\n \"keywords\": [\"graph\", \"presentation\", \"stats\", \"recovery\", \"business\", \"economics\", \"money\", \"sales\", \"good\", \"success\"],\r\n \"char\": \"📈\",\r\n \"category\": \"objects\"\r\n },\r\n \"chart_with_downwards_trend\": {\r\n \"keywords\": [\"graph\", \"presentation\", \"stats\", \"recession\", \"business\", \"economics\", \"money\", \"sales\", \"bad\", \"failure\"],\r\n \"char\": \"📉\",\r\n \"category\": \"objects\"\r\n },\r\n \"page_facing_up\": {\r\n \"keywords\": [\"documents\", \"office\", \"paper\", \"information\"],\r\n \"char\": \"📄\",\r\n \"category\": \"objects\"\r\n },\r\n \"date\": {\r\n \"keywords\": [\"calendar\", \"schedule\"],\r\n \"char\": \"📅\",\r\n \"category\": \"objects\"\r\n },\r\n \"calendar\": {\r\n \"keywords\": [\"schedule\", \"date\", \"planning\"],\r\n \"char\": \"📆\",\r\n \"category\": \"objects\"\r\n },\r\n \"spiral_calendar_pad\": {\r\n \"keywords\": [\"date\", \"schedule\", \"planning\"],\r\n \"char\": \"🗓\",\r\n \"category\": \"objects\"\r\n },\r\n \"card_index\": {\r\n \"keywords\": [\"business\", \"stationery\"],\r\n \"char\": \"📇\",\r\n \"category\": \"objects\"\r\n },\r\n \"card_file_box\": {\r\n \"keywords\": [\"business\", \"stationery\"],\r\n \"char\": \"🗃\",\r\n \"category\": \"objects\"\r\n },\r\n \"ballot_box_with_ballot\": {\r\n \"keywords\": [\"election\", \"vote\"],\r\n \"char\": \"🗳\",\r\n \"category\": \"objects\"\r\n },\r\n \"file_cabinet\": {\r\n \"keywords\": [\"filing\", \"organizing\"],\r\n \"char\": \"🗄\",\r\n \"category\": \"objects\"\r\n },\r\n \"clipboard\": {\r\n \"keywords\": [\"stationery\", \"documents\"],\r\n \"char\": \"📋\",\r\n \"category\": \"objects\"\r\n },\r\n \"spiral_note_pad\": {\r\n \"keywords\": [\"memo\", \"stationery\"],\r\n \"char\": \"🗒\",\r\n \"category\": \"objects\"\r\n },\r\n \"file_folder\": {\r\n \"keywords\": [\"documents\", \"business\", \"office\"],\r\n \"char\": \"📁\",\r\n \"category\": \"objects\"\r\n },\r\n \"open_file_folder\": {\r\n \"keywords\": [\"documents\", \"load\"],\r\n \"char\": \"📂\",\r\n \"category\": \"objects\"\r\n },\r\n \"card_index_dividers\": {\r\n \"keywords\": [\"organizing\", \"business\", \"stationery\"],\r\n \"char\": \"🗂\",\r\n \"category\": \"objects\"\r\n },\r\n \"rolled_up_newspaper\": {\r\n \"keywords\": [\"press\", \"headline\"],\r\n \"char\": \"🗞\",\r\n \"category\": \"objects\"\r\n },\r\n \"newspaper\": {\r\n \"keywords\": [\"press\", \"headline\"],\r\n \"char\": \"📰\",\r\n \"category\": \"objects\"\r\n },\r\n \"notebook\": {\r\n \"keywords\": [\"stationery\", \"record\", \"notes\", \"paper\", \"study\"],\r\n \"char\": \"📓\",\r\n \"category\": \"objects\"\r\n },\r\n \"closed_book\": {\r\n \"keywords\": [\"read\", \"library\", \"knowledge\", \"textbook\", \"learn\"],\r\n \"char\": \"📕\",\r\n \"category\": \"objects\"\r\n },\r\n \"green_book\": {\r\n \"keywords\": [\"read\", \"library\", \"knowledge\", \"study\"],\r\n \"char\": \"📗\",\r\n \"category\": \"objects\"\r\n },\r\n \"blue_book\": {\r\n \"keywords\": [\"read\", \"library\", \"knowledge\", \"learn\", \"study\"],\r\n \"char\": \"📘\",\r\n \"category\": \"objects\"\r\n },\r\n \"orange_book\": {\r\n \"keywords\": [\"read\", \"library\", \"knowledge\", \"textbook\", \"study\"],\r\n \"char\": \"📙\",\r\n \"category\": \"objects\"\r\n },\r\n \"notebook_with_decorative_cover\": {\r\n \"keywords\": [\"classroom\", \"notes\", \"record\", \"paper\", \"study\"],\r\n \"char\": \"📔\",\r\n \"category\": \"objects\"\r\n },\r\n \"ledger\": {\r\n \"keywords\": [\"notes\", \"paper\"],\r\n \"char\": \"📒\",\r\n \"category\": \"objects\"\r\n },\r\n \"books\": {\r\n \"keywords\": [\"literature\", \"library\", \"study\"],\r\n \"char\": \"📚\",\r\n \"category\": \"objects\"\r\n },\r\n \"book\": {\r\n \"keywords\": [\"open_book\", \"read\", \"library\", \"knowledge\", \"literature\", \"learn\", \"study\"],\r\n \"char\": \"📖\",\r\n \"category\": \"objects\"\r\n },\r\n \"link\": {\r\n \"keywords\": [\"rings\", \"url\"],\r\n \"char\": \"🔗\",\r\n \"category\": \"objects\"\r\n },\r\n \"paperclip\": {\r\n \"keywords\": [\"documents\", \"stationery\"],\r\n \"char\": \"📎\",\r\n \"category\": \"objects\"\r\n },\r\n \"linked_paperclips\": {\r\n \"keywords\": [\"documents\", \"stationery\"],\r\n \"char\": \"🖇\",\r\n \"category\": \"objects\"\r\n },\r\n \"scissors\": {\r\n \"keywords\": [\"stationery\", \"cut\"],\r\n \"char\": \"✂️\",\r\n \"category\": \"objects\"\r\n },\r\n \"triangular_ruler\": {\r\n \"keywords\": [\"stationery\", \"math\", \"architect\", \"sketch\"],\r\n \"char\": \"📐\",\r\n \"category\": \"objects\"\r\n },\r\n \"straight_ruler\": {\r\n \"keywords\": [\"stationery\", \"calculate\", \"length\", \"math\", \"school\", \"drawing\", \"architect\", \"sketch\"],\r\n \"char\": \"📏\",\r\n \"category\": \"objects\"\r\n },\r\n \"pushpin\": {\r\n \"keywords\": [\"stationery\", \"mark\", \"here\"],\r\n \"char\": \"📌\",\r\n \"category\": \"objects\"\r\n },\r\n \"round_pushpin\": {\r\n \"keywords\": [\"stationery\", \"location\", \"map\", \"here\"],\r\n \"char\": \"📍\",\r\n \"category\": \"objects\"\r\n },\r\n \"triangular_flag_on_post\": {\r\n \"keywords\": [\"mark\", \"milestone\", \"place\"],\r\n \"char\": \"🚩\",\r\n \"category\": \"objects\"\r\n },\r\n \"waving_white_flag\": {\r\n \"keywords\": [\"losing\", \"loser\", \"lost\", \"surrender\", \"give up\", \"fail\"],\r\n \"char\": \"🏳\",\r\n \"category\": \"objects\"\r\n },\r\n \"waving_black_flag\": {\r\n \"keywords\": [\"pirate\"],\r\n \"char\": \"🏴\",\r\n \"category\": \"objects\"\r\n },\r\n \"closed_lock_with_key\": {\r\n \"keywords\": [\"security\", \"privacy\"],\r\n \"char\": \"🔐\",\r\n \"category\": \"objects\"\r\n },\r\n \"lock\": {\r\n \"keywords\": [\"security\", \"password\", \"padlock\"],\r\n \"char\": \"🔒\",\r\n \"category\": \"objects\"\r\n },\r\n \"unlock\": {\r\n \"keywords\": [\"privacy\", \"security\"],\r\n \"char\": \"🔓\",\r\n \"category\": \"objects\"\r\n },\r\n \"lock_with_ink_pen\": {\r\n \"keywords\": [\"security\", \"secret\"],\r\n \"char\": \"🔏\",\r\n \"category\": \"objects\"\r\n },\r\n \"lower_left_ballpoint_pen\": {\r\n \"keywords\": [\"stationery\", \"writing\", \"write\"],\r\n \"char\": \"🖊\",\r\n \"category\": \"objects\"\r\n },\r\n \"lower_left_fountain_pen\": {\r\n \"keywords\": [\"stationery\", \"writing\", \"write\"],\r\n \"char\": \"🖋\",\r\n \"category\": \"objects\"\r\n },\r\n \"black_nib\": {\r\n \"keywords\": [\"pen\", \"stationery\", \"writing\", \"write\"],\r\n \"char\": \"✒️\",\r\n \"category\": \"objects\"\r\n },\r\n \"memo\": {\r\n \"keywords\": [\"write\", \"documents\", \"stationery\", \"pencil\", \"paper\", \"writing\", \"legal\", \"exam\", \"quiz\", \"test\", \"study\"],\r\n \"char\": \"📝\",\r\n \"category\": \"objects\"\r\n },\r\n \"pencil2\": {\r\n \"keywords\": [\"stationery\", \"write\", \"paper\", \"writing\", \"school\", \"study\"],\r\n \"char\": \"✏️\",\r\n \"category\": \"objects\"\r\n },\r\n \"lower_left_crayon\": {\r\n \"keywords\": [\"drawing\", \"creativity\"],\r\n \"char\": \"🖍\",\r\n \"category\": \"objects\"\r\n },\r\n \"lower_left_paintbrush\": {\r\n \"keywords\": [\"drawing\", \"creativity\", \"art\"],\r\n \"char\": \"🖌\",\r\n \"category\": \"objects\"\r\n },\r\n \"mag\": {\r\n \"keywords\": [\"search\", \"zoom\", \"find\", \"detective\"],\r\n \"char\": \"🔍\",\r\n \"category\": \"objects\"\r\n },\r\n \"mag_right\": {\r\n \"keywords\": [\"search\", \"zoom\", \"find\", \"detective\"],\r\n \"char\": \"🔎\",\r\n \"category\": \"objects\"\r\n },\r\n \"heart\": {\r\n \"keywords\": [\"love\", \"like\", \"valentines\"],\r\n \"char\": \"❤️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"yellow_heart\": {\r\n \"keywords\": [\"love\", \"like\", \"affection\", \"valentines\"],\r\n \"char\": \"💛\",\r\n \"category\": \"symbols\"\r\n },\r\n \"green_heart\": {\r\n \"keywords\": [\"love\", \"like\", \"affection\", \"valentines\"],\r\n \"char\": \"💚\",\r\n \"category\": \"symbols\"\r\n },\r\n \"blue_heart\": {\r\n \"keywords\": [\"love\", \"like\", \"affection\", \"valentines\"],\r\n \"char\": \"💙\",\r\n \"category\": \"symbols\"\r\n },\r\n \"purple_heart\": {\r\n \"keywords\": [\"love\", \"like\", \"affection\", \"valentines\"],\r\n \"char\": \"💜\",\r\n \"category\": \"symbols\"\r\n },\r\n \"broken_heart\": {\r\n \"keywords\": [\"sad\", \"sorry\", \"break\", \"heart\", \"heartbreak\"],\r\n \"char\": \"💔\",\r\n \"category\": \"symbols\"\r\n },\r\n \"heavy_heart_exclamation_mark_ornament\": {\r\n \"keywords\": [\"decoration\", \"love\"],\r\n \"char\": \"❣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"two_hearts\": {\r\n \"keywords\": [\"love\", \"like\", \"affection\", \"valentines\", \"heart\"],\r\n \"char\": \"💕\",\r\n \"category\": \"symbols\"\r\n },\r\n \"revolving_hearts\": {\r\n \"keywords\": [\"love\", \"like\", \"affection\", \"valentines\"],\r\n \"char\": \"💞\",\r\n \"category\": \"symbols\"\r\n },\r\n \"heartbeat\": {\r\n \"keywords\": [\"love\", \"like\", \"affection\", \"valentines\", \"pink\", \"heart\"],\r\n \"char\": \"💓\",\r\n \"category\": \"symbols\"\r\n },\r\n \"heartpulse\": {\r\n \"keywords\": [\"like\", \"love\", \"affection\", \"valentines\", \"pink\"],\r\n \"char\": \"💗\",\r\n \"category\": \"symbols\"\r\n },\r\n \"sparkling_heart\": {\r\n \"keywords\": [\"love\", \"like\", \"affection\", \"valentines\"],\r\n \"char\": \"💖\",\r\n \"category\": \"symbols\"\r\n },\r\n \"cupid\": {\r\n \"keywords\": [\"love\", \"like\", \"heart\", \"affection\", \"valentines\"],\r\n \"char\": \"💘\",\r\n \"category\": \"symbols\"\r\n },\r\n \"gift_heart\": {\r\n \"keywords\": [\"love\", \"valentines\"],\r\n \"char\": \"💝\",\r\n \"category\": \"symbols\"\r\n },\r\n \"heart_decoration\": {\r\n \"keywords\": [\"purple-square\", \"love\", \"like\"],\r\n \"char\": \"💟\",\r\n \"category\": \"symbols\"\r\n },\r\n \"peace_symbol\": {\r\n \"keywords\": [\"hippie\"],\r\n \"char\": \"☮\",\r\n \"category\": \"symbols\"\r\n },\r\n \"latin_cross\": {\r\n \"keywords\": [\"christianity\"],\r\n \"char\": \"✝\",\r\n \"category\": \"symbols\"\r\n },\r\n \"star_and_crescent\": {\r\n \"keywords\": [\"islam\"],\r\n \"char\": \"☪\",\r\n \"category\": \"symbols\"\r\n },\r\n \"om_symbol\": {\r\n \"keywords\": [\"hinduism\", \"buddhism\", \"sikhism\", \"jainism\"],\r\n \"char\": \"🕉\",\r\n \"category\": \"symbols\"\r\n },\r\n \"wheel_of_dharma\": {\r\n \"keywords\": [\"hinduism\", \"buddhism\", \"sikhism\", \"jainism\"],\r\n \"char\": \"☸\",\r\n \"category\": \"symbols\"\r\n },\r\n \"star_of_david\": {\r\n \"keywords\": [\"judaism\"],\r\n \"char\": \"✡\",\r\n \"category\": \"symbols\"\r\n },\r\n \"six_pointed_star\": {\r\n \"keywords\": [\"purple-square\", \"religion\", \"jewish\", \"hexagram\"],\r\n \"char\": \"🔯\",\r\n \"category\": \"symbols\"\r\n },\r\n \"menorah_with_nine_branches\": {\r\n \"keywords\": [\"hanukkah\", \"candles\", \"jewish\"],\r\n \"char\": \"🕎\",\r\n \"category\": \"symbols\"\r\n },\r\n \"yin_yang\": {\r\n \"keywords\": [\"balance\"],\r\n \"char\": \"☯\",\r\n \"category\": \"symbols\"\r\n },\r\n \"orthodox_cross\": {\r\n \"keywords\": [\"suppedaneum\", \"religion\"],\r\n \"char\": \"☦\",\r\n \"category\": \"symbols\"\r\n },\r\n \"place_of_worship\": {\r\n \"keywords\": [\"religion\", \"church\", \"temple\", \"prayer\"],\r\n \"char\": \"🛐\",\r\n \"category\": \"symbols\"\r\n },\r\n \"ophiuchus\": {\r\n \"keywords\": [\"sign\", \"purple-square\", \"constellation\", \"astrology\"],\r\n \"char\": \"⛎\",\r\n \"category\": \"symbols\"\r\n },\r\n \"aries\": {\r\n \"keywords\": [\"sign\", \"purple-square\", \"zodiac\", \"astrology\"],\r\n \"char\": \"♈\",\r\n \"category\": \"symbols\"\r\n },\r\n \"taurus\": {\r\n \"keywords\": [\"purple-square\", \"sign\", \"zodiac\", \"astrology\"],\r\n \"char\": \"♉\",\r\n \"category\": \"symbols\"\r\n },\r\n \"gemini\": {\r\n \"keywords\": [\"sign\", \"zodiac\", \"purple-square\", \"astrology\"],\r\n \"char\": \"♊\",\r\n \"category\": \"symbols\"\r\n },\r\n \"cancer\": {\r\n \"keywords\": [\"sign\", \"zodiac\", \"purple-square\", \"astrology\"],\r\n \"char\": \"♋\",\r\n \"category\": \"symbols\"\r\n },\r\n \"leo\": {\r\n \"keywords\": [\"sign\", \"purple-square\", \"zodiac\", \"astrology\"],\r\n \"char\": \"♌\",\r\n \"category\": \"symbols\"\r\n },\r\n \"virgo\": {\r\n \"keywords\": [\"sign\", \"zodiac\", \"purple-square\", \"astrology\"],\r\n \"char\": \"♍\",\r\n \"category\": \"symbols\"\r\n },\r\n \"libra\": {\r\n \"keywords\": [\"sign\", \"purple-square\", \"zodiac\", \"astrology\"],\r\n \"char\": \"♎\",\r\n \"category\": \"symbols\"\r\n },\r\n \"scorpius\": {\r\n \"keywords\": [\"sign\", \"zodiac\", \"purple-square\", \"astrology\", \"scorpio\"],\r\n \"char\": \"♏\",\r\n \"category\": \"symbols\"\r\n },\r\n \"sagittarius\": {\r\n \"keywords\": [\"sign\", \"zodiac\", \"purple-square\", \"astrology\"],\r\n \"char\": \"♐\",\r\n \"category\": \"symbols\"\r\n },\r\n \"capricorn\": {\r\n \"keywords\": [\"sign\", \"zodiac\", \"purple-square\", \"astrology\"],\r\n \"char\": \"♑\",\r\n \"category\": \"symbols\"\r\n },\r\n \"aquarius\": {\r\n \"keywords\": [\"sign\", \"purple-square\", \"zodiac\", \"astrology\"],\r\n \"char\": \"♒\",\r\n \"category\": \"symbols\"\r\n },\r\n \"pisces\": {\r\n \"keywords\": [\"purple-square\", \"sign\", \"zodiac\", \"astrology\"],\r\n \"char\": \"♓\",\r\n \"category\": \"symbols\"\r\n },\r\n \"id\": {\r\n \"keywords\": [\"purple-square\", \"words\"],\r\n \"char\": \"🆔\",\r\n \"category\": \"symbols\"\r\n },\r\n \"atom_symbol\": {\r\n \"keywords\": [\"science\"],\r\n \"char\": \"⚛\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u7a7a\": {\r\n \"keywords\": [\"kanji\", \"japanese\", \"chinese\", \"empty\", \"sky\", \"blue-square\"],\r\n \"char\": \"🈳\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u5272\": {\r\n \"keywords\": [\"cut\", \"divide\", \"chinese\", \"kanji\", \"pink-square\"],\r\n \"char\": \"🈹\",\r\n \"category\": \"symbols\"\r\n },\r\n \"radioactive_sign\": {\r\n \"keywords\": [\"nuclear\", \"danger\"],\r\n \"char\": \"☢\",\r\n \"category\": \"symbols\"\r\n },\r\n \"biohazard_sign\": {\r\n \"keywords\": [\"danger\"],\r\n \"char\": \"☣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"mobile_phone_off\": {\r\n \"keywords\": [\"mute\", \"orange-square\", \"silence\", \"quiet\"],\r\n \"char\": \"📴\",\r\n \"category\": \"symbols\"\r\n },\r\n \"vibration_mode\": {\r\n \"keywords\": [\"orange-square\", \"phone\"],\r\n \"char\": \"📳\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u6709\": {\r\n \"keywords\": [\"orange-square\", \"chinese\", \"have\", \"kanji\"],\r\n \"char\": \"🈶\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u7121\": {\r\n \"keywords\": [\"nothing\", \"chinese\", \"kanji\", \"japanese\", \"orange-square\"],\r\n \"char\": \"🈚\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u7533\": {\r\n \"keywords\": [\"chinese\", \"japanese\", \"kanji\", \"orange-square\"],\r\n \"char\": \"🈸\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u55b6\": {\r\n \"keywords\": [\"japanese\", \"opening hours\", \"orange-square\"],\r\n \"char\": \"🈺\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u6708\": {\r\n \"keywords\": [\"chinese\", \"month\", \"moon\", \"japanese\", \"orange-square\", \"kanji\"],\r\n \"char\": \"🈷️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"eight_pointed_black_star\": {\r\n \"keywords\": [\"orange-square\", \"shape\", \"polygon\"],\r\n \"char\": \"✴️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"vs\": {\r\n \"keywords\": [\"words\", \"orange-square\"],\r\n \"char\": \"🆚\",\r\n \"category\": \"symbols\"\r\n },\r\n \"accept\": {\r\n \"keywords\": [\"ok\", \"good\", \"chinese\", \"kanji\", \"agree\", \"yes\", \"orange-circle\"],\r\n \"char\": \"🉑\",\r\n \"category\": \"symbols\"\r\n },\r\n \"white_flower\": {\r\n \"keywords\": [\"japanese\", \"spring\"],\r\n \"char\": \"💮\",\r\n \"category\": \"symbols\"\r\n },\r\n \"ideograph_advantage\": {\r\n \"keywords\": [\"chinese\", \"kanji\", \"obtain\", \"get\", \"circle\"],\r\n \"char\": \"🉐\",\r\n \"category\": \"symbols\"\r\n },\r\n \"secret\": {\r\n \"keywords\": [\"privacy\", \"chinese\", \"sshh\", \"kanji\", \"red-circle\"],\r\n \"char\": \"㊙️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"congratulations\": {\r\n \"keywords\": [\"chinese\", \"kanji\", \"japanese\", \"red-circle\"],\r\n \"char\": \"㊗️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u5408\": {\r\n \"keywords\": [\"japanese\", \"chinese\", \"join\", \"kanji\", \"red-square\"],\r\n \"char\": \"🈴\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u6e80\": {\r\n \"keywords\": [\"full\", \"chinese\", \"japanese\", \"red-square\", \"kanji\"],\r\n \"char\": \"🈵\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u7981\": {\r\n \"keywords\": [\"kanji\", \"japanese\", \"chinese\", \"forbidden\", \"limit\", \"restricted\", \"red-square\"],\r\n \"char\": \"🈲\",\r\n \"category\": \"symbols\"\r\n },\r\n \"a\": {\r\n \"keywords\": [\"red-square\", \"alphabet\", \"letter\"],\r\n \"char\": \"🅰️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"b\": {\r\n \"keywords\": [\"red-square\", \"alphabet\", \"letter\"],\r\n \"char\": \"🅱️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"ab\": {\r\n \"keywords\": [\"red-square\", \"alphabet\"],\r\n \"char\": \"🆎\",\r\n \"category\": \"symbols\"\r\n },\r\n \"cl\": {\r\n \"keywords\": [\"alphabet\", \"words\", \"red-square\"],\r\n \"char\": \"🆑\",\r\n \"category\": \"symbols\"\r\n },\r\n \"o2\": {\r\n \"keywords\": [\"alphabet\", \"red-square\", \"letter\"],\r\n \"char\": \"🅾️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"sos\": {\r\n \"keywords\": [\"help\", \"red-square\", \"words\", \"emergency\", \"911\"],\r\n \"char\": \"🆘\",\r\n \"category\": \"symbols\"\r\n },\r\n \"no_entry\": {\r\n \"keywords\": [\"limit\", \"security\", \"privacy\", \"bad\", \"denied\", \"stop\", \"circle\"],\r\n \"char\": \"⛔\",\r\n \"category\": \"symbols\"\r\n },\r\n \"name_badge\": {\r\n \"keywords\": [\"fire\", \"forbid\"],\r\n \"char\": \"📛\",\r\n \"category\": \"symbols\"\r\n },\r\n \"no_entry_sign\": {\r\n \"keywords\": [\"forbid\", \"stop\", \"limit\", \"denied\", \"disallow\", \"circle\"],\r\n \"char\": \"🚫\",\r\n \"category\": \"symbols\"\r\n },\r\n \"x\": {\r\n \"keywords\": [\"no\", \"delete\", \"remove\", \"cancel\"],\r\n \"char\": \"❌\",\r\n \"category\": \"symbols\"\r\n },\r\n \"o\": {\r\n \"keywords\": [\"circle\", \"round\"],\r\n \"char\": \"⭕\",\r\n \"category\": \"symbols\"\r\n },\r\n \"anger\": {\r\n \"keywords\": [\"angry\", \"mad\"],\r\n \"char\": \"💢\",\r\n \"category\": \"symbols\"\r\n },\r\n \"hotsprings\": {\r\n \"keywords\": [\"bath\", \"warm\", \"relax\"],\r\n \"char\": \"♨️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"no_pedestrians\": {\r\n \"keywords\": [\"rules\", \"crossing\", \"walking\", \"circle\"],\r\n \"char\": \"🚷\",\r\n \"category\": \"symbols\"\r\n },\r\n \"do_not_litter\": {\r\n \"keywords\": [\"trash\", \"bin\", \"garbage\", \"circle\"],\r\n \"char\": \"🚯\",\r\n \"category\": \"symbols\"\r\n },\r\n \"no_bicycles\": {\r\n \"keywords\": [\"cyclist\", \"prohibited\", \"circle\"],\r\n \"char\": \"🚳\",\r\n \"category\": \"symbols\"\r\n },\r\n \"non-potable_water\": {\r\n \"keywords\": [\"drink\", \"faucet\", \"tap\", \"circle\"],\r\n \"char\": \"🚱\",\r\n \"category\": \"symbols\"\r\n },\r\n \"underage\": {\r\n \"keywords\": [\"18\", \"drink\", \"pub\", \"night\", \"minor\", \"circle\"],\r\n \"char\": \"🔞\",\r\n \"category\": \"symbols\"\r\n },\r\n \"no_mobile_phones\": {\r\n \"keywords\": [\"iphone\", \"mute\", \"circle\"],\r\n \"char\": \"📵\",\r\n \"category\": \"symbols\"\r\n },\r\n \"exclamation\": {\r\n \"keywords\": [\"heavy_exclamation_mark\", \"danger\", \"surprise\", \"punctuation\", \"wow\", \"warning\"],\r\n \"char\": \"❗\",\r\n \"category\": \"symbols\"\r\n },\r\n \"grey_exclamation\": {\r\n \"keywords\": [\"surprise\", \"punctuation\", \"gray\", \"wow\", \"warning\"],\r\n \"char\": \"❕\",\r\n \"category\": \"symbols\"\r\n },\r\n \"question\": {\r\n \"keywords\": [\"doubt\", \"confused\"],\r\n \"char\": \"❓\",\r\n \"category\": \"symbols\"\r\n },\r\n \"grey_question\": {\r\n \"keywords\": [\"doubts\", \"gray\", \"huh\", \"confused\"],\r\n \"char\": \"❔\",\r\n \"category\": \"symbols\"\r\n },\r\n \"bangbang\": {\r\n \"keywords\": [\"exclamation\", \"surprise\"],\r\n \"char\": \"‼️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"interrobang\": {\r\n \"keywords\": [\"wat\", \"punctuation\", \"surprise\"],\r\n \"char\": \"⁉️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"100\": {\r\n \"keywords\": [\"score\", \"perfect\", \"numbers\", \"century\", \"exam\", \"quiz\", \"test\", \"pass\", \"hundred\"],\r\n \"char\": \"💯\",\r\n \"category\": \"symbols\"\r\n },\r\n \"low_brightness\": {\r\n \"keywords\": [\"sun\", \"afternoon\", \"warm\", \"summer\"],\r\n \"char\": \"🔅\",\r\n \"category\": \"symbols\"\r\n },\r\n \"high_brightness\": {\r\n \"keywords\": [\"sun\", \"light\"],\r\n \"char\": \"🔆\",\r\n \"category\": \"symbols\"\r\n },\r\n \"trident\": {\r\n \"keywords\": [\"weapon\", \"spear\"],\r\n \"char\": \"🔱\",\r\n \"category\": \"symbols\"\r\n },\r\n \"fleur_de_lis\": {\r\n \"keywords\": [\"decorative\", \"scout\"],\r\n \"char\": \"⚜\",\r\n \"category\": \"symbols\"\r\n },\r\n \"part_alternation_mark\": {\r\n \"keywords\": [\"graph\", \"presentation\", \"stats\", \"business\", \"economics\", \"bad\"],\r\n \"char\": \"〽️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"warning\": {\r\n \"keywords\": [\"exclamation\", \"wip\", \"alert\", \"error\", \"problem\", \"issue\"],\r\n \"char\": \"⚠️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"children_crossing\": {\r\n \"keywords\": [\"school\", \"warning\", \"danger\", \"sign\", \"driving\", \"yellow-diamond\"],\r\n \"char\": \"🚸\",\r\n \"category\": \"symbols\"\r\n },\r\n \"beginner\": {\r\n \"keywords\": [\"badge\", \"shield\"],\r\n \"char\": \"🔰\",\r\n \"category\": \"symbols\"\r\n },\r\n \"recycle\": {\r\n \"keywords\": [\"arrow\", \"environment\", \"garbage\", \"trash\"],\r\n \"char\": \"♻️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"u6307\": {\r\n \"keywords\": [\"chinese\", \"point\", \"green-square\", \"kanji\"],\r\n \"char\": \"🈯\",\r\n \"category\": \"symbols\"\r\n },\r\n \"chart\": {\r\n \"keywords\": [\"green-square\", \"graph\", \"presentation\", \"stats\"],\r\n \"char\": \"💹\",\r\n \"category\": \"symbols\"\r\n },\r\n \"sparkle\": {\r\n \"keywords\": [\"stars\", \"green-square\", \"awesome\", \"good\", \"fireworks\"],\r\n \"char\": \"❇️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"eight_spoked_asterisk\": {\r\n \"keywords\": [\"star\", \"sparkle\", \"green-square\"],\r\n \"char\": \"✳️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"negative_squared_cross_mark\": {\r\n \"keywords\": [\"x\", \"green-square\", \"no\", \"deny\"],\r\n \"char\": \"❎\",\r\n \"category\": \"symbols\"\r\n },\r\n \"white_check_mark\": {\r\n \"keywords\": [\"green-square\", \"ok\", \"agree\", \"vote\", \"election\", \"answer\"],\r\n \"char\": \"✅\",\r\n \"category\": \"symbols\"\r\n },\r\n \"diamond_shape_with_a_dot_inside\": {\r\n \"keywords\": [\"jewel\", \"blue\", \"gem\", \"crystal\", \"fancy\"],\r\n \"char\": \"💠\",\r\n \"category\": \"symbols\"\r\n },\r\n \"cyclone\": {\r\n \"keywords\": [\"weather\", \"swirl\", \"blue\", \"cloud\", \"vortex\", \"spiral\", \"whirlpool\", \"spin\"],\r\n \"char\": \"🌀\",\r\n \"category\": \"symbols\"\r\n },\r\n \"loop\": {\r\n \"keywords\": [\"tape\", \"cassette\"],\r\n \"char\": \"➿\",\r\n \"category\": \"symbols\"\r\n },\r\n \"globe_with_meridians\": {\r\n \"keywords\": [\"earth\", \"international\", \"world\", \"internet\", \"interweb\", \"i18n\"],\r\n \"char\": \"🌐\",\r\n \"category\": \"symbols\"\r\n },\r\n \"m\": {\r\n \"keywords\": [\"alphabet\", \"blue-circle\", \"letter\"],\r\n \"char\": \"Ⓜ️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"atm\": {\r\n \"keywords\": [\"money\", \"sales\", \"cash\", \"blue-square\", \"payment\", \"bank\"],\r\n \"char\": \"🏧\",\r\n \"category\": \"symbols\"\r\n },\r\n \"sa\": {\r\n \"keywords\": [\"japanese\", \"blue-square\", \"katakana\"],\r\n \"char\": \"🈂️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"passport_control\": {\r\n \"keywords\": [\"custom\", \"blue-square\"],\r\n \"char\": \"🛂\",\r\n \"category\": \"symbols\"\r\n },\r\n \"customs\": {\r\n \"keywords\": [\"passport\", \"border\", \"blue-square\"],\r\n \"char\": \"🛃\",\r\n \"category\": \"symbols\"\r\n },\r\n \"baggage_claim\": {\r\n \"keywords\": [\"blue-square\", \"airport\", \"transport\"],\r\n \"char\": \"🛄\",\r\n \"category\": \"symbols\"\r\n },\r\n \"left_luggage\": {\r\n \"keywords\": [\"blue-square\", \"travel\"],\r\n \"char\": \"🛅\",\r\n \"category\": \"symbols\"\r\n },\r\n \"wheelchair\": {\r\n \"keywords\": [\"blue-square\", \"disabled\", \"a11y\", \"accessibility\"],\r\n \"char\": \"♿\",\r\n \"category\": \"symbols\"\r\n },\r\n \"no_smoking\": {\r\n \"keywords\": [\"cigarette\", \"blue-square\", \"smell\", \"smoke\"],\r\n \"char\": \"🚭\",\r\n \"category\": \"symbols\"\r\n },\r\n \"wc\": {\r\n \"keywords\": [\"toilet\", \"restroom\", \"blue-square\"],\r\n \"char\": \"🚾\",\r\n \"category\": \"symbols\"\r\n },\r\n \"parking\": {\r\n \"keywords\": [\"cars\", \"blue-square\", \"alphabet\", \"letter\"],\r\n \"char\": \"🅿️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"potable_water\": {\r\n \"keywords\": [\"blue-square\", \"liquid\", \"restroom\", \"cleaning\", \"faucet\"],\r\n \"char\": \"🚰\",\r\n \"category\": \"symbols\"\r\n },\r\n \"mens\": {\r\n \"keywords\": [\"toilet\", \"restroom\", \"wc\", \"blue-square\", \"gender\", \"male\"],\r\n \"char\": \"🚹\",\r\n \"category\": \"symbols\"\r\n },\r\n \"womens\": {\r\n \"keywords\": [\"purple-square\", \"woman\", \"female\", \"toilet\", \"loo\", \"restroom\", \"gender\"],\r\n \"char\": \"🚺\",\r\n \"category\": \"symbols\"\r\n },\r\n \"baby_symbol\": {\r\n \"keywords\": [\"orange-square\", \"child\"],\r\n \"char\": \"🚼\",\r\n \"category\": \"symbols\"\r\n },\r\n \"restroom\": {\r\n \"keywords\": [\"blue-square\", \"toilet\", \"refresh\", \"wc\", \"gender\"],\r\n \"char\": \"🚻\",\r\n \"category\": \"symbols\"\r\n },\r\n \"put_litter_in_its_place\": {\r\n \"keywords\": [\"blue-square\", \"sign\", \"human\", \"info\"],\r\n \"char\": \"🚮\",\r\n \"category\": \"symbols\"\r\n },\r\n \"cinema\": {\r\n \"keywords\": [\"blue-square\", \"record\", \"film\", \"movie\", \"curtain\", \"stage\", \"theater\"],\r\n \"char\": \"🎦\",\r\n \"category\": \"symbols\"\r\n },\r\n \"signal_strength\": {\r\n \"keywords\": [\"blue-square\", \"reception\", \"phone\", \"internet\", \"connection\", \"wifi\", \"bluetooth\", \"bars\"],\r\n \"char\": \"📶\",\r\n \"category\": \"symbols\"\r\n },\r\n \"koko\": {\r\n \"keywords\": [\"blue-square\", \"here\", \"katakana\", \"japanese\", \"destination\"],\r\n \"char\": \"🈁\",\r\n \"category\": \"symbols\"\r\n },\r\n \"ng\": {\r\n \"keywords\": [\"blue-square\", \"words\", \"shape\", \"icon\"],\r\n \"char\": \"🆖\",\r\n \"category\": \"symbols\"\r\n },\r\n \"ok\": {\r\n \"keywords\": [\"good\", \"agree\", \"yes\", \"blue-square\"],\r\n \"char\": \"🆗\",\r\n \"category\": \"symbols\"\r\n },\r\n \"up\": {\r\n \"keywords\": [\"blue-square\", \"above\", \"high\"],\r\n \"char\": \"🆙\",\r\n \"category\": \"symbols\"\r\n },\r\n \"cool\": {\r\n \"keywords\": [\"words\", \"blue-square\"],\r\n \"char\": \"🆒\",\r\n \"category\": \"symbols\"\r\n },\r\n \"new\": {\r\n \"keywords\": [\"blue-square\", \"words\", \"start\"],\r\n \"char\": \"🆕\",\r\n \"category\": \"symbols\"\r\n },\r\n \"free\": {\r\n \"keywords\": [\"blue-square\", \"words\"],\r\n \"char\": \"🆓\",\r\n \"category\": \"symbols\"\r\n },\r\n \"zero\": {\r\n \"keywords\": [\"0\", \"numbers\", \"blue-square\", \"null\"],\r\n \"char\": \"0️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"one\": {\r\n \"keywords\": [\"blue-square\", \"numbers\", \"1\"],\r\n \"char\": \"1️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"two\": {\r\n \"keywords\": [\"numbers\", \"2\", \"prime\", \"blue-square\"],\r\n \"char\": \"2️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"three\": {\r\n \"keywords\": [\"3\", \"numbers\", \"prime\", \"blue-square\"],\r\n \"char\": \"3️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"four\": {\r\n \"keywords\": [\"4\", \"numbers\", \"blue-square\"],\r\n \"char\": \"4️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"five\": {\r\n \"keywords\": [\"5\", \"numbers\", \"blue-square\", \"prime\"],\r\n \"char\": \"5️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"six\": {\r\n \"keywords\": [\"6\", \"numbers\", \"blue-square\"],\r\n \"char\": \"6️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"seven\": {\r\n \"keywords\": [\"7\", \"numbers\", \"blue-square\", \"prime\"],\r\n \"char\": \"7️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"eight\": {\r\n \"keywords\": [\"8\", \"blue-square\", \"numbers\"],\r\n \"char\": \"8️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"nine\": {\r\n \"keywords\": [\"blue-square\", \"numbers\", \"9\"],\r\n \"char\": \"9️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"keycap_ten\": {\r\n \"keywords\": [\"numbers\", \"10\", \"blue-square\"],\r\n \"char\": \"🔟\",\r\n \"category\": \"symbols\"\r\n },\r\n \"keycap_star\": {\r\n \"keywords\": [\"asterisk\"],\r\n \"char\": \"*⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"1234\": {\r\n \"keywords\": [\"numbers\", \"blue-square\"],\r\n \"char\": \"🔢\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_forward\": {\r\n \"keywords\": [\"blue-square\", \"right\", \"direction\", \"play\"],\r\n \"char\": \"▶️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"double_vertical_bar\": {\r\n \"keywords\": [\"pause\", \"blue-square\"],\r\n \"char\": \"⏸\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_right_pointing_triangle_with_double_vertical_bar\": {\r\n \"keywords\": [\"forward\", \"next\", \"blue-square\"],\r\n \"char\": \"⏭\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_square_for_stop\": {\r\n \"keywords\": [\"blue-square\"],\r\n \"char\": \"⏹\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_circle_for_record\": {\r\n \"keywords\": [\"blue-square\"],\r\n \"char\": \"⏺\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_right_pointing_double_triangle_with_vertical_bar\": {\r\n \"keywords\": [\"blue-square\", \"play\", \"pause\"],\r\n \"char\": \"⏯\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_left_pointing_double_triangle_with_vertical_bar\": {\r\n \"keywords\": [\"backward\"],\r\n \"char\": \"⏮\",\r\n \"category\": \"symbols\"\r\n },\r\n \"fast_forward\": {\r\n \"keywords\": [\"blue-square\", \"play\", \"speed\", \"continue\"],\r\n \"char\": \"⏩\",\r\n \"category\": \"symbols\"\r\n },\r\n \"rewind\": {\r\n \"keywords\": [\"play\", \"blue-square\"],\r\n \"char\": \"⏪\",\r\n \"category\": \"symbols\"\r\n },\r\n \"twisted_rightwards_arrows\": {\r\n \"keywords\": [\"blue-square\", \"shuffle\", \"music\", \"random\"],\r\n \"char\": \"🔀\",\r\n \"category\": \"symbols\"\r\n },\r\n \"repeat\": {\r\n \"keywords\": [\"loop\", \"record\"],\r\n \"char\": \"🔁\",\r\n \"category\": \"symbols\"\r\n },\r\n \"repeat_one\": {\r\n \"keywords\": [\"blue-square\", \"loop\"],\r\n \"char\": \"🔂\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_backward\": {\r\n \"keywords\": [\"blue-square\", \"left\", \"direction\"],\r\n \"char\": \"◀️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_up_small\": {\r\n \"keywords\": [\"blue-square\", \"triangle\", \"direction\", \"point\", \"forward\", \"top\"],\r\n \"char\": \"🔼\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_down_small\": {\r\n \"keywords\": [\"blue-square\", \"direction\", \"bottom\"],\r\n \"char\": \"🔽\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_double_up\": {\r\n \"keywords\": [\"blue-square\", \"direction\", \"top\"],\r\n \"char\": \"⏫\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_double_down\": {\r\n \"keywords\": [\"blue-square\", \"direction\", \"bottom\"],\r\n \"char\": \"⏬\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_right\": {\r\n \"keywords\": [\"blue-square\", \"next\"],\r\n \"char\": \"➡️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_left\": {\r\n \"keywords\": [\"blue-square\", \"previous\", \"back\"],\r\n \"char\": \"⬅️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_up\": {\r\n \"keywords\": [\"blue-square\", \"continue\", \"top\", \"direction\"],\r\n \"char\": \"⬆️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_down\": {\r\n \"keywords\": [\"blue-square\", \"direction\", \"bottom\"],\r\n \"char\": \"⬇️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_upper_right\": {\r\n \"keywords\": [\"blue-square\", \"point\", \"direction\", \"diagonal\", \"northeast\"],\r\n \"char\": \"↗️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_lower_right\": {\r\n \"keywords\": [\"blue-square\", \"direction\", \"diagonal\", \"southeast\"],\r\n \"char\": \"↘️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_lower_left\": {\r\n \"keywords\": [\"blue-square\", \"direction\", \"diagonal\", \"southwest\"],\r\n \"char\": \"↙️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_upper_left\": {\r\n \"keywords\": [\"blue-square\", \"point\", \"direction\", \"diagonal\", \"northwest\"],\r\n \"char\": \"↖️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_up_down\": {\r\n \"keywords\": [\"blue-square\", \"direction\", \"way\", \"vertical\"],\r\n \"char\": \"↕️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"left_right_arrow\": {\r\n \"keywords\": [\"shape\", \"direction\", \"horizontal\", \"sideways\"],\r\n \"char\": \"↔️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrows_counterclockwise\": {\r\n \"keywords\": [\"blue-square\", \"sync\", \"cycle\"],\r\n \"char\": \"🔄\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_right_hook\": {\r\n \"keywords\": [\"blue-square\", \"return\", \"rotate\", \"direction\"],\r\n \"char\": \"↪️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"leftwards_arrow_with_hook\": {\r\n \"keywords\": [\"back\", \"return\", \"blue-square\", \"undo\", \"enter\"],\r\n \"char\": \"↩️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_heading_up\": {\r\n \"keywords\": [\"blue-square\", \"direction\", \"top\"],\r\n \"char\": \"⤴️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrow_heading_down\": {\r\n \"keywords\": [\"blue-square\", \"direction\", \"bottom\"],\r\n \"char\": \"⤵️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"hash\": {\r\n \"keywords\": [\"symbol\", \"blue-square\", \"twitter\"],\r\n \"char\": \"#️⃣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"information_source\": {\r\n \"keywords\": [\"blue-square\", \"alphabet\", \"letter\"],\r\n \"char\": \"ℹ️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"abc\": {\r\n \"keywords\": [\"blue-square\", \"alphabet\"],\r\n \"char\": \"🔤\",\r\n \"category\": \"symbols\"\r\n },\r\n \"abcd\": {\r\n \"keywords\": [\"blue-square\", \"alphabet\"],\r\n \"char\": \"🔡\",\r\n \"category\": \"symbols\"\r\n },\r\n \"capital_abcd\": {\r\n \"keywords\": [\"alphabet\", \"words\", \"blue-square\"],\r\n \"char\": \"🔠\",\r\n \"category\": \"symbols\"\r\n },\r\n \"symbols\": {\r\n \"keywords\": [\"blue-square\", \"music\", \"note\", \"ampersand\", \"percent\", \"glyphs\", \"characters\"],\r\n \"char\": \"🔣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"musical_note\": {\r\n \"keywords\": [\"score\", \"tone\", \"sound\"],\r\n \"char\": \"🎵\",\r\n \"category\": \"symbols\"\r\n },\r\n \"notes\": {\r\n \"keywords\": [\"music\", \"score\"],\r\n \"char\": \"🎶\",\r\n \"category\": \"symbols\"\r\n },\r\n \"wavy_dash\": {\r\n \"keywords\": [\"draw\", \"line\", \"moustache\", \"mustache\", \"squiggle\", \"scribble\"],\r\n \"char\": \"〰️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"curly_loop\": {\r\n \"keywords\": [\"scribble\", \"draw\", \"shape\", \"squiggle\"],\r\n \"char\": \"➰\",\r\n \"category\": \"symbols\"\r\n },\r\n \"heavy_check_mark\": {\r\n \"keywords\": [\"ok\", \"nike\", \"answer\", \"yes\", \"tick\"],\r\n \"char\": \"✔️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"arrows_clockwise\": {\r\n \"keywords\": [\"sync\", \"cycle\", \"round\", \"repeat\"],\r\n \"char\": \"🔃\",\r\n \"category\": \"symbols\"\r\n },\r\n \"heavy_plus_sign\": {\r\n \"keywords\": [\"math\", \"calculation\", \"addition\", \"more\", \"increase\"],\r\n \"char\": \"➕\",\r\n \"category\": \"symbols\"\r\n },\r\n \"heavy_minus_sign\": {\r\n \"keywords\": [\"math\", \"calculation\", \"subtract\", \"less\"],\r\n \"char\": \"➖\",\r\n \"category\": \"symbols\"\r\n },\r\n \"heavy_division_sign\": {\r\n \"keywords\": [\"divide\", \"math\", \"calculation\"],\r\n \"char\": \"➗\",\r\n \"category\": \"symbols\"\r\n },\r\n \"heavy_multiplication_x\": {\r\n \"keywords\": [\"math\", \"calculation\"],\r\n \"char\": \"✖️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"heavy_dollar_sign\": {\r\n \"keywords\": [\"money\", \"sales\", \"payment\", \"currency\", \"buck\"],\r\n \"char\": \"💲\",\r\n \"category\": \"symbols\"\r\n },\r\n \"currency_exchange\": {\r\n \"keywords\": [\"money\", \"sales\", \"dollar\", \"travel\"],\r\n \"char\": \"💱\",\r\n \"category\": \"symbols\"\r\n },\r\n \"copyright\": {\r\n \"keywords\": [\"ip\", \"license\", \"circle\", \"law\", \"legal\"],\r\n \"char\": \"©️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"registered\": {\r\n \"keywords\": [\"alphabet\", \"circle\"],\r\n \"char\": \"®️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"tm\": {\r\n \"keywords\": [\"trademark\", \"brand\", \"law\", \"legal\"],\r\n \"char\": \"™️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"end\": {\r\n \"keywords\": [\"words\", \"arrow\"],\r\n \"char\": \"🔚\",\r\n \"category\": \"symbols\"\r\n },\r\n \"back\": {\r\n \"keywords\": [\"arrow\", \"words\", \"return\"],\r\n \"char\": \"🔙\",\r\n \"category\": \"symbols\"\r\n },\r\n \"on\": {\r\n \"keywords\": [\"arrow\", \"words\"],\r\n \"char\": \"🔛\",\r\n \"category\": \"symbols\"\r\n },\r\n \"top\": {\r\n \"keywords\": [\"words\", \"blue-square\"],\r\n \"char\": \"🔝\",\r\n \"category\": \"symbols\"\r\n },\r\n \"soon\": {\r\n \"keywords\": [\"arrow\", \"words\"],\r\n \"char\": \"🔜\",\r\n \"category\": \"symbols\"\r\n },\r\n \"ballot_box_with_check\": {\r\n \"keywords\": [\"ok\", \"agree\", \"confirm\", \"black-square\", \"vote\", \"election\", \"yes\"],\r\n \"char\": \"☑️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"radio_button\": {\r\n \"keywords\": [\"input\", \"old\", \"music\", \"circle\"],\r\n \"char\": \"🔘\",\r\n \"category\": \"symbols\"\r\n },\r\n \"white_circle\": {\r\n \"keywords\": [\"shape\", \"round\"],\r\n \"char\": \"⚪\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_circle\": {\r\n \"keywords\": [\"shape\", \"button\", \"round\"],\r\n \"char\": \"⚫\",\r\n \"category\": \"symbols\"\r\n },\r\n \"red_circle\": {\r\n \"keywords\": [\"shape\", \"error\", \"danger\"],\r\n \"char\": \"🔴\",\r\n \"category\": \"symbols\"\r\n },\r\n \"large_blue_circle\": {\r\n \"keywords\": [\"shape\", \"icon\", \"button\"],\r\n \"char\": \"🔵\",\r\n \"category\": \"symbols\"\r\n },\r\n \"small_orange_diamond\": {\r\n \"keywords\": [\"shape\", \"jewel\", \"gem\"],\r\n \"char\": \"🔸\",\r\n \"category\": \"symbols\"\r\n },\r\n \"small_blue_diamond\": {\r\n \"keywords\": [\"shape\", \"jewel\", \"gem\"],\r\n \"char\": \"🔹\",\r\n \"category\": \"symbols\"\r\n },\r\n \"large_orange_diamond\": {\r\n \"keywords\": [\"shape\", \"jewel\", \"gem\"],\r\n \"char\": \"🔶\",\r\n \"category\": \"symbols\"\r\n },\r\n \"large_blue_diamond\": {\r\n \"keywords\": [\"shape\", \"jewel\", \"gem\"],\r\n \"char\": \"🔷\",\r\n \"category\": \"symbols\"\r\n },\r\n \"small_red_triangle\": {\r\n \"keywords\": [\"shape\", \"direction\", \"up\", \"top\"],\r\n \"char\": \"🔺\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_small_square\": {\r\n \"keywords\": [\"shape\", \"icon\"],\r\n \"char\": \"▪️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"white_small_square\": {\r\n \"keywords\": [\"shape\", \"icon\"],\r\n \"char\": \"▫️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_large_square\": {\r\n \"keywords\": [\"shape\", \"icon\", \"button\"],\r\n \"char\": \"⬛\",\r\n \"category\": \"symbols\"\r\n },\r\n \"white_large_square\": {\r\n \"keywords\": [\"shape\", \"icon\", \"stone\", \"button\"],\r\n \"char\": \"⬜\",\r\n \"category\": \"symbols\"\r\n },\r\n \"small_red_triangle_down\": {\r\n \"keywords\": [\"shape\", \"direction\", \"bottom\"],\r\n \"char\": \"🔻\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_medium_square\": {\r\n \"keywords\": [\"shape\", \"button\", \"icon\"],\r\n \"char\": \"◼️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"white_medium_square\": {\r\n \"keywords\": [\"shape\", \"stone\", \"icon\"],\r\n \"char\": \"◻️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_medium_small_square\": {\r\n \"keywords\": [\"icon\", \"shape\", \"button\"],\r\n \"char\": \"◾\",\r\n \"category\": \"symbols\"\r\n },\r\n \"white_medium_small_square\": {\r\n \"keywords\": [\"shape\", \"stone\", \"icon\", \"button\"],\r\n \"char\": \"◽\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_square_button\": {\r\n \"keywords\": [\"shape\", \"input\", \"frame\"],\r\n \"char\": \"🔲\",\r\n \"category\": \"symbols\"\r\n },\r\n \"white_square_button\": {\r\n \"keywords\": [\"shape\", \"input\"],\r\n \"char\": \"🔳\",\r\n \"category\": \"symbols\"\r\n },\r\n \"speaker\": {\r\n \"keywords\": [\"sound\", \"volume\", \"silence\", \"broadcast\"],\r\n \"char\": \"🔈\",\r\n \"category\": \"symbols\"\r\n },\r\n \"sound\": {\r\n \"keywords\": [\"volume\", \"speaker\", \"broadcast\"],\r\n \"char\": \"🔉\",\r\n \"category\": \"symbols\"\r\n },\r\n \"loud_sound\": {\r\n \"keywords\": [\"volume\", \"noise\", \"noisy\", \"speaker\", \"broadcast\"],\r\n \"char\": \"🔊\",\r\n \"category\": \"symbols\"\r\n },\r\n \"mute\": {\r\n \"keywords\": [\"sound\", \"volume\", \"silence\", \"quiet\"],\r\n \"char\": \"🔇\",\r\n \"category\": \"symbols\"\r\n },\r\n \"mega\": {\r\n \"keywords\": [\"sound\", \"speaker\", \"volume\"],\r\n \"char\": \"📣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"loudspeaker\": {\r\n \"keywords\": [\"volume\", \"sound\"],\r\n \"char\": \"📢\",\r\n \"category\": \"symbols\"\r\n },\r\n \"bell\": {\r\n \"keywords\": [\"sound\", \"notification\", \"christmas\", \"xmas\", \"chime\"],\r\n \"char\": \"🔔\",\r\n \"category\": \"symbols\"\r\n },\r\n \"no_bell\": {\r\n \"keywords\": [\"sound\", \"volume\", \"mute\", \"quiet\", \"silent\"],\r\n \"char\": \"🔕\",\r\n \"category\": \"symbols\"\r\n },\r\n \"black_joker\": {\r\n \"keywords\": [\"poker\", \"cards\", \"game\", \"play\", \"magic\"],\r\n \"char\": \"🃏\",\r\n \"category\": \"symbols\"\r\n },\r\n \"mahjong\": {\r\n \"keywords\": [\"game\", \"play\", \"chinese\", \"kanji\"],\r\n \"char\": \"🀄\",\r\n \"category\": \"symbols\"\r\n },\r\n \"spades\": {\r\n \"keywords\": [\"poker\", \"cards\", \"suits\", \"magic\"],\r\n \"char\": \"♠️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clubs\": {\r\n \"keywords\": [\"poker\", \"cards\", \"magic\", \"suits\"],\r\n \"char\": \"♣️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"hearts\": {\r\n \"keywords\": [\"poker\", \"cards\", \"magic\", \"suits\"],\r\n \"char\": \"♥️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"diamonds\": {\r\n \"keywords\": [\"poker\", \"cards\", \"magic\", \"suits\"],\r\n \"char\": \"♦️\",\r\n \"category\": \"symbols\"\r\n },\r\n \"flower_playing_cards\": {\r\n \"keywords\": [\"game\", \"sunset\", \"red\"],\r\n \"char\": \"🎴\",\r\n \"category\": \"symbols\"\r\n },\r\n \"thought_balloon\": {\r\n \"keywords\": [\"bubble\", \"cloud\", \"speech\", \"thinking\"],\r\n \"char\": \"💭\",\r\n \"category\": \"symbols\"\r\n },\r\n \"right_anger_bubble\": {\r\n \"keywords\": [\"caption\", \"speech\", \"thinking\", \"mad\"],\r\n \"char\": \"🗯\",\r\n \"category\": \"symbols\"\r\n },\r\n \"speech_balloon\": {\r\n \"keywords\": [\"bubble\", \"words\", \"message\", \"talk\", \"chatting\"],\r\n \"char\": \"💬\",\r\n \"category\": \"symbols\"\r\n },\r\n \"left_speech_bubble\": {\r\n \"keywords\": [\"words\", \"message\", \"talk\", \"chatting\"],\r\n \"char\": \"🗨\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock1\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕐\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock2\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕑\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock3\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕒\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock4\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕓\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock5\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕔\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock6\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\", \"dawn\", \"dusk\"],\r\n \"char\": \"🕕\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock7\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕖\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock8\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕗\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock9\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕘\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock10\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕙\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock11\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕚\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock12\": {\r\n \"keywords\": [\"time\", \"noon\", \"midnight\", \"midday\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕛\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock130\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕜\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock230\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕝\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock330\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕞\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock430\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕟\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock530\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕠\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock630\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕡\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock730\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕢\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock830\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕣\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock930\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕤\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock1030\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕥\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock1130\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕦\",\r\n \"category\": \"symbols\"\r\n },\r\n \"clock1230\": {\r\n \"keywords\": [\"time\", \"late\", \"early\", \"schedule\"],\r\n \"char\": \"🕧\",\r\n \"category\": \"symbols\"\r\n },\r\n \"af\": {\r\n \"keywords\": [\"afghanistan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇫\",\r\n \"category\": \"flags\"\r\n },\r\n \"ax\": {\r\n \"keywords\": [\"Åland\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇽\",\r\n \"category\": \"flags\"\r\n },\r\n \"al\": {\r\n \"keywords\": [\"albania\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇱\",\r\n \"category\": \"flags\"\r\n },\r\n \"dz\": {\r\n \"keywords\": [\"algeria\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇩🇿\",\r\n \"category\": \"flags\"\r\n },\r\n \"as\": {\r\n \"keywords\": [\"american\", \"samoa\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"ad\": {\r\n \"keywords\": [\"andorra\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇩\",\r\n \"category\": \"flags\"\r\n },\r\n \"ao\": {\r\n \"keywords\": [\"angola\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"ai\": {\r\n \"keywords\": [\"anguilla\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇮\",\r\n \"category\": \"flags\"\r\n },\r\n \"aq\": {\r\n \"keywords\": [\"antarctica\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇶\",\r\n \"category\": \"flags\"\r\n },\r\n \"ag\": {\r\n \"keywords\": [\"antigua\", \"barbuda\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"ar\": {\r\n \"keywords\": [\"argentina\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"am\": {\r\n \"keywords\": [\"armenia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"aw\": {\r\n \"keywords\": [\"aruba\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇼\",\r\n \"category\": \"flags\"\r\n },\r\n \"au\": {\r\n \"keywords\": [\"australia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇺\",\r\n \"category\": \"flags\"\r\n },\r\n \"at\": {\r\n \"keywords\": [\"austria\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"az\": {\r\n \"keywords\": [\"azerbaijan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇿\",\r\n \"category\": \"flags\"\r\n },\r\n \"bs\": {\r\n \"keywords\": [\"bahamas\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"bh\": {\r\n \"keywords\": [\"bahrain\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇭\",\r\n \"category\": \"flags\"\r\n },\r\n \"bd\": {\r\n \"keywords\": [\"bangladesh\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇩\",\r\n \"category\": \"flags\"\r\n },\r\n \"bb\": {\r\n \"keywords\": [\"barbados\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇧\",\r\n \"category\": \"flags\"\r\n },\r\n \"by\": {\r\n \"keywords\": [\"belarus\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇾\",\r\n \"category\": \"flags\"\r\n },\r\n \"be\": {\r\n \"keywords\": [\"belgium\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"bz\": {\r\n \"keywords\": [\"belize\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇿\",\r\n \"category\": \"flags\"\r\n },\r\n \"bj\": {\r\n \"keywords\": [\"benin\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇯\",\r\n \"category\": \"flags\"\r\n },\r\n \"bm\": {\r\n \"keywords\": [\"bermuda\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"bt\": {\r\n \"keywords\": [\"bhutan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"bo\": {\r\n \"keywords\": [\"bolivia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"bq\": {\r\n \"keywords\": [\"bonaire\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇶\",\r\n \"category\": \"flags\"\r\n },\r\n \"ba\": {\r\n \"keywords\": [\"bosnia\", \"herzegovina\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"bw\": {\r\n \"keywords\": [\"botswana\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇼\",\r\n \"category\": \"flags\"\r\n },\r\n \"br\": {\r\n \"keywords\": [\"brazil\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"io\": {\r\n \"keywords\": [\"british\", \"indian\", \"ocean\", \"territory\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"vg\": {\r\n \"keywords\": [\"british\", \"virgin\", \"islands\", \"bvi\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇻🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"bn\": {\r\n \"keywords\": [\"brunei\", \"darussalam\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"bg\": {\r\n \"keywords\": [\"bulgaria\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"bf\": {\r\n \"keywords\": [\"burkina\", \"faso\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇫\",\r\n \"category\": \"flags\"\r\n },\r\n \"bi\": {\r\n \"keywords\": [\"burundi\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇮\",\r\n \"category\": \"flags\"\r\n },\r\n \"cv\": {\r\n \"keywords\": [\"cabo\", \"verde\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇻\",\r\n \"category\": \"flags\"\r\n },\r\n \"kh\": {\r\n \"keywords\": [\"cambodia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇭\",\r\n \"category\": \"flags\"\r\n },\r\n \"cm\": {\r\n \"keywords\": [\"cameroon\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"ca\": {\r\n \"keywords\": [\"canada\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"ic\": {\r\n \"keywords\": [\"canary\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇨\",\r\n \"category\": \"flags\"\r\n },\r\n \"ky\": {\r\n \"keywords\": [\"cayman\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇾\",\r\n \"category\": \"flags\"\r\n },\r\n \"cf\": {\r\n \"keywords\": [\"central\", \"african\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇫\",\r\n \"category\": \"flags\"\r\n },\r\n \"td\": {\r\n \"keywords\": [\"chad\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇩\",\r\n \"category\": \"flags\"\r\n },\r\n \"chile\": {\r\n \"keywords\": [\"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇱\",\r\n \"category\": \"flags\"\r\n },\r\n \"cn\": {\r\n \"keywords\": [\"china\", \"chinese\", \"prc\", \"flag\", \"country\", \"nation\", \"banner\"],\r\n \"char\": \"🇨🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"cx\": {\r\n \"keywords\": [\"christmas\", \"island\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇽\",\r\n \"category\": \"flags\"\r\n },\r\n \"cc\": {\r\n \"keywords\": [\"cocos\", \"keeling\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇨\",\r\n \"category\": \"flags\"\r\n },\r\n \"co\": {\r\n \"keywords\": [\"colombia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"km\": {\r\n \"keywords\": [\"comoros\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"cg\": {\r\n \"keywords\": [\"congo\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"drc\": {\r\n \"keywords\": [\"congo\", \"democratic\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇩\",\r\n \"category\": \"flags\"\r\n },\r\n \"ck\": {\r\n \"keywords\": [\"cook\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇰\",\r\n \"category\": \"flags\"\r\n },\r\n \"cr\": {\r\n \"keywords\": [\"costa\", \"rica\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"hr\": {\r\n \"keywords\": [\"croatia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇭🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"cu\": {\r\n \"keywords\": [\"cuba\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇺\",\r\n \"category\": \"flags\"\r\n },\r\n \"cw\": {\r\n \"keywords\": [\"curaçao\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇼\",\r\n \"category\": \"flags\"\r\n },\r\n \"cy\": {\r\n \"keywords\": [\"cyprus\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇾\",\r\n \"category\": \"flags\"\r\n },\r\n \"cz\": {\r\n \"keywords\": [\"czech_republic\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇿\",\r\n \"category\": \"flags\"\r\n },\r\n \"dk\": {\r\n \"keywords\": [\"denmark\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇩🇰\",\r\n \"category\": \"flags\"\r\n },\r\n \"dj\": {\r\n \"keywords\": [\"djibouti\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇩🇯\",\r\n \"category\": \"flags\"\r\n },\r\n \"dm\": {\r\n \"keywords\": [\"dominica\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇩🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"do\": {\r\n \"keywords\": [\"dominican\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇩🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"ec\": {\r\n \"keywords\": [\"ecuador\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇪🇨\",\r\n \"category\": \"flags\"\r\n },\r\n \"eg\": {\r\n \"keywords\": [\"egypt\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇪🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"sv\": {\r\n \"keywords\": [\"el\", \"salvador\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇻\",\r\n \"category\": \"flags\"\r\n },\r\n \"gq\": {\r\n \"keywords\": [\"equatorial\", \"guinea\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇶\",\r\n \"category\": \"flags\"\r\n },\r\n \"er\": {\r\n \"keywords\": [\"eritrea\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇪🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"ee\": {\r\n \"keywords\": [\"estonia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇪🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"et\": {\r\n \"keywords\": [\"ethiopia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇪🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"eu\": {\r\n \"keywords\": [\"european\", \"union\", \"flag\", \"banner\"],\r\n \"char\": \"🇪🇺\",\r\n \"category\": \"flags\"\r\n },\r\n \"fk\": {\r\n \"keywords\": [\"falkland\", \"islands\", \"malvinas\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇫🇰\",\r\n \"category\": \"flags\"\r\n },\r\n \"fo\": {\r\n \"keywords\": [\"faroe\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇫🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"fj\": {\r\n \"keywords\": [\"fiji\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇫🇯\",\r\n \"category\": \"flags\"\r\n },\r\n \"fi\": {\r\n \"keywords\": [\"finland\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇫🇮\",\r\n \"category\": \"flags\"\r\n },\r\n \"fr\": {\r\n \"keywords\": [\"banner\", \"flag\", \"nation\", \"france\", \"french\", \"country\"],\r\n \"char\": \"🇫🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"gf\": {\r\n \"keywords\": [\"french\", \"guiana\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇫\",\r\n \"category\": \"flags\"\r\n },\r\n \"pf\": {\r\n \"keywords\": [\"french\", \"polynesia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇫\",\r\n \"category\": \"flags\"\r\n },\r\n \"tf\": {\r\n \"keywords\": [\"french\", \"southern\", \"territories\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇫\",\r\n \"category\": \"flags\"\r\n },\r\n \"ga\": {\r\n \"keywords\": [\"gabon\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"gm\": {\r\n \"keywords\": [\"gambia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"ge\": {\r\n \"keywords\": [\"georgia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"de\": {\r\n \"keywords\": [\"german\", \"nation\", \"flag\", \"country\", \"banner\"],\r\n \"char\": \"🇩🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"gh\": {\r\n \"keywords\": [\"ghana\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇭\",\r\n \"category\": \"flags\"\r\n },\r\n \"gi\": {\r\n \"keywords\": [\"gibraltar\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇮\",\r\n \"category\": \"flags\"\r\n },\r\n \"gr\": {\r\n \"keywords\": [\"greece\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"gl\": {\r\n \"keywords\": [\"greenland\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇱\",\r\n \"category\": \"flags\"\r\n },\r\n \"gd\": {\r\n \"keywords\": [\"grenada\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇩\",\r\n \"category\": \"flags\"\r\n },\r\n \"gp\": {\r\n \"keywords\": [\"guadeloupe\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇵\",\r\n \"category\": \"flags\"\r\n },\r\n \"gu\": {\r\n \"keywords\": [\"guam\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇺\",\r\n \"category\": \"flags\"\r\n },\r\n \"gt\": {\r\n \"keywords\": [\"guatemala\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"gg\": {\r\n \"keywords\": [\"guernsey\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"gn\": {\r\n \"keywords\": [\"guinea\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"gw\": {\r\n \"keywords\": [\"guinea\", \"bissau\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇼\",\r\n \"category\": \"flags\"\r\n },\r\n \"gy\": {\r\n \"keywords\": [\"guyana\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇾\",\r\n \"category\": \"flags\"\r\n },\r\n \"ht\": {\r\n \"keywords\": [\"haiti\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇭🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"hn\": {\r\n \"keywords\": [\"honduras\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇭🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"hk\": {\r\n \"keywords\": [\"hong\", \"kong\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇭🇰\",\r\n \"category\": \"flags\"\r\n },\r\n \"hu\": {\r\n \"keywords\": [\"hungary\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇭🇺\",\r\n \"category\": \"flags\"\r\n },\r\n \"is\": {\r\n \"keywords\": [\"iceland\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"in\": {\r\n \"keywords\": [\"india\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"indonesia\": {\r\n \"keywords\": [\"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇩\",\r\n \"category\": \"flags\"\r\n },\r\n \"ir\": {\r\n \"keywords\": [\"iran,\", \"islamic\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"iq\": {\r\n \"keywords\": [\"iraq\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇶\",\r\n \"category\": \"flags\"\r\n },\r\n \"ie\": {\r\n \"keywords\": [\"ireland\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"im\": {\r\n \"keywords\": [\"isle\", \"man\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"il\": {\r\n \"keywords\": [\"israel\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇱\",\r\n \"category\": \"flags\"\r\n },\r\n \"it\": {\r\n \"keywords\": [\"italy\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇮🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"ci\": {\r\n \"keywords\": [\"ivory\", \"coast\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇮\",\r\n \"category\": \"flags\"\r\n },\r\n \"jm\": {\r\n \"keywords\": [\"jamaica\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇯🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"jp\": {\r\n \"keywords\": [\"japanese\", \"nation\", \"flag\", \"country\", \"banner\"],\r\n \"char\": \"🇯🇵\",\r\n \"category\": \"flags\"\r\n },\r\n \"je\": {\r\n \"keywords\": [\"jersey\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇯🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"jo\": {\r\n \"keywords\": [\"jordan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇯🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"kz\": {\r\n \"keywords\": [\"kazakhstan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇿\",\r\n \"category\": \"flags\"\r\n },\r\n \"ke\": {\r\n \"keywords\": [\"kenya\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"ki\": {\r\n \"keywords\": [\"kiribati\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇮\",\r\n \"category\": \"flags\"\r\n },\r\n \"xk\": {\r\n \"keywords\": [\"kosovo\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇽🇰\",\r\n \"category\": \"flags\"\r\n },\r\n \"kw\": {\r\n \"keywords\": [\"kuwait\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇼\",\r\n \"category\": \"flags\"\r\n },\r\n \"kg\": {\r\n \"keywords\": [\"kyrgyzstan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"la\": {\r\n \"keywords\": [\"lao\", \"democratic\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"lv\": {\r\n \"keywords\": [\"latvia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇻\",\r\n \"category\": \"flags\"\r\n },\r\n \"lb\": {\r\n \"keywords\": [\"lebanon\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇧\",\r\n \"category\": \"flags\"\r\n },\r\n \"ls\": {\r\n \"keywords\": [\"lesotho\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"lr\": {\r\n \"keywords\": [\"liberia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"ly\": {\r\n \"keywords\": [\"libya\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇾\",\r\n \"category\": \"flags\"\r\n },\r\n \"li\": {\r\n \"keywords\": [\"liechtenstein\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇮\",\r\n \"category\": \"flags\"\r\n },\r\n \"lt\": {\r\n \"keywords\": [\"lithuania\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"lu\": {\r\n \"keywords\": [\"luxembourg\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇺\",\r\n \"category\": \"flags\"\r\n },\r\n \"mo\": {\r\n \"keywords\": [\"macao\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"mk\": {\r\n \"keywords\": [\"macedonia,\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇰\",\r\n \"category\": \"flags\"\r\n },\r\n \"mg\": {\r\n \"keywords\": [\"madagascar\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"mw\": {\r\n \"keywords\": [\"malawi\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇼\",\r\n \"category\": \"flags\"\r\n },\r\n \"my\": {\r\n \"keywords\": [\"malaysia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇾\",\r\n \"category\": \"flags\"\r\n },\r\n \"mv\": {\r\n \"keywords\": [\"maldives\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇻\",\r\n \"category\": \"flags\"\r\n },\r\n \"ml\": {\r\n \"keywords\": [\"mali\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇱\",\r\n \"category\": \"flags\"\r\n },\r\n \"mt\": {\r\n \"keywords\": [\"malta\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"mh\": {\r\n \"keywords\": [\"marshall\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇭\",\r\n \"category\": \"flags\"\r\n },\r\n \"mq\": {\r\n \"keywords\": [\"martinique\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇶\",\r\n \"category\": \"flags\"\r\n },\r\n \"mr\": {\r\n \"keywords\": [\"mauritania\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"mu\": {\r\n \"keywords\": [\"mauritius\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇺\",\r\n \"category\": \"flags\"\r\n },\r\n \"yt\": {\r\n \"keywords\": [\"mayotte\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇾🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"mx\": {\r\n \"keywords\": [\"mexico\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇽\",\r\n \"category\": \"flags\"\r\n },\r\n \"fm\": {\r\n \"keywords\": [\"micronesia,\", \"federated\", \"states\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇫🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"md\": {\r\n \"keywords\": [\"moldova,\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇩\",\r\n \"category\": \"flags\"\r\n },\r\n \"mc\": {\r\n \"keywords\": [\"monaco\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇨\",\r\n \"category\": \"flags\"\r\n },\r\n \"mn\": {\r\n \"keywords\": [\"mongolia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"me\": {\r\n \"keywords\": [\"montenegro\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"ms\": {\r\n \"keywords\": [\"montserrat\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"ma\": {\r\n \"keywords\": [\"morocco\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"mz\": {\r\n \"keywords\": [\"mozambique\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇿\",\r\n \"category\": \"flags\"\r\n },\r\n \"mm\": {\r\n \"keywords\": [\"myanmar\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"na\": {\r\n \"keywords\": [\"namibia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"nr\": {\r\n \"keywords\": [\"nauru\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"np\": {\r\n \"keywords\": [\"nepal\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇵\",\r\n \"category\": \"flags\"\r\n },\r\n \"nl\": {\r\n \"keywords\": [\"netherlands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇱\",\r\n \"category\": \"flags\"\r\n },\r\n \"nc\": {\r\n \"keywords\": [\"new\", \"caledonia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇨\",\r\n \"category\": \"flags\"\r\n },\r\n \"nz\": {\r\n \"keywords\": [\"new\", \"zealand\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇿\",\r\n \"category\": \"flags\"\r\n },\r\n \"ni\": {\r\n \"keywords\": [\"nicaragua\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇮\",\r\n \"category\": \"flags\"\r\n },\r\n \"ne\": {\r\n \"keywords\": [\"niger\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"nigeria\": {\r\n \"keywords\": [\"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"nu\": {\r\n \"keywords\": [\"niue\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇺\",\r\n \"category\": \"flags\"\r\n },\r\n \"nf\": {\r\n \"keywords\": [\"norfolk\", \"island\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇫\",\r\n \"category\": \"flags\"\r\n },\r\n \"mp\": {\r\n \"keywords\": [\"northern\", \"mariana\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇲🇵\",\r\n \"category\": \"flags\"\r\n },\r\n \"kp\": {\r\n \"keywords\": [\"north\", \"korea\", \"nation\", \"flag\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇵\",\r\n \"category\": \"flags\"\r\n },\r\n \"no\": {\r\n \"keywords\": [\"norway\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇳🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"om\": {\r\n \"keywords\": [\"oman\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇴🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"pk\": {\r\n \"keywords\": [\"pakistan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇰\",\r\n \"category\": \"flags\"\r\n },\r\n \"pw\": {\r\n \"keywords\": [\"palau\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇼\",\r\n \"category\": \"flags\"\r\n },\r\n \"ps\": {\r\n \"keywords\": [\"palestine\", \"palestinian\", \"territories\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"pa\": {\r\n \"keywords\": [\"panama\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"pg\": {\r\n \"keywords\": [\"papua\", \"new\", \"guinea\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"py\": {\r\n \"keywords\": [\"paraguay\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇾\",\r\n \"category\": \"flags\"\r\n },\r\n \"pe\": {\r\n \"keywords\": [\"peru\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"ph\": {\r\n \"keywords\": [\"philippines\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇭\",\r\n \"category\": \"flags\"\r\n },\r\n \"pn\": {\r\n \"keywords\": [\"pitcairn\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"pl\": {\r\n \"keywords\": [\"poland\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇱\",\r\n \"category\": \"flags\"\r\n },\r\n \"pt\": {\r\n \"keywords\": [\"portugal\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"pr\": {\r\n \"keywords\": [\"puerto\", \"rico\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"qa\": {\r\n \"keywords\": [\"qatar\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇶🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"re\": {\r\n \"keywords\": [\"réunion\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇷🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"ro\": {\r\n \"keywords\": [\"romania\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇷🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"ru\": {\r\n \"keywords\": [\"russian\", \"federation\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇷🇺\",\r\n \"category\": \"flags\"\r\n },\r\n \"rw\": {\r\n \"keywords\": [\"rwanda\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇷🇼\",\r\n \"category\": \"flags\"\r\n },\r\n \"bl\": {\r\n \"keywords\": [\"saint\", \"barthélemy\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇧🇱\",\r\n \"category\": \"flags\"\r\n },\r\n \"sh\": {\r\n \"keywords\": [\"saint\", \"helena\", \"ascension\", \"tristan\", \"cunha\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇭\",\r\n \"category\": \"flags\"\r\n },\r\n \"kn\": {\r\n \"keywords\": [\"saint\", \"kitts\", \"nevis\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"lc\": {\r\n \"keywords\": [\"saint\", \"lucia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇨\",\r\n \"category\": \"flags\"\r\n },\r\n \"pm\": {\r\n \"keywords\": [\"saint\", \"pierre\", \"miquelon\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇵🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"vc\": {\r\n \"keywords\": [\"saint\", \"vincent\", \"grenadines\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇻🇨\",\r\n \"category\": \"flags\"\r\n },\r\n \"ws\": {\r\n \"keywords\": [\"samoa\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇼🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"sm\": {\r\n \"keywords\": [\"san\", \"marino\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"st\": {\r\n \"keywords\": [\"sao\", \"tome\", \"principe\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"saudi_arabia\": {\r\n \"keywords\": [\"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"sn\": {\r\n \"keywords\": [\"senegal\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"rs\": {\r\n \"keywords\": [\"serbia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇷🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"sc\": {\r\n \"keywords\": [\"seychelles\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇨\",\r\n \"category\": \"flags\"\r\n },\r\n \"sl\": {\r\n \"keywords\": [\"sierra\", \"leone\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇱\",\r\n \"category\": \"flags\"\r\n },\r\n \"sg\": {\r\n \"keywords\": [\"singapore\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"sx\": {\r\n \"keywords\": [\"sint\", \"maarten\", \"dutch\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇽\",\r\n \"category\": \"flags\"\r\n },\r\n \"sk\": {\r\n \"keywords\": [\"slovakia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇰\",\r\n \"category\": \"flags\"\r\n },\r\n \"si\": {\r\n \"keywords\": [\"slovenia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇮\",\r\n \"category\": \"flags\"\r\n },\r\n \"sb\": {\r\n \"keywords\": [\"solomon\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇧\",\r\n \"category\": \"flags\"\r\n },\r\n \"so\": {\r\n \"keywords\": [\"somalia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"za\": {\r\n \"keywords\": [\"south\", \"africa\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇿🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"gs\": {\r\n \"keywords\": [\"south\", \"georgia\", \"sandwich\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇬🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"kr\": {\r\n \"keywords\": [\"south\", \"korea\", \"nation\", \"flag\", \"country\", \"banner\"],\r\n \"char\": \"🇰🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"ss\": {\r\n \"keywords\": [\"south\", \"sudan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"es\": {\r\n \"keywords\": [\"spain\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇪🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"lk\": {\r\n \"keywords\": [\"sri\", \"lanka\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇱🇰\",\r\n \"category\": \"flags\"\r\n },\r\n \"sd\": {\r\n \"keywords\": [\"sudan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇩\",\r\n \"category\": \"flags\"\r\n },\r\n \"sr\": {\r\n \"keywords\": [\"suriname\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"sz\": {\r\n \"keywords\": [\"swaziland\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇿\",\r\n \"category\": \"flags\"\r\n },\r\n \"se\": {\r\n \"keywords\": [\"sweden\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"ch\": {\r\n \"keywords\": [\"switzerland\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇨🇭\",\r\n \"category\": \"flags\"\r\n },\r\n \"sy\": {\r\n \"keywords\": [\"syrian\", \"arab\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇸🇾\",\r\n \"category\": \"flags\"\r\n },\r\n \"tw\": {\r\n \"keywords\": [\"taiwan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇼\",\r\n \"category\": \"flags\"\r\n },\r\n \"tj\": {\r\n \"keywords\": [\"tajikistan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇯\",\r\n \"category\": \"flags\"\r\n },\r\n \"tz\": {\r\n \"keywords\": [\"tanzania,\", \"united\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇿\",\r\n \"category\": \"flags\"\r\n },\r\n \"th\": {\r\n \"keywords\": [\"thailand\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇭\",\r\n \"category\": \"flags\"\r\n },\r\n \"tl\": {\r\n \"keywords\": [\"timor\", \"leste\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇱\",\r\n \"category\": \"flags\"\r\n },\r\n \"tg\": {\r\n \"keywords\": [\"togo\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"tk\": {\r\n \"keywords\": [\"tokelau\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇰\",\r\n \"category\": \"flags\"\r\n },\r\n \"to\": {\r\n \"keywords\": [\"tonga\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇴\",\r\n \"category\": \"flags\"\r\n },\r\n \"tt\": {\r\n \"keywords\": [\"trinidad\", \"tobago\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇹\",\r\n \"category\": \"flags\"\r\n },\r\n \"tn\": {\r\n \"keywords\": [\"tunisia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"tr\": {\r\n \"keywords\": [\"turkey\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇷\",\r\n \"category\": \"flags\"\r\n },\r\n \"turkmenistan\": {\r\n \"keywords\": [\"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"tc\": {\r\n \"keywords\": [\"turks\", \"caicos\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇨\",\r\n \"category\": \"flags\"\r\n },\r\n \"tuvalu\": {\r\n \"keywords\": [\"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇹🇻\",\r\n \"category\": \"flags\"\r\n },\r\n \"ug\": {\r\n \"keywords\": [\"uganda\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇺🇬\",\r\n \"category\": \"flags\"\r\n },\r\n \"ua\": {\r\n \"keywords\": [\"ukraine\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇺🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"ae\": {\r\n \"keywords\": [\"united\", \"arab\", \"emirates\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇦🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"gb\": {\r\n \"keywords\": [\"united\", \"kingdom\", \"great\", \"britain\", \"northern\", \"ireland\", \"flag\", \"nation\", \"country\", \"banner\", \"british\", \"UK\", \"english\", \"england\", \"union jack\"],\r\n \"char\": \"🇬🇧\",\r\n \"category\": \"flags\"\r\n },\r\n \"us\": {\r\n \"keywords\": [\"united\", \"states\", \"america\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇺🇸\",\r\n \"category\": \"flags\"\r\n },\r\n \"vi\": {\r\n \"keywords\": [\"virgin\", \"islands\", \"us\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇻🇮\",\r\n \"category\": \"flags\"\r\n },\r\n \"uy\": {\r\n \"keywords\": [\"uruguay\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇺🇾\",\r\n \"category\": \"flags\"\r\n },\r\n \"uz\": {\r\n \"keywords\": [\"uzbekistan\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇺🇿\",\r\n \"category\": \"flags\"\r\n },\r\n \"vu\": {\r\n \"keywords\": [\"vanuatu\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇻🇺\",\r\n \"category\": \"flags\"\r\n },\r\n \"va\": {\r\n \"keywords\": [\"vatican\", \"city\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇻🇦\",\r\n \"category\": \"flags\"\r\n },\r\n \"ve\": {\r\n \"keywords\": [\"venezuela\", \"bolivarian\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇻🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"vn\": {\r\n \"keywords\": [\"viet\", \"nam\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇻🇳\",\r\n \"category\": \"flags\"\r\n },\r\n \"wf\": {\r\n \"keywords\": [\"wallis\", \"futuna\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇼🇫\",\r\n \"category\": \"flags\"\r\n },\r\n \"eh\": {\r\n \"keywords\": [\"western\", \"sahara\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇪🇭\",\r\n \"category\": \"flags\"\r\n },\r\n \"ye\": {\r\n \"keywords\": [\"yemen\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇾🇪\",\r\n \"category\": \"flags\"\r\n },\r\n \"zm\": {\r\n \"keywords\": [\"zambia\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇿🇲\",\r\n \"category\": \"flags\"\r\n },\r\n \"zw\": {\r\n \"keywords\": [\"zimbabwe\", \"flag\", \"nation\", \"country\", \"banner\"],\r\n \"char\": \"🇿🇼\",\r\n \"category\": \"flags\"\r\n },\r\n \"octocat\": {\r\n \"keywords\": [\"animal\", \"octopus\", \"github\", \"custom_\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"shipit\": {\r\n \"keywords\": [\"squirrel\", \"detective\", \"animal\", \"sherlock\", \"inspector\", \"custom_\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"bowtie\": {\r\n \"keywords\": [\"face\", \"formal\", \"fashion\", \"suit\", \"classy\", \"magic\", \"circus\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"neckbeard\": {\r\n \"keywords\": [\"nerdy\", \"face\", \"custom_\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"metal\": {\r\n \"keywords\": [\"fingers\", \"rocknroll\", \"concert\", \"band\", \"custom_\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"fu\": {\r\n \"keywords\": [\"fuck\", \"finger\", \"dislike\", \"thumbsdown\", \"disapprove\", \"no\", \"custom_\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"trollface\": {\r\n \"keywords\": [\"internet\", \"meme\", \"custom_\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"godmode\": {\r\n \"keywords\": [\"doom\", \"oldschool\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"goberserk\": {\r\n \"keywords\": [\"doom\", \"rage\", \"bloody\", \"hurt\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"finnadie\": {\r\n \"keywords\": [\"doom\", \"oldschool\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"feelsgood\": {\r\n \"keywords\": [\"doom\", \"oldschool\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"rage1\": {\r\n \"keywords\": [\"angry\", \"mad\", \"hate\", \"despise\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"rage2\": {\r\n \"keywords\": [\"angry\", \"mad\", \"hate\", \"despise\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"rage3\": {\r\n \"keywords\": [\"angry\", \"mad\", \"hate\", \"despise\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"rage4\": {\r\n \"keywords\": [\"angry\", \"mad\", \"hate\", \"despise\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"suspect\": {\r\n \"keywords\": [\"mad\", \"custom_\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n },\r\n \"hurtrealbad\": {\r\n \"keywords\": [\"mad\", \"injured\", \"doom\", \"oldschool\", \"custom_\"],\r\n \"char\": null,\r\n \"category\": \"_custom\"\r\n }\r\n}","declare var twemoji: {\r\n parse(str: string, options?: { folder: string, ext: string }): string;\r\n}\r\n\r\nimport { Component, OnInit, Output } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { Subject } from 'rxjs';\r\n\r\ninterface Emoji {\r\n\tkeywords : string[];\r\n\tchar : string;\r\n\thtml? : SafeHtml;\r\n\tcategory : string;\r\n}\r\n\r\nimport { EMOJIS } from '../emojis';\r\n\r\n@Component({\r\n\tselector: 'emoji-selector-panel',\r\n\ttemplateUrl: './emoji-selector-panel.component.html',\r\n\tstyleUrls: ['./emoji-selector-panel.component.scss']\r\n})\r\nexport class EmojiSelectorPanelComponent implements OnInit {\r\n\r\n\tconstructor(\r\n\t\tprivate sanitizer : DomSanitizer\r\n\t) { }\r\n\r\n\tcategories : any[];\r\n\tactiveCategory : string = 'people';\r\n\tsearchResults : any[] = [];\r\n searchVisible = false;\r\n\t\r\n\t@Output()\r\n\tprivate selected : Subject<string> = new Subject();\r\n\r\n\tprivate _searchQuery : string;\r\n\r\n\tget searchQuery() {\r\n\t\treturn this._searchQuery;\r\n\t}\r\n\r\n\tset searchQuery(value) {\r\n\t\tthis._searchQuery = value;\r\n\t\tsetTimeout(() => {\r\n\t\t\tthis.searchResults = Object.keys(EMOJIS).filter(k => k.includes(value)).map(k => EMOJIS[k]);\r\n\t\t\tthis.searchResults.splice(50, this.searchResults.length);\r\n\t\t\tconsole.log(`looking for '${value}' => ${this.searchResults.length} results`);\r\n\t\t});\r\n\t}\r\n\r\n\thumanize(str : string) {\r\n\t\treturn str.replace(/(^| )[a-z]/g, k => k.toUpperCase()).replace(/_/g, ' ');\r\n\t}\r\n\r\n\tselect(char : string) {\r\n\t\tthis.selected.next(char);\r\n\t}\r\n\r\n\tpairs(object) {\r\n\t\treturn Object.keys(object).map(key => [key, object[key]]);\r\n\t}\r\n\r\n\thideSearch() {\r\n\t\t// because of the \"outside click detection\"\r\n setTimeout(() => {\r\n this.searchVisible = false;\r\n });\r\n\t}\r\n\t\r\n showSearch() {\r\n\t\t// because of the \"outside click detection\"\r\n setTimeout(() => {\r\n this.searchVisible = true;\r\n });\r\n }\r\n\r\n\tngOnInit() {\r\n\r\n\t\tlet cats = {};\r\n\t\tlet categoryIcons = {\r\n\t\t\tsymbols: 'warning',\r\n\t\t\tpeople: 'people',\r\n\t\t\tanimals_and_nature: 'nature',\r\n\t\t\ttravel_and_places: 'location_on',\r\n\t\t\tactivity: 'local_activity',\r\n\t\t\tfood_and_drink: 'restaurant',\r\n\t\t\tobjects: 'computer',\r\n\t\t\tflags: 'flag'\r\n\t\t};\r\n\t\tfor (let pair of this.pairs(EMOJIS)) {\r\n\t\t\tlet name = pair[0];\r\n\t\t\tlet emoji : Emoji = pair[1];\r\n\r\n\t\t\tif (!cats[emoji.category]) {\r\n\t\t\t\tcats[emoji.category] = {\r\n\t\t\t\t\tname: emoji.category,\r\n\t\t\t\t\ticon: categoryIcons[emoji.category] || 'code',\r\n\t\t\t\t\temojis: []\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\temoji.html = this.sanitizer.bypassSecurityTrustHtml(twemoji.parse(emoji.char || ''));\r\n\r\n\t\t\tcats[emoji.category].emojis.push(emoji);\r\n\t\t}\r\n\r\n\t\tthis.categories = this.pairs(cats).map(pair => pair[1]);\r\n\t}\r\n\r\n}\r\n","/// <reference types=\"@types/resize-observer-browser\" />\r\n\r\nimport { FlexibleConnectedPositionStrategy, Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { ComponentPortal, TemplatePortal } from '@angular/cdk/portal';\r\nimport { Component, ElementRef, HostBinding, Output, ViewChild, Input } from '@angular/core';\r\nimport { Subject, Observable } from 'rxjs';\r\nimport { EmojiSelectorPanelComponent } from './emoji-selector-panel/emoji-selector-panel.component';\r\n\r\n@Component({\r\n selector: 'emoji-selector-button',\r\n template: `\r\n <button #button type=\"button\" mat-icon-button (click)=\"show()\">\r\n <mat-icon>emoji_emotions</mat-icon>\r\n </button>\r\n <ng-template cdkPortal #selectorPanelTemplate=\"cdkPortal\">\r\n <emoji-selector-panel \r\n #panel\r\n (selected)=\"insert($event)\"\r\n ></emoji-selector-panel>\r\n </ng-template>\r\n `,\r\n styles: [`\r\n :host {\r\n display: block;\r\n position: relative;\r\n }\r\n\r\n button {\r\n color: #666\r\n }\r\n `]\r\n})\r\nexport class EmojiSelectorButtonComponent {\r\n constructor(\r\n private elementRef: ElementRef<HTMLElement>,\r\n private overlay: Overlay\r\n ) {\r\n }\r\n\r\n @ViewChild('selectorPanelTemplate') selectorPanelTemplate: TemplatePortal<any>;\r\n\r\n private _selected = new Subject<string>();\r\n showEmojiPanel = false;\r\n\r\n @Output()\r\n get selected() : Observable<string> {\r\n return this._selected;\r\n }\r\n\r\n private overlayRef: OverlayRef;\r\n\r\n get isOpen() {\r\n return this.overlayRef;\r\n }\r\n\r\n /**\r\n * Insert the given emoji.\r\n * @param str \r\n */\r\n insert(str) {\r\n this._selected.next(str);\r\n this.close();\r\n }\r\n\r\n close() {\r\n if (this.overlayRef) {\r\n this.overlayRef.dispose();\r\n this.overlayRef = null;\r\n }\r\n }\r\n\r\n @Input() overlayX: 'start' | 'center' | 'end' = 'end';\r\n @Input() overlayY: 'top' | 'center' | 'bottom' = 'top';\r\n @Input() originX: 'start' | 'center' | 'end' = 'end';\r\n @Input() originY: 'top' | 'center' | 'bottom' = 'bottom';\r\n\r\n show() {\r\n if (this.isOpen) {\r\n this.close();\r\n }\r\n\r\n this.overlayRef = this.overlay.create({\r\n positionStrategy: this.overlay.position()\r\n .flexibleConnectedTo(this.elementRef)\r\n .withPositions([\r\n { \r\n originX: this.originX, \r\n originY: this.originY,\r\n overlayX: this.overlayX,\r\n overlayY: this.overlayY\r\n }\r\n ])\r\n .withFlexibleDimensions(true),\r\n hasBackdrop: true,\r\n disposeOnNavigation: true,\r\n scrollStrategy: this.overlay.scrollStrategies.reposition({\r\n autoClose: true\r\n })\r\n });\r\n\r\n this.overlayRef.backdropClick().subscribe(() => {\r\n this.close();\r\n })\r\n\r\n this.overlayRef.keydownEvents().subscribe(event => {\r\n if (event.key === 'Escape') {\r\n this.close();\r\n }\r\n });\r\n this.overlayRef.attach(this.selectorPanelTemplate);\r\n }\r\n}","import { NgModule } from '@angular/core';\r\nimport { EmojiSelectorPanelComponent } from './emoji-selector-panel/emoji-selector-panel.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { EmojiSelectorButtonComponent } from './emoji-selector-button.component';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport { PortalModule } from '@angular/cdk/portal';\r\n\r\nconst COMPONENTS = [\r\n EmojiSelectorPanelComponent,\r\n EmojiSelectorButtonComponent\r\n];\r\n\r\n@NgModule({\r\n declarations: COMPONENTS,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n OverlayModule,\r\n PortalModule\r\n ],\r\n exports: COMPONENTS\r\n})\r\nexport class EmojiModule {\r\n\r\n}","import { BehaviorSubject, Observable } from 'rxjs';\r\nimport { ChatMessage, Vote, CommentsOrder, Notification, User, UrlCard } from '@banta/common';\r\nimport { ChatSourceBase } from './chat-source-base';\r\nimport { AttachmentResolver, AttachmentScraper } from './attachment-scraper';\r\n\r\nexport interface ChatSourceOptions {\r\n sortOrder: CommentsOrder;\r\n}\r\n\r\nexport abstract class ChatBackendBase {\r\n constructor() {\r\n }\r\n \r\n abstract getSourceForTopic(topicId : string, options?: ChatSourceOptions) : Promise<ChatSourceBase>;\r\n abstract getSourceForThread(topicId : string, messageId : string, options?: ChatSourceOptions) : Promise<ChatSourceBase>;\r\n abstract getSourceCountForTopic(topicId: string): Promise<number>\r\n abstract refreshMessage(message : ChatMessage): Promise<ChatMessage>;\r\n abstract getMessage(topicId : string, messageId : string): Promise<ChatMessage>;\r\n abstract getSubMessage(topicId : string, parentMessageId : string, messageId : string): Promise<ChatMessage>;\r\n abstract watchMessage(message : ChatMessage, handler : (message : ChatMessage) => void) : () => void;\r\n abstract getCardForUrl(url: string): Promise<UrlCard>;\r\n readonly notificationsChanged : Observable<Notification[]>;\r\n readonly newNotification : Observable<Notification>;\r\n \r\n private _userChanged = new BehaviorSubject<User>(null);\r\n private _user : User;\r\n \r\n get userChanged() : Observable<User> {\r\n return this._userChanged;\r\n }\r\n \r\n set user(user : User) {\r\n this._user = user;\r\n this._userChanged.next(user);\r\n }\r\n\r\n get user() {\r\n return this._user;\r\n }\r\n \r\n private _attachmentScrapers: AttachmentScraper[] = [];\r\n private _attachmentResolvers: AttachmentResolver[] = [];\r\n\r\n registerAttachmentScraper(scraper: AttachmentScraper) {\r\n this._attachmentScrapers.push(scraper);\r\n }\r\n\r\n registerAttachmentResolver(resolver: AttachmentResolver) {\r\n this._attachmentResolvers.push(resolver);\r\n }\r\n\r\n get attachmentScrapers() {\r\n return this._attachmentScrapers.slice();\r\n }\r\n\r\n get attachmentResolvers() {\r\n return this._attachmentResolvers.slice();\r\n }\r\n}","import { Component, Input, ViewChild, HostBinding } from \"@angular/core\";\r\nimport { NewMessageForm, ChatMessage, User, Notification } from '@banta/common';\r\nimport { Subject, Observable, Subscription } from 'rxjs';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { BantaChatComponent } from '../chat';\r\nimport { Output } from \"@angular/core\";\r\nimport { ChatBackendBase } from \"../chat-backend-base\";\r\nimport { ChatSourceBase } from \"../chat-source-base\";\r\n\r\n/**\r\n * Unified chat and comments component\r\n */\r\n@Component({\r\n selector: `banta`,\r\n templateUrl: './banta.component.html',\r\n styleUrls: [ './banta.component.scss' ]\r\n})\r\nexport class BantaComponent {\r\n constructor(\r\n private backend : ChatBackendBase,\r\n private matDialog : MatDialog\r\n ) {\r\n }\r\n\r\n firehoseSource : ChatSourceBase;\r\n pointSource : ChatSourceBase;\r\n\r\n private _topicID : string;\r\n private _subs = new Subscription();\r\n\r\n auxOpen = false;\r\n auxTitle = 'Notifications';\r\n auxMode = 'notifications';\r\n\r\n ngOnInit() {\r\n this._subs.add(this.backend.userChanged.subscribe(user => this.currentUser = user));\r\n this._subs.add(this.backend.notificationsChanged.subscribe(notifs => this.notifications = notifs));\r\n this._subs.add(this.backend.newNotification.subscribe(notif => {\r\n this.newNotifications = true;\r\n }));\r\n }\r\n \r\n mobileFocus : string = null;\r\n\r\n async sendPointSubMessage() {\r\n let text = (this.newPointSubMessage.message || '').trim();\r\n this.newPointSubMessage.message = '';\r\n\r\n if (text === '')\r\n return;\r\n \r\n let message : ChatMessage = {\r\n user: null,\r\n sentAt: Date.now(),\r\n likes: 0,\r\n message: text\r\n };\r\n\r\n try {\r\n await this.pointSubChat.send(message);\r\n } catch (e) {\r\n console.error(`Failed to send point sub-message:`);\r\n console.error(e);\r\n }\r\n }\r\n\r\n @ViewChild('firehose', { static: true })\r\n firehose : BantaChatComponent;\r\n\r\n async goToMessage(message : ChatMessage) {\r\n\r\n let targetMessage = message;\r\n\r\n if (message.parentMessageId) {\r\n // jump to the parent message thread...\r\n\r\n let parentMessage: ChatMessage;\r\n \r\n try {\r\n parentMessage = await this.backend.getMessage(message.topicId, message.parentMessageId);\r\n } catch (e) {\r\n console.error(`Received exception while fetching parent message:`);\r\n console.error(e);\r\n }\r\n\r\n if (!parentMessage) {\r\n console.error(`Failed to look up parent message ${message.topicId}/${message.parentMessageId}`);\r\n console.error(`Original message was:`);\r\n console.dir(targetMessage);\r\n return;\r\n }\r\n\r\n message = parentMessage;\r\n }\r\n\r\n let viewType = this.getViewType(message);\r\n\r\n if (viewType === 'comment') {\r\n if (this.pointSubChat) {\r\n if (this.pointSubChat.close)\r\n this.pointSubChat.close();\r\n this.pointSubChat = null;\r\n }\r\n this.mobileFocus = 'points';\r\n this.pointOpen = message;\r\n this.pointSubChat = await this.backend.getSourceForThread(message.topicId, message.id);\r\n this.pointOpen = await this.backend.refreshMessage(message);\r\n this.newPointSubMessage = {};\r\n } else if (viewType === 'chat') {\r\n this.mobileFocus = 'firehose';\r\n this.firehose.jumpToMessage(message);\r\n }\r\n }\r\n\r\n notifications : Notification[];\r\n newNotifications = false;\r\n \r\n pointUnfocus() {\r\n this.pointOpen = null;\r\n if (this.pointSubChat) {\r\n if (this.pointSubChat.close)\r\n this.pointSubChat.close();\r\n this.pointSubChat = null;\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this._subs.unsubscribe();\r\n }\r\n\r\n showAux(title : string, mode : string) {\r\n this.auxOpen = true;\r\n this.auxTitle = title;\r\n this.auxMode = mode;\r\n this.mobileFocus = 'aux';\r\n }\r\n\r\n showNotifications() {\r\n this.showAux('Notifications', 'notifications');\r\n }\r\n\r\n @Input()\r\n get topicID() : string {\r\n return this._topicID;\r\n }\r\n\r\n @Input() chatLabel = 'Chat';\r\n @Input() commentsLabel = 'Comments';\r\n\r\n set topicID(value) {\r\n this._topicID = value;\r\n\r\n this.close();\r\n this.connectToTopic(this._topicID);\r\n }\r\n\r\n private async connectToTopic(id : string) {\r\n this.firehoseSource = await this.backend.getSourceForTopic(`${id}_firehose`);\r\n this.pointSource = await this.backend.getSourceForTopic(`${id}_thepoint`);\r\n }\r\n\r\n private _signInSelected = new Subject<void>();\r\n\r\n @Output()\r\n get signInSelected(): Observable<void> {\r\n return this._signInSelected;\r\n }\r\n\r\n showSignIn() {\r\n this._signInSelected.next();\r\n }\r\n\r\n close() {\r\n if (this.firehoseSource) {\r\n if (this.firehoseSource.close)\r\n this.firehoseSource.close();\r\n this.firehoseSource = null;\r\n }\r\n\r\n if (this.pointSource) {\r\n if (this.pointSource.close)\r\n this.pointSource.close();\r\n this.pointSource = null;\r\n }\r\n }\r\n\r\n @HostBinding('class.point-focus')\r\n get hasPoint() {\r\n return this.pointOpen != null;\r\n }\r\n\r\n pointOpen : ChatMessage = null;\r\n pointSubChat : ChatSourceBase = null;\r\n\r\n closeAux() {\r\n this.auxOpen = false;\r\n this.mobileFocus = 'firehose';\r\n }\r\n\r\n getViewType(message : ChatMessage) {\r\n if (message.topicId.endsWith('_firehose'))\r\n return 'chat';\r\n else if (message.topicId.endsWith('_thepoint'))\r\n return 'comment';\r\n\r\n return 'comment';\r\n }\r\n\r\n async upvoteMessage(message : ChatMessage) {\r\n // TODO\r\n //await this.backend.likeMessage(message.id);\r\n }\r\n\r\n showProfile(user : User) {\r\n this.profileUser = user;\r\n this.showAux(`@${user.username}'s Profile`, 'profile');\r\n }\r\n\r\n profileUser : User;\r\n \r\n reportedMessage : ChatMessage;\r\n\r\n sendReport(message : ChatMessage) {\r\n this.auxOpen = false;\r\n alert('would send report');\r\n }\r\n\r\n reportMessage(message : ChatMessage) {\r\n this.reportedMessage = message;\r\n this.showAux(`Report message from @${message.user.username}`, 'report');\r\n }\r\n\r\n currentUser : User;\r\n\r\n newPointSubMessage : NewMessageForm = {};\r\n\r\n genericAvatarUrl = 'https://gravatar.com/avatar/915c804e0be607a4ad766ddadea5c48a?s=512&d=https://codepen.io/assets/avatars/user-avatar-512x512-6e240cf350d2f1cc07c2bed234c3a3bb5f1b237023c204c782622e80d6b212ba.png';\r\n}","import { Component } from \"@angular/core\";\r\n\r\n@Component({\r\n selector: 'banta-logo',\r\n template: `banta`,\r\n styles: [\r\n `\r\n :host {\r\n font-family: 'Odibee Sans', sans-serif;\r\n font-size: 40pt;\r\n }\r\n\r\n :host.small {\r\n font-size: 30pt;\r\n }\r\n `\r\n ]\r\n})\r\nexport class BantaLogoComponent {\r\n\r\n}","import { Component, Input, Output } from \"@angular/core\";\r\nimport { User, ChatMessage } from '@banta/common';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'banta-chat-message',\r\n templateUrl: './chat-message.component.html',\r\n styleUrls: ['./chat-message.component.scss']\r\n})\r\nexport class ChatMessageComponent {\r\n private _selected = new Subject<void>();\r\n private _reported = new Subject<void>();\r\n private _upvoted = new Subject<void>();\r\n private _userSelected = new Subject<User>();\r\n\r\n @Input()\r\n message : ChatMessage;\r\n \r\n @Output() \r\n get userSelected() {\r\n return this._userSelected;\r\n }\r\n\r\n @Output()\r\n get selected() {\r\n return this._selected;\r\n }\r\n\r\n @Output()\r\n get reported() {\r\n return this._reported;\r\n }\r\n\r\n @Output()\r\n get upvoted() {\r\n return this._upvoted;\r\n }\r\n\r\n avatarForUser(user : User) {\r\n if (user && user.avatarUrl) {\r\n let url = user.avatarUrl;\r\n return `url(${url})`;\r\n }\r\n\r\n return null;\r\n }\r\n \r\n upvote() {\r\n this._upvoted.next();\r\n }\r\n\r\n report() {\r\n this._reported.next();\r\n }\r\n\r\n select() {\r\n this._selected.next();\r\n }\r\n \r\n selectUser() {\r\n this._userSelected.next();\r\n }\r\n\r\n}","import { Component, Input, Output } from '@angular/core';\r\nimport { ChatMessage } from '@banta/common';\r\nimport { Subject, Observable } from 'rxjs';\r\nimport { ChatBackendBase } from '../chat-backend-base';\r\n\r\n@Component({\r\n selector: 'banta-live-chat-message',\r\n template: `\r\n <banta-chat-message \r\n *ngIf=\"message\"\r\n [message]=\"message\"\r\n (upvoted)=\"upvote()\"\r\n (reported)=\"report()\"\r\n (selected)=\"select()\"\r\n ></banta-chat-message>\r\n `,\r\n styles: [``]\r\n})\r\nexport class LiveChatMessageComponent {\r\n constructor(\r\n private backend : ChatBackendBase\r\n ) {\r\n\r\n }\r\n\r\n private _message : ChatMessage;\r\n private _upvoted = new Subject<void>();\r\n private _reported = new Subject<void>();\r\n private _selected = new Subject<void>();\r\n\r\n @Output()\r\n get upvoted() : Observable<void> {\r\n return this._upvoted;\r\n }\r\n \r\n @Output()\r\n get reported() : Observable<void> {\r\n return this._reported;\r\n }\r\n\r\n @Output()\r\n get selected() : Observable<void> {\r\n return this._selected;\r\n }\r\n \r\n @Input()\r\n get message() : ChatMessage {\r\n return this._message;\r\n }\r\n\r\n private unsubscribe : Function;\r\n\r\n set message(value) {\r\n let originalId = null;\r\n if (this._message)\r\n originalId = this._message.id;\r\n \r\n this._message = value;\r\n\r\n if (value && originalId === value.id) {\r\n return;\r\n }\r\n\r\n if (this.unsubscribe)\r\n this.unsubscribe();\r\n \r\n if (value) {\r\n this.unsubscribe = this.backend.watchMessage(value, message => this.message = message);\r\n }\r\n }\r\n\r\n report() {\r\n this._reported.next();\r\n }\r\n \r\n upvote() {\r\n this._upvoted.next();\r\n }\r\n\r\n select() {\r\n this._selected.next();\r\n }\r\n}","import { Component, Input, ViewChild, ElementRef, Output } from \"@angular/core\";\r\nimport { User, ChatMessage } from '@banta/common';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport { ChatBackendBase } from \"../../chat-backend-base\";\r\nimport { ChatSourceBase } from \"../../chat-source-base\";\r\n\r\n@Component({\r\n selector: 'banta-chat-view',\r\n templateUrl: './chat-view.component.html',\r\n styleUrls: ['./chat-view.component.scss']\r\n})\r\nexport class ChatViewComponent {\r\n constructor(\r\n private backend: ChatBackendBase,\r\n private elementRef : ElementRef<HTMLElement>\r\n ) {\r\n\r\n }\r\n\r\n private _sourceSubs = new Subscription();\r\n private _source : ChatSourceBase;\r\n\r\n @Input()\r\n get source() {\r\n return this._source;\r\n }\r\n\r\n private _selected = new Subject<ChatMessage>();\r\n private _selected$ = this._selected.asObservable();\r\n private _reported = new Subject<ChatMessage>();\r\n private _reported$ = this._reported.asObservable();\r\n private _upvoted = new Subject<ChatMessage>();\r\n private _upvoted$ = this._upvoted.asObservable();\r\n private _userSelected = new Subject<ChatMessage>();\r\n private _userSelected$ = this._userSelected.asObservable();\r\n private _received = new Subject<ChatMessage>();\r\n private _received$ = this._received.asObservable();\r\n\r\n @Output() get selected() { return this._selected$; }\r\n @Output() get userSelected() { return this._userSelected$; }\r\n @Output() get reported() { return this._reported$; }\r\n @Output() get upvoted() { return this._upvoted$; }\r\n @Output() get received() { return this._received$; }\r\n\r\n set source(value) {\r\n if (this._sourceSubs) {\r\n this._sourceSubs.unsubscribe();\r\n this._sourceSubs = null;\r\n }\r\n\r\n this._source = value;\r\n\r\n this.messages = [];\r\n\r\n if (value) {\r\n this._sourceSubs = new Subscription();\r\n this.messages = value.messages.slice();\r\n\r\n console.log(`Source set:`);\r\n console.dir(value);\r\n\r\n console.log(`Messages loaded:`);\r\n console.dir(this.messages); \r\n \r\n this._sourceSubs.add(this._source.messageReceived.subscribe(msg => this.messageReceived(msg)));\r\n this._sourceSubs.add(this._source.messageSent.subscribe(msg => this.messageSent(msg)));\r\n\r\n this._sourceSubs.add(\r\n this.backend.userChanged\r\n .subscribe(user => this.currentUser = user)\r\n );\r\n \r\n this.getInitialMessages();\r\n }\r\n }\r\n\r\n private async getInitialMessages() {\r\n let messages = (await this._source.getExistingMessages());\r\n messages.forEach(m => m.transientState ??= {});\r\n this.messages = messages.slice().reverse();\r\n this.sortMessages();\r\n }\r\n\r\n private sortMessages() {\r\n if (!this.source)\r\n return;\r\n \r\n let sorter: (a: ChatMessage, b: ChatMessage) => number;\r\n\r\n sorter = (a, b) => (a.sentAt - b.sentAt);\r\n\r\n this.messages.sort(sorter);\r\n }\r\n\r\n messages : ChatMessage[] = [];\r\n currentUser : User;\r\n\r\n @ViewChild('messageContainer')\r\n messageContainer : ElementRef<HTMLElement>;\r\n\r\n @Input() maxMessages : number = 200;\r\n @Input() emptyLabel = 'Be the first to chat';\r\n\r\n private addMessage(message : ChatMessage) {\r\n if (this.messages.length > this.maxMessages + 1) {\r\n while (this.messages.length > this.maxMessages)\r\n this.messages.shift();\r\n }\r\n\r\n this.messages.push(message);\r\n this.sortMessages();\r\n }\r\n\r\n private messageReceived(message : ChatMessage) {\r\n this.addMessage(message);\r\n this._received.next(message);\r\n\r\n if (this.isScrolledToLatest())\r\n setTimeout(() => this.scrollToLatest());\r\n }\r\n\r\n isScrolledToLatest() {\r\n if (!this.messageContainer)\r\n return false;\r\n\r\n let el = this.messageContainer.nativeElement;\r\n let currentScroll = el.scrollTop;\r\n let currentTotal = el.scrollHeight - el.offsetHeight;\r\n \r\n return currentScroll > currentTotal - 10;\r\n }\r\n\r\n private messageSent(message : ChatMessage) {\r\n this.addMessage(message);\r\n \r\n if (!this.messageContainer)\r\n return;\r\n\r\n setTimeout(() => this.scrollToLatest());\r\n }\r\n\r\n scrollToLatest() {\r\n if (!this.messageContainer)\r\n return;\r\n \r\n let el = this.messageContainer.nativeElement;\r\n el.scrollTop = el.scrollHeight;\r\n }\r\n\r\n jumpTo(message : ChatMessage) {\r\n let element = this.elementRef.nativeElement;\r\n let messageElement = element.querySelector(`banta-chat-message[data-id=\"${message.id}\"]`)\r\n\r\n if (!messageElement) {\r\n alert(`could not find message ${message.id}`);\r\n return;\r\n }\r\n\r\n messageElement.scrollIntoView({ behavior: 'smooth' });\r\n\r\n this.flashMessage(message);\r\n }\r\n\r\n flashMessage(message : ChatMessage) {\r\n if (!message)\r\n return;\r\n \r\n this.flashedMessageId = message.id;\r\n //setTimeout(() => this.flashedMessageId = null, 250);\r\n }\r\n\r\n flashedMessageId : string;\r\n\r\n\r\n mentionsMe(message : ChatMessage) {\r\n if (!this.currentUser)\r\n return false;\r\n\r\n if (message.message.includes(`@${this.currentUser.username}`))\r\n return true;\r\n \r\n return false;\r\n }\r\n \r\n upvoteMessage(message : ChatMessage) {\r\n this._upvoted.next(message);\r\n }\r\n\r\n reportMessage(message : ChatMessage) {\r\n this._reported.next(message);\r\n }\r\n\r\n selectMessage(message : ChatMessage) {\r\n this._selected.next(message);\r\n }\r\n\r\n selectMessageUser(message : ChatMessage) {\r\n this._userSelected.next(message);\r\n }\r\n\r\n avatarForUser(user : User) {\r\n if (user && user.avatarUrl) {\r\n let url = user.avatarUrl;\r\n return `url(${url})`;\r\n }\r\n\r\n return null;\r\n }\r\n}","import { Component, Input, Output, ViewChild, ElementRef } from \"@angular/core\";\r\nimport { Subject, Observable, Subscription } from 'rxjs';\r\n\r\nimport { User, ChatMessage, NewMessageForm } from '@banta/common';\r\nimport { ChatViewComponent } from '../chat-view/chat-view.component';\r\nimport { ChatBackendBase } from \"../../chat-backend-base\";\r\nimport { ChatSourceBase } from \"../../chat-source-base\";\r\n\r\n/**\r\n * Chat component\r\n */\r\n@Component({\r\n selector: 'banta-chat',\r\n templateUrl: './banta-chat.component.html',\r\n styleUrls: ['./banta-chat.component.scss']\r\n})\r\nexport class BantaChatComponent {\r\n constructor(\r\n private backend : ChatBackendBase\r\n ) {\r\n }\r\n\r\n private _source : ChatSourceBase;\r\n private _subs = new Subscription();\r\n user : User = null;\r\n\r\n @Input() shouldInterceptMessageSend?: (message: ChatMessage, source: ChatSourceBase) => boolean | Promise<boolean>;\r\n\r\n\r\n ngOnInit() {\r\n this._subs.add(this.backend.userChanged.subscribe(user => this.user = user));\r\n }\r\n\r\n ngOnDestroy() {\r\n this._subs.unsubscribe();\r\n }\r\n\r\n @Input()\r\n get source() : ChatSourceBase {\r\n return this._source;\r\n }\r\n\r\n set source(value) {\r\n this._source = value;\r\n }\r\n\r\n @Input()\r\n get topicID() : string {\r\n return this._source.identifier;\r\n }\r\n\r\n set topicID(value) {\r\n this.setSourceFromTopicID(value);\r\n }\r\n\r\n private async setSourceFromTopicID(topicID : string) {\r\n if (this._source && this._source.close)\r\n this._source.close();\r\n this._source = null;\r\n this._source = await this.backend.getSourceForTopic(topicID);\r\n }\r\n\r\n @Input() signInLabel = 'Sign In';\r\n @Input() sendLabel = 'Send';\r\n @Input() permissionDeniedLabel = 'Send';\r\n @Input() messageFieldPlaceholder = 'Chat';\r\n @Input() emptyLabel = 'Be the first to chat';\r\n\r\n private _selected = new Subject<ChatMessage>();\r\n private _selected$ = this._selected.asObservable();\r\n private _reported = new Subject<ChatMessage>();\r\n private _reported$ = this._reported.asObservable();\r\n private _upvoted = new Subject<ChatMessage>();\r\n private _upvoted$ = this._upvoted.asObservable();\r\n private _userSelected = new Subject<ChatMessage>();\r\n private _userSelected$ = this._userSelected.asObservable();\r\n private _permissionDeniedError = new Subject<string>();\r\n private _permissionDeniedError$ = this._permissionDeniedError.asObservable();\r\n private _signInSelected = new Subject<void>();\r\n private _signInSelected$ = this._signInSelected.asObservable();\r\n private _received = new Subject<ChatMessage>();\r\n private _received$ = this._received.asObservable();\r\n\r\n @Output() get selected() { return this._selected$; }\r\n @Output() get reported() { return this._reported$; }\r\n @Output() get upvoted() { return this._upvoted$; }\r\n @Output() get userSelected() { return this._userSelected$; }\r\n @Output() get permissionDeniedError() { return this._permissionDeniedError$; }\r\n @Output() get signInSelected() { return this._signInSelected$; }\r\n @Output() get received() { return this._received$; }\r\n\r\n onReceived(message: ChatMessage) {\r\n this._received.next(message);\r\n }\r\n\r\n showEmojiPanel = false;\r\n\r\n showSignIn() {\r\n this._signInSelected.next();\r\n }\r\n\r\n sendPermissionError(message: string) {\r\n this._permissionDeniedError.next(message);\r\n }\r\n\r\n insertEmoji(emoji) {\r\n let message = this.newMessage.message || '';\r\n\r\n this.newMessage.message = message + emoji;\r\n }\r\n\r\n onKeyDown(event : KeyboardEvent) {\r\n // TODO\r\n }\r\n\r\n @ViewChild('chatView') chatView : ChatViewComponent;\r\n @ViewChild('input') inputElementRef: ElementRef<HTMLInputElement>;\r\n\r\n jumpToMessage(message : ChatMessage) {\r\n if (this.chatView)\r\n this.chatView.jumpTo(message);\r\n }\r\n\r\n select(message : ChatMessage) {\r\n this._selected.next(message);\r\n }\r\n\r\n selectUser(message : ChatMessage) {\r\n this._userSelected.next(message);\r\n }\r\n\r\n report(message : ChatMessage) {\r\n this._reported.next(message);\r\n }\r\n\r\n async upvote(message : ChatMessage) {\r\n await this.source.likeMessage(message.id);\r\n this._upvoted.next(message);\r\n }\r\n\r\n get canChat() {\r\n if (!this.user)\r\n return false;\r\n\r\n // TODO\r\n // if (!this.user.permissions)\r\n // return true;\r\n\r\n // if (!this.user.permissions.canChat)\r\n // return true;\r\n\r\n // return this.user.permissions?.canChat(this.source);\r\n \r\n return true;\r\n }\r\n\r\n newMessage : NewMessageForm = {};\r\n\r\n async sendMessage() {\r\n if (!this.source)\r\n return;\r\n\r\n let text = (this.newMessage.message || '').trim();\r\n this.newMessage.message = '';\r\n\r\n if (text === '')\r\n return;\r\n\r\n let message : ChatMessage = {\r\n user: null,\r\n sentAt: Date.now(),\r\n likes: 0,\r\n url: typeof window !== 'undefined' ? location.href : undefined,\r\n message: text\r\n };\r\n\r\n try {\r\n const intercept = await this.shouldInterceptMessageSend?.(message, this.source);\r\n if (!intercept) {\r\n await this.source.send(message);\r\n }\r\n\r\n this.chatView.scrollToLatest();\r\n this.inputElementRef.nativeElement.focus();\r\n } catch (e) {\r\n console.error(`Failed to send message: `, message);\r\n console.error(e);\r\n }\r\n }\r\n}\r\n","import { NgModule } from \"@angular/core\";\r\nimport { ChatMessageComponent } from './chat-message/chat-message.component';\r\nimport { ChatViewComponent } from './chat-view/chat-view.component';\r\nimport { BantaChatComponent } from './banta-chat/banta-chat.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { EmojiModule } from '../emoji';\r\nimport { LiveChatMessageComponent } from './live-chat-message.component';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\nconst COMPONENTS = [\r\n ChatMessageComponent,\r\n LiveChatMessageComponent,\r\n ChatViewComponent,\r\n BantaChatComponent\r\n];\r\n\r\n@NgModule({\r\n declarations: COMPONENTS,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n EmojiModule\r\n ],\r\n exports: COMPONENTS\r\n})\r\nexport class ChatModule {\r\n}","import { Component, Input, Output } from \"@angular/core\";\r\nimport { ChatMessage } from '@banta/common';\r\nimport { Subject, Observable } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'banta-live-message',\r\n template: `\r\n <ng-container *ngIf=\"message\">\r\n <banta-live-chat-message\r\n *ngIf=\"viewType === 'chat'\"\r\n [message]=\"message\"\r\n (upvoted)=\"upvote(message)\"\r\n (reported)=\"report(message)\"\r\n (selected)=\"select(message)\">\r\n </banta-live-chat-message>\r\n\r\n <banta-live-comment \r\n *ngIf=\"viewType === 'comment'\"\r\n [message]=\"message\"\r\n (upvoted)=\"upvote(message)\"\r\n (reported)=\"report(message)\"\r\n (selected)=\"select(message)\">\r\n </banta-live-comment>\r\n </ng-container>\r\n `,\r\n styles: [``]\r\n})\r\nexport class LiveMessageComponent {\r\n constructor() {\r\n\r\n }\r\n\r\n private _message : ChatMessage;\r\n private _upvoted = new Subject<void>();\r\n private _reported = new Subject<void>();\r\n private _selected = new Subject<void>();\r\n\r\n viewType : string;\r\n\r\n @Output() \r\n get upvoted(): Observable<void> {\r\n return this._upvoted;\r\n }\r\n\r\n @Output() \r\n get reported(): Observable<void> {\r\n return this._reported;\r\n }\r\n \r\n @Output() \r\n get selected(): Observable<void> {\r\n return this._selected;\r\n }\r\n\r\n @Input()\r\n get message() : ChatMessage {\r\n return this._message;\r\n }\r\n\r\n set message(value) {\r\n this._message = value;\r\n this.viewType = this.getViewType(value);\r\n }\r\n\r\n private getViewType(message : ChatMessage) {\r\n if (message.topicId.endsWith('_firehose'))\r\n return 'chat';\r\n else if (message.topicId.endsWith('_thepoint'))\r\n return 'comment';\r\n\r\n return 'comment';\r\n }\r\n\r\n upvote() {\r\n this._upvoted.next();\r\n }\r\n\r\n report() {\r\n this._reported.next();\r\n }\r\n\r\n select() {\r\n this._selected.next();\r\n }\r\n\r\n}","import { Component, Output, Input, HostBinding, ElementRef } from \"@angular/core\";\r\nimport { Subject } from 'rxjs';\r\nimport { ChatMessage, ChatPermissions, User } from '@banta/common';\r\nimport { MessageMenuItem } from \"../../message-menu-item\";\r\nimport { take } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'banta-comment',\r\n templateUrl: './comment.component.html',\r\n styleUrls: ['./comment.component.scss']\r\n})\r\nexport class CommentComponent {\r\n constructor(\r\n private elementRef: ElementRef<HTMLElement>\r\n ) {\r\n }\r\n\r\n get element() {\r\n return this.elementRef.nativeElement;\r\n }\r\n\r\n private _reported = new Subject<void>();\r\n private _selected = new Subject<void>();\r\n private _liked = new Subject<void>();\r\n private _unliked = new Subject<void>();\r\n\r\n private _shared = new Subject<ChatMessage>();\r\n\r\n\tprivate _userSelected = new Subject<void>();\r\n\tprivate _avatarSelected = new Subject<User>();\r\n\tprivate _usernameSelected = new Subject<User>();\r\n\r\n @Input() maxLength: number = 1500;\r\n \r\n ngOnInit() {\r\n let maxTime = 100;\r\n let minTime = 0;\r\n let randomTime = minTime + Math.random() * (maxTime - minTime);\r\n\r\n setTimeout(() => {\r\n this.isNew = true;\r\n this.visible = true;\r\n setTimeout(() => this.isNew = false, 1000);\r\n }, randomTime);\r\n }\r\n\r\n markAttachmentsLoaded() {\r\n this.isLoaded = true;\r\n this.loaded.next();\r\n }\r\n\r\n @HostBinding('class.new')\r\n isNew = false;\r\n\r\n @HostBinding('class.highlighted')\r\n get isHighlighted() {\r\n return this.message?.transientState?.highlighted ?? false;\r\n }\r\n\r\n @HostBinding('class.visible')\r\n visible = false;\r\n\r\n private _message : ChatMessage;\r\n @Input()\r\n get message() {\r\n return this._message;\r\n }\r\n\r\n set message(value) {\r\n this._message = value;\r\n if (this._message.attachments?.length > 0) {\r\n this.isLoaded = false;\r\n } else {\r\n this.isLoaded = true;\r\n this.loaded.next();\r\n }\r\n }\r\n\r\n @Input()\r\n customMenuItems: MessageMenuItem[];\r\n\r\n @Input()\r\n showReplyAction = true;\r\n\r\n @Output()\r\n loaded = new Subject<void>();\r\n\r\n private isLoaded = false;\r\n\r\n async waitForLoad() {\r\n if (this.isLoaded)\r\n return true;\r\n await this.loaded.pipe(take(1)).toPromise();\r\n }\r\n\r\n\t@Output()\r\n get userSelected() {\r\n return this._userSelected.asObservable();\r\n }\r\n\r\n @Output()\r\n get usernameSelected() {\r\n return this._usernameSelected.asObservable();\r\n }\r\n\r\n\t@Output()\r\n\tget avatarSelected() {\r\n\t\treturn this._avatarSelected.asObservable();\r\n\t}\r\n\r\n @Output()\r\n get reported() {\r\n return this._reported.asObservable();\r\n }\r\n\r\n @Input() permissions: ChatPermissions;\r\n @Input() mine = false;\r\n \r\n @Input() editing = false;\r\n editedMessage: string;\r\n\r\n saveEdit() {\r\n this._edited.next(this.editedMessage);\r\n }\r\n\r\n endEditing() {\r\n this._editEnded.next();\r\n }\r\n\r\n startEdit() {\r\n this._editStarted.next();\r\n this.editedMessage = this.message.message;\r\n }\r\n\r\n delete() {\r\n this._deleted.next();\r\n }\r\n\r\n @Output()\r\n get liked() {\r\n return this._liked.asObservable();\r\n }\r\n\r\n @Output()\r\n get unliked() {\r\n return this._unliked.asObservable();\r\n }\r\n\r\n @Output()\r\n get selected() {\r\n return this._selected.asObservable();\r\n }\r\n\r\n private _editStarted = new Subject<void>();\r\n private _deleted = new Subject<void>();\r\n private _editEnded = new Subject<void>();\r\n private _edited = new Subject<string>();\r\n \r\n\r\n @Output() get edited() { return this._edited.asObservable(); }\r\n @Output() get deleted() { return this._deleted.asObservable(); }\r\n @Output() get editStarted() { return this._editStarted.asObservable(); }\r\n @Output() get editEnded() { return this._editEnded.asObservable(); }\r\n @Output() get shared(){ return this._shared.asObservable(); }\r\n\r\n @Input() genericAvatarUrl: string;\r\n\r\n @HostBinding('attr.data-comment-id') get commentId() { return this.message?.id; }\r\n\r\n report() {\r\n this._reported.next();\r\n }\r\n\r\n like() {\r\n this._liked.next();\r\n }\r\n\r\n unlike() {\r\n this._unliked.next();\r\n }\r\n\r\n share() {\r\n this._shared.next(this.message);\r\n }\r\n\r\n select() {\r\n this._selected.next();\r\n }\r\n\r\n\tselectUser() {\r\n this._userSelected.next();\r\n }\r\n\r\n selectUsername(user: User) {\r\n this._usernameSelected.next(user);\r\n\t\tthis.selectUser();\r\n }\r\n\r\n\tselectAvatar(user: User) {\r\n\t\tthis._avatarSelected.next(user);\r\n\t\tthis.selectUser();\r\n\t}\r\n\r\n avatarForUser(user : User) {\r\n let url = this.genericAvatarUrl;\r\n\r\n if (user && user.avatarUrl) {\r\n url = user.avatarUrl;\r\n }\r\n\r\n return `url(${url})`;\r\n }\r\n\r\n get replyCount() {\r\n return this.message.submessages?.length || this.message.submessageCount || 0;\r\n }\r\n}\r\n","import { Component, Input, ViewChild, ElementRef, Output, HostBinding, ViewChildren, QueryList } from \"@angular/core\";\r\nimport { User, ChatMessage, CommentsOrder } from '@banta/common';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport { ChatBackendBase } from \"../../chat-backend-base\";\r\nimport { ChatSourceBase } from \"../../chat-source-base\";\r\nimport { MessageMenuItem } from \"../../message-menu-item\";\r\nimport { CommentComponent } from \"../comment/comment.component\";\r\n\r\nexport interface EditEvent {\r\n message: ChatMessage;\r\n newMessage: string;\r\n}\r\n\r\n@Component({\r\n selector: 'banta-comment-view',\r\n templateUrl: './comment-view.component.html',\r\n styleUrls: ['./comment-view.component.scss']\r\n})\r\nexport class CommentViewComponent {\r\n constructor(\r\n private backend: ChatBackendBase\r\n ) {\r\n\r\n }\r\n\r\n private _sourceSubs = new Subscription();\r\n private _source: ChatSourceBase;\r\n private _selected = new Subject<ChatMessage>();\r\n private _liked = new Subject<ChatMessage>();\r\n private _unliked = new Subject<ChatMessage>();\r\n private _reported = new Subject<ChatMessage>();\r\n private _userSelected = new Subject<ChatMessage>();\r\n private _usernameSelected = new Subject<User>();\r\n private _avatarSelected = new Subject<User>();\r\n private _shared = new Subject<ChatMessage>();\r\n private _deleted = new Subject<ChatMessage>();\r\n private _messageEdited = new Subject<EditEvent>();\r\n\r\n @Input()\r\n showEmptyState = true;\r\n\r\n @Input()\r\n allowReplies = true;\r\n\r\n @Input() customMenuItems: MessageMenuItem[] = [];\r\n\r\n @ViewChildren(CommentComponent)\r\n commentsQuery: QueryList<CommentComponent>;\r\n\r\n get comments() {\r\n return Array.from(this.commentsQuery);\r\n }\r\n\r\n /**\r\n * Returns true if this message can be found within one of the message buffers (older, current, newer)\r\n * @param message \r\n */\r\n isMessageLoadedInContext(message: ChatMessage) {\r\n return this.olderMessages.find(x => x.id === message.id)\r\n || this.messages.find(x => x.id === message.id)\r\n || this.newMessages.find(x => x.id === message.id);\r\n }\r\n\r\n async loadMessageInContext(message: ChatMessage) {\r\n await this.sourceLoaded;\r\n \r\n console.log(`Loading message ${message.id} in context...`);\r\n while (this.hasMore && !this.isMessageLoadedInContext(message)) {\r\n console.log(`...Need to load more comments to find ${message.id}`);\r\n await this.showMore();\r\n }\r\n\r\n if (!this.isMessageLoadedInContext(message)) {\r\n console.error(`Error while loading message in context: Failed to find message ${message.id}, maybe it was deleted!`);\r\n return false;\r\n }\r\n\r\n let pageSize = this.maxVisibleMessages;\r\n let items = [].concat(this.olderMessages, this.messages, this.newMessages);\r\n let index = items.findIndex(x => x.id === message.id);\r\n\r\n if (index < 0) {\r\n console.error(`Error while loading message in context: Message was not present in message list!`);\r\n return false;\r\n }\r\n\r\n let startIndex = Math.max(0, index - pageSize / 2); \r\n this.newMessages = items.splice(0, startIndex);\r\n this.messages = items.splice(0, pageSize);\r\n this.olderMessages = items;\r\n this.isViewingMore = true;\r\n }\r\n\r\n /**\r\n * Get the CommentComponent instantiated for the given ChatMessage,\r\n * if it exists in the current view. Note that messages which are not \r\n * currently shown to the user will not return a CommentComponent.\r\n * @param message \r\n * @returns \r\n */\r\n getCommentComponentForMessage(message: ChatMessage) {\r\n if (!message)\r\n throw new Error(`You must pass a valid ChatMessage`);\r\n return this.comments.find(x => x.message?.id === message.id);\r\n }\r\n\r\n @Input()\r\n @HostBinding('class.fixed-height')\r\n fixedHeight: boolean;\r\n\r\n @Input()\r\n selectedMessage: ChatMessage;\r\n \r\n @Output()\r\n get selected() {\r\n return this._selected;\r\n }\r\n\r\n @Output() \r\n get messageEdited() {\r\n return this._messageEdited.asObservable();\r\n }\r\n\r\n saveEdit(message: ChatMessage, newMessage: string) {\r\n this._messageEdited.next({ message, newMessage });\r\n }\r\n\r\n @Output() get userSelected() { return this._userSelected; }\r\n @Output() get reported() { return this._reported; }\r\n @Output() get liked() { return this._liked; }\r\n @Output() get unliked() { return this._unliked; }\r\n @Output() get usernameSelected() { return this._usernameSelected; }\r\n @Output() get avatarSelected() { return this._avatarSelected; }\r\n @Output() get shared() { return this._shared; }\r\n @Output() get deleted() { return this._deleted; }\r\n\r\n menuMessage: ChatMessage = null;\r\n messages: ChatMessage[] = [];\r\n currentUser: User;\r\n\r\n @Input()\r\n get source() {\r\n return this._source;\r\n }\r\n\r\n likeMessage(message: ChatMessage) {\r\n this._liked.next(message);\r\n }\r\n\r\n unlikeMessage(message: ChatMessage) {\r\n this._unliked.next(message);\r\n }\r\n\r\n reportMessage(message: ChatMessage) {\r\n this._reported.next(message);\r\n }\r\n\r\n selectMessage(message: ChatMessage) {\r\n this._selected.next(message);\r\n }\r\n\r\n selectMessageUser(message: ChatMessage) {\r\n this._userSelected.next(message);\r\n }\r\n\r\n selectUsername(user: User) {\r\n this._usernameSelected.next(user);\r\n }\r\n\r\n selectAvatar(user: User) {\r\n this._avatarSelected.next(user);\r\n }\r\n\r\n sharedMessage(message: ChatMessage) {\r\n this._shared.next(message);\r\n }\r\n\r\n startEditing(message: ChatMessage) {\r\n this.messages.forEach(m => m.transientState.editing = false);\r\n message.transientState.editing = true;\r\n }\r\n\r\n deleteMessage(message: ChatMessage) {\r\n this._deleted.next(message);\r\n }\r\n\r\n customSortEnabled = false;\r\n\r\n markSourceLoaded: () => void;\r\n sourceLoaded = new Promise<void>(r => this.markSourceLoaded = r);\r\n\r\n set source(value) {\r\n this.customSortEnabled = value?.sortOrder !== CommentsOrder.NEWEST;\r\n this.newMessages = [];\r\n this.olderMessages = [];\r\n\r\n (window as any).bantaSourceDebug = value;\r\n\r\n if (this._sourceSubs) {\r\n this._sourceSubs.unsubscribe();\r\n this._sourceSubs = null;\r\n }\r\n this._source = value;\r\n\r\n if (value) {\r\n const messages = (value.messages || []).slice();\r\n this.messages = messages;\r\n this.olderMessages = messages.splice(this.maxVisibleMessages, messages.length);\r\n this.hasMore = true; //this.olderMessages.length > 0;\r\n\r\n this._sourceSubs = new Subscription();\r\n this._sourceSubs.add(this._source.messageReceived.subscribe(msg => this.messageReceived(msg)));\r\n this._sourceSubs.add(this._source.messageSent.subscribe(msg => this.messageSent(msg)));\r\n\r\n this._sourceSubs.add(\r\n this.backend.userChanged.subscribe(user => this.currentUser = user)\r\n );\r\n\r\n this.getInitialMessages();\r\n }\r\n }\r\n\r\n private async getInitialMessages() {\r\n let messages = (await this._source.getExistingMessages());\r\n messages.forEach(m => m.transientState ??= {});\r\n this.messages = this.newestLast ? messages.slice().reverse() : messages;\r\n this.sortMessages();\r\n if (this.markSourceLoaded)\r\n this.markSourceLoaded();\r\n }\r\n\r\n @Input()\r\n genericAvatarUrl: string;\r\n\r\n @ViewChild('messageContainer')\r\n messageContainer: ElementRef<HTMLElement>;\r\n\r\n @Input()\r\n maxMessages = 2000;\r\n\r\n @Input()\r\n maxVisibleMessages: number = 200;\r\n\r\n @Input()\r\n newestLast = false;\r\n\r\n isViewingMore = false;\r\n isLoadingMore = false;\r\n hasMore = false;\r\n\r\n newMessages: ChatMessage[] = [];\r\n olderMessages: ChatMessage[] = [];\r\n\r\n messageIdentity(index: number, chatMessage: ChatMessage) {\r\n return chatMessage.id;\r\n }\r\n\r\n @Output()\r\n sortOrderChanged = new Subject<CommentsOrder>();\r\n\r\n async showNew() {\r\n let naturalOrder = CommentsOrder.NEWEST;\r\n if (this.source && this.source.sortOrder !== naturalOrder) {\r\n this.sortOrderChanged.next(naturalOrder);\r\n return;\r\n }\r\n\r\n this.isViewingMore = false;\r\n\r\n if (this.newestLast)\r\n this.messages = this.messages.concat(this.newMessages.splice(0, this.newMessages.length));\r\n else\r\n this.messages = this.newMessages.splice(0, this.newMessages.length).concat(this.messages);\r\n let overflow = this.messages.splice(this.maxVisibleMessages, this.messages.length);\r\n this.olderMessages = overflow.concat(this.olderMessages);\r\n this.olderMessages.splice(this.maxMessages - this.maxVisibleMessages, this.olderMessages.length);\r\n this.hasMore = this.olderMessages.length > 0;\r\n }\r\n\r\n async showMore() {\r\n this.isViewingMore = true;\r\n\r\n if (this.olderMessages.length > 0) {\r\n this.isLoadingMore = false;\r\n this.messages = this.messages.concat(this.olderMessages.splice(0, 50));\r\n }\r\n this.isLoadingMore = true;\r\n\r\n let nextPageSize = 20;\r\n let lastMessage: ChatMessage;\r\n\r\n if (this.newestLast) {\r\n lastMessage = this.olderMessages[0] ?? this.messages[0];\r\n } else {\r\n lastMessage = this.olderMessages[this.olderMessages.length - 1] ?? this.messages[this.messages.length - 1];\r\n }\r\n\r\n if (!lastMessage) {\r\n this.isLoadingMore = false;\r\n this.hasMore = false;\r\n return;\r\n }\r\n\r\n let messages = await this.source.loadAfter(lastMessage, nextPageSize);\r\n\r\n if (this.newestLast)\r\n messages = messages.slice().reverse();\r\n \r\n messages.forEach(m => m.transientState ??= {});\r\n\r\n if (this.newestLast)\r\n this.messages = messages.concat(this.messages);\r\n else\r\n this.messages = this.messages.concat(messages);\r\n this.isLoadingMore = false;\r\n if (messages.length === 0) {\r\n console.log(`Reached the end of the list.`);\r\n this.hasMore = false;\r\n }\r\n }\r\n\r\n private addMessage(message: ChatMessage) {\r\n\r\n if (!message.transientState)\r\n message.transientState ??= {};\r\n \r\n let destination = this.messages;\r\n let bucket = this.olderMessages;\r\n let newestLast = this.newestLast;\r\n\r\n if (this.isViewingMore) {\r\n destination = this.newMessages;\r\n bucket = null;\r\n }\r\n\r\n \r\n if (newestLast) {\r\n destination.push(message);\r\n let overflow = destination.splice(this.maxVisibleMessages, destination.length);\r\n bucket?.push(...overflow);\r\n } else {\r\n destination.unshift(message);\r\n let overflow = destination.splice(this.maxVisibleMessages, destination.length);\r\n bucket?.unshift(...overflow);\r\n }\r\n\r\n if (bucket?.length > 0)\r\n this.hasMore = true;\r\n\r\n message.pagingCursor = String(this.incrementPagingCursors());\r\n this.sortMessages();\r\n }\r\n\r\n private incrementPagingCursors() {\r\n if (this.source.sortOrder !== CommentsOrder.NEWEST)\r\n return;\r\n \r\n let maxPagingCursor = 0;\r\n for (let group of [this.messages, this.olderMessages, this.newMessages]) {\r\n for (let message of group) {\r\n if (message.pagingCursor) {\r\n let pagingCursor = Number(message.pagingCursor) + 1;\r\n if (pagingCursor > maxPagingCursor)\r\n maxPagingCursor = pagingCursor;\r\n message.pagingCursor = String(pagingCursor);\r\n }\r\n }\r\n }\r\n\r\n return maxPagingCursor;\r\n }\r\n\r\n /**\r\n * Wait for all currently visible comments to be fully loaded, including all attachments.\r\n * Doing this will prevent layout shift when scrolling to a specific comment.\r\n */\r\n async waitForAllCommentsToLoad() {\r\n await new Promise(r => setTimeout(r, 100));\r\n await this.sourceLoaded;\r\n await Promise.all(this.comments.map(x => x.waitForLoad()));\r\n }\r\n\r\n private sortMessages() {\r\n if (!this.source)\r\n return;\r\n \r\n let sorter: (a: ChatMessage, b: ChatMessage) => number;\r\n\r\n if (this.source.sortOrder === CommentsOrder.LIKES)\r\n sorter = (a, b) => b.likes - a.likes;\r\n else if (this.source.sortOrder === CommentsOrder.NEWEST)\r\n sorter = (a, b) => (b.sentAt - a.sentAt) * (this.newestLast ? -1 : 1);\r\n else if (this.source.sortOrder === CommentsOrder.OLDEST)\r\n sorter = (a, b) => (a.sentAt - b.sentAt) * (this.newestLast ? -1 : 1);\r\n\r\n this.messages.sort(sorter);\r\n this.olderMessages.sort(sorter);\r\n this.newMessages.sort(sorter);\r\n }\r\n\r\n private messageReceived(message: ChatMessage) {\r\n this.addMessage(message);\r\n\r\n if (this.isScrolledToLatest())\r\n setTimeout(() => this.scrollToLatest());\r\n }\r\n\r\n isScrolledToLatest() {\r\n if (!this.messageContainer)\r\n return false;\r\n\r\n const el = this.messageContainer.nativeElement;\r\n const currentScroll = el.scrollTop;\r\n const currentTotal = el.scrollHeight - el.offsetHeight;\r\n\r\n return currentScroll > currentTotal - 10;\r\n }\r\n\r\n private messageSent(message: ChatMessage) {\r\n this.addMessage(message);\r\n\r\n if (!this.messageContainer)\r\n return;\r\n\r\n this.scrollToLatest();\r\n }\r\n\r\n scrollToLatest() {\r\n if (!this.messageContainer)\r\n return;\r\n\r\n const el = this.messageContainer.nativeElement;\r\n el.scrollTop = el.scrollHeight;\r\n }\r\n\r\n mentionsMe(message: ChatMessage) {\r\n if (!this.currentUser)\r\n return false;\r\n\r\n if (message.message.includes(`@${this.currentUser.username}`))\r\n return true;\r\n\r\n return false;\r\n }\r\n}\r\n","import { Directive } from \"@angular/core\";\r\n\r\n@Directive({\r\n selector: `[bantaReplySendOptions]`\r\n})\r\nexport class BantaReplySendOptionsDirective {}","/// <reference types=\"@types/resize-observer-browser\" />\r\n\r\nimport { Component, ContentChild, ElementRef, HostBinding, Input, NgZone, Output, QueryList, TemplateRef, ViewChild, ViewChildren } from '@angular/core';\r\nimport { User, ChatMessage, CommentsOrder } from '@banta/common';\r\nimport { HashTag } from '../comment-field/comment-field.component';\r\nimport { Subject, Observable, Subscription } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\n\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { ChatBackendBase } from '../../chat-backend-base';\r\nimport { ChatSourceBase } from '../../chat-source-base';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { BantaReplySendOptionsDirective } from '../reply-send-options.directive';\r\nimport { MessageMenuItem } from '../../message-menu-item';\r\nimport { CommentViewComponent } from '../comment-view/comment-view.component';\r\nimport { CommentComponent } from '../comment/comment.component';\r\n\r\n/**\r\n * Comments component\r\n */\r\n@Component({\r\n selector: 'banta-comments',\r\n templateUrl: './banta-comments.component.html',\r\n styleUrls: ['./banta-comments.component.scss']\r\n})\r\nexport class BantaCommentsComponent {\r\n constructor(\r\n private backend: ChatBackendBase,\r\n private elementRef: ElementRef<HTMLElement>,\r\n private activatedRoute: ActivatedRoute,\r\n private matSnackBar: MatSnackBar,\r\n private ngZone: NgZone\r\n ) {\r\n this.sendMessage = async (message: ChatMessage) => {\r\n try {\r\n const intercept = await this.shouldInterceptMessageSend?.(message, this.source);\r\n if (!intercept) {\r\n await this.source.send(message);\r\n }\r\n\r\n if (this.source.sortOrder !== CommentsOrder.NEWEST) {\r\n this.sortOrder = CommentsOrder.NEWEST;\r\n }\r\n return true;\r\n } catch (e) {\r\n this.handleBackendException(e, 'Could not send: ');\r\n }\r\n }\r\n\r\n this.sendReply = async (message: ChatMessage) => {\r\n try {\r\n const intercept = await this.shouldInterceptMessageSend?.(message, this.selectedMessageThread);\r\n if (!intercept) {\r\n await this.selectedMessageThread.send(message);\r\n }\r\n return true;\r\n } catch (e) {\r\n this.handleBackendException(e, 'Could not send reply: ');\r\n }\r\n }\r\n }\r\n\r\n get element() {\r\n return this.elementRef.nativeElement;\r\n }\r\n\r\n private handleBackendExceptionAsAlert(e: Error, prefix: string = '') {\r\n try {\r\n this.handleBackendException(e, prefix);\r\n } catch (e) {\r\n alert(e.message);\r\n }\r\n }\r\n\r\n private handleBackendException(e: Error, prefix: string = '') {\r\n let errorMessage = e.message;\r\n\r\n if (errorMessage.startsWith('permission-denied|')) {\r\n errorMessage = errorMessage.replace(/^permission-denied\\|/, '');\r\n\r\n if (errorMessage.startsWith(`app-handle|`)) {\r\n // If this is an error during authorizeAction on the backend, pass control to the user-provided \r\n // permission-denied handler.\r\n\r\n this.sendPermissionDenied(errorMessage.replace(/^app-handle\\|/, ''));\r\n return;\r\n }\r\n }\r\n\r\n throw new Error(`${prefix}${errorMessage}`);\r\n }\r\n\r\n // Lifecycle Events / Initialization\r\n\r\n ngOnInit() {\r\n this._subs.add(this.backend.userChanged.subscribe(user => this.user = user));\r\n this.startLoading();\r\n\r\n if (typeof window !== 'undefined') {\r\n let queryString = window.location.search.substring(1);\r\n let query = queryString.split('&')\r\n .map(s => s.split('='))\r\n .reduce((o, [k, v]) => (o[decodeURIComponent(k)] = decodeURIComponent(v), o), {})\r\n ;\r\n\r\n const commentID = query['comment'];\r\n if (commentID) {\r\n this.sharedCommentID = commentID;\r\n }\r\n }\r\n }\r\n\r\n private resizeObserver: ResizeObserver;\r\n private width: number;\r\n private height: number;\r\n\r\n @HostBinding('class.banta-mobile')\r\n isMobileSized: boolean = false;\r\n\r\n @ContentChild(BantaReplySendOptionsDirective, {read: TemplateRef}) \r\n sendReplyOptionsTemplate: any;\r\n\r\n markViewReady: () => void;\r\n viewReady = new Promise<void>(r => this.markViewReady = r);\r\n\r\n ngAfterViewInit() {\r\n if (typeof window !== 'undefined') {\r\n let callback = () => {\r\n let size = this.elementRef.nativeElement.getBoundingClientRect();\r\n this.ngZone.run(() => {\r\n setTimeout(() => {\r\n this.width = size.width;\r\n this.height = size.height;\r\n this.isMobileSized = this.width < 500;\r\n });\r\n })\r\n };\r\n\r\n if (typeof ResizeObserver !== 'undefined') {\r\n this.resizeObserver = new ResizeObserver(callback);\r\n this.resizeObserver.observe(this.elementRef.nativeElement);\r\n } else {\r\n // One check is better than nothing!\r\n setTimeout(() => {\r\n this.width = this.elementRef.nativeElement.clientWidth;\r\n this.height = this.elementRef.nativeElement.clientHeight;\r\n this.isMobileSized = this.width < 500;\r\n }, 1000);\r\n }\r\n\r\n callback();\r\n }\r\n\r\n this.markViewReady();\r\n }\r\n\r\n ngOnDestroy() {\r\n this._subs.unsubscribe();\r\n if (this.resizeObserver)\r\n this.resizeObserver.disconnect();\r\n }\r\n\r\n private async setSourceFromTopicID(topicID: string) {\r\n if (typeof window === 'undefined')\r\n return;\r\n\r\n setTimeout(async () => {\r\n console.log(`[banta-comments] Subscribing to topic source '${topicID}'`);\r\n this.source = await this.backend.getSourceForTopic(topicID, { sortOrder: this.sortOrder });\r\n this._sourceIsOwned = true;\r\n });\r\n }\r\n\r\n // Loading Screen\r\n private _loadingMessage = '';\r\n loadingMessageVisible = false;\r\n\r\n get loadingMessage() {\r\n return this._loadingMessage;\r\n }\r\n\r\n set loadingMessage(value) {\r\n this.loadingMessageVisible = false;\r\n setTimeout(() => {\r\n this._loadingMessage = value;\r\n this._loadingMessage = value;\r\n setTimeout(() => {\r\n this.loadingMessageVisible = true;\r\n })\r\n }, 500);\r\n }\r\n\r\n loading: boolean = true;\r\n showLoadingScreen = false;\r\n loadingStartedAt: number;\r\n messageChangedAt: number;\r\n sharedCommentID: string;\r\n lastSharedCommentID: string;\r\n\r\n @Input() customMenuItems: MessageMenuItem[] = [];\r\n\r\n private async startLoading() {\r\n this.loadingStartedAt = this.messageChangedAt = Date.now();\r\n\r\n if (this.updateLoading()) return;\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 100));\r\n if (this.updateLoading()) return;\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 250));\r\n if (this.updateLoading()) return;\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 500));\r\n if (this.updateLoading()) return;\r\n\r\n console.log(`[Banta] Loading is taking a long time! Showing loading screen.`);\r\n this.showLoadingScreen = true;\r\n if (typeof window !== 'undefined')\r\n this._loadingTimer = setInterval(() => this.updateLoading(), 1000);\r\n }\r\n \r\n private _loadingTimer;\r\n private _loadingMessageIndex = 0;\r\n\r\n @Input() maxCommentLength: number = 1500;\r\n @Input() loadingMessages: string[] = [\r\n `Just a second...`,\r\n `We're definitely working on it.`,\r\n `There's no need to refresh.`,\r\n `It's definitely worth the wait!`,\r\n `This has never happened before.`,\r\n `We'll keep trying, but it's not looking great. \r\n Commenting & chat services may be down. \r\n If you continue to experience issues, please contact support.\r\n `\r\n ];\r\n\r\n @Input() useInlineReplies = true;\r\n\r\n /**\r\n * Access the CommentViewComponent for this BantaCommentsComponent. \r\n * CommentViewComponent is responsible for interacting with the ChatSource \r\n * object and rendering comments as CommentComponents. It is the source of \r\n * truth for which CommentComponent corresponds to which ChatMessage. \r\n * \r\n * Note that this CommentViewComponent is only for the top level comments.\r\n * Replies are handled by a separate CommentViewComponent which can be \r\n * retrieved using the threadView property.\r\n */\r\n @ViewChild('commentView')\r\n commentView: CommentViewComponent;\r\n\r\n @ViewChildren(CommentViewComponent)\r\n threadViewQuery: QueryList<CommentViewComponent>;\r\n\r\n /**\r\n * Attempts to find the CommentComponent that corresponds to the given ChatMessage.\r\n * The ChatMessage could be a top-level message in this conversation, or a reply, \r\n * but note that a CommentComponent will only exist for a reply if the user has \r\n * the relevant reply thread open.\r\n * @param message The message to look for\r\n */\r\n getCommentComponentForMessage(message: ChatMessage): CommentComponent {\r\n if (message.parentMessageId)\r\n return this.threadView?.getCommentComponentForMessage(message);\r\n else\r\n return this.commentView.getCommentComponentForMessage(message)\r\n }\r\n\r\n /**\r\n * Access the CommentViewComponent corresponding to the currently open reply thread.\r\n * This is not the top level comments, but instead the reply thread that the user has \r\n * opened (only one set of replies can be open at a time).\r\n * \r\n * For details about what CommentViewComponent affords you, see the commentView property.\r\n */\r\n get threadView() {\r\n return Array.from(this.threadViewQuery).filter(x => x !== this.commentView)[0];\r\n }\r\n\r\n async waitForThreadView() {\r\n if (this.threadView)\r\n return this.threadView;\r\n \r\n await this.threadViewQuery.changes.pipe(take(1)).toPromise();\r\n return this.threadView;\r\n }\r\n\r\n markLoaded: () => void;\r\n loaded = new Promise<void>(r => this.markLoaded = r);\r\n\r\n private updateLoading(): boolean {\r\n if (this.source?.state && this.source?.state !== 'connecting') {\r\n clearInterval(this._loadingTimer);\r\n this.loadingMessage = `Here we go!`;\r\n setTimeout(() => {\r\n this.loading = false;\r\n this.markLoaded();\r\n }, 750);\r\n return true;\r\n }\r\n\r\n let messageSwitchTime = 5*1000;\r\n if (this.messageChangedAt + messageSwitchTime < Date.now()) {\r\n if (this.loadingMessages[this._loadingMessageIndex]) {\r\n this.loadingMessage = this.loadingMessages[this._loadingMessageIndex++];\r\n this.messageChangedAt = Date.now();\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n // Properties\r\n\r\n private _signInSelected = new Subject<void>();\r\n private _permissionDeniedError = new Subject<string>();\r\n private _editAvatarSelected = new Subject<void>();\r\n private _upvoted = new Subject<ChatMessage>();\r\n private _reported = new Subject<ChatMessage>();\r\n private _selected = new Subject<ChatMessage>();\r\n private _userSelected = new Subject<ChatMessage>();\r\n private _shared = new Subject<ChatMessage>();\r\n private _usernameSelected = new Subject<User>();\r\n private _avatarSelected = new Subject<User>();\r\n private _source: ChatSourceBase;\r\n\r\n /**\r\n * Track whether we created this source. If we did not (ie it was passed in from the caller),\r\n * then we are not responsible for calling close(). If we do own it though, we will call close() \r\n * when we are done with it.\r\n */\r\n private _sourceIsOwned = false;\r\n private _subs = new Subscription();\r\n private _sortOrder: CommentsOrder = CommentsOrder.NEWEST;\r\n private _topicID: string;\r\n \r\n user: User;\r\n selectedMessage: ChatMessage;\r\n selectedMessageThread: ChatSourceBase;\r\n selectedMessageVisible = false;\r\n\r\n // Inputs\r\n\r\n @Input() signInLabel = 'Sign In';\r\n @Input() sendLabel = 'Send';\r\n @Input() replyLabel = 'Reply';\r\n @Input() sendingLabel = 'Sending';\r\n @Input() permissionDeniedLabel = 'Send';\r\n @Input() postCommentLabel = 'Post a comment';\r\n @Input() postReplyLabel = 'Post a reply';\r\n @Input() allowAttachments = true;\r\n @Input() fixedHeight: boolean;\r\n @Input() maxMessages: number;\r\n @Input() maxVisibleMessages: number = 20;\r\n @Input() genericAvatarUrl = `https://gravatar.com/avatar/${Date.now().toString(16)}?s=512&d=robohash`;\r\n\r\n @Input() shouldInterceptMessageSend?: (message: ChatMessage, source: ChatSourceBase) => boolean | Promise<boolean>;\r\n @Input() participants: User[] = [];\r\n\r\n private _sourceSubscription: Subscription;\r\n\r\n @Input()\r\n get source(): ChatSourceBase { return this._source; }\r\n set source(value) { \r\n if (this._source && this._sourceIsOwned) {\r\n this._source.close();\r\n this._sourceSubscription?.unsubscribe();\r\n this._source = null;\r\n this.participants = [];\r\n }\r\n\r\n this._source = value;\r\n this._sourceIsOwned = false; // Assume we don't own this source.\r\n this._sourceSubscription = new Subscription();\r\n \r\n if (value) {\r\n if (this.sharedCommentID) {\r\n this.navigateToSharedComment(this.sharedCommentID);\r\n this.lastSharedCommentID = this.sharedCommentID;\r\n this.sharedCommentID = null;\r\n }\r\n\r\n this._source.messages.forEach(m => this.addParticipant(m));\r\n\r\n this._sourceSubscription.add(this._source.messageReceived.subscribe(m => this.addParticipant(m)));\r\n this._sourceSubscription.add(this._source.messageSent.subscribe(m => this.addParticipant(m)));\r\n this._sourceSubscription.add(this._source.messageObserved.subscribe(m => this.addParticipant(m)));\r\n this._sourceSubscription.add(\r\n this._source.messageUpdated.subscribe(msg => {\r\n console.log(`comments received message: `, msg);\r\n if (msg.id === this.selectedMessage?.id && msg.hidden) {\r\n this.unselectMessage();\r\n this.matSnackBar.open(\r\n \"The thread you were viewing was removed.\",\r\n undefined,\r\n {\r\n duration: 2500\r\n }\r\n )\r\n }\r\n })\r\n );\r\n\r\n }\r\n }\r\n @Input() \r\n hashtags: HashTag[] = [\r\n {hashtag: 'error', description: 'Cause an error'},\r\n {hashtag: 'timeout', description: 'Cause a slow timeout error'},\r\n {hashtag: 'slow', description: 'Be slow when this message is posted'},\r\n ];\r\n @Input()\r\n get topicID(): string { return this._topicID; }\r\n set topicID(value) {\r\n if (this._topicID !== value) {\r\n this._topicID = value;\r\n setTimeout(() => this.setSourceFromTopicID(value));\r\n }\r\n }\r\n\r\n // Outputs\r\n\r\n @Output() get signInSelected(): Observable<void> { return this._signInSelected; }\r\n @Output() get editAvatarSelected() { return this._editAvatarSelected; }\r\n @Output() get permissionDeniedError(): Observable<string> { return this._permissionDeniedError; }\r\n @Output() get upvoted() { return this._upvoted.asObservable(); }\r\n @Output() get reported() { return this._reported.asObservable(); }\r\n @Output() get selected() { return this._selected.asObservable(); }\r\n @Output() get userSelected() { return this._userSelected.asObservable(); }\r\n @Output() get usernameSelected() { return this._usernameSelected.asObservable(); }\r\n @Output() get avatarSelected() { return this._avatarSelected.asObservable(); }\r\n @Output() get shared() { return this._shared.asObservable(); }\r\n\r\n get sortOrder() { return this._sortOrder; }\r\n set sortOrder(value) {\r\n if (this._sortOrder !== value) {\r\n this._sortOrder = value;\r\n setTimeout(() => {\r\n this.setSourceFromTopicID(this.topicID);\r\n });\r\n }\r\n }\r\n\r\n sendMessage: (message: ChatMessage) => void;\r\n sendReply: (message: ChatMessage) => void;\r\n\r\n // UI Interactions\r\n\r\n async scrollToComment(commentId: ChatMessage['id']) {\r\n if (typeof window === 'undefined')\r\n return;\r\n \r\n await this.commentView.waitForAllCommentsToLoad();\r\n\r\n const comment = document.querySelector(`[data-comment-id=\"${commentId}\"]`);\r\n if (comment) {\r\n comment.scrollIntoView({\r\n inline: 'center',\r\n block: 'center'\r\n });\r\n }\r\n }\r\n\r\n loadingSharedComment = false;\r\n sharedCommentMissing = false;\r\n\r\n async navigateToSharedComment(id: string) {\r\n this.loadingSharedComment = true;\r\n await new Promise(r => setTimeout(r, 10));\r\n this.sharedCommentMissing = false;\r\n let source = this.source;\r\n\r\n await source.ready;\r\n await this.viewReady;\r\n await this.loaded;\r\n \r\n console.log(`Navigating to shared comment with ID '${id}'...`);\r\n let message: ChatMessage;\r\n \r\n try {\r\n message = await this.source.get(id);\r\n } catch (e) {\r\n console.error(`Failed to find comment from URL: ${e.message}`);\r\n this.sharedCommentMissing = true;\r\n this.loadingSharedComment = false;\r\n\r\n if (typeof window !== 'undefined') {\r\n setTimeout(() => {\r\n let notice = this.element.querySelector('.loading-comment');\r\n notice.scrollIntoView({\r\n block: 'center',\r\n inline: 'center'\r\n });\r\n }, 200);\r\n }\r\n return;\r\n }\r\n\r\n message.transientState ??= {};\r\n\r\n // If there is a parent message, we should instead focus that and let the \r\n // scrollToComment and highlight do the work.\r\n\r\n if (message.parentMessageId) {\r\n\r\n let parentMessage = await this.source.get(message.parentMessageId);\r\n parentMessage.transientState ??= {};\r\n \r\n // Make sure that this message is loaded and visible to the user\r\n await this.commentView.loadMessageInContext(parentMessage);\r\n \r\n let thread = await this.selectMessage(parentMessage); \r\n\r\n // Need to re-retrieve the message within the new chat source to affect its\r\n // transient state.\r\n await thread.ready;\r\n \r\n // Make sure that this message is loaded and visible to the user\r\n await this.waitForThreadView();\r\n await this.threadView.loadMessageInContext(message);\r\n\r\n message = await thread.get(message.id);\r\n message.transientState ??= {};\r\n message.transientState.highlighted = true;\r\n console.dir(message);\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 500));\r\n\r\n } else {\r\n // Make sure that this message is loaded and visible to the user\r\n await this.commentView.loadMessageInContext(message);\r\n\r\n message.transientState ??= {};\r\n message.transientState.highlighted = true;\r\n }\r\n\r\n this.loadingSharedComment = false;\r\n await this.scrollToComment(id);\r\n }\r\n\r\n handlePermissionDenied(errorMessage: string) {\r\n // This is what other components call when handling permission errors\r\n \r\n if (errorMessage.startsWith(`app-handle|`)) {\r\n // If this is an error during authorizeAction on the backend, pass control to the user-provided \r\n // permission-denied handler.\r\n\r\n this.sendPermissionDenied(errorMessage.replace(/^app-handle\\|/, ''));\r\n return;\r\n }\r\n\r\n alert(errorMessage);\r\n }\r\n\r\n sendPermissionDenied(message: string) {\r\n this._permissionDeniedError.next(message);\r\n }\r\n\r\n scrollToMessage(message: ChatMessage) {\r\n let el = this.elementRef.nativeElement.querySelector(`[data-comment-id=\"${message.id}\"]`);\r\n if (!el)\r\n return;\r\n el.scrollIntoView({block: 'center', inline: 'start'});\r\n }\r\n\r\n private addParticipant(message: ChatMessage) {\r\n if (!message || !message.user || !message.user.id)\r\n return;\r\n\r\n let existing = this.participants.find(x => x.id === message.user.id);\r\n if (existing)\r\n return;\r\n this.participants.push(message.user);\r\n }\r\n\r\n // Actions\r\n\r\n async likeMessage(source: ChatSourceBase, message: ChatMessage) {\r\n if (!this.user) {\r\n await this.showSignIn();\r\n return;\r\n }\r\n\r\n this._upvoted.next(message);\r\n message.transientState.liking = true;\r\n \r\n try {\r\n await source.likeMessage(message.id);\r\n } catch (e) {\r\n this.handleBackendExceptionAsAlert(e, 'Could not like this message: ');\r\n } finally {\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 250));\r\n message.transientState.liking = false;\r\n }\r\n }\r\n\r\n async unlikeMessage(source: ChatSourceBase, message: ChatMessage) {\r\n if (!this.user) {\r\n await this.showSignIn();\r\n return;\r\n }\r\n\r\n this._upvoted.next(message);\r\n message.transientState.liking = true;\r\n\r\n if (message.userState?.liked)\r\n message.likes = (message.likes || 0) - 1;\r\n\r\n try {\r\n await source.unlikeMessage(message.id);\r\n } catch (e) {\r\n this.handleBackendExceptionAsAlert(e, 'Failed to unlike this message: ');\r\n }\r\n\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 250));\r\n message.transientState.liking = false;\r\n }\r\n\r\n async reportMessage(message: ChatMessage) {\r\n this._reported.next(message);\r\n }\r\n\r\n async unselectMessage() {\r\n let message = this.selectedMessage;\r\n\r\n this._selected.next(null);\r\n this.selectedMessage = null;\r\n if (this.selectedMessageThread) {\r\n if (this.selectedMessageThread.close)\r\n this.selectedMessageThread.close();\r\n this.selectedMessageThread = null;\r\n }\r\n\r\n if (message)\r\n setTimeout(() => this.scrollToMessage(message));\r\n }\r\n\r\n async toggleSelectedMessage(message: ChatMessage) {\r\n if (this.selectedMessage === message) {\r\n await this.unselectMessage();\r\n } else {\r\n await this.selectMessage(message);\r\n }\r\n }\r\n\r\n async selectMessage(message: ChatMessage) {\r\n if (this.selectedMessage === message) {\r\n console.log(`[Banta] Thread ${this.topicID}/${message.id} is already open.`);\r\n return this.selectedMessageThread;\r\n }\r\n\r\n this._selected.next(message);\r\n\r\n console.log(`[Banta] Opening thread for ${this.topicID}/${message.id}...`);\r\n let selectedMessageThread = await this.backend.getSourceForThread(this.topicID, message.id);\r\n\r\n if (!selectedMessageThread) {\r\n console.warn(`Failed to locate thread for message ${this.topicID}/${message.id}!`);\r\n return null;\r\n }\r\n\r\n console.log(`[Banta] Thread opened for ${this.topicID}/${message.id}.`);\r\n\r\n setTimeout(() => this.selectedMessageVisible = true);\r\n setTimeout(async () => {\r\n this.selectedMessage = message;\r\n this.selectedMessageThread = selectedMessageThread;\r\n }, 250);\r\n\r\n return selectedMessageThread;\r\n }\r\n\r\n async showSignIn() {\r\n this._signInSelected.next();\r\n }\r\n\r\n async showEditAvatar() {\r\n this._editAvatarSelected.next();\r\n }\r\n\r\n async selectMessageUser(message: ChatMessage) {\r\n this._userSelected.next(message);\r\n }\r\n\r\n async selectUsername(user: User) {\r\n this._usernameSelected.next(user);\r\n }\r\n\r\n async selectAvatar(user: User) {\r\n this._avatarSelected.next(user);\r\n }\r\n\r\n async shareMessage(message: ChatMessage) {\r\n this._shared.next(message);\r\n }\r\n\r\n async deleteMessage(message: ChatMessage) {\r\n if (!this.user) {\r\n await this.showSignIn();\r\n return;\r\n }\r\n\r\n if (!confirm(\"Are you sure you want to delete this comment? You cannot undo this action.\"))\r\n return;\r\n\r\n try {\r\n await this.source.deleteMessage(message.id);\r\n\r\n if (this.selectedMessage?.id === message.id)\r\n this.unselectMessage();\r\n\r\n } catch (e) {\r\n this.handleBackendExceptionAsAlert(e, `Could not delete message: `);\r\n }\r\n }\r\n\r\n async editMessage(source: ChatSourceBase, message: ChatMessage, newText: string) {\r\n if (!this.user) {\r\n await this.showSignIn();\r\n return;\r\n }\r\n\r\n try {\r\n await source.editMessage(message.id, newText);\r\n } catch (e) {\r\n this.handleBackendExceptionAsAlert(e, 'Could not edit this message: ');\r\n return;\r\n }\r\n\r\n message.message = newText;\r\n message.transientState.editing = false;\r\n }\r\n\r\n async startEditing(message: ChatMessage) {\r\n this.selectedMessage.transientState.editing = false;\r\n message.transientState.editing = true;\r\n }\r\n\r\n async saveEdit(message: ChatMessage, text: string) {\r\n if (!this.user) {\r\n await this.showSignIn();\r\n return;\r\n }\r\n \r\n try {\r\n await this.source.editMessage(message.id, text);\r\n message.transientState.editing = false;\r\n } catch (e) {\r\n this.handleBackendExceptionAsAlert(e, `Could not edit message: `);\r\n }\r\n }\r\n}\r\n","import { Component, Input, Output } from '@angular/core';\r\nimport { ChatMessage } from '@banta/common';\r\nimport { Subject, Observable } from 'rxjs';\r\nimport { ChatBackendBase } from '../chat-backend-base';\r\n\r\n@Component({\r\n selector: 'banta-live-comment',\r\n template: `\r\n <banta-comment \r\n *ngIf=\"message\"\r\n [message]=\"message\"\r\n (upvoted)=\"upvote()\"\r\n (reported)=\"report()\"\r\n (selected)=\"select()\"\r\n ></banta-comment>\r\n `,\r\n styles: [``]\r\n})\r\nexport class LiveCommentComponent {\r\n constructor(\r\n private backend : ChatBackendBase\r\n ) {\r\n\r\n }\r\n\r\n private _message : ChatMessage;\r\n private _upvoted = new Subject<void>();\r\n private _reported = new Subject<void>();\r\n private _selected = new Subject<void>();\r\n\r\n @Output()\r\n get upvoted() : Observable<void> {\r\n return this._upvoted;\r\n }\r\n \r\n @Output()\r\n get reported() : Observable<void> {\r\n return this._reported;\r\n }\r\n\r\n @Output()\r\n get selected() : Observable<void> {\r\n return this._selected;\r\n }\r\n \r\n @Input()\r\n get message() : ChatMessage {\r\n return this._message;\r\n }\r\n\r\n private unsubscribe : Function;\r\n\r\n set message(value) {\r\n let originalId = null;\r\n if (this._message)\r\n originalId = this._message.id;\r\n \r\n this._message = value;\r\n\r\n if (value && originalId === value.id) {\r\n return;\r\n }\r\n \r\n if (this.unsubscribe)\r\n this.unsubscribe();\r\n \r\n if (value) {\r\n this.unsubscribe = this.backend.watchMessage(value, message => this.message = message);\r\n }\r\n }\r\n\r\n report() {\r\n this._reported.next();\r\n }\r\n \r\n upvote() {\r\n this._upvoted.next();\r\n }\r\n\r\n select() {\r\n this._selected.next();\r\n }\r\n}","import { Component, ElementRef, HostBinding, Input, Output, ViewChild } from \"@angular/core\";\r\nimport { ChatMessage, ChatMessageAttachment, User } from \"@banta/common\";\r\nimport { Observable, Subject, Subscription } from \"rxjs\";\r\nimport { ChatBackendBase } from \"../../chat-backend-base\";\r\nimport { ChatSourceBase } from \"../../chat-source-base\";\r\nimport { AttachmentFragment } from \"../../attachment-scraper\";\r\nimport { EMOJIS } from \"../../emoji\";\r\n\r\nexport interface AutoCompleteOption {\r\n label : string;\r\n action? : () => void;\r\n}\r\n\r\nexport interface HashTag {\r\n hashtag : string;\r\n description : string;\r\n}\r\n\r\ninterface AttachmentFragmentState {\r\n fragment: AttachmentFragment;\r\n resolution: Promise<ChatMessageAttachment>;\r\n}\r\n\r\n@Component({\r\n selector: 'banta-comment-field',\r\n templateUrl: './comment-field.component.html',\r\n styleUrls: ['./comment-field.component.scss']\r\n})\r\nexport class CommentFieldComponent {\r\n constructor(private chatBackend: ChatBackendBase) {\r\n }\r\n\r\n private _source : ChatSourceBase;\r\n @Input() \r\n get source() : ChatSourceBase {\r\n return this._source;\r\n }\r\n\r\n set source(value) {\r\n if (this._source) {\r\n this._subs?.unsubscribe();\r\n this._source = null;\r\n }\r\n\r\n this._source = value;\r\n this._subs = new Subscription();\r\n if (this._source) {\r\n setTimeout(() => {\r\n if (this._source.connectionStateChanged) {\r\n this._subs.add(this._source.connectionStateChanged.subscribe(state => {\r\n if (state === 'lost') {\r\n this.transientMessage = `Reconnecting...`;\r\n } else if (state === 'restored') {\r\n this.transientMessage = undefined;\r\n } else if (state === 'connecting') {\r\n this.transientMessage = `Connecting...`;\r\n }\r\n }));\r\n }\r\n });\r\n }\r\n }\r\n\r\n private _subs = new Subscription();\r\n @Input() user : User;\r\n\r\n @HostBinding('class.can-comment')\r\n @Input() \r\n canComment = true;\r\n @Input() allowAttachments = false;\r\n\r\n @Output() signInSelected = new Subject<void>();\r\n @Output() editAvatarSelected = new Subject<void>();\r\n\r\n sending = false;\r\n sendError : Error;\r\n expandError = false;\r\n @Input() transientMessage: string;\r\n\r\n private _text : string = '';\r\n get text() {\r\n return this._text;\r\n }\r\n\r\n set text(value) {\r\n this._text = value;\r\n }\r\n\r\n @Input() sendLabel = 'Send';\r\n @Input() sendingLabel = 'Sending';\r\n @Input() label = 'Post a comment';\r\n @Input() permissionDeniedLabel = 'Unavailable';\r\n @Input() signInLabel = 'Sign In';\r\n @Input() maxLength = 1500;\r\n @Input() placeholder = '';\r\n @Output() textChanged = new Subject<void>();\r\n @Input() shouldInterceptMessageSend?: (message: ChatMessage, source: ChatSourceBase) => boolean | Promise<boolean>;\r\n\r\n @ViewChild('autocomplete') autocompleteEl : ElementRef<HTMLElement>;\r\n @ViewChild('autocompleteContainer') autocompleteContainerEl : ElementRef<HTMLElement>;\r\n @ViewChild('textarea') textareaEl : ElementRef<HTMLTextAreaElement>;\r\n\r\n @Input() hashtags : HashTag[];\r\n @Input() participants : User[] = [];\r\n @Input() genericAvatarUrl: string;\r\n\r\n get userAvatarUrl() {\r\n return this.user?.avatarUrl || this.genericAvatarUrl;\r\n }\r\n private _permissionDeniedError = new Subject<string>();\r\n\r\n @Output()\r\n get permissionDeniedError(): Observable<string> {\r\n return this._permissionDeniedError;\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (typeof window !== 'undefined') {\r\n let root = document.body.querySelector('[ng-version]') || document.body;\r\n root.appendChild(this.autocompleteEl.nativeElement);\r\n }\r\n }\r\n\r\n sendPermissionDenied(message: string) {\r\n this._permissionDeniedError.next(message);\r\n }\r\n\r\n showAutoComplete(options : AutoCompleteOption[]) {\r\n if (typeof window === 'undefined')\r\n return;\r\n \r\n this.autoCompleteSelected = 0;\r\n this.autocompleteOptions = options;\r\n let pos = this.autocompleteContainerEl.nativeElement.getBoundingClientRect();\r\n let size = this.autocompleteEl.nativeElement.getBoundingClientRect();\r\n\r\n this.autocompleteEl.nativeElement.style.left = `${window.scrollX + pos.left}px`;\r\n this.autocompleteEl.nativeElement.style.top = `${window.scrollY + pos.top}px`;\r\n this.autocompleteEl.nativeElement.style.width = `${pos.width}px`;\r\n this.autocompleteVisible = true;\r\n }\r\n\r\n autocompleteVisible = false;\r\n autocompleteOptions : AutoCompleteOption[] = [];\r\n\r\n activateAutoComplete(option : AutoCompleteOption) {\r\n option.action();\r\n this.dismissAutoComplete();\r\n }\r\n\r\n dismissAutoComplete() {\r\n this.autocompleteVisible = false;\r\n this.completionFunc = null;\r\n this.completionPrefix = '';\r\n }\r\n\r\n private errorTimeout;\r\n indicateError(message : string) {\r\n this.sendError = new Error(message);\r\n this.expandError = false;\r\n clearTimeout(this.errorTimeout);\r\n this.errorTimeout = setTimeout(() => {\r\n this.expandError = true;\r\n this.errorTimeout = setTimeout(() => {\r\n this.expandError = false;\r\n }, 5*1000);\r\n }, 100);\r\n\r\n // On mobile, just show an alert dialog\r\n if (typeof window !== 'undefined' && window.innerWidth < 430)\r\n alert(message);\r\n }\r\n\r\n completionFunc : (str : string) => AutoCompleteOption[];\r\n\r\n completionPrefix : string;\r\n autoCompleteSelected : number = 0;\r\n\r\n get isValidMessage() {\r\n return (this.text || this.chatMessageAttachments.length > 0);\r\n }\r\n\r\n get hasPendingAttachments() {\r\n return this.chatMessageAttachments.some(x => x.transientState);\r\n }\r\n\r\n get sendButtonEnabled() {\r\n if (!this.canComment) {\r\n // In this case, we want to enable the button because we want to be able to \r\n // send the permissionDenied message up to the host.\r\n return true;\r\n }\r\n\r\n return this.isValidMessage\r\n && !this.hasPendingAttachments\r\n && !this.sending\r\n ;\r\n }\r\n async autocomplete(replacement : string) {\r\n let el = this.textareaEl.nativeElement;\r\n this.text = this.text.slice(0, el.selectionStart - this.completionPrefix.length) + replacement + this.text.slice(el.selectionStart);\r\n }\r\n\r\n async insert(str : string) {\r\n let el = this.textareaEl.nativeElement;\r\n this.text = this.text.slice(0, el.selectionStart) + str + this.text.slice(el.selectionStart);\r\n }\r\n\r\n async onKeyDown(event : KeyboardEvent) {\r\n if (this.autocompleteVisible) {\r\n if (event.key === 'Escape') {\r\n this.dismissAutoComplete();\r\n return;\r\n }\r\n\r\n if (event.key === 'Shift') {\r\n return;\r\n }\r\n\r\n if (event.key === 'Enter') {\r\n if (this.autocompleteOptions[this.autoCompleteSelected]) {\r\n this.activateAutoComplete(this.autocompleteOptions[this.autoCompleteSelected]);\r\n event.stopPropagation();\r\n event.preventDefault();\r\n return;\r\n }\r\n }\r\n\r\n if (event.key === 'ArrowUp') {\r\n if (this.autoCompleteSelected === 0)\r\n this.autoCompleteSelected = this.autocompleteOptions.length - 1;\r\n else\r\n this.autoCompleteSelected = this.autoCompleteSelected - 1;\r\n event.stopPropagation();\r\n event.preventDefault();\r\n return;\r\n } else if (event.key === 'ArrowDown') {\r\n this.autoCompleteSelected = (this.autoCompleteSelected + 1) % this.autocompleteOptions.length;\r\n event.stopPropagation();\r\n event.preventDefault();\r\n return;\r\n }\r\n }\r\n\r\n if (event.key === 'Enter' && event.ctrlKey) {\r\n await this.sendMessage();\r\n return;\r\n }\r\n\r\n if (this.completionFunc) {\r\n if (event.key === 'Backspace') {\r\n this.completionPrefix = this.completionPrefix.slice(0, this.completionPrefix.length - 1);\r\n\r\n if (this.completionPrefix === '') {\r\n this.dismissAutoComplete();\r\n return;\r\n }\r\n } else if (event.key === ' ' || event.key.length > 1) {\r\n this.dismissAutoComplete();\r\n return;\r\n } else {\r\n this.completionPrefix += event.key;\r\n }\r\n\r\n this.showAutoComplete(this.completionFunc(this.completionPrefix));\r\n } else {\r\n if (event.key === ':') {\r\n this.startAutoComplete(event, prefix => {\r\n prefix = prefix.slice(1);\r\n\r\n // makes :-), :-( etc work (as they are \":)\" etc in the db)\r\n if (prefix.startsWith('-'))\r\n prefix = prefix.slice(1);\r\n\r\n return Object.keys(EMOJIS)\r\n .filter(k => k.includes(prefix) || EMOJIS[k].keywords.some(kw => kw.includes(prefix)))\r\n .map(k => ({\r\n label: `${EMOJIS[k].char} ${k}`,\r\n action: () => this.autocomplete(EMOJIS[k].char)\r\n }))\r\n .slice(0, 5)\r\n ;\r\n });\r\n } else if (event.key === '@') {\r\n this.startAutoComplete(event, prefix => {\r\n prefix = prefix.slice(1);\r\n return this.participants.filter(x => x.username.includes(prefix))\r\n .map(p => ({\r\n label: `@${p.username} -- ${p.displayName}`,\r\n action: () => this.autocomplete(`@${p.username}`)\r\n }))\r\n ;\r\n });\r\n } else if (event.key === '#') {\r\n this.startAutoComplete(event, prefix => {\r\n prefix = prefix.slice(1);\r\n\r\n return this.hashtags\r\n .filter(ht => ht.hashtag.includes(prefix))\r\n .map(ht => ({\r\n label: `#${ht.hashtag}${ht.description ? ` -- ${ht.description}` : ``}`,\r\n action: () => this.autocomplete(`#${ht.hashtag}`)\r\n }))\r\n .slice(0, 5)\r\n ;\r\n });\r\n }\r\n }\r\n }\r\n\r\n startAutoComplete(event : KeyboardEvent, completionFunc : (str : string) => AutoCompleteOption[]) {\r\n this.completionPrefix = event.key;\r\n this.completionFunc = completionFunc;\r\n this.showAutoComplete(this.completionFunc(this.completionPrefix));\r\n }\r\n\r\n onBlur() {\r\n setTimeout(() => this.dismissAutoComplete(), 250);\r\n }\r\n\r\n insertEmoji(text : string) {\r\n this.text += text;\r\n }\r\n\r\n showSignIn() {\r\n this.signInSelected.next();\r\n }\r\n\r\n showEditAvatar() {\r\n this.editAvatarSelected.next();\r\n }\r\n\r\n @Input()\r\n submit: (message: ChatMessage) => boolean;\r\n\r\n async sendMessage() {\r\n if (!this.source)\r\n return;\r\n\r\n this.sending = true;\r\n this.sendError = null;\r\n try {\r\n let text = (this.text || '').trim();\r\n\r\n if (this.canComment && !this.isValidMessage)\r\n return;\r\n\r\n let message : ChatMessage = {\r\n user: this.user,\r\n sentAt: Date.now(),\r\n url: typeof window !== 'undefined' ? location.href : undefined,\r\n likes: 0,\r\n message: text,\r\n attachments: this.chatMessageAttachments.filter(x => x.url)\r\n };\r\n\r\n try {\r\n await this.submit(message);\r\n this.text = '';\r\n this.chatMessageAttachments = [];\r\n } catch (e) {\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 1000));\r\n this.indicateError(e.message);\r\n }\r\n\r\n } finally {\r\n this.sending = false;\r\n setTimeout(() => {\r\n this.textareaEl.nativeElement.focus();\r\n }, 100);\r\n }\r\n }\r\n\r\n chatMessageAttachments: ChatMessageAttachment[] = [];\r\n\r\n addedAttachment(attachment: ChatMessageAttachment) {\r\n this.chatMessageAttachments.push(attachment);\r\n }\r\n\r\n attachmentError(attachment: ChatMessageAttachment) {\r\n setTimeout(() => {\r\n this.chatMessageAttachments = this.chatMessageAttachments.filter(x => x !== attachment);\r\n }, 3000);\r\n }\r\n\r\n\tremoveAttachment(attachment: ChatMessageAttachment) {\r\n let index = this.chatMessageAttachments.indexOf(attachment);\r\n if (index >= 0)\r\n\t\t this.chatMessageAttachments.splice(index, 1);\r\n\t}\r\n\r\n alertError() {\r\n if (!this.sendError)\r\n return;\r\n alert(this.sendError.message);\r\n }\r\n}\r\n","import { Component, Input, Output } from '@angular/core';\r\nimport { CommentsOrder } from \"@banta/common\";\r\nimport { Subject } from \"rxjs\";\r\n\r\n@Component({\r\n selector: 'banta-comment-sort',\r\n templateUrl: './comment-sort.component.html',\r\n styleUrls: ['./comment-sort.component.scss']\r\n})\r\nexport class CommentSortComponent {\r\n\r\n commentsOrder = CommentsOrder;\r\n private _sortChange = new Subject<CommentsOrder>();\r\n private _sort: CommentsOrder = CommentsOrder.LIKES;\r\n\r\n @Input() \r\n get sort() { \r\n return this._sort;\r\n }\r\n\r\n set sort(value) {\r\n if (this._sort !== value) {\r\n this._sort = value;\r\n setTimeout(() => this._sortChange.next(value));\r\n }\r\n }\r\n\r\n @Output()\r\n get sortChange() {\r\n return this._sortChange.asObservable();\r\n }\r\n}\r\n","import { Component, ElementRef, Output, ViewChild } from '@angular/core';\r\nimport { CDNProvider, ChatMessageAttachment } from '@banta/common';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'banta-attachment-button',\r\n templateUrl: './attachment-button.component.html',\r\n styleUrls: ['./attachment-button.component.scss']\r\n})\r\nexport class AttachmentButtonComponent {\r\n\r\n constructor(\r\n private cdnProvider: CDNProvider,\r\n ) {\r\n }\r\n\r\n private _addedAttachment = new Subject<ChatMessageAttachment>();\r\n private _attachmentError = new Subject<ChatMessageAttachment>();\r\n\r\n @ViewChild('fileUpload', { static: false }) fileInput: ElementRef;\r\n\r\n @Output() get addedAttachment() { return this._addedAttachment.asObservable(); }\r\n @Output() get attachmentError() { return this._attachmentError.asObservable(); }\r\n\r\n show() {\r\n (this.fileInput.nativeElement as HTMLInputElement).click();\r\n }\r\n\r\n async fileChange(event: Event): Promise<void> {\r\n const element = (event.currentTarget as HTMLInputElement);\r\n if (element.files.length) {\r\n console.log('[Banta] File Added to comment');\r\n const file = element.files[0];\r\n let publicURL: string;\r\n \r\n let attachment: ChatMessageAttachment = {\r\n type: file.type,\r\n url: undefined,\r\n transientState: {\r\n uploading: true,\r\n error: false,\r\n errorMessage: undefined\r\n }\r\n }\r\n\r\n this._addedAttachment.next(attachment);\r\n\r\n try {\r\n publicURL = await this.cdnProvider.uploadImage(file);\r\n } catch (e) {\r\n attachment.transientState.error = true;\r\n attachment.transientState.errorMessage = \"Failed to upload\";\r\n\r\n console.error(`[Banta] Caught an error while uploading image to CDN:`);\r\n console.error(e);\r\n alert(`Failed to upload image. Please try again later.`);\r\n\r\n this._attachmentError.next(attachment);\r\n return;\r\n }\r\n\r\n // If no URL was returned, then an error must have occurred. Presumably the CDN\r\n // provider has conveyed an error to the user.\r\n if (!publicURL)\r\n return;\r\n \r\n attachment.url = publicURL;\r\n attachment.transientState = undefined;\r\n }\r\n\r\n }\r\n\r\n}\r\n","import { Directive, ElementRef, Input, Output } from \"@angular/core\";\r\nimport { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { Subject } from \"rxjs\";\r\nimport { AttachmentFragment } from \"../attachment-scraper\";\r\nimport { ChatBackendBase } from \"../chat-backend-base\";\r\n\r\ninterface AttachmentFragmentState {\r\n fragment: AttachmentFragment;\r\n resolution: Promise<ChatMessageAttachment>;\r\n}\r\n\r\n@Directive({\r\n selector: '[attachmentScraper]'\r\n})\r\nexport class AttachmentScraperDirective {\r\n constructor(\r\n private elementRef: ElementRef<HTMLTextAreaElement>,\r\n private chatBackend: ChatBackendBase\r\n ) {\r\n }\r\n\r\n @Input() attachments: ChatMessageAttachment[] = [];\r\n @Output() attachmentsChange = new Subject<ChatMessageAttachment[]>();\r\n ngOnInit() {\r\n if (typeof window === 'undefined')\r\n return;\r\n \r\n this.element.addEventListener('keydown', () => {\r\n clearTimeout(this.scrapeTimeout);\r\n this.scrapeTimeout = setTimeout(() => this.scrape(), this.scrapeDebounce);\r\n });\r\n }\r\n\r\n get element() {\r\n return this.elementRef?.nativeElement;\r\n }\r\n\r\n get text() {\r\n return this.element.value;\r\n }\r\n\r\n\r\n private scrapeTimeout;\r\n private scrapeDebounce = 1500;\r\n private fragments = new Map<string, AttachmentFragmentState>();\r\n private scrape() {\r\n let message: ChatMessage = {\r\n likes: 0,\r\n message: this.text,\r\n sentAt: undefined,\r\n user: null,\r\n attachments: this.attachments\r\n };\r\n\r\n let foundFragments: string[] = [];\r\n\r\n for (let scraper of this.chatBackend.attachmentScrapers) {\r\n let fragments = scraper.findFragments(message);\r\n if (!fragments) {\r\n console.error(`Attachment fragment scraper ${scraper.constructor.name} is implemented incorrectly: Returned null instead of array`);\r\n continue;\r\n }\r\n for (let fragment of fragments) {\r\n foundFragments.push(fragment.text);\r\n if (!this.fragments.has(fragment.text)) {\r\n console.log(`Scraped new fragment:`);\r\n console.dir(fragment);\r\n this.fragments.set(fragment.text, {\r\n fragment,\r\n resolution: undefined\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Remove fragments that are no longer in the message.\r\n let removedFragments: string[] = [];\r\n for (let [key] of this.fragments) {\r\n if (!foundFragments.includes(key))\r\n removedFragments.push(key);\r\n }\r\n for (let removedFragment of removedFragments) {\r\n console.log(`Removed fragment: ${removedFragment}`);\r\n this.fragments.delete(removedFragment);\r\n }\r\n\r\n // Process any fragments that are not yet resolved (or being \r\n // resolved)\r\n\r\n for (let [key, state] of this.fragments) {\r\n if (state.resolution)\r\n continue;\r\n\r\n state.resolution = new Promise(async (resolve, reject) => {\r\n console.log(`Resolving fragment ${key}`);\r\n for (let resolver of this.chatBackend.attachmentResolvers) {\r\n console.log(`- Trying resolver ${resolver.constructor.name}...`);\r\n try {\r\n let attachment = await resolver.resolveFragment(message, state.fragment);\r\n if (attachment) {\r\n console.log(`Resolved fragment ${key} into attachment:`);\r\n console.dir(attachment);\r\n this.attachments.push(attachment);\r\n this.attachmentsChange.next(this.attachments.slice());\r\n resolve(attachment);\r\n break;\r\n }\r\n } catch (e) {\r\n console.error(`Caught error during attachment resolver ${resolver.constructor.name}:`);\r\n console.error(e);\r\n continue;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n}","import { NgModule } from '@angular/core';\r\nimport { CommentComponent } from './comment/comment.component';\r\nimport { CommentViewComponent } from './comment-view/comment-view.component';\r\nimport { BantaCommentsComponent } from './banta-comments/banta-comments.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { BantaCommonModule } from '../common';\r\nimport { LiveCommentComponent } from './live-comment.component';\r\nimport { EmojiModule } from '../emoji';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { TextFieldModule } from '@angular/cdk/text-field';\r\nimport { CommentFieldComponent } from './comment-field/comment-field.component';\r\nimport {MatTooltipModule} from '@angular/material/tooltip';\r\nimport {CommentSortComponent} from \"./comment-sort/comment-sort.component\";\r\nimport {MatSelectModule} from \"@angular/material/select\";\r\nimport { AttachmentButtonComponent } from './attachment-button/attachment-button.component';\r\nimport { BantaReplySendOptionsDirective } from './reply-send-options.directive';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport { PortalModule } from '@angular/cdk/portal';\r\nimport { AttachmentScraperDirective } from './attachment-scraper.directive';\r\n\r\nconst COMPONENTS = [\r\n CommentComponent,\r\n CommentViewComponent,\r\n BantaCommentsComponent,\r\n LiveCommentComponent,\r\n CommentFieldComponent,\r\n CommentSortComponent,\r\n AttachmentButtonComponent,\r\n BantaReplySendOptionsDirective,\r\n AttachmentScraperDirective\r\n];\r\n\r\n@NgModule({\r\n declarations: COMPONENTS,\r\n imports: [\r\n CommonModule,\r\n TextFieldModule,\r\n FormsModule,\r\n MatIconModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatButtonModule,\r\n MatMenuModule,\r\n MatProgressSpinnerModule,\r\n BantaCommonModule,\r\n EmojiModule,\r\n MatTooltipModule,\r\n MatSelectModule,\r\n OverlayModule,\r\n PortalModule\r\n ],\r\n exports: COMPONENTS\r\n})\r\nexport class CommentsModule {\r\n}\r\n","import { ChatMessage, ChatPermissions, CommentsOrder, DurableSocket, User } from \"@banta/common\";\r\nimport { Observable, Subject, Subscription } from \"rxjs\";\r\nimport { RpcEvent, SocketRPC } from \"@banta/common\";\r\nimport { ChatSourceBase } from \"./chat-source-base\";\r\nimport { ChatBackend } from \"./chat-backend\";\r\n\r\nexport class ChatSource extends SocketRPC implements ChatSourceBase {\r\n constructor(\r\n readonly backend: ChatBackend,\r\n readonly identifier: string,\r\n readonly parentIdentifier: string,\r\n readonly sortOrder: CommentsOrder\r\n ) {\r\n super();\r\n this.ready = new Promise<void>(resolve => this.markReady = resolve);\r\n }\r\n\r\n private subscription = new Subscription();\r\n private markReady: () => void;\r\n\r\n ready: Promise<void>;\r\n\r\n permissions: ChatPermissions;\r\n private _state: 'connected' | 'connecting' | 'lost' | 'restored' = 'connecting';\r\n\r\n get state() {\r\n return this._state;\r\n }\r\n\r\n set state(value) {\r\n this._state = value;\r\n setTimeout(() => this._connectionStateChanged.next(this._state));\r\n }\r\n\r\n private _connectionStateChanged = new Subject<'connected' | 'connecting' | 'lost' | 'restored'>();\r\n get connectionStateChanged() {\r\n return this._connectionStateChanged.asObservable();\r\n }\r\n\r\n async bind(socket: DurableSocket): Promise<this> {\r\n super.bind(socket);\r\n this.state = 'connected';\r\n this.markReady();\r\n\r\n await this.subscribeToTopic();\r\n this.subscription.add(this.backend.userChanged.subscribe(() => this.authenticate()));\r\n\r\n socket.addEventListener('open', async () => {\r\n this.state = 'connected';\r\n });\r\n\r\n socket.addEventListener('lost', async () => {\r\n this.state = 'lost';\r\n });\r\n\r\n socket.addEventListener('restore', async () => {\r\n this.state = 'restored';\r\n await this.authenticate();\r\n await this.subscribeToTopic();\r\n });\r\n\r\n return this;\r\n }\r\n\r\n private mapOrUpdateMessages(messages: ChatMessage[]): ChatMessage[] {\r\n return messages.map(message => this.mapOrUpdateMessage(message));\r\n }\r\n\r\n private mapOrUpdateMessage(message: ChatMessage): ChatMessage {\r\n let existingMessage = this.messageMap.get(message.id);\r\n if (existingMessage) {\r\n message = Object.assign(existingMessage, message);\r\n } else {\r\n this.messageMap.set(message.id, message);\r\n this._messageObserved.next(message);\r\n }\r\n\r\n return message;\r\n }\r\n\r\n async getExistingMessages(): Promise<ChatMessage[]> {\r\n let messages = await this.peer.getExistingMessages();\r\n messages = this.mapOrUpdateMessages(messages);\r\n return messages;\r\n }\r\n\r\n private async ensureConnection(errorMessage?: string) {\r\n let reason = `Connection to chat services is not currently available.`;\r\n if (this.state !== 'connected' && this.state !== 'restored') {\r\n if (errorMessage)\r\n throw new Error(`${errorMessage}: ${reason}`);\r\n else\r\n throw new Error(`${reason}`);\r\n }\r\n }\r\n\r\n async editMessage(messageId: string, text: string): Promise<void> {\r\n await this.ensureConnection();\r\n await this.peer.editMessage(messageId, text);\r\n }\r\n\r\n async subscribeToTopic() {\r\n await this.peer.subscribe(this.identifier, this.parentIdentifier, this.sortOrder);\r\n }\r\n\r\n async authenticate() {\r\n if (this.backend.user) {\r\n try {\r\n await this.peer.authenticate(this.backend.user?.token);\r\n } catch (e) {\r\n console.error(`Could not authenticate with Banta server:`);\r\n console.error(e);\r\n }\r\n }\r\n }\r\n\r\n close(): void {\r\n super.close();\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n @RpcEvent()\r\n onPermissions(permissions: ChatPermissions) {\r\n (window as any).bantaPermissionsDebug = permissions;\r\n this.permissions = permissions;\r\n }\r\n\r\n @RpcEvent()\r\n onChatMessage(message: ChatMessage) {\r\n if (this.messageMap.has(message.id)) {\r\n return this.mapOrUpdateMessage(message);\r\n } else if (!message.hidden) {\r\n // Only process non-hidden messages through here. \r\n // Hidden messages may be sent to us when they become hidden (ie moderation is occurring).\r\n // But if we never had the message to begin with, we should discard it.\r\n this.messageMap.set(message.id, message);\r\n this._messageReceived.next(message);\r\n }\r\n }\r\n\r\n private messageMap = new Map<string, ChatMessage>();\r\n private _messageReceived = new Subject<ChatMessage>();\r\n private _messageUpdated = new Subject<ChatMessage>();\r\n private _messageSent = new Subject<ChatMessage>();\r\n private _messageObserved = new Subject<ChatMessage>();\r\n\r\n get messageReceived() { return this._messageReceived.asObservable(); }\r\n get messageUpdated() { return this._messageUpdated.asObservable(); }\r\n get messageSent() { return this._messageSent.asObservable(); }\r\n get messageObserved() { return this._messageObserved.asObservable(); }\r\n\r\n messages: ChatMessage[] = [];\r\n\r\n async send(message: ChatMessage): Promise<ChatMessage> {\r\n await this.ensureConnection();\r\n return await this.peer.sendMessage(message);\r\n }\r\n\r\n async loadAfter(message: ChatMessage, count: number): Promise<ChatMessage[]> {\r\n if (!message)\r\n return;\r\n\r\n if (!message.pagingCursor)\r\n return [];\r\n \r\n return this.mapOrUpdateMessages(\r\n await this.peer.loadAfter(Number(message.pagingCursor), count)\r\n );\r\n }\r\n\r\n async get(id: string): Promise<ChatMessage> {\r\n if (this.messageMap.has(id))\r\n return this.messageMap.get(id);\r\n \r\n await this.ensureConnection(`Could not get message`);\r\n let message = await this.peer.getMessage(id);\r\n\r\n if (this.messageMap.has(id)) {\r\n let existingMessage = this.messageMap.get(id);\r\n Object.assign(existingMessage, message);\r\n message = existingMessage;\r\n } else {\r\n this.messageMap.set(id, message);\r\n }\r\n\r\n return message;\r\n }\r\n\r\n async getCount(): Promise<number> {\r\n return await this.peer.getCount();\r\n }\r\n\r\n async likeMessage(messageId: string): Promise<void> {\r\n await this.ensureConnection();\r\n return await this.peer.likeMessage(messageId);\r\n }\r\n\r\n async unlikeMessage(messageId: string): Promise<void> {\r\n await this.ensureConnection();\r\n return await this.peer.unlikeMessage(messageId);\r\n }\r\n\r\n async deleteMessage(messageId: string): Promise<void> {\r\n await this.ensureConnection();\r\n return await this.peer.deleteMessage(messageId);\r\n }\r\n\r\n}","import { InjectionToken } from \"@angular/core\";\r\n\r\nexport interface SdkOptions {\r\n serviceUrl?: string;\r\n}\r\n\r\nexport const BANTA_SDK_OPTIONS = 'BANTA_SDK_OPTIONS';","import { Inject, Injectable } from \"@angular/core\";\r\nimport { ChatMessage, CommentsOrder, DurableSocket, Notification, UrlCard, User, Vote } from \"@banta/common\";\r\nimport { Observable } from \"rxjs\";\r\nimport { ChatBackendBase, ChatSourceOptions } from \"./chat-backend-base\";\r\nimport { ChatSource } from \"./chat-source\";\r\nimport { ChatSourceBase } from \"./chat-source-base\";\r\nimport { BANTA_SDK_OPTIONS, SdkOptions } from \"./sdk-options\";\r\n\r\n@Injectable()\r\nexport class ChatBackend extends ChatBackendBase {\r\n constructor(\r\n @Inject(BANTA_SDK_OPTIONS) private options: SdkOptions\r\n ) {\r\n super();\r\n }\r\n\r\n get serviceUrl() {\r\n return `${this.options?.serviceUrl ?? 'http://localhost:3422'}`;\r\n }\r\n\r\n private async connectToService() {\r\n let socket = new DurableSocket(`${this.serviceUrl.replace(/^http/, 'ws')}/socket`);\r\n await new Promise<void>((resolve, reject) => {\r\n socket.onopen = () => {\r\n resolve();\r\n }\r\n\r\n socket.onclose = e => {\r\n if (e.code === 503) {\r\n console.error(`Failed to connect to chat service!`);\r\n reject(e);\r\n }\r\n }\r\n });\r\n\r\n socket.onerror = undefined;\r\n\r\n return socket;\r\n }\r\n\r\n async getSourceForTopic(topicId: string, options?: ChatSourceOptions): Promise<ChatSourceBase> {\r\n return await new ChatSource(this, topicId, undefined, options?.sortOrder || CommentsOrder.NEWEST)\r\n .bind(await this.connectToService());\r\n }\r\n\r\n async getSourceForThread(topicId: string, messageId: string, options?: ChatSourceOptions): Promise<ChatSource> {\r\n return await new ChatSource(this, topicId, messageId, options?.sortOrder || CommentsOrder.NEWEST)\r\n .bind(await this.connectToService());\r\n }\r\n\r\n async getSourceCountForTopic(topicId: string): Promise<number> {\r\n let response = await fetch(`${this.serviceUrl}/topics/${topicId}`)\r\n\r\n if (response.status >= 400)\r\n return 0;\r\n\r\n let topic = await response.json();\r\n return topic.messageCount || 0;\r\n }\r\n\r\n refreshMessage(message: ChatMessage): Promise<ChatMessage> {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n \r\n getMessage(topicId: string, messageId: string): Promise<ChatMessage> {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n getSubMessage(topicId: string, parentMessageId: string, messageId: string): Promise<ChatMessage> {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n watchMessage(message: ChatMessage, handler: (message: ChatMessage) => void): () => void {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n notificationsChanged: Observable<Notification[]>;\r\n newNotification: Observable<Notification>;\r\n \r\n async getCardForUrl(url: string): Promise<UrlCard> {\r\n let response = await fetch(`${this.serviceUrl}/urls`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify({\r\n url\r\n })\r\n });\r\n\r\n if (response.status == 404)\r\n return null;\r\n \r\n if (response.status >= 400)\r\n throw new Error(`Failed to retrieve URL card: ${response.status}. Body: '${await response.text()}'`);\r\n\r\n return await response.json();\r\n }\r\n}","import { Injectable } from \"@angular/core\";\r\nimport { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { AttachmentFragment, AttachmentResolver, AttachmentScraper } from \"./attachment-scraper\";\r\nimport { ChatBackendBase } from \"./chat-backend-base\";\r\n\r\nconst URL_REGEX = new RegExp('(?!mailto:)(?:(?:http|https|ftp)://)(?:\\\\S+(?::\\\\S*)?@)?(?:(?:(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}(?:\\\\.(?:[0-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))|(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]+-?)*[a-z\\\\u00a1-\\\\uffff0-9]+)(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]+-?)*[a-z\\\\u00a1-\\\\uffff0-9]+)*(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,})))|localhost)(?::\\\\d{2,5})?(?:(/|\\\\?|#)[^\\\\s]*)?', 'ig');\r\n\r\nexport class UrlAttachmentScraper implements AttachmentScraper {\r\n findFragments(message: ChatMessage): AttachmentFragment[] {\r\n // If a message already has a URL attachment, don't add another one.\r\n if (message.attachments && message.attachments.filter(x => x.type === 'url').length > 0)\r\n return null;\r\n\r\n return (Array.from(message.message.match(URL_REGEX) ?? []))\r\n .reduce((a, item) => (a.includes(item) ? undefined : a.push(item), a), [])\r\n .map(url => ({\r\n text: url, \r\n offset: message.message.indexOf(url),\r\n type: 'url'\r\n }))\r\n ;\r\n }\r\n}\r\n\r\n@Injectable()\r\nexport class UrlAttachmentResolver implements AttachmentResolver {\r\n constructor(private backend: ChatBackendBase) {\r\n }\r\n\r\n async resolveFragment(message: ChatMessage, fragment: AttachmentFragment): Promise<ChatMessageAttachment> {\r\n if (fragment.type !== 'url')\r\n return null;\r\n\r\n let urlCard = await this.backend.getCardForUrl(fragment.text);\r\n if (urlCard) {\r\n return {\r\n type: 'card',\r\n url: fragment.text,\r\n card: urlCard,\r\n style: 'block'\r\n }\r\n }\r\n }\r\n\r\n}","import { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { AttachmentFragment, AttachmentResolver } from \"./attachment-scraper\";\r\n\r\nexport class YouTubeAttachmentResolver implements AttachmentResolver {\r\n async resolveFragment(message: ChatMessage, fragment: AttachmentFragment): Promise<ChatMessageAttachment> {\r\n if (fragment.type !== 'url')\r\n return null;\r\n\r\n let videoId: string;\r\n\r\n if (fragment.text.match(/https?:\\/\\/(www\\.|m\\.)?youtube.com\\/watch\\?v=/)) {\r\n let match = /watch\\?v=([^&]+)/.exec(fragment.text);\r\n if (match) {\r\n videoId = match[1];\r\n }\r\n }\r\n\r\n if (videoId) {\r\n return {\r\n type: 'iframe',\r\n url: `https://www.youtube.com/embed/${videoId}`,\r\n style: 'block'\r\n };\r\n }\r\n return null;\r\n }\r\n}\r\n","import { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { AttachmentFragment, AttachmentResolver } from \"./attachment-scraper\";\r\n\r\nexport class GiphyAttachmentResolver implements AttachmentResolver {\r\n async resolveFragment(message: ChatMessage, fragment: AttachmentFragment): Promise<ChatMessageAttachment> {\r\n if (fragment.type === 'url' && fragment.text.startsWith('https://giphy.com/gifs')) {\r\n let gifId = /[^-\\/]+$/.exec(fragment.text)?.toString();\r\n if (!gifId)\r\n return null;\r\n\r\n return {\r\n type: 'iframe',\r\n url: `https://giphy.com/embed/${gifId}`,\r\n style: 'inline'\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n}","import { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { AttachmentFragment, AttachmentResolver } from \"./attachment-scraper\";\r\n\r\nexport class TweetAttachmentResolver implements AttachmentResolver {\r\n async resolveFragment(message: ChatMessage, fragment: AttachmentFragment): Promise<ChatMessageAttachment> {\r\n if (fragment.type === 'url' && fragment.text.startsWith('https://twitter.com/')) {\r\n return {\r\n type: 'tweet',\r\n url: fragment.text,\r\n style: 'block'\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n}","import { ModuleWithProviders, NgModule } from '@angular/core';\r\nimport { CommentsModule } from './comments';\r\nimport { ChatModule } from './chat';\r\nimport { EmojiModule } from './emoji';\r\nimport { BantaComponent } from './banta/banta.component';\r\nimport { BantaLogoComponent } from './banta-logo.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { BantaCommonModule } from './common/common.module';\r\nimport { LiveMessageComponent } from './live-message.component';\r\nimport { MatButtonModule } from \"@angular/material/button\";\r\nimport { MatIconModule } from \"@angular/material/icon\";\r\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\r\nimport { MatMenuModule } from \"@angular/material/menu\";\r\nimport { MatDialogModule } from \"@angular/material/dialog\";\r\nimport { MatSnackBarModule } from \"@angular/material/snack-bar\";\r\nimport { MatFormFieldModule } from \"@angular/material/form-field\";\r\nimport { MatInputModule } from \"@angular/material/input\";\r\nimport { MatProgressSpinnerModule } from \"@angular/material/progress-spinner\";\r\nimport { ChatBackend } from './chat-backend';\r\nimport { SdkOptions } from './sdk-options';\r\nimport { BANTA_SDK_OPTIONS } from './sdk-options';\r\nimport { ChatBackendBase } from './chat-backend-base';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport { PortalModule } from '@angular/cdk/portal';\r\nimport { UrlAttachmentResolver, UrlAttachmentScraper } from './url-attachments';\r\nimport { YouTubeAttachmentResolver } from './youtube-attachments';\r\nimport { GiphyAttachmentResolver } from './giphy-attachments';\r\nimport { TweetAttachmentResolver } from './tweet-attachments';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n BantaCommonModule,\r\n CommentsModule,\r\n ChatModule,\r\n EmojiModule,\r\n \r\n MatIconModule,\r\n MatButtonModule,\r\n MatTooltipModule,\r\n MatMenuModule,\r\n MatDialogModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatProgressSpinnerModule,\r\n MatSnackBarModule,\r\n OverlayModule,\r\n PortalModule\r\n ],\r\n declarations: [\r\n BantaComponent,\r\n BantaLogoComponent,\r\n LiveMessageComponent\r\n ],\r\n exports: [\r\n BantaComponent,\r\n BantaLogoComponent,\r\n LiveMessageComponent,\r\n BantaCommonModule,\r\n ChatModule,\r\n CommentsModule,\r\n EmojiModule\r\n ]\r\n})\r\nexport class BantaSdkModule {\r\n constructor(\r\n chatBackend: ChatBackendBase\r\n ) {\r\n if (typeof window !== 'undefined') {\r\n if (!document.querySelector('script[src=\"https://platform.twitter.com/widgets.js\"]')) {\r\n let script = document.createElement('script');\r\n script.src = 'https://platform.twitter.com/widgets.js';\r\n script.async = true;\r\n document.body.appendChild(script);\r\n }\r\n }\r\n\r\n chatBackend.registerAttachmentScraper(new UrlAttachmentScraper());\r\n chatBackend.registerAttachmentResolver(new GiphyAttachmentResolver());\r\n chatBackend.registerAttachmentResolver(new YouTubeAttachmentResolver());\r\n chatBackend.registerAttachmentResolver(new TweetAttachmentResolver());\r\n chatBackend.registerAttachmentResolver(new UrlAttachmentResolver(chatBackend));\r\n }\r\n \r\n static configure(options?: SdkOptions): ModuleWithProviders<BantaSdkModule> {\r\n return {\r\n ngModule: BantaSdkModule,\r\n providers: [\r\n { \r\n provide: BANTA_SDK_OPTIONS, \r\n useValue: options || {}\r\n },\r\n { provide: ChatBackendBase, useClass: ChatBackend }\r\n ]\r\n }\r\n }\r\n}","import { Subject, Observable, ConnectableObservable } from 'rxjs';\r\nimport { publish } from 'rxjs/operators';\r\n\r\nexport interface LazyConnectionOptions<T> {\r\n start : (subject : Subject<T>) => void;\r\n stop : () => void;\r\n}\r\n\r\nexport function lazyConnection<T>(options : LazyConnectionOptions<T>): Observable<T> {\r\n\r\n let obs = new Observable(observer => {\r\n let subject = new Subject<T>();\r\n let subscription = subject.subscribe(observer);\r\n\r\n options.start(subject);\r\n return () => {\r\n subscription.unsubscribe();\r\n options.stop();\r\n };\r\n });\r\n \r\n return (<ConnectableObservable<T>>obs.pipe(publish())).refCount();\r\n}"]}
|