From 89c1fe9fca712b188aba21eee3a5893db7acac95 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 22 Feb 2021 17:44:19 -0700 Subject: [PATCH 001/380] Add emoji list --- assets/emojis.js | 11931 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 11931 insertions(+) create mode 100644 assets/emojis.js diff --git a/assets/emojis.js b/assets/emojis.js new file mode 100644 index 000000000000..ef2fb85cf459 --- /dev/null +++ b/assets/emojis.js @@ -0,0 +1,11931 @@ +// This list is generated from the code here https://github.com/amurani/unicode-emoji-list + +const emojis = { + 'Smileys & People': [ + { + code: 'U+1F600', + keywords: [ + 'face', + 'grin', + ], + }, + { + code: 'U+1F601', + keywords: [ + 'eye', + 'face', + 'grin', + 'smile', + ], + }, + { + code: 'U+1F602', + keywords: [ + 'face', + 'joy', + 'laugh', + 'tear', + ], + }, + { + code: 'U+1F923', + keywords: [ + 'face', + 'floor', + 'laugh', + 'lol', + 'rofl', + 'rolling', + ], + }, + { + code: 'U+1F603', + keywords: [ + 'face', + 'mouth', + 'open', + 'smile', + ], + }, + { + code: 'U+1F604', + keywords: [ + 'eye', + 'face', + 'mouth', + 'open', + 'smile', + ], + }, + { + code: 'U+1F605', + keywords: [ + 'cold', + 'face', + 'open', + 'smile', + 'sweat', + ], + }, + { + code: 'U+1F606', + keywords: [ + 'face', + 'laugh', + 'mouth', + 'open', + 'satisfied', + 'smile', + ], + }, + { + code: 'U+1F609', + keywords: [ + 'face', + 'wink', + ], + }, + { + code: 'U+1F60A', + keywords: [ + 'blush', + 'eye', + 'face', + 'smile', + ], + }, + { + code: 'U+1F60B', + keywords: [ + 'delicious', + 'face', + 'savouring', + 'smile', + 'um', + 'yum', + ], + }, + { + code: 'U+1F60E', + keywords: [ + 'bright', + 'cool', + 'eye', + 'eyewear', + 'face', + 'glasses', + 'smile', + 'sun', + 'sunglasses', + 'weather', + ], + }, + { + code: 'U+1F60D', + keywords: [ + 'eye', + 'face', + 'heart', + 'love', + 'smile', + ], + }, + { + code: 'U+1F618', + keywords: [ + 'face', + 'heart', + 'kiss', + ], + }, + { + code: 'U+1F617', + keywords: [ + 'face', + 'kiss', + ], + }, + { + code: 'U+1F619', + keywords: [ + 'eye', + 'face', + 'kiss', + 'smile', + ], + }, + { + code: 'U+1F61A', + keywords: [ + 'closed', + 'eye', + 'face', + 'kiss', + ], + }, + { + code: 'U+263A', + keywords: [ + 'face', + 'outlined', + 'relaxed', + 'smile', + ], + }, + { + code: 'U+1F642', + keywords: [ + 'face', + 'smile', + ], + }, + { + code: 'U+1F917', + keywords: [ + 'face', + 'hug', + 'hugging', + ], + }, + { + code: 'U+1F914', + keywords: [ + 'face', + 'thinking', + ], + }, + { + code: 'U+1F610', + keywords: [ + 'deadpan', + 'face', + 'neutral', + ], + }, + { + code: 'U+1F611', + keywords: [ + 'expressionless', + 'face', + 'inexpressive', + 'unexpressive', + ], + }, + { + code: 'U+1F636', + keywords: [ + 'face', + 'mouth', + 'quiet', + 'silent', + ], + }, + { + code: 'U+1F644', + keywords: [ + 'eyes', + 'face', + 'rolling', + ], + }, + { + code: 'U+1F60F', + keywords: [ + 'face', + 'smirk', + ], + }, + { + code: 'U+1F623', + keywords: [ + 'face', + 'persevere', + ], + }, + { + code: 'U+1F625', + keywords: [ + 'disappointed', + 'face', + 'relieved', + 'whew', + ], + }, + { + code: 'U+1F62E', + keywords: [ + 'face', + 'mouth', + 'open', + 'sympathy', + ], + }, + { + code: 'U+1F910', + keywords: [ + 'face', + 'mouth', + 'zipper', + ], + }, + { + code: 'U+1F62F', + keywords: [ + 'face', + 'hushed', + 'stunned', + 'surprised', + ], + }, + { + code: 'U+1F62A', + keywords: [ + 'face', + 'sleep', + ], + }, + { + code: 'U+1F62B', + keywords: [ + 'face', + 'tired', + ], + }, + { + code: 'U+1F634', + keywords: [ + 'face', + 'sleep', + 'zzz', + ], + }, + { + code: 'U+1F60C', + keywords: [ + 'face', + 'relieved', + ], + }, + { + code: 'U+1F913', + keywords: [ + 'face', + 'geek', + 'nerd', + ], + }, + { + code: 'U+1F61B', + keywords: [ + 'face', + 'tongue', + ], + }, + { + code: 'U+1F61C', + keywords: [ + 'eye', + 'face', + 'joke', + 'tongue', + 'wink', + ], + }, + { + code: 'U+1F61D', + keywords: [ + 'eye', + 'face', + 'horrible', + 'taste', + 'tongue', + ], + }, + { + code: 'U+1F924', + keywords: [ + 'drooling', + 'face', + ], + }, + { + code: 'U+1F612', + keywords: [ + 'face', + 'unamused', + 'unhappy', + ], + }, + { + code: 'U+1F613', + keywords: [ + 'cold', + 'face', + 'sweat', + ], + }, + { + code: 'U+1F614', + keywords: [ + 'dejected', + 'face', + 'pensive', + ], + }, + { + code: 'U+1F615', + keywords: [ + 'confused', + 'face', + ], + }, + { + code: 'U+1F643', + keywords: [ + 'face', + 'upside-down', + ], + }, + { + code: 'U+1F911', + keywords: [ + 'face', + 'money', + 'mouth', + ], + }, + { + code: 'U+1F632', + keywords: [ + 'astonished', + 'face', + 'shocked', + 'totally', + ], + }, + { + code: 'U+2639', + keywords: [ + 'face', + 'frown', + ], + }, + { + code: 'U+1F641', + keywords: [ + 'face', + 'frown', + ], + }, + { + code: 'U+1F616', + keywords: [ + 'confounded', + 'face', + ], + }, + { + code: 'U+1F61E', + keywords: [ + 'disappointed', + 'face', + ], + }, + { + code: 'U+1F61F', + keywords: [ + 'face', + 'worried', + ], + }, + { + code: 'U+1F624', + keywords: [ + 'face', + 'triumph', + 'won', + ], + }, + { + code: 'U+1F622', + keywords: [ + 'cry', + 'face', + 'sad', + 'tear', + ], + }, + { + code: 'U+1F62D', + keywords: [ + 'cry', + 'face', + 'sad', + 'sob', + 'tear', + ], + }, + { + code: 'U+1F626', + keywords: [ + 'face', + 'frown', + 'mouth', + 'open', + ], + }, + { + code: 'U+1F627', + keywords: [ + 'anguished', + 'face', + ], + }, + { + code: 'U+1F628', + keywords: [ + 'face', + 'fear', + 'fearful', + 'scared', + ], + }, + { + code: 'U+1F629', + keywords: [ + 'face', + 'tired', + 'weary', + ], + }, + { + code: 'U+1F62C', + keywords: [ + 'face', + 'grimace', + ], + }, + { + code: 'U+1F630', + keywords: [ + 'blue', + 'cold', + 'face', + 'mouth', + 'open', + 'rushed', + 'sweat', + ], + }, + { + code: 'U+1F631', + keywords: [ + 'face', + 'fear', + 'fearful', + 'munch', + 'scared', + 'scream', + ], + }, + { + code: 'U+1F633', + keywords: [ + 'dazed', + 'face', + 'flushed', + ], + }, + { + code: 'U+1F635', + keywords: [ + 'dizzy', + 'face', + ], + }, + { + code: 'U+1F621', + keywords: [ + 'angry', + 'face', + 'mad', + 'pouting', + 'rage', + 'red', + ], + }, + { + code: 'U+1F620', + keywords: [ + 'angry', + 'face', + 'mad', + ], + }, + { + code: 'U+1F607', + keywords: [ + 'angel', + 'face', + 'fairy tale', + 'fantasy', + 'halo', + 'innocent', + 'smile', + ], + }, + { + code: 'U+1F920', + keywords: [ + 'cowboy', + 'cowgirl', + 'face', + 'hat', + ], + }, + { + code: 'U+1F921', + keywords: [ + 'clown', + 'face', + ], + }, + { + code: 'U+1F925', + keywords: [ + 'face', + 'lie', + 'pinocchio', + ], + }, + { + code: 'U+1F637', + keywords: [ + 'cold', + 'doctor', + 'face', + 'mask', + 'medicine', + 'sick', + ], + }, + { + code: 'U+1F912', + keywords: [ + 'face', + 'ill', + 'sick', + 'thermometer', + ], + }, + { + code: 'U+1F915', + keywords: [ + 'bandage', + 'face', + 'hurt', + 'injury', + ], + }, + { + code: 'U+1F922', + keywords: [ + 'face', + 'nauseated', + 'vomit', + ], + }, + { + code: 'U+1F927', + keywords: [ + 'face', + 'gesundheit', + 'sneeze', + ], + }, + { + code: 'U+1F608', + keywords: [ + 'face', + 'fairy tale', + 'fantasy', + 'horns', + 'smile', + ], + }, + { + code: 'U+1F47F', + keywords: [ + 'demon', + 'devil', + 'face', + 'fairy tale', + 'fantasy', + 'imp', + ], + }, + { + code: 'U+1F479', + keywords: [ + 'creature', + 'face', + 'fairy tale', + 'fantasy', + 'japanese', + 'monster', + 'ogre', + ], + }, + { + code: 'U+1F47A', + keywords: [ + 'creature', + 'face', + 'fairy tale', + 'fantasy', + 'goblin', + 'japanese', + 'monster', + ], + }, + { + code: 'U+1F480', + keywords: [ + 'body', + 'death', + 'face', + 'fairy tale', + 'monster', + 'skull', + ], + }, + { + code: 'U+2620', + keywords: [ + 'body', + 'crossbones', + 'death', + 'face', + 'monster', + 'skull', + ], + }, + { + code: 'U+1F47B', + keywords: [ + 'creature', + 'face', + 'fairy tale', + 'fantasy', + 'ghost', + 'monster', + ], + }, + { + code: 'U+1F47D', + keywords: [ + 'alien', + 'creature', + 'extraterrestrial', + 'face', + 'fairy tale', + 'fantasy', + 'monster', + 'space', + 'ufo', + ], + }, + { + code: 'U+1F47E', + keywords: [ + 'alien', + 'creature', + 'extraterrestrial', + 'face', + 'fairy tale', + 'fantasy', + 'monster', + 'space', + 'ufo', + ], + }, + { + code: 'U+1F916', + keywords: [ + 'face', + 'monster', + 'robot', + ], + }, + { + code: 'U+1F4A9', + keywords: [ + 'comic', + 'dung', + 'face', + 'monster', + 'poo', + 'poop', + ], + }, + { + code: 'U+1F63A', + keywords: [ + 'cat', + 'face', + 'mouth', + 'open', + 'smile', + ], + }, + { + code: 'U+1F638', + keywords: [ + 'cat', + 'eye', + 'face', + 'grin', + 'smile', + ], + }, + { + code: 'U+1F639', + keywords: [ + 'cat', + 'face', + 'joy', + 'tear', + ], + }, + { + code: 'U+1F63B', + keywords: [ + 'cat', + 'eye', + 'face', + 'heart', + 'love', + 'smile', + ], + }, + { + code: 'U+1F63C', + keywords: [ + 'cat', + 'face', + 'ironic', + 'smile', + 'wry', + ], + }, + { + code: 'U+1F63D', + keywords: [ + 'cat', + 'eye', + 'face', + 'kiss', + ], + }, + { + code: 'U+1F640', + keywords: [ + 'cat', + 'face', + 'oh', + 'surprised', + 'weary', + ], + }, + { + code: 'U+1F63F', + keywords: [ + 'cat', + 'cry', + 'face', + 'sad', + 'tear', + ], + }, + { + code: 'U+1F63E', + keywords: [ + 'cat', + 'face', + 'pouting', + ], + }, + { + code: 'U+1F648', + keywords: [ + 'evil', + 'face', + 'forbidden', + 'gesture', + 'monkey', + 'no', + 'not', + 'prohibited', + 'see', + ], + }, + { + code: 'U+1F649', + keywords: [ + 'evil', + 'face', + 'forbidden', + 'gesture', + 'hear', + 'monkey', + 'no', + 'not', + 'prohibited', + ], + }, + { + code: 'U+1F64A', + keywords: [ + 'evil', + 'face', + 'forbidden', + 'gesture', + 'monkey', + 'no', + 'not', + 'prohibited', + 'speak', + ], + }, + { + code: 'U+1F466', + keywords: [ + 'boy', + ], + types: [ + 'U+1F466 U+1F3FF', + 'U+1F466 U+1F3FE', + 'U+1F466 U+1F3FD', + 'U+1F466 U+1F3FC', + 'U+1F466 U+1F3FB', + ], + }, + { + code: 'U+1F467', + keywords: [ + 'girl', + 'maiden', + 'virgin', + 'virgo', + 'zodiac', + ], + types: [ + 'U+1F467 U+1F3FF', + 'U+1F467 U+1F3FE', + 'U+1F467 U+1F3FD', + 'U+1F467 U+1F3FC', + 'U+1F467 U+1F3FB', + ], + }, + { + code: 'U+1F468', + keywords: [ + 'man', + ], + types: [ + 'U+1F468 U+1F3FF', + 'U+1F468 U+1F3FE', + 'U+1F468 U+1F3FD', + 'U+1F468 U+1F3FC', + 'U+1F468 U+1F3FB', + ], + }, + { + code: 'U+1F469', + keywords: [ + 'woman', + ], + types: [ + 'U+1F469 U+1F3FF', + 'U+1F469 U+1F3FE', + 'U+1F469 U+1F3FD', + 'U+1F469 U+1F3FC', + 'U+1F469 U+1F3FB', + ], + }, + { + code: 'U+1F474', + keywords: [ + 'man', + 'old', + ], + types: [ + 'U+1F474 U+1F3FF', + 'U+1F474 U+1F3FE', + 'U+1F474 U+1F3FD', + 'U+1F474 U+1F3FC', + 'U+1F474 U+1F3FB', + ], + }, + { + code: 'U+1F475', + keywords: [ + 'old', + 'woman', + ], + types: [ + 'U+1F475 U+1F3FF', + 'U+1F475 U+1F3FE', + 'U+1F475 U+1F3FD', + 'U+1F475 U+1F3FC', + 'U+1F475 U+1F3FB', + ], + }, + { + code: 'U+1F476', + keywords: [ + 'baby', + ], + types: [ + 'U+1F476 U+1F3FF', + 'U+1F476 U+1F3FE', + 'U+1F476 U+1F3FD', + 'U+1F476 U+1F3FC', + 'U+1F476 U+1F3FB', + ], + }, + { + code: 'U+1F47C', + keywords: [ + 'angel', + 'baby', + 'face', + 'fairy tale', + 'fantasy', + ], + types: [ + 'U+1F47C U+1F3FF', + 'U+1F47C U+1F3FE', + 'U+1F47C U+1F3FD', + 'U+1F47C U+1F3FC', + 'U+1F47C U+1F3FB', + ], + }, + { + code: 'U+1F471', + keywords: [ + 'blond', + ], + types: [ + 'U+1F471 U+1F3FF', + 'U+1F471 U+1F3FE', + 'U+1F471 U+1F3FD', + 'U+1F471 U+1F3FC', + 'U+1F471 U+1F3FB', + ], + }, + { + code: 'U+1F46E', + keywords: [ + 'cop', + 'officer', + 'police', + ], + types: [ + 'U+1F46E U+1F3FF', + 'U+1F46E U+1F3FE', + 'U+1F46E U+1F3FD', + 'U+1F46E U+1F3FC', + 'U+1F46E U+1F3FB', + ], + }, + { + code: 'U+1F472', + keywords: [ + 'gua pi mao', + 'hat', + 'man', + ], + types: [ + 'U+1F472 U+1F3FF', + 'U+1F472 U+1F3FE', + 'U+1F472 U+1F3FD', + 'U+1F472 U+1F3FC', + 'U+1F472 U+1F3FB', + ], + }, + { + code: 'U+1F473', + keywords: [ + 'man', + 'turban', + ], + types: [ + 'U+1F473 U+1F3FF', + 'U+1F473 U+1F3FE', + 'U+1F473 U+1F3FD', + 'U+1F473 U+1F3FC', + 'U+1F473 U+1F3FB', + ], + }, + { + code: 'U+1F477', + keywords: [ + 'construction', + 'hat', + 'worker', + ], + types: [ + 'U+1F477 U+1F3FF', + 'U+1F477 U+1F3FE', + 'U+1F477 U+1F3FD', + 'U+1F477 U+1F3FC', + 'U+1F477 U+1F3FB', + ], + }, + { + code: 'U+1F478', + keywords: [ + 'fairy tale', + 'fantasy', + 'princess', + ], + types: [ + 'U+1F478 U+1F3FF', + 'U+1F478 U+1F3FE', + 'U+1F478 U+1F3FD', + 'U+1F478 U+1F3FC', + 'U+1F478 U+1F3FB', + ], + }, + { + code: 'U+1F934', + keywords: [ + 'prince', + ], + types: [ + 'U+1F934 U+1F3FF', + 'U+1F934 U+1F3FE', + 'U+1F934 U+1F3FD', + 'U+1F934 U+1F3FC', + 'U+1F934 U+1F3FB', + ], + }, + { + code: 'U+1F482', + keywords: [ + 'guard', + 'guardsman', + ], + types: [ + 'U+1F482 U+1F3FF', + 'U+1F482 U+1F3FE', + 'U+1F482 U+1F3FD', + 'U+1F482 U+1F3FC', + 'U+1F482 U+1F3FB', + ], + }, + { + code: 'U+1F575', + keywords: [ + 'detective', + 'sleuth', + 'spy', + ], + types: [ + 'U+1F575 U+1F3FF', + 'U+1F575 U+1F3FE', + 'U+1F575 U+1F3FD', + 'U+1F575 U+1F3FC', + 'U+1F575 U+1F3FB', + ], + }, + { + code: 'U+1F385', + keywords: [ + 'activity', + 'celebration', + 'christmas', + 'fairy tale', + 'fantasy', + 'father', + 'santa', + ], + types: [ + 'U+1F385 U+1F3FF', + 'U+1F385 U+1F3FE', + 'U+1F385 U+1F3FD', + 'U+1F385 U+1F3FC', + 'U+1F385 U+1F3FB', + ], + }, + { + code: 'U+1F936', + keywords: [ + 'christmas', + 'mother', + 'mrs. claus', + ], + types: [ + 'U+1F936 U+1F3FF', + 'U+1F936 U+1F3FE', + 'U+1F936 U+1F3FD', + 'U+1F936 U+1F3FC', + 'U+1F936 U+1F3FB', + ], + }, + { + code: 'U+1F470', + keywords: [ + 'bride', + 'veil', + 'wedding', + ], + types: [ + 'U+1F470 U+1F3FF', + 'U+1F470 U+1F3FE', + 'U+1F470 U+1F3FD', + 'U+1F470 U+1F3FC', + 'U+1F470 U+1F3FB', + ], + }, + { + code: 'U+1F935', + keywords: [ + 'groom', + 'man', + 'tuxedo', + ], + types: [ + 'U+1F935 U+1F3FF', + 'U+1F935 U+1F3FE', + 'U+1F935 U+1F3FD', + 'U+1F935 U+1F3FC', + 'U+1F935 U+1F3FB', + ], + }, + { + code: 'U+1F486', + keywords: [ + 'massage', + 'salon', + ], + types: [ + 'U+1F486 U+1F3FF', + 'U+1F486 U+1F3FE', + 'U+1F486 U+1F3FD', + 'U+1F486 U+1F3FC', + 'U+1F486 U+1F3FB', + ], + }, + { + code: 'U+1F487', + keywords: [ + 'barber', + 'beauty', + 'haircut', + 'parlor', + ], + types: [ + 'U+1F487 U+1F3FF', + 'U+1F487 U+1F3FE', + 'U+1F487 U+1F3FD', + 'U+1F487 U+1F3FC', + 'U+1F487 U+1F3FB', + ], + }, + { + code: 'U+1F64D', + keywords: [ + 'frown', + 'gesture', + ], + types: [ + 'U+1F64D U+1F3FF', + 'U+1F64D U+1F3FE', + 'U+1F64D U+1F3FD', + 'U+1F64D U+1F3FC', + 'U+1F64D U+1F3FB', + ], + }, + { + code: 'U+1F64E', + keywords: [ + 'gesture', + 'pouting', + ], + types: [ + 'U+1F64E U+1F3FF', + 'U+1F64E U+1F3FE', + 'U+1F64E U+1F3FD', + 'U+1F64E U+1F3FC', + 'U+1F64E U+1F3FB', + ], + }, + { + code: 'U+1F645', + keywords: [ + 'forbidden', + 'gesture', + 'hand', + 'no', + 'not', + 'prohibited', + ], + types: [ + 'U+1F645 U+1F3FF', + 'U+1F645 U+1F3FE', + 'U+1F645 U+1F3FD', + 'U+1F645 U+1F3FC', + 'U+1F645 U+1F3FB', + ], + }, + { + code: 'U+1F646', + keywords: [ + 'gesture', + 'hand', + 'ok', + ], + types: [ + 'U+1F646 U+1F3FF', + 'U+1F646 U+1F3FE', + 'U+1F646 U+1F3FD', + 'U+1F646 U+1F3FC', + 'U+1F646 U+1F3FB', + ], + }, + { + code: 'U+1F481', + keywords: [ + 'hand', + 'help', + 'information', + 'sassy', + ], + types: [ + 'U+1F481 U+1F3FF', + 'U+1F481 U+1F3FE', + 'U+1F481 U+1F3FD', + 'U+1F481 U+1F3FC', + 'U+1F481 U+1F3FB', + ], + }, + { + code: 'U+1F937', + keywords: [ + 'doubt', + 'ignorance', + 'indifference', + 'shrug', + ], + types: [ + 'U+1F937 U+1F3FF', + 'U+1F937 U+1F3FE', + 'U+1F937 U+1F3FD', + 'U+1F937 U+1F3FC', + 'U+1F937 U+1F3FB', + ], + }, + { + code: 'U+1F64B', + keywords: [ + 'gesture', + 'hand', + 'happy', + 'raised', + ], + types: [ + 'U+1F64B U+1F3FF', + 'U+1F64B U+1F3FE', + 'U+1F64B U+1F3FD', + 'U+1F64B U+1F3FC', + 'U+1F64B U+1F3FB', + ], + }, + { + code: 'U+1F926', + keywords: [ + 'disbelief', + 'exasperation', + 'face', + 'palm', + ], + types: [ + 'U+1F926 U+1F3FF', + 'U+1F926 U+1F3FE', + 'U+1F926 U+1F3FD', + 'U+1F926 U+1F3FC', + 'U+1F926 U+1F3FB', + ], + }, + { + code: 'U+1F647', + keywords: [ + 'apology', + 'bow', + 'gesture', + 'sorry', + ], + types: [ + 'U+1F647 U+1F3FF', + 'U+1F647 U+1F3FE', + 'U+1F647 U+1F3FD', + 'U+1F647 U+1F3FC', + 'U+1F647 U+1F3FB', + ], + }, + { + code: 'U+1F6B6', + keywords: [ + 'hike', + 'pedestrian', + 'walk', + 'walking', + ], + types: [ + 'U+1F6B6 U+1F3FF', + 'U+1F6B6 U+1F3FE', + 'U+1F6B6 U+1F3FD', + 'U+1F6B6 U+1F3FC', + 'U+1F6B6 U+1F3FB', + ], + }, + { + code: 'U+1F3C3', + keywords: [ + 'marathon', + 'runner', + 'running', + ], + types: [ + 'U+1F3C3 U+1F3FF', + 'U+1F3C3 U+1F3FE', + 'U+1F3C3 U+1F3FD', + 'U+1F3C3 U+1F3FC', + 'U+1F3C3 U+1F3FB', + ], + }, + { + code: 'U+1F483', + keywords: [ + 'dancer', + ], + types: [ + 'U+1F483 U+1F3FF', + 'U+1F483 U+1F3FE', + 'U+1F483 U+1F3FD', + 'U+1F483 U+1F3FC', + 'U+1F483 U+1F3FB', + ], + }, + { + code: 'U+1F57A', + keywords: [ + 'dance', + 'man', + ], + types: [ + 'U+1F57A U+1F3FF', + 'U+1F57A U+1F3FE', + 'U+1F57A U+1F3FD', + 'U+1F57A U+1F3FC', + 'U+1F57A U+1F3FB', + ], + }, + { + code: 'U+1F930', + keywords: [ + 'pregnant', + 'woman', + ], + types: [ + 'U+1F930 U+1F3FF', + 'U+1F930 U+1F3FE', + 'U+1F930 U+1F3FD', + 'U+1F930 U+1F3FC', + 'U+1F930 U+1F3FB', + ], + }, + { + code: 'U+1F46F', + keywords: [ + 'bunny', + 'dancer', + 'ear', + 'girl', + 'woman', + ], + }, + { + code: 'U+1F574', + keywords: [ + 'business', + 'man', + 'suit', + ], + }, + { + code: 'U+1F5E3', + keywords: [ + 'face', + 'head', + 'silhouette', + 'speak', + 'speaking', + ], + }, + { + code: 'U+1F464', + keywords: [ + 'bust', + 'silhouette', + ], + }, + { + code: 'U+1F465', + keywords: [ + 'bust', + 'silhouette', + ], + }, + { + code: 'U+1F46B', + keywords: [ + 'couple', + 'hand', + 'hold', + 'man', + 'woman', + ], + }, + { + code: 'U+1F46C', + keywords: [ + 'couple', + 'gemini', + 'hand', + 'hold', + 'man', + 'twins', + 'zodiac', + ], + }, + { + code: 'U+1F46D', + keywords: [ + 'couple', + 'hand', + 'hold', + 'woman', + ], + }, + { + code: 'U+1F48F', + keywords: [ + 'couple', + 'kiss', + 'romance', + ], + }, + { + code: 'U+1F469 U+200D U+2764 U+FE0F U+200D U+1F48B U+200D U+1F468', + keywords: [ + 'kiss', + 'man', + 'woman', + ], + }, + { + code: 'U+1F468 U+200D U+2764 U+FE0F U+200D U+1F48B U+200D U+1F468', + keywords: [ + 'kiss', + 'man', + ], + }, + { + code: 'U+1F469 U+200D U+2764 U+FE0F U+200D U+1F48B U+200D U+1F469', + keywords: [ + 'kiss', + 'woman', + ], + }, + { + code: 'U+1F491', + keywords: [ + 'couple', + 'heart', + 'love', + 'romance', + ], + }, + { + code: 'U+1F469 U+200D U+2764 U+FE0F U+200D U+1F468', + keywords: [ + 'couple', + 'man', + 'woman', + ], + }, + { + code: 'U+1F468 U+200D U+2764 U+FE0F U+200D U+1F468', + keywords: [ + 'couple', + 'man', + ], + }, + { + code: 'U+1F469 U+200D U+2764 U+FE0F U+200D U+1F469', + keywords: [ + 'couple', + 'woman', + ], + }, + { + code: 'U+1F46A', + keywords: [ + 'child', + 'family', + 'father', + 'mother', + ], + }, + { + code: 'U+1F468 U+200D U+1F469 U+200D U+1F466', + keywords: [ + 'boy', + 'family', + 'man', + 'woman', + ], + }, + { + code: 'U+1F468 U+200D U+1F469 U+200D U+1F467', + keywords: [ + 'family', + 'girl', + 'man', + 'woman', + ], + }, + { + code: 'U+1F468 U+200D U+1F469 U+200D U+1F467 U+200D U+1F466', + keywords: [ + 'boy', + 'family', + 'girl', + 'man', + 'woman', + ], + }, + { + code: 'U+1F468 U+200D U+1F469 U+200D U+1F466 U+200D U+1F466', + keywords: [ + 'boy', + 'family', + 'man', + 'woman', + ], + }, + { + code: 'U+1F468 U+200D U+1F469 U+200D U+1F467 U+200D U+1F467', + keywords: [ + 'family', + 'girl', + 'man', + 'woman', + ], + }, + { + code: 'U+1F468 U+200D U+1F468 U+200D U+1F466', + keywords: [ + 'boy', + 'family', + 'man', + ], + }, + { + code: 'U+1F468 U+200D U+1F468 U+200D U+1F467', + keywords: [ + 'family', + 'girl', + 'man', + ], + }, + { + code: 'U+1F468 U+200D U+1F468 U+200D U+1F467 U+200D U+1F466', + keywords: [ + 'boy', + 'family', + 'girl', + 'man', + ], + }, + { + code: 'U+1F468 U+200D U+1F468 U+200D U+1F466 U+200D U+1F466', + keywords: [ + 'boy', + 'family', + 'man', + ], + }, + { + code: 'U+1F468 U+200D U+1F468 U+200D U+1F467 U+200D U+1F467', + keywords: [ + 'family', + 'girl', + 'man', + ], + }, + { + code: 'U+1F469 U+200D U+1F469 U+200D U+1F466', + keywords: [ + 'boy', + 'family', + 'woman', + ], + }, + { + code: 'U+1F469 U+200D U+1F469 U+200D U+1F467', + keywords: [ + 'family', + 'girl', + 'woman', + ], + }, + { + code: 'U+1F469 U+200D U+1F469 U+200D U+1F467 U+200D U+1F466', + keywords: [ + 'boy', + 'family', + 'girl', + 'woman', + ], + }, + { + code: 'U+1F469 U+200D U+1F469 U+200D U+1F466 U+200D U+1F466', + keywords: [ + 'boy', + 'family', + 'woman', + ], + }, + { + code: 'U+1F469 U+200D U+1F469 U+200D U+1F467 U+200D U+1F467', + keywords: [ + 'family', + 'girl', + 'woman', + ], + }, + { + code: 'U+1F3FB', + keywords: [ + 'emoji modifier', + 'fitzpatrick', + 'skin', + 'tone', + ], + }, + { + code: 'U+1F3FC', + keywords: [ + 'emoji modifier', + 'fitzpatrick', + 'skin', + 'tone', + ], + }, + { + code: 'U+1F3FD', + keywords: [ + 'emoji modifier', + 'fitzpatrick', + 'skin', + 'tone', + ], + }, + { + code: 'U+1F3FE', + keywords: [ + 'emoji modifier', + 'fitzpatrick', + 'skin', + 'tone', + ], + }, + { + code: 'U+1F3FF', + keywords: [ + 'emoji modifier', + 'fitzpatrick', + 'skin', + 'tone', + ], + }, + { + code: 'U+1F4AA', + keywords: [ + 'biceps', + 'body', + 'comic', + 'flex', + 'muscle', + ], + types: [ + 'U+1F4AA U+1F3FF', + 'U+1F4AA U+1F3FE', + 'U+1F4AA U+1F3FD', + 'U+1F4AA U+1F3FC', + 'U+1F4AA U+1F3FB', + ], + }, + { + code: 'U+1F933', + keywords: [ + 'camera', + 'phone', + 'selfie', + ], + types: [ + 'U+1F933 U+1F3FF', + 'U+1F933 U+1F3FE', + 'U+1F933 U+1F3FD', + 'U+1F933 U+1F3FC', + 'U+1F933 U+1F3FB', + ], + }, + { + code: 'U+1F448', + keywords: [ + 'backhand', + 'body', + 'finger', + 'hand', + 'index', + 'point', + ], + types: [ + 'U+1F448 U+1F3FF', + 'U+1F448 U+1F3FE', + 'U+1F448 U+1F3FD', + 'U+1F448 U+1F3FC', + 'U+1F448 U+1F3FB', + ], + }, + { + code: 'U+1F449', + keywords: [ + 'backhand', + 'body', + 'finger', + 'hand', + 'index', + 'point', + ], + types: [ + 'U+1F449 U+1F3FF', + 'U+1F449 U+1F3FE', + 'U+1F449 U+1F3FD', + 'U+1F449 U+1F3FC', + 'U+1F449 U+1F3FB', + ], + }, + { + code: 'U+261D', + keywords: [ + 'body', + 'finger', + 'hand', + 'index', + 'point', + 'up', + ], + types: [ + 'U+261D U+1F3FF', + 'U+261D U+1F3FE', + 'U+261D U+1F3FD', + 'U+261D U+1F3FC', + 'U+261D U+1F3FB', + ], + }, + { + code: 'U+1F446', + keywords: [ + 'backhand', + 'body', + 'finger', + 'hand', + 'index', + 'point', + 'up', + ], + types: [ + 'U+1F446 U+1F3FF', + 'U+1F446 U+1F3FE', + 'U+1F446 U+1F3FD', + 'U+1F446 U+1F3FC', + 'U+1F446 U+1F3FB', + ], + }, + { + code: 'U+1F595', + keywords: [ + 'body', + 'finger', + 'hand', + 'middle finger', + ], + types: [ + 'U+1F595 U+1F3FF', + 'U+1F595 U+1F3FE', + 'U+1F595 U+1F3FD', + 'U+1F595 U+1F3FC', + 'U+1F595 U+1F3FB', + ], + }, + { + code: 'U+1F447', + keywords: [ + 'backhand', + 'body', + 'down', + 'finger', + 'hand', + 'index', + 'point', + ], + types: [ + 'U+1F447 U+1F3FF', + 'U+1F447 U+1F3FE', + 'U+1F447 U+1F3FD', + 'U+1F447 U+1F3FC', + 'U+1F447 U+1F3FB', + ], + }, + { + code: 'U+270C', + keywords: [ + 'body', + 'hand', + 'v', + 'victory', + ], + types: [ + 'U+270C U+1F3FF', + 'U+270C U+1F3FE', + 'U+270C U+1F3FD', + 'U+270C U+1F3FC', + 'U+270C U+1F3FB', + ], + }, + { + code: 'U+1F91E', + keywords: [ + 'cross', + 'finger', + 'hand', + 'luck', + ], + types: [ + 'U+1F91E U+1F3FF', + 'U+1F91E U+1F3FE', + 'U+1F91E U+1F3FD', + 'U+1F91E U+1F3FC', + 'U+1F91E U+1F3FB', + ], + }, + { + code: 'U+1F596', + keywords: [ + 'body', + 'finger', + 'hand', + 'spock', + 'vulcan', + ], + types: [ + 'U+1F596 U+1F3FF', + 'U+1F596 U+1F3FE', + 'U+1F596 U+1F3FD', + 'U+1F596 U+1F3FC', + 'U+1F596 U+1F3FB', + ], + }, + { + code: 'U+1F918', + keywords: [ + 'body', + 'finger', + 'hand', + 'horns', + 'rock-on', + ], + types: [ + 'U+1F918 U+1F3FF', + 'U+1F918 U+1F3FE', + 'U+1F918 U+1F3FD', + 'U+1F918 U+1F3FC', + 'U+1F918 U+1F3FB', + ], + }, + { + code: 'U+1F919', + keywords: [ + 'call', + 'hand', + ], + types: [ + 'U+1F919 U+1F3FF', + 'U+1F919 U+1F3FE', + 'U+1F919 U+1F3FD', + 'U+1F919 U+1F3FC', + 'U+1F919 U+1F3FB', + ], + }, + { + code: 'U+1F590', + keywords: [ + 'body', + 'finger', + 'hand', + 'splayed', + ], + types: [ + 'U+1F590 U+1F3FF', + 'U+1F590 U+1F3FE', + 'U+1F590 U+1F3FD', + 'U+1F590 U+1F3FC', + 'U+1F590 U+1F3FB', + ], + }, + { + code: 'U+270B', + keywords: [ + 'body', + 'hand', + ], + types: [ + 'U+270B U+1F3FF', + 'U+270B U+1F3FE', + 'U+270B U+1F3FD', + 'U+270B U+1F3FC', + 'U+270B U+1F3FB', + ], + }, + { + code: 'U+1F44C', + keywords: [ + 'body', + 'hand', + 'ok', + ], + types: [ + 'U+1F44C U+1F3FF', + 'U+1F44C U+1F3FE', + 'U+1F44C U+1F3FD', + 'U+1F44C U+1F3FC', + 'U+1F44C U+1F3FB', + ], + }, + { + code: 'U+1F44D', + keywords: [ + '+1', + 'body', + 'hand', + 'thumb', + 'thumbs up', + 'up', + ], + types: [ + 'U+1F44D U+1F3FF', + 'U+1F44D U+1F3FE', + 'U+1F44D U+1F3FD', + 'U+1F44D U+1F3FC', + 'U+1F44D U+1F3FB', + ], + }, + { + code: 'U+1F44E', + keywords: [ + '-1', + 'body', + 'down', + 'hand', + 'thumb', + 'thumbs down', + ], + types: [ + 'U+1F44E U+1F3FF', + 'U+1F44E U+1F3FE', + 'U+1F44E U+1F3FD', + 'U+1F44E U+1F3FC', + 'U+1F44E U+1F3FB', + ], + }, + { + code: 'U+270A', + keywords: [ + 'body', + 'clenched', + 'fist', + 'hand', + 'punch', + ], + types: [ + 'U+270A U+1F3FF', + 'U+270A U+1F3FE', + 'U+270A U+1F3FD', + 'U+270A U+1F3FC', + 'U+270A U+1F3FB', + ], + }, + { + code: 'U+1F44A', + keywords: [ + 'body', + 'clenched', + 'fist', + 'hand', + 'punch', + ], + types: [ + 'U+1F44A U+1F3FF', + 'U+1F44A U+1F3FE', + 'U+1F44A U+1F3FD', + 'U+1F44A U+1F3FC', + 'U+1F44A U+1F3FB', + ], + }, + { + code: 'U+1F91B', + keywords: [ + 'fist', + 'leftwards', + ], + types: [ + 'U+1F91B U+1F3FF', + 'U+1F91B U+1F3FE', + 'U+1F91B U+1F3FD', + 'U+1F91B U+1F3FC', + 'U+1F91B U+1F3FB', + ], + }, + { + code: 'U+1F91C', + keywords: [ + 'fist', + 'rightwards', + ], + types: [ + 'U+1F91C U+1F3FF', + 'U+1F91C U+1F3FE', + 'U+1F91C U+1F3FD', + 'U+1F91C U+1F3FC', + 'U+1F91C U+1F3FB', + ], + }, + { + code: 'U+1F91A', + keywords: [ + 'backhand', + 'raised', + ], + types: [ + 'U+1F91A U+1F3FF', + 'U+1F91A U+1F3FE', + 'U+1F91A U+1F3FD', + 'U+1F91A U+1F3FC', + 'U+1F91A U+1F3FB', + ], + }, + { + code: 'U+1F44B', + keywords: [ + 'body', + 'hand', + 'wave', + 'waving', + ], + types: [ + 'U+1F44B U+1F3FF', + 'U+1F44B U+1F3FE', + 'U+1F44B U+1F3FD', + 'U+1F44B U+1F3FC', + 'U+1F44B U+1F3FB', + ], + }, + { + code: 'U+1F44F', + keywords: [ + 'body', + 'clap', + 'hand', + ], + types: [ + 'U+1F44F U+1F3FF', + 'U+1F44F U+1F3FE', + 'U+1F44F U+1F3FD', + 'U+1F44F U+1F3FC', + 'U+1F44F U+1F3FB', + ], + }, + { + code: 'U+270D', + keywords: [ + 'body', + 'hand', + 'write', + ], + types: [ + 'U+270D U+1F3FF', + 'U+270D U+1F3FE', + 'U+270D U+1F3FD', + 'U+270D U+1F3FC', + 'U+270D U+1F3FB', + ], + }, + { + code: 'U+1F450', + keywords: [ + 'body', + 'hand', + 'open', + ], + types: [ + 'U+1F450 U+1F3FF', + 'U+1F450 U+1F3FE', + 'U+1F450 U+1F3FD', + 'U+1F450 U+1F3FC', + 'U+1F450 U+1F3FB', + ], + }, + { + code: 'U+1F64C', + keywords: [ + 'body', + 'celebration', + 'gesture', + 'hand', + 'hooray', + 'raised', + ], + types: [ + 'U+1F64C U+1F3FF', + 'U+1F64C U+1F3FE', + 'U+1F64C U+1F3FD', + 'U+1F64C U+1F3FC', + 'U+1F64C U+1F3FB', + ], + }, + { + code: 'U+1F64F', + keywords: [ + 'ask', + 'body', + 'bow', + 'folded', + 'gesture', + 'hand', + 'please', + 'pray', + 'thanks', + ], + types: [ + 'U+1F64F U+1F3FF', + 'U+1F64F U+1F3FE', + 'U+1F64F U+1F3FD', + 'U+1F64F U+1F3FC', + 'U+1F64F U+1F3FB', + ], + }, + { + code: 'U+1F91D', + keywords: [ + 'agreement', + 'hand', + 'handshake', + 'meeting', + 'shake', + ], + types: [ + 'U+1F91D U+1F3FF', + 'U+1F91D U+1F3FE', + 'U+1F91D U+1F3FD', + 'U+1F91D U+1F3FC', + 'U+1F91D U+1F3FB', + ], + }, + { + code: 'U+1F485', + keywords: [ + 'body', + 'care', + 'cosmetics', + 'manicure', + 'nail', + 'polish', + ], + types: [ + 'U+1F485 U+1F3FF', + 'U+1F485 U+1F3FE', + 'U+1F485 U+1F3FD', + 'U+1F485 U+1F3FC', + 'U+1F485 U+1F3FB', + ], + }, + { + code: 'U+1F442', + keywords: [ + 'body', + 'ear', + ], + types: [ + 'U+1F442 U+1F3FF', + 'U+1F442 U+1F3FE', + 'U+1F442 U+1F3FD', + 'U+1F442 U+1F3FC', + 'U+1F442 U+1F3FB', + ], + }, + { + code: 'U+1F443', + keywords: [ + 'body', + 'nose', + ], + types: [ + 'U+1F443 U+1F3FF', + 'U+1F443 U+1F3FE', + 'U+1F443 U+1F3FD', + 'U+1F443 U+1F3FC', + 'U+1F443 U+1F3FB', + ], + }, + { + code: 'U+1F463', + keywords: [ + 'body', + 'clothing', + 'footprint', + 'print', + ], + }, + { + code: 'U+1F440', + keywords: [ + 'body', + 'eye', + 'face', + ], + }, + { + code: 'U+1F441', + keywords: [ + 'body', + 'eye', + ], + }, + { + code: 'U+1F441 U+200D U+1F5E8', + keywords: [ + 'bubble', + 'eye', + 'speech', + 'witness', + ], + }, + { + code: 'U+1F445', + keywords: [ + 'body', + 'tongue', + ], + }, + { + code: 'U+1F444', + keywords: [ + 'body', + 'lips', + 'mouth', + ], + }, + { + code: 'U+1F48B', + keywords: [ + 'heart', + 'kiss', + 'lips', + 'mark', + 'romance', + ], + }, + { + code: 'U+1F498', + keywords: [ + 'arrow', + 'cupid', + 'heart', + 'romance', + ], + }, + { + code: 'U+2764', + keywords: [ + 'heart', + ], + }, + { + code: 'U+1F493', + keywords: [ + 'beating', + 'heart', + 'heartbeat', + 'pulsating', + ], + }, + { + code: 'U+1F494', + keywords: [ + 'break', + 'broken', + 'heart', + ], + }, + { + code: 'U+1F495', + keywords: [ + 'heart', + 'love', + ], + }, + { + code: 'U+1F496', + keywords: [ + 'excited', + 'heart', + 'sparkle', + ], + }, + { + code: 'U+1F497', + keywords: [ + 'excited', + 'growing', + 'heart', + 'heartpulse', + 'nervous', + ], + }, + { + code: 'U+1F499', + keywords: [ + 'blue', + 'heart', + ], + }, + { + code: 'U+1F49A', + keywords: [ + 'green', + 'heart', + ], + }, + { + code: 'U+1F49B', + keywords: [ + 'heart', + 'yellow', + ], + }, + { + code: 'U+1F49C', + keywords: [ + 'heart', + 'purple', + ], + }, + { + code: 'U+1F5A4', + keywords: [ + 'black', + 'evil', + 'heart', + 'wicked', + ], + }, + { + code: 'U+1F49D', + keywords: [ + 'heart', + 'ribbon', + 'valentine', + ], + }, + { + code: 'U+1F49E', + keywords: [ + 'heart', + 'revolving', + ], + }, + { + code: 'U+1F49F', + keywords: [ + 'heart', + ], + }, + { + code: 'U+2763', + keywords: [ + 'exclamation', + 'heart', + 'mark', + 'punctuation', + ], + }, + { + code: 'U+1F48C', + keywords: [ + 'heart', + 'letter', + 'love', + 'mail', + 'romance', + ], + }, + { + code: 'U+1F4A4', + keywords: [ + 'comic', + 'sleep', + 'zzz', + ], + }, + { + code: 'U+1F4A2', + keywords: [ + 'angry', + 'comic', + 'mad', + ], + }, + { + code: 'U+1F4A3', + keywords: [ + 'bomb', + 'comic', + ], + }, + { + code: 'U+1F4A5', + keywords: [ + 'boom', + 'collision', + 'comic', + ], + }, + { + code: 'U+1F4A6', + keywords: [ + 'comic', + 'splashing', + 'sweat', + ], + }, + { + code: 'U+1F4A8', + keywords: [ + 'comic', + 'dash', + 'running', + ], + }, + { + code: 'U+1F4AB', + keywords: [ + 'comic', + 'dizzy', + 'star', + ], + }, + { + code: 'U+1F4AC', + keywords: [ + 'balloon', + 'bubble', + 'comic', + 'dialog', + 'speech', + ], + }, + { + code: 'U+1F5E8', + keywords: [ + 'dialog', + 'speech', + ], + }, + { + code: 'U+1F5EF', + keywords: [ + 'angry', + 'balloon', + 'bubble', + 'mad', + ], + }, + { + code: 'U+1F4AD', + keywords: [ + 'balloon', + 'bubble', + 'comic', + 'thought', + ], + }, + { + code: 'U+1F573', + keywords: [ + 'hole', + ], + }, + { + code: 'U+1F453', + keywords: [ + 'clothing', + 'eye', + 'eyeglasses', + 'eyewear', + 'glasses', + ], + }, + { + code: 'U+1F576', + keywords: [ + 'dark', + 'eye', + 'eyewear', + 'glasses', + 'sunglasses', + ], + }, + { + code: 'U+1F454', + keywords: [ + 'clothing', + 'necktie', + ], + }, + { + code: 'U+1F455', + keywords: [ + 'clothing', + 'shirt', + 'tshirt', + ], + }, + { + code: 'U+1F456', + keywords: [ + 'clothing', + 'jeans', + 'pants', + 'trousers', + ], + }, + { + code: 'U+1F457', + keywords: [ + 'clothing', + 'dress', + ], + }, + { + code: 'U+1F458', + keywords: [ + 'clothing', + 'kimono', + ], + }, + { + code: 'U+1F459', + keywords: [ + 'bikini', + 'clothing', + 'swim', + ], + }, + { + code: 'U+1F45A', + keywords: [ + 'clothing', + 'woman', + ], + }, + { + code: 'U+1F45B', + keywords: [ + 'clothing', + 'coin', + 'purse', + ], + }, + { + code: 'U+1F45C', + keywords: [ + 'bag', + 'clothing', + 'handbag', + ], + }, + { + code: 'U+1F45D', + keywords: [ + 'bag', + 'clothing', + 'pouch', + ], + }, + { + code: 'U+1F6CD', + keywords: [ + 'bag', + 'hotel', + 'shopping', + ], + }, + { + code: 'U+1F392', + keywords: [ + 'activity', + 'bag', + 'satchel', + 'school', + ], + }, + { + code: 'U+1F45E', + keywords: [ + 'clothing', + 'man', + 'shoe', + ], + }, + { + code: 'U+1F45F', + keywords: [ + 'athletic', + 'clothing', + 'shoe', + 'sneaker', + ], + }, + { + code: 'U+1F460', + keywords: [ + 'clothing', + 'heel', + 'shoe', + 'woman', + ], + }, + { + code: 'U+1F461', + keywords: [ + 'clothing', + 'sandal', + 'shoe', + 'woman', + ], + }, + { + code: 'U+1F462', + keywords: [ + 'boot', + 'clothing', + 'shoe', + 'woman', + ], + }, + { + code: 'U+1F451', + keywords: [ + 'clothing', + 'crown', + 'king', + 'queen', + ], + }, + { + code: 'U+1F452', + keywords: [ + 'clothing', + 'hat', + 'woman', + ], + }, + { + code: 'U+1F3A9', + keywords: [ + 'activity', + 'clothing', + 'entertainment', + 'hat', + 'top', + 'tophat', + ], + }, + { + code: 'U+1F393', + keywords: [ + 'activity', + 'cap', + 'celebration', + 'clothing', + 'graduation', + 'hat', + ], + }, + { + code: 'U+26D1', + keywords: [ + 'aid', + 'cross', + 'face', + 'hat', + 'helmet', + ], + }, + { + code: 'U+1F4FF', + keywords: [ + 'beads', + 'clothing', + 'necklace', + 'prayer', + 'religion', + ], + }, + { + code: 'U+1F484', + keywords: [ + 'cosmetics', + 'lipstick', + 'makeup', + ], + }, + { + code: 'U+1F48D', + keywords: [ + 'diamond', + 'ring', + 'romance', + ], + }, + { + code: 'U+1F48E', + keywords: [ + 'diamond', + 'gem', + 'jewel', + 'romance', + ], + }, + ], + 'Animals & Nature': [ + { + code: 'U+1F435', + keywords: [ + 'face', + 'monkey', + ], + }, + { + code: 'U+1F412', + keywords: [ + 'monkey', + ], + }, + { + code: 'U+1F98D', + keywords: [ + 'gorilla', + ], + }, + { + code: 'U+1F436', + keywords: [ + 'dog', + 'face', + 'pet', + ], + }, + { + code: 'U+1F415', + keywords: [ + 'dog', + 'pet', + ], + }, + { + code: 'U+1F429', + keywords: [ + 'dog', + 'poodle', + ], + }, + { + code: 'U+1F43A', + keywords: [ + 'face', + 'wolf', + ], + }, + { + code: 'U+1F98A', + keywords: [ + 'face', + 'fox', + ], + }, + { + code: 'U+1F431', + keywords: [ + 'cat', + 'face', + 'pet', + ], + }, + { + code: 'U+1F408', + keywords: [ + 'cat', + 'pet', + ], + }, + { + code: 'U+1F981', + keywords: [ + 'face', + 'leo', + 'lion', + 'zodiac', + ], + }, + { + code: 'U+1F42F', + keywords: [ + 'face', + 'tiger', + ], + }, + { + code: 'U+1F405', + keywords: [ + 'tiger', + ], + }, + { + code: 'U+1F406', + keywords: [ + 'leopard', + ], + }, + { + code: 'U+1F434', + keywords: [ + 'face', + 'horse', + ], + }, + { + code: 'U+1F40E', + keywords: [ + 'horse', + 'racehorse', + 'racing', + ], + }, + { + code: 'U+1F98C', + keywords: [ + 'deer', + ], + }, + { + code: 'U+1F984', + keywords: [ + 'face', + 'unicorn', + ], + }, + { + code: 'U+1F42E', + keywords: [ + 'cow', + 'face', + ], + }, + { + code: 'U+1F402', + keywords: [ + 'bull', + 'ox', + 'taurus', + 'zodiac', + ], + }, + { + code: 'U+1F403', + keywords: [ + 'buffalo', + 'water', + ], + }, + { + code: 'U+1F404', + keywords: [ + 'cow', + ], + }, + { + code: 'U+1F437', + keywords: [ + 'face', + 'pig', + ], + }, + { + code: 'U+1F416', + keywords: [ + 'pig', + 'sow', + ], + }, + { + code: 'U+1F417', + keywords: [ + 'boar', + 'pig', + ], + }, + { + code: 'U+1F43D', + keywords: [ + 'face', + 'nose', + 'pig', + ], + }, + { + code: 'U+1F40F', + keywords: [ + 'aries', + 'ram', + 'sheep', + 'zodiac', + ], + }, + { + code: 'U+1F411', + keywords: [ + 'ewe', + 'sheep', + ], + }, + { + code: 'U+1F410', + keywords: [ + 'capricorn', + 'goat', + 'zodiac', + ], + }, + { + code: 'U+1F42A', + keywords: [ + 'camel', + 'dromedary', + 'hump', + ], + }, + { + code: 'U+1F42B', + keywords: [ + 'bactrian', + 'camel', + 'hump', + ], + }, + { + code: 'U+1F418', + keywords: [ + 'elephant', + ], + }, + { + code: 'U+1F98F', + keywords: [ + 'rhinoceros', + ], + }, + { + code: 'U+1F42D', + keywords: [ + 'face', + 'mouse', + ], + }, + { + code: 'U+1F401', + keywords: [ + 'mouse', + ], + }, + { + code: 'U+1F400', + keywords: [ + 'rat', + ], + }, + { + code: 'U+1F439', + keywords: [ + 'face', + 'hamster', + 'pet', + ], + }, + { + code: 'U+1F430', + keywords: [ + 'bunny', + 'face', + 'pet', + 'rabbit', + ], + }, + { + code: 'U+1F407', + keywords: [ + 'bunny', + 'pet', + 'rabbit', + ], + }, + { + code: 'U+1F43F', + keywords: [ + 'chipmunk', + ], + }, + { + code: 'U+1F987', + keywords: [ + 'bat', + 'vampire', + ], + }, + { + code: 'U+1F43B', + keywords: [ + 'bear', + 'face', + ], + }, + { + code: 'U+1F428', + keywords: [ + 'bear', + 'koala', + ], + }, + { + code: 'U+1F43C', + keywords: [ + 'face', + 'panda', + ], + }, + { + code: 'U+1F43E', + keywords: [ + 'feet', + 'paw', + 'print', + ], + }, + { + code: 'U+1F983', + keywords: [ + 'turkey', + ], + }, + { + code: 'U+1F414', + keywords: [ + 'chicken', + ], + }, + { + code: 'U+1F413', + keywords: [ + 'rooster', + ], + }, + { + code: 'U+1F423', + keywords: [ + 'baby', + 'chick', + 'hatching', + ], + }, + { + code: 'U+1F424', + keywords: [ + 'baby', + 'chick', + ], + }, + { + code: 'U+1F425', + keywords: [ + 'baby', + 'chick', + ], + }, + { + code: 'U+1F426', + keywords: [ + 'bird', + ], + }, + { + code: 'U+1F427', + keywords: [ + 'penguin', + ], + }, + { + code: 'U+1F54A', + keywords: [ + 'bird', + 'dove', + 'fly', + 'peace', + ], + }, + { + code: 'U+1F985', + keywords: [ + 'bird', + 'eagle', + ], + }, + { + code: 'U+1F986', + keywords: [ + 'bird', + 'duck', + ], + }, + { + code: 'U+1F989', + keywords: [ + 'bird', + 'owl', + 'wise', + ], + }, + { + code: 'U+1F438', + keywords: [ + 'face', + 'frog', + ], + }, + { + code: 'U+1F40A', + keywords: [ + 'crocodile', + ], + }, + { + code: 'U+1F422', + keywords: [ + 'turtle', + ], + }, + { + code: 'U+1F98E', + keywords: [ + 'lizard', + 'reptile', + ], + }, + { + code: 'U+1F40D', + keywords: [ + 'bearer', + 'ophiuchus', + 'serpent', + 'snake', + 'zodiac', + ], + }, + { + code: 'U+1F432', + keywords: [ + 'dragon', + 'face', + 'fairy tale', + ], + }, + { + code: 'U+1F409', + keywords: [ + 'dragon', + 'fairy tale', + ], + }, + { + code: 'U+1F433', + keywords: [ + 'face', + 'spouting', + 'whale', + ], + }, + { + code: 'U+1F40B', + keywords: [ + 'whale', + ], + }, + { + code: 'U+1F42C', + keywords: [ + 'dolphin', + 'flipper', + ], + }, + { + code: 'U+1F41F', + keywords: [ + 'fish', + 'pisces', + 'zodiac', + ], + }, + { + code: 'U+1F420', + keywords: [ + 'fish', + 'tropical', + ], + }, + { + code: 'U+1F421', + keywords: [ + 'blowfish', + 'fish', + ], + }, + { + code: 'U+1F988', + keywords: [ + 'fish', + 'shark', + ], + }, + { + code: 'U+1F419', + keywords: [ + 'octopus', + ], + }, + { + code: 'U+1F41A', + keywords: [ + 'shell', + 'spiral', + ], + }, + { + code: 'U+1F980', + keywords: [ + 'cancer', + 'crab', + 'zodiac', + ], + }, + { + code: 'U+1F990', + keywords: [ + 'shellfish', + 'shrimp', + 'small', + ], + }, + { + code: 'U+1F991', + keywords: [ + 'molusc', + 'squid', + ], + }, + { + code: 'U+1F98B', + keywords: [ + 'butterfly', + 'insect', + 'pretty', + ], + }, + { + code: 'U+1F40C', + keywords: [ + 'snail', + ], + }, + { + code: 'U+1F41B', + keywords: [ + 'bug', + 'insect', + ], + }, + { + code: 'U+1F41C', + keywords: [ + 'ant', + 'insect', + ], + }, + { + code: 'U+1F41D', + keywords: [ + 'bee', + 'honeybee', + 'insect', + ], + }, + { + code: 'U+1F41E', + keywords: [ + 'beetle', + 'insect', + 'lady beetle', + 'ladybird', + 'ladybug', + ], + }, + { + code: 'U+1F577', + keywords: [ + 'insect', + 'spider', + ], + }, + { + code: 'U+1F578', + keywords: [ + 'spider', + 'web', + ], + }, + { + code: 'U+1F982', + keywords: [ + 'scorpio', + 'scorpion', + 'scorpius', + 'zodiac', + ], + }, + { + code: 'U+1F490', + keywords: [ + 'bouquet', + 'flower', + 'plant', + 'romance', + ], + }, + { + code: 'U+1F338', + keywords: [ + 'blossom', + 'cherry', + 'flower', + 'plant', + ], + }, + { + code: 'U+1F4AE', + keywords: [ + 'flower', + ], + }, + { + code: 'U+1F3F5', + keywords: [ + 'plant', + 'rosette', + ], + }, + { + code: 'U+1F339', + keywords: [ + 'flower', + 'plant', + 'rose', + ], + }, + { + code: 'U+1F940', + keywords: [ + 'flower', + 'wilted', + ], + }, + { + code: 'U+1F33A', + keywords: [ + 'flower', + 'hibiscus', + 'plant', + ], + }, + { + code: 'U+1F33B', + keywords: [ + 'flower', + 'plant', + 'sun', + 'sunflower', + ], + }, + { + code: 'U+1F33C', + keywords: [ + 'blossom', + 'flower', + 'plant', + ], + }, + { + code: 'U+1F337', + keywords: [ + 'flower', + 'plant', + 'tulip', + ], + }, + { + code: 'U+1F331', + keywords: [ + 'plant', + 'seedling', + 'young', + ], + }, + { + code: 'U+1F332', + keywords: [ + 'evergreen', + 'plant', + 'tree', + ], + }, + { + code: 'U+1F333', + keywords: [ + 'deciduous', + 'plant', + 'shedding', + 'tree', + ], + }, + { + code: 'U+1F334', + keywords: [ + 'palm', + 'plant', + 'tree', + ], + }, + { + code: 'U+1F335', + keywords: [ + 'cactus', + 'plant', + ], + }, + { + code: 'U+1F33E', + keywords: [ + 'ear', + 'plant', + 'rice', + ], + }, + { + code: 'U+1F33F', + keywords: [ + 'herb', + 'leaf', + 'plant', + ], + }, + { + code: 'U+2618', + keywords: [ + 'plant', + 'shamrock', + ], + }, + { + code: 'U+1F340', + keywords: [ + '4', + 'clover', + 'four', + 'leaf', + 'plant', + ], + }, + { + code: 'U+1F341', + keywords: [ + 'falling', + 'leaf', + 'maple', + 'plant', + ], + }, + { + code: 'U+1F342', + keywords: [ + 'falling', + 'leaf', + 'plant', + ], + }, + { + code: 'U+1F343', + keywords: [ + 'blow', + 'flutter', + 'leaf', + 'plant', + 'wind', + ], + }, + { + code: 'U+1F347', + keywords: [ + 'fruit', + 'grape', + 'plant', + ], + }, + { + code: 'U+1F348', + keywords: [ + 'fruit', + 'melon', + 'plant', + ], + }, + { + code: 'U+1F349', + keywords: [ + 'fruit', + 'plant', + 'watermelon', + ], + }, + { + code: 'U+1F34A', + keywords: [ + 'fruit', + 'orange', + 'plant', + 'tangerine', + ], + }, + { + code: 'U+1F34B', + keywords: [ + 'citrus', + 'fruit', + 'lemon', + 'plant', + ], + }, + { + code: 'U+1F34C', + keywords: [ + 'banana', + 'fruit', + 'plant', + ], + }, + { + code: 'U+1F34D', + keywords: [ + 'fruit', + 'pineapple', + 'plant', + ], + }, + { + code: 'U+1F34E', + keywords: [ + 'apple', + 'fruit', + 'plant', + 'red', + ], + }, + { + code: 'U+1F34F', + keywords: [ + 'apple', + 'fruit', + 'green', + 'plant', + ], + }, + { + code: 'U+1F350', + keywords: [ + 'fruit', + 'pear', + 'plant', + ], + }, + { + code: 'U+1F351', + keywords: [ + 'fruit', + 'peach', + 'plant', + ], + }, + { + code: 'U+1F352', + keywords: [ + 'cherry', + 'fruit', + 'plant', + ], + }, + { + code: 'U+1F353', + keywords: [ + 'berry', + 'fruit', + 'plant', + 'strawberry', + ], + }, + { + code: 'U+1F345', + keywords: [ + 'plant', + 'tomato', + 'vegetable', + ], + }, + { + code: 'U+1F95D', + keywords: [ + 'fruit', + 'kiwi', + ], + }, + { + code: 'U+1F951', + keywords: [ + 'avocado', + 'fruit', + ], + }, + { + code: 'U+1F346', + keywords: [ + 'aubergine', + 'eggplant', + 'plant', + 'vegetable', + ], + }, + { + code: 'U+1F954', + keywords: [ + 'potato', + 'vegetable', + ], + }, + { + code: 'U+1F955', + keywords: [ + 'carrot', + 'vegetable', + ], + }, + { + code: 'U+1F33D', + keywords: [ + 'corn', + 'ear', + 'maize', + 'maze', + 'plant', + ], + }, + { + code: 'U+1F336', + keywords: [ + 'hot', + 'pepper', + 'plant', + ], + }, + { + code: 'U+1F952', + keywords: [ + 'cucumber', + 'pickle', + 'vegetable', + ], + }, + { + code: 'U+1F344', + keywords: [ + 'mushroom', + 'plant', + ], + }, + { + code: 'U+1F95C', + keywords: [ + 'nut', + 'peanut', + 'vegetable', + ], + }, + { + code: 'U+1F330', + keywords: [ + 'chestnut', + 'plant', + ], + }, + { + code: 'U+1F35E', + keywords: [ + 'bread', + 'loaf', + ], + }, + { + code: 'U+1F950', + keywords: [ + 'bread', + 'crescent roll', + 'croissant', + 'french', + ], + }, + { + code: 'U+1F956', + keywords: [ + 'baguette', + 'bread', + 'french', + ], + }, + { + code: 'U+1F95E', + keywords: [ + 'crĆŖpe', + 'hotcake', + 'pancake', + ], + }, + { + code: 'U+1F9C0', + keywords: [ + 'cheese', + ], + }, + { + code: 'U+1F356', + keywords: [ + 'bone', + 'meat', + ], + }, + { + code: 'U+1F357', + keywords: [ + 'bone', + 'chicken', + 'leg', + 'poultry', + ], + }, + { + code: 'U+1F953', + keywords: [ + 'bacon', + 'meat', + ], + }, + { + code: 'U+1F354', + keywords: [ + 'burger', + 'hamburger', + ], + }, + { + code: 'U+1F35F', + keywords: [ + 'french', + 'fries', + ], + }, + { + code: 'U+1F355', + keywords: [ + 'cheese', + 'pizza', + 'slice', + ], + }, + { + code: 'U+1F32D', + keywords: [ + 'frankfurter', + 'hot dog', + 'hotdog', + 'sausage', + ], + }, + { + code: 'U+1F32E', + keywords: [ + 'mexican', + 'taco', + ], + }, + { + code: 'U+1F32F', + keywords: [ + 'burrito', + 'mexican', + ], + }, + { + code: 'U+1F959', + keywords: [ + 'falafel', + 'flatbread', + 'gyro', + 'kebab', + 'stuffed', + ], + }, + { + code: 'U+1F95A', + keywords: [ + 'egg', + ], + }, + { + code: 'U+1F373', + keywords: [ + 'cooking', + 'egg', + 'frying', + 'pan', + ], + }, + { + code: 'U+1F958', + keywords: [ + 'casserole', + 'paella', + 'pan', + 'shallow', + ], + }, + { + code: 'U+1F372', + keywords: [ + 'pot', + 'stew', + ], + }, + { + code: 'U+1F957', + keywords: [ + 'green', + 'salad', + ], + }, + { + code: 'U+1F37F', + keywords: [ + 'popcorn', + ], + }, + { + code: 'U+1F371', + keywords: [ + 'bento', + 'box', + ], + }, + { + code: 'U+1F358', + keywords: [ + 'cracker', + 'rice', + ], + }, + { + code: 'U+1F359', + keywords: [ + 'ball', + 'japanese', + 'rice', + ], + }, + { + code: 'U+1F35A', + keywords: [ + 'cooked', + 'rice', + ], + }, + { + code: 'U+1F35B', + keywords: [ + 'curry', + 'rice', + ], + }, + { + code: 'U+1F35C', + keywords: [ + 'bowl', + 'noodle', + 'ramen', + 'steaming', + ], + }, + { + code: 'U+1F35D', + keywords: [ + 'pasta', + 'spaghetti', + ], + }, + { + code: 'U+1F360', + keywords: [ + 'potato', + 'roasted', + 'sweet', + ], + }, + { + code: 'U+1F362', + keywords: [ + 'kebab', + 'oden', + 'seafood', + 'skewer', + 'stick', + ], + }, + { + code: 'U+1F363', + keywords: [ + 'sushi', + ], + }, + { + code: 'U+1F364', + keywords: [ + 'fried', + 'prawn', + 'shrimp', + 'tempura', + ], + }, + { + code: 'U+1F365', + keywords: [ + 'cake', + 'fish', + 'pastry', + 'swirl', + ], + }, + { + code: 'U+1F361', + keywords: [ + 'dango', + 'dessert', + 'japanese', + 'skewer', + 'stick', + 'sweet', + ], + }, + { + code: 'U+1F366', + keywords: [ + 'cream', + 'dessert', + 'ice', + 'icecream', + 'soft', + 'sweet', + ], + }, + { + code: 'U+1F367', + keywords: [ + 'dessert', + 'ice', + 'shaved', + 'sweet', + ], + }, + { + code: 'U+1F368', + keywords: [ + 'cream', + 'dessert', + 'ice', + 'sweet', + ], + }, + { + code: 'U+1F369', + keywords: [ + 'dessert', + 'donut', + 'doughnut', + 'sweet', + ], + }, + { + code: 'U+1F36A', + keywords: [ + 'cookie', + 'dessert', + 'sweet', + ], + }, + { + code: 'U+1F382', + keywords: [ + 'birthday', + 'cake', + 'celebration', + 'dessert', + 'pastry', + 'sweet', + ], + }, + { + code: 'U+1F370', + keywords: [ + 'cake', + 'dessert', + 'pastry', + 'shortcake', + 'slice', + 'sweet', + ], + }, + { + code: 'U+1F36B', + keywords: [ + 'bar', + 'chocolate', + 'dessert', + 'sweet', + ], + }, + { + code: 'U+1F36C', + keywords: [ + 'candy', + 'dessert', + 'sweet', + ], + }, + { + code: 'U+1F36D', + keywords: [ + 'candy', + 'dessert', + 'lollipop', + 'sweet', + ], + }, + { + code: 'U+1F36E', + keywords: [ + 'custard', + 'dessert', + 'pudding', + 'sweet', + ], + }, + { + code: 'U+1F36F', + keywords: [ + 'honey', + 'honeypot', + 'pot', + 'sweet', + ], + }, + { + code: 'U+1F37C', + keywords: [ + 'baby', + 'bottle', + 'drink', + 'milk', + ], + }, + { + code: 'U+1F95B', + keywords: [ + 'drink', + 'glass', + 'milk', + ], + }, + { + code: 'U+2615', + keywords: [ + 'beverage', + 'coffee', + 'drink', + 'hot', + 'steaming', + 'tea', + ], + }, + { + code: 'U+1F375', + keywords: [ + 'beverage', + 'cup', + 'drink', + 'tea', + 'teacup', + ], + }, + { + code: 'U+1F376', + keywords: [ + 'bar', + 'beverage', + 'bottle', + 'cup', + 'drink', + 'sake', + ], + }, + { + code: 'U+1F37E', + keywords: [ + 'bar', + 'bottle', + 'cork', + 'drink', + 'popping', + ], + }, + { + code: 'U+1F377', + keywords: [ + 'bar', + 'beverage', + 'drink', + 'glass', + 'wine', + ], + }, + { + code: 'U+1F378', + keywords: [ + 'bar', + 'cocktail', + 'drink', + 'glass', + ], + }, + { + code: 'U+1F379', + keywords: [ + 'bar', + 'drink', + 'tropical', + ], + }, + { + code: 'U+1F37A', + keywords: [ + 'bar', + 'beer', + 'drink', + 'mug', + ], + }, + { + code: 'U+1F37B', + keywords: [ + 'bar', + 'beer', + 'clink', + 'drink', + 'mug', + ], + }, + { + code: 'U+1F942', + keywords: [ + 'celebrate', + 'clink', + 'drink', + 'glass', + ], + }, + { + code: 'U+1F943', + keywords: [ + 'glass', + 'liquor', + 'shot', + 'tumbler', + 'whisky', + ], + }, + { + code: 'U+1F37D', + keywords: [ + 'cooking', + 'fork', + 'knife', + 'plate', + ], + }, + { + code: 'U+1F374', + keywords: [ + 'cooking', + 'fork', + 'knife', + ], + }, + { + code: 'U+1F944', + keywords: [ + 'spoon', + 'tableware', + ], + }, + { + code: 'U+1F52A', + keywords: [ + 'cooking', + 'hocho', + 'knife', + 'tool', + 'weapon', + ], + }, + { + code: 'U+1F3FA', + keywords: [ + 'amphora', + 'aquarius', + 'cooking', + 'drink', + 'jug', + 'tool', + 'weapon', + 'zodiac', + ], + }, + ], + 'Travel & Places': [ + { + code: 'U+1F30D', + keywords: [ + 'africa', + 'earth', + 'europe', + 'globe', + 'world', + ], + }, + { + code: 'U+1F30E', + keywords: [ + 'americas', + 'earth', + 'globe', + 'world', + ], + }, + { + code: 'U+1F30F', + keywords: [ + 'asia', + 'australia', + 'earth', + 'globe', + 'world', + ], + }, + { + code: 'U+1F310', + keywords: [ + 'earth', + 'globe', + 'meridians', + 'world', + ], + }, + { + code: 'U+1F5FA', + keywords: [ + 'map', + 'world', + ], + }, + { + code: 'U+1F5FE', + keywords: [ + 'japan', + 'map', + ], + }, + { + code: 'U+1F3D4', + keywords: [ + 'cold', + 'mountain', + 'snow', + ], + }, + { + code: 'U+26F0', + keywords: [ + 'mountain', + ], + }, + { + code: 'U+1F30B', + keywords: [ + 'eruption', + 'mountain', + 'volcano', + 'weather', + ], + }, + { + code: 'U+1F5FB', + keywords: [ + 'fuji', + 'mountain', + ], + }, + { + code: 'U+1F3D5', + keywords: [ + 'camping', + ], + }, + { + code: 'U+1F3D6', + keywords: [ + 'beach', + 'umbrella', + ], + }, + { + code: 'U+1F3DC', + keywords: [ + 'desert', + ], + }, + { + code: 'U+1F3DD', + keywords: [ + 'desert', + 'island', + ], + }, + { + code: 'U+1F3DE', + keywords: [ + 'national park', + 'park', + ], + }, + { + code: 'U+1F3DF', + keywords: [ + 'stadium', + ], + }, + { + code: 'U+1F3DB', + keywords: [ + 'building', + 'classical', + ], + }, + { + code: 'U+1F3D7', + keywords: [ + 'building', + 'construction', + ], + }, + { + code: 'U+1F3D8', + keywords: [ + 'building', + 'house', + ], + }, + { + code: 'U+1F3D9', + keywords: [ + 'building', + 'city', + ], + }, + { + code: 'U+1F3DA', + keywords: [ + 'building', + 'derelict', + 'house', + ], + }, + { + code: 'U+1F3E0', + keywords: [ + 'building', + 'home', + 'house', + ], + }, + { + code: 'U+1F3E1', + keywords: [ + 'building', + 'garden', + 'home', + 'house', + ], + }, + { + code: 'U+1F3E2', + keywords: [ + 'building', + ], + }, + { + code: 'U+1F3E3', + keywords: [ + 'building', + 'japanese', + 'post', + ], + }, + { + code: 'U+1F3E4', + keywords: [ + 'building', + 'european', + 'post', + ], + }, + { + code: 'U+1F3E5', + keywords: [ + 'building', + 'doctor', + 'hospital', + 'medicine', + ], + }, + { + code: 'U+1F3E6', + keywords: [ + 'bank', + 'building', + ], + }, + { + code: 'U+1F3E8', + keywords: [ + 'building', + 'hotel', + ], + }, + { + code: 'U+1F3E9', + keywords: [ + 'building', + 'hotel', + 'love', + ], + }, + { + code: 'U+1F3EA', + keywords: [ + 'building', + 'convenience', + 'store', + ], + }, + { + code: 'U+1F3EB', + keywords: [ + 'building', + 'school', + ], + }, + { + code: 'U+1F3EC', + keywords: [ + 'building', + 'department', + 'store', + ], + }, + { + code: 'U+1F3ED', + keywords: [ + 'building', + 'factory', + ], + }, + { + code: 'U+1F3EF', + keywords: [ + 'building', + 'castle', + 'japanese', + ], + }, + { + code: 'U+1F3F0', + keywords: [ + 'building', + 'castle', + 'european', + ], + }, + { + code: 'U+1F492', + keywords: [ + 'activity', + 'chapel', + 'romance', + 'wedding', + ], + }, + { + code: 'U+1F5FC', + keywords: [ + 'tokyo', + 'tower', + ], + }, + { + code: 'U+1F5FD', + keywords: [ + 'liberty', + 'statue', + ], + }, + { + code: 'U+26EA', + keywords: [ + 'building', + 'christian', + 'church', + 'cross', + 'religion', + ], + }, + { + code: 'U+1F54C', + keywords: [ + 'islam', + 'mosque', + 'muslim', + 'religion', + ], + }, + { + code: 'U+1F54D', + keywords: [ + 'jew', + 'jewish', + 'religion', + 'synagogue', + 'temple', + ], + }, + { + code: 'U+26E9', + keywords: [ + 'religion', + 'shinto', + 'shrine', + ], + }, + { + code: 'U+1F54B', + keywords: [ + 'islam', + 'kaaba', + 'muslim', + 'religion', + ], + }, + { + code: 'U+26F2', + keywords: [ + 'fountain', + ], + }, + { + code: 'U+26FA', + keywords: [ + 'camping', + 'tent', + ], + }, + { + code: 'U+1F301', + keywords: [ + 'fog', + 'weather', + ], + }, + { + code: 'U+1F303', + keywords: [ + 'night', + 'star', + 'weather', + ], + }, + { + code: 'U+1F304', + keywords: [ + 'morning', + 'mountain', + 'sun', + 'sunrise', + 'weather', + ], + }, + { + code: 'U+1F305', + keywords: [ + 'morning', + 'sun', + 'sunrise', + 'weather', + ], + }, + { + code: 'U+1F306', + keywords: [ + 'building', + 'city', + 'dusk', + 'evening', + 'landscape', + 'sun', + 'sunset', + 'weather', + ], + }, + { + code: 'U+1F307', + keywords: [ + 'building', + 'dusk', + 'sun', + 'sunset', + 'weather', + ], + }, + { + code: 'U+1F309', + keywords: [ + 'bridge', + 'night', + 'weather', + ], + }, + { + code: 'U+2668', + keywords: [ + 'hot', + 'hotsprings', + 'springs', + 'steaming', + ], + }, + { + code: 'U+1F30C', + keywords: [ + 'milky way', + 'space', + 'weather', + ], + }, + { + code: 'U+1F3A0', + keywords: [ + 'activity', + 'carousel', + 'entertainment', + 'horse', + ], + }, + { + code: 'U+1F3A1', + keywords: [ + 'activity', + 'amusement park', + 'entertainment', + 'ferris', + 'wheel', + ], + }, + { + code: 'U+1F3A2', + keywords: [ + 'activity', + 'amusement park', + 'coaster', + 'entertainment', + 'roller', + ], + }, + { + code: 'U+1F488', + keywords: [ + 'barber', + 'haircut', + 'pole', + ], + }, + { + code: 'U+1F3AA', + keywords: [ + 'activity', + 'circus', + 'entertainment', + 'tent', + ], + }, + { + code: 'U+1F3AD', + keywords: [ + 'activity', + 'art', + 'entertainment', + 'mask', + 'performing', + 'theater', + 'theatre', + ], + }, + { + code: 'U+1F5BC', + keywords: [ + 'art', + 'frame', + 'museum', + 'painting', + 'picture', + ], + }, + { + code: 'U+1F3A8', + keywords: [ + 'activity', + 'art', + 'entertainment', + 'museum', + 'painting', + 'palette', + ], + }, + { + code: 'U+1F3B0', + keywords: [ + 'activity', + 'game', + 'slot', + ], + }, + { + code: 'U+1F682', + keywords: [ + 'engine', + 'locomotive', + 'railway', + 'steam', + 'train', + 'vehicle', + ], + }, + { + code: 'U+1F683', + keywords: [ + 'car', + 'electric', + 'railway', + 'train', + 'tram', + 'trolleybus', + 'vehicle', + ], + }, + { + code: 'U+1F684', + keywords: [ + 'railway', + 'shinkansen', + 'speed', + 'train', + 'vehicle', + ], + }, + { + code: 'U+1F685', + keywords: [ + 'bullet', + 'railway', + 'shinkansen', + 'speed', + 'train', + 'vehicle', + ], + }, + { + code: 'U+1F686', + keywords: [ + 'railway', + 'train', + 'vehicle', + ], + }, + { + code: 'U+1F687', + keywords: [ + 'metro', + 'subway', + 'vehicle', + ], + }, + { + code: 'U+1F688', + keywords: [ + 'railway', + 'vehicle', + ], + }, + { + code: 'U+1F689', + keywords: [ + 'railway', + 'station', + 'train', + 'vehicle', + ], + }, + { + code: 'U+1F68A', + keywords: [ + 'tram', + 'trolleybus', + 'vehicle', + ], + }, + { + code: 'U+1F69D', + keywords: [ + 'monorail', + 'vehicle', + ], + }, + { + code: 'U+1F69E', + keywords: [ + 'car', + 'mountain', + 'railway', + 'vehicle', + ], + }, + { + code: 'U+1F68B', + keywords: [ + 'car', + 'tram', + 'trolleybus', + 'vehicle', + ], + }, + { + code: 'U+1F68C', + keywords: [ + 'bus', + 'vehicle', + ], + }, + { + code: 'U+1F68D', + keywords: [ + 'bus', + 'oncoming', + 'vehicle', + ], + }, + { + code: 'U+1F68E', + keywords: [ + 'bus', + 'tram', + 'trolley', + 'trolleybus', + 'vehicle', + ], + }, + { + code: 'U+1F68F', + keywords: [ + 'bus', + 'busstop', + 'stop', + ], + }, + { + code: 'U+1F690', + keywords: [ + 'bus', + 'minibus', + 'vehicle', + ], + }, + { + code: 'U+1F691', + keywords: [ + 'ambulance', + 'vehicle', + ], + }, + { + code: 'U+1F692', + keywords: [ + 'engine', + 'fire', + 'truck', + 'vehicle', + ], + }, + { + code: 'U+1F693', + keywords: [ + 'car', + 'patrol', + 'police', + 'vehicle', + ], + }, + { + code: 'U+1F694', + keywords: [ + 'car', + 'oncoming', + 'police', + 'vehicle', + ], + }, + { + code: 'U+1F695', + keywords: [ + 'taxi', + 'vehicle', + ], + }, + { + code: 'U+1F696', + keywords: [ + 'oncoming', + 'taxi', + 'vehicle', + ], + }, + { + code: 'U+1F697', + keywords: [ + 'automobile', + 'car', + 'vehicle', + ], + }, + { + code: 'U+1F698', + keywords: [ + 'automobile', + 'car', + 'oncoming', + 'vehicle', + ], + }, + { + code: 'U+1F699', + keywords: [ + 'recreational', + 'rv', + 'vehicle', + ], + }, + { + code: 'U+1F69A', + keywords: [ + 'delivery', + 'truck', + 'vehicle', + ], + }, + { + code: 'U+1F69B', + keywords: [ + 'lorry', + 'semi', + 'truck', + 'vehicle', + ], + }, + { + code: 'U+1F69C', + keywords: [ + 'tractor', + 'vehicle', + ], + }, + { + code: 'U+1F6B2', + keywords: [ + 'bicycle', + 'bike', + 'vehicle', + ], + }, + { + code: 'U+26FD', + keywords: [ + 'fuel', + 'fuelpump', + 'gas', + 'pump', + 'station', + ], + }, + { + code: 'U+1F6E3', + keywords: [ + 'highway', + 'motorway', + 'road', + ], + }, + { + code: 'U+1F6E4', + keywords: [ + 'railway', + 'train', + ], + }, + { + code: 'U+1F6A8', + keywords: [ + 'beacon', + 'car', + 'light', + 'police', + 'revolving', + 'vehicle', + ], + }, + { + code: 'U+1F6A5', + keywords: [ + 'light', + 'signal', + 'traffic', + ], + }, + { + code: 'U+1F6A6', + keywords: [ + 'light', + 'signal', + 'traffic', + ], + }, + { + code: 'U+1F6A7', + keywords: [ + 'barrier', + 'construction', + ], + }, + { + code: 'U+1F6D1', + keywords: [ + 'octagonal', + 'stop', + ], + }, + { + code: 'U+1F6F4', + keywords: [ + 'kick', + 'scooter', + ], + }, + { + code: 'U+1F6F5', + keywords: [ + 'motor', + 'scooter', + ], + }, + { + code: 'U+2693', + keywords: [ + 'anchor', + 'ship', + 'tool', + ], + }, + { + code: 'U+26F5', + keywords: [ + 'boat', + 'resort', + 'sailboat', + 'sea', + 'vehicle', + 'yacht', + ], + }, + { + code: 'U+1F6A3', + keywords: [ + 'boat', + 'rowboat', + 'vehicle', + ], + types: [ + 'U+1F6A3 U+1F3FF', + 'U+1F6A3 U+1F3FE', + 'U+1F6A3 U+1F3FD', + 'U+1F6A3 U+1F3FC', + 'U+1F6A3 U+1F3FB', + ], + }, + { + code: 'U+1F6F6', + keywords: [ + 'boat', + 'canoe', + ], + }, + { + code: 'U+1F6A4', + keywords: [ + 'boat', + 'speedboat', + 'vehicle', + ], + }, + { + code: 'U+1F6F3', + keywords: [ + 'passenger', + 'ship', + 'vehicle', + ], + }, + { + code: 'U+26F4', + keywords: [ + 'boat', + 'ferry', + ], + }, + { + code: 'U+1F6E5', + keywords: [ + 'boat', + 'motorboat', + 'vehicle', + ], + }, + { + code: 'U+1F6A2', + keywords: [ + 'ship', + 'vehicle', + ], + }, + { + code: 'U+2708', + keywords: [ + 'airplane', + 'vehicle', + ], + }, + { + code: 'U+1F6E9', + keywords: [ + 'airplane', + 'vehicle', + ], + }, + { + code: 'U+1F6EB', + keywords: [ + 'airplane', + 'check-in', + 'departure', + 'departures', + 'vehicle', + ], + }, + { + code: 'U+1F6EC', + keywords: [ + 'airplane', + 'arrivals', + 'arriving', + 'landing', + 'vehicle', + ], + }, + { + code: 'U+1F4BA', + keywords: [ + 'chair', + 'seat', + ], + }, + { + code: 'U+1F681', + keywords: [ + 'helicopter', + 'vehicle', + ], + }, + { + code: 'U+1F69F', + keywords: [ + 'railway', + 'suspension', + 'vehicle', + ], + }, + { + code: 'U+1F6A0', + keywords: [ + 'cable', + 'gondola', + 'mountain', + 'vehicle', + ], + }, + { + code: 'U+1F6A1', + keywords: [ + 'aerial', + 'cable', + 'car', + 'gondola', + 'ropeway', + 'tramway', + 'vehicle', + ], + }, + { + code: 'U+1F680', + keywords: [ + 'rocket', + 'space', + 'vehicle', + ], + }, + { + code: 'U+1F6F0', + keywords: [ + 'satellite', + 'space', + 'vehicle', + ], + }, + { + code: 'U+1F6CE', + keywords: [ + 'bell', + 'bellhop', + 'hotel', + ], + }, + { + code: 'U+1F6AA', + keywords: [ + 'door', + ], + }, + { + code: 'U+1F6CC', + keywords: [ + 'hotel', + 'sleep', + ], + }, + { + code: 'U+1F6CF', + keywords: [ + 'bed', + 'hotel', + 'sleep', + ], + }, + { + code: 'U+1F6CB', + keywords: [ + 'couch', + 'hotel', + 'lamp', + ], + }, + { + code: 'U+1F6BD', + keywords: [ + 'toilet', + ], + }, + { + code: 'U+1F6BF', + keywords: [ + 'shower', + 'water', + ], + }, + { + code: 'U+1F6C0', + keywords: [ + 'bath', + 'bathtub', + ], + types: [ + 'U+1F6C0 U+1F3FF', + 'U+1F6C0 U+1F3FE', + 'U+1F6C0 U+1F3FD', + 'U+1F6C0 U+1F3FC', + 'U+1F6C0 U+1F3FB', + ], + }, + { + code: 'U+1F6C1', + keywords: [ + 'bath', + 'bathtub', + ], + }, + { + code: 'U+231B', + keywords: [ + 'hourglass', + 'sand', + 'timer', + ], + }, + { + code: 'U+23F3', + keywords: [ + 'hourglass', + 'sand', + 'timer', + ], + }, + { + code: 'U+231A', + keywords: [ + 'clock', + 'watch', + ], + }, + { + code: 'U+23F0', + keywords: [ + 'alarm', + 'clock', + ], + }, + { + code: 'U+23F1', + keywords: [ + 'clock', + 'stopwatch', + ], + }, + { + code: 'U+23F2', + keywords: [ + 'clock', + 'timer', + ], + }, + { + code: 'U+1F570', + keywords: [ + 'clock', + ], + }, + { + code: 'U+1F55B', + keywords: [ + '00', + '12', + '12:00', + 'clock', + 'oā€™clock', + 'twelve', + ], + }, + { + code: 'U+1F567', + keywords: [ + '12', + '12:30', + '30', + 'clock', + 'thirty', + 'twelve', + ], + }, + { + code: 'U+1F550', + keywords: [ + '00', + '1', + '1:00', + 'clock', + 'oā€™clock', + 'one', + ], + }, + { + code: 'U+1F55C', + keywords: [ + '1', + '1:30', + '30', + 'clock', + 'one', + 'thirty', + ], + }, + { + code: 'U+1F551', + keywords: [ + '00', + '2', + '2:00', + 'clock', + 'oā€™clock', + 'two', + ], + }, + { + code: 'U+1F55D', + keywords: [ + '2', + '2:30', + '30', + 'clock', + 'thirty', + 'two', + ], + }, + { + code: 'U+1F552', + keywords: [ + '00', + '3', + '3:00', + 'clock', + 'oā€™clock', + 'three', + ], + }, + { + code: 'U+1F55E', + keywords: [ + '3', + '3:30', + '30', + 'clock', + 'thirty', + 'three', + ], + }, + { + code: 'U+1F553', + keywords: [ + '00', + '4', + '4:00', + 'clock', + 'four', + 'oā€™clock', + ], + }, + { + code: 'U+1F55F', + keywords: [ + '30', + '4', + '4:30', + 'clock', + 'four', + 'thirty', + ], + }, + { + code: 'U+1F554', + keywords: [ + '00', + '5', + '5:00', + 'clock', + 'five', + 'oā€™clock', + ], + }, + { + code: 'U+1F560', + keywords: [ + '30', + '5', + '5:30', + 'clock', + 'five', + 'thirty', + ], + }, + { + code: 'U+1F555', + keywords: [ + '00', + '6', + '6:00', + 'clock', + 'oā€™clock', + 'six', + ], + }, + { + code: 'U+1F561', + keywords: [ + '30', + '6', + '6:30', + 'clock', + 'six', + 'thirty', + ], + }, + { + code: 'U+1F556', + keywords: [ + '00', + '7', + '7:00', + 'clock', + 'oā€™clock', + 'seven', + ], + }, + { + code: 'U+1F562', + keywords: [ + '30', + '7', + '7:30', + 'clock', + 'seven', + 'thirty', + ], + }, + { + code: 'U+1F557', + keywords: [ + '00', + '8', + '8:00', + 'clock', + 'eight', + 'oā€™clock', + ], + }, + { + code: 'U+1F563', + keywords: [ + '30', + '8', + '8:30', + 'clock', + 'eight', + 'thirty', + ], + }, + { + code: 'U+1F558', + keywords: [ + '00', + '9', + '9:00', + 'clock', + 'nine', + 'oā€™clock', + ], + }, + { + code: 'U+1F564', + keywords: [ + '30', + '9', + '9:30', + 'clock', + 'nine', + 'thirty', + ], + }, + { + code: 'U+1F559', + keywords: [ + '00', + '10', + '10:00', + 'clock', + 'oā€™clock', + 'ten', + ], + }, + { + code: 'U+1F565', + keywords: [ + '10', + '10:30', + '30', + 'clock', + 'ten', + 'thirty', + ], + }, + { + code: 'U+1F55A', + keywords: [ + '00', + '11', + '11:00', + 'clock', + 'eleven', + 'oā€™clock', + ], + }, + { + code: 'U+1F566', + keywords: [ + '11', + '11:30', + '30', + 'clock', + 'eleven', + 'thirty', + ], + }, + { + code: 'U+1F311', + keywords: [ + 'dark', + 'moon', + 'space', + 'weather', + ], + }, + { + code: 'U+1F312', + keywords: [ + 'crescent', + 'moon', + 'space', + 'waxing', + 'weather', + ], + }, + { + code: 'U+1F313', + keywords: [ + 'moon', + 'quarter', + 'space', + 'weather', + ], + }, + { + code: 'U+1F314', + keywords: [ + 'gibbous', + 'moon', + 'space', + 'waxing', + 'weather', + ], + }, + { + code: 'U+1F315', + keywords: [ + 'full', + 'moon', + 'space', + 'weather', + ], + }, + { + code: 'U+1F316', + keywords: [ + 'gibbous', + 'moon', + 'space', + 'waning', + 'weather', + ], + }, + { + code: 'U+1F317', + keywords: [ + 'moon', + 'quarter', + 'space', + 'weather', + ], + }, + { + code: 'U+1F318', + keywords: [ + 'crescent', + 'moon', + 'space', + 'waning', + 'weather', + ], + }, + { + code: 'U+1F319', + keywords: [ + 'crescent', + 'moon', + 'space', + 'weather', + ], + }, + { + code: 'U+1F31A', + keywords: [ + 'face', + 'moon', + 'space', + 'weather', + ], + }, + { + code: 'U+1F31B', + keywords: [ + 'face', + 'moon', + 'quarter', + 'space', + 'weather', + ], + }, + { + code: 'U+1F31C', + keywords: [ + 'face', + 'moon', + 'quarter', + 'space', + 'weather', + ], + }, + { + code: 'U+1F321', + keywords: [ + 'thermometer', + 'weather', + ], + }, + { + code: 'U+2600', + keywords: [ + 'bright', + 'rays', + 'space', + 'sun', + 'sunny', + 'weather', + ], + }, + { + code: 'U+1F31D', + keywords: [ + 'bright', + 'face', + 'full', + 'moon', + 'space', + 'weather', + ], + }, + { + code: 'U+1F31E', + keywords: [ + 'bright', + 'face', + 'space', + 'sun', + 'weather', + ], + }, + { + code: 'U+2B50', + keywords: [ + 'star', + ], + }, + { + code: 'U+1F31F', + keywords: [ + 'glittery', + 'glow', + 'shining', + 'sparkle', + 'star', + ], + }, + { + code: 'U+1F320', + keywords: [ + 'activity', + 'falling', + 'shooting', + 'space', + 'star', + ], + }, + { + code: 'U+2601', + keywords: [ + 'cloud', + 'weather', + ], + }, + { + code: 'U+26C5', + keywords: [ + 'cloud', + 'sun', + 'weather', + ], + }, + { + code: 'U+26C8', + keywords: [ + 'cloud', + 'rain', + 'thunder', + 'weather', + ], + }, + { + code: 'U+1F324', + keywords: [ + 'cloud', + 'sun', + 'weather', + ], + }, + { + code: 'U+1F325', + keywords: [ + 'cloud', + 'sun', + 'weather', + ], + }, + { + code: 'U+1F326', + keywords: [ + 'cloud', + 'rain', + 'sun', + 'weather', + ], + }, + { + code: 'U+1F327', + keywords: [ + 'cloud', + 'rain', + 'weather', + ], + }, + { + code: 'U+1F328', + keywords: [ + 'cloud', + 'cold', + 'snow', + 'weather', + ], + }, + { + code: 'U+1F329', + keywords: [ + 'cloud', + 'lightning', + 'weather', + ], + }, + { + code: 'U+1F32A', + keywords: [ + 'cloud', + 'tornado', + 'weather', + 'whirlwind', + ], + }, + { + code: 'U+1F32B', + keywords: [ + 'cloud', + 'fog', + 'weather', + ], + }, + { + code: 'U+1F32C', + keywords: [ + 'blow', + 'cloud', + 'face', + 'weather', + 'wind', + ], + }, + { + code: 'U+1F300', + keywords: [ + 'cyclone', + 'dizzy', + 'twister', + 'typhoon', + 'weather', + ], + }, + { + code: 'U+1F308', + keywords: [ + 'rain', + 'rainbow', + 'weather', + ], + }, + { + code: 'U+1F302', + keywords: [ + 'clothing', + 'rain', + 'umbrella', + 'weather', + ], + }, + { + code: 'U+2602', + keywords: [ + 'clothing', + 'rain', + 'umbrella', + 'weather', + ], + }, + { + code: 'U+2614', + keywords: [ + 'clothing', + 'drop', + 'rain', + 'umbrella', + 'weather', + ], + }, + { + code: 'U+26F1', + keywords: [ + 'rain', + 'sun', + 'umbrella', + 'weather', + ], + }, + { + code: 'U+26A1', + keywords: [ + 'danger', + 'electric', + 'electricity', + 'lightning', + 'voltage', + 'zap', + ], + }, + { + code: 'U+2744', + keywords: [ + 'cold', + 'snow', + 'snowflake', + 'weather', + ], + }, + { + code: 'U+2603', + keywords: [ + 'cold', + 'snow', + 'snowman', + 'weather', + ], + }, + { + code: 'U+26C4', + keywords: [ + 'cold', + 'snow', + 'snowman', + 'weather', + ], + }, + { + code: 'U+2604', + keywords: [ + 'comet', + 'space', + ], + }, + { + code: 'U+1F525', + keywords: [ + 'fire', + 'flame', + 'tool', + ], + }, + { + code: 'U+1F4A7', + keywords: [ + 'cold', + 'comic', + 'drop', + 'sweat', + 'weather', + ], + }, + { + code: 'U+1F30A', + keywords: [ + 'ocean', + 'water', + 'wave', + 'weather', + ], + }, + ], + Activities: [ + { + code: 'U+1F383', + keywords: [ + 'activity', + 'celebration', + 'entertainment', + 'halloween', + 'jack', + 'lantern', + ], + }, + { + code: 'U+1F384', + keywords: [ + 'activity', + 'celebration', + 'christmas', + 'entertainment', + 'tree', + ], + }, + { + code: 'U+1F386', + keywords: [ + 'activity', + 'celebration', + 'entertainment', + 'fireworks', + ], + }, + { + code: 'U+1F387', + keywords: [ + 'activity', + 'celebration', + 'entertainment', + 'fireworks', + 'sparkle', + ], + }, + { + code: 'U+2728', + keywords: [ + 'entertainment', + 'sparkle', + 'star', + ], + }, + { + code: 'U+1F388', + keywords: [ + 'activity', + 'balloon', + 'celebration', + 'entertainment', + ], + }, + { + code: 'U+1F389', + keywords: [ + 'activity', + 'celebration', + 'entertainment', + 'party', + 'popper', + 'tada', + ], + }, + { + code: 'U+1F38A', + keywords: [ + 'activity', + 'ball', + 'celebration', + 'confetti', + 'entertainment', + ], + }, + { + code: 'U+1F38B', + keywords: [ + 'activity', + 'banner', + 'celebration', + 'entertainment', + 'japanese', + 'tree', + ], + }, + { + code: 'U+1F38D', + keywords: [ + 'activity', + 'bamboo', + 'celebration', + 'japanese', + 'pine', + 'plant', + ], + }, + { + code: 'U+1F38E', + keywords: [ + 'activity', + 'celebration', + 'doll', + 'entertainment', + 'festival', + 'japanese', + ], + }, + { + code: 'U+1F38F', + keywords: [ + 'activity', + 'carp', + 'celebration', + 'entertainment', + 'flag', + 'streamer', + ], + }, + { + code: 'U+1F390', + keywords: [ + 'activity', + 'bell', + 'celebration', + 'chime', + 'entertainment', + 'wind', + ], + }, + { + code: 'U+1F391', + keywords: [ + 'activity', + 'celebration', + 'ceremony', + 'entertainment', + 'moon', + ], + }, + { + code: 'U+1F380', + keywords: [ + 'celebration', + 'ribbon', + ], + }, + { + code: 'U+1F381', + keywords: [ + 'box', + 'celebration', + 'entertainment', + 'gift', + 'present', + 'wrapped', + ], + }, + { + code: 'U+1F397', + keywords: [ + 'celebration', + 'reminder', + 'ribbon', + ], + }, + { + code: 'U+1F39F', + keywords: [ + 'admission', + 'entertainment', + 'ticket', + ], + }, + { + code: 'U+1F3AB', + keywords: [ + 'activity', + 'admission', + 'entertainment', + 'ticket', + ], + }, + { + code: 'U+1F396', + keywords: [ + 'celebration', + 'medal', + 'military', + ], + }, + { + code: 'U+1F3C6', + keywords: [ + 'prize', + 'trophy', + ], + }, + { + code: 'U+1F3C5', + keywords: [ + 'medal', + ], + }, + { + code: 'U+1F947', + keywords: [ + 'first', + 'gold', + 'medal', + ], + }, + { + code: 'U+1F948', + keywords: [ + 'medal', + 'second', + 'silver', + ], + }, + { + code: 'U+1F949', + keywords: [ + 'bronze', + 'medal', + 'third', + ], + }, + { + code: 'U+26BD', + keywords: [ + 'ball', + 'soccer', + ], + }, + { + code: 'U+26BE', + keywords: [ + 'ball', + 'baseball', + ], + }, + { + code: 'U+1F3C0', + keywords: [ + 'ball', + 'basketball', + 'hoop', + ], + }, + { + code: 'U+1F3D0', + keywords: [ + 'ball', + 'game', + 'volleyball', + ], + }, + { + code: 'U+1F3C8', + keywords: [ + 'american', + 'ball', + 'football', + ], + }, + { + code: 'U+1F3C9', + keywords: [ + 'ball', + 'football', + 'rugby', + ], + }, + { + code: 'U+1F3BE', + keywords: [ + 'ball', + 'racquet', + 'tennis', + ], + }, + { + code: 'U+1F3B1', + keywords: [ + '8', + '8 ball', + 'ball', + 'billiard', + 'eight', + 'game', + ], + }, + { + code: 'U+1F3B3', + keywords: [ + 'ball', + 'bowling', + 'game', + ], + }, + { + code: 'U+1F3CF', + keywords: [ + 'ball', + 'bat', + 'cricket', + 'game', + ], + }, + { + code: 'U+1F3D1', + keywords: [ + 'ball', + 'field', + 'game', + 'hockey', + 'stick', + ], + }, + { + code: 'U+1F3D2', + keywords: [ + 'game', + 'hockey', + 'ice', + 'puck', + 'stick', + ], + }, + { + code: 'U+1F3D3', + keywords: [ + 'ball', + 'bat', + 'game', + 'paddle', + 'table tennis', + ], + }, + { + code: 'U+1F3F8', + keywords: [ + 'badminton', + 'birdie', + 'game', + 'racquet', + 'shuttlecock', + ], + }, + { + code: 'U+1F94A', + keywords: [ + 'boxing', + 'glove', + ], + }, + { + code: 'U+1F94B', + keywords: [ + 'judo', + 'karate', + 'martial arts', + 'taekwondo', + 'uniform', + ], + }, + { + code: 'U+26F3', + keywords: [ + 'flag', + 'golf', + 'hole', + ], + }, + { + code: 'U+1F3CC', + keywords: [ + 'ball', + 'golf', + ], + }, + { + code: 'U+26F8', + keywords: [ + 'ice', + 'skate', + ], + }, + { + code: 'U+1F3A3', + keywords: [ + 'entertainment', + 'fish', + 'pole', + ], + }, + { + code: 'U+1F3BD', + keywords: [ + 'running', + 'sash', + 'shirt', + ], + }, + { + code: 'U+1F3BF', + keywords: [ + 'ski', + 'snow', + ], + }, + { + code: 'U+26F7', + keywords: [ + 'ski', + 'snow', + ], + }, + { + code: 'U+1F3C2', + keywords: [ + 'ski', + 'snow', + 'snowboard', + ], + }, + { + code: 'U+1F3C4', + keywords: [ + 'surfer', + 'surfing', + ], + types: [ + 'U+1F3C4 U+1F3FF', + 'U+1F3C4 U+1F3FE', + 'U+1F3C4 U+1F3FD', + 'U+1F3C4 U+1F3FC', + 'U+1F3C4 U+1F3FB', + ], + }, + { + code: 'U+1F3C7', + keywords: [ + 'horse', + 'jockey', + 'racehorse', + 'racing', + ], + }, + { + code: 'U+1F3CA', + keywords: [ + 'swim', + 'swimmer', + ], + types: [ + 'U+1F3CA U+1F3FF', + 'U+1F3CA U+1F3FE', + 'U+1F3CA U+1F3FD', + 'U+1F3CA U+1F3FC', + 'U+1F3CA U+1F3FB', + ], + }, + { + code: 'U+26F9', + keywords: [ + 'ball', + ], + types: [ + 'U+26F9 U+1F3FF', + 'U+26F9 U+1F3FE', + 'U+26F9 U+1F3FD', + 'U+26F9 U+1F3FC', + 'U+26F9 U+1F3FB', + ], + }, + { + code: 'U+1F3CB', + keywords: [ + 'lifter', + 'weight', + ], + types: [ + 'U+1F3CB U+1F3FF', + 'U+1F3CB U+1F3FE', + 'U+1F3CB U+1F3FD', + 'U+1F3CB U+1F3FC', + 'U+1F3CB U+1F3FB', + ], + }, + { + code: 'U+1F6B4', + keywords: [ + 'bicycle', + 'bicyclist', + 'bike', + 'cyclist', + ], + types: [ + 'U+1F6B4 U+1F3FF', + 'U+1F6B4 U+1F3FE', + 'U+1F6B4 U+1F3FD', + 'U+1F6B4 U+1F3FC', + 'U+1F6B4 U+1F3FB', + ], + }, + { + code: 'U+1F6B5', + keywords: [ + 'bicycle', + 'bicyclist', + 'bike', + 'cyclist', + 'mountain', + ], + types: [ + 'U+1F6B5 U+1F3FF', + 'U+1F6B5 U+1F3FE', + 'U+1F6B5 U+1F3FD', + 'U+1F6B5 U+1F3FC', + 'U+1F6B5 U+1F3FB', + ], + }, + { + code: 'U+1F3CE', + keywords: [ + 'car', + 'racing', + ], + }, + { + code: 'U+1F3CD', + keywords: [ + 'motorcycle', + 'racing', + ], + }, + { + code: 'U+1F938', + keywords: [ + 'cartwheel', + 'gymnastics', + ], + types: [ + 'U+1F938 U+1F3FF', + 'U+1F938 U+1F3FE', + 'U+1F938 U+1F3FD', + 'U+1F938 U+1F3FC', + 'U+1F938 U+1F3FB', + ], + }, + { + code: 'U+1F93C', + keywords: [ + 'wrestle', + 'wrestler', + ], + types: [ + 'U+1F93C U+1F3FF', + 'U+1F93C U+1F3FE', + 'U+1F93C U+1F3FD', + 'U+1F93C U+1F3FC', + 'U+1F93C U+1F3FB', + ], + }, + { + code: 'U+1F93D', + keywords: [ + 'polo', + 'water', + ], + types: [ + 'U+1F93D U+1F3FF', + 'U+1F93D U+1F3FE', + 'U+1F93D U+1F3FD', + 'U+1F93D U+1F3FC', + 'U+1F93D U+1F3FB', + ], + }, + { + code: 'U+1F93E', + keywords: [ + 'ball', + 'handball', + ], + types: [ + 'U+1F93E U+1F3FF', + 'U+1F93E U+1F3FE', + 'U+1F93E U+1F3FD', + 'U+1F93E U+1F3FC', + 'U+1F93E U+1F3FB', + ], + }, + { + code: 'U+1F93A', + keywords: [ + 'fencer', + 'fencing', + 'sword', + ], + }, + { + code: 'U+1F945', + keywords: [ + 'goal', + 'net', + ], + }, + { + code: 'U+1F939', + keywords: [ + 'balance', + 'juggle', + 'multitask', + 'skill', + ], + types: [ + 'U+1F939 U+1F3FF', + 'U+1F939 U+1F3FE', + 'U+1F939 U+1F3FD', + 'U+1F939 U+1F3FC', + 'U+1F939 U+1F3FB', + ], + }, + { + code: 'U+1F3AF', + keywords: [ + 'activity', + 'bull', + 'bullseye', + 'dart', + 'entertainment', + 'eye', + 'game', + 'hit', + 'target', + ], + }, + { + code: 'U+1F3AE', + keywords: [ + 'controller', + 'entertainment', + 'game', + 'video game', + ], + }, + { + code: 'U+1F579', + keywords: [ + 'entertainment', + 'game', + 'joystick', + 'video game', + ], + }, + { + code: 'U+1F3B2', + keywords: [ + 'dice', + 'die', + 'entertainment', + 'game', + ], + }, + { + code: 'U+2660', + keywords: [ + 'card', + 'game', + 'spade', + 'suit', + ], + }, + { + code: 'U+2665', + keywords: [ + 'card', + 'game', + 'heart', + 'hearts', + 'suit', + ], + }, + { + code: 'U+2666', + keywords: [ + 'card', + 'diamond', + 'diamonds', + 'game', + 'suit', + ], + }, + { + code: 'U+2663', + keywords: [ + 'card', + 'club', + 'clubs', + 'game', + 'suit', + ], + }, + { + code: 'U+1F0CF', + keywords: [ + 'card', + 'entertainment', + 'game', + 'joker', + 'playing', + ], + }, + { + code: 'U+1F004', + keywords: [ + 'game', + 'mahjong', + 'red', + ], + }, + { + code: 'U+1F3B4', + keywords: [ + 'activity', + 'card', + 'entertainment', + 'flower', + 'game', + 'japanese', + 'playing', + ], + }, + ], + Objects: [ + { + code: 'U+1F507', + keywords: [ + 'mute', + 'quiet', + 'silent', + 'speaker', + 'volume', + ], + }, + { + code: 'U+1F508', + keywords: [ + 'speaker', + 'volume', + ], + }, + { + code: 'U+1F509', + keywords: [ + 'low', + 'speaker', + 'volume', + 'wave', + ], + }, + { + code: 'U+1F50A', + keywords: [ + '3', + 'entertainment', + 'high', + 'loud', + 'speaker', + 'three', + 'volume', + ], + }, + { + code: 'U+1F4E2', + keywords: [ + 'communication', + 'loud', + 'loudspeaker', + 'public address', + ], + }, + { + code: 'U+1F4E3', + keywords: [ + 'cheering', + 'communication', + 'megaphone', + ], + }, + { + code: 'U+1F4EF', + keywords: [ + 'communication', + 'entertainment', + 'horn', + 'post', + 'postal', + ], + }, + { + code: 'U+1F514', + keywords: [ + 'bell', + ], + }, + { + code: 'U+1F515', + keywords: [ + 'bell', + 'forbidden', + 'mute', + 'no', + 'not', + 'prohibited', + 'quiet', + 'silent', + ], + }, + { + code: 'U+1F3BC', + keywords: [ + 'activity', + 'entertainment', + 'music', + 'score', + ], + }, + { + code: 'U+1F3B5', + keywords: [ + 'activity', + 'entertainment', + 'music', + 'note', + ], + }, + { + code: 'U+1F3B6', + keywords: [ + 'activity', + 'entertainment', + 'music', + 'note', + 'notes', + ], + }, + { + code: 'U+1F399', + keywords: [ + 'mic', + 'microphone', + 'music', + 'studio', + ], + }, + { + code: 'U+1F39A', + keywords: [ + 'level', + 'music', + 'slider', + ], + }, + { + code: 'U+1F39B', + keywords: [ + 'control', + 'knobs', + 'music', + ], + }, + { + code: 'U+1F3A4', + keywords: [ + 'activity', + 'entertainment', + 'karaoke', + 'mic', + 'microphone', + ], + }, + { + code: 'U+1F3A7', + keywords: [ + 'activity', + 'earbud', + 'entertainment', + 'headphone', + ], + }, + { + code: 'U+1F4FB', + keywords: [ + 'entertainment', + 'radio', + 'video', + ], + }, + { + code: 'U+1F3B7', + keywords: [ + 'activity', + 'entertainment', + 'instrument', + 'music', + 'sax', + 'saxophone', + ], + }, + { + code: 'U+1F3B8', + keywords: [ + 'activity', + 'entertainment', + 'guitar', + 'instrument', + 'music', + ], + }, + { + code: 'U+1F3B9', + keywords: [ + 'activity', + 'entertainment', + 'instrument', + 'keyboard', + 'music', + 'piano', + ], + }, + { + code: 'U+1F3BA', + keywords: [ + 'activity', + 'entertainment', + 'instrument', + 'music', + 'trumpet', + ], + }, + { + code: 'U+1F3BB', + keywords: [ + 'activity', + 'entertainment', + 'instrument', + 'music', + 'violin', + ], + }, + { + code: 'U+1F941', + keywords: [ + 'drum', + 'drumsticks', + 'music', + ], + }, + { + code: 'U+1F4F1', + keywords: [ + 'cell', + 'communication', + 'mobile', + 'phone', + 'telephone', + ], + }, + { + code: 'U+1F4F2', + keywords: [ + 'arrow', + 'call', + 'cell', + 'communication', + 'mobile', + 'phone', + 'receive', + 'telephone', + ], + }, + { + code: 'U+260E', + keywords: [ + 'phone', + 'telephone', + ], + }, + { + code: 'U+1F4DE', + keywords: [ + 'communication', + 'phone', + 'receiver', + 'telephone', + ], + }, + { + code: 'U+1F4DF', + keywords: [ + 'communication', + 'pager', + ], + }, + { + code: 'U+1F4E0', + keywords: [ + 'communication', + 'fax', + ], + }, + { + code: 'U+1F50B', + keywords: [ + 'battery', + ], + }, + { + code: 'U+1F50C', + keywords: [ + 'electric', + 'electricity', + 'plug', + ], + }, + { + code: 'U+1F4BB', + keywords: [ + 'computer', + 'pc', + 'personal', + ], + }, + { + code: 'U+1F5A5', + keywords: [ + 'computer', + 'desktop', + ], + }, + { + code: 'U+1F5A8', + keywords: [ + 'computer', + 'printer', + ], + }, + { + code: 'U+2328', + keywords: [ + 'computer', + 'keyboard', + ], + }, + { + code: 'U+1F5B1', + keywords: [ + '3', + 'button', + 'computer', + 'mouse', + 'three', + ], + }, + { + code: 'U+1F5B2', + keywords: [ + 'computer', + 'trackball', + ], + }, + { + code: 'U+1F4BD', + keywords: [ + 'computer', + 'disk', + 'entertainment', + 'minidisk', + 'optical', + ], + }, + { + code: 'U+1F4BE', + keywords: [ + 'computer', + 'disk', + 'floppy', + ], + }, + { + code: 'U+1F4BF', + keywords: [ + 'blu-ray', + 'cd', + 'computer', + 'disk', + 'dvd', + 'optical', + ], + }, + { + code: 'U+1F4C0', + keywords: [ + 'blu-ray', + 'cd', + 'computer', + 'disk', + 'dvd', + 'entertainment', + 'optical', + ], + }, + { + code: 'U+1F3A5', + keywords: [ + 'activity', + 'camera', + 'cinema', + 'entertainment', + 'movie', + ], + }, + { + code: 'U+1F39E', + keywords: [ + 'cinema', + 'entertainment', + 'film', + 'frames', + 'movie', + ], + }, + { + code: 'U+1F4FD', + keywords: [ + 'cinema', + 'entertainment', + 'film', + 'movie', + 'projector', + 'video', + ], + }, + { + code: 'U+1F3AC', + keywords: [ + 'activity', + 'clapper', + 'entertainment', + 'movie', + ], + }, + { + code: 'U+1F4FA', + keywords: [ + 'entertainment', + 'television', + 'tv', + 'video', + ], + }, + { + code: 'U+1F4F7', + keywords: [ + 'camera', + 'entertainment', + 'video', + ], + }, + { + code: 'U+1F4F8', + keywords: [ + 'camera', + 'flash', + 'video', + ], + }, + { + code: 'U+1F4F9', + keywords: [ + 'camera', + 'entertainment', + 'video', + ], + }, + { + code: 'U+1F4FC', + keywords: [ + 'entertainment', + 'tape', + 'vhs', + 'video', + 'videocassette', + ], + }, + { + code: 'U+1F50D', + keywords: [ + 'glass', + 'magnifying', + 'search', + 'tool', + ], + }, + { + code: 'U+1F50E', + keywords: [ + 'glass', + 'magnifying', + 'search', + 'tool', + ], + }, + { + code: 'U+1F52C', + keywords: [ + 'microscope', + 'tool', + ], + }, + { + code: 'U+1F52D', + keywords: [ + 'telescope', + 'tool', + ], + }, + { + code: 'U+1F4E1', + keywords: [ + 'antenna', + 'communication', + 'dish', + 'satellite', + ], + }, + { + code: 'U+1F56F', + keywords: [ + 'candle', + 'light', + ], + }, + { + code: 'U+1F4A1', + keywords: [ + 'bulb', + 'comic', + 'electric', + 'idea', + 'light', + ], + }, + { + code: 'U+1F526', + keywords: [ + 'electric', + 'flashlight', + 'light', + 'tool', + 'torch', + ], + }, + { + code: 'U+1F3EE', + keywords: [ + 'bar', + 'japanese', + 'lantern', + 'light', + 'red', + ], + }, + { + code: 'U+1F4D4', + keywords: [ + 'book', + 'cover', + 'decorated', + 'notebook', + ], + }, + { + code: 'U+1F4D5', + keywords: [ + 'book', + 'closed', + ], + }, + { + code: 'U+1F4D6', + keywords: [ + 'book', + 'open', + ], + }, + { + code: 'U+1F4D7', + keywords: [ + 'book', + 'green', + ], + }, + { + code: 'U+1F4D8', + keywords: [ + 'blue', + 'book', + ], + }, + { + code: 'U+1F4D9', + keywords: [ + 'book', + 'orange', + ], + }, + { + code: 'U+1F4DA', + keywords: [ + 'book', + 'books', + ], + }, + { + code: 'U+1F4D3', + keywords: [ + 'notebook', + ], + }, + { + code: 'U+1F4D2', + keywords: [ + 'ledger', + 'notebook', + ], + }, + { + code: 'U+1F4C3', + keywords: [ + 'curl', + 'document', + 'page', + ], + }, + { + code: 'U+1F4DC', + keywords: [ + 'paper', + 'scroll', + ], + }, + { + code: 'U+1F4C4', + keywords: [ + 'document', + 'page', + ], + }, + { + code: 'U+1F4F0', + keywords: [ + 'communication', + 'news', + 'newspaper', + 'paper', + ], + }, + { + code: 'U+1F5DE', + keywords: [ + 'news', + 'newspaper', + 'paper', + 'rolled', + ], + }, + { + code: 'U+1F4D1', + keywords: [ + 'bookmark', + 'mark', + 'marker', + 'tabs', + ], + }, + { + code: 'U+1F516', + keywords: [ + 'bookmark', + 'mark', + ], + }, + { + code: 'U+1F3F7', + keywords: [ + 'label', + ], + }, + { + code: 'U+1F4B0', + keywords: [ + 'bag', + 'dollar', + 'money', + 'moneybag', + ], + }, + { + code: 'U+1F4B4', + keywords: [ + 'bank', + 'banknote', + 'bill', + 'currency', + 'money', + 'note', + 'yen', + ], + }, + { + code: 'U+1F4B5', + keywords: [ + 'bank', + 'banknote', + 'bill', + 'currency', + 'dollar', + 'money', + 'note', + ], + }, + { + code: 'U+1F4B6', + keywords: [ + 'bank', + 'banknote', + 'bill', + 'currency', + 'euro', + 'money', + 'note', + ], + }, + { + code: 'U+1F4B7', + keywords: [ + 'bank', + 'banknote', + 'bill', + 'currency', + 'money', + 'note', + 'pound', + ], + }, + { + code: 'U+1F4B8', + keywords: [ + 'bank', + 'banknote', + 'bill', + 'dollar', + 'fly', + 'money', + 'note', + 'wings', + ], + }, + { + code: 'U+1F4B3', + keywords: [ + 'bank', + 'card', + 'credit', + 'money', + ], + }, + { + code: 'U+1F4B9', + keywords: [ + 'bank', + 'chart', + 'currency', + 'graph', + 'growth', + 'market', + 'money', + 'rise', + 'trend', + 'upward', + 'yen', + ], + }, + { + code: 'U+1F4B1', + keywords: [ + 'bank', + 'currency', + 'exchange', + 'money', + ], + }, + { + code: 'U+1F4B2', + keywords: [ + 'currency', + 'dollar', + 'money', + ], + }, + { + code: 'U+2709', + keywords: [ + 'e-mail', + 'email', + 'envelope', + ], + }, + { + code: 'U+1F4E7', + keywords: [ + 'communication', + 'e-mail', + 'email', + 'letter', + 'mail', + ], + }, + { + code: 'U+1F4E8', + keywords: [ + 'communication', + 'e-mail', + 'email', + 'envelope', + 'incoming', + 'letter', + 'mail', + 'receive', + ], + }, + { + code: 'U+1F4E9', + keywords: [ + 'arrow', + 'communication', + 'down', + 'e-mail', + 'email', + 'envelope', + 'letter', + 'mail', + 'outgoing', + 'sent', + ], + }, + { + code: 'U+1F4E4', + keywords: [ + 'box', + 'communication', + 'letter', + 'mail', + 'outbox', + 'sent', + 'tray', + ], + }, + { + code: 'U+1F4E5', + keywords: [ + 'box', + 'communication', + 'inbox', + 'letter', + 'mail', + 'receive', + 'tray', + ], + }, + { + code: 'U+1F4E6', + keywords: [ + 'box', + 'communication', + 'package', + 'parcel', + ], + }, + { + code: 'U+1F4EB', + keywords: [ + 'closed', + 'communication', + 'flag', + 'mail', + 'mailbox', + 'postbox', + ], + }, + { + code: 'U+1F4EA', + keywords: [ + 'closed', + 'communication', + 'flag', + 'lowered', + 'mail', + 'mailbox', + 'postbox', + ], + }, + { + code: 'U+1F4EC', + keywords: [ + 'communication', + 'flag', + 'mail', + 'mailbox', + 'open', + 'postbox', + ], + }, + { + code: 'U+1F4ED', + keywords: [ + 'communication', + 'flag', + 'lowered', + 'mail', + 'mailbox', + 'open', + 'postbox', + ], + }, + { + code: 'U+1F4EE', + keywords: [ + 'communication', + 'mail', + 'mailbox', + 'postbox', + ], + }, + { + code: 'U+1F5F3', + keywords: [ + 'ballot', + 'box', + ], + }, + { + code: 'U+270F', + keywords: [ + 'pencil', + ], + }, + { + code: 'U+2712', + keywords: [ + 'nib', + 'pen', + ], + }, + { + code: 'U+1F58B', + keywords: [ + 'communication', + 'fountain', + 'pen', + ], + }, + { + code: 'U+1F58A', + keywords: [ + 'ballpoint', + 'communication', + 'pen', + ], + }, + { + code: 'U+1F58C', + keywords: [ + 'communication', + 'paintbrush', + 'painting', + ], + }, + { + code: 'U+1F58D', + keywords: [ + 'communication', + 'crayon', + ], + }, + { + code: 'U+1F4DD', + keywords: [ + 'communication', + 'memo', + 'pencil', + ], + }, + { + code: 'U+1F4BC', + keywords: [ + 'briefcase', + ], + }, + { + code: 'U+1F4C1', + keywords: [ + 'file', + 'folder', + ], + }, + { + code: 'U+1F4C2', + keywords: [ + 'file', + 'folder', + 'open', + ], + }, + { + code: 'U+1F5C2', + keywords: [ + 'card', + 'dividers', + 'index', + ], + }, + { + code: 'U+1F4C5', + keywords: [ + 'calendar', + 'date', + ], + }, + { + code: 'U+1F4C6', + keywords: [ + 'calendar', + ], + }, + { + code: 'U+1F5D2', + keywords: [ + 'note', + 'pad', + 'spiral', + ], + }, + { + code: 'U+1F5D3', + keywords: [ + 'calendar', + 'pad', + 'spiral', + ], + }, + { + code: 'U+1F4C7', + keywords: [ + 'card', + 'index', + 'rolodex', + ], + }, + { + code: 'U+1F4C8', + keywords: [ + 'chart', + 'graph', + 'growth', + 'trend', + 'upward', + ], + }, + { + code: 'U+1F4C9', + keywords: [ + 'chart', + 'down', + 'graph', + 'trend', + ], + }, + { + code: 'U+1F4CA', + keywords: [ + 'bar', + 'chart', + 'graph', + ], + }, + { + code: 'U+1F4CB', + keywords: [ + 'clipboard', + ], + }, + { + code: 'U+1F4CC', + keywords: [ + 'pin', + 'pushpin', + ], + }, + { + code: 'U+1F4CD', + keywords: [ + 'pin', + 'pushpin', + ], + }, + { + code: 'U+1F4CE', + keywords: [ + 'paperclip', + ], + }, + { + code: 'U+1F587', + keywords: [ + 'communication', + 'link', + 'paperclip', + ], + }, + { + code: 'U+1F4CF', + keywords: [ + 'ruler', + 'straight edge', + ], + }, + { + code: 'U+1F4D0', + keywords: [ + 'ruler', + 'set', + 'triangle', + ], + }, + { + code: 'U+2702', + keywords: [ + 'scissors', + 'tool', + ], + }, + { + code: 'U+1F5C3', + keywords: [ + 'box', + 'card', + 'file', + ], + }, + { + code: 'U+1F5C4', + keywords: [ + 'cabinet', + 'file', + ], + }, + { + code: 'U+1F5D1', + keywords: [ + 'wastebasket', + ], + }, + { + code: 'U+1F512', + keywords: [ + 'closed', + 'lock', + ], + }, + { + code: 'U+1F513', + keywords: [ + 'lock', + 'open', + 'unlock', + ], + }, + { + code: 'U+1F50F', + keywords: [ + 'ink', + 'lock', + 'nib', + 'pen', + 'privacy', + ], + }, + { + code: 'U+1F510', + keywords: [ + 'closed', + 'key', + 'lock', + 'secure', + ], + }, + { + code: 'U+1F511', + keywords: [ + 'key', + 'lock', + 'password', + ], + }, + { + code: 'U+1F5DD', + keywords: [ + 'clue', + 'key', + 'lock', + 'old', + ], + }, + { + code: 'U+1F528', + keywords: [ + 'hammer', + 'tool', + ], + }, + { + code: 'U+26CF', + keywords: [ + 'mining', + 'pick', + 'tool', + ], + }, + { + code: 'U+2692', + keywords: [ + 'hammer', + 'pick', + 'tool', + ], + }, + { + code: 'U+1F6E0', + keywords: [ + 'hammer', + 'tool', + 'wrench', + ], + }, + { + code: 'U+1F5E1', + keywords: [ + 'dagger', + 'knife', + 'weapon', + ], + }, + { + code: 'U+2694', + keywords: [ + 'crossed', + 'swords', + 'weapon', + ], + }, + { + code: 'U+1F52B', + keywords: [ + 'gun', + 'handgun', + 'pistol', + 'revolver', + 'tool', + 'weapon', + ], + }, + { + code: 'U+1F3F9', + keywords: [ + 'archer', + 'arrow', + 'bow', + 'sagittarius', + 'tool', + 'weapon', + 'zodiac', + ], + }, + { + code: 'U+1F6E1', + keywords: [ + 'shield', + 'weapon', + ], + }, + { + code: 'U+1F527', + keywords: [ + 'tool', + 'wrench', + ], + }, + { + code: 'U+1F529', + keywords: [ + 'bolt', + 'nut', + 'tool', + ], + }, + { + code: 'U+2699', + keywords: [ + 'gear', + 'tool', + ], + }, + { + code: 'U+1F5DC', + keywords: [ + 'compression', + 'tool', + 'vice', + ], + }, + { + code: 'U+2697', + keywords: [ + 'alembic', + 'chemistry', + 'tool', + ], + }, + { + code: 'U+2696', + keywords: [ + 'balance', + 'justice', + 'libra', + 'scales', + 'tool', + 'weight', + 'zodiac', + ], + }, + { + code: 'U+1F517', + keywords: [ + 'link', + ], + }, + { + code: 'U+26D3', + keywords: [ + 'chain', + ], + }, + { + code: 'U+1F489', + keywords: [ + 'doctor', + 'medicine', + 'needle', + 'shot', + 'sick', + 'syringe', + 'tool', + ], + }, + { + code: 'U+1F48A', + keywords: [ + 'doctor', + 'medicine', + 'pill', + 'sick', + ], + }, + { + code: 'U+1F6AC', + keywords: [ + 'activity', + 'smoking', + ], + }, + { + code: 'U+26B0', + keywords: [ + 'coffin', + 'death', + ], + }, + { + code: 'U+26B1', + keywords: [ + 'death', + 'funeral', + 'urn', + ], + }, + { + code: 'U+1F5FF', + keywords: [ + 'face', + 'moyai', + 'statue', + ], + }, + { + code: 'U+1F6E2', + keywords: [ + 'drum', + 'oil', + ], + }, + { + code: 'U+1F52E', + keywords: [ + 'ball', + 'crystal', + 'fairy tale', + 'fantasy', + 'fortune', + 'tool', + ], + }, + { + code: 'U+1F6D2', + keywords: [ + 'cart', + 'shopping', + 'trolley', + ], + }, + ], + Symbols: [ + { + code: 'U+1F3E7', + keywords: [ + 'atm', + 'automated', + 'bank', + 'teller', + ], + }, + { + code: 'U+1F6AE', + keywords: [ + 'litter', + 'litterbox', + ], + }, + { + code: 'U+1F6B0', + keywords: [ + 'drink', + 'potable', + 'water', + ], + }, + { + code: 'U+267F', + keywords: [ + 'access', + 'wheelchair', + ], + }, + { + code: 'U+1F6B9', + keywords: [ + 'lavatory', + 'man', + 'restroom', + 'wc', + ], + }, + { + code: 'U+1F6BA', + keywords: [ + 'lavatory', + 'restroom', + 'wc', + 'woman', + ], + }, + { + code: 'U+1F6BB', + keywords: [ + 'lavatory', + 'restroom', + 'wc', + ], + }, + { + code: 'U+1F6BC', + keywords: [ + 'baby', + 'changing', + ], + }, + { + code: 'U+1F6BE', + keywords: [ + 'closet', + 'lavatory', + 'restroom', + 'water', + 'wc', + ], + }, + { + code: 'U+1F6C2', + keywords: [ + 'control', + 'passport', + ], + }, + { + code: 'U+1F6C3', + keywords: [ + 'customs', + ], + }, + { + code: 'U+1F6C4', + keywords: [ + 'baggage', + 'claim', + ], + }, + { + code: 'U+1F6C5', + keywords: [ + 'baggage', + 'left luggage', + 'locker', + 'luggage', + ], + }, + { + code: 'U+26A0', + keywords: [ + 'warning', + ], + }, + { + code: 'U+1F6B8', + keywords: [ + 'child', + 'crossing', + 'pedestrian', + 'traffic', + ], + }, + { + code: 'U+26D4', + keywords: [ + 'entry', + 'forbidden', + 'no', + 'not', + 'prohibited', + 'traffic', + ], + }, + { + code: 'U+1F6AB', + keywords: [ + 'entry', + 'forbidden', + 'no', + 'not', + 'prohibited', + ], + }, + { + code: 'U+1F6B3', + keywords: [ + 'bicycle', + 'bike', + 'forbidden', + 'no', + 'not', + 'prohibited', + 'vehicle', + ], + }, + { + code: 'U+1F6AD', + keywords: [ + 'forbidden', + 'no', + 'not', + 'prohibited', + 'smoking', + ], + }, + { + code: 'U+1F6AF', + keywords: [ + 'forbidden', + 'litter', + 'no', + 'not', + 'prohibited', + ], + }, + { + code: 'U+1F6B1', + keywords: [ + 'drink', + 'forbidden', + 'no', + 'not', + 'potable', + 'prohibited', + 'water', + ], + }, + { + code: 'U+1F6B7', + keywords: [ + 'forbidden', + 'no', + 'not', + 'pedestrian', + 'prohibited', + ], + }, + { + code: 'U+1F4F5', + keywords: [ + 'cell', + 'communication', + 'forbidden', + 'mobile', + 'no', + 'not', + 'phone', + 'prohibited', + 'telephone', + ], + }, + { + code: 'U+1F51E', + keywords: [ + '18', + 'age restriction', + 'eighteen', + 'forbidden', + 'no', + 'not', + 'prohibited', + 'underage', + ], + }, + { + code: 'U+2622', + keywords: [ + 'radioactive', + ], + }, + { + code: 'U+2623', + keywords: [ + 'biohazard', + ], + }, + { + code: 'U+2B06', + keywords: [ + 'arrow', + 'cardinal', + 'direction', + 'north', + ], + }, + { + code: 'U+2197', + keywords: [ + 'arrow', + 'direction', + 'intercardinal', + 'northeast', + ], + }, + { + code: 'U+27A1', + keywords: [ + 'arrow', + 'cardinal', + 'direction', + 'east', + ], + }, + { + code: 'U+2198', + keywords: [ + 'arrow', + 'direction', + 'intercardinal', + 'southeast', + ], + }, + { + code: 'U+2B07', + keywords: [ + 'arrow', + 'cardinal', + 'direction', + 'down', + 'south', + ], + }, + { + code: 'U+2199', + keywords: [ + 'arrow', + 'direction', + 'intercardinal', + 'southwest', + ], + }, + { + code: 'U+2B05', + keywords: [ + 'arrow', + 'cardinal', + 'direction', + 'west', + ], + }, + { + code: 'U+2196', + keywords: [ + 'arrow', + 'direction', + 'intercardinal', + 'northwest', + ], + }, + { + code: 'U+2195', + keywords: [ + 'arrow', + ], + }, + { + code: 'U+2194', + keywords: [ + 'arrow', + ], + }, + { + code: 'U+21A9', + keywords: [ + 'arrow', + ], + }, + { + code: 'U+21AA', + keywords: [ + 'arrow', + ], + }, + { + code: 'U+2934', + keywords: [ + 'arrow', + ], + }, + { + code: 'U+2935', + keywords: [ + 'arrow', + 'down', + ], + }, + { + code: 'U+1F503', + keywords: [ + 'arrow', + 'clockwise', + 'reload', + ], + }, + { + code: 'U+1F504', + keywords: [ + 'anticlockwise', + 'arrow', + 'counterclockwise', + 'withershins', + ], + }, + { + code: 'U+1F519', + keywords: [ + 'arrow', + 'back', + ], + }, + { + code: 'U+1F51A', + keywords: [ + 'arrow', + 'end', + ], + }, + { + code: 'U+1F51B', + keywords: [ + 'arrow', + 'mark', + 'on', + ], + }, + { + code: 'U+1F51C', + keywords: [ + 'arrow', + 'soon', + ], + }, + { + code: 'U+1F51D', + keywords: [ + 'arrow', + 'top', + 'up', + ], + }, + { + code: 'U+1F6D0', + keywords: [ + 'religion', + 'worship', + ], + }, + { + code: 'U+269B', + keywords: [ + 'atheist', + 'atom', + ], + }, + { + code: 'U+1F549', + keywords: [ + 'hindu', + 'om', + 'religion', + ], + }, + { + code: 'U+2721', + keywords: [ + 'david', + 'jew', + 'jewish', + 'religion', + 'star', + ], + }, + { + code: 'U+2638', + keywords: [ + 'buddhist', + 'dharma', + 'religion', + 'wheel', + ], + }, + { + code: 'U+262F', + keywords: [ + 'religion', + 'tao', + 'taoist', + 'yang', + 'yin', + ], + }, + { + code: 'U+271D', + keywords: [ + 'christian', + 'cross', + 'religion', + ], + }, + { + code: 'U+2626', + keywords: [ + 'christian', + 'cross', + 'religion', + ], + }, + { + code: 'U+262A', + keywords: [ + 'islam', + 'muslim', + 'religion', + ], + }, + { + code: 'U+262E', + keywords: [ + 'peace', + ], + }, + { + code: 'U+1F54E', + keywords: [ + 'candelabrum', + 'candlestick', + 'menorah', + 'religion', + ], + }, + { + code: 'U+1F52F', + keywords: [ + 'fortune', + 'star', + ], + }, + { + code: 'U+267B', + keywords: [ + 'recycle', + ], + }, + { + code: 'U+1F4DB', + keywords: [ + 'badge', + 'name', + ], + }, + { + code: 'U+269C', + keywords: [ + 'fleur-de-lis', + ], + }, + { + code: 'U+1F530', + keywords: [ + 'beginner', + 'chevron', + 'green', + 'japanese', + 'leaf', + 'tool', + 'yellow', + ], + }, + { + code: 'U+1F531', + keywords: [ + 'anchor', + 'emblem', + 'ship', + 'tool', + 'trident', + ], + }, + { + code: 'U+2B55', + keywords: [ + 'circle', + 'o', + ], + }, + { + code: 'U+2705', + keywords: [ + 'check', + 'mark', + ], + }, + { + code: 'U+2611', + keywords: [ + 'ballot', + 'box', + 'check', + ], + }, + { + code: 'U+2714', + keywords: [ + 'check', + 'mark', + ], + }, + { + code: 'U+2716', + keywords: [ + 'cancel', + 'multiplication', + 'multiply', + 'x', + ], + }, + { + code: 'U+274C', + keywords: [ + 'cancel', + 'mark', + 'multiplication', + 'multiply', + 'x', + ], + }, + { + code: 'U+274E', + keywords: [ + 'mark', + 'square', + ], + }, + { + code: 'U+2795', + keywords: [ + 'math', + 'plus', + ], + }, + { + code: 'U+2796', + keywords: [ + 'math', + 'minus', + ], + }, + { + code: 'U+2797', + keywords: [ + 'division', + 'math', + ], + }, + { + code: 'U+27B0', + keywords: [ + 'curl', + 'loop', + ], + }, + { + code: 'U+27BF', + keywords: [ + 'curl', + 'double', + 'loop', + ], + }, + { + code: 'U+303D', + keywords: [ + 'mark', + 'part', + ], + }, + { + code: 'U+2733', + keywords: [ + 'asterisk', + ], + }, + { + code: 'U+2734', + keywords: [ + 'star', + ], + }, + { + code: 'U+2747', + keywords: [ + 'sparkle', + ], + }, + { + code: 'U+203C', + keywords: [ + 'bangbang', + 'exclamation', + 'mark', + 'punctuation', + ], + }, + { + code: 'U+2049', + keywords: [ + 'exclamation', + 'interrobang', + 'mark', + 'punctuation', + 'question', + ], + }, + { + code: 'U+2753', + keywords: [ + 'mark', + 'punctuation', + 'question', + ], + }, + { + code: 'U+2754', + keywords: [ + 'mark', + 'outlined', + 'punctuation', + 'question', + ], + }, + { + code: 'U+2755', + keywords: [ + 'exclamation', + 'mark', + 'outlined', + 'punctuation', + ], + }, + { + code: 'U+2757', + keywords: [ + 'exclamation', + 'mark', + 'punctuation', + ], + }, + { + code: 'U+3030', + keywords: [ + 'dash', + 'punctuation', + 'wavy', + ], + }, + { + code: 'U+00A9', + keywords: [ + 'copyright', + ], + }, + { + code: 'U+00AE', + keywords: [ + 'registered', + ], + }, + { + code: 'U+2122', + keywords: [ + 'mark', + 'tm', + 'trademark', + ], + }, + { + code: 'U+2648', + keywords: [ + 'aries', + 'ram', + 'zodiac', + ], + }, + { + code: 'U+2649', + keywords: [ + 'bull', + 'ox', + 'taurus', + 'zodiac', + ], + }, + { + code: 'U+264A', + keywords: [ + 'gemini', + 'twins', + 'zodiac', + ], + }, + { + code: 'U+264B', + keywords: [ + 'cancer', + 'crab', + 'zodiac', + ], + }, + { + code: 'U+264C', + keywords: [ + 'leo', + 'lion', + 'zodiac', + ], + }, + { + code: 'U+264D', + keywords: [ + 'maiden', + 'virgin', + 'virgo', + 'zodiac', + ], + }, + { + code: 'U+264E', + keywords: [ + 'balance', + 'justice', + 'libra', + 'scales', + 'zodiac', + ], + }, + { + code: 'U+264F', + keywords: [ + 'scorpio', + 'scorpion', + 'scorpius', + 'zodiac', + ], + }, + { + code: 'U+2650', + keywords: [ + 'archer', + 'sagittarius', + 'zodiac', + ], + }, + { + code: 'U+2651', + keywords: [ + 'capricorn', + 'goat', + 'zodiac', + ], + }, + { + code: 'U+2652', + keywords: [ + 'aquarius', + 'bearer', + 'water', + 'zodiac', + ], + }, + { + code: 'U+2653', + keywords: [ + 'fish', + 'pisces', + 'zodiac', + ], + }, + { + code: 'U+26CE', + keywords: [ + 'bearer', + 'ophiuchus', + 'serpent', + 'snake', + 'zodiac', + ], + }, + { + code: 'U+1F500', + keywords: [ + 'arrow', + 'crossed', + ], + }, + { + code: 'U+1F501', + keywords: [ + 'arrow', + 'clockwise', + 'repeat', + ], + }, + { + code: 'U+1F502', + keywords: [ + 'arrow', + 'clockwise', + 'once', + ], + }, + { + code: 'U+25B6', + keywords: [ + 'arrow', + 'play', + 'right', + 'triangle', + ], + }, + { + code: 'U+23E9', + keywords: [ + 'arrow', + 'double', + 'fast', + 'forward', + ], + }, + { + code: 'U+23ED', + keywords: [ + 'arrow', + 'next scene', + 'next track', + 'triangle', + ], + }, + { + code: 'U+23EF', + keywords: [ + 'arrow', + 'pause', + 'play', + 'right', + 'triangle', + ], + }, + { + code: 'U+25C0', + keywords: [ + 'arrow', + 'left', + 'reverse', + 'triangle', + ], + }, + { + code: 'U+23EA', + keywords: [ + 'arrow', + 'double', + 'rewind', + ], + }, + { + code: 'U+23EE', + keywords: [ + 'arrow', + 'previous scene', + 'previous track', + 'triangle', + ], + }, + { + code: 'U+1F53C', + keywords: [ + 'arrow', + 'button', + 'red', + ], + }, + { + code: 'U+23EB', + keywords: [ + 'arrow', + 'double', + ], + }, + { + code: 'U+1F53D', + keywords: [ + 'arrow', + 'button', + 'down', + 'red', + ], + }, + { + code: 'U+23EC', + keywords: [ + 'arrow', + 'double', + 'down', + ], + }, + { + code: 'U+23F8', + keywords: [ + 'bar', + 'double', + 'pause', + 'vertical', + ], + }, + { + code: 'U+23F9', + keywords: [ + 'square', + 'stop', + ], + }, + { + code: 'U+23FA', + keywords: [ + 'circle', + 'record', + ], + }, + { + code: 'U+23CF', + keywords: [ + 'eject', + ], + }, + { + code: 'U+1F3A6', + keywords: [ + 'activity', + 'camera', + 'cinema', + 'entertainment', + 'film', + 'movie', + ], + }, + { + code: 'U+1F505', + keywords: [ + 'brightness', + 'dim', + 'low', + ], + }, + { + code: 'U+1F506', + keywords: [ + 'bright', + 'brightness', + ], + }, + { + code: 'U+1F4F6', + keywords: [ + 'antenna', + 'bar', + 'cell', + 'communication', + 'mobile', + 'phone', + 'signal', + 'telephone', + ], + }, + { + code: 'U+1F4F3', + keywords: [ + 'cell', + 'communication', + 'mobile', + 'mode', + 'phone', + 'telephone', + 'vibration', + ], + }, + { + code: 'U+1F4F4', + keywords: [ + 'cell', + 'communication', + 'mobile', + 'off', + 'phone', + 'telephone', + ], + }, + { + code: 'U+0023 U+FE0F U+20E3', + keywords: [ + 'hash', + 'keycap', + 'pound', + ], + }, + { + code: 'U+002A U+FE0F U+20E3', + keywords: [ + 'asterisk', + 'keycap', + 'star', + ], + }, + { + code: 'U+0030 U+FE0F U+20E3', + keywords: [ + '0', + 'keycap', + 'zero', + ], + }, + { + code: 'U+0031 U+FE0F U+20E3', + keywords: [ + '1', + 'keycap', + 'one', + ], + }, + { + code: 'U+0032 U+FE0F U+20E3', + keywords: [ + '2', + 'keycap', + 'two', + ], + }, + { + code: 'U+0033 U+FE0F U+20E3', + keywords: [ + '3', + 'keycap', + 'three', + ], + }, + { + code: 'U+0034 U+FE0F U+20E3', + keywords: [ + '4', + 'four', + 'keycap', + ], + }, + { + code: 'U+0035 U+FE0F U+20E3', + keywords: [ + '5', + 'five', + 'keycap', + ], + }, + { + code: 'U+0036 U+FE0F U+20E3', + keywords: [ + '6', + 'keycap', + 'six', + ], + }, + { + code: 'U+0037 U+FE0F U+20E3', + keywords: [ + '7', + 'keycap', + 'seven', + ], + }, + { + code: 'U+0038 U+FE0F U+20E3', + keywords: [ + '8', + 'eight', + 'keycap', + ], + }, + { + code: 'U+0039 U+FE0F U+20E3', + keywords: [ + '9', + 'keycap', + 'nine', + ], + }, + { + code: 'U+1F51F', + keywords: [ + '10', + 'keycap', + 'ten', + ], + }, + { + code: 'U+1F4AF', + keywords: [ + '100', + 'full', + 'hundred', + 'score', + ], + }, + { + code: 'U+1F520', + keywords: [ + 'input', + 'latin', + 'letters', + 'uppercase', + ], + }, + { + code: 'U+1F521', + keywords: [ + 'abcd', + 'input', + 'latin', + 'letters', + 'lowercase', + ], + }, + { + code: 'U+1F522', + keywords: [ + '1234', + 'input', + 'numbers', + ], + }, + { + code: 'U+1F523', + keywords: [ + 'input', + ], + }, + { + code: 'U+1F524', + keywords: [ + 'abc', + 'alphabet', + 'input', + 'latin', + 'letters', + ], + }, + { + code: 'U+1F170', + keywords: [ + 'a', + 'blood', + ], + }, + { + code: 'U+1F18E', + keywords: [ + 'ab', + 'blood', + ], + }, + { + code: 'U+1F171', + keywords: [ + 'b', + 'blood', + ], + }, + { + code: 'U+1F191', + keywords: [ + 'cl', + ], + }, + { + code: 'U+1F192', + keywords: [ + 'cool', + ], + }, + { + code: 'U+1F193', + keywords: [ + 'free', + ], + }, + { + code: 'U+2139', + keywords: [ + 'i', + 'information', + ], + }, + { + code: 'U+1F194', + keywords: [ + 'id', + 'identity', + ], + }, + { + code: 'U+24C2', + keywords: [ + 'circle', + 'm', + ], + }, + { + code: 'U+1F195', + keywords: [ + 'new', + ], + }, + { + code: 'U+1F196', + keywords: [ + 'ng', + ], + }, + { + code: 'U+1F17E', + keywords: [ + 'blood', + 'o', + ], + }, + { + code: 'U+1F197', + keywords: [ + 'ok', + ], + }, + { + code: 'U+1F17F', + keywords: [ + 'parking', + ], + }, + { + code: 'U+1F198', + keywords: [ + 'help', + 'sos', + ], + }, + { + code: 'U+1F199', + keywords: [ + 'mark', + 'up', + ], + }, + { + code: 'U+1F19A', + keywords: [ + 'versus', + 'vs', + ], + }, + { + code: 'U+1F201', + keywords: [ + 'japanese', + ], + }, + { + code: 'U+1F202', + keywords: [ + 'japanese', + ], + }, + { + code: 'U+1F237', + keywords: [ + 'japanese', + ], + }, + { + code: 'U+1F236', + keywords: [ + 'japanese', + ], + }, + { + code: 'U+1F22F', + keywords: [ + 'japanese', + ], + }, + { + code: 'U+1F250', + keywords: [ + 'japanese', + ], + }, + { + code: 'U+1F239', + keywords: [ + 'japanese', + ], + }, + { + code: 'U+1F21A', + keywords: [ + 'japanese', + ], + }, + { + code: 'U+1F232', + keywords: [ + 'japanese', + ], + }, + { + code: 'U+1F251', + keywords: [ + 'chinese', + ], + }, + { + code: 'U+1F238', + keywords: [ + 'chinese', + ], + }, + { + code: 'U+1F234', + keywords: [ + 'chinese', + ], + }, + { + code: 'U+1F233', + keywords: [ + 'chinese', + ], + }, + { + code: 'U+3297', + keywords: [ + 'chinese', + 'congratulation', + 'congratulations', + 'ideograph', + ], + }, + { + code: 'U+3299', + keywords: [ + 'chinese', + 'ideograph', + 'secret', + ], + }, + { + code: 'U+1F23A', + keywords: [ + 'chinese', + ], + }, + { + code: 'U+1F235', + keywords: [ + 'chinese', + ], + }, + { + code: 'U+25AA', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'U+25AB', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'U+25FB', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'U+25FC', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'U+25FD', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'U+25FE', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'U+2B1B', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'U+2B1C', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'U+1F536', + keywords: [ + 'diamond', + 'geometric', + 'orange', + ], + }, + { + code: 'U+1F537', + keywords: [ + 'blue', + 'diamond', + 'geometric', + ], + }, + { + code: 'U+1F538', + keywords: [ + 'diamond', + 'geometric', + 'orange', + ], + }, + { + code: 'U+1F539', + keywords: [ + 'blue', + 'diamond', + 'geometric', + ], + }, + { + code: 'U+1F53A', + keywords: [ + 'geometric', + 'red', + ], + }, + { + code: 'U+1F53B', + keywords: [ + 'down', + 'geometric', + 'red', + ], + }, + { + code: 'U+1F4A0', + keywords: [ + 'comic', + 'diamond', + 'geometric', + 'inside', + ], + }, + { + code: 'U+1F518', + keywords: [ + 'button', + 'geometric', + 'radio', + ], + }, + { + code: 'U+1F532', + keywords: [ + 'button', + 'geometric', + 'square', + ], + }, + { + code: 'U+1F533', + keywords: [ + 'button', + 'geometric', + 'outlined', + 'square', + ], + }, + { + code: 'U+26AA', + keywords: [ + 'circle', + 'geometric', + ], + }, + { + code: 'U+26AB', + keywords: [ + 'circle', + 'geometric', + ], + }, + { + code: 'U+1F534', + keywords: [ + 'circle', + 'geometric', + 'red', + ], + }, + { + code: 'U+1F535', + keywords: [ + 'blue', + 'circle', + 'geometric', + ], + }, + ], + Flags: [ + { + code: 'U+1F3C1', + keywords: [ + 'checkered', + 'chequered', + 'flag', + 'racing', + ], + }, + { + code: 'U+1F6A9', + keywords: [ + 'flag', + 'post', + ], + }, + { + code: 'U+1F38C', + keywords: [ + 'activity', + 'celebration', + 'cross', + 'crossed', + 'flag', + 'japanese', + ], + }, + { + code: 'U+1F3F4', + keywords: [ + 'flag', + 'waving', + ], + }, + { + code: 'U+1F3F3', + keywords: [ + 'flag', + 'waving', + ], + }, + { + code: 'U+1F1E6 U+1F1E8', + keywords: [ + 'ascension', + 'flag', + 'island', + ], + }, + { + code: 'U+1F1E6 U+1F1E9', + keywords: [ + 'andorra', + 'flag', + ], + }, + { + code: 'U+1F1E6 U+1F1EA', + keywords: [ + 'emirates', + 'flag', + 'uae', + 'united', + ], + }, + { + code: 'U+1F1E6 U+1F1EB', + keywords: [ + 'afghanistan', + 'flag', + ], + }, + { + code: 'U+1F1E6 U+1F1EC', + keywords: [ + 'antigua', + 'barbuda', + 'flag', + ], + }, + { + code: 'U+1F1E6 U+1F1EE', + keywords: [ + 'anguilla', + 'flag', + ], + }, + { + code: 'U+1F1E6 U+1F1F1', + keywords: [ + 'albania', + 'flag', + ], + }, + { + code: 'U+1F1E6 U+1F1F2', + keywords: [ + 'armenia', + 'flag', + ], + }, + { + code: 'U+1F1E6 U+1F1F4', + keywords: [ + 'angola', + 'flag', + ], + }, + { + code: 'U+1F1E6 U+1F1F6', + keywords: [ + 'antarctica', + 'flag', + ], + }, + { + code: 'U+1F1E6 U+1F1F7', + keywords: [ + 'argentina', + 'flag', + ], + }, + { + code: 'U+1F1E6 U+1F1F8', + keywords: [ + 'american', + 'flag', + 'samoa', + ], + }, + { + code: 'U+1F1E6 U+1F1F9', + keywords: [ + 'austria', + 'flag', + ], + }, + { + code: 'U+1F1E6 U+1F1FA', + keywords: [ + 'australia', + 'flag', + ], + }, + { + code: 'U+1F1E6 U+1F1FC', + keywords: [ + 'aruba', + 'flag', + ], + }, + { + code: 'U+1F1E6 U+1F1FD', + keywords: [ + 'Ć„land', + 'flag', + ], + }, + { + code: 'U+1F1E6 U+1F1FF', + keywords: [ + 'azerbaijan', + 'flag', + ], + }, + { + code: 'U+1F1E7 U+1F1E6', + keywords: [ + 'bosnia', + 'flag', + 'herzegovina', + ], + }, + { + code: 'U+1F1E7 U+1F1E7', + keywords: [ + 'barbados', + 'flag', + ], + }, + { + code: 'U+1F1E7 U+1F1E9', + keywords: [ + 'bangladesh', + 'flag', + ], + }, + { + code: 'U+1F1E7 U+1F1EA', + keywords: [ + 'belgium', + 'flag', + ], + }, + { + code: 'U+1F1E7 U+1F1EB', + keywords: [ + 'burkina faso', + 'flag', + ], + }, + { + code: 'U+1F1E7 U+1F1EC', + keywords: [ + 'bulgaria', + 'flag', + ], + }, + { + code: 'U+1F1E7 U+1F1ED', + keywords: [ + 'bahrain', + 'flag', + ], + }, + { + code: 'U+1F1E7 U+1F1EE', + keywords: [ + 'burundi', + 'flag', + ], + }, + { + code: 'U+1F1E7 U+1F1EF', + keywords: [ + 'benin', + 'flag', + ], + }, + { + code: 'U+1F1E7 U+1F1F1', + keywords: [ + 'barthelemy', + 'barthĆ©lemy', + 'flag', + 'saint', + ], + }, + { + code: 'U+1F1E7 U+1F1F2', + keywords: [ + 'bermuda', + 'flag', + ], + }, + { + code: 'U+1F1E7 U+1F1F3', + keywords: [ + 'brunei', + 'darussalam', + 'flag', + ], + }, + { + code: 'U+1F1E7 U+1F1F4', + keywords: [ + 'bolivia', + 'flag', + ], + }, + { + code: 'U+1F1E7 U+1F1F6', + keywords: [ + 'bonaire', + 'caribbean', + 'eustatius', + 'flag', + 'netherlands', + 'saba', + 'sint', + ], + }, + { + code: 'U+1F1E7 U+1F1F7', + keywords: [ + 'brazil', + 'flag', + ], + }, + { + code: 'U+1F1E7 U+1F1F8', + keywords: [ + 'bahamas', + 'flag', + ], + }, + { + code: 'U+1F1E7 U+1F1F9', + keywords: [ + 'bhutan', + 'flag', + ], + }, + { + code: 'U+1F1E7 U+1F1FB', + keywords: [ + 'bouvet', + 'flag', + 'island', + ], + }, + { + code: 'U+1F1E7 U+1F1FC', + keywords: [ + 'botswana', + 'flag', + ], + }, + { + code: 'U+1F1E7 U+1F1FE', + keywords: [ + 'belarus', + 'flag', + ], + }, + { + code: 'U+1F1E7 U+1F1FF', + keywords: [ + 'belize', + 'flag', + ], + }, + { + code: 'U+1F1E8 U+1F1E6', + keywords: [ + 'canada', + 'flag', + ], + }, + { + code: 'U+1F1E8 U+1F1E8', + keywords: [ + 'cocos', + 'flag', + 'island', + 'keeling', + ], + }, + { + code: 'U+1F1E8 U+1F1E9', + keywords: [ + 'congo', + 'congo-kinshasa', + 'democratic republic of congo', + 'drc', + 'flag', + 'kinshasa', + 'republic', + ], + }, + { + code: 'U+1F1E8 U+1F1EB', + keywords: [ + 'central african republic', + 'flag', + 'republic', + ], + }, + { + code: 'U+1F1E8 U+1F1EC', + keywords: [ + 'brazzaville', + 'congo', + 'congo republic', + 'congo-brazzaville', + 'flag', + 'republic', + 'republic of the congo', + ], + }, + { + code: 'U+1F1E8 U+1F1ED', + keywords: [ + 'flag', + 'switzerland', + ], + }, + { + code: 'U+1F1E8 U+1F1EE', + keywords: [ + 'cote ivoire', + 'cĆ“te ivoire', + 'flag', + 'ivory coast', + ], + }, + { + code: 'U+1F1E8 U+1F1F0', + keywords: [ + 'cook', + 'flag', + 'island', + ], + }, + { + code: 'U+1F1E8 U+1F1F1', + keywords: [ + 'chile', + 'flag', + ], + }, + { + code: 'U+1F1E8 U+1F1F2', + keywords: [ + 'cameroon', + 'flag', + ], + }, + { + code: 'U+1F1E8 U+1F1F3', + keywords: [ + 'china', + 'flag', + ], + }, + { + code: 'U+1F1E8 U+1F1F4', + keywords: [ + 'colombia', + 'flag', + ], + }, + { + code: 'U+1F1E8 U+1F1F5', + keywords: [ + 'clipperton', + 'flag', + 'island', + ], + }, + { + code: 'U+1F1E8 U+1F1F7', + keywords: [ + 'costa rica', + 'flag', + ], + }, + { + code: 'U+1F1E8 U+1F1FA', + keywords: [ + 'cuba', + 'flag', + ], + }, + { + code: 'U+1F1E8 U+1F1FB', + keywords: [ + 'cabo', + 'cape', + 'flag', + 'verde', + ], + }, + { + code: 'U+1F1E8 U+1F1FC', + keywords: [ + 'antilles', + 'curacao', + 'curaƧao', + 'flag', + ], + }, + { + code: 'U+1F1E8 U+1F1FD', + keywords: [ + 'christmas', + 'flag', + 'island', + ], + }, + { + code: 'U+1F1E8 U+1F1FE', + keywords: [ + 'cyprus', + 'flag', + ], + }, + { + code: 'U+1F1E8 U+1F1FF', + keywords: [ + 'czech republic', + 'flag', + ], + }, + { + code: 'U+1F1E9 U+1F1EA', + keywords: [ + 'flag', + 'germany', + ], + }, + { + code: 'U+1F1E9 U+1F1EC', + keywords: [ + 'diego garcia', + 'flag', + ], + }, + { + code: 'U+1F1E9 U+1F1EF', + keywords: [ + 'djibouti', + 'flag', + ], + }, + { + code: 'U+1F1E9 U+1F1F0', + keywords: [ + 'denmark', + 'flag', + ], + }, + { + code: 'U+1F1E9 U+1F1F2', + keywords: [ + 'dominica', + 'flag', + ], + }, + { + code: 'U+1F1E9 U+1F1F4', + keywords: [ + 'dominican republic', + 'flag', + ], + }, + { + code: 'U+1F1E9 U+1F1FF', + keywords: [ + 'algeria', + 'flag', + ], + }, + { + code: 'U+1F1EA U+1F1E6', + keywords: [ + 'ceuta', + 'flag', + 'melilla', + ], + }, + { + code: 'U+1F1EA U+1F1E8', + keywords: [ + 'ecuador', + 'flag', + ], + }, + { + code: 'U+1F1EA U+1F1EA', + keywords: [ + 'estonia', + 'flag', + ], + }, + { + code: 'U+1F1EA U+1F1EC', + keywords: [ + 'egypt', + 'flag', + ], + }, + { + code: 'U+1F1EA U+1F1ED', + keywords: [ + 'flag', + 'sahara', + 'west', + 'western sahara', + ], + }, + { + code: 'U+1F1EA U+1F1F7', + keywords: [ + 'eritrea', + 'flag', + ], + }, + { + code: 'U+1F1EA U+1F1F8', + keywords: [ + 'flag', + 'spain', + ], + }, + { + code: 'U+1F1EA U+1F1F9', + keywords: [ + 'ethiopia', + 'flag', + ], + }, + { + code: 'U+1F1EA U+1F1FA', + keywords: [ + 'european union', + 'flag', + ], + }, + { + code: 'U+1F1EB U+1F1EE', + keywords: [ + 'finland', + 'flag', + ], + }, + { + code: 'U+1F1EB U+1F1EF', + keywords: [ + 'fiji', + 'flag', + ], + }, + { + code: 'U+1F1EB U+1F1F0', + keywords: [ + 'falkland', + 'falklands', + 'flag', + 'island', + 'islas', + 'malvinas', + ], + }, + { + code: 'U+1F1EB U+1F1F2', + keywords: [ + 'flag', + 'micronesia', + ], + }, + { + code: 'U+1F1EB U+1F1F4', + keywords: [ + 'faroe', + 'flag', + 'island', + ], + }, + { + code: 'U+1F1EB U+1F1F7', + keywords: [ + 'flag', + 'france', + ], + }, + { + code: 'U+1F1EC U+1F1E6', + keywords: [ + 'flag', + 'gabon', + ], + }, + { + code: 'U+1F1EC U+1F1E7', + keywords: [ + 'britain', + 'british', + 'cornwall', + 'england', + 'flag', + 'great britain', + 'ireland', + 'northern ireland', + 'scotland', + 'uk', + 'union jack', + 'united', + 'united kingdom', + 'wales', + ], + }, + { + code: 'U+1F1EC U+1F1E9', + keywords: [ + 'flag', + 'grenada', + ], + }, + { + code: 'U+1F1EC U+1F1EA', + keywords: [ + 'flag', + 'georgia', + ], + }, + { + code: 'U+1F1EC U+1F1EB', + keywords: [ + 'flag', + 'french', + 'guiana', + ], + }, + { + code: 'U+1F1EC U+1F1EC', + keywords: [ + 'flag', + 'guernsey', + ], + }, + { + code: 'U+1F1EC U+1F1ED', + keywords: [ + 'flag', + 'ghana', + ], + }, + { + code: 'U+1F1EC U+1F1EE', + keywords: [ + 'flag', + 'gibraltar', + ], + }, + { + code: 'U+1F1EC U+1F1F1', + keywords: [ + 'flag', + 'greenland', + ], + }, + { + code: 'U+1F1EC U+1F1F2', + keywords: [ + 'flag', + 'gambia', + ], + }, + { + code: 'U+1F1EC U+1F1F3', + keywords: [ + 'flag', + 'guinea', + ], + }, + { + code: 'U+1F1EC U+1F1F5', + keywords: [ + 'flag', + 'guadeloupe', + ], + }, + { + code: 'U+1F1EC U+1F1F6', + keywords: [ + 'equatorial guinea', + 'flag', + 'guinea', + ], + }, + { + code: 'U+1F1EC U+1F1F7', + keywords: [ + 'flag', + 'greece', + ], + }, + { + code: 'U+1F1EC U+1F1F8', + keywords: [ + 'flag', + 'georgia', + 'island', + 'south', + 'south georgia', + 'south sandwich', + ], + }, + { + code: 'U+1F1EC U+1F1F9', + keywords: [ + 'flag', + 'guatemala', + ], + }, + { + code: 'U+1F1EC U+1F1FA', + keywords: [ + 'flag', + 'guam', + ], + }, + { + code: 'U+1F1EC U+1F1FC', + keywords: [ + 'bissau', + 'flag', + 'guinea', + ], + }, + { + code: 'U+1F1EC U+1F1FE', + keywords: [ + 'flag', + 'guyana', + ], + }, + { + code: 'U+1F1ED U+1F1F0', + keywords: [ + 'china', + 'flag', + 'hong kong', + ], + }, + { + code: 'U+1F1ED U+1F1F2', + keywords: [ + 'flag', + 'heard', + 'island', + 'mcdonald', + ], + }, + { + code: 'U+1F1ED U+1F1F3', + keywords: [ + 'flag', + 'honduras', + ], + }, + { + code: 'U+1F1ED U+1F1F7', + keywords: [ + 'croatia', + 'flag', + ], + }, + { + code: 'U+1F1ED U+1F1F9', + keywords: [ + 'flag', + 'haiti', + ], + }, + { + code: 'U+1F1ED U+1F1FA', + keywords: [ + 'flag', + 'hungary', + ], + }, + { + code: 'U+1F1EE U+1F1E8', + keywords: [ + 'canary', + 'flag', + 'island', + ], + }, + { + code: 'U+1F1EE U+1F1E9', + keywords: [ + 'flag', + 'indonesia', + ], + }, + { + code: 'U+1F1EE U+1F1EA', + keywords: [ + 'flag', + 'ireland', + ], + }, + { + code: 'U+1F1EE U+1F1F1', + keywords: [ + 'flag', + 'israel', + ], + }, + { + code: 'U+1F1EE U+1F1F2', + keywords: [ + 'flag', + 'isle of man', + ], + }, + { + code: 'U+1F1EE U+1F1F3', + keywords: [ + 'flag', + 'india', + ], + }, + { + code: 'U+1F1EE U+1F1F4', + keywords: [ + 'british', + 'chagos', + 'flag', + 'indian ocean', + 'island', + ], + }, + { + code: 'U+1F1EE U+1F1F6', + keywords: [ + 'flag', + 'iraq', + ], + }, + { + code: 'U+1F1EE U+1F1F7', + keywords: [ + 'flag', + 'iran', + ], + }, + { + code: 'U+1F1EE U+1F1F8', + keywords: [ + 'flag', + 'iceland', + ], + }, + { + code: 'U+1F1EE U+1F1F9', + keywords: [ + 'flag', + 'italy', + ], + }, + { + code: 'U+1F1EF U+1F1EA', + keywords: [ + 'flag', + 'jersey', + ], + }, + { + code: 'U+1F1EF U+1F1F2', + keywords: [ + 'flag', + 'jamaica', + ], + }, + { + code: 'U+1F1EF U+1F1F4', + keywords: [ + 'flag', + 'jordan', + ], + }, + { + code: 'U+1F1EF U+1F1F5', + keywords: [ + 'flag', + 'japan', + ], + }, + { + code: 'U+1F1F0 U+1F1EA', + keywords: [ + 'flag', + 'kenya', + ], + }, + { + code: 'U+1F1F0 U+1F1EC', + keywords: [ + 'flag', + 'kyrgyzstan', + ], + }, + { + code: 'U+1F1F0 U+1F1ED', + keywords: [ + 'cambodia', + 'flag', + ], + }, + { + code: 'U+1F1F0 U+1F1EE', + keywords: [ + 'flag', + 'kiribati', + ], + }, + { + code: 'U+1F1F0 U+1F1F2', + keywords: [ + 'comoros', + 'flag', + ], + }, + { + code: 'U+1F1F0 U+1F1F3', + keywords: [ + 'flag', + 'kitts', + 'nevis', + 'saint', + ], + }, + { + code: 'U+1F1F0 U+1F1F5', + keywords: [ + 'flag', + 'korea', + 'north', + 'north korea', + ], + }, + { + code: 'U+1F1F0 U+1F1F7', + keywords: [ + 'flag', + 'korea', + 'south', + 'south korea', + ], + }, + { + code: 'U+1F1F0 U+1F1FC', + keywords: [ + 'flag', + 'kuwait', + ], + }, + { + code: 'U+1F1F0 U+1F1FE', + keywords: [ + 'cayman', + 'flag', + 'island', + ], + }, + { + code: 'U+1F1F0 U+1F1FF', + keywords: [ + 'flag', + 'kazakhstan', + ], + }, + { + code: 'U+1F1F1 U+1F1E6', + keywords: [ + 'flag', + 'laos', + ], + }, + { + code: 'U+1F1F1 U+1F1E7', + keywords: [ + 'flag', + 'lebanon', + ], + }, + { + code: 'U+1F1F1 U+1F1E8', + keywords: [ + 'flag', + 'lucia', + 'saint', + ], + }, + { + code: 'U+1F1F1 U+1F1EE', + keywords: [ + 'flag', + 'liechtenstein', + ], + }, + { + code: 'U+1F1F1 U+1F1F0', + keywords: [ + 'flag', + 'sri lanka', + ], + }, + { + code: 'U+1F1F1 U+1F1F7', + keywords: [ + 'flag', + 'liberia', + ], + }, + { + code: 'U+1F1F1 U+1F1F8', + keywords: [ + 'flag', + 'lesotho', + ], + }, + { + code: 'U+1F1F1 U+1F1F9', + keywords: [ + 'flag', + 'lithuania', + ], + }, + { + code: 'U+1F1F1 U+1F1FA', + keywords: [ + 'flag', + 'luxembourg', + ], + }, + { + code: 'U+1F1F1 U+1F1FB', + keywords: [ + 'flag', + 'latvia', + ], + }, + { + code: 'U+1F1F1 U+1F1FE', + keywords: [ + 'flag', + 'libya', + ], + }, + { + code: 'U+1F1F2 U+1F1E6', + keywords: [ + 'flag', + 'morocco', + ], + }, + { + code: 'U+1F1F2 U+1F1E8', + keywords: [ + 'flag', + 'monaco', + ], + }, + { + code: 'U+1F1F2 U+1F1E9', + keywords: [ + 'flag', + 'moldova', + ], + }, + { + code: 'U+1F1F2 U+1F1EA', + keywords: [ + 'flag', + 'montenegro', + ], + }, + { + code: 'U+1F1F2 U+1F1EB', + keywords: [ + 'flag', + 'french', + 'martin', + 'saint', + ], + }, + { + code: 'U+1F1F2 U+1F1EC', + keywords: [ + 'flag', + 'madagascar', + ], + }, + { + code: 'U+1F1F2 U+1F1ED', + keywords: [ + 'flag', + 'island', + 'marshall', + ], + }, + { + code: 'U+1F1F2 U+1F1F0', + keywords: [ + 'flag', + 'macedonia', + ], + }, + { + code: 'U+1F1F2 U+1F1F1', + keywords: [ + 'flag', + 'mali', + ], + }, + { + code: 'U+1F1F2 U+1F1F2', + keywords: [ + 'burma', + 'flag', + 'myanmar', + ], + }, + { + code: 'U+1F1F2 U+1F1F3', + keywords: [ + 'flag', + 'mongolia', + ], + }, + { + code: 'U+1F1F2 U+1F1F4', + keywords: [ + 'china', + 'flag', + 'macao', + 'macau', + ], + }, + { + code: 'U+1F1F2 U+1F1F5', + keywords: [ + 'flag', + 'island', + 'mariana', + 'north', + 'northern mariana', + ], + }, + { + code: 'U+1F1F2 U+1F1F6', + keywords: [ + 'flag', + 'martinique', + ], + }, + { + code: 'U+1F1F2 U+1F1F7', + keywords: [ + 'flag', + 'mauritania', + ], + }, + { + code: 'U+1F1F2 U+1F1F8', + keywords: [ + 'flag', + 'montserrat', + ], + }, + { + code: 'U+1F1F2 U+1F1F9', + keywords: [ + 'flag', + 'malta', + ], + }, + { + code: 'U+1F1F2 U+1F1FA', + keywords: [ + 'flag', + 'mauritius', + ], + }, + { + code: 'U+1F1F2 U+1F1FB', + keywords: [ + 'flag', + 'maldives', + ], + }, + { + code: 'U+1F1F2 U+1F1FC', + keywords: [ + 'flag', + 'malawi', + ], + }, + { + code: 'U+1F1F2 U+1F1FD', + keywords: [ + 'flag', + 'mexico', + ], + }, + { + code: 'U+1F1F2 U+1F1FE', + keywords: [ + 'flag', + 'malaysia', + ], + }, + { + code: 'U+1F1F2 U+1F1FF', + keywords: [ + 'flag', + 'mozambique', + ], + }, + { + code: 'U+1F1F3 U+1F1E6', + keywords: [ + 'flag', + 'namibia', + ], + }, + { + code: 'U+1F1F3 U+1F1E8', + keywords: [ + 'flag', + 'new', + 'new caledonia', + ], + }, + { + code: 'U+1F1F3 U+1F1EA', + keywords: [ + 'flag', + 'niger', + ], + }, + { + code: 'U+1F1F3 U+1F1EB', + keywords: [ + 'flag', + 'island', + 'norfolk', + ], + }, + { + code: 'U+1F1F3 U+1F1EC', + keywords: [ + 'flag', + 'nigeria', + ], + }, + { + code: 'U+1F1F3 U+1F1EE', + keywords: [ + 'flag', + 'nicaragua', + ], + }, + { + code: 'U+1F1F3 U+1F1F1', + keywords: [ + 'flag', + 'netherlands', + ], + }, + { + code: 'U+1F1F3 U+1F1F4', + keywords: [ + 'flag', + 'norway', + ], + }, + { + code: 'U+1F1F3 U+1F1F5', + keywords: [ + 'flag', + 'nepal', + ], + }, + { + code: 'U+1F1F3 U+1F1F7', + keywords: [ + 'flag', + 'nauru', + ], + }, + { + code: 'U+1F1F3 U+1F1FA', + keywords: [ + 'flag', + 'niue', + ], + }, + { + code: 'U+1F1F3 U+1F1FF', + keywords: [ + 'flag', + 'new', + 'new zealand', + ], + }, + { + code: 'U+1F1F4 U+1F1F2', + keywords: [ + 'flag', + 'oman', + ], + }, + { + code: 'U+1F1F5 U+1F1E6', + keywords: [ + 'flag', + 'panama', + ], + }, + { + code: 'U+1F1F5 U+1F1EA', + keywords: [ + 'flag', + 'peru', + ], + }, + { + code: 'U+1F1F5 U+1F1EB', + keywords: [ + 'flag', + 'french', + 'polynesia', + ], + }, + { + code: 'U+1F1F5 U+1F1EC', + keywords: [ + 'flag', + 'guinea', + 'new', + 'papua new guinea', + ], + }, + { + code: 'U+1F1F5 U+1F1ED', + keywords: [ + 'flag', + 'philippines', + ], + }, + { + code: 'U+1F1F5 U+1F1F0', + keywords: [ + 'flag', + 'pakistan', + ], + }, + { + code: 'U+1F1F5 U+1F1F1', + keywords: [ + 'flag', + 'poland', + ], + }, + { + code: 'U+1F1F5 U+1F1F2', + keywords: [ + 'flag', + 'miquelon', + 'pierre', + 'saint', + ], + }, + { + code: 'U+1F1F5 U+1F1F3', + keywords: [ + 'flag', + 'island', + 'pitcairn', + ], + }, + { + code: 'U+1F1F5 U+1F1F7', + keywords: [ + 'flag', + 'puerto rico', + ], + }, + { + code: 'U+1F1F5 U+1F1F8', + keywords: [ + 'flag', + 'palestine', + ], + }, + { + code: 'U+1F1F5 U+1F1F9', + keywords: [ + 'flag', + 'portugal', + ], + }, + { + code: 'U+1F1F5 U+1F1FC', + keywords: [ + 'flag', + 'palau', + ], + }, + { + code: 'U+1F1F5 U+1F1FE', + keywords: [ + 'flag', + 'paraguay', + ], + }, + { + code: 'U+1F1F6 U+1F1E6', + keywords: [ + 'flag', + 'qatar', + ], + }, + { + code: 'U+1F1F7 U+1F1EA', + keywords: [ + 'flag', + 'reunion', + 'rĆ©union', + ], + }, + { + code: 'U+1F1F7 U+1F1F4', + keywords: [ + 'flag', + 'romania', + ], + }, + { + code: 'U+1F1F7 U+1F1F8', + keywords: [ + 'flag', + 'serbia', + ], + }, + { + code: 'U+1F1F7 U+1F1FA', + keywords: [ + 'flag', + 'russia', + ], + }, + { + code: 'U+1F1F7 U+1F1FC', + keywords: [ + 'flag', + 'rwanda', + ], + }, + { + code: 'U+1F1F8 U+1F1E6', + keywords: [ + 'flag', + 'saudi arabia', + ], + }, + { + code: 'U+1F1F8 U+1F1E7', + keywords: [ + 'flag', + 'island', + 'solomon', + ], + }, + { + code: 'U+1F1F8 U+1F1E8', + keywords: [ + 'flag', + 'seychelles', + ], + }, + { + code: 'U+1F1F8 U+1F1E9', + keywords: [ + 'flag', + 'sudan', + ], + }, + { + code: 'U+1F1F8 U+1F1EA', + keywords: [ + 'flag', + 'sweden', + ], + }, + { + code: 'U+1F1F8 U+1F1EC', + keywords: [ + 'flag', + 'singapore', + ], + }, + { + code: 'U+1F1F8 U+1F1ED', + keywords: [ + 'flag', + 'helena', + 'saint', + ], + }, + { + code: 'U+1F1F8 U+1F1EE', + keywords: [ + 'flag', + 'slovenia', + ], + }, + { + code: 'U+1F1F8 U+1F1EF', + keywords: [ + 'flag', + 'jan mayen', + 'svalbard', + ], + }, + { + code: 'U+1F1F8 U+1F1F0', + keywords: [ + 'flag', + 'slovakia', + ], + }, + { + code: 'U+1F1F8 U+1F1F1', + keywords: [ + 'flag', + 'sierra leone', + ], + }, + { + code: 'U+1F1F8 U+1F1F2', + keywords: [ + 'flag', + 'san marino', + ], + }, + { + code: 'U+1F1F8 U+1F1F3', + keywords: [ + 'flag', + 'senegal', + ], + }, + { + code: 'U+1F1F8 U+1F1F4', + keywords: [ + 'flag', + 'somalia', + ], + }, + { + code: 'U+1F1F8 U+1F1F7', + keywords: [ + 'flag', + 'suriname', + ], + }, + { + code: 'U+1F1F8 U+1F1F8', + keywords: [ + 'flag', + 'south', + 'south sudan', + 'sudan', + ], + }, + { + code: 'U+1F1F8 U+1F1F9', + keywords: [ + 'flag', + 'principe', + 'prĆ­ncipe', + 'sao tome', + 'sĆ£o tomĆ©', + ], + }, + { + code: 'U+1F1F8 U+1F1FB', + keywords: [ + 'el salvador', + 'flag', + ], + }, + { + code: 'U+1F1F8 U+1F1FD', + keywords: [ + 'flag', + 'maarten', + 'sint', + ], + }, + { + code: 'U+1F1F8 U+1F1FE', + keywords: [ + 'flag', + 'syria', + ], + }, + { + code: 'U+1F1F8 U+1F1FF', + keywords: [ + 'flag', + 'swaziland', + ], + }, + { + code: 'U+1F1F9 U+1F1E6', + keywords: [ + 'flag', + 'tristan da cunha', + ], + }, + { + code: 'U+1F1F9 U+1F1E8', + keywords: [ + 'caicos', + 'flag', + 'island', + 'turks', + ], + }, + { + code: 'U+1F1F9 U+1F1E9', + keywords: [ + 'chad', + 'flag', + ], + }, + { + code: 'U+1F1F9 U+1F1EB', + keywords: [ + 'antarctic', + 'flag', + 'french', + ], + }, + { + code: 'U+1F1F9 U+1F1EC', + keywords: [ + 'flag', + 'togo', + ], + }, + { + code: 'U+1F1F9 U+1F1ED', + keywords: [ + 'flag', + 'thailand', + ], + }, + { + code: 'U+1F1F9 U+1F1EF', + keywords: [ + 'flag', + 'tajikistan', + ], + }, + { + code: 'U+1F1F9 U+1F1F0', + keywords: [ + 'flag', + 'tokelau', + ], + }, + { + code: 'U+1F1F9 U+1F1F1', + keywords: [ + 'east', + 'east timor', + 'flag', + 'timor-leste', + ], + }, + { + code: 'U+1F1F9 U+1F1F2', + keywords: [ + 'flag', + 'turkmenistan', + ], + }, + { + code: 'U+1F1F9 U+1F1F3', + keywords: [ + 'flag', + 'tunisia', + ], + }, + { + code: 'U+1F1F9 U+1F1F4', + keywords: [ + 'flag', + 'tonga', + ], + }, + { + code: 'U+1F1F9 U+1F1F7', + keywords: [ + 'flag', + 'turkey', + ], + }, + { + code: 'U+1F1F9 U+1F1F9', + keywords: [ + 'flag', + 'tobago', + 'trinidad', + ], + }, + { + code: 'U+1F1F9 U+1F1FB', + keywords: [ + 'flag', + 'tuvalu', + ], + }, + { + code: 'U+1F1F9 U+1F1FC', + keywords: [ + 'china', + 'flag', + 'taiwan', + ], + }, + { + code: 'U+1F1F9 U+1F1FF', + keywords: [ + 'flag', + 'tanzania', + ], + }, + { + code: 'U+1F1FA U+1F1E6', + keywords: [ + 'flag', + 'ukraine', + ], + }, + { + code: 'U+1F1FA U+1F1EC', + keywords: [ + 'flag', + 'uganda', + ], + }, + { + code: 'U+1F1FA U+1F1F2', + keywords: [ + 'america', + 'flag', + 'island', + 'minor outlying', + 'united', + 'united states', + 'us', + 'usa', + ], + }, + { + code: 'U+1F1FA U+1F1F8', + keywords: [ + 'america', + 'flag', + 'stars and stripes', + 'united', + 'united states', + ], + }, + { + code: 'U+1F1FA U+1F1FE', + keywords: [ + 'flag', + 'uruguay', + ], + }, + { + code: 'U+1F1FA U+1F1FF', + keywords: [ + 'flag', + 'uzbekistan', + ], + }, + { + code: 'U+1F1FB U+1F1E6', + keywords: [ + 'flag', + 'vatican', + ], + }, + { + code: 'U+1F1FB U+1F1E8', + keywords: [ + 'flag', + 'grenadines', + 'saint', + 'vincent', + ], + }, + { + code: 'U+1F1FB U+1F1EA', + keywords: [ + 'flag', + 'venezuela', + ], + }, + { + code: 'U+1F1FB U+1F1EC', + keywords: [ + 'british', + 'flag', + 'island', + 'virgin', + ], + }, + { + code: 'U+1F1FB U+1F1EE', + keywords: [ + 'america', + 'american', + 'flag', + 'island', + 'united', + 'united states', + 'us', + 'usa', + 'virgin', + ], + }, + { + code: 'U+1F1FB U+1F1F3', + keywords: [ + 'flag', + 'viet nam', + 'vietnam', + ], + }, + { + code: 'U+1F1FB U+1F1FA', + keywords: [ + 'flag', + 'vanuatu', + ], + }, + { + code: 'U+1F1FC U+1F1EB', + keywords: [ + 'flag', + 'futuna', + 'wallis', + ], + }, + { + code: 'U+1F1FC U+1F1F8', + keywords: [ + 'flag', + 'samoa', + ], + }, + { + code: 'U+1F1FD U+1F1F0', + keywords: [ + 'flag', + 'kosovo', + ], + }, + { + code: 'U+1F1FE U+1F1EA', + keywords: [ + 'flag', + 'yemen', + ], + }, + { + code: 'U+1F1FE U+1F1F9', + keywords: [ + 'flag', + 'mayotte', + ], + }, + { + code: 'U+1F1FF U+1F1E6', + keywords: [ + 'flag', + 'south', + 'south africa', + ], + }, + { + code: 'U+1F1FF U+1F1F2', + keywords: [ + 'flag', + 'zambia', + ], + }, + { + code: 'U+1F1FF U+1F1FC', + keywords: [ + 'flag', + 'zimbabwe', + ], + }, + ], +}; + +export default emojis; From 1ed958ae149b23691be4acef9de77be9d5df2eab Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Fri, 19 Mar 2021 12:21:23 +0800 Subject: [PATCH 002/380] added flex: 1 to set password page --- src/styles/styles.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/styles/styles.js b/src/styles/styles.js index a63bf3039626..df9164dacf0c 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -326,6 +326,7 @@ const styles = { backgroundColor: themeColors.sidebar, padding: 20, minHeight: '100%', + flex: 1, }, signInPageLogo: { From 3aef3db574040818bcce5496d665dfc6121313ce Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Fri, 19 Mar 2021 10:55:39 -0600 Subject: [PATCH 003/380] Add emoji picker components and link them to reportActionCompose --- src/pages/home/report/EmojiPickerMenu.js | 96 ++++++++++++++++++++ src/pages/home/report/EmojiPickerMenuItem.js | 29 ++++++ src/pages/home/report/ReportActionCompose.js | 72 +++++++++++++++ 3 files changed, 197 insertions(+) create mode 100644 src/pages/home/report/EmojiPickerMenu.js create mode 100644 src/pages/home/report/EmojiPickerMenuItem.js diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js new file mode 100644 index 000000000000..6c8acd2dd349 --- /dev/null +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -0,0 +1,96 @@ +import React from 'react'; +import {View, Text} from 'react-native'; +import PropTypes from 'prop-types'; +import styles from '../../../styles/styles'; +import themeColors from '../../../styles/themes/default'; + +import ReportActionContextMenuItem from './ReportActionContextMenuItem'; +import emojis from '../../../../assets/emojis'; +import EmojiPickerMenuItem from './EmojiPickerMenuItem'; + +const propTypes = { + // Controls the visibility of this component. + isVisible: PropTypes.bool, +}; + +const defaultProps = { + isVisible: false, +}; + +const EmojiPickerMenu = (props) => { + + + return props.isVisible && ( + + + Smileys & People + + {emojis['Smileys & People'].map(emoji => ( + + ))} + + Animals & Nature + + {emojis['Animals & Nature'].map(emoji => ( + + ))} + + Travel & Places + + {emojis['Travel & Places'].map(emoji => ( + + ))} + + Activities + + {emojis.Activities.map(emoji => ( + + ))} + + Objects + + {emojis.Objects.map(emoji => ( + + ))} + + Symbols + + {emojis.Symbols.map(emoji => ( + + ))} + + Flags + + {emojis.Flags.map(emoji => ( + + ))} + + ); +}; + +EmojiPickerMenu.propTypes = propTypes; +EmojiPickerMenu.defaultProps = defaultProps; + +export default EmojiPickerMenu; diff --git a/src/pages/home/report/EmojiPickerMenuItem.js b/src/pages/home/report/EmojiPickerMenuItem.js new file mode 100644 index 000000000000..37d23b96dfaf --- /dev/null +++ b/src/pages/home/report/EmojiPickerMenuItem.js @@ -0,0 +1,29 @@ +import React, {memo} from 'react'; +import PropTypes from 'prop-types'; +import {Pressable, Text} from 'react-native'; + + +const propTypes = { + iconCode: PropTypes.elementType.isRequired, +}; + +const EmojiPickerMenuItem = props => ( + + {() => ( + <> + + {props.iconCode} + + + )} + +); + + +EmojiPickerMenuItem.propTypes = propTypes; +EmojiPickerMenuItem.displayName = 'EmojiPickerMenuItem'; + +export default memo(EmojiPickerMenuItem); diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index 7194df06a922..9f9b0a3b9555 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -17,6 +17,9 @@ import AttachmentModal from '../../../components/AttachmentModal'; import withWindowDimensions, {windowDimensionsPropTypes} from '../../../components/withWindowDimensions'; import compose from '../../../libs/compose'; import Navigation from '../../../libs/Navigation/Navigation'; +import PopoverWithMeasuredContent from '../../../components/PopoverWithMeasuredContent'; +import EmojiPickerMenu from './EmojiPickerMenu'; +import CONST from '../../../CONST'; const propTypes = { // A method to call when the form is submitted @@ -46,6 +49,12 @@ class ReportActionCompose extends React.Component { constructor(props) { super(props); + // The horizontal and vertical position (relative to the screen) where the popover will display. + this.popoverAnchorPosition = { + horizontal: 0, + vertical: 0, + }; + this.updateComment = this.updateComment.bind(this); this.debouncedSaveReportComment = _.debounce(this.debouncedSaveReportComment.bind(this), 1000, false); this.debouncedBroadcastUserIsTyping = _.debounce(this.debouncedBroadcastUserIsTyping.bind(this), 100, true); @@ -53,12 +62,15 @@ class ReportActionCompose extends React.Component { this.triggerSubmitShortcut = this.triggerSubmitShortcut.bind(this); this.submitForm = this.submitForm.bind(this); this.setIsFocused = this.setIsFocused.bind(this); + this.showEmojiPicker = this.showEmojiPicker.bind(this); + this.hideEmojiPicker = this.hideEmojiPicker.bind(this); this.comment = props.comment; this.state = { isFocused: false, textInputShouldClear: false, isCommentEmpty: props.comment.length === 0, + isPickerVisible: false, }; } @@ -141,6 +153,36 @@ class ReportActionCompose extends React.Component { } } + /** + * Save the location of a native press event. + * + * @param {Object} nativeEvent + */ + capturePressLocation(nativeEvent) { + this.popoverAnchorPosition = { + horizontal: nativeEvent.pageX, + vertical: nativeEvent.pageY, + }; + } + + /** + * Show the ReportActionContextMenu modal popover. + * + * @param {Object} [event] - A press event. + */ + showEmojiPicker(event) { + const nativeEvent = event.nativeEvent || {}; + this.capturePressLocation(nativeEvent); + this.setState({isPickerVisible: true}); + } + + /** + * Hide the ReportActionContextMenu modal popover. + */ + hideEmojiPicker() { + this.setState({isPickerVisible: false}); + } + /** * Add a new comment to this chat * @@ -245,6 +287,36 @@ class ReportActionCompose extends React.Component { )} + ( + + )} + > + + + + + Date: Fri, 19 Mar 2021 10:56:05 -0600 Subject: [PATCH 004/380] Update emoji list to use unicode escaped strings --- assets/emojis.js | 3608 +++++++++++++++++++++++----------------------- 1 file changed, 1816 insertions(+), 1792 deletions(-) diff --git a/assets/emojis.js b/assets/emojis.js index ef2fb85cf459..d7b828919300 100644 --- a/assets/emojis.js +++ b/assets/emojis.js @@ -1,16 +1,40 @@ -// This list is generated from the code here https://github.com/amurani/unicode-emoji-list +/* + * This list is generated from the code here https://github.com/amurani/unicode-emoji-list + * Each code is then converted to hex by replacing the "U+" with "0x" + * Each hex is then converted to a string using this function (each section is defined as "emojis" in this function) + * for (var i=0; i { + * newCode += String.fromCodePoint(codePiece); + * }); + * emojis[i].code=newCode; + * //console.log(newCode); + * if (emojis[i].types) { + * newTypesArray = []; + * emojis[i].types.forEach(type => { + * typeCode = ''; + * type.forEach(code => { + * typeCode += String.fromCodePoint(code); + * }); + * newTypesArray.push(typeCode); + * }); + * //console.log(newTypesArray); + * emojis[i].types = newTypesArray + * } + * } + */ const emojis = { 'Smileys & People': [ { - code: 'U+1F600', + code: 'šŸ˜€', keywords: [ 'face', 'grin', ], }, { - code: 'U+1F601', + code: 'šŸ˜', keywords: [ 'eye', 'face', @@ -19,7 +43,7 @@ const emojis = { ], }, { - code: 'U+1F602', + code: 'šŸ˜‚', keywords: [ 'face', 'joy', @@ -28,7 +52,7 @@ const emojis = { ], }, { - code: 'U+1F923', + code: 'šŸ¤£', keywords: [ 'face', 'floor', @@ -39,7 +63,7 @@ const emojis = { ], }, { - code: 'U+1F603', + code: 'šŸ˜ƒ', keywords: [ 'face', 'mouth', @@ -48,7 +72,7 @@ const emojis = { ], }, { - code: 'U+1F604', + code: 'šŸ˜„', keywords: [ 'eye', 'face', @@ -58,7 +82,7 @@ const emojis = { ], }, { - code: 'U+1F605', + code: 'šŸ˜…', keywords: [ 'cold', 'face', @@ -68,7 +92,7 @@ const emojis = { ], }, { - code: 'U+1F606', + code: 'šŸ˜†', keywords: [ 'face', 'laugh', @@ -79,14 +103,14 @@ const emojis = { ], }, { - code: 'U+1F609', + code: 'šŸ˜‰', keywords: [ 'face', 'wink', ], }, { - code: 'U+1F60A', + code: 'šŸ˜Š', keywords: [ 'blush', 'eye', @@ -95,7 +119,7 @@ const emojis = { ], }, { - code: 'U+1F60B', + code: 'šŸ˜‹', keywords: [ 'delicious', 'face', @@ -106,7 +130,7 @@ const emojis = { ], }, { - code: 'U+1F60E', + code: 'šŸ˜Ž', keywords: [ 'bright', 'cool', @@ -121,7 +145,7 @@ const emojis = { ], }, { - code: 'U+1F60D', + code: 'šŸ˜', keywords: [ 'eye', 'face', @@ -131,7 +155,7 @@ const emojis = { ], }, { - code: 'U+1F618', + code: 'šŸ˜˜', keywords: [ 'face', 'heart', @@ -139,14 +163,14 @@ const emojis = { ], }, { - code: 'U+1F617', + code: 'šŸ˜—', keywords: [ 'face', 'kiss', ], }, { - code: 'U+1F619', + code: 'šŸ˜™', keywords: [ 'eye', 'face', @@ -155,7 +179,7 @@ const emojis = { ], }, { - code: 'U+1F61A', + code: 'šŸ˜š', keywords: [ 'closed', 'eye', @@ -164,7 +188,7 @@ const emojis = { ], }, { - code: 'U+263A', + code: 'ā˜ŗ', keywords: [ 'face', 'outlined', @@ -173,14 +197,14 @@ const emojis = { ], }, { - code: 'U+1F642', + code: 'šŸ™‚', keywords: [ 'face', 'smile', ], }, { - code: 'U+1F917', + code: 'šŸ¤—', keywords: [ 'face', 'hug', @@ -188,14 +212,14 @@ const emojis = { ], }, { - code: 'U+1F914', + code: 'šŸ¤”', keywords: [ 'face', 'thinking', ], }, { - code: 'U+1F610', + code: 'šŸ˜', keywords: [ 'deadpan', 'face', @@ -203,7 +227,7 @@ const emojis = { ], }, { - code: 'U+1F611', + code: 'šŸ˜‘', keywords: [ 'expressionless', 'face', @@ -212,7 +236,7 @@ const emojis = { ], }, { - code: 'U+1F636', + code: 'šŸ˜¶', keywords: [ 'face', 'mouth', @@ -221,7 +245,7 @@ const emojis = { ], }, { - code: 'U+1F644', + code: 'šŸ™„', keywords: [ 'eyes', 'face', @@ -229,21 +253,21 @@ const emojis = { ], }, { - code: 'U+1F60F', + code: 'šŸ˜', keywords: [ 'face', 'smirk', ], }, { - code: 'U+1F623', + code: 'šŸ˜£', keywords: [ 'face', 'persevere', ], }, { - code: 'U+1F625', + code: 'šŸ˜„', keywords: [ 'disappointed', 'face', @@ -252,7 +276,7 @@ const emojis = { ], }, { - code: 'U+1F62E', + code: 'šŸ˜®', keywords: [ 'face', 'mouth', @@ -261,7 +285,7 @@ const emojis = { ], }, { - code: 'U+1F910', + code: 'šŸ¤', keywords: [ 'face', 'mouth', @@ -269,7 +293,7 @@ const emojis = { ], }, { - code: 'U+1F62F', + code: 'šŸ˜Æ', keywords: [ 'face', 'hushed', @@ -278,21 +302,21 @@ const emojis = { ], }, { - code: 'U+1F62A', + code: 'šŸ˜Ŗ', keywords: [ 'face', 'sleep', ], }, { - code: 'U+1F62B', + code: 'šŸ˜«', keywords: [ 'face', 'tired', ], }, { - code: 'U+1F634', + code: 'šŸ˜“', keywords: [ 'face', 'sleep', @@ -300,14 +324,14 @@ const emojis = { ], }, { - code: 'U+1F60C', + code: 'šŸ˜Œ', keywords: [ 'face', 'relieved', ], }, { - code: 'U+1F913', + code: 'šŸ¤“', keywords: [ 'face', 'geek', @@ -315,14 +339,14 @@ const emojis = { ], }, { - code: 'U+1F61B', + code: 'šŸ˜›', keywords: [ 'face', 'tongue', ], }, { - code: 'U+1F61C', + code: 'šŸ˜œ', keywords: [ 'eye', 'face', @@ -332,7 +356,7 @@ const emojis = { ], }, { - code: 'U+1F61D', + code: 'šŸ˜', keywords: [ 'eye', 'face', @@ -342,14 +366,14 @@ const emojis = { ], }, { - code: 'U+1F924', + code: 'šŸ¤¤', keywords: [ 'drooling', 'face', ], }, { - code: 'U+1F612', + code: 'šŸ˜’', keywords: [ 'face', 'unamused', @@ -357,7 +381,7 @@ const emojis = { ], }, { - code: 'U+1F613', + code: 'šŸ˜“', keywords: [ 'cold', 'face', @@ -365,7 +389,7 @@ const emojis = { ], }, { - code: 'U+1F614', + code: 'šŸ˜”', keywords: [ 'dejected', 'face', @@ -373,21 +397,21 @@ const emojis = { ], }, { - code: 'U+1F615', + code: 'šŸ˜•', keywords: [ 'confused', 'face', ], }, { - code: 'U+1F643', + code: 'šŸ™ƒ', keywords: [ 'face', 'upside-down', ], }, { - code: 'U+1F911', + code: 'šŸ¤‘', keywords: [ 'face', 'money', @@ -395,7 +419,7 @@ const emojis = { ], }, { - code: 'U+1F632', + code: 'šŸ˜²', keywords: [ 'astonished', 'face', @@ -404,42 +428,42 @@ const emojis = { ], }, { - code: 'U+2639', + code: 'ā˜¹', keywords: [ 'face', 'frown', ], }, { - code: 'U+1F641', + code: 'šŸ™', keywords: [ 'face', 'frown', ], }, { - code: 'U+1F616', + code: 'šŸ˜–', keywords: [ 'confounded', 'face', ], }, { - code: 'U+1F61E', + code: 'šŸ˜ž', keywords: [ 'disappointed', 'face', ], }, { - code: 'U+1F61F', + code: 'šŸ˜Ÿ', keywords: [ 'face', 'worried', ], }, { - code: 'U+1F624', + code: 'šŸ˜¤', keywords: [ 'face', 'triumph', @@ -447,7 +471,7 @@ const emojis = { ], }, { - code: 'U+1F622', + code: 'šŸ˜¢', keywords: [ 'cry', 'face', @@ -456,7 +480,7 @@ const emojis = { ], }, { - code: 'U+1F62D', + code: 'šŸ˜­', keywords: [ 'cry', 'face', @@ -466,7 +490,7 @@ const emojis = { ], }, { - code: 'U+1F626', + code: 'šŸ˜¦', keywords: [ 'face', 'frown', @@ -475,14 +499,14 @@ const emojis = { ], }, { - code: 'U+1F627', + code: 'šŸ˜§', keywords: [ 'anguished', 'face', ], }, { - code: 'U+1F628', + code: 'šŸ˜Ø', keywords: [ 'face', 'fear', @@ -491,7 +515,7 @@ const emojis = { ], }, { - code: 'U+1F629', + code: 'šŸ˜©', keywords: [ 'face', 'tired', @@ -499,14 +523,14 @@ const emojis = { ], }, { - code: 'U+1F62C', + code: 'šŸ˜¬', keywords: [ 'face', 'grimace', ], }, { - code: 'U+1F630', + code: 'šŸ˜°', keywords: [ 'blue', 'cold', @@ -518,7 +542,7 @@ const emojis = { ], }, { - code: 'U+1F631', + code: 'šŸ˜±', keywords: [ 'face', 'fear', @@ -529,7 +553,7 @@ const emojis = { ], }, { - code: 'U+1F633', + code: 'šŸ˜³', keywords: [ 'dazed', 'face', @@ -537,14 +561,14 @@ const emojis = { ], }, { - code: 'U+1F635', + code: 'šŸ˜µ', keywords: [ 'dizzy', 'face', ], }, { - code: 'U+1F621', + code: 'šŸ˜”', keywords: [ 'angry', 'face', @@ -555,7 +579,7 @@ const emojis = { ], }, { - code: 'U+1F620', + code: 'šŸ˜ ', keywords: [ 'angry', 'face', @@ -563,7 +587,7 @@ const emojis = { ], }, { - code: 'U+1F607', + code: 'šŸ˜‡', keywords: [ 'angel', 'face', @@ -575,7 +599,7 @@ const emojis = { ], }, { - code: 'U+1F920', + code: 'šŸ¤ ', keywords: [ 'cowboy', 'cowgirl', @@ -584,14 +608,14 @@ const emojis = { ], }, { - code: 'U+1F921', + code: 'šŸ¤”', keywords: [ 'clown', 'face', ], }, { - code: 'U+1F925', + code: 'šŸ¤„', keywords: [ 'face', 'lie', @@ -599,7 +623,7 @@ const emojis = { ], }, { - code: 'U+1F637', + code: 'šŸ˜·', keywords: [ 'cold', 'doctor', @@ -610,7 +634,7 @@ const emojis = { ], }, { - code: 'U+1F912', + code: 'šŸ¤’', keywords: [ 'face', 'ill', @@ -619,7 +643,7 @@ const emojis = { ], }, { - code: 'U+1F915', + code: 'šŸ¤•', keywords: [ 'bandage', 'face', @@ -628,7 +652,7 @@ const emojis = { ], }, { - code: 'U+1F922', + code: 'šŸ¤¢', keywords: [ 'face', 'nauseated', @@ -636,7 +660,7 @@ const emojis = { ], }, { - code: 'U+1F927', + code: 'šŸ¤§', keywords: [ 'face', 'gesundheit', @@ -644,7 +668,7 @@ const emojis = { ], }, { - code: 'U+1F608', + code: 'šŸ˜ˆ', keywords: [ 'face', 'fairy tale', @@ -654,7 +678,7 @@ const emojis = { ], }, { - code: 'U+1F47F', + code: 'šŸ‘æ', keywords: [ 'demon', 'devil', @@ -665,7 +689,7 @@ const emojis = { ], }, { - code: 'U+1F479', + code: 'šŸ‘¹', keywords: [ 'creature', 'face', @@ -677,7 +701,7 @@ const emojis = { ], }, { - code: 'U+1F47A', + code: 'šŸ‘ŗ', keywords: [ 'creature', 'face', @@ -689,7 +713,7 @@ const emojis = { ], }, { - code: 'U+1F480', + code: 'šŸ’€', keywords: [ 'body', 'death', @@ -700,7 +724,7 @@ const emojis = { ], }, { - code: 'U+2620', + code: 'ā˜ ', keywords: [ 'body', 'crossbones', @@ -711,7 +735,7 @@ const emojis = { ], }, { - code: 'U+1F47B', + code: 'šŸ‘»', keywords: [ 'creature', 'face', @@ -722,7 +746,7 @@ const emojis = { ], }, { - code: 'U+1F47D', + code: 'šŸ‘½', keywords: [ 'alien', 'creature', @@ -736,7 +760,7 @@ const emojis = { ], }, { - code: 'U+1F47E', + code: 'šŸ‘¾', keywords: [ 'alien', 'creature', @@ -750,7 +774,7 @@ const emojis = { ], }, { - code: 'U+1F916', + code: 'šŸ¤–', keywords: [ 'face', 'monster', @@ -758,7 +782,7 @@ const emojis = { ], }, { - code: 'U+1F4A9', + code: 'šŸ’©', keywords: [ 'comic', 'dung', @@ -769,7 +793,7 @@ const emojis = { ], }, { - code: 'U+1F63A', + code: 'šŸ˜ŗ', keywords: [ 'cat', 'face', @@ -779,7 +803,7 @@ const emojis = { ], }, { - code: 'U+1F638', + code: 'šŸ˜ø', keywords: [ 'cat', 'eye', @@ -789,7 +813,7 @@ const emojis = { ], }, { - code: 'U+1F639', + code: 'šŸ˜¹', keywords: [ 'cat', 'face', @@ -798,7 +822,7 @@ const emojis = { ], }, { - code: 'U+1F63B', + code: 'šŸ˜»', keywords: [ 'cat', 'eye', @@ -809,7 +833,7 @@ const emojis = { ], }, { - code: 'U+1F63C', + code: 'šŸ˜¼', keywords: [ 'cat', 'face', @@ -819,7 +843,7 @@ const emojis = { ], }, { - code: 'U+1F63D', + code: 'šŸ˜½', keywords: [ 'cat', 'eye', @@ -828,7 +852,7 @@ const emojis = { ], }, { - code: 'U+1F640', + code: 'šŸ™€', keywords: [ 'cat', 'face', @@ -838,7 +862,7 @@ const emojis = { ], }, { - code: 'U+1F63F', + code: 'šŸ˜æ', keywords: [ 'cat', 'cry', @@ -848,7 +872,7 @@ const emojis = { ], }, { - code: 'U+1F63E', + code: 'šŸ˜¾', keywords: [ 'cat', 'face', @@ -856,7 +880,7 @@ const emojis = { ], }, { - code: 'U+1F648', + code: 'šŸ™ˆ', keywords: [ 'evil', 'face', @@ -870,7 +894,7 @@ const emojis = { ], }, { - code: 'U+1F649', + code: 'šŸ™‰', keywords: [ 'evil', 'face', @@ -884,7 +908,7 @@ const emojis = { ], }, { - code: 'U+1F64A', + code: 'šŸ™Š', keywords: [ 'evil', 'face', @@ -898,20 +922,20 @@ const emojis = { ], }, { - code: 'U+1F466', + code: 'šŸ‘¦', keywords: [ 'boy', ], types: [ - 'U+1F466 U+1F3FF', - 'U+1F466 U+1F3FE', - 'U+1F466 U+1F3FD', - 'U+1F466 U+1F3FC', - 'U+1F466 U+1F3FB', + 'šŸ‘¦šŸæ', + 'šŸ‘¦šŸ¾', + 'šŸ‘¦šŸ½', + 'šŸ‘¦šŸ¼', + 'šŸ‘¦šŸ»', ], }, { - code: 'U+1F467', + code: 'šŸ‘§', keywords: [ 'girl', 'maiden', @@ -920,82 +944,82 @@ const emojis = { 'zodiac', ], types: [ - 'U+1F467 U+1F3FF', - 'U+1F467 U+1F3FE', - 'U+1F467 U+1F3FD', - 'U+1F467 U+1F3FC', - 'U+1F467 U+1F3FB', + 'šŸ‘§šŸæ', + 'šŸ‘§šŸ¾', + 'šŸ‘§šŸ½', + 'šŸ‘§šŸ¼', + 'šŸ‘§šŸ»', ], }, { - code: 'U+1F468', + code: 'šŸ‘Ø', keywords: [ 'man', ], types: [ - 'U+1F468 U+1F3FF', - 'U+1F468 U+1F3FE', - 'U+1F468 U+1F3FD', - 'U+1F468 U+1F3FC', - 'U+1F468 U+1F3FB', + 'šŸ‘ØšŸæ', + 'šŸ‘ØšŸ¾', + 'šŸ‘ØšŸ½', + 'šŸ‘ØšŸ¼', + 'šŸ‘ØšŸ»', ], }, { - code: 'U+1F469', + code: 'šŸ‘©', keywords: [ 'woman', ], types: [ - 'U+1F469 U+1F3FF', - 'U+1F469 U+1F3FE', - 'U+1F469 U+1F3FD', - 'U+1F469 U+1F3FC', - 'U+1F469 U+1F3FB', + 'šŸ‘©šŸæ', + 'šŸ‘©šŸ¾', + 'šŸ‘©šŸ½', + 'šŸ‘©šŸ¼', + 'šŸ‘©šŸ»', ], }, { - code: 'U+1F474', + code: 'šŸ‘“', keywords: [ 'man', 'old', ], types: [ - 'U+1F474 U+1F3FF', - 'U+1F474 U+1F3FE', - 'U+1F474 U+1F3FD', - 'U+1F474 U+1F3FC', - 'U+1F474 U+1F3FB', + 'šŸ‘“šŸæ', + 'šŸ‘“šŸ¾', + 'šŸ‘“šŸ½', + 'šŸ‘“šŸ¼', + 'šŸ‘“šŸ»', ], }, { - code: 'U+1F475', + code: 'šŸ‘µ', keywords: [ 'old', 'woman', ], types: [ - 'U+1F475 U+1F3FF', - 'U+1F475 U+1F3FE', - 'U+1F475 U+1F3FD', - 'U+1F475 U+1F3FC', - 'U+1F475 U+1F3FB', + 'šŸ‘µšŸæ', + 'šŸ‘µšŸ¾', + 'šŸ‘µšŸ½', + 'šŸ‘µšŸ¼', + 'šŸ‘µšŸ»', ], }, { - code: 'U+1F476', + code: 'šŸ‘¶', keywords: [ 'baby', ], types: [ - 'U+1F476 U+1F3FF', - 'U+1F476 U+1F3FE', - 'U+1F476 U+1F3FD', - 'U+1F476 U+1F3FC', - 'U+1F476 U+1F3FB', + 'šŸ‘¶šŸæ', + 'šŸ‘¶šŸ¾', + 'šŸ‘¶šŸ½', + 'šŸ‘¶šŸ¼', + 'šŸ‘¶šŸ»', ], }, { - code: 'U+1F47C', + code: 'šŸ‘¼', keywords: [ 'angel', 'baby', @@ -1004,144 +1028,144 @@ const emojis = { 'fantasy', ], types: [ - 'U+1F47C U+1F3FF', - 'U+1F47C U+1F3FE', - 'U+1F47C U+1F3FD', - 'U+1F47C U+1F3FC', - 'U+1F47C U+1F3FB', + 'šŸ‘¼šŸæ', + 'šŸ‘¼šŸ¾', + 'šŸ‘¼šŸ½', + 'šŸ‘¼šŸ¼', + 'šŸ‘¼šŸ»', ], }, { - code: 'U+1F471', + code: 'šŸ‘±', keywords: [ 'blond', ], types: [ - 'U+1F471 U+1F3FF', - 'U+1F471 U+1F3FE', - 'U+1F471 U+1F3FD', - 'U+1F471 U+1F3FC', - 'U+1F471 U+1F3FB', + 'šŸ‘±šŸæ', + 'šŸ‘±šŸ¾', + 'šŸ‘±šŸ½', + 'šŸ‘±šŸ¼', + 'šŸ‘±šŸ»', ], }, { - code: 'U+1F46E', + code: 'šŸ‘®', keywords: [ 'cop', 'officer', 'police', ], types: [ - 'U+1F46E U+1F3FF', - 'U+1F46E U+1F3FE', - 'U+1F46E U+1F3FD', - 'U+1F46E U+1F3FC', - 'U+1F46E U+1F3FB', + 'šŸ‘®šŸæ', + 'šŸ‘®šŸ¾', + 'šŸ‘®šŸ½', + 'šŸ‘®šŸ¼', + 'šŸ‘®šŸ»', ], }, { - code: 'U+1F472', + code: 'šŸ‘²', keywords: [ 'gua pi mao', 'hat', 'man', ], types: [ - 'U+1F472 U+1F3FF', - 'U+1F472 U+1F3FE', - 'U+1F472 U+1F3FD', - 'U+1F472 U+1F3FC', - 'U+1F472 U+1F3FB', + 'šŸ‘²šŸæ', + 'šŸ‘²šŸ¾', + 'šŸ‘²šŸ½', + 'šŸ‘²šŸ¼', + 'šŸ‘²šŸ»', ], }, { - code: 'U+1F473', + code: 'šŸ‘³', keywords: [ 'man', 'turban', ], types: [ - 'U+1F473 U+1F3FF', - 'U+1F473 U+1F3FE', - 'U+1F473 U+1F3FD', - 'U+1F473 U+1F3FC', - 'U+1F473 U+1F3FB', + 'šŸ‘³šŸæ', + 'šŸ‘³šŸ¾', + 'šŸ‘³šŸ½', + 'šŸ‘³šŸ¼', + 'šŸ‘³šŸ»', ], }, { - code: 'U+1F477', + code: 'šŸ‘·', keywords: [ 'construction', 'hat', 'worker', ], types: [ - 'U+1F477 U+1F3FF', - 'U+1F477 U+1F3FE', - 'U+1F477 U+1F3FD', - 'U+1F477 U+1F3FC', - 'U+1F477 U+1F3FB', + 'šŸ‘·šŸæ', + 'šŸ‘·šŸ¾', + 'šŸ‘·šŸ½', + 'šŸ‘·šŸ¼', + 'šŸ‘·šŸ»', ], }, { - code: 'U+1F478', + code: 'šŸ‘ø', keywords: [ 'fairy tale', 'fantasy', 'princess', ], types: [ - 'U+1F478 U+1F3FF', - 'U+1F478 U+1F3FE', - 'U+1F478 U+1F3FD', - 'U+1F478 U+1F3FC', - 'U+1F478 U+1F3FB', + 'šŸ‘øšŸæ', + 'šŸ‘øšŸ¾', + 'šŸ‘øšŸ½', + 'šŸ‘øšŸ¼', + 'šŸ‘øšŸ»', ], }, { - code: 'U+1F934', + code: 'šŸ¤“', keywords: [ 'prince', ], types: [ - 'U+1F934 U+1F3FF', - 'U+1F934 U+1F3FE', - 'U+1F934 U+1F3FD', - 'U+1F934 U+1F3FC', - 'U+1F934 U+1F3FB', + 'šŸ¤“šŸæ', + 'šŸ¤“šŸ¾', + 'šŸ¤“šŸ½', + 'šŸ¤“šŸ¼', + 'šŸ¤“šŸ»', ], }, { - code: 'U+1F482', + code: 'šŸ’‚', keywords: [ 'guard', 'guardsman', ], types: [ - 'U+1F482 U+1F3FF', - 'U+1F482 U+1F3FE', - 'U+1F482 U+1F3FD', - 'U+1F482 U+1F3FC', - 'U+1F482 U+1F3FB', + 'šŸ’‚šŸæ', + 'šŸ’‚šŸ¾', + 'šŸ’‚šŸ½', + 'šŸ’‚šŸ¼', + 'šŸ’‚šŸ»', ], }, { - code: 'U+1F575', + code: 'šŸ•µ', keywords: [ 'detective', 'sleuth', 'spy', ], types: [ - 'U+1F575 U+1F3FF', - 'U+1F575 U+1F3FE', - 'U+1F575 U+1F3FD', - 'U+1F575 U+1F3FC', - 'U+1F575 U+1F3FB', + 'šŸ•µšŸæ', + 'šŸ•µšŸ¾', + 'šŸ•µšŸ½', + 'šŸ•µšŸ¼', + 'šŸ•µšŸ»', ], }, { - code: 'U+1F385', + code: 'šŸŽ…', keywords: [ 'activity', 'celebration', @@ -1152,74 +1176,74 @@ const emojis = { 'santa', ], types: [ - 'U+1F385 U+1F3FF', - 'U+1F385 U+1F3FE', - 'U+1F385 U+1F3FD', - 'U+1F385 U+1F3FC', - 'U+1F385 U+1F3FB', + 'šŸŽ…šŸæ', + 'šŸŽ…šŸ¾', + 'šŸŽ…šŸ½', + 'šŸŽ…šŸ¼', + 'šŸŽ…šŸ»', ], }, { - code: 'U+1F936', + code: 'šŸ¤¶', keywords: [ 'christmas', 'mother', 'mrs. claus', ], types: [ - 'U+1F936 U+1F3FF', - 'U+1F936 U+1F3FE', - 'U+1F936 U+1F3FD', - 'U+1F936 U+1F3FC', - 'U+1F936 U+1F3FB', + 'šŸ¤¶šŸæ', + 'šŸ¤¶šŸ¾', + 'šŸ¤¶šŸ½', + 'šŸ¤¶šŸ¼', + 'šŸ¤¶šŸ»', ], }, { - code: 'U+1F470', + code: 'šŸ‘°', keywords: [ 'bride', 'veil', 'wedding', ], types: [ - 'U+1F470 U+1F3FF', - 'U+1F470 U+1F3FE', - 'U+1F470 U+1F3FD', - 'U+1F470 U+1F3FC', - 'U+1F470 U+1F3FB', + 'šŸ‘°šŸæ', + 'šŸ‘°šŸ¾', + 'šŸ‘°šŸ½', + 'šŸ‘°šŸ¼', + 'šŸ‘°šŸ»', ], }, { - code: 'U+1F935', + code: 'šŸ¤µ', keywords: [ 'groom', 'man', 'tuxedo', ], types: [ - 'U+1F935 U+1F3FF', - 'U+1F935 U+1F3FE', - 'U+1F935 U+1F3FD', - 'U+1F935 U+1F3FC', - 'U+1F935 U+1F3FB', + 'šŸ¤µšŸæ', + 'šŸ¤µšŸ¾', + 'šŸ¤µšŸ½', + 'šŸ¤µšŸ¼', + 'šŸ¤µšŸ»', ], }, { - code: 'U+1F486', + code: 'šŸ’†', keywords: [ 'massage', 'salon', ], types: [ - 'U+1F486 U+1F3FF', - 'U+1F486 U+1F3FE', - 'U+1F486 U+1F3FD', - 'U+1F486 U+1F3FC', - 'U+1F486 U+1F3FB', + 'šŸ’†šŸæ', + 'šŸ’†šŸ¾', + 'šŸ’†šŸ½', + 'šŸ’†šŸ¼', + 'šŸ’†šŸ»', ], }, { - code: 'U+1F487', + code: 'šŸ’‡', keywords: [ 'barber', 'beauty', @@ -1227,43 +1251,43 @@ const emojis = { 'parlor', ], types: [ - 'U+1F487 U+1F3FF', - 'U+1F487 U+1F3FE', - 'U+1F487 U+1F3FD', - 'U+1F487 U+1F3FC', - 'U+1F487 U+1F3FB', + 'šŸ’‡šŸæ', + 'šŸ’‡šŸ¾', + 'šŸ’‡šŸ½', + 'šŸ’‡šŸ¼', + 'šŸ’‡šŸ»', ], }, { - code: 'U+1F64D', + code: 'šŸ™', keywords: [ 'frown', 'gesture', ], types: [ - 'U+1F64D U+1F3FF', - 'U+1F64D U+1F3FE', - 'U+1F64D U+1F3FD', - 'U+1F64D U+1F3FC', - 'U+1F64D U+1F3FB', + 'šŸ™šŸæ', + 'šŸ™šŸ¾', + 'šŸ™šŸ½', + 'šŸ™šŸ¼', + 'šŸ™šŸ»', ], }, { - code: 'U+1F64E', + code: 'šŸ™Ž', keywords: [ 'gesture', 'pouting', ], types: [ - 'U+1F64E U+1F3FF', - 'U+1F64E U+1F3FE', - 'U+1F64E U+1F3FD', - 'U+1F64E U+1F3FC', - 'U+1F64E U+1F3FB', + 'šŸ™ŽšŸæ', + 'šŸ™ŽšŸ¾', + 'šŸ™ŽšŸ½', + 'šŸ™ŽšŸ¼', + 'šŸ™ŽšŸ»', ], }, { - code: 'U+1F645', + code: 'šŸ™…', keywords: [ 'forbidden', 'gesture', @@ -1273,30 +1297,30 @@ const emojis = { 'prohibited', ], types: [ - 'U+1F645 U+1F3FF', - 'U+1F645 U+1F3FE', - 'U+1F645 U+1F3FD', - 'U+1F645 U+1F3FC', - 'U+1F645 U+1F3FB', + 'šŸ™…šŸæ', + 'šŸ™…šŸ¾', + 'šŸ™…šŸ½', + 'šŸ™…šŸ¼', + 'šŸ™…šŸ»', ], }, { - code: 'U+1F646', + code: 'šŸ™†', keywords: [ 'gesture', 'hand', 'ok', ], types: [ - 'U+1F646 U+1F3FF', - 'U+1F646 U+1F3FE', - 'U+1F646 U+1F3FD', - 'U+1F646 U+1F3FC', - 'U+1F646 U+1F3FB', + 'šŸ™†šŸæ', + 'šŸ™†šŸ¾', + 'šŸ™†šŸ½', + 'šŸ™†šŸ¼', + 'šŸ™†šŸ»', ], }, { - code: 'U+1F481', + code: 'šŸ’', keywords: [ 'hand', 'help', @@ -1304,15 +1328,15 @@ const emojis = { 'sassy', ], types: [ - 'U+1F481 U+1F3FF', - 'U+1F481 U+1F3FE', - 'U+1F481 U+1F3FD', - 'U+1F481 U+1F3FC', - 'U+1F481 U+1F3FB', + 'šŸ’šŸæ', + 'šŸ’šŸ¾', + 'šŸ’šŸ½', + 'šŸ’šŸ¼', + 'šŸ’šŸ»', ], }, { - code: 'U+1F937', + code: 'šŸ¤·', keywords: [ 'doubt', 'ignorance', @@ -1320,15 +1344,15 @@ const emojis = { 'shrug', ], types: [ - 'U+1F937 U+1F3FF', - 'U+1F937 U+1F3FE', - 'U+1F937 U+1F3FD', - 'U+1F937 U+1F3FC', - 'U+1F937 U+1F3FB', + 'šŸ¤·šŸæ', + 'šŸ¤·šŸ¾', + 'šŸ¤·šŸ½', + 'šŸ¤·šŸ¼', + 'šŸ¤·šŸ»', ], }, { - code: 'U+1F64B', + code: 'šŸ™‹', keywords: [ 'gesture', 'hand', @@ -1336,15 +1360,15 @@ const emojis = { 'raised', ], types: [ - 'U+1F64B U+1F3FF', - 'U+1F64B U+1F3FE', - 'U+1F64B U+1F3FD', - 'U+1F64B U+1F3FC', - 'U+1F64B U+1F3FB', + 'šŸ™‹šŸæ', + 'šŸ™‹šŸ¾', + 'šŸ™‹šŸ½', + 'šŸ™‹šŸ¼', + 'šŸ™‹šŸ»', ], }, { - code: 'U+1F926', + code: 'šŸ¤¦', keywords: [ 'disbelief', 'exasperation', @@ -1352,15 +1376,15 @@ const emojis = { 'palm', ], types: [ - 'U+1F926 U+1F3FF', - 'U+1F926 U+1F3FE', - 'U+1F926 U+1F3FD', - 'U+1F926 U+1F3FC', - 'U+1F926 U+1F3FB', + 'šŸ¤¦šŸæ', + 'šŸ¤¦šŸ¾', + 'šŸ¤¦šŸ½', + 'šŸ¤¦šŸ¼', + 'šŸ¤¦šŸ»', ], }, { - code: 'U+1F647', + code: 'šŸ™‡', keywords: [ 'apology', 'bow', @@ -1368,15 +1392,15 @@ const emojis = { 'sorry', ], types: [ - 'U+1F647 U+1F3FF', - 'U+1F647 U+1F3FE', - 'U+1F647 U+1F3FD', - 'U+1F647 U+1F3FC', - 'U+1F647 U+1F3FB', + 'šŸ™‡šŸæ', + 'šŸ™‡šŸ¾', + 'šŸ™‡šŸ½', + 'šŸ™‡šŸ¼', + 'šŸ™‡šŸ»', ], }, { - code: 'U+1F6B6', + code: 'šŸš¶', keywords: [ 'hike', 'pedestrian', @@ -1384,71 +1408,71 @@ const emojis = { 'walking', ], types: [ - 'U+1F6B6 U+1F3FF', - 'U+1F6B6 U+1F3FE', - 'U+1F6B6 U+1F3FD', - 'U+1F6B6 U+1F3FC', - 'U+1F6B6 U+1F3FB', + 'šŸš¶šŸæ', + 'šŸš¶šŸ¾', + 'šŸš¶šŸ½', + 'šŸš¶šŸ¼', + 'šŸš¶šŸ»', ], }, { - code: 'U+1F3C3', + code: 'šŸƒ', keywords: [ 'marathon', 'runner', 'running', ], types: [ - 'U+1F3C3 U+1F3FF', - 'U+1F3C3 U+1F3FE', - 'U+1F3C3 U+1F3FD', - 'U+1F3C3 U+1F3FC', - 'U+1F3C3 U+1F3FB', + 'šŸƒšŸæ', + 'šŸƒšŸ¾', + 'šŸƒšŸ½', + 'šŸƒšŸ¼', + 'šŸƒšŸ»', ], }, { - code: 'U+1F483', + code: 'šŸ’ƒ', keywords: [ 'dancer', ], types: [ - 'U+1F483 U+1F3FF', - 'U+1F483 U+1F3FE', - 'U+1F483 U+1F3FD', - 'U+1F483 U+1F3FC', - 'U+1F483 U+1F3FB', + 'šŸ’ƒšŸæ', + 'šŸ’ƒšŸ¾', + 'šŸ’ƒšŸ½', + 'šŸ’ƒšŸ¼', + 'šŸ’ƒšŸ»', ], }, { - code: 'U+1F57A', + code: 'šŸ•ŗ', keywords: [ 'dance', 'man', ], types: [ - 'U+1F57A U+1F3FF', - 'U+1F57A U+1F3FE', - 'U+1F57A U+1F3FD', - 'U+1F57A U+1F3FC', - 'U+1F57A U+1F3FB', + 'šŸ•ŗšŸæ', + 'šŸ•ŗšŸ¾', + 'šŸ•ŗšŸ½', + 'šŸ•ŗšŸ¼', + 'šŸ•ŗšŸ»', ], }, { - code: 'U+1F930', + code: 'šŸ¤°', keywords: [ 'pregnant', 'woman', ], types: [ - 'U+1F930 U+1F3FF', - 'U+1F930 U+1F3FE', - 'U+1F930 U+1F3FD', - 'U+1F930 U+1F3FC', - 'U+1F930 U+1F3FB', + 'šŸ¤°šŸæ', + 'šŸ¤°šŸ¾', + 'šŸ¤°šŸ½', + 'šŸ¤°šŸ¼', + 'šŸ¤°šŸ»', ], }, { - code: 'U+1F46F', + code: 'šŸ‘Æ', keywords: [ 'bunny', 'dancer', @@ -1458,7 +1482,7 @@ const emojis = { ], }, { - code: 'U+1F574', + code: 'šŸ•“', keywords: [ 'business', 'man', @@ -1466,7 +1490,7 @@ const emojis = { ], }, { - code: 'U+1F5E3', + code: 'šŸ—£', keywords: [ 'face', 'head', @@ -1476,21 +1500,21 @@ const emojis = { ], }, { - code: 'U+1F464', + code: 'šŸ‘¤', keywords: [ 'bust', 'silhouette', ], }, { - code: 'U+1F465', + code: 'šŸ‘„', keywords: [ 'bust', 'silhouette', ], }, { - code: 'U+1F46B', + code: 'šŸ‘«', keywords: [ 'couple', 'hand', @@ -1500,7 +1524,7 @@ const emojis = { ], }, { - code: 'U+1F46C', + code: 'šŸ‘¬', keywords: [ 'couple', 'gemini', @@ -1512,7 +1536,7 @@ const emojis = { ], }, { - code: 'U+1F46D', + code: 'šŸ‘­', keywords: [ 'couple', 'hand', @@ -1521,7 +1545,7 @@ const emojis = { ], }, { - code: 'U+1F48F', + code: 'šŸ’', keywords: [ 'couple', 'kiss', @@ -1529,7 +1553,7 @@ const emojis = { ], }, { - code: 'U+1F469 U+200D U+2764 U+FE0F U+200D U+1F48B U+200D U+1F468', + code: 'šŸ‘©ā€ā¤ļøā€šŸ’‹ā€šŸ‘Ø', keywords: [ 'kiss', 'man', @@ -1537,21 +1561,21 @@ const emojis = { ], }, { - code: 'U+1F468 U+200D U+2764 U+FE0F U+200D U+1F48B U+200D U+1F468', + code: 'šŸ‘Øā€ā¤ļøā€šŸ’‹ā€šŸ‘Ø', keywords: [ 'kiss', 'man', ], }, { - code: 'U+1F469 U+200D U+2764 U+FE0F U+200D U+1F48B U+200D U+1F469', + code: 'šŸ‘©ā€ā¤ļøā€šŸ’‹ā€šŸ‘©', keywords: [ 'kiss', 'woman', ], }, { - code: 'U+1F491', + code: 'šŸ’‘', keywords: [ 'couple', 'heart', @@ -1560,7 +1584,7 @@ const emojis = { ], }, { - code: 'U+1F469 U+200D U+2764 U+FE0F U+200D U+1F468', + code: 'šŸ‘©ā€ā¤ļøā€šŸ‘Ø', keywords: [ 'couple', 'man', @@ -1568,21 +1592,21 @@ const emojis = { ], }, { - code: 'U+1F468 U+200D U+2764 U+FE0F U+200D U+1F468', + code: 'šŸ‘Øā€ā¤ļøā€šŸ‘Ø', keywords: [ 'couple', 'man', ], }, { - code: 'U+1F469 U+200D U+2764 U+FE0F U+200D U+1F469', + code: 'šŸ‘©ā€ā¤ļøā€šŸ‘©', keywords: [ 'couple', 'woman', ], }, { - code: 'U+1F46A', + code: 'šŸ‘Ŗ', keywords: [ 'child', 'family', @@ -1591,7 +1615,7 @@ const emojis = { ], }, { - code: 'U+1F468 U+200D U+1F469 U+200D U+1F466', + code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘¦', keywords: [ 'boy', 'family', @@ -1600,7 +1624,7 @@ const emojis = { ], }, { - code: 'U+1F468 U+200D U+1F469 U+200D U+1F467', + code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘§', keywords: [ 'family', 'girl', @@ -1609,7 +1633,7 @@ const emojis = { ], }, { - code: 'U+1F468 U+200D U+1F469 U+200D U+1F467 U+200D U+1F466', + code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘§ā€šŸ‘¦', keywords: [ 'boy', 'family', @@ -1619,7 +1643,7 @@ const emojis = { ], }, { - code: 'U+1F468 U+200D U+1F469 U+200D U+1F466 U+200D U+1F466', + code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘¦ā€šŸ‘¦', keywords: [ 'boy', 'family', @@ -1628,7 +1652,7 @@ const emojis = { ], }, { - code: 'U+1F468 U+200D U+1F469 U+200D U+1F467 U+200D U+1F467', + code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘§ā€šŸ‘§', keywords: [ 'family', 'girl', @@ -1637,7 +1661,7 @@ const emojis = { ], }, { - code: 'U+1F468 U+200D U+1F468 U+200D U+1F466', + code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘¦', keywords: [ 'boy', 'family', @@ -1645,7 +1669,7 @@ const emojis = { ], }, { - code: 'U+1F468 U+200D U+1F468 U+200D U+1F467', + code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘§', keywords: [ 'family', 'girl', @@ -1653,7 +1677,7 @@ const emojis = { ], }, { - code: 'U+1F468 U+200D U+1F468 U+200D U+1F467 U+200D U+1F466', + code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘§ā€šŸ‘¦', keywords: [ 'boy', 'family', @@ -1662,7 +1686,7 @@ const emojis = { ], }, { - code: 'U+1F468 U+200D U+1F468 U+200D U+1F466 U+200D U+1F466', + code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘¦ā€šŸ‘¦', keywords: [ 'boy', 'family', @@ -1670,7 +1694,7 @@ const emojis = { ], }, { - code: 'U+1F468 U+200D U+1F468 U+200D U+1F467 U+200D U+1F467', + code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘§ā€šŸ‘§', keywords: [ 'family', 'girl', @@ -1678,7 +1702,7 @@ const emojis = { ], }, { - code: 'U+1F469 U+200D U+1F469 U+200D U+1F466', + code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘¦', keywords: [ 'boy', 'family', @@ -1686,7 +1710,7 @@ const emojis = { ], }, { - code: 'U+1F469 U+200D U+1F469 U+200D U+1F467', + code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘§', keywords: [ 'family', 'girl', @@ -1694,7 +1718,7 @@ const emojis = { ], }, { - code: 'U+1F469 U+200D U+1F469 U+200D U+1F467 U+200D U+1F466', + code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘§ā€šŸ‘¦', keywords: [ 'boy', 'family', @@ -1703,7 +1727,7 @@ const emojis = { ], }, { - code: 'U+1F469 U+200D U+1F469 U+200D U+1F466 U+200D U+1F466', + code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘¦ā€šŸ‘¦', keywords: [ 'boy', 'family', @@ -1711,7 +1735,7 @@ const emojis = { ], }, { - code: 'U+1F469 U+200D U+1F469 U+200D U+1F467 U+200D U+1F467', + code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘§ā€šŸ‘§', keywords: [ 'family', 'girl', @@ -1719,7 +1743,7 @@ const emojis = { ], }, { - code: 'U+1F3FB', + code: 'šŸ»', keywords: [ 'emoji modifier', 'fitzpatrick', @@ -1728,7 +1752,7 @@ const emojis = { ], }, { - code: 'U+1F3FC', + code: 'šŸ¼', keywords: [ 'emoji modifier', 'fitzpatrick', @@ -1737,7 +1761,7 @@ const emojis = { ], }, { - code: 'U+1F3FD', + code: 'šŸ½', keywords: [ 'emoji modifier', 'fitzpatrick', @@ -1746,7 +1770,7 @@ const emojis = { ], }, { - code: 'U+1F3FE', + code: 'šŸ¾', keywords: [ 'emoji modifier', 'fitzpatrick', @@ -1755,7 +1779,7 @@ const emojis = { ], }, { - code: 'U+1F3FF', + code: 'šŸæ', keywords: [ 'emoji modifier', 'fitzpatrick', @@ -1764,7 +1788,7 @@ const emojis = { ], }, { - code: 'U+1F4AA', + code: 'šŸ’Ŗ', keywords: [ 'biceps', 'body', @@ -1773,30 +1797,30 @@ const emojis = { 'muscle', ], types: [ - 'U+1F4AA U+1F3FF', - 'U+1F4AA U+1F3FE', - 'U+1F4AA U+1F3FD', - 'U+1F4AA U+1F3FC', - 'U+1F4AA U+1F3FB', + 'šŸ’ŖšŸæ', + 'šŸ’ŖšŸ¾', + 'šŸ’ŖšŸ½', + 'šŸ’ŖšŸ¼', + 'šŸ’ŖšŸ»', ], }, { - code: 'U+1F933', + code: 'šŸ¤³', keywords: [ 'camera', 'phone', 'selfie', ], types: [ - 'U+1F933 U+1F3FF', - 'U+1F933 U+1F3FE', - 'U+1F933 U+1F3FD', - 'U+1F933 U+1F3FC', - 'U+1F933 U+1F3FB', + 'šŸ¤³šŸæ', + 'šŸ¤³šŸ¾', + 'šŸ¤³šŸ½', + 'šŸ¤³šŸ¼', + 'šŸ¤³šŸ»', ], }, { - code: 'U+1F448', + code: 'šŸ‘ˆ', keywords: [ 'backhand', 'body', @@ -1806,15 +1830,15 @@ const emojis = { 'point', ], types: [ - 'U+1F448 U+1F3FF', - 'U+1F448 U+1F3FE', - 'U+1F448 U+1F3FD', - 'U+1F448 U+1F3FC', - 'U+1F448 U+1F3FB', + 'šŸ‘ˆšŸæ', + 'šŸ‘ˆšŸ¾', + 'šŸ‘ˆšŸ½', + 'šŸ‘ˆšŸ¼', + 'šŸ‘ˆšŸ»', ], }, { - code: 'U+1F449', + code: 'šŸ‘‰', keywords: [ 'backhand', 'body', @@ -1824,15 +1848,15 @@ const emojis = { 'point', ], types: [ - 'U+1F449 U+1F3FF', - 'U+1F449 U+1F3FE', - 'U+1F449 U+1F3FD', - 'U+1F449 U+1F3FC', - 'U+1F449 U+1F3FB', + 'šŸ‘‰šŸæ', + 'šŸ‘‰šŸ¾', + 'šŸ‘‰šŸ½', + 'šŸ‘‰šŸ¼', + 'šŸ‘‰šŸ»', ], }, { - code: 'U+261D', + code: 'ā˜', keywords: [ 'body', 'finger', @@ -1842,15 +1866,15 @@ const emojis = { 'up', ], types: [ - 'U+261D U+1F3FF', - 'U+261D U+1F3FE', - 'U+261D U+1F3FD', - 'U+261D U+1F3FC', - 'U+261D U+1F3FB', + 'ā˜šŸæ', + 'ā˜šŸ¾', + 'ā˜šŸ½', + 'ā˜šŸ¼', + 'ā˜šŸ»', ], }, { - code: 'U+1F446', + code: 'šŸ‘†', keywords: [ 'backhand', 'body', @@ -1861,15 +1885,15 @@ const emojis = { 'up', ], types: [ - 'U+1F446 U+1F3FF', - 'U+1F446 U+1F3FE', - 'U+1F446 U+1F3FD', - 'U+1F446 U+1F3FC', - 'U+1F446 U+1F3FB', + 'šŸ‘†šŸæ', + 'šŸ‘†šŸ¾', + 'šŸ‘†šŸ½', + 'šŸ‘†šŸ¼', + 'šŸ‘†šŸ»', ], }, { - code: 'U+1F595', + code: 'šŸ–•', keywords: [ 'body', 'finger', @@ -1877,15 +1901,15 @@ const emojis = { 'middle finger', ], types: [ - 'U+1F595 U+1F3FF', - 'U+1F595 U+1F3FE', - 'U+1F595 U+1F3FD', - 'U+1F595 U+1F3FC', - 'U+1F595 U+1F3FB', + 'šŸ–•šŸæ', + 'šŸ–•šŸ¾', + 'šŸ–•šŸ½', + 'šŸ–•šŸ¼', + 'šŸ–•šŸ»', ], }, { - code: 'U+1F447', + code: 'šŸ‘‡', keywords: [ 'backhand', 'body', @@ -1896,15 +1920,15 @@ const emojis = { 'point', ], types: [ - 'U+1F447 U+1F3FF', - 'U+1F447 U+1F3FE', - 'U+1F447 U+1F3FD', - 'U+1F447 U+1F3FC', - 'U+1F447 U+1F3FB', + 'šŸ‘‡šŸæ', + 'šŸ‘‡šŸ¾', + 'šŸ‘‡šŸ½', + 'šŸ‘‡šŸ¼', + 'šŸ‘‡šŸ»', ], }, { - code: 'U+270C', + code: 'āœŒ', keywords: [ 'body', 'hand', @@ -1912,15 +1936,15 @@ const emojis = { 'victory', ], types: [ - 'U+270C U+1F3FF', - 'U+270C U+1F3FE', - 'U+270C U+1F3FD', - 'U+270C U+1F3FC', - 'U+270C U+1F3FB', + 'āœŒšŸæ', + 'āœŒšŸ¾', + 'āœŒšŸ½', + 'āœŒšŸ¼', + 'āœŒšŸ»', ], }, { - code: 'U+1F91E', + code: 'šŸ¤ž', keywords: [ 'cross', 'finger', @@ -1928,15 +1952,15 @@ const emojis = { 'luck', ], types: [ - 'U+1F91E U+1F3FF', - 'U+1F91E U+1F3FE', - 'U+1F91E U+1F3FD', - 'U+1F91E U+1F3FC', - 'U+1F91E U+1F3FB', + 'šŸ¤žšŸæ', + 'šŸ¤žšŸ¾', + 'šŸ¤žšŸ½', + 'šŸ¤žšŸ¼', + 'šŸ¤žšŸ»', ], }, { - code: 'U+1F596', + code: 'šŸ––', keywords: [ 'body', 'finger', @@ -1945,15 +1969,15 @@ const emojis = { 'vulcan', ], types: [ - 'U+1F596 U+1F3FF', - 'U+1F596 U+1F3FE', - 'U+1F596 U+1F3FD', - 'U+1F596 U+1F3FC', - 'U+1F596 U+1F3FB', + 'šŸ––šŸæ', + 'šŸ––šŸ¾', + 'šŸ––šŸ½', + 'šŸ––šŸ¼', + 'šŸ––šŸ»', ], }, { - code: 'U+1F918', + code: 'šŸ¤˜', keywords: [ 'body', 'finger', @@ -1962,29 +1986,29 @@ const emojis = { 'rock-on', ], types: [ - 'U+1F918 U+1F3FF', - 'U+1F918 U+1F3FE', - 'U+1F918 U+1F3FD', - 'U+1F918 U+1F3FC', - 'U+1F918 U+1F3FB', + 'šŸ¤˜šŸæ', + 'šŸ¤˜šŸ¾', + 'šŸ¤˜šŸ½', + 'šŸ¤˜šŸ¼', + 'šŸ¤˜šŸ»', ], }, { - code: 'U+1F919', + code: 'šŸ¤™', keywords: [ 'call', 'hand', ], types: [ - 'U+1F919 U+1F3FF', - 'U+1F919 U+1F3FE', - 'U+1F919 U+1F3FD', - 'U+1F919 U+1F3FC', - 'U+1F919 U+1F3FB', + 'šŸ¤™šŸæ', + 'šŸ¤™šŸ¾', + 'šŸ¤™šŸ½', + 'šŸ¤™šŸ¼', + 'šŸ¤™šŸ»', ], }, { - code: 'U+1F590', + code: 'šŸ–', keywords: [ 'body', 'finger', @@ -1992,44 +2016,44 @@ const emojis = { 'splayed', ], types: [ - 'U+1F590 U+1F3FF', - 'U+1F590 U+1F3FE', - 'U+1F590 U+1F3FD', - 'U+1F590 U+1F3FC', - 'U+1F590 U+1F3FB', + 'šŸ–šŸæ', + 'šŸ–šŸ¾', + 'šŸ–šŸ½', + 'šŸ–šŸ¼', + 'šŸ–šŸ»', ], }, { - code: 'U+270B', + code: 'āœ‹', keywords: [ 'body', 'hand', ], types: [ - 'U+270B U+1F3FF', - 'U+270B U+1F3FE', - 'U+270B U+1F3FD', - 'U+270B U+1F3FC', - 'U+270B U+1F3FB', + 'āœ‹šŸæ', + 'āœ‹šŸ¾', + 'āœ‹šŸ½', + 'āœ‹šŸ¼', + 'āœ‹šŸ»', ], }, { - code: 'U+1F44C', + code: 'šŸ‘Œ', keywords: [ 'body', 'hand', 'ok', ], types: [ - 'U+1F44C U+1F3FF', - 'U+1F44C U+1F3FE', - 'U+1F44C U+1F3FD', - 'U+1F44C U+1F3FC', - 'U+1F44C U+1F3FB', + 'šŸ‘ŒšŸæ', + 'šŸ‘ŒšŸ¾', + 'šŸ‘ŒšŸ½', + 'šŸ‘ŒšŸ¼', + 'šŸ‘ŒšŸ»', ], }, { - code: 'U+1F44D', + code: 'šŸ‘', keywords: [ '+1', 'body', @@ -2039,15 +2063,15 @@ const emojis = { 'up', ], types: [ - 'U+1F44D U+1F3FF', - 'U+1F44D U+1F3FE', - 'U+1F44D U+1F3FD', - 'U+1F44D U+1F3FC', - 'U+1F44D U+1F3FB', + 'šŸ‘šŸæ', + 'šŸ‘šŸ¾', + 'šŸ‘šŸ½', + 'šŸ‘šŸ¼', + 'šŸ‘šŸ»', ], }, { - code: 'U+1F44E', + code: 'šŸ‘Ž', keywords: [ '-1', 'body', @@ -2057,15 +2081,15 @@ const emojis = { 'thumbs down', ], types: [ - 'U+1F44E U+1F3FF', - 'U+1F44E U+1F3FE', - 'U+1F44E U+1F3FD', - 'U+1F44E U+1F3FC', - 'U+1F44E U+1F3FB', + 'šŸ‘ŽšŸæ', + 'šŸ‘ŽšŸ¾', + 'šŸ‘ŽšŸ½', + 'šŸ‘ŽšŸ¼', + 'šŸ‘ŽšŸ»', ], }, { - code: 'U+270A', + code: 'āœŠ', keywords: [ 'body', 'clenched', @@ -2074,15 +2098,15 @@ const emojis = { 'punch', ], types: [ - 'U+270A U+1F3FF', - 'U+270A U+1F3FE', - 'U+270A U+1F3FD', - 'U+270A U+1F3FC', - 'U+270A U+1F3FB', + 'āœŠšŸæ', + 'āœŠšŸ¾', + 'āœŠšŸ½', + 'āœŠšŸ¼', + 'āœŠšŸ»', ], }, { - code: 'U+1F44A', + code: 'šŸ‘Š', keywords: [ 'body', 'clenched', @@ -2091,57 +2115,57 @@ const emojis = { 'punch', ], types: [ - 'U+1F44A U+1F3FF', - 'U+1F44A U+1F3FE', - 'U+1F44A U+1F3FD', - 'U+1F44A U+1F3FC', - 'U+1F44A U+1F3FB', + 'šŸ‘ŠšŸæ', + 'šŸ‘ŠšŸ¾', + 'šŸ‘ŠšŸ½', + 'šŸ‘ŠšŸ¼', + 'šŸ‘ŠšŸ»', ], }, { - code: 'U+1F91B', + code: 'šŸ¤›', keywords: [ 'fist', 'leftwards', ], types: [ - 'U+1F91B U+1F3FF', - 'U+1F91B U+1F3FE', - 'U+1F91B U+1F3FD', - 'U+1F91B U+1F3FC', - 'U+1F91B U+1F3FB', + 'šŸ¤›šŸæ', + 'šŸ¤›šŸ¾', + 'šŸ¤›šŸ½', + 'šŸ¤›šŸ¼', + 'šŸ¤›šŸ»', ], }, { - code: 'U+1F91C', + code: 'šŸ¤œ', keywords: [ 'fist', 'rightwards', ], types: [ - 'U+1F91C U+1F3FF', - 'U+1F91C U+1F3FE', - 'U+1F91C U+1F3FD', - 'U+1F91C U+1F3FC', - 'U+1F91C U+1F3FB', + 'šŸ¤œšŸæ', + 'šŸ¤œšŸ¾', + 'šŸ¤œšŸ½', + 'šŸ¤œšŸ¼', + 'šŸ¤œšŸ»', ], }, { - code: 'U+1F91A', + code: 'šŸ¤š', keywords: [ 'backhand', 'raised', ], types: [ - 'U+1F91A U+1F3FF', - 'U+1F91A U+1F3FE', - 'U+1F91A U+1F3FD', - 'U+1F91A U+1F3FC', - 'U+1F91A U+1F3FB', + 'šŸ¤ššŸæ', + 'šŸ¤ššŸ¾', + 'šŸ¤ššŸ½', + 'šŸ¤ššŸ¼', + 'šŸ¤ššŸ»', ], }, { - code: 'U+1F44B', + code: 'šŸ‘‹', keywords: [ 'body', 'hand', @@ -2149,60 +2173,60 @@ const emojis = { 'waving', ], types: [ - 'U+1F44B U+1F3FF', - 'U+1F44B U+1F3FE', - 'U+1F44B U+1F3FD', - 'U+1F44B U+1F3FC', - 'U+1F44B U+1F3FB', + 'šŸ‘‹šŸæ', + 'šŸ‘‹šŸ¾', + 'šŸ‘‹šŸ½', + 'šŸ‘‹šŸ¼', + 'šŸ‘‹šŸ»', ], }, { - code: 'U+1F44F', + code: 'šŸ‘', keywords: [ 'body', 'clap', 'hand', ], types: [ - 'U+1F44F U+1F3FF', - 'U+1F44F U+1F3FE', - 'U+1F44F U+1F3FD', - 'U+1F44F U+1F3FC', - 'U+1F44F U+1F3FB', + 'šŸ‘šŸæ', + 'šŸ‘šŸ¾', + 'šŸ‘šŸ½', + 'šŸ‘šŸ¼', + 'šŸ‘šŸ»', ], }, { - code: 'U+270D', + code: 'āœ', keywords: [ 'body', 'hand', 'write', ], types: [ - 'U+270D U+1F3FF', - 'U+270D U+1F3FE', - 'U+270D U+1F3FD', - 'U+270D U+1F3FC', - 'U+270D U+1F3FB', + 'āœšŸæ', + 'āœšŸ¾', + 'āœšŸ½', + 'āœšŸ¼', + 'āœšŸ»', ], }, { - code: 'U+1F450', + code: 'šŸ‘', keywords: [ 'body', 'hand', 'open', ], types: [ - 'U+1F450 U+1F3FF', - 'U+1F450 U+1F3FE', - 'U+1F450 U+1F3FD', - 'U+1F450 U+1F3FC', - 'U+1F450 U+1F3FB', + 'šŸ‘šŸæ', + 'šŸ‘šŸ¾', + 'šŸ‘šŸ½', + 'šŸ‘šŸ¼', + 'šŸ‘šŸ»', ], }, { - code: 'U+1F64C', + code: 'šŸ™Œ', keywords: [ 'body', 'celebration', @@ -2212,15 +2236,15 @@ const emojis = { 'raised', ], types: [ - 'U+1F64C U+1F3FF', - 'U+1F64C U+1F3FE', - 'U+1F64C U+1F3FD', - 'U+1F64C U+1F3FC', - 'U+1F64C U+1F3FB', + 'šŸ™ŒšŸæ', + 'šŸ™ŒšŸ¾', + 'šŸ™ŒšŸ½', + 'šŸ™ŒšŸ¼', + 'šŸ™ŒšŸ»', ], }, { - code: 'U+1F64F', + code: 'šŸ™', keywords: [ 'ask', 'body', @@ -2233,15 +2257,15 @@ const emojis = { 'thanks', ], types: [ - 'U+1F64F U+1F3FF', - 'U+1F64F U+1F3FE', - 'U+1F64F U+1F3FD', - 'U+1F64F U+1F3FC', - 'U+1F64F U+1F3FB', + 'šŸ™šŸæ', + 'šŸ™šŸ¾', + 'šŸ™šŸ½', + 'šŸ™šŸ¼', + 'šŸ™šŸ»', ], }, { - code: 'U+1F91D', + code: 'šŸ¤', keywords: [ 'agreement', 'hand', @@ -2250,15 +2274,15 @@ const emojis = { 'shake', ], types: [ - 'U+1F91D U+1F3FF', - 'U+1F91D U+1F3FE', - 'U+1F91D U+1F3FD', - 'U+1F91D U+1F3FC', - 'U+1F91D U+1F3FB', + 'šŸ¤šŸæ', + 'šŸ¤šŸ¾', + 'šŸ¤šŸ½', + 'šŸ¤šŸ¼', + 'šŸ¤šŸ»', ], }, { - code: 'U+1F485', + code: 'šŸ’…', keywords: [ 'body', 'care', @@ -2268,43 +2292,43 @@ const emojis = { 'polish', ], types: [ - 'U+1F485 U+1F3FF', - 'U+1F485 U+1F3FE', - 'U+1F485 U+1F3FD', - 'U+1F485 U+1F3FC', - 'U+1F485 U+1F3FB', + 'šŸ’…šŸæ', + 'šŸ’…šŸ¾', + 'šŸ’…šŸ½', + 'šŸ’…šŸ¼', + 'šŸ’…šŸ»', ], }, { - code: 'U+1F442', + code: 'šŸ‘‚', keywords: [ 'body', 'ear', ], types: [ - 'U+1F442 U+1F3FF', - 'U+1F442 U+1F3FE', - 'U+1F442 U+1F3FD', - 'U+1F442 U+1F3FC', - 'U+1F442 U+1F3FB', + 'šŸ‘‚šŸæ', + 'šŸ‘‚šŸ¾', + 'šŸ‘‚šŸ½', + 'šŸ‘‚šŸ¼', + 'šŸ‘‚šŸ»', ], }, { - code: 'U+1F443', + code: 'šŸ‘ƒ', keywords: [ 'body', 'nose', ], types: [ - 'U+1F443 U+1F3FF', - 'U+1F443 U+1F3FE', - 'U+1F443 U+1F3FD', - 'U+1F443 U+1F3FC', - 'U+1F443 U+1F3FB', + 'šŸ‘ƒšŸæ', + 'šŸ‘ƒšŸ¾', + 'šŸ‘ƒšŸ½', + 'šŸ‘ƒšŸ¼', + 'šŸ‘ƒšŸ»', ], }, { - code: 'U+1F463', + code: 'šŸ‘£', keywords: [ 'body', 'clothing', @@ -2313,7 +2337,7 @@ const emojis = { ], }, { - code: 'U+1F440', + code: 'šŸ‘€', keywords: [ 'body', 'eye', @@ -2321,14 +2345,14 @@ const emojis = { ], }, { - code: 'U+1F441', + code: 'šŸ‘', keywords: [ 'body', 'eye', ], }, { - code: 'U+1F441 U+200D U+1F5E8', + code: 'šŸ‘ā€šŸ—Ø', keywords: [ 'bubble', 'eye', @@ -2337,14 +2361,14 @@ const emojis = { ], }, { - code: 'U+1F445', + code: 'šŸ‘…', keywords: [ 'body', 'tongue', ], }, { - code: 'U+1F444', + code: 'šŸ‘„', keywords: [ 'body', 'lips', @@ -2352,7 +2376,7 @@ const emojis = { ], }, { - code: 'U+1F48B', + code: 'šŸ’‹', keywords: [ 'heart', 'kiss', @@ -2362,7 +2386,7 @@ const emojis = { ], }, { - code: 'U+1F498', + code: 'šŸ’˜', keywords: [ 'arrow', 'cupid', @@ -2371,13 +2395,13 @@ const emojis = { ], }, { - code: 'U+2764', + code: 'ā¤', keywords: [ 'heart', ], }, { - code: 'U+1F493', + code: 'šŸ’“', keywords: [ 'beating', 'heart', @@ -2386,7 +2410,7 @@ const emojis = { ], }, { - code: 'U+1F494', + code: 'šŸ’”', keywords: [ 'break', 'broken', @@ -2394,14 +2418,14 @@ const emojis = { ], }, { - code: 'U+1F495', + code: 'šŸ’•', keywords: [ 'heart', 'love', ], }, { - code: 'U+1F496', + code: 'šŸ’–', keywords: [ 'excited', 'heart', @@ -2409,7 +2433,7 @@ const emojis = { ], }, { - code: 'U+1F497', + code: 'šŸ’—', keywords: [ 'excited', 'growing', @@ -2419,35 +2443,35 @@ const emojis = { ], }, { - code: 'U+1F499', + code: 'šŸ’™', keywords: [ 'blue', 'heart', ], }, { - code: 'U+1F49A', + code: 'šŸ’š', keywords: [ 'green', 'heart', ], }, { - code: 'U+1F49B', + code: 'šŸ’›', keywords: [ 'heart', 'yellow', ], }, { - code: 'U+1F49C', + code: 'šŸ’œ', keywords: [ 'heart', 'purple', ], }, { - code: 'U+1F5A4', + code: 'šŸ–¤', keywords: [ 'black', 'evil', @@ -2456,7 +2480,7 @@ const emojis = { ], }, { - code: 'U+1F49D', + code: 'šŸ’', keywords: [ 'heart', 'ribbon', @@ -2464,20 +2488,20 @@ const emojis = { ], }, { - code: 'U+1F49E', + code: 'šŸ’ž', keywords: [ 'heart', 'revolving', ], }, { - code: 'U+1F49F', + code: 'šŸ’Ÿ', keywords: [ 'heart', ], }, { - code: 'U+2763', + code: 'ā£', keywords: [ 'exclamation', 'heart', @@ -2486,7 +2510,7 @@ const emojis = { ], }, { - code: 'U+1F48C', + code: 'šŸ’Œ', keywords: [ 'heart', 'letter', @@ -2496,7 +2520,7 @@ const emojis = { ], }, { - code: 'U+1F4A4', + code: 'šŸ’¤', keywords: [ 'comic', 'sleep', @@ -2504,7 +2528,7 @@ const emojis = { ], }, { - code: 'U+1F4A2', + code: 'šŸ’¢', keywords: [ 'angry', 'comic', @@ -2512,14 +2536,14 @@ const emojis = { ], }, { - code: 'U+1F4A3', + code: 'šŸ’£', keywords: [ 'bomb', 'comic', ], }, { - code: 'U+1F4A5', + code: 'šŸ’„', keywords: [ 'boom', 'collision', @@ -2527,7 +2551,7 @@ const emojis = { ], }, { - code: 'U+1F4A6', + code: 'šŸ’¦', keywords: [ 'comic', 'splashing', @@ -2535,7 +2559,7 @@ const emojis = { ], }, { - code: 'U+1F4A8', + code: 'šŸ’Ø', keywords: [ 'comic', 'dash', @@ -2543,7 +2567,7 @@ const emojis = { ], }, { - code: 'U+1F4AB', + code: 'šŸ’«', keywords: [ 'comic', 'dizzy', @@ -2551,7 +2575,7 @@ const emojis = { ], }, { - code: 'U+1F4AC', + code: 'šŸ’¬', keywords: [ 'balloon', 'bubble', @@ -2561,14 +2585,14 @@ const emojis = { ], }, { - code: 'U+1F5E8', + code: 'šŸ—Ø', keywords: [ 'dialog', 'speech', ], }, { - code: 'U+1F5EF', + code: 'šŸ—Æ', keywords: [ 'angry', 'balloon', @@ -2577,7 +2601,7 @@ const emojis = { ], }, { - code: 'U+1F4AD', + code: 'šŸ’­', keywords: [ 'balloon', 'bubble', @@ -2586,13 +2610,13 @@ const emojis = { ], }, { - code: 'U+1F573', + code: 'šŸ•³', keywords: [ 'hole', ], }, { - code: 'U+1F453', + code: 'šŸ‘“', keywords: [ 'clothing', 'eye', @@ -2602,7 +2626,7 @@ const emojis = { ], }, { - code: 'U+1F576', + code: 'šŸ•¶', keywords: [ 'dark', 'eye', @@ -2612,14 +2636,14 @@ const emojis = { ], }, { - code: 'U+1F454', + code: 'šŸ‘”', keywords: [ 'clothing', 'necktie', ], }, { - code: 'U+1F455', + code: 'šŸ‘•', keywords: [ 'clothing', 'shirt', @@ -2627,7 +2651,7 @@ const emojis = { ], }, { - code: 'U+1F456', + code: 'šŸ‘–', keywords: [ 'clothing', 'jeans', @@ -2636,21 +2660,21 @@ const emojis = { ], }, { - code: 'U+1F457', + code: 'šŸ‘—', keywords: [ 'clothing', 'dress', ], }, { - code: 'U+1F458', + code: 'šŸ‘˜', keywords: [ 'clothing', 'kimono', ], }, { - code: 'U+1F459', + code: 'šŸ‘™', keywords: [ 'bikini', 'clothing', @@ -2658,14 +2682,14 @@ const emojis = { ], }, { - code: 'U+1F45A', + code: 'šŸ‘š', keywords: [ 'clothing', 'woman', ], }, { - code: 'U+1F45B', + code: 'šŸ‘›', keywords: [ 'clothing', 'coin', @@ -2673,7 +2697,7 @@ const emojis = { ], }, { - code: 'U+1F45C', + code: 'šŸ‘œ', keywords: [ 'bag', 'clothing', @@ -2681,7 +2705,7 @@ const emojis = { ], }, { - code: 'U+1F45D', + code: 'šŸ‘', keywords: [ 'bag', 'clothing', @@ -2689,7 +2713,7 @@ const emojis = { ], }, { - code: 'U+1F6CD', + code: 'šŸ›', keywords: [ 'bag', 'hotel', @@ -2697,7 +2721,7 @@ const emojis = { ], }, { - code: 'U+1F392', + code: 'šŸŽ’', keywords: [ 'activity', 'bag', @@ -2706,7 +2730,7 @@ const emojis = { ], }, { - code: 'U+1F45E', + code: 'šŸ‘ž', keywords: [ 'clothing', 'man', @@ -2714,7 +2738,7 @@ const emojis = { ], }, { - code: 'U+1F45F', + code: 'šŸ‘Ÿ', keywords: [ 'athletic', 'clothing', @@ -2723,7 +2747,7 @@ const emojis = { ], }, { - code: 'U+1F460', + code: 'šŸ‘ ', keywords: [ 'clothing', 'heel', @@ -2732,7 +2756,7 @@ const emojis = { ], }, { - code: 'U+1F461', + code: 'šŸ‘”', keywords: [ 'clothing', 'sandal', @@ -2741,7 +2765,7 @@ const emojis = { ], }, { - code: 'U+1F462', + code: 'šŸ‘¢', keywords: [ 'boot', 'clothing', @@ -2750,7 +2774,7 @@ const emojis = { ], }, { - code: 'U+1F451', + code: 'šŸ‘‘', keywords: [ 'clothing', 'crown', @@ -2759,7 +2783,7 @@ const emojis = { ], }, { - code: 'U+1F452', + code: 'šŸ‘’', keywords: [ 'clothing', 'hat', @@ -2767,7 +2791,7 @@ const emojis = { ], }, { - code: 'U+1F3A9', + code: 'šŸŽ©', keywords: [ 'activity', 'clothing', @@ -2778,7 +2802,7 @@ const emojis = { ], }, { - code: 'U+1F393', + code: 'šŸŽ“', keywords: [ 'activity', 'cap', @@ -2789,7 +2813,7 @@ const emojis = { ], }, { - code: 'U+26D1', + code: 'ā›‘', keywords: [ 'aid', 'cross', @@ -2799,7 +2823,7 @@ const emojis = { ], }, { - code: 'U+1F4FF', + code: 'šŸ“æ', keywords: [ 'beads', 'clothing', @@ -2809,7 +2833,7 @@ const emojis = { ], }, { - code: 'U+1F484', + code: 'šŸ’„', keywords: [ 'cosmetics', 'lipstick', @@ -2817,7 +2841,7 @@ const emojis = { ], }, { - code: 'U+1F48D', + code: 'šŸ’', keywords: [ 'diamond', 'ring', @@ -2825,7 +2849,7 @@ const emojis = { ], }, { - code: 'U+1F48E', + code: 'šŸ’Ž', keywords: [ 'diamond', 'gem', @@ -2836,26 +2860,26 @@ const emojis = { ], 'Animals & Nature': [ { - code: 'U+1F435', + code: 'šŸµ', keywords: [ 'face', 'monkey', ], }, { - code: 'U+1F412', + code: 'šŸ’', keywords: [ 'monkey', ], }, { - code: 'U+1F98D', + code: 'šŸ¦', keywords: [ 'gorilla', ], }, { - code: 'U+1F436', + code: 'šŸ¶', keywords: [ 'dog', 'face', @@ -2863,35 +2887,35 @@ const emojis = { ], }, { - code: 'U+1F415', + code: 'šŸ•', keywords: [ 'dog', 'pet', ], }, { - code: 'U+1F429', + code: 'šŸ©', keywords: [ 'dog', 'poodle', ], }, { - code: 'U+1F43A', + code: 'šŸŗ', keywords: [ 'face', 'wolf', ], }, { - code: 'U+1F98A', + code: 'šŸ¦Š', keywords: [ 'face', 'fox', ], }, { - code: 'U+1F431', + code: 'šŸ±', keywords: [ 'cat', 'face', @@ -2899,14 +2923,14 @@ const emojis = { ], }, { - code: 'U+1F408', + code: 'šŸˆ', keywords: [ 'cat', 'pet', ], }, { - code: 'U+1F981', + code: 'šŸ¦', keywords: [ 'face', 'leo', @@ -2915,33 +2939,33 @@ const emojis = { ], }, { - code: 'U+1F42F', + code: 'šŸÆ', keywords: [ 'face', 'tiger', ], }, { - code: 'U+1F405', + code: 'šŸ…', keywords: [ 'tiger', ], }, { - code: 'U+1F406', + code: 'šŸ†', keywords: [ 'leopard', ], }, { - code: 'U+1F434', + code: 'šŸ“', keywords: [ 'face', 'horse', ], }, { - code: 'U+1F40E', + code: 'šŸŽ', keywords: [ 'horse', 'racehorse', @@ -2949,27 +2973,27 @@ const emojis = { ], }, { - code: 'U+1F98C', + code: 'šŸ¦Œ', keywords: [ 'deer', ], }, { - code: 'U+1F984', + code: 'šŸ¦„', keywords: [ 'face', 'unicorn', ], }, { - code: 'U+1F42E', + code: 'šŸ®', keywords: [ 'cow', 'face', ], }, { - code: 'U+1F402', + code: 'šŸ‚', keywords: [ 'bull', 'ox', @@ -2978,41 +3002,41 @@ const emojis = { ], }, { - code: 'U+1F403', + code: 'šŸƒ', keywords: [ 'buffalo', 'water', ], }, { - code: 'U+1F404', + code: 'šŸ„', keywords: [ 'cow', ], }, { - code: 'U+1F437', + code: 'šŸ·', keywords: [ 'face', 'pig', ], }, { - code: 'U+1F416', + code: 'šŸ–', keywords: [ 'pig', 'sow', ], }, { - code: 'U+1F417', + code: 'šŸ—', keywords: [ 'boar', 'pig', ], }, { - code: 'U+1F43D', + code: 'šŸ½', keywords: [ 'face', 'nose', @@ -3020,7 +3044,7 @@ const emojis = { ], }, { - code: 'U+1F40F', + code: 'šŸ', keywords: [ 'aries', 'ram', @@ -3029,14 +3053,14 @@ const emojis = { ], }, { - code: 'U+1F411', + code: 'šŸ‘', keywords: [ 'ewe', 'sheep', ], }, { - code: 'U+1F410', + code: 'šŸ', keywords: [ 'capricorn', 'goat', @@ -3044,7 +3068,7 @@ const emojis = { ], }, { - code: 'U+1F42A', + code: 'šŸŖ', keywords: [ 'camel', 'dromedary', @@ -3052,7 +3076,7 @@ const emojis = { ], }, { - code: 'U+1F42B', + code: 'šŸ«', keywords: [ 'bactrian', 'camel', @@ -3060,38 +3084,38 @@ const emojis = { ], }, { - code: 'U+1F418', + code: 'šŸ˜', keywords: [ 'elephant', ], }, { - code: 'U+1F98F', + code: 'šŸ¦', keywords: [ 'rhinoceros', ], }, { - code: 'U+1F42D', + code: 'šŸ­', keywords: [ 'face', 'mouse', ], }, { - code: 'U+1F401', + code: 'šŸ', keywords: [ 'mouse', ], }, { - code: 'U+1F400', + code: 'šŸ€', keywords: [ 'rat', ], }, { - code: 'U+1F439', + code: 'šŸ¹', keywords: [ 'face', 'hamster', @@ -3099,7 +3123,7 @@ const emojis = { ], }, { - code: 'U+1F430', + code: 'šŸ°', keywords: [ 'bunny', 'face', @@ -3108,7 +3132,7 @@ const emojis = { ], }, { - code: 'U+1F407', + code: 'šŸ‡', keywords: [ 'bunny', 'pet', @@ -3116,41 +3140,41 @@ const emojis = { ], }, { - code: 'U+1F43F', + code: 'šŸæ', keywords: [ 'chipmunk', ], }, { - code: 'U+1F987', + code: 'šŸ¦‡', keywords: [ 'bat', 'vampire', ], }, { - code: 'U+1F43B', + code: 'šŸ»', keywords: [ 'bear', 'face', ], }, { - code: 'U+1F428', + code: 'šŸØ', keywords: [ 'bear', 'koala', ], }, { - code: 'U+1F43C', + code: 'šŸ¼', keywords: [ 'face', 'panda', ], }, { - code: 'U+1F43E', + code: 'šŸ¾', keywords: [ 'feet', 'paw', @@ -3158,25 +3182,25 @@ const emojis = { ], }, { - code: 'U+1F983', + code: 'šŸ¦ƒ', keywords: [ 'turkey', ], }, { - code: 'U+1F414', + code: 'šŸ”', keywords: [ 'chicken', ], }, { - code: 'U+1F413', + code: 'šŸ“', keywords: [ 'rooster', ], }, { - code: 'U+1F423', + code: 'šŸ£', keywords: [ 'baby', 'chick', @@ -3184,33 +3208,33 @@ const emojis = { ], }, { - code: 'U+1F424', + code: 'šŸ¤', keywords: [ 'baby', 'chick', ], }, { - code: 'U+1F425', + code: 'šŸ„', keywords: [ 'baby', 'chick', ], }, { - code: 'U+1F426', + code: 'šŸ¦', keywords: [ 'bird', ], }, { - code: 'U+1F427', + code: 'šŸ§', keywords: [ 'penguin', ], }, { - code: 'U+1F54A', + code: 'šŸ•Š', keywords: [ 'bird', 'dove', @@ -3219,21 +3243,21 @@ const emojis = { ], }, { - code: 'U+1F985', + code: 'šŸ¦…', keywords: [ 'bird', 'eagle', ], }, { - code: 'U+1F986', + code: 'šŸ¦†', keywords: [ 'bird', 'duck', ], }, { - code: 'U+1F989', + code: 'šŸ¦‰', keywords: [ 'bird', 'owl', @@ -3241,33 +3265,33 @@ const emojis = { ], }, { - code: 'U+1F438', + code: 'šŸø', keywords: [ 'face', 'frog', ], }, { - code: 'U+1F40A', + code: 'šŸŠ', keywords: [ 'crocodile', ], }, { - code: 'U+1F422', + code: 'šŸ¢', keywords: [ 'turtle', ], }, { - code: 'U+1F98E', + code: 'šŸ¦Ž', keywords: [ 'lizard', 'reptile', ], }, { - code: 'U+1F40D', + code: 'šŸ', keywords: [ 'bearer', 'ophiuchus', @@ -3277,7 +3301,7 @@ const emojis = { ], }, { - code: 'U+1F432', + code: 'šŸ²', keywords: [ 'dragon', 'face', @@ -3285,14 +3309,14 @@ const emojis = { ], }, { - code: 'U+1F409', + code: 'šŸ‰', keywords: [ 'dragon', 'fairy tale', ], }, { - code: 'U+1F433', + code: 'šŸ³', keywords: [ 'face', 'spouting', @@ -3300,20 +3324,20 @@ const emojis = { ], }, { - code: 'U+1F40B', + code: 'šŸ‹', keywords: [ 'whale', ], }, { - code: 'U+1F42C', + code: 'šŸ¬', keywords: [ 'dolphin', 'flipper', ], }, { - code: 'U+1F41F', + code: 'šŸŸ', keywords: [ 'fish', 'pisces', @@ -3321,41 +3345,41 @@ const emojis = { ], }, { - code: 'U+1F420', + code: 'šŸ ', keywords: [ 'fish', 'tropical', ], }, { - code: 'U+1F421', + code: 'šŸ”', keywords: [ 'blowfish', 'fish', ], }, { - code: 'U+1F988', + code: 'šŸ¦ˆ', keywords: [ 'fish', 'shark', ], }, { - code: 'U+1F419', + code: 'šŸ™', keywords: [ 'octopus', ], }, { - code: 'U+1F41A', + code: 'šŸš', keywords: [ 'shell', 'spiral', ], }, { - code: 'U+1F980', + code: 'šŸ¦€', keywords: [ 'cancer', 'crab', @@ -3363,7 +3387,7 @@ const emojis = { ], }, { - code: 'U+1F990', + code: 'šŸ¦', keywords: [ 'shellfish', 'shrimp', @@ -3371,14 +3395,14 @@ const emojis = { ], }, { - code: 'U+1F991', + code: 'šŸ¦‘', keywords: [ 'molusc', 'squid', ], }, { - code: 'U+1F98B', + code: 'šŸ¦‹', keywords: [ 'butterfly', 'insect', @@ -3386,27 +3410,27 @@ const emojis = { ], }, { - code: 'U+1F40C', + code: 'šŸŒ', keywords: [ 'snail', ], }, { - code: 'U+1F41B', + code: 'šŸ›', keywords: [ 'bug', 'insect', ], }, { - code: 'U+1F41C', + code: 'šŸœ', keywords: [ 'ant', 'insect', ], }, { - code: 'U+1F41D', + code: 'šŸ', keywords: [ 'bee', 'honeybee', @@ -3414,7 +3438,7 @@ const emojis = { ], }, { - code: 'U+1F41E', + code: 'šŸž', keywords: [ 'beetle', 'insect', @@ -3424,21 +3448,21 @@ const emojis = { ], }, { - code: 'U+1F577', + code: 'šŸ•·', keywords: [ 'insect', 'spider', ], }, { - code: 'U+1F578', + code: 'šŸ•ø', keywords: [ 'spider', 'web', ], }, { - code: 'U+1F982', + code: 'šŸ¦‚', keywords: [ 'scorpio', 'scorpion', @@ -3447,7 +3471,7 @@ const emojis = { ], }, { - code: 'U+1F490', + code: 'šŸ’', keywords: [ 'bouquet', 'flower', @@ -3456,7 +3480,7 @@ const emojis = { ], }, { - code: 'U+1F338', + code: 'šŸŒø', keywords: [ 'blossom', 'cherry', @@ -3465,20 +3489,20 @@ const emojis = { ], }, { - code: 'U+1F4AE', + code: 'šŸ’®', keywords: [ 'flower', ], }, { - code: 'U+1F3F5', + code: 'šŸµ', keywords: [ 'plant', 'rosette', ], }, { - code: 'U+1F339', + code: 'šŸŒ¹', keywords: [ 'flower', 'plant', @@ -3486,14 +3510,14 @@ const emojis = { ], }, { - code: 'U+1F940', + code: 'šŸ„€', keywords: [ 'flower', 'wilted', ], }, { - code: 'U+1F33A', + code: 'šŸŒŗ', keywords: [ 'flower', 'hibiscus', @@ -3501,7 +3525,7 @@ const emojis = { ], }, { - code: 'U+1F33B', + code: 'šŸŒ»', keywords: [ 'flower', 'plant', @@ -3510,7 +3534,7 @@ const emojis = { ], }, { - code: 'U+1F33C', + code: 'šŸŒ¼', keywords: [ 'blossom', 'flower', @@ -3518,7 +3542,7 @@ const emojis = { ], }, { - code: 'U+1F337', + code: 'šŸŒ·', keywords: [ 'flower', 'plant', @@ -3526,7 +3550,7 @@ const emojis = { ], }, { - code: 'U+1F331', + code: 'šŸŒ±', keywords: [ 'plant', 'seedling', @@ -3534,7 +3558,7 @@ const emojis = { ], }, { - code: 'U+1F332', + code: 'šŸŒ²', keywords: [ 'evergreen', 'plant', @@ -3542,7 +3566,7 @@ const emojis = { ], }, { - code: 'U+1F333', + code: 'šŸŒ³', keywords: [ 'deciduous', 'plant', @@ -3551,7 +3575,7 @@ const emojis = { ], }, { - code: 'U+1F334', + code: 'šŸŒ“', keywords: [ 'palm', 'plant', @@ -3559,14 +3583,14 @@ const emojis = { ], }, { - code: 'U+1F335', + code: 'šŸŒµ', keywords: [ 'cactus', 'plant', ], }, { - code: 'U+1F33E', + code: 'šŸŒ¾', keywords: [ 'ear', 'plant', @@ -3574,7 +3598,7 @@ const emojis = { ], }, { - code: 'U+1F33F', + code: 'šŸŒæ', keywords: [ 'herb', 'leaf', @@ -3582,14 +3606,14 @@ const emojis = { ], }, { - code: 'U+2618', + code: 'ā˜˜', keywords: [ 'plant', 'shamrock', ], }, { - code: 'U+1F340', + code: 'šŸ€', keywords: [ '4', 'clover', @@ -3599,7 +3623,7 @@ const emojis = { ], }, { - code: 'U+1F341', + code: 'šŸ', keywords: [ 'falling', 'leaf', @@ -3608,7 +3632,7 @@ const emojis = { ], }, { - code: 'U+1F342', + code: 'šŸ‚', keywords: [ 'falling', 'leaf', @@ -3616,7 +3640,7 @@ const emojis = { ], }, { - code: 'U+1F343', + code: 'šŸƒ', keywords: [ 'blow', 'flutter', @@ -3626,7 +3650,7 @@ const emojis = { ], }, { - code: 'U+1F347', + code: 'šŸ‡', keywords: [ 'fruit', 'grape', @@ -3634,7 +3658,7 @@ const emojis = { ], }, { - code: 'U+1F348', + code: 'šŸˆ', keywords: [ 'fruit', 'melon', @@ -3642,7 +3666,7 @@ const emojis = { ], }, { - code: 'U+1F349', + code: 'šŸ‰', keywords: [ 'fruit', 'plant', @@ -3650,7 +3674,7 @@ const emojis = { ], }, { - code: 'U+1F34A', + code: 'šŸŠ', keywords: [ 'fruit', 'orange', @@ -3659,7 +3683,7 @@ const emojis = { ], }, { - code: 'U+1F34B', + code: 'šŸ‹', keywords: [ 'citrus', 'fruit', @@ -3668,7 +3692,7 @@ const emojis = { ], }, { - code: 'U+1F34C', + code: 'šŸŒ', keywords: [ 'banana', 'fruit', @@ -3676,7 +3700,7 @@ const emojis = { ], }, { - code: 'U+1F34D', + code: 'šŸ', keywords: [ 'fruit', 'pineapple', @@ -3684,7 +3708,7 @@ const emojis = { ], }, { - code: 'U+1F34E', + code: 'šŸŽ', keywords: [ 'apple', 'fruit', @@ -3693,7 +3717,7 @@ const emojis = { ], }, { - code: 'U+1F34F', + code: 'šŸ', keywords: [ 'apple', 'fruit', @@ -3702,7 +3726,7 @@ const emojis = { ], }, { - code: 'U+1F350', + code: 'šŸ', keywords: [ 'fruit', 'pear', @@ -3710,7 +3734,7 @@ const emojis = { ], }, { - code: 'U+1F351', + code: 'šŸ‘', keywords: [ 'fruit', 'peach', @@ -3718,7 +3742,7 @@ const emojis = { ], }, { - code: 'U+1F352', + code: 'šŸ’', keywords: [ 'cherry', 'fruit', @@ -3726,7 +3750,7 @@ const emojis = { ], }, { - code: 'U+1F353', + code: 'šŸ“', keywords: [ 'berry', 'fruit', @@ -3735,7 +3759,7 @@ const emojis = { ], }, { - code: 'U+1F345', + code: 'šŸ…', keywords: [ 'plant', 'tomato', @@ -3743,21 +3767,21 @@ const emojis = { ], }, { - code: 'U+1F95D', + code: 'šŸ„', keywords: [ 'fruit', 'kiwi', ], }, { - code: 'U+1F951', + code: 'šŸ„‘', keywords: [ 'avocado', 'fruit', ], }, { - code: 'U+1F346', + code: 'šŸ†', keywords: [ 'aubergine', 'eggplant', @@ -3766,21 +3790,21 @@ const emojis = { ], }, { - code: 'U+1F954', + code: 'šŸ„”', keywords: [ 'potato', 'vegetable', ], }, { - code: 'U+1F955', + code: 'šŸ„•', keywords: [ 'carrot', 'vegetable', ], }, { - code: 'U+1F33D', + code: 'šŸŒ½', keywords: [ 'corn', 'ear', @@ -3790,7 +3814,7 @@ const emojis = { ], }, { - code: 'U+1F336', + code: 'šŸŒ¶', keywords: [ 'hot', 'pepper', @@ -3798,7 +3822,7 @@ const emojis = { ], }, { - code: 'U+1F952', + code: 'šŸ„’', keywords: [ 'cucumber', 'pickle', @@ -3806,14 +3830,14 @@ const emojis = { ], }, { - code: 'U+1F344', + code: 'šŸ„', keywords: [ 'mushroom', 'plant', ], }, { - code: 'U+1F95C', + code: 'šŸ„œ', keywords: [ 'nut', 'peanut', @@ -3821,21 +3845,21 @@ const emojis = { ], }, { - code: 'U+1F330', + code: 'šŸŒ°', keywords: [ 'chestnut', 'plant', ], }, { - code: 'U+1F35E', + code: 'šŸž', keywords: [ 'bread', 'loaf', ], }, { - code: 'U+1F950', + code: 'šŸ„', keywords: [ 'bread', 'crescent roll', @@ -3844,7 +3868,7 @@ const emojis = { ], }, { - code: 'U+1F956', + code: 'šŸ„–', keywords: [ 'baguette', 'bread', @@ -3852,7 +3876,7 @@ const emojis = { ], }, { - code: 'U+1F95E', + code: 'šŸ„ž', keywords: [ 'crĆŖpe', 'hotcake', @@ -3860,20 +3884,20 @@ const emojis = { ], }, { - code: 'U+1F9C0', + code: 'šŸ§€', keywords: [ 'cheese', ], }, { - code: 'U+1F356', + code: 'šŸ–', keywords: [ 'bone', 'meat', ], }, { - code: 'U+1F357', + code: 'šŸ—', keywords: [ 'bone', 'chicken', @@ -3882,28 +3906,28 @@ const emojis = { ], }, { - code: 'U+1F953', + code: 'šŸ„“', keywords: [ 'bacon', 'meat', ], }, { - code: 'U+1F354', + code: 'šŸ”', keywords: [ 'burger', 'hamburger', ], }, { - code: 'U+1F35F', + code: 'šŸŸ', keywords: [ 'french', 'fries', ], }, { - code: 'U+1F355', + code: 'šŸ•', keywords: [ 'cheese', 'pizza', @@ -3911,7 +3935,7 @@ const emojis = { ], }, { - code: 'U+1F32D', + code: 'šŸŒ­', keywords: [ 'frankfurter', 'hot dog', @@ -3920,21 +3944,21 @@ const emojis = { ], }, { - code: 'U+1F32E', + code: 'šŸŒ®', keywords: [ 'mexican', 'taco', ], }, { - code: 'U+1F32F', + code: 'šŸŒÆ', keywords: [ 'burrito', 'mexican', ], }, { - code: 'U+1F959', + code: 'šŸ„™', keywords: [ 'falafel', 'flatbread', @@ -3944,13 +3968,13 @@ const emojis = { ], }, { - code: 'U+1F95A', + code: 'šŸ„š', keywords: [ 'egg', ], }, { - code: 'U+1F373', + code: 'šŸ³', keywords: [ 'cooking', 'egg', @@ -3959,7 +3983,7 @@ const emojis = { ], }, { - code: 'U+1F958', + code: 'šŸ„˜', keywords: [ 'casserole', 'paella', @@ -3968,41 +3992,41 @@ const emojis = { ], }, { - code: 'U+1F372', + code: 'šŸ²', keywords: [ 'pot', 'stew', ], }, { - code: 'U+1F957', + code: 'šŸ„—', keywords: [ 'green', 'salad', ], }, { - code: 'U+1F37F', + code: 'šŸæ', keywords: [ 'popcorn', ], }, { - code: 'U+1F371', + code: 'šŸ±', keywords: [ 'bento', 'box', ], }, { - code: 'U+1F358', + code: 'šŸ˜', keywords: [ 'cracker', 'rice', ], }, { - code: 'U+1F359', + code: 'šŸ™', keywords: [ 'ball', 'japanese', @@ -4010,21 +4034,21 @@ const emojis = { ], }, { - code: 'U+1F35A', + code: 'šŸš', keywords: [ 'cooked', 'rice', ], }, { - code: 'U+1F35B', + code: 'šŸ›', keywords: [ 'curry', 'rice', ], }, { - code: 'U+1F35C', + code: 'šŸœ', keywords: [ 'bowl', 'noodle', @@ -4033,14 +4057,14 @@ const emojis = { ], }, { - code: 'U+1F35D', + code: 'šŸ', keywords: [ 'pasta', 'spaghetti', ], }, { - code: 'U+1F360', + code: 'šŸ ', keywords: [ 'potato', 'roasted', @@ -4048,7 +4072,7 @@ const emojis = { ], }, { - code: 'U+1F362', + code: 'šŸ¢', keywords: [ 'kebab', 'oden', @@ -4058,13 +4082,13 @@ const emojis = { ], }, { - code: 'U+1F363', + code: 'šŸ£', keywords: [ 'sushi', ], }, { - code: 'U+1F364', + code: 'šŸ¤', keywords: [ 'fried', 'prawn', @@ -4073,7 +4097,7 @@ const emojis = { ], }, { - code: 'U+1F365', + code: 'šŸ„', keywords: [ 'cake', 'fish', @@ -4082,7 +4106,7 @@ const emojis = { ], }, { - code: 'U+1F361', + code: 'šŸ”', keywords: [ 'dango', 'dessert', @@ -4093,7 +4117,7 @@ const emojis = { ], }, { - code: 'U+1F366', + code: 'šŸ¦', keywords: [ 'cream', 'dessert', @@ -4104,7 +4128,7 @@ const emojis = { ], }, { - code: 'U+1F367', + code: 'šŸ§', keywords: [ 'dessert', 'ice', @@ -4113,7 +4137,7 @@ const emojis = { ], }, { - code: 'U+1F368', + code: 'šŸØ', keywords: [ 'cream', 'dessert', @@ -4122,7 +4146,7 @@ const emojis = { ], }, { - code: 'U+1F369', + code: 'šŸ©', keywords: [ 'dessert', 'donut', @@ -4131,7 +4155,7 @@ const emojis = { ], }, { - code: 'U+1F36A', + code: 'šŸŖ', keywords: [ 'cookie', 'dessert', @@ -4139,7 +4163,7 @@ const emojis = { ], }, { - code: 'U+1F382', + code: 'šŸŽ‚', keywords: [ 'birthday', 'cake', @@ -4150,7 +4174,7 @@ const emojis = { ], }, { - code: 'U+1F370', + code: 'šŸ°', keywords: [ 'cake', 'dessert', @@ -4161,7 +4185,7 @@ const emojis = { ], }, { - code: 'U+1F36B', + code: 'šŸ«', keywords: [ 'bar', 'chocolate', @@ -4170,7 +4194,7 @@ const emojis = { ], }, { - code: 'U+1F36C', + code: 'šŸ¬', keywords: [ 'candy', 'dessert', @@ -4178,7 +4202,7 @@ const emojis = { ], }, { - code: 'U+1F36D', + code: 'šŸ­', keywords: [ 'candy', 'dessert', @@ -4187,7 +4211,7 @@ const emojis = { ], }, { - code: 'U+1F36E', + code: 'šŸ®', keywords: [ 'custard', 'dessert', @@ -4196,7 +4220,7 @@ const emojis = { ], }, { - code: 'U+1F36F', + code: 'šŸÆ', keywords: [ 'honey', 'honeypot', @@ -4205,7 +4229,7 @@ const emojis = { ], }, { - code: 'U+1F37C', + code: 'šŸ¼', keywords: [ 'baby', 'bottle', @@ -4214,7 +4238,7 @@ const emojis = { ], }, { - code: 'U+1F95B', + code: 'šŸ„›', keywords: [ 'drink', 'glass', @@ -4222,7 +4246,7 @@ const emojis = { ], }, { - code: 'U+2615', + code: 'ā˜•', keywords: [ 'beverage', 'coffee', @@ -4233,7 +4257,7 @@ const emojis = { ], }, { - code: 'U+1F375', + code: 'šŸµ', keywords: [ 'beverage', 'cup', @@ -4243,7 +4267,7 @@ const emojis = { ], }, { - code: 'U+1F376', + code: 'šŸ¶', keywords: [ 'bar', 'beverage', @@ -4254,7 +4278,7 @@ const emojis = { ], }, { - code: 'U+1F37E', + code: 'šŸ¾', keywords: [ 'bar', 'bottle', @@ -4264,7 +4288,7 @@ const emojis = { ], }, { - code: 'U+1F377', + code: 'šŸ·', keywords: [ 'bar', 'beverage', @@ -4274,7 +4298,7 @@ const emojis = { ], }, { - code: 'U+1F378', + code: 'šŸø', keywords: [ 'bar', 'cocktail', @@ -4283,7 +4307,7 @@ const emojis = { ], }, { - code: 'U+1F379', + code: 'šŸ¹', keywords: [ 'bar', 'drink', @@ -4291,7 +4315,7 @@ const emojis = { ], }, { - code: 'U+1F37A', + code: 'šŸŗ', keywords: [ 'bar', 'beer', @@ -4300,7 +4324,7 @@ const emojis = { ], }, { - code: 'U+1F37B', + code: 'šŸ»', keywords: [ 'bar', 'beer', @@ -4310,7 +4334,7 @@ const emojis = { ], }, { - code: 'U+1F942', + code: 'šŸ„‚', keywords: [ 'celebrate', 'clink', @@ -4319,7 +4343,7 @@ const emojis = { ], }, { - code: 'U+1F943', + code: 'šŸ„ƒ', keywords: [ 'glass', 'liquor', @@ -4329,7 +4353,7 @@ const emojis = { ], }, { - code: 'U+1F37D', + code: 'šŸ½', keywords: [ 'cooking', 'fork', @@ -4338,7 +4362,7 @@ const emojis = { ], }, { - code: 'U+1F374', + code: 'šŸ“', keywords: [ 'cooking', 'fork', @@ -4346,14 +4370,14 @@ const emojis = { ], }, { - code: 'U+1F944', + code: 'šŸ„„', keywords: [ 'spoon', 'tableware', ], }, { - code: 'U+1F52A', + code: 'šŸ”Ŗ', keywords: [ 'cooking', 'hocho', @@ -4363,7 +4387,7 @@ const emojis = { ], }, { - code: 'U+1F3FA', + code: 'šŸŗ', keywords: [ 'amphora', 'aquarius', @@ -4378,7 +4402,7 @@ const emojis = { ], 'Travel & Places': [ { - code: 'U+1F30D', + code: 'šŸŒ', keywords: [ 'africa', 'earth', @@ -4388,7 +4412,7 @@ const emojis = { ], }, { - code: 'U+1F30E', + code: 'šŸŒŽ', keywords: [ 'americas', 'earth', @@ -4397,7 +4421,7 @@ const emojis = { ], }, { - code: 'U+1F30F', + code: 'šŸŒ', keywords: [ 'asia', 'australia', @@ -4407,7 +4431,7 @@ const emojis = { ], }, { - code: 'U+1F310', + code: 'šŸŒ', keywords: [ 'earth', 'globe', @@ -4416,21 +4440,21 @@ const emojis = { ], }, { - code: 'U+1F5FA', + code: 'šŸ—ŗ', keywords: [ 'map', 'world', ], }, { - code: 'U+1F5FE', + code: 'šŸ—¾', keywords: [ 'japan', 'map', ], }, { - code: 'U+1F3D4', + code: 'šŸ”', keywords: [ 'cold', 'mountain', @@ -4438,13 +4462,13 @@ const emojis = { ], }, { - code: 'U+26F0', + code: 'ā›°', keywords: [ 'mountain', ], }, { - code: 'U+1F30B', + code: 'šŸŒ‹', keywords: [ 'eruption', 'mountain', @@ -4453,81 +4477,81 @@ const emojis = { ], }, { - code: 'U+1F5FB', + code: 'šŸ—»', keywords: [ 'fuji', 'mountain', ], }, { - code: 'U+1F3D5', + code: 'šŸ•', keywords: [ 'camping', ], }, { - code: 'U+1F3D6', + code: 'šŸ–', keywords: [ 'beach', 'umbrella', ], }, { - code: 'U+1F3DC', + code: 'šŸœ', keywords: [ 'desert', ], }, { - code: 'U+1F3DD', + code: 'šŸ', keywords: [ 'desert', 'island', ], }, { - code: 'U+1F3DE', + code: 'šŸž', keywords: [ 'national park', 'park', ], }, { - code: 'U+1F3DF', + code: 'šŸŸ', keywords: [ 'stadium', ], }, { - code: 'U+1F3DB', + code: 'šŸ›', keywords: [ 'building', 'classical', ], }, { - code: 'U+1F3D7', + code: 'šŸ—', keywords: [ 'building', 'construction', ], }, { - code: 'U+1F3D8', + code: 'šŸ˜', keywords: [ 'building', 'house', ], }, { - code: 'U+1F3D9', + code: 'šŸ™', keywords: [ 'building', 'city', ], }, { - code: 'U+1F3DA', + code: 'šŸš', keywords: [ 'building', 'derelict', @@ -4535,7 +4559,7 @@ const emojis = { ], }, { - code: 'U+1F3E0', + code: 'šŸ ', keywords: [ 'building', 'home', @@ -4543,7 +4567,7 @@ const emojis = { ], }, { - code: 'U+1F3E1', + code: 'šŸ”', keywords: [ 'building', 'garden', @@ -4552,13 +4576,13 @@ const emojis = { ], }, { - code: 'U+1F3E2', + code: 'šŸ¢', keywords: [ 'building', ], }, { - code: 'U+1F3E3', + code: 'šŸ£', keywords: [ 'building', 'japanese', @@ -4566,7 +4590,7 @@ const emojis = { ], }, { - code: 'U+1F3E4', + code: 'šŸ¤', keywords: [ 'building', 'european', @@ -4574,7 +4598,7 @@ const emojis = { ], }, { - code: 'U+1F3E5', + code: 'šŸ„', keywords: [ 'building', 'doctor', @@ -4583,21 +4607,21 @@ const emojis = { ], }, { - code: 'U+1F3E6', + code: 'šŸ¦', keywords: [ 'bank', 'building', ], }, { - code: 'U+1F3E8', + code: 'šŸØ', keywords: [ 'building', 'hotel', ], }, { - code: 'U+1F3E9', + code: 'šŸ©', keywords: [ 'building', 'hotel', @@ -4605,7 +4629,7 @@ const emojis = { ], }, { - code: 'U+1F3EA', + code: 'šŸŖ', keywords: [ 'building', 'convenience', @@ -4613,14 +4637,14 @@ const emojis = { ], }, { - code: 'U+1F3EB', + code: 'šŸ«', keywords: [ 'building', 'school', ], }, { - code: 'U+1F3EC', + code: 'šŸ¬', keywords: [ 'building', 'department', @@ -4628,14 +4652,14 @@ const emojis = { ], }, { - code: 'U+1F3ED', + code: 'šŸ­', keywords: [ 'building', 'factory', ], }, { - code: 'U+1F3EF', + code: 'šŸÆ', keywords: [ 'building', 'castle', @@ -4643,7 +4667,7 @@ const emojis = { ], }, { - code: 'U+1F3F0', + code: 'šŸ°', keywords: [ 'building', 'castle', @@ -4651,7 +4675,7 @@ const emojis = { ], }, { - code: 'U+1F492', + code: 'šŸ’’', keywords: [ 'activity', 'chapel', @@ -4660,21 +4684,21 @@ const emojis = { ], }, { - code: 'U+1F5FC', + code: 'šŸ—¼', keywords: [ 'tokyo', 'tower', ], }, { - code: 'U+1F5FD', + code: 'šŸ—½', keywords: [ 'liberty', 'statue', ], }, { - code: 'U+26EA', + code: 'ā›Ŗ', keywords: [ 'building', 'christian', @@ -4684,7 +4708,7 @@ const emojis = { ], }, { - code: 'U+1F54C', + code: 'šŸ•Œ', keywords: [ 'islam', 'mosque', @@ -4693,7 +4717,7 @@ const emojis = { ], }, { - code: 'U+1F54D', + code: 'šŸ•', keywords: [ 'jew', 'jewish', @@ -4703,7 +4727,7 @@ const emojis = { ], }, { - code: 'U+26E9', + code: 'ā›©', keywords: [ 'religion', 'shinto', @@ -4711,7 +4735,7 @@ const emojis = { ], }, { - code: 'U+1F54B', + code: 'šŸ•‹', keywords: [ 'islam', 'kaaba', @@ -4720,27 +4744,27 @@ const emojis = { ], }, { - code: 'U+26F2', + code: 'ā›²', keywords: [ 'fountain', ], }, { - code: 'U+26FA', + code: 'ā›ŗ', keywords: [ 'camping', 'tent', ], }, { - code: 'U+1F301', + code: 'šŸŒ', keywords: [ 'fog', 'weather', ], }, { - code: 'U+1F303', + code: 'šŸŒƒ', keywords: [ 'night', 'star', @@ -4748,7 +4772,7 @@ const emojis = { ], }, { - code: 'U+1F304', + code: 'šŸŒ„', keywords: [ 'morning', 'mountain', @@ -4758,7 +4782,7 @@ const emojis = { ], }, { - code: 'U+1F305', + code: 'šŸŒ…', keywords: [ 'morning', 'sun', @@ -4767,7 +4791,7 @@ const emojis = { ], }, { - code: 'U+1F306', + code: 'šŸŒ†', keywords: [ 'building', 'city', @@ -4780,7 +4804,7 @@ const emojis = { ], }, { - code: 'U+1F307', + code: 'šŸŒ‡', keywords: [ 'building', 'dusk', @@ -4790,7 +4814,7 @@ const emojis = { ], }, { - code: 'U+1F309', + code: 'šŸŒ‰', keywords: [ 'bridge', 'night', @@ -4798,7 +4822,7 @@ const emojis = { ], }, { - code: 'U+2668', + code: 'ā™Ø', keywords: [ 'hot', 'hotsprings', @@ -4807,7 +4831,7 @@ const emojis = { ], }, { - code: 'U+1F30C', + code: 'šŸŒŒ', keywords: [ 'milky way', 'space', @@ -4815,7 +4839,7 @@ const emojis = { ], }, { - code: 'U+1F3A0', + code: 'šŸŽ ', keywords: [ 'activity', 'carousel', @@ -4824,7 +4848,7 @@ const emojis = { ], }, { - code: 'U+1F3A1', + code: 'šŸŽ”', keywords: [ 'activity', 'amusement park', @@ -4834,7 +4858,7 @@ const emojis = { ], }, { - code: 'U+1F3A2', + code: 'šŸŽ¢', keywords: [ 'activity', 'amusement park', @@ -4844,7 +4868,7 @@ const emojis = { ], }, { - code: 'U+1F488', + code: 'šŸ’ˆ', keywords: [ 'barber', 'haircut', @@ -4852,7 +4876,7 @@ const emojis = { ], }, { - code: 'U+1F3AA', + code: 'šŸŽŖ', keywords: [ 'activity', 'circus', @@ -4861,7 +4885,7 @@ const emojis = { ], }, { - code: 'U+1F3AD', + code: 'šŸŽ­', keywords: [ 'activity', 'art', @@ -4873,7 +4897,7 @@ const emojis = { ], }, { - code: 'U+1F5BC', + code: 'šŸ–¼', keywords: [ 'art', 'frame', @@ -4883,7 +4907,7 @@ const emojis = { ], }, { - code: 'U+1F3A8', + code: 'šŸŽØ', keywords: [ 'activity', 'art', @@ -4894,7 +4918,7 @@ const emojis = { ], }, { - code: 'U+1F3B0', + code: 'šŸŽ°', keywords: [ 'activity', 'game', @@ -4902,7 +4926,7 @@ const emojis = { ], }, { - code: 'U+1F682', + code: 'šŸš‚', keywords: [ 'engine', 'locomotive', @@ -4913,7 +4937,7 @@ const emojis = { ], }, { - code: 'U+1F683', + code: 'šŸšƒ', keywords: [ 'car', 'electric', @@ -4925,7 +4949,7 @@ const emojis = { ], }, { - code: 'U+1F684', + code: 'šŸš„', keywords: [ 'railway', 'shinkansen', @@ -4935,7 +4959,7 @@ const emojis = { ], }, { - code: 'U+1F685', + code: 'šŸš…', keywords: [ 'bullet', 'railway', @@ -4946,7 +4970,7 @@ const emojis = { ], }, { - code: 'U+1F686', + code: 'šŸš†', keywords: [ 'railway', 'train', @@ -4954,7 +4978,7 @@ const emojis = { ], }, { - code: 'U+1F687', + code: 'šŸš‡', keywords: [ 'metro', 'subway', @@ -4962,14 +4986,14 @@ const emojis = { ], }, { - code: 'U+1F688', + code: 'šŸšˆ', keywords: [ 'railway', 'vehicle', ], }, { - code: 'U+1F689', + code: 'šŸš‰', keywords: [ 'railway', 'station', @@ -4978,7 +5002,7 @@ const emojis = { ], }, { - code: 'U+1F68A', + code: 'šŸšŠ', keywords: [ 'tram', 'trolleybus', @@ -4986,14 +5010,14 @@ const emojis = { ], }, { - code: 'U+1F69D', + code: 'šŸš', keywords: [ 'monorail', 'vehicle', ], }, { - code: 'U+1F69E', + code: 'šŸšž', keywords: [ 'car', 'mountain', @@ -5002,7 +5026,7 @@ const emojis = { ], }, { - code: 'U+1F68B', + code: 'šŸš‹', keywords: [ 'car', 'tram', @@ -5011,14 +5035,14 @@ const emojis = { ], }, { - code: 'U+1F68C', + code: 'šŸšŒ', keywords: [ 'bus', 'vehicle', ], }, { - code: 'U+1F68D', + code: 'šŸš', keywords: [ 'bus', 'oncoming', @@ -5026,7 +5050,7 @@ const emojis = { ], }, { - code: 'U+1F68E', + code: 'šŸšŽ', keywords: [ 'bus', 'tram', @@ -5036,7 +5060,7 @@ const emojis = { ], }, { - code: 'U+1F68F', + code: 'šŸš', keywords: [ 'bus', 'busstop', @@ -5044,7 +5068,7 @@ const emojis = { ], }, { - code: 'U+1F690', + code: 'šŸš', keywords: [ 'bus', 'minibus', @@ -5052,14 +5076,14 @@ const emojis = { ], }, { - code: 'U+1F691', + code: 'šŸš‘', keywords: [ 'ambulance', 'vehicle', ], }, { - code: 'U+1F692', + code: 'šŸš’', keywords: [ 'engine', 'fire', @@ -5068,7 +5092,7 @@ const emojis = { ], }, { - code: 'U+1F693', + code: 'šŸš“', keywords: [ 'car', 'patrol', @@ -5077,7 +5101,7 @@ const emojis = { ], }, { - code: 'U+1F694', + code: 'šŸš”', keywords: [ 'car', 'oncoming', @@ -5086,14 +5110,14 @@ const emojis = { ], }, { - code: 'U+1F695', + code: 'šŸš•', keywords: [ 'taxi', 'vehicle', ], }, { - code: 'U+1F696', + code: 'šŸš–', keywords: [ 'oncoming', 'taxi', @@ -5101,7 +5125,7 @@ const emojis = { ], }, { - code: 'U+1F697', + code: 'šŸš—', keywords: [ 'automobile', 'car', @@ -5109,7 +5133,7 @@ const emojis = { ], }, { - code: 'U+1F698', + code: 'šŸš˜', keywords: [ 'automobile', 'car', @@ -5118,7 +5142,7 @@ const emojis = { ], }, { - code: 'U+1F699', + code: 'šŸš™', keywords: [ 'recreational', 'rv', @@ -5126,7 +5150,7 @@ const emojis = { ], }, { - code: 'U+1F69A', + code: 'šŸšš', keywords: [ 'delivery', 'truck', @@ -5134,7 +5158,7 @@ const emojis = { ], }, { - code: 'U+1F69B', + code: 'šŸš›', keywords: [ 'lorry', 'semi', @@ -5143,14 +5167,14 @@ const emojis = { ], }, { - code: 'U+1F69C', + code: 'šŸšœ', keywords: [ 'tractor', 'vehicle', ], }, { - code: 'U+1F6B2', + code: 'šŸš²', keywords: [ 'bicycle', 'bike', @@ -5158,7 +5182,7 @@ const emojis = { ], }, { - code: 'U+26FD', + code: 'ā›½', keywords: [ 'fuel', 'fuelpump', @@ -5168,7 +5192,7 @@ const emojis = { ], }, { - code: 'U+1F6E3', + code: 'šŸ›£', keywords: [ 'highway', 'motorway', @@ -5176,14 +5200,14 @@ const emojis = { ], }, { - code: 'U+1F6E4', + code: 'šŸ›¤', keywords: [ 'railway', 'train', ], }, { - code: 'U+1F6A8', + code: 'šŸšØ', keywords: [ 'beacon', 'car', @@ -5194,7 +5218,7 @@ const emojis = { ], }, { - code: 'U+1F6A5', + code: 'šŸš„', keywords: [ 'light', 'signal', @@ -5202,7 +5226,7 @@ const emojis = { ], }, { - code: 'U+1F6A6', + code: 'šŸš¦', keywords: [ 'light', 'signal', @@ -5210,35 +5234,35 @@ const emojis = { ], }, { - code: 'U+1F6A7', + code: 'šŸš§', keywords: [ 'barrier', 'construction', ], }, { - code: 'U+1F6D1', + code: 'šŸ›‘', keywords: [ 'octagonal', 'stop', ], }, { - code: 'U+1F6F4', + code: 'šŸ›“', keywords: [ 'kick', 'scooter', ], }, { - code: 'U+1F6F5', + code: 'šŸ›µ', keywords: [ 'motor', 'scooter', ], }, { - code: 'U+2693', + code: 'āš“', keywords: [ 'anchor', 'ship', @@ -5246,7 +5270,7 @@ const emojis = { ], }, { - code: 'U+26F5', + code: 'ā›µ', keywords: [ 'boat', 'resort', @@ -5257,29 +5281,29 @@ const emojis = { ], }, { - code: 'U+1F6A3', + code: 'šŸš£', keywords: [ 'boat', 'rowboat', 'vehicle', ], types: [ - 'U+1F6A3 U+1F3FF', - 'U+1F6A3 U+1F3FE', - 'U+1F6A3 U+1F3FD', - 'U+1F6A3 U+1F3FC', - 'U+1F6A3 U+1F3FB', + 'šŸš£šŸæ', + 'šŸš£šŸ¾', + 'šŸš£šŸ½', + 'šŸš£šŸ¼', + 'šŸš£šŸ»', ], }, { - code: 'U+1F6F6', + code: 'šŸ›¶', keywords: [ 'boat', 'canoe', ], }, { - code: 'U+1F6A4', + code: 'šŸš¤', keywords: [ 'boat', 'speedboat', @@ -5287,7 +5311,7 @@ const emojis = { ], }, { - code: 'U+1F6F3', + code: 'šŸ›³', keywords: [ 'passenger', 'ship', @@ -5295,14 +5319,14 @@ const emojis = { ], }, { - code: 'U+26F4', + code: 'ā›“', keywords: [ 'boat', 'ferry', ], }, { - code: 'U+1F6E5', + code: 'šŸ›„', keywords: [ 'boat', 'motorboat', @@ -5310,28 +5334,28 @@ const emojis = { ], }, { - code: 'U+1F6A2', + code: 'šŸš¢', keywords: [ 'ship', 'vehicle', ], }, { - code: 'U+2708', + code: 'āœˆ', keywords: [ 'airplane', 'vehicle', ], }, { - code: 'U+1F6E9', + code: 'šŸ›©', keywords: [ 'airplane', 'vehicle', ], }, { - code: 'U+1F6EB', + code: 'šŸ›«', keywords: [ 'airplane', 'check-in', @@ -5341,7 +5365,7 @@ const emojis = { ], }, { - code: 'U+1F6EC', + code: 'šŸ›¬', keywords: [ 'airplane', 'arrivals', @@ -5351,21 +5375,21 @@ const emojis = { ], }, { - code: 'U+1F4BA', + code: 'šŸ’ŗ', keywords: [ 'chair', 'seat', ], }, { - code: 'U+1F681', + code: 'šŸš', keywords: [ 'helicopter', 'vehicle', ], }, { - code: 'U+1F69F', + code: 'šŸšŸ', keywords: [ 'railway', 'suspension', @@ -5373,7 +5397,7 @@ const emojis = { ], }, { - code: 'U+1F6A0', + code: 'šŸš ', keywords: [ 'cable', 'gondola', @@ -5382,7 +5406,7 @@ const emojis = { ], }, { - code: 'U+1F6A1', + code: 'šŸš”', keywords: [ 'aerial', 'cable', @@ -5394,7 +5418,7 @@ const emojis = { ], }, { - code: 'U+1F680', + code: 'šŸš€', keywords: [ 'rocket', 'space', @@ -5402,7 +5426,7 @@ const emojis = { ], }, { - code: 'U+1F6F0', + code: 'šŸ›°', keywords: [ 'satellite', 'space', @@ -5410,7 +5434,7 @@ const emojis = { ], }, { - code: 'U+1F6CE', + code: 'šŸ›Ž', keywords: [ 'bell', 'bellhop', @@ -5418,20 +5442,20 @@ const emojis = { ], }, { - code: 'U+1F6AA', + code: 'šŸšŖ', keywords: [ 'door', ], }, { - code: 'U+1F6CC', + code: 'šŸ›Œ', keywords: [ 'hotel', 'sleep', ], }, { - code: 'U+1F6CF', + code: 'šŸ›', keywords: [ 'bed', 'hotel', @@ -5439,7 +5463,7 @@ const emojis = { ], }, { - code: 'U+1F6CB', + code: 'šŸ›‹', keywords: [ 'couch', 'hotel', @@ -5447,41 +5471,41 @@ const emojis = { ], }, { - code: 'U+1F6BD', + code: 'šŸš½', keywords: [ 'toilet', ], }, { - code: 'U+1F6BF', + code: 'šŸšæ', keywords: [ 'shower', 'water', ], }, { - code: 'U+1F6C0', + code: 'šŸ›€', keywords: [ 'bath', 'bathtub', ], types: [ - 'U+1F6C0 U+1F3FF', - 'U+1F6C0 U+1F3FE', - 'U+1F6C0 U+1F3FD', - 'U+1F6C0 U+1F3FC', - 'U+1F6C0 U+1F3FB', + 'šŸ›€šŸæ', + 'šŸ›€šŸ¾', + 'šŸ›€šŸ½', + 'šŸ›€šŸ¼', + 'šŸ›€šŸ»', ], }, { - code: 'U+1F6C1', + code: 'šŸ›', keywords: [ 'bath', 'bathtub', ], }, { - code: 'U+231B', + code: 'āŒ›', keywords: [ 'hourglass', 'sand', @@ -5489,7 +5513,7 @@ const emojis = { ], }, { - code: 'U+23F3', + code: 'ā³', keywords: [ 'hourglass', 'sand', @@ -5497,41 +5521,41 @@ const emojis = { ], }, { - code: 'U+231A', + code: 'āŒš', keywords: [ 'clock', 'watch', ], }, { - code: 'U+23F0', + code: 'ā°', keywords: [ 'alarm', 'clock', ], }, { - code: 'U+23F1', + code: 'ā±', keywords: [ 'clock', 'stopwatch', ], }, { - code: 'U+23F2', + code: 'ā²', keywords: [ 'clock', 'timer', ], }, { - code: 'U+1F570', + code: 'šŸ•°', keywords: [ 'clock', ], }, { - code: 'U+1F55B', + code: 'šŸ•›', keywords: [ '00', '12', @@ -5542,7 +5566,7 @@ const emojis = { ], }, { - code: 'U+1F567', + code: 'šŸ•§', keywords: [ '12', '12:30', @@ -5553,7 +5577,7 @@ const emojis = { ], }, { - code: 'U+1F550', + code: 'šŸ•', keywords: [ '00', '1', @@ -5564,7 +5588,7 @@ const emojis = { ], }, { - code: 'U+1F55C', + code: 'šŸ•œ', keywords: [ '1', '1:30', @@ -5575,7 +5599,7 @@ const emojis = { ], }, { - code: 'U+1F551', + code: 'šŸ•‘', keywords: [ '00', '2', @@ -5586,7 +5610,7 @@ const emojis = { ], }, { - code: 'U+1F55D', + code: 'šŸ•', keywords: [ '2', '2:30', @@ -5597,7 +5621,7 @@ const emojis = { ], }, { - code: 'U+1F552', + code: 'šŸ•’', keywords: [ '00', '3', @@ -5608,7 +5632,7 @@ const emojis = { ], }, { - code: 'U+1F55E', + code: 'šŸ•ž', keywords: [ '3', '3:30', @@ -5619,7 +5643,7 @@ const emojis = { ], }, { - code: 'U+1F553', + code: 'šŸ•“', keywords: [ '00', '4', @@ -5630,7 +5654,7 @@ const emojis = { ], }, { - code: 'U+1F55F', + code: 'šŸ•Ÿ', keywords: [ '30', '4', @@ -5641,7 +5665,7 @@ const emojis = { ], }, { - code: 'U+1F554', + code: 'šŸ•”', keywords: [ '00', '5', @@ -5652,7 +5676,7 @@ const emojis = { ], }, { - code: 'U+1F560', + code: 'šŸ• ', keywords: [ '30', '5', @@ -5663,7 +5687,7 @@ const emojis = { ], }, { - code: 'U+1F555', + code: 'šŸ••', keywords: [ '00', '6', @@ -5674,7 +5698,7 @@ const emojis = { ], }, { - code: 'U+1F561', + code: 'šŸ•”', keywords: [ '30', '6', @@ -5685,7 +5709,7 @@ const emojis = { ], }, { - code: 'U+1F556', + code: 'šŸ•–', keywords: [ '00', '7', @@ -5696,7 +5720,7 @@ const emojis = { ], }, { - code: 'U+1F562', + code: 'šŸ•¢', keywords: [ '30', '7', @@ -5707,7 +5731,7 @@ const emojis = { ], }, { - code: 'U+1F557', + code: 'šŸ•—', keywords: [ '00', '8', @@ -5718,7 +5742,7 @@ const emojis = { ], }, { - code: 'U+1F563', + code: 'šŸ•£', keywords: [ '30', '8', @@ -5729,7 +5753,7 @@ const emojis = { ], }, { - code: 'U+1F558', + code: 'šŸ•˜', keywords: [ '00', '9', @@ -5740,7 +5764,7 @@ const emojis = { ], }, { - code: 'U+1F564', + code: 'šŸ•¤', keywords: [ '30', '9', @@ -5751,7 +5775,7 @@ const emojis = { ], }, { - code: 'U+1F559', + code: 'šŸ•™', keywords: [ '00', '10', @@ -5762,7 +5786,7 @@ const emojis = { ], }, { - code: 'U+1F565', + code: 'šŸ•„', keywords: [ '10', '10:30', @@ -5773,7 +5797,7 @@ const emojis = { ], }, { - code: 'U+1F55A', + code: 'šŸ•š', keywords: [ '00', '11', @@ -5784,7 +5808,7 @@ const emojis = { ], }, { - code: 'U+1F566', + code: 'šŸ•¦', keywords: [ '11', '11:30', @@ -5795,7 +5819,7 @@ const emojis = { ], }, { - code: 'U+1F311', + code: 'šŸŒ‘', keywords: [ 'dark', 'moon', @@ -5804,7 +5828,7 @@ const emojis = { ], }, { - code: 'U+1F312', + code: 'šŸŒ’', keywords: [ 'crescent', 'moon', @@ -5814,7 +5838,7 @@ const emojis = { ], }, { - code: 'U+1F313', + code: 'šŸŒ“', keywords: [ 'moon', 'quarter', @@ -5823,7 +5847,7 @@ const emojis = { ], }, { - code: 'U+1F314', + code: 'šŸŒ”', keywords: [ 'gibbous', 'moon', @@ -5833,7 +5857,7 @@ const emojis = { ], }, { - code: 'U+1F315', + code: 'šŸŒ•', keywords: [ 'full', 'moon', @@ -5842,7 +5866,7 @@ const emojis = { ], }, { - code: 'U+1F316', + code: 'šŸŒ–', keywords: [ 'gibbous', 'moon', @@ -5852,7 +5876,7 @@ const emojis = { ], }, { - code: 'U+1F317', + code: 'šŸŒ—', keywords: [ 'moon', 'quarter', @@ -5861,7 +5885,7 @@ const emojis = { ], }, { - code: 'U+1F318', + code: 'šŸŒ˜', keywords: [ 'crescent', 'moon', @@ -5871,7 +5895,7 @@ const emojis = { ], }, { - code: 'U+1F319', + code: 'šŸŒ™', keywords: [ 'crescent', 'moon', @@ -5880,7 +5904,7 @@ const emojis = { ], }, { - code: 'U+1F31A', + code: 'šŸŒš', keywords: [ 'face', 'moon', @@ -5889,7 +5913,7 @@ const emojis = { ], }, { - code: 'U+1F31B', + code: 'šŸŒ›', keywords: [ 'face', 'moon', @@ -5899,7 +5923,7 @@ const emojis = { ], }, { - code: 'U+1F31C', + code: 'šŸŒœ', keywords: [ 'face', 'moon', @@ -5909,14 +5933,14 @@ const emojis = { ], }, { - code: 'U+1F321', + code: 'šŸŒ”', keywords: [ 'thermometer', 'weather', ], }, { - code: 'U+2600', + code: 'ā˜€', keywords: [ 'bright', 'rays', @@ -5927,7 +5951,7 @@ const emojis = { ], }, { - code: 'U+1F31D', + code: 'šŸŒ', keywords: [ 'bright', 'face', @@ -5938,7 +5962,7 @@ const emojis = { ], }, { - code: 'U+1F31E', + code: 'šŸŒž', keywords: [ 'bright', 'face', @@ -5948,13 +5972,13 @@ const emojis = { ], }, { - code: 'U+2B50', + code: 'ā­', keywords: [ 'star', ], }, { - code: 'U+1F31F', + code: 'šŸŒŸ', keywords: [ 'glittery', 'glow', @@ -5964,7 +5988,7 @@ const emojis = { ], }, { - code: 'U+1F320', + code: 'šŸŒ ', keywords: [ 'activity', 'falling', @@ -5974,14 +5998,14 @@ const emojis = { ], }, { - code: 'U+2601', + code: 'ā˜', keywords: [ 'cloud', 'weather', ], }, { - code: 'U+26C5', + code: 'ā›…', keywords: [ 'cloud', 'sun', @@ -5989,7 +6013,7 @@ const emojis = { ], }, { - code: 'U+26C8', + code: 'ā›ˆ', keywords: [ 'cloud', 'rain', @@ -5998,7 +6022,7 @@ const emojis = { ], }, { - code: 'U+1F324', + code: 'šŸŒ¤', keywords: [ 'cloud', 'sun', @@ -6006,7 +6030,7 @@ const emojis = { ], }, { - code: 'U+1F325', + code: 'šŸŒ„', keywords: [ 'cloud', 'sun', @@ -6014,7 +6038,7 @@ const emojis = { ], }, { - code: 'U+1F326', + code: 'šŸŒ¦', keywords: [ 'cloud', 'rain', @@ -6023,7 +6047,7 @@ const emojis = { ], }, { - code: 'U+1F327', + code: 'šŸŒ§', keywords: [ 'cloud', 'rain', @@ -6031,7 +6055,7 @@ const emojis = { ], }, { - code: 'U+1F328', + code: 'šŸŒØ', keywords: [ 'cloud', 'cold', @@ -6040,7 +6064,7 @@ const emojis = { ], }, { - code: 'U+1F329', + code: 'šŸŒ©', keywords: [ 'cloud', 'lightning', @@ -6048,7 +6072,7 @@ const emojis = { ], }, { - code: 'U+1F32A', + code: 'šŸŒŖ', keywords: [ 'cloud', 'tornado', @@ -6057,7 +6081,7 @@ const emojis = { ], }, { - code: 'U+1F32B', + code: 'šŸŒ«', keywords: [ 'cloud', 'fog', @@ -6065,7 +6089,7 @@ const emojis = { ], }, { - code: 'U+1F32C', + code: 'šŸŒ¬', keywords: [ 'blow', 'cloud', @@ -6075,7 +6099,7 @@ const emojis = { ], }, { - code: 'U+1F300', + code: 'šŸŒ€', keywords: [ 'cyclone', 'dizzy', @@ -6085,7 +6109,7 @@ const emojis = { ], }, { - code: 'U+1F308', + code: 'šŸŒˆ', keywords: [ 'rain', 'rainbow', @@ -6093,7 +6117,7 @@ const emojis = { ], }, { - code: 'U+1F302', + code: 'šŸŒ‚', keywords: [ 'clothing', 'rain', @@ -6102,7 +6126,7 @@ const emojis = { ], }, { - code: 'U+2602', + code: 'ā˜‚', keywords: [ 'clothing', 'rain', @@ -6111,7 +6135,7 @@ const emojis = { ], }, { - code: 'U+2614', + code: 'ā˜”', keywords: [ 'clothing', 'drop', @@ -6121,7 +6145,7 @@ const emojis = { ], }, { - code: 'U+26F1', + code: 'ā›±', keywords: [ 'rain', 'sun', @@ -6130,7 +6154,7 @@ const emojis = { ], }, { - code: 'U+26A1', + code: 'āš”', keywords: [ 'danger', 'electric', @@ -6141,7 +6165,7 @@ const emojis = { ], }, { - code: 'U+2744', + code: 'ā„', keywords: [ 'cold', 'snow', @@ -6150,7 +6174,7 @@ const emojis = { ], }, { - code: 'U+2603', + code: 'ā˜ƒ', keywords: [ 'cold', 'snow', @@ -6159,7 +6183,7 @@ const emojis = { ], }, { - code: 'U+26C4', + code: 'ā›„', keywords: [ 'cold', 'snow', @@ -6168,14 +6192,14 @@ const emojis = { ], }, { - code: 'U+2604', + code: 'ā˜„', keywords: [ 'comet', 'space', ], }, { - code: 'U+1F525', + code: 'šŸ”„', keywords: [ 'fire', 'flame', @@ -6183,7 +6207,7 @@ const emojis = { ], }, { - code: 'U+1F4A7', + code: 'šŸ’§', keywords: [ 'cold', 'comic', @@ -6193,7 +6217,7 @@ const emojis = { ], }, { - code: 'U+1F30A', + code: 'šŸŒŠ', keywords: [ 'ocean', 'water', @@ -6204,7 +6228,7 @@ const emojis = { ], Activities: [ { - code: 'U+1F383', + code: 'šŸŽƒ', keywords: [ 'activity', 'celebration', @@ -6215,7 +6239,7 @@ const emojis = { ], }, { - code: 'U+1F384', + code: 'šŸŽ„', keywords: [ 'activity', 'celebration', @@ -6225,7 +6249,7 @@ const emojis = { ], }, { - code: 'U+1F386', + code: 'šŸŽ†', keywords: [ 'activity', 'celebration', @@ -6234,7 +6258,7 @@ const emojis = { ], }, { - code: 'U+1F387', + code: 'šŸŽ‡', keywords: [ 'activity', 'celebration', @@ -6244,7 +6268,7 @@ const emojis = { ], }, { - code: 'U+2728', + code: 'āœØ', keywords: [ 'entertainment', 'sparkle', @@ -6252,7 +6276,7 @@ const emojis = { ], }, { - code: 'U+1F388', + code: 'šŸŽˆ', keywords: [ 'activity', 'balloon', @@ -6261,7 +6285,7 @@ const emojis = { ], }, { - code: 'U+1F389', + code: 'šŸŽ‰', keywords: [ 'activity', 'celebration', @@ -6272,7 +6296,7 @@ const emojis = { ], }, { - code: 'U+1F38A', + code: 'šŸŽŠ', keywords: [ 'activity', 'ball', @@ -6282,7 +6306,7 @@ const emojis = { ], }, { - code: 'U+1F38B', + code: 'šŸŽ‹', keywords: [ 'activity', 'banner', @@ -6293,7 +6317,7 @@ const emojis = { ], }, { - code: 'U+1F38D', + code: 'šŸŽ', keywords: [ 'activity', 'bamboo', @@ -6304,7 +6328,7 @@ const emojis = { ], }, { - code: 'U+1F38E', + code: 'šŸŽŽ', keywords: [ 'activity', 'celebration', @@ -6315,7 +6339,7 @@ const emojis = { ], }, { - code: 'U+1F38F', + code: 'šŸŽ', keywords: [ 'activity', 'carp', @@ -6326,7 +6350,7 @@ const emojis = { ], }, { - code: 'U+1F390', + code: 'šŸŽ', keywords: [ 'activity', 'bell', @@ -6337,7 +6361,7 @@ const emojis = { ], }, { - code: 'U+1F391', + code: 'šŸŽ‘', keywords: [ 'activity', 'celebration', @@ -6347,14 +6371,14 @@ const emojis = { ], }, { - code: 'U+1F380', + code: 'šŸŽ€', keywords: [ 'celebration', 'ribbon', ], }, { - code: 'U+1F381', + code: 'šŸŽ', keywords: [ 'box', 'celebration', @@ -6365,7 +6389,7 @@ const emojis = { ], }, { - code: 'U+1F397', + code: 'šŸŽ—', keywords: [ 'celebration', 'reminder', @@ -6373,7 +6397,7 @@ const emojis = { ], }, { - code: 'U+1F39F', + code: 'šŸŽŸ', keywords: [ 'admission', 'entertainment', @@ -6381,7 +6405,7 @@ const emojis = { ], }, { - code: 'U+1F3AB', + code: 'šŸŽ«', keywords: [ 'activity', 'admission', @@ -6390,7 +6414,7 @@ const emojis = { ], }, { - code: 'U+1F396', + code: 'šŸŽ–', keywords: [ 'celebration', 'medal', @@ -6398,20 +6422,20 @@ const emojis = { ], }, { - code: 'U+1F3C6', + code: 'šŸ†', keywords: [ 'prize', 'trophy', ], }, { - code: 'U+1F3C5', + code: 'šŸ…', keywords: [ 'medal', ], }, { - code: 'U+1F947', + code: 'šŸ„‡', keywords: [ 'first', 'gold', @@ -6419,7 +6443,7 @@ const emojis = { ], }, { - code: 'U+1F948', + code: 'šŸ„ˆ', keywords: [ 'medal', 'second', @@ -6427,7 +6451,7 @@ const emojis = { ], }, { - code: 'U+1F949', + code: 'šŸ„‰', keywords: [ 'bronze', 'medal', @@ -6435,21 +6459,21 @@ const emojis = { ], }, { - code: 'U+26BD', + code: 'āš½', keywords: [ 'ball', 'soccer', ], }, { - code: 'U+26BE', + code: 'āš¾', keywords: [ 'ball', 'baseball', ], }, { - code: 'U+1F3C0', + code: 'šŸ€', keywords: [ 'ball', 'basketball', @@ -6457,7 +6481,7 @@ const emojis = { ], }, { - code: 'U+1F3D0', + code: 'šŸ', keywords: [ 'ball', 'game', @@ -6465,7 +6489,7 @@ const emojis = { ], }, { - code: 'U+1F3C8', + code: 'šŸˆ', keywords: [ 'american', 'ball', @@ -6473,7 +6497,7 @@ const emojis = { ], }, { - code: 'U+1F3C9', + code: 'šŸ‰', keywords: [ 'ball', 'football', @@ -6481,7 +6505,7 @@ const emojis = { ], }, { - code: 'U+1F3BE', + code: 'šŸŽ¾', keywords: [ 'ball', 'racquet', @@ -6489,7 +6513,7 @@ const emojis = { ], }, { - code: 'U+1F3B1', + code: 'šŸŽ±', keywords: [ '8', '8 ball', @@ -6500,7 +6524,7 @@ const emojis = { ], }, { - code: 'U+1F3B3', + code: 'šŸŽ³', keywords: [ 'ball', 'bowling', @@ -6508,7 +6532,7 @@ const emojis = { ], }, { - code: 'U+1F3CF', + code: 'šŸ', keywords: [ 'ball', 'bat', @@ -6517,7 +6541,7 @@ const emojis = { ], }, { - code: 'U+1F3D1', + code: 'šŸ‘', keywords: [ 'ball', 'field', @@ -6527,7 +6551,7 @@ const emojis = { ], }, { - code: 'U+1F3D2', + code: 'šŸ’', keywords: [ 'game', 'hockey', @@ -6537,7 +6561,7 @@ const emojis = { ], }, { - code: 'U+1F3D3', + code: 'šŸ“', keywords: [ 'ball', 'bat', @@ -6547,7 +6571,7 @@ const emojis = { ], }, { - code: 'U+1F3F8', + code: 'šŸø', keywords: [ 'badminton', 'birdie', @@ -6557,14 +6581,14 @@ const emojis = { ], }, { - code: 'U+1F94A', + code: 'šŸ„Š', keywords: [ 'boxing', 'glove', ], }, { - code: 'U+1F94B', + code: 'šŸ„‹', keywords: [ 'judo', 'karate', @@ -6574,7 +6598,7 @@ const emojis = { ], }, { - code: 'U+26F3', + code: 'ā›³', keywords: [ 'flag', 'golf', @@ -6582,21 +6606,21 @@ const emojis = { ], }, { - code: 'U+1F3CC', + code: 'šŸŒ', keywords: [ 'ball', 'golf', ], }, { - code: 'U+26F8', + code: 'ā›ø', keywords: [ 'ice', 'skate', ], }, { - code: 'U+1F3A3', + code: 'šŸŽ£', keywords: [ 'entertainment', 'fish', @@ -6604,7 +6628,7 @@ const emojis = { ], }, { - code: 'U+1F3BD', + code: 'šŸŽ½', keywords: [ 'running', 'sash', @@ -6612,21 +6636,21 @@ const emojis = { ], }, { - code: 'U+1F3BF', + code: 'šŸŽæ', keywords: [ 'ski', 'snow', ], }, { - code: 'U+26F7', + code: 'ā›·', keywords: [ 'ski', 'snow', ], }, { - code: 'U+1F3C2', + code: 'šŸ‚', keywords: [ 'ski', 'snow', @@ -6634,21 +6658,21 @@ const emojis = { ], }, { - code: 'U+1F3C4', + code: 'šŸ„', keywords: [ 'surfer', 'surfing', ], types: [ - 'U+1F3C4 U+1F3FF', - 'U+1F3C4 U+1F3FE', - 'U+1F3C4 U+1F3FD', - 'U+1F3C4 U+1F3FC', - 'U+1F3C4 U+1F3FB', + 'šŸ„šŸæ', + 'šŸ„šŸ¾', + 'šŸ„šŸ½', + 'šŸ„šŸ¼', + 'šŸ„šŸ»', ], }, { - code: 'U+1F3C7', + code: 'šŸ‡', keywords: [ 'horse', 'jockey', @@ -6657,48 +6681,48 @@ const emojis = { ], }, { - code: 'U+1F3CA', + code: 'šŸŠ', keywords: [ 'swim', 'swimmer', ], types: [ - 'U+1F3CA U+1F3FF', - 'U+1F3CA U+1F3FE', - 'U+1F3CA U+1F3FD', - 'U+1F3CA U+1F3FC', - 'U+1F3CA U+1F3FB', + 'šŸŠšŸæ', + 'šŸŠšŸ¾', + 'šŸŠšŸ½', + 'šŸŠšŸ¼', + 'šŸŠšŸ»', ], }, { - code: 'U+26F9', + code: 'ā›¹', keywords: [ 'ball', ], types: [ - 'U+26F9 U+1F3FF', - 'U+26F9 U+1F3FE', - 'U+26F9 U+1F3FD', - 'U+26F9 U+1F3FC', - 'U+26F9 U+1F3FB', + 'ā›¹šŸæ', + 'ā›¹šŸ¾', + 'ā›¹šŸ½', + 'ā›¹šŸ¼', + 'ā›¹šŸ»', ], }, { - code: 'U+1F3CB', + code: 'šŸ‹', keywords: [ 'lifter', 'weight', ], types: [ - 'U+1F3CB U+1F3FF', - 'U+1F3CB U+1F3FE', - 'U+1F3CB U+1F3FD', - 'U+1F3CB U+1F3FC', - 'U+1F3CB U+1F3FB', + 'šŸ‹šŸæ', + 'šŸ‹šŸ¾', + 'šŸ‹šŸ½', + 'šŸ‹šŸ¼', + 'šŸ‹šŸ»', ], }, { - code: 'U+1F6B4', + code: 'šŸš“', keywords: [ 'bicycle', 'bicyclist', @@ -6706,15 +6730,15 @@ const emojis = { 'cyclist', ], types: [ - 'U+1F6B4 U+1F3FF', - 'U+1F6B4 U+1F3FE', - 'U+1F6B4 U+1F3FD', - 'U+1F6B4 U+1F3FC', - 'U+1F6B4 U+1F3FB', + 'šŸš“šŸæ', + 'šŸš“šŸ¾', + 'šŸš“šŸ½', + 'šŸš“šŸ¼', + 'šŸš“šŸ»', ], }, { - code: 'U+1F6B5', + code: 'šŸšµ', keywords: [ 'bicycle', 'bicyclist', @@ -6723,85 +6747,85 @@ const emojis = { 'mountain', ], types: [ - 'U+1F6B5 U+1F3FF', - 'U+1F6B5 U+1F3FE', - 'U+1F6B5 U+1F3FD', - 'U+1F6B5 U+1F3FC', - 'U+1F6B5 U+1F3FB', + 'šŸšµšŸæ', + 'šŸšµšŸ¾', + 'šŸšµšŸ½', + 'šŸšµšŸ¼', + 'šŸšµšŸ»', ], }, { - code: 'U+1F3CE', + code: 'šŸŽ', keywords: [ 'car', 'racing', ], }, { - code: 'U+1F3CD', + code: 'šŸ', keywords: [ 'motorcycle', 'racing', ], }, { - code: 'U+1F938', + code: 'šŸ¤ø', keywords: [ 'cartwheel', 'gymnastics', ], types: [ - 'U+1F938 U+1F3FF', - 'U+1F938 U+1F3FE', - 'U+1F938 U+1F3FD', - 'U+1F938 U+1F3FC', - 'U+1F938 U+1F3FB', + 'šŸ¤øšŸæ', + 'šŸ¤øšŸ¾', + 'šŸ¤øšŸ½', + 'šŸ¤øšŸ¼', + 'šŸ¤øšŸ»', ], }, { - code: 'U+1F93C', + code: 'šŸ¤¼', keywords: [ 'wrestle', 'wrestler', ], types: [ - 'U+1F93C U+1F3FF', - 'U+1F93C U+1F3FE', - 'U+1F93C U+1F3FD', - 'U+1F93C U+1F3FC', - 'U+1F93C U+1F3FB', + 'šŸ¤¼šŸæ', + 'šŸ¤¼šŸ¾', + 'šŸ¤¼šŸ½', + 'šŸ¤¼šŸ¼', + 'šŸ¤¼šŸ»', ], }, { - code: 'U+1F93D', + code: 'šŸ¤½', keywords: [ 'polo', 'water', ], types: [ - 'U+1F93D U+1F3FF', - 'U+1F93D U+1F3FE', - 'U+1F93D U+1F3FD', - 'U+1F93D U+1F3FC', - 'U+1F93D U+1F3FB', + 'šŸ¤½šŸæ', + 'šŸ¤½šŸ¾', + 'šŸ¤½šŸ½', + 'šŸ¤½šŸ¼', + 'šŸ¤½šŸ»', ], }, { - code: 'U+1F93E', + code: 'šŸ¤¾', keywords: [ 'ball', 'handball', ], types: [ - 'U+1F93E U+1F3FF', - 'U+1F93E U+1F3FE', - 'U+1F93E U+1F3FD', - 'U+1F93E U+1F3FC', - 'U+1F93E U+1F3FB', + 'šŸ¤¾šŸæ', + 'šŸ¤¾šŸ¾', + 'šŸ¤¾šŸ½', + 'šŸ¤¾šŸ¼', + 'šŸ¤¾šŸ»', ], }, { - code: 'U+1F93A', + code: 'šŸ¤ŗ', keywords: [ 'fencer', 'fencing', @@ -6809,14 +6833,14 @@ const emojis = { ], }, { - code: 'U+1F945', + code: 'šŸ„…', keywords: [ 'goal', 'net', ], }, { - code: 'U+1F939', + code: 'šŸ¤¹', keywords: [ 'balance', 'juggle', @@ -6824,15 +6848,15 @@ const emojis = { 'skill', ], types: [ - 'U+1F939 U+1F3FF', - 'U+1F939 U+1F3FE', - 'U+1F939 U+1F3FD', - 'U+1F939 U+1F3FC', - 'U+1F939 U+1F3FB', + 'šŸ¤¹šŸæ', + 'šŸ¤¹šŸ¾', + 'šŸ¤¹šŸ½', + 'šŸ¤¹šŸ¼', + 'šŸ¤¹šŸ»', ], }, { - code: 'U+1F3AF', + code: 'šŸŽÆ', keywords: [ 'activity', 'bull', @@ -6846,7 +6870,7 @@ const emojis = { ], }, { - code: 'U+1F3AE', + code: 'šŸŽ®', keywords: [ 'controller', 'entertainment', @@ -6855,7 +6879,7 @@ const emojis = { ], }, { - code: 'U+1F579', + code: 'šŸ•¹', keywords: [ 'entertainment', 'game', @@ -6864,7 +6888,7 @@ const emojis = { ], }, { - code: 'U+1F3B2', + code: 'šŸŽ²', keywords: [ 'dice', 'die', @@ -6873,7 +6897,7 @@ const emojis = { ], }, { - code: 'U+2660', + code: 'ā™ ', keywords: [ 'card', 'game', @@ -6882,7 +6906,7 @@ const emojis = { ], }, { - code: 'U+2665', + code: 'ā™„', keywords: [ 'card', 'game', @@ -6892,7 +6916,7 @@ const emojis = { ], }, { - code: 'U+2666', + code: 'ā™¦', keywords: [ 'card', 'diamond', @@ -6902,7 +6926,7 @@ const emojis = { ], }, { - code: 'U+2663', + code: 'ā™£', keywords: [ 'card', 'club', @@ -6912,7 +6936,7 @@ const emojis = { ], }, { - code: 'U+1F0CF', + code: 'šŸƒ', keywords: [ 'card', 'entertainment', @@ -6922,7 +6946,7 @@ const emojis = { ], }, { - code: 'U+1F004', + code: 'šŸ€„', keywords: [ 'game', 'mahjong', @@ -6930,7 +6954,7 @@ const emojis = { ], }, { - code: 'U+1F3B4', + code: 'šŸŽ“', keywords: [ 'activity', 'card', @@ -6944,7 +6968,7 @@ const emojis = { ], Objects: [ { - code: 'U+1F507', + code: 'šŸ”‡', keywords: [ 'mute', 'quiet', @@ -6954,14 +6978,14 @@ const emojis = { ], }, { - code: 'U+1F508', + code: 'šŸ”ˆ', keywords: [ 'speaker', 'volume', ], }, { - code: 'U+1F509', + code: 'šŸ”‰', keywords: [ 'low', 'speaker', @@ -6970,7 +6994,7 @@ const emojis = { ], }, { - code: 'U+1F50A', + code: 'šŸ”Š', keywords: [ '3', 'entertainment', @@ -6982,7 +7006,7 @@ const emojis = { ], }, { - code: 'U+1F4E2', + code: 'šŸ“¢', keywords: [ 'communication', 'loud', @@ -6991,7 +7015,7 @@ const emojis = { ], }, { - code: 'U+1F4E3', + code: 'šŸ“£', keywords: [ 'cheering', 'communication', @@ -6999,7 +7023,7 @@ const emojis = { ], }, { - code: 'U+1F4EF', + code: 'šŸ“Æ', keywords: [ 'communication', 'entertainment', @@ -7009,13 +7033,13 @@ const emojis = { ], }, { - code: 'U+1F514', + code: 'šŸ””', keywords: [ 'bell', ], }, { - code: 'U+1F515', + code: 'šŸ”•', keywords: [ 'bell', 'forbidden', @@ -7028,7 +7052,7 @@ const emojis = { ], }, { - code: 'U+1F3BC', + code: 'šŸŽ¼', keywords: [ 'activity', 'entertainment', @@ -7037,7 +7061,7 @@ const emojis = { ], }, { - code: 'U+1F3B5', + code: 'šŸŽµ', keywords: [ 'activity', 'entertainment', @@ -7046,7 +7070,7 @@ const emojis = { ], }, { - code: 'U+1F3B6', + code: 'šŸŽ¶', keywords: [ 'activity', 'entertainment', @@ -7056,7 +7080,7 @@ const emojis = { ], }, { - code: 'U+1F399', + code: 'šŸŽ™', keywords: [ 'mic', 'microphone', @@ -7065,7 +7089,7 @@ const emojis = { ], }, { - code: 'U+1F39A', + code: 'šŸŽš', keywords: [ 'level', 'music', @@ -7073,7 +7097,7 @@ const emojis = { ], }, { - code: 'U+1F39B', + code: 'šŸŽ›', keywords: [ 'control', 'knobs', @@ -7081,7 +7105,7 @@ const emojis = { ], }, { - code: 'U+1F3A4', + code: 'šŸŽ¤', keywords: [ 'activity', 'entertainment', @@ -7091,7 +7115,7 @@ const emojis = { ], }, { - code: 'U+1F3A7', + code: 'šŸŽ§', keywords: [ 'activity', 'earbud', @@ -7100,7 +7124,7 @@ const emojis = { ], }, { - code: 'U+1F4FB', + code: 'šŸ“»', keywords: [ 'entertainment', 'radio', @@ -7108,7 +7132,7 @@ const emojis = { ], }, { - code: 'U+1F3B7', + code: 'šŸŽ·', keywords: [ 'activity', 'entertainment', @@ -7119,7 +7143,7 @@ const emojis = { ], }, { - code: 'U+1F3B8', + code: 'šŸŽø', keywords: [ 'activity', 'entertainment', @@ -7129,7 +7153,7 @@ const emojis = { ], }, { - code: 'U+1F3B9', + code: 'šŸŽ¹', keywords: [ 'activity', 'entertainment', @@ -7140,7 +7164,7 @@ const emojis = { ], }, { - code: 'U+1F3BA', + code: 'šŸŽŗ', keywords: [ 'activity', 'entertainment', @@ -7150,7 +7174,7 @@ const emojis = { ], }, { - code: 'U+1F3BB', + code: 'šŸŽ»', keywords: [ 'activity', 'entertainment', @@ -7160,7 +7184,7 @@ const emojis = { ], }, { - code: 'U+1F941', + code: 'šŸ„', keywords: [ 'drum', 'drumsticks', @@ -7168,7 +7192,7 @@ const emojis = { ], }, { - code: 'U+1F4F1', + code: 'šŸ“±', keywords: [ 'cell', 'communication', @@ -7178,7 +7202,7 @@ const emojis = { ], }, { - code: 'U+1F4F2', + code: 'šŸ“²', keywords: [ 'arrow', 'call', @@ -7191,14 +7215,14 @@ const emojis = { ], }, { - code: 'U+260E', + code: 'ā˜Ž', keywords: [ 'phone', 'telephone', ], }, { - code: 'U+1F4DE', + code: 'šŸ“ž', keywords: [ 'communication', 'phone', @@ -7207,27 +7231,27 @@ const emojis = { ], }, { - code: 'U+1F4DF', + code: 'šŸ“Ÿ', keywords: [ 'communication', 'pager', ], }, { - code: 'U+1F4E0', + code: 'šŸ“ ', keywords: [ 'communication', 'fax', ], }, { - code: 'U+1F50B', + code: 'šŸ”‹', keywords: [ 'battery', ], }, { - code: 'U+1F50C', + code: 'šŸ”Œ', keywords: [ 'electric', 'electricity', @@ -7235,7 +7259,7 @@ const emojis = { ], }, { - code: 'U+1F4BB', + code: 'šŸ’»', keywords: [ 'computer', 'pc', @@ -7243,28 +7267,28 @@ const emojis = { ], }, { - code: 'U+1F5A5', + code: 'šŸ–„', keywords: [ 'computer', 'desktop', ], }, { - code: 'U+1F5A8', + code: 'šŸ–Ø', keywords: [ 'computer', 'printer', ], }, { - code: 'U+2328', + code: 'āŒØ', keywords: [ 'computer', 'keyboard', ], }, { - code: 'U+1F5B1', + code: 'šŸ–±', keywords: [ '3', 'button', @@ -7274,14 +7298,14 @@ const emojis = { ], }, { - code: 'U+1F5B2', + code: 'šŸ–²', keywords: [ 'computer', 'trackball', ], }, { - code: 'U+1F4BD', + code: 'šŸ’½', keywords: [ 'computer', 'disk', @@ -7291,7 +7315,7 @@ const emojis = { ], }, { - code: 'U+1F4BE', + code: 'šŸ’¾', keywords: [ 'computer', 'disk', @@ -7299,7 +7323,7 @@ const emojis = { ], }, { - code: 'U+1F4BF', + code: 'šŸ’æ', keywords: [ 'blu-ray', 'cd', @@ -7310,7 +7334,7 @@ const emojis = { ], }, { - code: 'U+1F4C0', + code: 'šŸ“€', keywords: [ 'blu-ray', 'cd', @@ -7322,7 +7346,7 @@ const emojis = { ], }, { - code: 'U+1F3A5', + code: 'šŸŽ„', keywords: [ 'activity', 'camera', @@ -7332,7 +7356,7 @@ const emojis = { ], }, { - code: 'U+1F39E', + code: 'šŸŽž', keywords: [ 'cinema', 'entertainment', @@ -7342,7 +7366,7 @@ const emojis = { ], }, { - code: 'U+1F4FD', + code: 'šŸ“½', keywords: [ 'cinema', 'entertainment', @@ -7353,7 +7377,7 @@ const emojis = { ], }, { - code: 'U+1F3AC', + code: 'šŸŽ¬', keywords: [ 'activity', 'clapper', @@ -7362,7 +7386,7 @@ const emojis = { ], }, { - code: 'U+1F4FA', + code: 'šŸ“ŗ', keywords: [ 'entertainment', 'television', @@ -7371,7 +7395,7 @@ const emojis = { ], }, { - code: 'U+1F4F7', + code: 'šŸ“·', keywords: [ 'camera', 'entertainment', @@ -7379,7 +7403,7 @@ const emojis = { ], }, { - code: 'U+1F4F8', + code: 'šŸ“ø', keywords: [ 'camera', 'flash', @@ -7387,7 +7411,7 @@ const emojis = { ], }, { - code: 'U+1F4F9', + code: 'šŸ“¹', keywords: [ 'camera', 'entertainment', @@ -7395,7 +7419,7 @@ const emojis = { ], }, { - code: 'U+1F4FC', + code: 'šŸ“¼', keywords: [ 'entertainment', 'tape', @@ -7405,7 +7429,7 @@ const emojis = { ], }, { - code: 'U+1F50D', + code: 'šŸ”', keywords: [ 'glass', 'magnifying', @@ -7414,7 +7438,7 @@ const emojis = { ], }, { - code: 'U+1F50E', + code: 'šŸ”Ž', keywords: [ 'glass', 'magnifying', @@ -7423,21 +7447,21 @@ const emojis = { ], }, { - code: 'U+1F52C', + code: 'šŸ”¬', keywords: [ 'microscope', 'tool', ], }, { - code: 'U+1F52D', + code: 'šŸ”­', keywords: [ 'telescope', 'tool', ], }, { - code: 'U+1F4E1', + code: 'šŸ“”', keywords: [ 'antenna', 'communication', @@ -7446,14 +7470,14 @@ const emojis = { ], }, { - code: 'U+1F56F', + code: 'šŸ•Æ', keywords: [ 'candle', 'light', ], }, { - code: 'U+1F4A1', + code: 'šŸ’”', keywords: [ 'bulb', 'comic', @@ -7463,7 +7487,7 @@ const emojis = { ], }, { - code: 'U+1F526', + code: 'šŸ”¦', keywords: [ 'electric', 'flashlight', @@ -7473,7 +7497,7 @@ const emojis = { ], }, { - code: 'U+1F3EE', + code: 'šŸ®', keywords: [ 'bar', 'japanese', @@ -7483,7 +7507,7 @@ const emojis = { ], }, { - code: 'U+1F4D4', + code: 'šŸ“”', keywords: [ 'book', 'cover', @@ -7492,62 +7516,62 @@ const emojis = { ], }, { - code: 'U+1F4D5', + code: 'šŸ“•', keywords: [ 'book', 'closed', ], }, { - code: 'U+1F4D6', + code: 'šŸ“–', keywords: [ 'book', 'open', ], }, { - code: 'U+1F4D7', + code: 'šŸ“—', keywords: [ 'book', 'green', ], }, { - code: 'U+1F4D8', + code: 'šŸ“˜', keywords: [ 'blue', 'book', ], }, { - code: 'U+1F4D9', + code: 'šŸ“™', keywords: [ 'book', 'orange', ], }, { - code: 'U+1F4DA', + code: 'šŸ“š', keywords: [ 'book', 'books', ], }, { - code: 'U+1F4D3', + code: 'šŸ““', keywords: [ 'notebook', ], }, { - code: 'U+1F4D2', + code: 'šŸ“’', keywords: [ 'ledger', 'notebook', ], }, { - code: 'U+1F4C3', + code: 'šŸ“ƒ', keywords: [ 'curl', 'document', @@ -7555,21 +7579,21 @@ const emojis = { ], }, { - code: 'U+1F4DC', + code: 'šŸ“œ', keywords: [ 'paper', 'scroll', ], }, { - code: 'U+1F4C4', + code: 'šŸ“„', keywords: [ 'document', 'page', ], }, { - code: 'U+1F4F0', + code: 'šŸ“°', keywords: [ 'communication', 'news', @@ -7578,7 +7602,7 @@ const emojis = { ], }, { - code: 'U+1F5DE', + code: 'šŸ—ž', keywords: [ 'news', 'newspaper', @@ -7587,7 +7611,7 @@ const emojis = { ], }, { - code: 'U+1F4D1', + code: 'šŸ“‘', keywords: [ 'bookmark', 'mark', @@ -7596,20 +7620,20 @@ const emojis = { ], }, { - code: 'U+1F516', + code: 'šŸ”–', keywords: [ 'bookmark', 'mark', ], }, { - code: 'U+1F3F7', + code: 'šŸ·', keywords: [ 'label', ], }, { - code: 'U+1F4B0', + code: 'šŸ’°', keywords: [ 'bag', 'dollar', @@ -7618,7 +7642,7 @@ const emojis = { ], }, { - code: 'U+1F4B4', + code: 'šŸ’“', keywords: [ 'bank', 'banknote', @@ -7630,7 +7654,7 @@ const emojis = { ], }, { - code: 'U+1F4B5', + code: 'šŸ’µ', keywords: [ 'bank', 'banknote', @@ -7642,7 +7666,7 @@ const emojis = { ], }, { - code: 'U+1F4B6', + code: 'šŸ’¶', keywords: [ 'bank', 'banknote', @@ -7654,7 +7678,7 @@ const emojis = { ], }, { - code: 'U+1F4B7', + code: 'šŸ’·', keywords: [ 'bank', 'banknote', @@ -7666,7 +7690,7 @@ const emojis = { ], }, { - code: 'U+1F4B8', + code: 'šŸ’ø', keywords: [ 'bank', 'banknote', @@ -7679,7 +7703,7 @@ const emojis = { ], }, { - code: 'U+1F4B3', + code: 'šŸ’³', keywords: [ 'bank', 'card', @@ -7688,7 +7712,7 @@ const emojis = { ], }, { - code: 'U+1F4B9', + code: 'šŸ’¹', keywords: [ 'bank', 'chart', @@ -7704,7 +7728,7 @@ const emojis = { ], }, { - code: 'U+1F4B1', + code: 'šŸ’±', keywords: [ 'bank', 'currency', @@ -7713,7 +7737,7 @@ const emojis = { ], }, { - code: 'U+1F4B2', + code: 'šŸ’²', keywords: [ 'currency', 'dollar', @@ -7721,7 +7745,7 @@ const emojis = { ], }, { - code: 'U+2709', + code: 'āœ‰', keywords: [ 'e-mail', 'email', @@ -7729,7 +7753,7 @@ const emojis = { ], }, { - code: 'U+1F4E7', + code: 'šŸ“§', keywords: [ 'communication', 'e-mail', @@ -7739,7 +7763,7 @@ const emojis = { ], }, { - code: 'U+1F4E8', + code: 'šŸ“Ø', keywords: [ 'communication', 'e-mail', @@ -7752,7 +7776,7 @@ const emojis = { ], }, { - code: 'U+1F4E9', + code: 'šŸ“©', keywords: [ 'arrow', 'communication', @@ -7767,7 +7791,7 @@ const emojis = { ], }, { - code: 'U+1F4E4', + code: 'šŸ“¤', keywords: [ 'box', 'communication', @@ -7779,7 +7803,7 @@ const emojis = { ], }, { - code: 'U+1F4E5', + code: 'šŸ“„', keywords: [ 'box', 'communication', @@ -7791,7 +7815,7 @@ const emojis = { ], }, { - code: 'U+1F4E6', + code: 'šŸ“¦', keywords: [ 'box', 'communication', @@ -7800,7 +7824,7 @@ const emojis = { ], }, { - code: 'U+1F4EB', + code: 'šŸ“«', keywords: [ 'closed', 'communication', @@ -7811,7 +7835,7 @@ const emojis = { ], }, { - code: 'U+1F4EA', + code: 'šŸ“Ŗ', keywords: [ 'closed', 'communication', @@ -7823,7 +7847,7 @@ const emojis = { ], }, { - code: 'U+1F4EC', + code: 'šŸ“¬', keywords: [ 'communication', 'flag', @@ -7834,7 +7858,7 @@ const emojis = { ], }, { - code: 'U+1F4ED', + code: 'šŸ“­', keywords: [ 'communication', 'flag', @@ -7846,7 +7870,7 @@ const emojis = { ], }, { - code: 'U+1F4EE', + code: 'šŸ“®', keywords: [ 'communication', 'mail', @@ -7855,27 +7879,27 @@ const emojis = { ], }, { - code: 'U+1F5F3', + code: 'šŸ—³', keywords: [ 'ballot', 'box', ], }, { - code: 'U+270F', + code: 'āœ', keywords: [ 'pencil', ], }, { - code: 'U+2712', + code: 'āœ’', keywords: [ 'nib', 'pen', ], }, { - code: 'U+1F58B', + code: 'šŸ–‹', keywords: [ 'communication', 'fountain', @@ -7883,7 +7907,7 @@ const emojis = { ], }, { - code: 'U+1F58A', + code: 'šŸ–Š', keywords: [ 'ballpoint', 'communication', @@ -7891,7 +7915,7 @@ const emojis = { ], }, { - code: 'U+1F58C', + code: 'šŸ–Œ', keywords: [ 'communication', 'paintbrush', @@ -7899,14 +7923,14 @@ const emojis = { ], }, { - code: 'U+1F58D', + code: 'šŸ–', keywords: [ 'communication', 'crayon', ], }, { - code: 'U+1F4DD', + code: 'šŸ“', keywords: [ 'communication', 'memo', @@ -7914,20 +7938,20 @@ const emojis = { ], }, { - code: 'U+1F4BC', + code: 'šŸ’¼', keywords: [ 'briefcase', ], }, { - code: 'U+1F4C1', + code: 'šŸ“', keywords: [ 'file', 'folder', ], }, { - code: 'U+1F4C2', + code: 'šŸ“‚', keywords: [ 'file', 'folder', @@ -7935,7 +7959,7 @@ const emojis = { ], }, { - code: 'U+1F5C2', + code: 'šŸ—‚', keywords: [ 'card', 'dividers', @@ -7943,20 +7967,20 @@ const emojis = { ], }, { - code: 'U+1F4C5', + code: 'šŸ“…', keywords: [ 'calendar', 'date', ], }, { - code: 'U+1F4C6', + code: 'šŸ“†', keywords: [ 'calendar', ], }, { - code: 'U+1F5D2', + code: 'šŸ—’', keywords: [ 'note', 'pad', @@ -7964,7 +7988,7 @@ const emojis = { ], }, { - code: 'U+1F5D3', + code: 'šŸ—“', keywords: [ 'calendar', 'pad', @@ -7972,7 +7996,7 @@ const emojis = { ], }, { - code: 'U+1F4C7', + code: 'šŸ“‡', keywords: [ 'card', 'index', @@ -7980,7 +8004,7 @@ const emojis = { ], }, { - code: 'U+1F4C8', + code: 'šŸ“ˆ', keywords: [ 'chart', 'graph', @@ -7990,7 +8014,7 @@ const emojis = { ], }, { - code: 'U+1F4C9', + code: 'šŸ“‰', keywords: [ 'chart', 'down', @@ -7999,7 +8023,7 @@ const emojis = { ], }, { - code: 'U+1F4CA', + code: 'šŸ“Š', keywords: [ 'bar', 'chart', @@ -8007,33 +8031,33 @@ const emojis = { ], }, { - code: 'U+1F4CB', + code: 'šŸ“‹', keywords: [ 'clipboard', ], }, { - code: 'U+1F4CC', + code: 'šŸ“Œ', keywords: [ 'pin', 'pushpin', ], }, { - code: 'U+1F4CD', + code: 'šŸ“', keywords: [ 'pin', 'pushpin', ], }, { - code: 'U+1F4CE', + code: 'šŸ“Ž', keywords: [ 'paperclip', ], }, { - code: 'U+1F587', + code: 'šŸ–‡', keywords: [ 'communication', 'link', @@ -8041,14 +8065,14 @@ const emojis = { ], }, { - code: 'U+1F4CF', + code: 'šŸ“', keywords: [ 'ruler', 'straight edge', ], }, { - code: 'U+1F4D0', + code: 'šŸ“', keywords: [ 'ruler', 'set', @@ -8056,14 +8080,14 @@ const emojis = { ], }, { - code: 'U+2702', + code: 'āœ‚', keywords: [ 'scissors', 'tool', ], }, { - code: 'U+1F5C3', + code: 'šŸ—ƒ', keywords: [ 'box', 'card', @@ -8071,27 +8095,27 @@ const emojis = { ], }, { - code: 'U+1F5C4', + code: 'šŸ—„', keywords: [ 'cabinet', 'file', ], }, { - code: 'U+1F5D1', + code: 'šŸ—‘', keywords: [ 'wastebasket', ], }, { - code: 'U+1F512', + code: 'šŸ”’', keywords: [ 'closed', 'lock', ], }, { - code: 'U+1F513', + code: 'šŸ”“', keywords: [ 'lock', 'open', @@ -8099,7 +8123,7 @@ const emojis = { ], }, { - code: 'U+1F50F', + code: 'šŸ”', keywords: [ 'ink', 'lock', @@ -8109,7 +8133,7 @@ const emojis = { ], }, { - code: 'U+1F510', + code: 'šŸ”', keywords: [ 'closed', 'key', @@ -8118,7 +8142,7 @@ const emojis = { ], }, { - code: 'U+1F511', + code: 'šŸ”‘', keywords: [ 'key', 'lock', @@ -8126,7 +8150,7 @@ const emojis = { ], }, { - code: 'U+1F5DD', + code: 'šŸ—', keywords: [ 'clue', 'key', @@ -8135,14 +8159,14 @@ const emojis = { ], }, { - code: 'U+1F528', + code: 'šŸ”Ø', keywords: [ 'hammer', 'tool', ], }, { - code: 'U+26CF', + code: 'ā›', keywords: [ 'mining', 'pick', @@ -8150,7 +8174,7 @@ const emojis = { ], }, { - code: 'U+2692', + code: 'āš’', keywords: [ 'hammer', 'pick', @@ -8158,7 +8182,7 @@ const emojis = { ], }, { - code: 'U+1F6E0', + code: 'šŸ› ', keywords: [ 'hammer', 'tool', @@ -8166,7 +8190,7 @@ const emojis = { ], }, { - code: 'U+1F5E1', + code: 'šŸ—”', keywords: [ 'dagger', 'knife', @@ -8174,7 +8198,7 @@ const emojis = { ], }, { - code: 'U+2694', + code: 'āš”', keywords: [ 'crossed', 'swords', @@ -8182,7 +8206,7 @@ const emojis = { ], }, { - code: 'U+1F52B', + code: 'šŸ”«', keywords: [ 'gun', 'handgun', @@ -8193,7 +8217,7 @@ const emojis = { ], }, { - code: 'U+1F3F9', + code: 'šŸ¹', keywords: [ 'archer', 'arrow', @@ -8205,21 +8229,21 @@ const emojis = { ], }, { - code: 'U+1F6E1', + code: 'šŸ›”', keywords: [ 'shield', 'weapon', ], }, { - code: 'U+1F527', + code: 'šŸ”§', keywords: [ 'tool', 'wrench', ], }, { - code: 'U+1F529', + code: 'šŸ”©', keywords: [ 'bolt', 'nut', @@ -8227,14 +8251,14 @@ const emojis = { ], }, { - code: 'U+2699', + code: 'āš™', keywords: [ 'gear', 'tool', ], }, { - code: 'U+1F5DC', + code: 'šŸ—œ', keywords: [ 'compression', 'tool', @@ -8242,7 +8266,7 @@ const emojis = { ], }, { - code: 'U+2697', + code: 'āš—', keywords: [ 'alembic', 'chemistry', @@ -8250,7 +8274,7 @@ const emojis = { ], }, { - code: 'U+2696', + code: 'āš–', keywords: [ 'balance', 'justice', @@ -8262,19 +8286,19 @@ const emojis = { ], }, { - code: 'U+1F517', + code: 'šŸ”—', keywords: [ 'link', ], }, { - code: 'U+26D3', + code: 'ā›“', keywords: [ 'chain', ], }, { - code: 'U+1F489', + code: 'šŸ’‰', keywords: [ 'doctor', 'medicine', @@ -8286,7 +8310,7 @@ const emojis = { ], }, { - code: 'U+1F48A', + code: 'šŸ’Š', keywords: [ 'doctor', 'medicine', @@ -8295,21 +8319,21 @@ const emojis = { ], }, { - code: 'U+1F6AC', + code: 'šŸš¬', keywords: [ 'activity', 'smoking', ], }, { - code: 'U+26B0', + code: 'āš°', keywords: [ 'coffin', 'death', ], }, { - code: 'U+26B1', + code: 'āš±', keywords: [ 'death', 'funeral', @@ -8317,7 +8341,7 @@ const emojis = { ], }, { - code: 'U+1F5FF', + code: 'šŸ—æ', keywords: [ 'face', 'moyai', @@ -8325,14 +8349,14 @@ const emojis = { ], }, { - code: 'U+1F6E2', + code: 'šŸ›¢', keywords: [ 'drum', 'oil', ], }, { - code: 'U+1F52E', + code: 'šŸ”®', keywords: [ 'ball', 'crystal', @@ -8343,7 +8367,7 @@ const emojis = { ], }, { - code: 'U+1F6D2', + code: 'šŸ›’', keywords: [ 'cart', 'shopping', @@ -8353,7 +8377,7 @@ const emojis = { ], Symbols: [ { - code: 'U+1F3E7', + code: 'šŸ§', keywords: [ 'atm', 'automated', @@ -8362,14 +8386,14 @@ const emojis = { ], }, { - code: 'U+1F6AE', + code: 'šŸš®', keywords: [ 'litter', 'litterbox', ], }, { - code: 'U+1F6B0', + code: 'šŸš°', keywords: [ 'drink', 'potable', @@ -8377,14 +8401,14 @@ const emojis = { ], }, { - code: 'U+267F', + code: 'ā™æ', keywords: [ 'access', 'wheelchair', ], }, { - code: 'U+1F6B9', + code: 'šŸš¹', keywords: [ 'lavatory', 'man', @@ -8393,7 +8417,7 @@ const emojis = { ], }, { - code: 'U+1F6BA', + code: 'šŸšŗ', keywords: [ 'lavatory', 'restroom', @@ -8402,7 +8426,7 @@ const emojis = { ], }, { - code: 'U+1F6BB', + code: 'šŸš»', keywords: [ 'lavatory', 'restroom', @@ -8410,14 +8434,14 @@ const emojis = { ], }, { - code: 'U+1F6BC', + code: 'šŸš¼', keywords: [ 'baby', 'changing', ], }, { - code: 'U+1F6BE', + code: 'šŸš¾', keywords: [ 'closet', 'lavatory', @@ -8427,27 +8451,27 @@ const emojis = { ], }, { - code: 'U+1F6C2', + code: 'šŸ›‚', keywords: [ 'control', 'passport', ], }, { - code: 'U+1F6C3', + code: 'šŸ›ƒ', keywords: [ 'customs', ], }, { - code: 'U+1F6C4', + code: 'šŸ›„', keywords: [ 'baggage', 'claim', ], }, { - code: 'U+1F6C5', + code: 'šŸ›…', keywords: [ 'baggage', 'left luggage', @@ -8456,13 +8480,13 @@ const emojis = { ], }, { - code: 'U+26A0', + code: 'āš ', keywords: [ 'warning', ], }, { - code: 'U+1F6B8', + code: 'šŸšø', keywords: [ 'child', 'crossing', @@ -8471,7 +8495,7 @@ const emojis = { ], }, { - code: 'U+26D4', + code: 'ā›”', keywords: [ 'entry', 'forbidden', @@ -8482,7 +8506,7 @@ const emojis = { ], }, { - code: 'U+1F6AB', + code: 'šŸš«', keywords: [ 'entry', 'forbidden', @@ -8492,7 +8516,7 @@ const emojis = { ], }, { - code: 'U+1F6B3', + code: 'šŸš³', keywords: [ 'bicycle', 'bike', @@ -8504,7 +8528,7 @@ const emojis = { ], }, { - code: 'U+1F6AD', + code: 'šŸš­', keywords: [ 'forbidden', 'no', @@ -8514,7 +8538,7 @@ const emojis = { ], }, { - code: 'U+1F6AF', + code: 'šŸšÆ', keywords: [ 'forbidden', 'litter', @@ -8524,7 +8548,7 @@ const emojis = { ], }, { - code: 'U+1F6B1', + code: 'šŸš±', keywords: [ 'drink', 'forbidden', @@ -8536,7 +8560,7 @@ const emojis = { ], }, { - code: 'U+1F6B7', + code: 'šŸš·', keywords: [ 'forbidden', 'no', @@ -8546,7 +8570,7 @@ const emojis = { ], }, { - code: 'U+1F4F5', + code: 'šŸ“µ', keywords: [ 'cell', 'communication', @@ -8560,7 +8584,7 @@ const emojis = { ], }, { - code: 'U+1F51E', + code: 'šŸ”ž', keywords: [ '18', 'age restriction', @@ -8573,19 +8597,19 @@ const emojis = { ], }, { - code: 'U+2622', + code: 'ā˜¢', keywords: [ 'radioactive', ], }, { - code: 'U+2623', + code: 'ā˜£', keywords: [ 'biohazard', ], }, { - code: 'U+2B06', + code: 'ā¬†', keywords: [ 'arrow', 'cardinal', @@ -8594,7 +8618,7 @@ const emojis = { ], }, { - code: 'U+2197', + code: 'ā†—', keywords: [ 'arrow', 'direction', @@ -8603,7 +8627,7 @@ const emojis = { ], }, { - code: 'U+27A1', + code: 'āž”', keywords: [ 'arrow', 'cardinal', @@ -8612,7 +8636,7 @@ const emojis = { ], }, { - code: 'U+2198', + code: 'ā†˜', keywords: [ 'arrow', 'direction', @@ -8621,7 +8645,7 @@ const emojis = { ], }, { - code: 'U+2B07', + code: 'ā¬‡', keywords: [ 'arrow', 'cardinal', @@ -8631,7 +8655,7 @@ const emojis = { ], }, { - code: 'U+2199', + code: 'ā†™', keywords: [ 'arrow', 'direction', @@ -8640,7 +8664,7 @@ const emojis = { ], }, { - code: 'U+2B05', + code: 'ā¬…', keywords: [ 'arrow', 'cardinal', @@ -8649,7 +8673,7 @@ const emojis = { ], }, { - code: 'U+2196', + code: 'ā†–', keywords: [ 'arrow', 'direction', @@ -8658,44 +8682,44 @@ const emojis = { ], }, { - code: 'U+2195', + code: 'ā†•', keywords: [ 'arrow', ], }, { - code: 'U+2194', + code: 'ā†”', keywords: [ 'arrow', ], }, { - code: 'U+21A9', + code: 'ā†©', keywords: [ 'arrow', ], }, { - code: 'U+21AA', + code: 'ā†Ŗ', keywords: [ 'arrow', ], }, { - code: 'U+2934', + code: 'ā¤“', keywords: [ 'arrow', ], }, { - code: 'U+2935', + code: 'ā¤µ', keywords: [ 'arrow', 'down', ], }, { - code: 'U+1F503', + code: 'šŸ”ƒ', keywords: [ 'arrow', 'clockwise', @@ -8703,7 +8727,7 @@ const emojis = { ], }, { - code: 'U+1F504', + code: 'šŸ”„', keywords: [ 'anticlockwise', 'arrow', @@ -8712,21 +8736,21 @@ const emojis = { ], }, { - code: 'U+1F519', + code: 'šŸ”™', keywords: [ 'arrow', 'back', ], }, { - code: 'U+1F51A', + code: 'šŸ”š', keywords: [ 'arrow', 'end', ], }, { - code: 'U+1F51B', + code: 'šŸ”›', keywords: [ 'arrow', 'mark', @@ -8734,14 +8758,14 @@ const emojis = { ], }, { - code: 'U+1F51C', + code: 'šŸ”œ', keywords: [ 'arrow', 'soon', ], }, { - code: 'U+1F51D', + code: 'šŸ”', keywords: [ 'arrow', 'top', @@ -8749,21 +8773,21 @@ const emojis = { ], }, { - code: 'U+1F6D0', + code: 'šŸ›', keywords: [ 'religion', 'worship', ], }, { - code: 'U+269B', + code: 'āš›', keywords: [ 'atheist', 'atom', ], }, { - code: 'U+1F549', + code: 'šŸ•‰', keywords: [ 'hindu', 'om', @@ -8771,7 +8795,7 @@ const emojis = { ], }, { - code: 'U+2721', + code: 'āœ”', keywords: [ 'david', 'jew', @@ -8781,7 +8805,7 @@ const emojis = { ], }, { - code: 'U+2638', + code: 'ā˜ø', keywords: [ 'buddhist', 'dharma', @@ -8790,7 +8814,7 @@ const emojis = { ], }, { - code: 'U+262F', + code: 'ā˜Æ', keywords: [ 'religion', 'tao', @@ -8800,7 +8824,7 @@ const emojis = { ], }, { - code: 'U+271D', + code: 'āœ', keywords: [ 'christian', 'cross', @@ -8808,7 +8832,7 @@ const emojis = { ], }, { - code: 'U+2626', + code: 'ā˜¦', keywords: [ 'christian', 'cross', @@ -8816,7 +8840,7 @@ const emojis = { ], }, { - code: 'U+262A', + code: 'ā˜Ŗ', keywords: [ 'islam', 'muslim', @@ -8824,13 +8848,13 @@ const emojis = { ], }, { - code: 'U+262E', + code: 'ā˜®', keywords: [ 'peace', ], }, { - code: 'U+1F54E', + code: 'šŸ•Ž', keywords: [ 'candelabrum', 'candlestick', @@ -8839,33 +8863,33 @@ const emojis = { ], }, { - code: 'U+1F52F', + code: 'šŸ”Æ', keywords: [ 'fortune', 'star', ], }, { - code: 'U+267B', + code: 'ā™»', keywords: [ 'recycle', ], }, { - code: 'U+1F4DB', + code: 'šŸ“›', keywords: [ 'badge', 'name', ], }, { - code: 'U+269C', + code: 'āšœ', keywords: [ 'fleur-de-lis', ], }, { - code: 'U+1F530', + code: 'šŸ”°', keywords: [ 'beginner', 'chevron', @@ -8877,7 +8901,7 @@ const emojis = { ], }, { - code: 'U+1F531', + code: 'šŸ”±', keywords: [ 'anchor', 'emblem', @@ -8887,21 +8911,21 @@ const emojis = { ], }, { - code: 'U+2B55', + code: 'ā­•', keywords: [ 'circle', 'o', ], }, { - code: 'U+2705', + code: 'āœ…', keywords: [ 'check', 'mark', ], }, { - code: 'U+2611', + code: 'ā˜‘', keywords: [ 'ballot', 'box', @@ -8909,14 +8933,14 @@ const emojis = { ], }, { - code: 'U+2714', + code: 'āœ”', keywords: [ 'check', 'mark', ], }, { - code: 'U+2716', + code: 'āœ–', keywords: [ 'cancel', 'multiplication', @@ -8925,7 +8949,7 @@ const emojis = { ], }, { - code: 'U+274C', + code: 'āŒ', keywords: [ 'cancel', 'mark', @@ -8935,42 +8959,42 @@ const emojis = { ], }, { - code: 'U+274E', + code: 'āŽ', keywords: [ 'mark', 'square', ], }, { - code: 'U+2795', + code: 'āž•', keywords: [ 'math', 'plus', ], }, { - code: 'U+2796', + code: 'āž–', keywords: [ 'math', 'minus', ], }, { - code: 'U+2797', + code: 'āž—', keywords: [ 'division', 'math', ], }, { - code: 'U+27B0', + code: 'āž°', keywords: [ 'curl', 'loop', ], }, { - code: 'U+27BF', + code: 'āžæ', keywords: [ 'curl', 'double', @@ -8978,32 +9002,32 @@ const emojis = { ], }, { - code: 'U+303D', + code: 'ć€½', keywords: [ 'mark', 'part', ], }, { - code: 'U+2733', + code: 'āœ³', keywords: [ 'asterisk', ], }, { - code: 'U+2734', + code: 'āœ“', keywords: [ 'star', ], }, { - code: 'U+2747', + code: 'ā‡', keywords: [ 'sparkle', ], }, { - code: 'U+203C', + code: 'ā€¼', keywords: [ 'bangbang', 'exclamation', @@ -9012,7 +9036,7 @@ const emojis = { ], }, { - code: 'U+2049', + code: 'ā‰', keywords: [ 'exclamation', 'interrobang', @@ -9022,7 +9046,7 @@ const emojis = { ], }, { - code: 'U+2753', + code: 'ā“', keywords: [ 'mark', 'punctuation', @@ -9030,7 +9054,7 @@ const emojis = { ], }, { - code: 'U+2754', + code: 'ā”', keywords: [ 'mark', 'outlined', @@ -9039,7 +9063,7 @@ const emojis = { ], }, { - code: 'U+2755', + code: 'ā•', keywords: [ 'exclamation', 'mark', @@ -9048,7 +9072,7 @@ const emojis = { ], }, { - code: 'U+2757', + code: 'ā—', keywords: [ 'exclamation', 'mark', @@ -9056,7 +9080,7 @@ const emojis = { ], }, { - code: 'U+3030', + code: '怰', keywords: [ 'dash', 'punctuation', @@ -9064,19 +9088,19 @@ const emojis = { ], }, { - code: 'U+00A9', + code: 'Ā©', keywords: [ 'copyright', ], }, { - code: 'U+00AE', + code: 'Ā®', keywords: [ 'registered', ], }, { - code: 'U+2122', + code: 'ā„¢', keywords: [ 'mark', 'tm', @@ -9084,7 +9108,7 @@ const emojis = { ], }, { - code: 'U+2648', + code: 'ā™ˆ', keywords: [ 'aries', 'ram', @@ -9092,7 +9116,7 @@ const emojis = { ], }, { - code: 'U+2649', + code: 'ā™‰', keywords: [ 'bull', 'ox', @@ -9101,7 +9125,7 @@ const emojis = { ], }, { - code: 'U+264A', + code: 'ā™Š', keywords: [ 'gemini', 'twins', @@ -9109,7 +9133,7 @@ const emojis = { ], }, { - code: 'U+264B', + code: 'ā™‹', keywords: [ 'cancer', 'crab', @@ -9117,7 +9141,7 @@ const emojis = { ], }, { - code: 'U+264C', + code: 'ā™Œ', keywords: [ 'leo', 'lion', @@ -9125,7 +9149,7 @@ const emojis = { ], }, { - code: 'U+264D', + code: 'ā™', keywords: [ 'maiden', 'virgin', @@ -9134,7 +9158,7 @@ const emojis = { ], }, { - code: 'U+264E', + code: 'ā™Ž', keywords: [ 'balance', 'justice', @@ -9144,7 +9168,7 @@ const emojis = { ], }, { - code: 'U+264F', + code: 'ā™', keywords: [ 'scorpio', 'scorpion', @@ -9153,7 +9177,7 @@ const emojis = { ], }, { - code: 'U+2650', + code: 'ā™', keywords: [ 'archer', 'sagittarius', @@ -9161,7 +9185,7 @@ const emojis = { ], }, { - code: 'U+2651', + code: 'ā™‘', keywords: [ 'capricorn', 'goat', @@ -9169,7 +9193,7 @@ const emojis = { ], }, { - code: 'U+2652', + code: 'ā™’', keywords: [ 'aquarius', 'bearer', @@ -9178,7 +9202,7 @@ const emojis = { ], }, { - code: 'U+2653', + code: 'ā™“', keywords: [ 'fish', 'pisces', @@ -9186,7 +9210,7 @@ const emojis = { ], }, { - code: 'U+26CE', + code: 'ā›Ž', keywords: [ 'bearer', 'ophiuchus', @@ -9196,14 +9220,14 @@ const emojis = { ], }, { - code: 'U+1F500', + code: 'šŸ”€', keywords: [ 'arrow', 'crossed', ], }, { - code: 'U+1F501', + code: 'šŸ”', keywords: [ 'arrow', 'clockwise', @@ -9211,7 +9235,7 @@ const emojis = { ], }, { - code: 'U+1F502', + code: 'šŸ”‚', keywords: [ 'arrow', 'clockwise', @@ -9219,7 +9243,7 @@ const emojis = { ], }, { - code: 'U+25B6', + code: 'ā–¶', keywords: [ 'arrow', 'play', @@ -9228,7 +9252,7 @@ const emojis = { ], }, { - code: 'U+23E9', + code: 'ā©', keywords: [ 'arrow', 'double', @@ -9237,7 +9261,7 @@ const emojis = { ], }, { - code: 'U+23ED', + code: 'ā­', keywords: [ 'arrow', 'next scene', @@ -9246,7 +9270,7 @@ const emojis = { ], }, { - code: 'U+23EF', + code: 'āÆ', keywords: [ 'arrow', 'pause', @@ -9256,7 +9280,7 @@ const emojis = { ], }, { - code: 'U+25C0', + code: 'ā—€', keywords: [ 'arrow', 'left', @@ -9265,7 +9289,7 @@ const emojis = { ], }, { - code: 'U+23EA', + code: 'āŖ', keywords: [ 'arrow', 'double', @@ -9273,7 +9297,7 @@ const emojis = { ], }, { - code: 'U+23EE', + code: 'ā®', keywords: [ 'arrow', 'previous scene', @@ -9282,7 +9306,7 @@ const emojis = { ], }, { - code: 'U+1F53C', + code: 'šŸ”¼', keywords: [ 'arrow', 'button', @@ -9290,14 +9314,14 @@ const emojis = { ], }, { - code: 'U+23EB', + code: 'ā«', keywords: [ 'arrow', 'double', ], }, { - code: 'U+1F53D', + code: 'šŸ”½', keywords: [ 'arrow', 'button', @@ -9306,7 +9330,7 @@ const emojis = { ], }, { - code: 'U+23EC', + code: 'ā¬', keywords: [ 'arrow', 'double', @@ -9314,7 +9338,7 @@ const emojis = { ], }, { - code: 'U+23F8', + code: 'āø', keywords: [ 'bar', 'double', @@ -9323,27 +9347,27 @@ const emojis = { ], }, { - code: 'U+23F9', + code: 'ā¹', keywords: [ 'square', 'stop', ], }, { - code: 'U+23FA', + code: 'āŗ', keywords: [ 'circle', 'record', ], }, { - code: 'U+23CF', + code: 'ā', keywords: [ 'eject', ], }, { - code: 'U+1F3A6', + code: 'šŸŽ¦', keywords: [ 'activity', 'camera', @@ -9354,7 +9378,7 @@ const emojis = { ], }, { - code: 'U+1F505', + code: 'šŸ”…', keywords: [ 'brightness', 'dim', @@ -9362,14 +9386,14 @@ const emojis = { ], }, { - code: 'U+1F506', + code: 'šŸ”†', keywords: [ 'bright', 'brightness', ], }, { - code: 'U+1F4F6', + code: 'šŸ“¶', keywords: [ 'antenna', 'bar', @@ -9382,7 +9406,7 @@ const emojis = { ], }, { - code: 'U+1F4F3', + code: 'šŸ“³', keywords: [ 'cell', 'communication', @@ -9394,7 +9418,7 @@ const emojis = { ], }, { - code: 'U+1F4F4', + code: 'šŸ““', keywords: [ 'cell', 'communication', @@ -9405,7 +9429,7 @@ const emojis = { ], }, { - code: 'U+0023 U+FE0F U+20E3', + code: '#ļøāƒ£', keywords: [ 'hash', 'keycap', @@ -9413,7 +9437,7 @@ const emojis = { ], }, { - code: 'U+002A U+FE0F U+20E3', + code: '*ļøāƒ£', keywords: [ 'asterisk', 'keycap', @@ -9421,7 +9445,7 @@ const emojis = { ], }, { - code: 'U+0030 U+FE0F U+20E3', + code: '0ļøāƒ£', keywords: [ '0', 'keycap', @@ -9429,7 +9453,7 @@ const emojis = { ], }, { - code: 'U+0031 U+FE0F U+20E3', + code: '1ļøāƒ£', keywords: [ '1', 'keycap', @@ -9437,7 +9461,7 @@ const emojis = { ], }, { - code: 'U+0032 U+FE0F U+20E3', + code: '2ļøāƒ£', keywords: [ '2', 'keycap', @@ -9445,7 +9469,7 @@ const emojis = { ], }, { - code: 'U+0033 U+FE0F U+20E3', + code: '3ļøāƒ£', keywords: [ '3', 'keycap', @@ -9453,7 +9477,7 @@ const emojis = { ], }, { - code: 'U+0034 U+FE0F U+20E3', + code: '4ļøāƒ£', keywords: [ '4', 'four', @@ -9461,7 +9485,7 @@ const emojis = { ], }, { - code: 'U+0035 U+FE0F U+20E3', + code: '5ļøāƒ£', keywords: [ '5', 'five', @@ -9469,7 +9493,7 @@ const emojis = { ], }, { - code: 'U+0036 U+FE0F U+20E3', + code: '6ļøāƒ£', keywords: [ '6', 'keycap', @@ -9477,7 +9501,7 @@ const emojis = { ], }, { - code: 'U+0037 U+FE0F U+20E3', + code: '7ļøāƒ£', keywords: [ '7', 'keycap', @@ -9485,7 +9509,7 @@ const emojis = { ], }, { - code: 'U+0038 U+FE0F U+20E3', + code: '8ļøāƒ£', keywords: [ '8', 'eight', @@ -9493,7 +9517,7 @@ const emojis = { ], }, { - code: 'U+0039 U+FE0F U+20E3', + code: '9ļøāƒ£', keywords: [ '9', 'keycap', @@ -9501,7 +9525,7 @@ const emojis = { ], }, { - code: 'U+1F51F', + code: 'šŸ”Ÿ', keywords: [ '10', 'keycap', @@ -9509,7 +9533,7 @@ const emojis = { ], }, { - code: 'U+1F4AF', + code: 'šŸ’Æ', keywords: [ '100', 'full', @@ -9518,7 +9542,7 @@ const emojis = { ], }, { - code: 'U+1F520', + code: 'šŸ” ', keywords: [ 'input', 'latin', @@ -9527,7 +9551,7 @@ const emojis = { ], }, { - code: 'U+1F521', + code: 'šŸ””', keywords: [ 'abcd', 'input', @@ -9537,7 +9561,7 @@ const emojis = { ], }, { - code: 'U+1F522', + code: 'šŸ”¢', keywords: [ '1234', 'input', @@ -9545,13 +9569,13 @@ const emojis = { ], }, { - code: 'U+1F523', + code: 'šŸ”£', keywords: [ 'input', ], }, { - code: 'U+1F524', + code: 'šŸ”¤', keywords: [ 'abc', 'alphabet', @@ -9561,197 +9585,197 @@ const emojis = { ], }, { - code: 'U+1F170', + code: 'šŸ…°', keywords: [ 'a', 'blood', ], }, { - code: 'U+1F18E', + code: 'šŸ†Ž', keywords: [ 'ab', 'blood', ], }, { - code: 'U+1F171', + code: 'šŸ…±', keywords: [ 'b', 'blood', ], }, { - code: 'U+1F191', + code: 'šŸ†‘', keywords: [ 'cl', ], }, { - code: 'U+1F192', + code: 'šŸ†’', keywords: [ 'cool', ], }, { - code: 'U+1F193', + code: 'šŸ†“', keywords: [ 'free', ], }, { - code: 'U+2139', + code: 'ā„¹', keywords: [ 'i', 'information', ], }, { - code: 'U+1F194', + code: 'šŸ†”', keywords: [ 'id', 'identity', ], }, { - code: 'U+24C2', + code: 'ā“‚', keywords: [ 'circle', 'm', ], }, { - code: 'U+1F195', + code: 'šŸ†•', keywords: [ 'new', ], }, { - code: 'U+1F196', + code: 'šŸ†–', keywords: [ 'ng', ], }, { - code: 'U+1F17E', + code: 'šŸ…¾', keywords: [ 'blood', 'o', ], }, { - code: 'U+1F197', + code: 'šŸ†—', keywords: [ 'ok', ], }, { - code: 'U+1F17F', + code: 'šŸ…æ', keywords: [ 'parking', ], }, { - code: 'U+1F198', + code: 'šŸ†˜', keywords: [ 'help', 'sos', ], }, { - code: 'U+1F199', + code: 'šŸ†™', keywords: [ 'mark', 'up', ], }, { - code: 'U+1F19A', + code: 'šŸ†š', keywords: [ 'versus', 'vs', ], }, { - code: 'U+1F201', + code: 'šŸˆ', keywords: [ 'japanese', ], }, { - code: 'U+1F202', + code: 'šŸˆ‚', keywords: [ 'japanese', ], }, { - code: 'U+1F237', + code: 'šŸˆ·', keywords: [ 'japanese', ], }, { - code: 'U+1F236', + code: 'šŸˆ¶', keywords: [ 'japanese', ], }, { - code: 'U+1F22F', + code: 'šŸˆÆ', keywords: [ 'japanese', ], }, { - code: 'U+1F250', + code: 'šŸ‰', keywords: [ 'japanese', ], }, { - code: 'U+1F239', + code: 'šŸˆ¹', keywords: [ 'japanese', ], }, { - code: 'U+1F21A', + code: 'šŸˆš', keywords: [ 'japanese', ], }, { - code: 'U+1F232', + code: 'šŸˆ²', keywords: [ 'japanese', ], }, { - code: 'U+1F251', + code: 'šŸ‰‘', keywords: [ 'chinese', ], }, { - code: 'U+1F238', + code: 'šŸˆø', keywords: [ 'chinese', ], }, { - code: 'U+1F234', + code: 'šŸˆ“', keywords: [ 'chinese', ], }, { - code: 'U+1F233', + code: 'šŸˆ³', keywords: [ 'chinese', ], }, { - code: 'U+3297', + code: '抗', keywords: [ 'chinese', 'congratulation', @@ -9760,7 +9784,7 @@ const emojis = { ], }, { - code: 'U+3299', + code: '抙', keywords: [ 'chinese', 'ideograph', @@ -9768,75 +9792,75 @@ const emojis = { ], }, { - code: 'U+1F23A', + code: 'šŸˆŗ', keywords: [ 'chinese', ], }, { - code: 'U+1F235', + code: 'šŸˆµ', keywords: [ 'chinese', ], }, { - code: 'U+25AA', + code: 'ā–Ŗ', keywords: [ 'geometric', 'square', ], }, { - code: 'U+25AB', + code: 'ā–«', keywords: [ 'geometric', 'square', ], }, { - code: 'U+25FB', + code: 'ā—»', keywords: [ 'geometric', 'square', ], }, { - code: 'U+25FC', + code: 'ā—¼', keywords: [ 'geometric', 'square', ], }, { - code: 'U+25FD', + code: 'ā—½', keywords: [ 'geometric', 'square', ], }, { - code: 'U+25FE', + code: 'ā—¾', keywords: [ 'geometric', 'square', ], }, { - code: 'U+2B1B', + code: 'ā¬›', keywords: [ 'geometric', 'square', ], }, { - code: 'U+2B1C', + code: 'ā¬œ', keywords: [ 'geometric', 'square', ], }, { - code: 'U+1F536', + code: 'šŸ”¶', keywords: [ 'diamond', 'geometric', @@ -9844,7 +9868,7 @@ const emojis = { ], }, { - code: 'U+1F537', + code: 'šŸ”·', keywords: [ 'blue', 'diamond', @@ -9852,7 +9876,7 @@ const emojis = { ], }, { - code: 'U+1F538', + code: 'šŸ”ø', keywords: [ 'diamond', 'geometric', @@ -9860,7 +9884,7 @@ const emojis = { ], }, { - code: 'U+1F539', + code: 'šŸ”¹', keywords: [ 'blue', 'diamond', @@ -9868,14 +9892,14 @@ const emojis = { ], }, { - code: 'U+1F53A', + code: 'šŸ”ŗ', keywords: [ 'geometric', 'red', ], }, { - code: 'U+1F53B', + code: 'šŸ”»', keywords: [ 'down', 'geometric', @@ -9883,7 +9907,7 @@ const emojis = { ], }, { - code: 'U+1F4A0', + code: 'šŸ’ ', keywords: [ 'comic', 'diamond', @@ -9892,7 +9916,7 @@ const emojis = { ], }, { - code: 'U+1F518', + code: 'šŸ”˜', keywords: [ 'button', 'geometric', @@ -9900,7 +9924,7 @@ const emojis = { ], }, { - code: 'U+1F532', + code: 'šŸ”²', keywords: [ 'button', 'geometric', @@ -9908,7 +9932,7 @@ const emojis = { ], }, { - code: 'U+1F533', + code: 'šŸ”³', keywords: [ 'button', 'geometric', @@ -9917,21 +9941,21 @@ const emojis = { ], }, { - code: 'U+26AA', + code: 'āšŖ', keywords: [ 'circle', 'geometric', ], }, { - code: 'U+26AB', + code: 'āš«', keywords: [ 'circle', 'geometric', ], }, { - code: 'U+1F534', + code: 'šŸ”“', keywords: [ 'circle', 'geometric', @@ -9939,7 +9963,7 @@ const emojis = { ], }, { - code: 'U+1F535', + code: 'šŸ”µ', keywords: [ 'blue', 'circle', @@ -9949,7 +9973,7 @@ const emojis = { ], Flags: [ { - code: 'U+1F3C1', + code: 'šŸ', keywords: [ 'checkered', 'chequered', @@ -9958,14 +9982,14 @@ const emojis = { ], }, { - code: 'U+1F6A9', + code: 'šŸš©', keywords: [ 'flag', 'post', ], }, { - code: 'U+1F38C', + code: 'šŸŽŒ', keywords: [ 'activity', 'celebration', @@ -9976,21 +10000,21 @@ const emojis = { ], }, { - code: 'U+1F3F4', + code: 'šŸ“', keywords: [ 'flag', 'waving', ], }, { - code: 'U+1F3F3', + code: 'šŸ³', keywords: [ 'flag', 'waving', ], }, { - code: 'U+1F1E6 U+1F1E8', + code: 'šŸ‡¦šŸ‡Ø', keywords: [ 'ascension', 'flag', @@ -9998,14 +10022,14 @@ const emojis = { ], }, { - code: 'U+1F1E6 U+1F1E9', + code: 'šŸ‡¦šŸ‡©', keywords: [ 'andorra', 'flag', ], }, { - code: 'U+1F1E6 U+1F1EA', + code: 'šŸ‡¦šŸ‡Ŗ', keywords: [ 'emirates', 'flag', @@ -10014,14 +10038,14 @@ const emojis = { ], }, { - code: 'U+1F1E6 U+1F1EB', + code: 'šŸ‡¦šŸ‡«', keywords: [ 'afghanistan', 'flag', ], }, { - code: 'U+1F1E6 U+1F1EC', + code: 'šŸ‡¦šŸ‡¬', keywords: [ 'antigua', 'barbuda', @@ -10029,49 +10053,49 @@ const emojis = { ], }, { - code: 'U+1F1E6 U+1F1EE', + code: 'šŸ‡¦šŸ‡®', keywords: [ 'anguilla', 'flag', ], }, { - code: 'U+1F1E6 U+1F1F1', + code: 'šŸ‡¦šŸ‡±', keywords: [ 'albania', 'flag', ], }, { - code: 'U+1F1E6 U+1F1F2', + code: 'šŸ‡¦šŸ‡²', keywords: [ 'armenia', 'flag', ], }, { - code: 'U+1F1E6 U+1F1F4', + code: 'šŸ‡¦šŸ‡“', keywords: [ 'angola', 'flag', ], }, { - code: 'U+1F1E6 U+1F1F6', + code: 'šŸ‡¦šŸ‡¶', keywords: [ 'antarctica', 'flag', ], }, { - code: 'U+1F1E6 U+1F1F7', + code: 'šŸ‡¦šŸ‡·', keywords: [ 'argentina', 'flag', ], }, { - code: 'U+1F1E6 U+1F1F8', + code: 'šŸ‡¦šŸ‡ø', keywords: [ 'american', 'flag', @@ -10079,42 +10103,42 @@ const emojis = { ], }, { - code: 'U+1F1E6 U+1F1F9', + code: 'šŸ‡¦šŸ‡¹', keywords: [ 'austria', 'flag', ], }, { - code: 'U+1F1E6 U+1F1FA', + code: 'šŸ‡¦šŸ‡ŗ', keywords: [ 'australia', 'flag', ], }, { - code: 'U+1F1E6 U+1F1FC', + code: 'šŸ‡¦šŸ‡¼', keywords: [ 'aruba', 'flag', ], }, { - code: 'U+1F1E6 U+1F1FD', + code: 'šŸ‡¦šŸ‡½', keywords: [ 'Ć„land', 'flag', ], }, { - code: 'U+1F1E6 U+1F1FF', + code: 'šŸ‡¦šŸ‡æ', keywords: [ 'azerbaijan', 'flag', ], }, { - code: 'U+1F1E7 U+1F1E6', + code: 'šŸ‡§šŸ‡¦', keywords: [ 'bosnia', 'flag', @@ -10122,63 +10146,63 @@ const emojis = { ], }, { - code: 'U+1F1E7 U+1F1E7', + code: 'šŸ‡§šŸ‡§', keywords: [ 'barbados', 'flag', ], }, { - code: 'U+1F1E7 U+1F1E9', + code: 'šŸ‡§šŸ‡©', keywords: [ 'bangladesh', 'flag', ], }, { - code: 'U+1F1E7 U+1F1EA', + code: 'šŸ‡§šŸ‡Ŗ', keywords: [ 'belgium', 'flag', ], }, { - code: 'U+1F1E7 U+1F1EB', + code: 'šŸ‡§šŸ‡«', keywords: [ 'burkina faso', 'flag', ], }, { - code: 'U+1F1E7 U+1F1EC', + code: 'šŸ‡§šŸ‡¬', keywords: [ 'bulgaria', 'flag', ], }, { - code: 'U+1F1E7 U+1F1ED', + code: 'šŸ‡§šŸ‡­', keywords: [ 'bahrain', 'flag', ], }, { - code: 'U+1F1E7 U+1F1EE', + code: 'šŸ‡§šŸ‡®', keywords: [ 'burundi', 'flag', ], }, { - code: 'U+1F1E7 U+1F1EF', + code: 'šŸ‡§šŸ‡Æ', keywords: [ 'benin', 'flag', ], }, { - code: 'U+1F1E7 U+1F1F1', + code: 'šŸ‡§šŸ‡±', keywords: [ 'barthelemy', 'barthĆ©lemy', @@ -10187,14 +10211,14 @@ const emojis = { ], }, { - code: 'U+1F1E7 U+1F1F2', + code: 'šŸ‡§šŸ‡²', keywords: [ 'bermuda', 'flag', ], }, { - code: 'U+1F1E7 U+1F1F3', + code: 'šŸ‡§šŸ‡³', keywords: [ 'brunei', 'darussalam', @@ -10202,14 +10226,14 @@ const emojis = { ], }, { - code: 'U+1F1E7 U+1F1F4', + code: 'šŸ‡§šŸ‡“', keywords: [ 'bolivia', 'flag', ], }, { - code: 'U+1F1E7 U+1F1F6', + code: 'šŸ‡§šŸ‡¶', keywords: [ 'bonaire', 'caribbean', @@ -10221,28 +10245,28 @@ const emojis = { ], }, { - code: 'U+1F1E7 U+1F1F7', + code: 'šŸ‡§šŸ‡·', keywords: [ 'brazil', 'flag', ], }, { - code: 'U+1F1E7 U+1F1F8', + code: 'šŸ‡§šŸ‡ø', keywords: [ 'bahamas', 'flag', ], }, { - code: 'U+1F1E7 U+1F1F9', + code: 'šŸ‡§šŸ‡¹', keywords: [ 'bhutan', 'flag', ], }, { - code: 'U+1F1E7 U+1F1FB', + code: 'šŸ‡§šŸ‡»', keywords: [ 'bouvet', 'flag', @@ -10250,35 +10274,35 @@ const emojis = { ], }, { - code: 'U+1F1E7 U+1F1FC', + code: 'šŸ‡§šŸ‡¼', keywords: [ 'botswana', 'flag', ], }, { - code: 'U+1F1E7 U+1F1FE', + code: 'šŸ‡§šŸ‡¾', keywords: [ 'belarus', 'flag', ], }, { - code: 'U+1F1E7 U+1F1FF', + code: 'šŸ‡§šŸ‡æ', keywords: [ 'belize', 'flag', ], }, { - code: 'U+1F1E8 U+1F1E6', + code: 'šŸ‡ØšŸ‡¦', keywords: [ 'canada', 'flag', ], }, { - code: 'U+1F1E8 U+1F1E8', + code: 'šŸ‡ØšŸ‡Ø', keywords: [ 'cocos', 'flag', @@ -10287,7 +10311,7 @@ const emojis = { ], }, { - code: 'U+1F1E8 U+1F1E9', + code: 'šŸ‡ØšŸ‡©', keywords: [ 'congo', 'congo-kinshasa', @@ -10299,7 +10323,7 @@ const emojis = { ], }, { - code: 'U+1F1E8 U+1F1EB', + code: 'šŸ‡ØšŸ‡«', keywords: [ 'central african republic', 'flag', @@ -10307,7 +10331,7 @@ const emojis = { ], }, { - code: 'U+1F1E8 U+1F1EC', + code: 'šŸ‡ØšŸ‡¬', keywords: [ 'brazzaville', 'congo', @@ -10319,14 +10343,14 @@ const emojis = { ], }, { - code: 'U+1F1E8 U+1F1ED', + code: 'šŸ‡ØšŸ‡­', keywords: [ 'flag', 'switzerland', ], }, { - code: 'U+1F1E8 U+1F1EE', + code: 'šŸ‡ØšŸ‡®', keywords: [ 'cote ivoire', 'cĆ“te ivoire', @@ -10335,7 +10359,7 @@ const emojis = { ], }, { - code: 'U+1F1E8 U+1F1F0', + code: 'šŸ‡ØšŸ‡°', keywords: [ 'cook', 'flag', @@ -10343,35 +10367,35 @@ const emojis = { ], }, { - code: 'U+1F1E8 U+1F1F1', + code: 'šŸ‡ØšŸ‡±', keywords: [ 'chile', 'flag', ], }, { - code: 'U+1F1E8 U+1F1F2', + code: 'šŸ‡ØšŸ‡²', keywords: [ 'cameroon', 'flag', ], }, { - code: 'U+1F1E8 U+1F1F3', + code: 'šŸ‡ØšŸ‡³', keywords: [ 'china', 'flag', ], }, { - code: 'U+1F1E8 U+1F1F4', + code: 'šŸ‡ØšŸ‡“', keywords: [ 'colombia', 'flag', ], }, { - code: 'U+1F1E8 U+1F1F5', + code: 'šŸ‡ØšŸ‡µ', keywords: [ 'clipperton', 'flag', @@ -10379,21 +10403,21 @@ const emojis = { ], }, { - code: 'U+1F1E8 U+1F1F7', + code: 'šŸ‡ØšŸ‡·', keywords: [ 'costa rica', 'flag', ], }, { - code: 'U+1F1E8 U+1F1FA', + code: 'šŸ‡ØšŸ‡ŗ', keywords: [ 'cuba', 'flag', ], }, { - code: 'U+1F1E8 U+1F1FB', + code: 'šŸ‡ØšŸ‡»', keywords: [ 'cabo', 'cape', @@ -10402,7 +10426,7 @@ const emojis = { ], }, { - code: 'U+1F1E8 U+1F1FC', + code: 'šŸ‡ØšŸ‡¼', keywords: [ 'antilles', 'curacao', @@ -10411,7 +10435,7 @@ const emojis = { ], }, { - code: 'U+1F1E8 U+1F1FD', + code: 'šŸ‡ØšŸ‡½', keywords: [ 'christmas', 'flag', @@ -10419,70 +10443,70 @@ const emojis = { ], }, { - code: 'U+1F1E8 U+1F1FE', + code: 'šŸ‡ØšŸ‡¾', keywords: [ 'cyprus', 'flag', ], }, { - code: 'U+1F1E8 U+1F1FF', + code: 'šŸ‡ØšŸ‡æ', keywords: [ 'czech republic', 'flag', ], }, { - code: 'U+1F1E9 U+1F1EA', + code: 'šŸ‡©šŸ‡Ŗ', keywords: [ 'flag', 'germany', ], }, { - code: 'U+1F1E9 U+1F1EC', + code: 'šŸ‡©šŸ‡¬', keywords: [ 'diego garcia', 'flag', ], }, { - code: 'U+1F1E9 U+1F1EF', + code: 'šŸ‡©šŸ‡Æ', keywords: [ 'djibouti', 'flag', ], }, { - code: 'U+1F1E9 U+1F1F0', + code: 'šŸ‡©šŸ‡°', keywords: [ 'denmark', 'flag', ], }, { - code: 'U+1F1E9 U+1F1F2', + code: 'šŸ‡©šŸ‡²', keywords: [ 'dominica', 'flag', ], }, { - code: 'U+1F1E9 U+1F1F4', + code: 'šŸ‡©šŸ‡“', keywords: [ 'dominican republic', 'flag', ], }, { - code: 'U+1F1E9 U+1F1FF', + code: 'šŸ‡©šŸ‡æ', keywords: [ 'algeria', 'flag', ], }, { - code: 'U+1F1EA U+1F1E6', + code: 'šŸ‡ŖšŸ‡¦', keywords: [ 'ceuta', 'flag', @@ -10490,28 +10514,28 @@ const emojis = { ], }, { - code: 'U+1F1EA U+1F1E8', + code: 'šŸ‡ŖšŸ‡Ø', keywords: [ 'ecuador', 'flag', ], }, { - code: 'U+1F1EA U+1F1EA', + code: 'šŸ‡ŖšŸ‡Ŗ', keywords: [ 'estonia', 'flag', ], }, { - code: 'U+1F1EA U+1F1EC', + code: 'šŸ‡ŖšŸ‡¬', keywords: [ 'egypt', 'flag', ], }, { - code: 'U+1F1EA U+1F1ED', + code: 'šŸ‡ŖšŸ‡­', keywords: [ 'flag', 'sahara', @@ -10520,49 +10544,49 @@ const emojis = { ], }, { - code: 'U+1F1EA U+1F1F7', + code: 'šŸ‡ŖšŸ‡·', keywords: [ 'eritrea', 'flag', ], }, { - code: 'U+1F1EA U+1F1F8', + code: 'šŸ‡ŖšŸ‡ø', keywords: [ 'flag', 'spain', ], }, { - code: 'U+1F1EA U+1F1F9', + code: 'šŸ‡ŖšŸ‡¹', keywords: [ 'ethiopia', 'flag', ], }, { - code: 'U+1F1EA U+1F1FA', + code: 'šŸ‡ŖšŸ‡ŗ', keywords: [ 'european union', 'flag', ], }, { - code: 'U+1F1EB U+1F1EE', + code: 'šŸ‡«šŸ‡®', keywords: [ 'finland', 'flag', ], }, { - code: 'U+1F1EB U+1F1EF', + code: 'šŸ‡«šŸ‡Æ', keywords: [ 'fiji', 'flag', ], }, { - code: 'U+1F1EB U+1F1F0', + code: 'šŸ‡«šŸ‡°', keywords: [ 'falkland', 'falklands', @@ -10573,14 +10597,14 @@ const emojis = { ], }, { - code: 'U+1F1EB U+1F1F2', + code: 'šŸ‡«šŸ‡²', keywords: [ 'flag', 'micronesia', ], }, { - code: 'U+1F1EB U+1F1F4', + code: 'šŸ‡«šŸ‡“', keywords: [ 'faroe', 'flag', @@ -10588,21 +10612,21 @@ const emojis = { ], }, { - code: 'U+1F1EB U+1F1F7', + code: 'šŸ‡«šŸ‡·', keywords: [ 'flag', 'france', ], }, { - code: 'U+1F1EC U+1F1E6', + code: 'šŸ‡¬šŸ‡¦', keywords: [ 'flag', 'gabon', ], }, { - code: 'U+1F1EC U+1F1E7', + code: 'šŸ‡¬šŸ‡§', keywords: [ 'britain', 'british', @@ -10621,21 +10645,21 @@ const emojis = { ], }, { - code: 'U+1F1EC U+1F1E9', + code: 'šŸ‡¬šŸ‡©', keywords: [ 'flag', 'grenada', ], }, { - code: 'U+1F1EC U+1F1EA', + code: 'šŸ‡¬šŸ‡Ŗ', keywords: [ 'flag', 'georgia', ], }, { - code: 'U+1F1EC U+1F1EB', + code: 'šŸ‡¬šŸ‡«', keywords: [ 'flag', 'french', @@ -10643,56 +10667,56 @@ const emojis = { ], }, { - code: 'U+1F1EC U+1F1EC', + code: 'šŸ‡¬šŸ‡¬', keywords: [ 'flag', 'guernsey', ], }, { - code: 'U+1F1EC U+1F1ED', + code: 'šŸ‡¬šŸ‡­', keywords: [ 'flag', 'ghana', ], }, { - code: 'U+1F1EC U+1F1EE', + code: 'šŸ‡¬šŸ‡®', keywords: [ 'flag', 'gibraltar', ], }, { - code: 'U+1F1EC U+1F1F1', + code: 'šŸ‡¬šŸ‡±', keywords: [ 'flag', 'greenland', ], }, { - code: 'U+1F1EC U+1F1F2', + code: 'šŸ‡¬šŸ‡²', keywords: [ 'flag', 'gambia', ], }, { - code: 'U+1F1EC U+1F1F3', + code: 'šŸ‡¬šŸ‡³', keywords: [ 'flag', 'guinea', ], }, { - code: 'U+1F1EC U+1F1F5', + code: 'šŸ‡¬šŸ‡µ', keywords: [ 'flag', 'guadeloupe', ], }, { - code: 'U+1F1EC U+1F1F6', + code: 'šŸ‡¬šŸ‡¶', keywords: [ 'equatorial guinea', 'flag', @@ -10700,14 +10724,14 @@ const emojis = { ], }, { - code: 'U+1F1EC U+1F1F7', + code: 'šŸ‡¬šŸ‡·', keywords: [ 'flag', 'greece', ], }, { - code: 'U+1F1EC U+1F1F8', + code: 'šŸ‡¬šŸ‡ø', keywords: [ 'flag', 'georgia', @@ -10718,21 +10742,21 @@ const emojis = { ], }, { - code: 'U+1F1EC U+1F1F9', + code: 'šŸ‡¬šŸ‡¹', keywords: [ 'flag', 'guatemala', ], }, { - code: 'U+1F1EC U+1F1FA', + code: 'šŸ‡¬šŸ‡ŗ', keywords: [ 'flag', 'guam', ], }, { - code: 'U+1F1EC U+1F1FC', + code: 'šŸ‡¬šŸ‡¼', keywords: [ 'bissau', 'flag', @@ -10740,14 +10764,14 @@ const emojis = { ], }, { - code: 'U+1F1EC U+1F1FE', + code: 'šŸ‡¬šŸ‡¾', keywords: [ 'flag', 'guyana', ], }, { - code: 'U+1F1ED U+1F1F0', + code: 'šŸ‡­šŸ‡°', keywords: [ 'china', 'flag', @@ -10755,7 +10779,7 @@ const emojis = { ], }, { - code: 'U+1F1ED U+1F1F2', + code: 'šŸ‡­šŸ‡²', keywords: [ 'flag', 'heard', @@ -10764,35 +10788,35 @@ const emojis = { ], }, { - code: 'U+1F1ED U+1F1F3', + code: 'šŸ‡­šŸ‡³', keywords: [ 'flag', 'honduras', ], }, { - code: 'U+1F1ED U+1F1F7', + code: 'šŸ‡­šŸ‡·', keywords: [ 'croatia', 'flag', ], }, { - code: 'U+1F1ED U+1F1F9', + code: 'šŸ‡­šŸ‡¹', keywords: [ 'flag', 'haiti', ], }, { - code: 'U+1F1ED U+1F1FA', + code: 'šŸ‡­šŸ‡ŗ', keywords: [ 'flag', 'hungary', ], }, { - code: 'U+1F1EE U+1F1E8', + code: 'šŸ‡®šŸ‡Ø', keywords: [ 'canary', 'flag', @@ -10800,42 +10824,42 @@ const emojis = { ], }, { - code: 'U+1F1EE U+1F1E9', + code: 'šŸ‡®šŸ‡©', keywords: [ 'flag', 'indonesia', ], }, { - code: 'U+1F1EE U+1F1EA', + code: 'šŸ‡®šŸ‡Ŗ', keywords: [ 'flag', 'ireland', ], }, { - code: 'U+1F1EE U+1F1F1', + code: 'šŸ‡®šŸ‡±', keywords: [ 'flag', 'israel', ], }, { - code: 'U+1F1EE U+1F1F2', + code: 'šŸ‡®šŸ‡²', keywords: [ 'flag', 'isle of man', ], }, { - code: 'U+1F1EE U+1F1F3', + code: 'šŸ‡®šŸ‡³', keywords: [ 'flag', 'india', ], }, { - code: 'U+1F1EE U+1F1F4', + code: 'šŸ‡®šŸ‡“', keywords: [ 'british', 'chagos', @@ -10845,98 +10869,98 @@ const emojis = { ], }, { - code: 'U+1F1EE U+1F1F6', + code: 'šŸ‡®šŸ‡¶', keywords: [ 'flag', 'iraq', ], }, { - code: 'U+1F1EE U+1F1F7', + code: 'šŸ‡®šŸ‡·', keywords: [ 'flag', 'iran', ], }, { - code: 'U+1F1EE U+1F1F8', + code: 'šŸ‡®šŸ‡ø', keywords: [ 'flag', 'iceland', ], }, { - code: 'U+1F1EE U+1F1F9', + code: 'šŸ‡®šŸ‡¹', keywords: [ 'flag', 'italy', ], }, { - code: 'U+1F1EF U+1F1EA', + code: 'šŸ‡ÆšŸ‡Ŗ', keywords: [ 'flag', 'jersey', ], }, { - code: 'U+1F1EF U+1F1F2', + code: 'šŸ‡ÆšŸ‡²', keywords: [ 'flag', 'jamaica', ], }, { - code: 'U+1F1EF U+1F1F4', + code: 'šŸ‡ÆšŸ‡“', keywords: [ 'flag', 'jordan', ], }, { - code: 'U+1F1EF U+1F1F5', + code: 'šŸ‡ÆšŸ‡µ', keywords: [ 'flag', 'japan', ], }, { - code: 'U+1F1F0 U+1F1EA', + code: 'šŸ‡°šŸ‡Ŗ', keywords: [ 'flag', 'kenya', ], }, { - code: 'U+1F1F0 U+1F1EC', + code: 'šŸ‡°šŸ‡¬', keywords: [ 'flag', 'kyrgyzstan', ], }, { - code: 'U+1F1F0 U+1F1ED', + code: 'šŸ‡°šŸ‡­', keywords: [ 'cambodia', 'flag', ], }, { - code: 'U+1F1F0 U+1F1EE', + code: 'šŸ‡°šŸ‡®', keywords: [ 'flag', 'kiribati', ], }, { - code: 'U+1F1F0 U+1F1F2', + code: 'šŸ‡°šŸ‡²', keywords: [ 'comoros', 'flag', ], }, { - code: 'U+1F1F0 U+1F1F3', + code: 'šŸ‡°šŸ‡³', keywords: [ 'flag', 'kitts', @@ -10945,7 +10969,7 @@ const emojis = { ], }, { - code: 'U+1F1F0 U+1F1F5', + code: 'šŸ‡°šŸ‡µ', keywords: [ 'flag', 'korea', @@ -10954,7 +10978,7 @@ const emojis = { ], }, { - code: 'U+1F1F0 U+1F1F7', + code: 'šŸ‡°šŸ‡·', keywords: [ 'flag', 'korea', @@ -10963,14 +10987,14 @@ const emojis = { ], }, { - code: 'U+1F1F0 U+1F1FC', + code: 'šŸ‡°šŸ‡¼', keywords: [ 'flag', 'kuwait', ], }, { - code: 'U+1F1F0 U+1F1FE', + code: 'šŸ‡°šŸ‡¾', keywords: [ 'cayman', 'flag', @@ -10978,28 +11002,28 @@ const emojis = { ], }, { - code: 'U+1F1F0 U+1F1FF', + code: 'šŸ‡°šŸ‡æ', keywords: [ 'flag', 'kazakhstan', ], }, { - code: 'U+1F1F1 U+1F1E6', + code: 'šŸ‡±šŸ‡¦', keywords: [ 'flag', 'laos', ], }, { - code: 'U+1F1F1 U+1F1E7', + code: 'šŸ‡±šŸ‡§', keywords: [ 'flag', 'lebanon', ], }, { - code: 'U+1F1F1 U+1F1E8', + code: 'šŸ‡±šŸ‡Ø', keywords: [ 'flag', 'lucia', @@ -11007,91 +11031,91 @@ const emojis = { ], }, { - code: 'U+1F1F1 U+1F1EE', + code: 'šŸ‡±šŸ‡®', keywords: [ 'flag', 'liechtenstein', ], }, { - code: 'U+1F1F1 U+1F1F0', + code: 'šŸ‡±šŸ‡°', keywords: [ 'flag', 'sri lanka', ], }, { - code: 'U+1F1F1 U+1F1F7', + code: 'šŸ‡±šŸ‡·', keywords: [ 'flag', 'liberia', ], }, { - code: 'U+1F1F1 U+1F1F8', + code: 'šŸ‡±šŸ‡ø', keywords: [ 'flag', 'lesotho', ], }, { - code: 'U+1F1F1 U+1F1F9', + code: 'šŸ‡±šŸ‡¹', keywords: [ 'flag', 'lithuania', ], }, { - code: 'U+1F1F1 U+1F1FA', + code: 'šŸ‡±šŸ‡ŗ', keywords: [ 'flag', 'luxembourg', ], }, { - code: 'U+1F1F1 U+1F1FB', + code: 'šŸ‡±šŸ‡»', keywords: [ 'flag', 'latvia', ], }, { - code: 'U+1F1F1 U+1F1FE', + code: 'šŸ‡±šŸ‡¾', keywords: [ 'flag', 'libya', ], }, { - code: 'U+1F1F2 U+1F1E6', + code: 'šŸ‡²šŸ‡¦', keywords: [ 'flag', 'morocco', ], }, { - code: 'U+1F1F2 U+1F1E8', + code: 'šŸ‡²šŸ‡Ø', keywords: [ 'flag', 'monaco', ], }, { - code: 'U+1F1F2 U+1F1E9', + code: 'šŸ‡²šŸ‡©', keywords: [ 'flag', 'moldova', ], }, { - code: 'U+1F1F2 U+1F1EA', + code: 'šŸ‡²šŸ‡Ŗ', keywords: [ 'flag', 'montenegro', ], }, { - code: 'U+1F1F2 U+1F1EB', + code: 'šŸ‡²šŸ‡«', keywords: [ 'flag', 'french', @@ -11100,14 +11124,14 @@ const emojis = { ], }, { - code: 'U+1F1F2 U+1F1EC', + code: 'šŸ‡²šŸ‡¬', keywords: [ 'flag', 'madagascar', ], }, { - code: 'U+1F1F2 U+1F1ED', + code: 'šŸ‡²šŸ‡­', keywords: [ 'flag', 'island', @@ -11115,21 +11139,21 @@ const emojis = { ], }, { - code: 'U+1F1F2 U+1F1F0', + code: 'šŸ‡²šŸ‡°', keywords: [ 'flag', 'macedonia', ], }, { - code: 'U+1F1F2 U+1F1F1', + code: 'šŸ‡²šŸ‡±', keywords: [ 'flag', 'mali', ], }, { - code: 'U+1F1F2 U+1F1F2', + code: 'šŸ‡²šŸ‡²', keywords: [ 'burma', 'flag', @@ -11137,14 +11161,14 @@ const emojis = { ], }, { - code: 'U+1F1F2 U+1F1F3', + code: 'šŸ‡²šŸ‡³', keywords: [ 'flag', 'mongolia', ], }, { - code: 'U+1F1F2 U+1F1F4', + code: 'šŸ‡²šŸ‡“', keywords: [ 'china', 'flag', @@ -11153,7 +11177,7 @@ const emojis = { ], }, { - code: 'U+1F1F2 U+1F1F5', + code: 'šŸ‡²šŸ‡µ', keywords: [ 'flag', 'island', @@ -11163,84 +11187,84 @@ const emojis = { ], }, { - code: 'U+1F1F2 U+1F1F6', + code: 'šŸ‡²šŸ‡¶', keywords: [ 'flag', 'martinique', ], }, { - code: 'U+1F1F2 U+1F1F7', + code: 'šŸ‡²šŸ‡·', keywords: [ 'flag', 'mauritania', ], }, { - code: 'U+1F1F2 U+1F1F8', + code: 'šŸ‡²šŸ‡ø', keywords: [ 'flag', 'montserrat', ], }, { - code: 'U+1F1F2 U+1F1F9', + code: 'šŸ‡²šŸ‡¹', keywords: [ 'flag', 'malta', ], }, { - code: 'U+1F1F2 U+1F1FA', + code: 'šŸ‡²šŸ‡ŗ', keywords: [ 'flag', 'mauritius', ], }, { - code: 'U+1F1F2 U+1F1FB', + code: 'šŸ‡²šŸ‡»', keywords: [ 'flag', 'maldives', ], }, { - code: 'U+1F1F2 U+1F1FC', + code: 'šŸ‡²šŸ‡¼', keywords: [ 'flag', 'malawi', ], }, { - code: 'U+1F1F2 U+1F1FD', + code: 'šŸ‡²šŸ‡½', keywords: [ 'flag', 'mexico', ], }, { - code: 'U+1F1F2 U+1F1FE', + code: 'šŸ‡²šŸ‡¾', keywords: [ 'flag', 'malaysia', ], }, { - code: 'U+1F1F2 U+1F1FF', + code: 'šŸ‡²šŸ‡æ', keywords: [ 'flag', 'mozambique', ], }, { - code: 'U+1F1F3 U+1F1E6', + code: 'šŸ‡³šŸ‡¦', keywords: [ 'flag', 'namibia', ], }, { - code: 'U+1F1F3 U+1F1E8', + code: 'šŸ‡³šŸ‡Ø', keywords: [ 'flag', 'new', @@ -11248,14 +11272,14 @@ const emojis = { ], }, { - code: 'U+1F1F3 U+1F1EA', + code: 'šŸ‡³šŸ‡Ŗ', keywords: [ 'flag', 'niger', ], }, { - code: 'U+1F1F3 U+1F1EB', + code: 'šŸ‡³šŸ‡«', keywords: [ 'flag', 'island', @@ -11263,56 +11287,56 @@ const emojis = { ], }, { - code: 'U+1F1F3 U+1F1EC', + code: 'šŸ‡³šŸ‡¬', keywords: [ 'flag', 'nigeria', ], }, { - code: 'U+1F1F3 U+1F1EE', + code: 'šŸ‡³šŸ‡®', keywords: [ 'flag', 'nicaragua', ], }, { - code: 'U+1F1F3 U+1F1F1', + code: 'šŸ‡³šŸ‡±', keywords: [ 'flag', 'netherlands', ], }, { - code: 'U+1F1F3 U+1F1F4', + code: 'šŸ‡³šŸ‡“', keywords: [ 'flag', 'norway', ], }, { - code: 'U+1F1F3 U+1F1F5', + code: 'šŸ‡³šŸ‡µ', keywords: [ 'flag', 'nepal', ], }, { - code: 'U+1F1F3 U+1F1F7', + code: 'šŸ‡³šŸ‡·', keywords: [ 'flag', 'nauru', ], }, { - code: 'U+1F1F3 U+1F1FA', + code: 'šŸ‡³šŸ‡ŗ', keywords: [ 'flag', 'niue', ], }, { - code: 'U+1F1F3 U+1F1FF', + code: 'šŸ‡³šŸ‡æ', keywords: [ 'flag', 'new', @@ -11320,28 +11344,28 @@ const emojis = { ], }, { - code: 'U+1F1F4 U+1F1F2', + code: 'šŸ‡“šŸ‡²', keywords: [ 'flag', 'oman', ], }, { - code: 'U+1F1F5 U+1F1E6', + code: 'šŸ‡µšŸ‡¦', keywords: [ 'flag', 'panama', ], }, { - code: 'U+1F1F5 U+1F1EA', + code: 'šŸ‡µšŸ‡Ŗ', keywords: [ 'flag', 'peru', ], }, { - code: 'U+1F1F5 U+1F1EB', + code: 'šŸ‡µšŸ‡«', keywords: [ 'flag', 'french', @@ -11349,7 +11373,7 @@ const emojis = { ], }, { - code: 'U+1F1F5 U+1F1EC', + code: 'šŸ‡µšŸ‡¬', keywords: [ 'flag', 'guinea', @@ -11358,28 +11382,28 @@ const emojis = { ], }, { - code: 'U+1F1F5 U+1F1ED', + code: 'šŸ‡µšŸ‡­', keywords: [ 'flag', 'philippines', ], }, { - code: 'U+1F1F5 U+1F1F0', + code: 'šŸ‡µšŸ‡°', keywords: [ 'flag', 'pakistan', ], }, { - code: 'U+1F1F5 U+1F1F1', + code: 'šŸ‡µšŸ‡±', keywords: [ 'flag', 'poland', ], }, { - code: 'U+1F1F5 U+1F1F2', + code: 'šŸ‡µšŸ‡²', keywords: [ 'flag', 'miquelon', @@ -11388,7 +11412,7 @@ const emojis = { ], }, { - code: 'U+1F1F5 U+1F1F3', + code: 'šŸ‡µšŸ‡³', keywords: [ 'flag', 'island', @@ -11396,49 +11420,49 @@ const emojis = { ], }, { - code: 'U+1F1F5 U+1F1F7', + code: 'šŸ‡µšŸ‡·', keywords: [ 'flag', 'puerto rico', ], }, { - code: 'U+1F1F5 U+1F1F8', + code: 'šŸ‡µšŸ‡ø', keywords: [ 'flag', 'palestine', ], }, { - code: 'U+1F1F5 U+1F1F9', + code: 'šŸ‡µšŸ‡¹', keywords: [ 'flag', 'portugal', ], }, { - code: 'U+1F1F5 U+1F1FC', + code: 'šŸ‡µšŸ‡¼', keywords: [ 'flag', 'palau', ], }, { - code: 'U+1F1F5 U+1F1FE', + code: 'šŸ‡µšŸ‡¾', keywords: [ 'flag', 'paraguay', ], }, { - code: 'U+1F1F6 U+1F1E6', + code: 'šŸ‡¶šŸ‡¦', keywords: [ 'flag', 'qatar', ], }, { - code: 'U+1F1F7 U+1F1EA', + code: 'šŸ‡·šŸ‡Ŗ', keywords: [ 'flag', 'reunion', @@ -11446,42 +11470,42 @@ const emojis = { ], }, { - code: 'U+1F1F7 U+1F1F4', + code: 'šŸ‡·šŸ‡“', keywords: [ 'flag', 'romania', ], }, { - code: 'U+1F1F7 U+1F1F8', + code: 'šŸ‡·šŸ‡ø', keywords: [ 'flag', 'serbia', ], }, { - code: 'U+1F1F7 U+1F1FA', + code: 'šŸ‡·šŸ‡ŗ', keywords: [ 'flag', 'russia', ], }, { - code: 'U+1F1F7 U+1F1FC', + code: 'šŸ‡·šŸ‡¼', keywords: [ 'flag', 'rwanda', ], }, { - code: 'U+1F1F8 U+1F1E6', + code: 'šŸ‡øšŸ‡¦', keywords: [ 'flag', 'saudi arabia', ], }, { - code: 'U+1F1F8 U+1F1E7', + code: 'šŸ‡øšŸ‡§', keywords: [ 'flag', 'island', @@ -11489,35 +11513,35 @@ const emojis = { ], }, { - code: 'U+1F1F8 U+1F1E8', + code: 'šŸ‡øšŸ‡Ø', keywords: [ 'flag', 'seychelles', ], }, { - code: 'U+1F1F8 U+1F1E9', + code: 'šŸ‡øšŸ‡©', keywords: [ 'flag', 'sudan', ], }, { - code: 'U+1F1F8 U+1F1EA', + code: 'šŸ‡øšŸ‡Ŗ', keywords: [ 'flag', 'sweden', ], }, { - code: 'U+1F1F8 U+1F1EC', + code: 'šŸ‡øšŸ‡¬', keywords: [ 'flag', 'singapore', ], }, { - code: 'U+1F1F8 U+1F1ED', + code: 'šŸ‡øšŸ‡­', keywords: [ 'flag', 'helena', @@ -11525,14 +11549,14 @@ const emojis = { ], }, { - code: 'U+1F1F8 U+1F1EE', + code: 'šŸ‡øšŸ‡®', keywords: [ 'flag', 'slovenia', ], }, { - code: 'U+1F1F8 U+1F1EF', + code: 'šŸ‡øšŸ‡Æ', keywords: [ 'flag', 'jan mayen', @@ -11540,49 +11564,49 @@ const emojis = { ], }, { - code: 'U+1F1F8 U+1F1F0', + code: 'šŸ‡øšŸ‡°', keywords: [ 'flag', 'slovakia', ], }, { - code: 'U+1F1F8 U+1F1F1', + code: 'šŸ‡øšŸ‡±', keywords: [ 'flag', 'sierra leone', ], }, { - code: 'U+1F1F8 U+1F1F2', + code: 'šŸ‡øšŸ‡²', keywords: [ 'flag', 'san marino', ], }, { - code: 'U+1F1F8 U+1F1F3', + code: 'šŸ‡øšŸ‡³', keywords: [ 'flag', 'senegal', ], }, { - code: 'U+1F1F8 U+1F1F4', + code: 'šŸ‡øšŸ‡“', keywords: [ 'flag', 'somalia', ], }, { - code: 'U+1F1F8 U+1F1F7', + code: 'šŸ‡øšŸ‡·', keywords: [ 'flag', 'suriname', ], }, { - code: 'U+1F1F8 U+1F1F8', + code: 'šŸ‡øšŸ‡ø', keywords: [ 'flag', 'south', @@ -11591,7 +11615,7 @@ const emojis = { ], }, { - code: 'U+1F1F8 U+1F1F9', + code: 'šŸ‡øšŸ‡¹', keywords: [ 'flag', 'principe', @@ -11601,14 +11625,14 @@ const emojis = { ], }, { - code: 'U+1F1F8 U+1F1FB', + code: 'šŸ‡øšŸ‡»', keywords: [ 'el salvador', 'flag', ], }, { - code: 'U+1F1F8 U+1F1FD', + code: 'šŸ‡øšŸ‡½', keywords: [ 'flag', 'maarten', @@ -11616,28 +11640,28 @@ const emojis = { ], }, { - code: 'U+1F1F8 U+1F1FE', + code: 'šŸ‡øšŸ‡¾', keywords: [ 'flag', 'syria', ], }, { - code: 'U+1F1F8 U+1F1FF', + code: 'šŸ‡øšŸ‡æ', keywords: [ 'flag', 'swaziland', ], }, { - code: 'U+1F1F9 U+1F1E6', + code: 'šŸ‡¹šŸ‡¦', keywords: [ 'flag', 'tristan da cunha', ], }, { - code: 'U+1F1F9 U+1F1E8', + code: 'šŸ‡¹šŸ‡Ø', keywords: [ 'caicos', 'flag', @@ -11646,14 +11670,14 @@ const emojis = { ], }, { - code: 'U+1F1F9 U+1F1E9', + code: 'šŸ‡¹šŸ‡©', keywords: [ 'chad', 'flag', ], }, { - code: 'U+1F1F9 U+1F1EB', + code: 'šŸ‡¹šŸ‡«', keywords: [ 'antarctic', 'flag', @@ -11661,35 +11685,35 @@ const emojis = { ], }, { - code: 'U+1F1F9 U+1F1EC', + code: 'šŸ‡¹šŸ‡¬', keywords: [ 'flag', 'togo', ], }, { - code: 'U+1F1F9 U+1F1ED', + code: 'šŸ‡¹šŸ‡­', keywords: [ 'flag', 'thailand', ], }, { - code: 'U+1F1F9 U+1F1EF', + code: 'šŸ‡¹šŸ‡Æ', keywords: [ 'flag', 'tajikistan', ], }, { - code: 'U+1F1F9 U+1F1F0', + code: 'šŸ‡¹šŸ‡°', keywords: [ 'flag', 'tokelau', ], }, { - code: 'U+1F1F9 U+1F1F1', + code: 'šŸ‡¹šŸ‡±', keywords: [ 'east', 'east timor', @@ -11698,35 +11722,35 @@ const emojis = { ], }, { - code: 'U+1F1F9 U+1F1F2', + code: 'šŸ‡¹šŸ‡²', keywords: [ 'flag', 'turkmenistan', ], }, { - code: 'U+1F1F9 U+1F1F3', + code: 'šŸ‡¹šŸ‡³', keywords: [ 'flag', 'tunisia', ], }, { - code: 'U+1F1F9 U+1F1F4', + code: 'šŸ‡¹šŸ‡“', keywords: [ 'flag', 'tonga', ], }, { - code: 'U+1F1F9 U+1F1F7', + code: 'šŸ‡¹šŸ‡·', keywords: [ 'flag', 'turkey', ], }, { - code: 'U+1F1F9 U+1F1F9', + code: 'šŸ‡¹šŸ‡¹', keywords: [ 'flag', 'tobago', @@ -11734,14 +11758,14 @@ const emojis = { ], }, { - code: 'U+1F1F9 U+1F1FB', + code: 'šŸ‡¹šŸ‡»', keywords: [ 'flag', 'tuvalu', ], }, { - code: 'U+1F1F9 U+1F1FC', + code: 'šŸ‡¹šŸ‡¼', keywords: [ 'china', 'flag', @@ -11749,28 +11773,28 @@ const emojis = { ], }, { - code: 'U+1F1F9 U+1F1FF', + code: 'šŸ‡¹šŸ‡æ', keywords: [ 'flag', 'tanzania', ], }, { - code: 'U+1F1FA U+1F1E6', + code: 'šŸ‡ŗšŸ‡¦', keywords: [ 'flag', 'ukraine', ], }, { - code: 'U+1F1FA U+1F1EC', + code: 'šŸ‡ŗšŸ‡¬', keywords: [ 'flag', 'uganda', ], }, { - code: 'U+1F1FA U+1F1F2', + code: 'šŸ‡ŗšŸ‡²', keywords: [ 'america', 'flag', @@ -11783,7 +11807,7 @@ const emojis = { ], }, { - code: 'U+1F1FA U+1F1F8', + code: 'šŸ‡ŗšŸ‡ø', keywords: [ 'america', 'flag', @@ -11793,28 +11817,28 @@ const emojis = { ], }, { - code: 'U+1F1FA U+1F1FE', + code: 'šŸ‡ŗšŸ‡¾', keywords: [ 'flag', 'uruguay', ], }, { - code: 'U+1F1FA U+1F1FF', + code: 'šŸ‡ŗšŸ‡æ', keywords: [ 'flag', 'uzbekistan', ], }, { - code: 'U+1F1FB U+1F1E6', + code: 'šŸ‡»šŸ‡¦', keywords: [ 'flag', 'vatican', ], }, { - code: 'U+1F1FB U+1F1E8', + code: 'šŸ‡»šŸ‡Ø', keywords: [ 'flag', 'grenadines', @@ -11823,14 +11847,14 @@ const emojis = { ], }, { - code: 'U+1F1FB U+1F1EA', + code: 'šŸ‡»šŸ‡Ŗ', keywords: [ 'flag', 'venezuela', ], }, { - code: 'U+1F1FB U+1F1EC', + code: 'šŸ‡»šŸ‡¬', keywords: [ 'british', 'flag', @@ -11839,7 +11863,7 @@ const emojis = { ], }, { - code: 'U+1F1FB U+1F1EE', + code: 'šŸ‡»šŸ‡®', keywords: [ 'america', 'american', @@ -11853,7 +11877,7 @@ const emojis = { ], }, { - code: 'U+1F1FB U+1F1F3', + code: 'šŸ‡»šŸ‡³', keywords: [ 'flag', 'viet nam', @@ -11861,14 +11885,14 @@ const emojis = { ], }, { - code: 'U+1F1FB U+1F1FA', + code: 'šŸ‡»šŸ‡ŗ', keywords: [ 'flag', 'vanuatu', ], }, { - code: 'U+1F1FC U+1F1EB', + code: 'šŸ‡¼šŸ‡«', keywords: [ 'flag', 'futuna', @@ -11876,35 +11900,35 @@ const emojis = { ], }, { - code: 'U+1F1FC U+1F1F8', + code: 'šŸ‡¼šŸ‡ø', keywords: [ 'flag', 'samoa', ], }, { - code: 'U+1F1FD U+1F1F0', + code: 'šŸ‡½šŸ‡°', keywords: [ 'flag', 'kosovo', ], }, { - code: 'U+1F1FE U+1F1EA', + code: 'šŸ‡¾šŸ‡Ŗ', keywords: [ 'flag', 'yemen', ], }, { - code: 'U+1F1FE U+1F1F9', + code: 'šŸ‡¾šŸ‡¹', keywords: [ 'flag', 'mayotte', ], }, { - code: 'U+1F1FF U+1F1E6', + code: 'šŸ‡æšŸ‡¦', keywords: [ 'flag', 'south', @@ -11912,14 +11936,14 @@ const emojis = { ], }, { - code: 'U+1F1FF U+1F1F2', + code: 'šŸ‡æšŸ‡²', keywords: [ 'flag', 'zambia', ], }, { - code: 'U+1F1FF U+1F1FC', + code: 'šŸ‡æšŸ‡¼', keywords: [ 'flag', 'zimbabwe', From 5841cb5a5be6813f7f957625ab43aab58f958f5a Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Fri, 19 Mar 2021 15:34:30 -0600 Subject: [PATCH 005/380] Update to a flatlist and add method to add emoji to the textInput --- src/pages/home/report/EmojiPickerMenu.js | 87 ++++---------------- src/pages/home/report/EmojiPickerMenuItem.js | 28 +++---- src/pages/home/report/ReportActionCompose.js | 11 ++- src/styles/styles.js | 10 +++ 4 files changed, 47 insertions(+), 89 deletions(-) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index 6c8acd2dd349..a3779cc77f93 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -1,5 +1,5 @@ import React from 'react'; -import {View, Text} from 'react-native'; +import {FlatList, Text} from 'react-native'; import PropTypes from 'prop-types'; import styles from '../../../styles/styles'; import themeColors from '../../../styles/themes/default'; @@ -11,84 +11,29 @@ import EmojiPickerMenuItem from './EmojiPickerMenuItem'; const propTypes = { // Controls the visibility of this component. isVisible: PropTypes.bool, + addEmojiToTextBox: PropTypes.func.isRequired, }; const defaultProps = { isVisible: false, }; -const EmojiPickerMenu = (props) => { - - - return props.isVisible && ( - - - Smileys & People - - {emojis['Smileys & People'].map(emoji => ( - - ))} - - Animals & Nature - - {emojis['Animals & Nature'].map(emoji => ( - - ))} - - Travel & Places - - {emojis['Travel & Places'].map(emoji => ( - - ))} - - Activities - - {emojis.Activities.map(emoji => ( +const EmojiPickerMenu = props => ( + props.isVisible && ( + ( - ))} - - Objects - - {emojis.Objects.map(emoji => ( - - ))} - - Symbols - - {emojis.Symbols.map(emoji => ( - - ))} - - Flags - - {emojis.Flags.map(emoji => ( - - ))} - - ); -}; + )} + keyExtractor={item => (`emoji_picker_${item.keywords[0]}`)} + numColumns={8} + style={{height: 300}} + /> + ) +); EmojiPickerMenu.propTypes = propTypes; EmojiPickerMenu.defaultProps = defaultProps; diff --git a/src/pages/home/report/EmojiPickerMenuItem.js b/src/pages/home/report/EmojiPickerMenuItem.js index 37d23b96dfaf..e1032a839ace 100644 --- a/src/pages/home/report/EmojiPickerMenuItem.js +++ b/src/pages/home/report/EmojiPickerMenuItem.js @@ -1,29 +1,23 @@ import React, {memo} from 'react'; import PropTypes from 'prop-types'; -import {Pressable, Text} from 'react-native'; - +import {TouchableOpacity, Text} from 'react-native'; +import styles from '../../../styles/styles'; const propTypes = { - iconCode: PropTypes.elementType.isRequired, + // The unicode that is used to display the emoji + emoji: PropTypes.string.isRequired, + + // The function to call when an emoji is selected + onPress: PropTypes.func.isRequired, }; const EmojiPickerMenuItem = props => ( - - {() => ( - <> - - {props.iconCode} - - - )} - + props.onPress(props.emoji)} style={styles.emojiText}> + {props.emoji} + ); - EmojiPickerMenuItem.propTypes = propTypes; EmojiPickerMenuItem.displayName = 'EmojiPickerMenuItem'; -export default memo(EmojiPickerMenuItem); +export default EmojiPickerMenuItem; diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index 9f9b0a3b9555..c17100f5f2bd 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -64,6 +64,7 @@ class ReportActionCompose extends React.Component { this.setIsFocused = this.setIsFocused.bind(this); this.showEmojiPicker = this.showEmojiPicker.bind(this); this.hideEmojiPicker = this.hideEmojiPicker.bind(this); + this.addEmojiToTextBox = this.addEmojiToTextBox.bind(this); this.comment = props.comment; this.state = { @@ -183,6 +184,12 @@ class ReportActionCompose extends React.Component { this.setState({isPickerVisible: false}); } + addEmojiToTextBox(emoji) { + this.hideEmojiPicker(); + this.textInput.value += emoji; + this.setIsFocused(true); + } + /** * Add a new comment to this chat * @@ -294,18 +301,20 @@ class ReportActionCompose extends React.Component { animationIn="fadeIn" anchorOrigin={ { - horizontal: CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL.CENTER, + horizontal: CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL.RIGHT, vertical: CONST.MODAL.ANCHOR_ORIGIN_VERTICAL.BOTTOM, } } measureContent={() => ( )} > Date: Mon, 22 Mar 2021 12:08:52 +0800 Subject: [PATCH 006/380] Make set password page UI more similar to sign in page UI --- .../Navigation/AppNavigator/PublicScreens.js | 2 +- src/pages/SetPasswordPage.js | 135 ------------------ .../SetPasswordForm/SetPasswordFormNarrow.js | 106 ++++++++++++++ .../SetPasswordForm/SetPasswordFormWide.js | 98 +++++++++++++ .../setpassword/SetPasswordForm/index.js | 20 +++ .../SetPasswordForm/index.native.js | 3 + src/pages/setpassword/SetPasswordPage.js | 22 +++ src/pages/setpassword/SetPasswordPageProps.js | 38 +++++ 8 files changed, 288 insertions(+), 136 deletions(-) delete mode 100644 src/pages/SetPasswordPage.js create mode 100644 src/pages/setpassword/SetPasswordForm/SetPasswordFormNarrow.js create mode 100644 src/pages/setpassword/SetPasswordForm/SetPasswordFormWide.js create mode 100644 src/pages/setpassword/SetPasswordForm/index.js create mode 100644 src/pages/setpassword/SetPasswordForm/index.native.js create mode 100644 src/pages/setpassword/SetPasswordPage.js create mode 100644 src/pages/setpassword/SetPasswordPageProps.js diff --git a/src/libs/Navigation/AppNavigator/PublicScreens.js b/src/libs/Navigation/AppNavigator/PublicScreens.js index 141695a74ff5..896dc599e90c 100644 --- a/src/libs/Navigation/AppNavigator/PublicScreens.js +++ b/src/libs/Navigation/AppNavigator/PublicScreens.js @@ -1,7 +1,7 @@ import React from 'react'; import {createStackNavigator} from '@react-navigation/stack'; import SignInPage from '../../../pages/signin/SignInPage'; -import SetPasswordPage from '../../../pages/SetPasswordPage'; +import SetPasswordPage from '../../../pages/setpassword/SetPasswordPage'; const RootStack = createStackNavigator(); const defaultScreenOptions = { diff --git a/src/pages/SetPasswordPage.js b/src/pages/SetPasswordPage.js deleted file mode 100644 index ca6925dc88a6..000000000000 --- a/src/pages/SetPasswordPage.js +++ /dev/null @@ -1,135 +0,0 @@ -import React, {Component} from 'react'; -import { - SafeAreaView, - Text, - TextInput, - View, -} from 'react-native'; -import PropTypes from 'prop-types'; -import {withOnyx} from 'react-native-onyx'; -import _ from 'underscore'; -import lodashGet from 'lodash.get'; -import styles from '../styles/styles'; -import ExpensifyCashLogo from '../../assets/images/expensify-cash.svg'; -import {setPassword} from '../libs/actions/Session'; -import ONYXKEYS from '../ONYXKEYS'; -import variables from '../styles/variables'; -import ButtonWithLoader from '../components/ButtonWithLoader'; - -const propTypes = { - /* Onyx Props */ - - // The details about the account that the user is signing in with - account: PropTypes.shape({ - // An error message to display to the user - error: PropTypes.string, - - // Whether or not a sign on form is loading (being submitted) - loading: PropTypes.bool, - }), - - // The credentials of the logged in person - credentials: PropTypes.shape({ - // The email the user logged in with - login: PropTypes.string, - - // The password used to log in the user - password: PropTypes.string, - }), - - route: PropTypes.shape({ - params: PropTypes.shape({ - validateCode: PropTypes.string, - }), - }), -}; - -const defaultProps = { - account: {}, - credentials: {}, - route: { - params: {}, - }, -}; - -class SetPasswordPage extends Component { - constructor(props) { - super(props); - - this.submitForm = this.submitForm.bind(this); - - this.state = { - password: '', - formError: null, - }; - } - - /** - * Validate the form and then submit it - */ - submitForm() { - if (!this.state.password.trim()) { - this.setState({ - formError: 'Password cannot be blank', - }); - return; - } - - this.setState({ - formError: null, - }); - setPassword(this.state.password, lodashGet(this.props.route, 'params.validateCode', '')); - } - - render() { - return ( - <> - - - - - - - Enter a password - this.setState({password: text})} - onSubmitEditing={this.submitForm} - /> - - - {this.state.formError && ( - - {this.state.formError} - - )} - {!_.isEmpty(this.props.account.error) && ( - - {this.props.account.error} - - )} - - - - ); - } -} - -SetPasswordPage.propTypes = propTypes; -SetPasswordPage.defaultProps = defaultProps; - -export default withOnyx({ - credentials: {key: ONYXKEYS.CREDENTIALS}, - account: {key: ONYXKEYS.ACCOUNT}, -})(SetPasswordPage); diff --git a/src/pages/setpassword/SetPasswordForm/SetPasswordFormNarrow.js b/src/pages/setpassword/SetPasswordForm/SetPasswordFormNarrow.js new file mode 100644 index 000000000000..3091c3fe787b --- /dev/null +++ b/src/pages/setpassword/SetPasswordForm/SetPasswordFormNarrow.js @@ -0,0 +1,106 @@ +import React from 'react'; +import { + Image, + Text, TextInput, View, +} from 'react-native'; +import {withOnyx} from 'react-native-onyx'; +import _ from 'underscore'; +import lodashGet from 'lodash.get'; +import styles from '../../../styles/styles'; +import ButtonWithLoader from '../../../components/ButtonWithLoader'; +import {setPassword} from '../../../libs/actions/Session'; +import ONYXKEYS from '../../../ONYXKEYS'; +import SetPasswordPageProps from '../SetPasswordPageProps'; +import welcomeScreenshot from '../../../../assets/images/welcome-screenshot.png'; + +class SetPasswordFormNarrow extends React.Component { + constructor(props) { + super(props); + + this.submitForm = this.submitForm.bind(this); + + this.state = { + password: '', + formError: null, + }; + } + + /** + * Validate the form and then submit it + */ + submitForm() { + if (!this.state.password.trim()) { + this.setState({ + formError: 'Password cannot be blank', + }); + return; + } + + this.setState({ + formError: null, + }); + setPassword(this.state.password, lodashGet(this.props.route, 'params.validateCode', '')); + } + + render() { + return ( + + + Enter a password: + this.setState({password: text})} + onSubmitEditing={this.submitForm} + autoFocus + /> + + + {this.state.formError && ( + + {this.state.formError} + + )} + {!_.isEmpty(this.props.account.error) && ( + + {this.props.account.error} + + )} + + + + + + + + With Expensify.cash, chat and payments are the same thing. + + + Money talks. And now that chat and payments are in one place, it's also easy. + {' '} + Your payments get to you as fast as you can get your point across. + + + + ); + } +} + +SetPasswordFormNarrow.propTypes = SetPasswordPageProps.propTypes; +SetPasswordFormNarrow.defaultProps = SetPasswordPageProps.defaultProps; + +export default withOnyx({ + credentials: {key: ONYXKEYS.CREDENTIALS}, + account: {key: ONYXKEYS.ACCOUNT}, +})(SetPasswordFormNarrow); diff --git a/src/pages/setpassword/SetPasswordForm/SetPasswordFormWide.js b/src/pages/setpassword/SetPasswordForm/SetPasswordFormWide.js new file mode 100644 index 000000000000..0ea1518228b1 --- /dev/null +++ b/src/pages/setpassword/SetPasswordForm/SetPasswordFormWide.js @@ -0,0 +1,98 @@ +import React from 'react'; +import { + Text, TextInput, View, +} from 'react-native'; +import {withOnyx} from 'react-native-onyx'; +import _ from 'underscore'; +import lodashGet from 'lodash.get'; +import styles from '../../../styles/styles'; +import ButtonWithLoader from '../../../components/ButtonWithLoader'; +import {setPassword} from '../../../libs/actions/Session'; +import ONYXKEYS from '../../../ONYXKEYS'; +import SetPasswordPageProps from '../SetPasswordPageProps'; + +class SetPasswordFormWide extends React.Component { + constructor(props) { + super(props); + + this.submitForm = this.submitForm.bind(this); + + this.state = { + password: '', + formError: null, + }; + } + + /** + * Validate the form and then submit it + */ + submitForm() { + if (!this.state.password.trim()) { + this.setState({ + formError: 'Password cannot be blank', + }); + return; + } + + this.setState({ + formError: null, + }); + setPassword(this.state.password, lodashGet(this.props.route, 'params.validateCode', '')); + } + + render() { + return ( + + + Enter a password: + this.setState({password: text})} + onSubmitEditing={this.submitForm} + autoFocus + /> + + + {this.state.formError && ( + + {this.state.formError} + + )} + {!_.isEmpty(this.props.account.error) && ( + + {this.props.account.error} + + )} + + + + + With Expensify.cash, chat and payments are the same thing. + + + Money talks. And now that chat and payments are in one place, it's also easy. + {' '} + Your payments get to you as fast as you can get your point across. + + + + + ); + } +} + +SetPasswordFormWide.propTypes = SetPasswordPageProps.propTypes; +SetPasswordFormWide.defaultProps = SetPasswordPageProps.defaultProps; + +export default withOnyx({ + credentials: {key: ONYXKEYS.CREDENTIALS}, + account: {key: ONYXKEYS.ACCOUNT}, +})(SetPasswordFormWide); diff --git a/src/pages/setpassword/SetPasswordForm/index.js b/src/pages/setpassword/SetPasswordForm/index.js new file mode 100644 index 000000000000..67360253a197 --- /dev/null +++ b/src/pages/setpassword/SetPasswordForm/index.js @@ -0,0 +1,20 @@ +/* eslint-disable react/jsx-props-no-spreading */ +import React from 'react'; +import withWindowDimensions, {windowDimensionsPropTypes} from '../../../components/withWindowDimensions'; +import SetPasswordFormNarrow from './SetPasswordFormNarrow'; +import SetPasswordFormWide from './SetPasswordFormWide'; + +const propTypes = { + ...windowDimensionsPropTypes, +}; + +const SetPasswordForm = props => ( + !props.isSmallScreenWidth + ? + : +); + +SetPasswordForm.propTypes = propTypes; +SetPasswordForm.displayName = 'SetPasswordForm'; + +export default withWindowDimensions(SetPasswordForm); diff --git a/src/pages/setpassword/SetPasswordForm/index.native.js b/src/pages/setpassword/SetPasswordForm/index.native.js new file mode 100644 index 000000000000..06a3d1aa9937 --- /dev/null +++ b/src/pages/setpassword/SetPasswordForm/index.native.js @@ -0,0 +1,3 @@ +import SetPasswordFormNarrow from './SetPasswordFormNarrow'; + +export default SetPasswordFormNarrow; diff --git a/src/pages/setpassword/SetPasswordPage.js b/src/pages/setpassword/SetPasswordPage.js new file mode 100644 index 000000000000..77e90d154fab --- /dev/null +++ b/src/pages/setpassword/SetPasswordPage.js @@ -0,0 +1,22 @@ +import React from 'react'; +import {SafeAreaView,} from 'react-native'; +import styles from '../../styles/styles'; +import SignInPageLayout from '../signin/SignInPageLayout'; +import SetPasswordForm from './SetPasswordForm'; +import SetPasswordPageProps from './SetPasswordPageProps'; + +const SetPasswordPage = props => ( + + + + + +); + +SetPasswordPage.propTypes = SetPasswordPageProps.propTypes; +SetPasswordPage.defaultProps = SetPasswordPageProps.defaultProps; + +export default SetPasswordPage; diff --git a/src/pages/setpassword/SetPasswordPageProps.js b/src/pages/setpassword/SetPasswordPageProps.js new file mode 100644 index 000000000000..5e07ad0a9569 --- /dev/null +++ b/src/pages/setpassword/SetPasswordPageProps.js @@ -0,0 +1,38 @@ +import PropTypes from 'prop-types'; + +export default { + propTypes: { + /* Onyx Props */ + + // The details about the account that the user is signing in with + account: PropTypes.shape({ + // An error message to display to the user + error: PropTypes.string, + + // Whether or not a sign on form is loading (being submitted) + loading: PropTypes.bool, + }), + + // The credentials of the logged in person + credentials: PropTypes.shape({ + // The email the user logged in with + login: PropTypes.string, + + // The password used to log in the user + password: PropTypes.string, + }), + + route: PropTypes.shape({ + params: PropTypes.shape({ + validateCode: PropTypes.string, + }), + }), + }, + defaultProps: { + account: {}, + credentials: {}, + route: { + params: {}, + }, + }, +}; From c2d8015e1a27d8e31d38101c06f415163f58c0f2 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Mon, 22 Mar 2021 12:15:31 +0800 Subject: [PATCH 007/380] fix eslint --- src/pages/setpassword/SetPasswordPage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/setpassword/SetPasswordPage.js b/src/pages/setpassword/SetPasswordPage.js index 77e90d154fab..4f3d831d6dfb 100644 --- a/src/pages/setpassword/SetPasswordPage.js +++ b/src/pages/setpassword/SetPasswordPage.js @@ -1,5 +1,5 @@ import React from 'react'; -import {SafeAreaView,} from 'react-native'; +import {SafeAreaView} from 'react-native'; import styles from '../../styles/styles'; import SignInPageLayout from '../signin/SignInPageLayout'; import SetPasswordForm from './SetPasswordForm'; From 7c757d685b144318f689af7700db6b4e8357f9c1 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 22 Mar 2021 09:26:39 -0600 Subject: [PATCH 008/380] Add emoji icon --- assets/images/emoji.svg | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 assets/images/emoji.svg diff --git a/assets/images/emoji.svg b/assets/images/emoji.svg new file mode 100644 index 000000000000..d31167580d81 --- /dev/null +++ b/assets/images/emoji.svg @@ -0,0 +1,6 @@ + + + + + + From 96b2e43b3710e53d942436d76885c936532cf610 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 22 Mar 2021 09:27:13 -0600 Subject: [PATCH 009/380] Update emoji list to have headers instead of individual arrays per category --- assets/emojis.js | 23868 +++++++++++++++++++++++---------------------- 1 file changed, 11941 insertions(+), 11927 deletions(-) diff --git a/assets/emojis.js b/assets/emojis.js index d7b828919300..c162e7e491be 100644 --- a/assets/emojis.js +++ b/assets/emojis.js @@ -24,11932 +24,11946 @@ * } */ -const emojis = { - 'Smileys & People': [ - { - code: 'šŸ˜€', - keywords: [ - 'face', - 'grin', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'eye', - 'face', - 'grin', - 'smile', - ], - }, - { - code: 'šŸ˜‚', - keywords: [ - 'face', - 'joy', - 'laugh', - 'tear', - ], - }, - { - code: 'šŸ¤£', - keywords: [ - 'face', - 'floor', - 'laugh', - 'lol', - 'rofl', - 'rolling', - ], - }, - { - code: 'šŸ˜ƒ', - keywords: [ - 'face', - 'mouth', - 'open', - 'smile', - ], - }, - { - code: 'šŸ˜„', - keywords: [ - 'eye', - 'face', - 'mouth', - 'open', - 'smile', - ], - }, - { - code: 'šŸ˜…', - keywords: [ - 'cold', - 'face', - 'open', - 'smile', - 'sweat', - ], - }, - { - code: 'šŸ˜†', - keywords: [ - 'face', - 'laugh', - 'mouth', - 'open', - 'satisfied', - 'smile', - ], - }, - { - code: 'šŸ˜‰', - keywords: [ - 'face', - 'wink', - ], - }, - { - code: 'šŸ˜Š', - keywords: [ - 'blush', - 'eye', - 'face', - 'smile', - ], - }, - { - code: 'šŸ˜‹', - keywords: [ - 'delicious', - 'face', - 'savouring', - 'smile', - 'um', - 'yum', - ], - }, - { - code: 'šŸ˜Ž', - keywords: [ - 'bright', - 'cool', - 'eye', - 'eyewear', - 'face', - 'glasses', - 'smile', - 'sun', - 'sunglasses', - 'weather', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'eye', - 'face', - 'heart', - 'love', - 'smile', - ], - }, - { - code: 'šŸ˜˜', - keywords: [ - 'face', - 'heart', - 'kiss', - ], - }, - { - code: 'šŸ˜—', - keywords: [ - 'face', - 'kiss', - ], - }, - { - code: 'šŸ˜™', - keywords: [ - 'eye', - 'face', - 'kiss', - 'smile', - ], - }, - { - code: 'šŸ˜š', - keywords: [ - 'closed', - 'eye', - 'face', - 'kiss', - ], - }, - { - code: 'ā˜ŗ', - keywords: [ - 'face', - 'outlined', - 'relaxed', - 'smile', - ], - }, - { - code: 'šŸ™‚', - keywords: [ - 'face', - 'smile', - ], - }, - { - code: 'šŸ¤—', - keywords: [ - 'face', - 'hug', - 'hugging', - ], - }, - { - code: 'šŸ¤”', - keywords: [ - 'face', - 'thinking', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'deadpan', - 'face', - 'neutral', - ], - }, - { - code: 'šŸ˜‘', - keywords: [ - 'expressionless', - 'face', - 'inexpressive', - 'unexpressive', - ], - }, - { - code: 'šŸ˜¶', - keywords: [ - 'face', - 'mouth', - 'quiet', - 'silent', - ], - }, - { - code: 'šŸ™„', - keywords: [ - 'eyes', - 'face', - 'rolling', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'face', - 'smirk', - ], - }, - { - code: 'šŸ˜£', - keywords: [ - 'face', - 'persevere', - ], - }, - { - code: 'šŸ˜„', - keywords: [ - 'disappointed', - 'face', - 'relieved', - 'whew', - ], - }, - { - code: 'šŸ˜®', - keywords: [ - 'face', - 'mouth', - 'open', - 'sympathy', - ], - }, - { - code: 'šŸ¤', - keywords: [ - 'face', - 'mouth', - 'zipper', - ], - }, - { - code: 'šŸ˜Æ', - keywords: [ - 'face', - 'hushed', - 'stunned', - 'surprised', - ], - }, - { - code: 'šŸ˜Ŗ', - keywords: [ - 'face', - 'sleep', - ], - }, - { - code: 'šŸ˜«', - keywords: [ - 'face', - 'tired', - ], - }, - { - code: 'šŸ˜“', - keywords: [ - 'face', - 'sleep', - 'zzz', - ], - }, - { - code: 'šŸ˜Œ', - keywords: [ - 'face', - 'relieved', - ], - }, - { - code: 'šŸ¤“', - keywords: [ - 'face', - 'geek', - 'nerd', - ], - }, - { - code: 'šŸ˜›', - keywords: [ - 'face', - 'tongue', - ], - }, - { - code: 'šŸ˜œ', - keywords: [ - 'eye', - 'face', - 'joke', - 'tongue', - 'wink', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'eye', - 'face', - 'horrible', - 'taste', - 'tongue', - ], - }, - { - code: 'šŸ¤¤', - keywords: [ - 'drooling', - 'face', - ], - }, - { - code: 'šŸ˜’', - keywords: [ - 'face', - 'unamused', - 'unhappy', - ], - }, - { - code: 'šŸ˜“', - keywords: [ - 'cold', - 'face', - 'sweat', - ], - }, - { - code: 'šŸ˜”', - keywords: [ - 'dejected', - 'face', - 'pensive', - ], - }, - { - code: 'šŸ˜•', - keywords: [ - 'confused', - 'face', - ], - }, - { - code: 'šŸ™ƒ', - keywords: [ - 'face', - 'upside-down', - ], - }, - { - code: 'šŸ¤‘', - keywords: [ - 'face', - 'money', - 'mouth', - ], - }, - { - code: 'šŸ˜²', - keywords: [ - 'astonished', - 'face', - 'shocked', - 'totally', - ], - }, - { - code: 'ā˜¹', - keywords: [ - 'face', - 'frown', - ], - }, - { - code: 'šŸ™', - keywords: [ - 'face', - 'frown', - ], - }, - { - code: 'šŸ˜–', - keywords: [ - 'confounded', - 'face', - ], - }, - { - code: 'šŸ˜ž', - keywords: [ - 'disappointed', - 'face', - ], - }, - { - code: 'šŸ˜Ÿ', - keywords: [ - 'face', - 'worried', - ], - }, - { - code: 'šŸ˜¤', - keywords: [ - 'face', - 'triumph', - 'won', - ], - }, - { - code: 'šŸ˜¢', - keywords: [ - 'cry', - 'face', - 'sad', - 'tear', - ], - }, - { - code: 'šŸ˜­', - keywords: [ - 'cry', - 'face', - 'sad', - 'sob', - 'tear', - ], - }, - { - code: 'šŸ˜¦', - keywords: [ - 'face', - 'frown', - 'mouth', - 'open', - ], - }, - { - code: 'šŸ˜§', - keywords: [ - 'anguished', - 'face', - ], - }, - { - code: 'šŸ˜Ø', - keywords: [ - 'face', - 'fear', - 'fearful', - 'scared', - ], - }, - { - code: 'šŸ˜©', - keywords: [ - 'face', - 'tired', - 'weary', - ], - }, - { - code: 'šŸ˜¬', - keywords: [ - 'face', - 'grimace', - ], - }, - { - code: 'šŸ˜°', - keywords: [ - 'blue', - 'cold', - 'face', - 'mouth', - 'open', - 'rushed', - 'sweat', - ], - }, - { - code: 'šŸ˜±', - keywords: [ - 'face', - 'fear', - 'fearful', - 'munch', - 'scared', - 'scream', - ], - }, - { - code: 'šŸ˜³', - keywords: [ - 'dazed', - 'face', - 'flushed', - ], - }, - { - code: 'šŸ˜µ', - keywords: [ - 'dizzy', - 'face', - ], - }, - { - code: 'šŸ˜”', - keywords: [ - 'angry', - 'face', - 'mad', - 'pouting', - 'rage', - 'red', - ], - }, - { - code: 'šŸ˜ ', - keywords: [ - 'angry', - 'face', - 'mad', - ], - }, - { - code: 'šŸ˜‡', - keywords: [ - 'angel', - 'face', - 'fairy tale', - 'fantasy', - 'halo', - 'innocent', - 'smile', - ], - }, - { - code: 'šŸ¤ ', - keywords: [ - 'cowboy', - 'cowgirl', - 'face', - 'hat', - ], - }, - { - code: 'šŸ¤”', - keywords: [ - 'clown', - 'face', - ], - }, - { - code: 'šŸ¤„', - keywords: [ - 'face', - 'lie', - 'pinocchio', - ], - }, - { - code: 'šŸ˜·', - keywords: [ - 'cold', - 'doctor', - 'face', - 'mask', - 'medicine', - 'sick', - ], - }, - { - code: 'šŸ¤’', - keywords: [ - 'face', - 'ill', - 'sick', - 'thermometer', - ], - }, - { - code: 'šŸ¤•', - keywords: [ - 'bandage', - 'face', - 'hurt', - 'injury', - ], - }, - { - code: 'šŸ¤¢', - keywords: [ - 'face', - 'nauseated', - 'vomit', - ], - }, - { - code: 'šŸ¤§', - keywords: [ - 'face', - 'gesundheit', - 'sneeze', - ], - }, - { - code: 'šŸ˜ˆ', - keywords: [ - 'face', - 'fairy tale', - 'fantasy', - 'horns', - 'smile', - ], - }, - { - code: 'šŸ‘æ', - keywords: [ - 'demon', - 'devil', - 'face', - 'fairy tale', - 'fantasy', - 'imp', - ], - }, - { - code: 'šŸ‘¹', - keywords: [ - 'creature', - 'face', - 'fairy tale', - 'fantasy', - 'japanese', - 'monster', - 'ogre', - ], - }, - { - code: 'šŸ‘ŗ', - keywords: [ - 'creature', - 'face', - 'fairy tale', - 'fantasy', - 'goblin', - 'japanese', - 'monster', - ], - }, - { - code: 'šŸ’€', - keywords: [ - 'body', - 'death', - 'face', - 'fairy tale', - 'monster', - 'skull', - ], - }, - { - code: 'ā˜ ', - keywords: [ - 'body', - 'crossbones', - 'death', - 'face', - 'monster', - 'skull', - ], - }, - { - code: 'šŸ‘»', - keywords: [ - 'creature', - 'face', - 'fairy tale', - 'fantasy', - 'ghost', - 'monster', - ], - }, - { - code: 'šŸ‘½', - keywords: [ - 'alien', - 'creature', - 'extraterrestrial', - 'face', - 'fairy tale', - 'fantasy', - 'monster', - 'space', - 'ufo', - ], - }, - { - code: 'šŸ‘¾', - keywords: [ - 'alien', - 'creature', - 'extraterrestrial', - 'face', - 'fairy tale', - 'fantasy', - 'monster', - 'space', - 'ufo', - ], - }, - { - code: 'šŸ¤–', - keywords: [ - 'face', - 'monster', - 'robot', - ], - }, - { - code: 'šŸ’©', - keywords: [ - 'comic', - 'dung', - 'face', - 'monster', - 'poo', - 'poop', - ], - }, - { - code: 'šŸ˜ŗ', - keywords: [ - 'cat', - 'face', - 'mouth', - 'open', - 'smile', - ], - }, - { - code: 'šŸ˜ø', - keywords: [ - 'cat', - 'eye', - 'face', - 'grin', - 'smile', - ], - }, - { - code: 'šŸ˜¹', - keywords: [ - 'cat', - 'face', - 'joy', - 'tear', - ], - }, - { - code: 'šŸ˜»', - keywords: [ - 'cat', - 'eye', - 'face', - 'heart', - 'love', - 'smile', - ], - }, - { - code: 'šŸ˜¼', - keywords: [ - 'cat', - 'face', - 'ironic', - 'smile', - 'wry', - ], - }, - { - code: 'šŸ˜½', - keywords: [ - 'cat', - 'eye', - 'face', - 'kiss', - ], - }, - { - code: 'šŸ™€', - keywords: [ - 'cat', - 'face', - 'oh', - 'surprised', - 'weary', - ], - }, - { - code: 'šŸ˜æ', - keywords: [ - 'cat', - 'cry', - 'face', - 'sad', - 'tear', - ], - }, - { - code: 'šŸ˜¾', - keywords: [ - 'cat', - 'face', - 'pouting', - ], - }, - { - code: 'šŸ™ˆ', - keywords: [ - 'evil', - 'face', - 'forbidden', - 'gesture', - 'monkey', - 'no', - 'not', - 'prohibited', - 'see', - ], - }, - { - code: 'šŸ™‰', - keywords: [ - 'evil', - 'face', - 'forbidden', - 'gesture', - 'hear', - 'monkey', - 'no', - 'not', - 'prohibited', - ], - }, - { - code: 'šŸ™Š', - keywords: [ - 'evil', - 'face', - 'forbidden', - 'gesture', - 'monkey', - 'no', - 'not', - 'prohibited', - 'speak', - ], - }, - { - code: 'šŸ‘¦', - keywords: [ - 'boy', - ], - types: [ - 'šŸ‘¦šŸæ', - 'šŸ‘¦šŸ¾', - 'šŸ‘¦šŸ½', - 'šŸ‘¦šŸ¼', - 'šŸ‘¦šŸ»', - ], - }, - { - code: 'šŸ‘§', - keywords: [ - 'girl', - 'maiden', - 'virgin', - 'virgo', - 'zodiac', - ], - types: [ - 'šŸ‘§šŸæ', - 'šŸ‘§šŸ¾', - 'šŸ‘§šŸ½', - 'šŸ‘§šŸ¼', - 'šŸ‘§šŸ»', - ], - }, - { - code: 'šŸ‘Ø', - keywords: [ - 'man', - ], - types: [ - 'šŸ‘ØšŸæ', - 'šŸ‘ØšŸ¾', - 'šŸ‘ØšŸ½', - 'šŸ‘ØšŸ¼', - 'šŸ‘ØšŸ»', - ], - }, - { - code: 'šŸ‘©', - keywords: [ - 'woman', - ], - types: [ - 'šŸ‘©šŸæ', - 'šŸ‘©šŸ¾', - 'šŸ‘©šŸ½', - 'šŸ‘©šŸ¼', - 'šŸ‘©šŸ»', - ], - }, - { - code: 'šŸ‘“', - keywords: [ - 'man', - 'old', - ], - types: [ - 'šŸ‘“šŸæ', - 'šŸ‘“šŸ¾', - 'šŸ‘“šŸ½', - 'šŸ‘“šŸ¼', - 'šŸ‘“šŸ»', - ], - }, - { - code: 'šŸ‘µ', - keywords: [ - 'old', - 'woman', - ], - types: [ - 'šŸ‘µšŸæ', - 'šŸ‘µšŸ¾', - 'šŸ‘µšŸ½', - 'šŸ‘µšŸ¼', - 'šŸ‘µšŸ»', - ], - }, - { - code: 'šŸ‘¶', - keywords: [ - 'baby', - ], - types: [ - 'šŸ‘¶šŸæ', - 'šŸ‘¶šŸ¾', - 'šŸ‘¶šŸ½', - 'šŸ‘¶šŸ¼', - 'šŸ‘¶šŸ»', - ], - }, - { - code: 'šŸ‘¼', - keywords: [ - 'angel', - 'baby', - 'face', - 'fairy tale', - 'fantasy', - ], - types: [ - 'šŸ‘¼šŸæ', - 'šŸ‘¼šŸ¾', - 'šŸ‘¼šŸ½', - 'šŸ‘¼šŸ¼', - 'šŸ‘¼šŸ»', - ], - }, - { - code: 'šŸ‘±', - keywords: [ - 'blond', - ], - types: [ - 'šŸ‘±šŸæ', - 'šŸ‘±šŸ¾', - 'šŸ‘±šŸ½', - 'šŸ‘±šŸ¼', - 'šŸ‘±šŸ»', - ], - }, - { - code: 'šŸ‘®', - keywords: [ - 'cop', - 'officer', - 'police', - ], - types: [ - 'šŸ‘®šŸæ', - 'šŸ‘®šŸ¾', - 'šŸ‘®šŸ½', - 'šŸ‘®šŸ¼', - 'šŸ‘®šŸ»', - ], - }, - { - code: 'šŸ‘²', - keywords: [ - 'gua pi mao', - 'hat', - 'man', - ], - types: [ - 'šŸ‘²šŸæ', - 'šŸ‘²šŸ¾', - 'šŸ‘²šŸ½', - 'šŸ‘²šŸ¼', - 'šŸ‘²šŸ»', - ], - }, - { - code: 'šŸ‘³', - keywords: [ - 'man', - 'turban', - ], - types: [ - 'šŸ‘³šŸæ', - 'šŸ‘³šŸ¾', - 'šŸ‘³šŸ½', - 'šŸ‘³šŸ¼', - 'šŸ‘³šŸ»', - ], - }, - { - code: 'šŸ‘·', - keywords: [ - 'construction', - 'hat', - 'worker', - ], - types: [ - 'šŸ‘·šŸæ', - 'šŸ‘·šŸ¾', - 'šŸ‘·šŸ½', - 'šŸ‘·šŸ¼', - 'šŸ‘·šŸ»', - ], - }, - { - code: 'šŸ‘ø', - keywords: [ - 'fairy tale', - 'fantasy', - 'princess', - ], - types: [ - 'šŸ‘øšŸæ', - 'šŸ‘øšŸ¾', - 'šŸ‘øšŸ½', - 'šŸ‘øšŸ¼', - 'šŸ‘øšŸ»', - ], - }, - { - code: 'šŸ¤“', - keywords: [ - 'prince', - ], - types: [ - 'šŸ¤“šŸæ', - 'šŸ¤“šŸ¾', - 'šŸ¤“šŸ½', - 'šŸ¤“šŸ¼', - 'šŸ¤“šŸ»', - ], - }, - { - code: 'šŸ’‚', - keywords: [ - 'guard', - 'guardsman', - ], - types: [ - 'šŸ’‚šŸæ', - 'šŸ’‚šŸ¾', - 'šŸ’‚šŸ½', - 'šŸ’‚šŸ¼', - 'šŸ’‚šŸ»', - ], - }, - { - code: 'šŸ•µ', - keywords: [ - 'detective', - 'sleuth', - 'spy', - ], - types: [ - 'šŸ•µšŸæ', - 'šŸ•µšŸ¾', - 'šŸ•µšŸ½', - 'šŸ•µšŸ¼', - 'šŸ•µšŸ»', - ], - }, - { - code: 'šŸŽ…', - keywords: [ - 'activity', - 'celebration', - 'christmas', - 'fairy tale', - 'fantasy', - 'father', - 'santa', - ], - types: [ - 'šŸŽ…šŸæ', - 'šŸŽ…šŸ¾', - 'šŸŽ…šŸ½', - 'šŸŽ…šŸ¼', - 'šŸŽ…šŸ»', - ], - }, - { - code: 'šŸ¤¶', - keywords: [ - 'christmas', - 'mother', - 'mrs. claus', - ], - types: [ - 'šŸ¤¶šŸæ', - 'šŸ¤¶šŸ¾', - 'šŸ¤¶šŸ½', - 'šŸ¤¶šŸ¼', - 'šŸ¤¶šŸ»', - ], - }, - { - code: 'šŸ‘°', - keywords: [ - 'bride', - 'veil', - 'wedding', - ], - types: [ - 'šŸ‘°šŸæ', - 'šŸ‘°šŸ¾', - 'šŸ‘°šŸ½', - 'šŸ‘°šŸ¼', - 'šŸ‘°šŸ»', - ], - }, - { - code: 'šŸ¤µ', - keywords: [ - 'groom', - 'man', - 'tuxedo', - ], - types: [ - 'šŸ¤µšŸæ', - 'šŸ¤µšŸ¾', - 'šŸ¤µšŸ½', - 'šŸ¤µšŸ¼', - 'šŸ¤µšŸ»', - ], - }, - { - code: 'šŸ’†', - keywords: [ - 'massage', - 'salon', - ], - types: [ - 'šŸ’†šŸæ', - 'šŸ’†šŸ¾', - 'šŸ’†šŸ½', - 'šŸ’†šŸ¼', - 'šŸ’†šŸ»', - ], - }, - { - code: 'šŸ’‡', - keywords: [ - 'barber', - 'beauty', - 'haircut', - 'parlor', - ], - types: [ - 'šŸ’‡šŸæ', - 'šŸ’‡šŸ¾', - 'šŸ’‡šŸ½', - 'šŸ’‡šŸ¼', - 'šŸ’‡šŸ»', - ], - }, - { - code: 'šŸ™', - keywords: [ - 'frown', - 'gesture', - ], - types: [ - 'šŸ™šŸæ', - 'šŸ™šŸ¾', - 'šŸ™šŸ½', - 'šŸ™šŸ¼', - 'šŸ™šŸ»', - ], - }, - { - code: 'šŸ™Ž', - keywords: [ - 'gesture', - 'pouting', - ], - types: [ - 'šŸ™ŽšŸæ', - 'šŸ™ŽšŸ¾', - 'šŸ™ŽšŸ½', - 'šŸ™ŽšŸ¼', - 'šŸ™ŽšŸ»', - ], - }, - { - code: 'šŸ™…', - keywords: [ - 'forbidden', - 'gesture', - 'hand', - 'no', - 'not', - 'prohibited', - ], - types: [ - 'šŸ™…šŸæ', - 'šŸ™…šŸ¾', - 'šŸ™…šŸ½', - 'šŸ™…šŸ¼', - 'šŸ™…šŸ»', - ], - }, - { - code: 'šŸ™†', - keywords: [ - 'gesture', - 'hand', - 'ok', - ], - types: [ - 'šŸ™†šŸæ', - 'šŸ™†šŸ¾', - 'šŸ™†šŸ½', - 'šŸ™†šŸ¼', - 'šŸ™†šŸ»', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'hand', - 'help', - 'information', - 'sassy', - ], - types: [ - 'šŸ’šŸæ', - 'šŸ’šŸ¾', - 'šŸ’šŸ½', - 'šŸ’šŸ¼', - 'šŸ’šŸ»', - ], - }, - { - code: 'šŸ¤·', - keywords: [ - 'doubt', - 'ignorance', - 'indifference', - 'shrug', - ], - types: [ - 'šŸ¤·šŸæ', - 'šŸ¤·šŸ¾', - 'šŸ¤·šŸ½', - 'šŸ¤·šŸ¼', - 'šŸ¤·šŸ»', - ], - }, - { - code: 'šŸ™‹', - keywords: [ - 'gesture', - 'hand', - 'happy', - 'raised', - ], - types: [ - 'šŸ™‹šŸæ', - 'šŸ™‹šŸ¾', - 'šŸ™‹šŸ½', - 'šŸ™‹šŸ¼', - 'šŸ™‹šŸ»', - ], - }, - { - code: 'šŸ¤¦', - keywords: [ - 'disbelief', - 'exasperation', - 'face', - 'palm', - ], - types: [ - 'šŸ¤¦šŸæ', - 'šŸ¤¦šŸ¾', - 'šŸ¤¦šŸ½', - 'šŸ¤¦šŸ¼', - 'šŸ¤¦šŸ»', - ], - }, - { - code: 'šŸ™‡', - keywords: [ - 'apology', - 'bow', - 'gesture', - 'sorry', - ], - types: [ - 'šŸ™‡šŸæ', - 'šŸ™‡šŸ¾', - 'šŸ™‡šŸ½', - 'šŸ™‡šŸ¼', - 'šŸ™‡šŸ»', - ], - }, - { - code: 'šŸš¶', - keywords: [ - 'hike', - 'pedestrian', - 'walk', - 'walking', - ], - types: [ - 'šŸš¶šŸæ', - 'šŸš¶šŸ¾', - 'šŸš¶šŸ½', - 'šŸš¶šŸ¼', - 'šŸš¶šŸ»', - ], - }, - { - code: 'šŸƒ', - keywords: [ - 'marathon', - 'runner', - 'running', - ], - types: [ - 'šŸƒšŸæ', - 'šŸƒšŸ¾', - 'šŸƒšŸ½', - 'šŸƒšŸ¼', - 'šŸƒšŸ»', - ], - }, - { - code: 'šŸ’ƒ', - keywords: [ - 'dancer', - ], - types: [ - 'šŸ’ƒšŸæ', - 'šŸ’ƒšŸ¾', - 'šŸ’ƒšŸ½', - 'šŸ’ƒšŸ¼', - 'šŸ’ƒšŸ»', - ], - }, - { - code: 'šŸ•ŗ', - keywords: [ - 'dance', - 'man', - ], - types: [ - 'šŸ•ŗšŸæ', - 'šŸ•ŗšŸ¾', - 'šŸ•ŗšŸ½', - 'šŸ•ŗšŸ¼', - 'šŸ•ŗšŸ»', - ], - }, - { - code: 'šŸ¤°', - keywords: [ - 'pregnant', - 'woman', - ], - types: [ - 'šŸ¤°šŸæ', - 'šŸ¤°šŸ¾', - 'šŸ¤°šŸ½', - 'šŸ¤°šŸ¼', - 'šŸ¤°šŸ»', - ], - }, - { - code: 'šŸ‘Æ', - keywords: [ - 'bunny', - 'dancer', - 'ear', - 'girl', - 'woman', - ], - }, - { - code: 'šŸ•“', - keywords: [ - 'business', - 'man', - 'suit', - ], - }, - { - code: 'šŸ—£', - keywords: [ - 'face', - 'head', - 'silhouette', - 'speak', - 'speaking', - ], - }, - { - code: 'šŸ‘¤', - keywords: [ - 'bust', - 'silhouette', - ], - }, - { - code: 'šŸ‘„', - keywords: [ - 'bust', - 'silhouette', - ], - }, - { - code: 'šŸ‘«', - keywords: [ - 'couple', - 'hand', - 'hold', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘¬', - keywords: [ - 'couple', - 'gemini', - 'hand', - 'hold', - 'man', - 'twins', - 'zodiac', - ], - }, - { - code: 'šŸ‘­', - keywords: [ - 'couple', - 'hand', - 'hold', - 'woman', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'couple', - 'kiss', - 'romance', - ], - }, - { - code: 'šŸ‘©ā€ā¤ļøā€šŸ’‹ā€šŸ‘Ø', - keywords: [ - 'kiss', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘Øā€ā¤ļøā€šŸ’‹ā€šŸ‘Ø', - keywords: [ - 'kiss', - 'man', - ], - }, - { - code: 'šŸ‘©ā€ā¤ļøā€šŸ’‹ā€šŸ‘©', - keywords: [ - 'kiss', - 'woman', - ], - }, - { - code: 'šŸ’‘', - keywords: [ - 'couple', - 'heart', - 'love', - 'romance', - ], - }, - { - code: 'šŸ‘©ā€ā¤ļøā€šŸ‘Ø', - keywords: [ - 'couple', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘Øā€ā¤ļøā€šŸ‘Ø', - keywords: [ - 'couple', - 'man', - ], - }, - { - code: 'šŸ‘©ā€ā¤ļøā€šŸ‘©', - keywords: [ - 'couple', - 'woman', - ], - }, - { - code: 'šŸ‘Ŗ', - keywords: [ - 'child', - 'family', - 'father', - 'mother', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘§', - keywords: [ - 'family', - 'girl', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘§ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'girl', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘¦ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘§ā€šŸ‘§', - keywords: [ - 'family', - 'girl', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'man', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘§', - keywords: [ - 'family', - 'girl', - 'man', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘§ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'girl', - 'man', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘¦ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'man', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘§ā€šŸ‘§', - keywords: [ - 'family', - 'girl', - 'man', - ], - }, - { - code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'woman', - ], - }, - { - code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘§', - keywords: [ - 'family', - 'girl', - 'woman', - ], - }, - { - code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘§ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'girl', - 'woman', - ], - }, - { - code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘¦ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'woman', - ], - }, - { - code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘§ā€šŸ‘§', - keywords: [ - 'family', - 'girl', - 'woman', - ], - }, - { - code: 'šŸ»', - keywords: [ - 'emoji modifier', - 'fitzpatrick', - 'skin', - 'tone', - ], - }, - { - code: 'šŸ¼', - keywords: [ - 'emoji modifier', - 'fitzpatrick', - 'skin', - 'tone', - ], - }, - { - code: 'šŸ½', - keywords: [ - 'emoji modifier', - 'fitzpatrick', - 'skin', - 'tone', - ], - }, - { - code: 'šŸ¾', - keywords: [ - 'emoji modifier', - 'fitzpatrick', - 'skin', - 'tone', - ], - }, - { - code: 'šŸæ', - keywords: [ - 'emoji modifier', - 'fitzpatrick', - 'skin', - 'tone', - ], - }, - { - code: 'šŸ’Ŗ', - keywords: [ - 'biceps', - 'body', - 'comic', - 'flex', - 'muscle', - ], - types: [ - 'šŸ’ŖšŸæ', - 'šŸ’ŖšŸ¾', - 'šŸ’ŖšŸ½', - 'šŸ’ŖšŸ¼', - 'šŸ’ŖšŸ»', - ], - }, - { - code: 'šŸ¤³', - keywords: [ - 'camera', - 'phone', - 'selfie', - ], - types: [ - 'šŸ¤³šŸæ', - 'šŸ¤³šŸ¾', - 'šŸ¤³šŸ½', - 'šŸ¤³šŸ¼', - 'šŸ¤³šŸ»', - ], - }, - { - code: 'šŸ‘ˆ', - keywords: [ - 'backhand', - 'body', - 'finger', - 'hand', - 'index', - 'point', - ], - types: [ - 'šŸ‘ˆšŸæ', - 'šŸ‘ˆšŸ¾', - 'šŸ‘ˆšŸ½', - 'šŸ‘ˆšŸ¼', - 'šŸ‘ˆšŸ»', - ], - }, - { - code: 'šŸ‘‰', - keywords: [ - 'backhand', - 'body', - 'finger', - 'hand', - 'index', - 'point', - ], - types: [ - 'šŸ‘‰šŸæ', - 'šŸ‘‰šŸ¾', - 'šŸ‘‰šŸ½', - 'šŸ‘‰šŸ¼', - 'šŸ‘‰šŸ»', - ], - }, - { - code: 'ā˜', - keywords: [ - 'body', - 'finger', - 'hand', - 'index', - 'point', - 'up', - ], - types: [ - 'ā˜šŸæ', - 'ā˜šŸ¾', - 'ā˜šŸ½', - 'ā˜šŸ¼', - 'ā˜šŸ»', - ], - }, - { - code: 'šŸ‘†', - keywords: [ - 'backhand', - 'body', - 'finger', - 'hand', - 'index', - 'point', - 'up', - ], - types: [ - 'šŸ‘†šŸæ', - 'šŸ‘†šŸ¾', - 'šŸ‘†šŸ½', - 'šŸ‘†šŸ¼', - 'šŸ‘†šŸ»', - ], - }, - { - code: 'šŸ–•', - keywords: [ - 'body', - 'finger', - 'hand', - 'middle finger', - ], - types: [ - 'šŸ–•šŸæ', - 'šŸ–•šŸ¾', - 'šŸ–•šŸ½', - 'šŸ–•šŸ¼', - 'šŸ–•šŸ»', - ], - }, - { - code: 'šŸ‘‡', - keywords: [ - 'backhand', - 'body', - 'down', - 'finger', - 'hand', - 'index', - 'point', - ], - types: [ - 'šŸ‘‡šŸæ', - 'šŸ‘‡šŸ¾', - 'šŸ‘‡šŸ½', - 'šŸ‘‡šŸ¼', - 'šŸ‘‡šŸ»', - ], - }, - { - code: 'āœŒ', - keywords: [ - 'body', - 'hand', - 'v', - 'victory', - ], - types: [ - 'āœŒšŸæ', - 'āœŒšŸ¾', - 'āœŒšŸ½', - 'āœŒšŸ¼', - 'āœŒšŸ»', - ], - }, - { - code: 'šŸ¤ž', - keywords: [ - 'cross', - 'finger', - 'hand', - 'luck', - ], - types: [ - 'šŸ¤žšŸæ', - 'šŸ¤žšŸ¾', - 'šŸ¤žšŸ½', - 'šŸ¤žšŸ¼', - 'šŸ¤žšŸ»', - ], - }, - { - code: 'šŸ––', - keywords: [ - 'body', - 'finger', - 'hand', - 'spock', - 'vulcan', - ], - types: [ - 'šŸ––šŸæ', - 'šŸ––šŸ¾', - 'šŸ––šŸ½', - 'šŸ––šŸ¼', - 'šŸ––šŸ»', - ], - }, - { - code: 'šŸ¤˜', - keywords: [ - 'body', - 'finger', - 'hand', - 'horns', - 'rock-on', - ], - types: [ - 'šŸ¤˜šŸæ', - 'šŸ¤˜šŸ¾', - 'šŸ¤˜šŸ½', - 'šŸ¤˜šŸ¼', - 'šŸ¤˜šŸ»', - ], - }, - { - code: 'šŸ¤™', - keywords: [ - 'call', - 'hand', - ], - types: [ - 'šŸ¤™šŸæ', - 'šŸ¤™šŸ¾', - 'šŸ¤™šŸ½', - 'šŸ¤™šŸ¼', - 'šŸ¤™šŸ»', - ], - }, - { - code: 'šŸ–', - keywords: [ - 'body', - 'finger', - 'hand', - 'splayed', - ], - types: [ - 'šŸ–šŸæ', - 'šŸ–šŸ¾', - 'šŸ–šŸ½', - 'šŸ–šŸ¼', - 'šŸ–šŸ»', - ], - }, - { - code: 'āœ‹', - keywords: [ - 'body', - 'hand', - ], - types: [ - 'āœ‹šŸæ', - 'āœ‹šŸ¾', - 'āœ‹šŸ½', - 'āœ‹šŸ¼', - 'āœ‹šŸ»', - ], - }, - { - code: 'šŸ‘Œ', - keywords: [ - 'body', - 'hand', - 'ok', - ], - types: [ - 'šŸ‘ŒšŸæ', - 'šŸ‘ŒšŸ¾', - 'šŸ‘ŒšŸ½', - 'šŸ‘ŒšŸ¼', - 'šŸ‘ŒšŸ»', - ], - }, - { - code: 'šŸ‘', - keywords: [ - '+1', - 'body', - 'hand', - 'thumb', - 'thumbs up', - 'up', - ], - types: [ - 'šŸ‘šŸæ', - 'šŸ‘šŸ¾', - 'šŸ‘šŸ½', - 'šŸ‘šŸ¼', - 'šŸ‘šŸ»', - ], - }, - { - code: 'šŸ‘Ž', - keywords: [ - '-1', - 'body', - 'down', - 'hand', - 'thumb', - 'thumbs down', - ], - types: [ - 'šŸ‘ŽšŸæ', - 'šŸ‘ŽšŸ¾', - 'šŸ‘ŽšŸ½', - 'šŸ‘ŽšŸ¼', - 'šŸ‘ŽšŸ»', - ], - }, - { - code: 'āœŠ', - keywords: [ - 'body', - 'clenched', - 'fist', - 'hand', - 'punch', - ], - types: [ - 'āœŠšŸæ', - 'āœŠšŸ¾', - 'āœŠšŸ½', - 'āœŠšŸ¼', - 'āœŠšŸ»', - ], - }, - { - code: 'šŸ‘Š', - keywords: [ - 'body', - 'clenched', - 'fist', - 'hand', - 'punch', - ], - types: [ - 'šŸ‘ŠšŸæ', - 'šŸ‘ŠšŸ¾', - 'šŸ‘ŠšŸ½', - 'šŸ‘ŠšŸ¼', - 'šŸ‘ŠšŸ»', - ], - }, - { - code: 'šŸ¤›', - keywords: [ - 'fist', - 'leftwards', - ], - types: [ - 'šŸ¤›šŸæ', - 'šŸ¤›šŸ¾', - 'šŸ¤›šŸ½', - 'šŸ¤›šŸ¼', - 'šŸ¤›šŸ»', - ], - }, - { - code: 'šŸ¤œ', - keywords: [ - 'fist', - 'rightwards', - ], - types: [ - 'šŸ¤œšŸæ', - 'šŸ¤œšŸ¾', - 'šŸ¤œšŸ½', - 'šŸ¤œšŸ¼', - 'šŸ¤œšŸ»', - ], - }, - { - code: 'šŸ¤š', - keywords: [ - 'backhand', - 'raised', - ], - types: [ - 'šŸ¤ššŸæ', - 'šŸ¤ššŸ¾', - 'šŸ¤ššŸ½', - 'šŸ¤ššŸ¼', - 'šŸ¤ššŸ»', - ], - }, - { - code: 'šŸ‘‹', - keywords: [ - 'body', - 'hand', - 'wave', - 'waving', - ], - types: [ - 'šŸ‘‹šŸæ', - 'šŸ‘‹šŸ¾', - 'šŸ‘‹šŸ½', - 'šŸ‘‹šŸ¼', - 'šŸ‘‹šŸ»', - ], - }, - { - code: 'šŸ‘', - keywords: [ - 'body', - 'clap', - 'hand', - ], - types: [ - 'šŸ‘šŸæ', - 'šŸ‘šŸ¾', - 'šŸ‘šŸ½', - 'šŸ‘šŸ¼', - 'šŸ‘šŸ»', - ], - }, - { - code: 'āœ', - keywords: [ - 'body', - 'hand', - 'write', - ], - types: [ - 'āœšŸæ', - 'āœšŸ¾', - 'āœšŸ½', - 'āœšŸ¼', - 'āœšŸ»', - ], - }, - { - code: 'šŸ‘', - keywords: [ - 'body', - 'hand', - 'open', - ], - types: [ - 'šŸ‘šŸæ', - 'šŸ‘šŸ¾', - 'šŸ‘šŸ½', - 'šŸ‘šŸ¼', - 'šŸ‘šŸ»', - ], - }, - { - code: 'šŸ™Œ', - keywords: [ - 'body', - 'celebration', - 'gesture', - 'hand', - 'hooray', - 'raised', - ], - types: [ - 'šŸ™ŒšŸæ', - 'šŸ™ŒšŸ¾', - 'šŸ™ŒšŸ½', - 'šŸ™ŒšŸ¼', - 'šŸ™ŒšŸ»', - ], - }, - { - code: 'šŸ™', - keywords: [ - 'ask', - 'body', - 'bow', - 'folded', - 'gesture', - 'hand', - 'please', - 'pray', - 'thanks', - ], - types: [ - 'šŸ™šŸæ', - 'šŸ™šŸ¾', - 'šŸ™šŸ½', - 'šŸ™šŸ¼', - 'šŸ™šŸ»', - ], - }, - { - code: 'šŸ¤', - keywords: [ - 'agreement', - 'hand', - 'handshake', - 'meeting', - 'shake', - ], - types: [ - 'šŸ¤šŸæ', - 'šŸ¤šŸ¾', - 'šŸ¤šŸ½', - 'šŸ¤šŸ¼', - 'šŸ¤šŸ»', - ], - }, - { - code: 'šŸ’…', - keywords: [ - 'body', - 'care', - 'cosmetics', - 'manicure', - 'nail', - 'polish', - ], - types: [ - 'šŸ’…šŸæ', - 'šŸ’…šŸ¾', - 'šŸ’…šŸ½', - 'šŸ’…šŸ¼', - 'šŸ’…šŸ»', - ], - }, - { - code: 'šŸ‘‚', - keywords: [ - 'body', - 'ear', - ], - types: [ - 'šŸ‘‚šŸæ', - 'šŸ‘‚šŸ¾', - 'šŸ‘‚šŸ½', - 'šŸ‘‚šŸ¼', - 'šŸ‘‚šŸ»', - ], - }, - { - code: 'šŸ‘ƒ', - keywords: [ - 'body', - 'nose', - ], - types: [ - 'šŸ‘ƒšŸæ', - 'šŸ‘ƒšŸ¾', - 'šŸ‘ƒšŸ½', - 'šŸ‘ƒšŸ¼', - 'šŸ‘ƒšŸ»', - ], - }, - { - code: 'šŸ‘£', - keywords: [ - 'body', - 'clothing', - 'footprint', - 'print', - ], - }, - { - code: 'šŸ‘€', - keywords: [ - 'body', - 'eye', - 'face', - ], - }, - { - code: 'šŸ‘', - keywords: [ - 'body', - 'eye', - ], - }, - { - code: 'šŸ‘ā€šŸ—Ø', - keywords: [ - 'bubble', - 'eye', - 'speech', - 'witness', - ], - }, - { - code: 'šŸ‘…', - keywords: [ - 'body', - 'tongue', - ], - }, - { - code: 'šŸ‘„', - keywords: [ - 'body', - 'lips', - 'mouth', - ], - }, - { - code: 'šŸ’‹', - keywords: [ - 'heart', - 'kiss', - 'lips', - 'mark', - 'romance', - ], - }, - { - code: 'šŸ’˜', - keywords: [ - 'arrow', - 'cupid', - 'heart', - 'romance', - ], - }, - { - code: 'ā¤', - keywords: [ - 'heart', - ], - }, - { - code: 'šŸ’“', - keywords: [ - 'beating', - 'heart', - 'heartbeat', - 'pulsating', - ], - }, - { - code: 'šŸ’”', - keywords: [ - 'break', - 'broken', - 'heart', - ], - }, - { - code: 'šŸ’•', - keywords: [ - 'heart', - 'love', - ], - }, - { - code: 'šŸ’–', - keywords: [ - 'excited', - 'heart', - 'sparkle', - ], - }, - { - code: 'šŸ’—', - keywords: [ - 'excited', - 'growing', - 'heart', - 'heartpulse', - 'nervous', - ], - }, - { - code: 'šŸ’™', - keywords: [ - 'blue', - 'heart', - ], - }, - { - code: 'šŸ’š', - keywords: [ - 'green', - 'heart', - ], - }, - { - code: 'šŸ’›', - keywords: [ - 'heart', - 'yellow', - ], - }, - { - code: 'šŸ’œ', - keywords: [ - 'heart', - 'purple', - ], - }, - { - code: 'šŸ–¤', - keywords: [ - 'black', - 'evil', - 'heart', - 'wicked', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'heart', - 'ribbon', - 'valentine', - ], - }, - { - code: 'šŸ’ž', - keywords: [ - 'heart', - 'revolving', - ], - }, - { - code: 'šŸ’Ÿ', - keywords: [ - 'heart', - ], - }, - { - code: 'ā£', - keywords: [ - 'exclamation', - 'heart', - 'mark', - 'punctuation', - ], - }, - { - code: 'šŸ’Œ', - keywords: [ - 'heart', - 'letter', - 'love', - 'mail', - 'romance', - ], - }, - { - code: 'šŸ’¤', - keywords: [ - 'comic', - 'sleep', - 'zzz', - ], - }, - { - code: 'šŸ’¢', - keywords: [ - 'angry', - 'comic', - 'mad', - ], - }, - { - code: 'šŸ’£', - keywords: [ - 'bomb', - 'comic', - ], - }, - { - code: 'šŸ’„', - keywords: [ - 'boom', - 'collision', - 'comic', - ], - }, - { - code: 'šŸ’¦', - keywords: [ - 'comic', - 'splashing', - 'sweat', - ], - }, - { - code: 'šŸ’Ø', - keywords: [ - 'comic', - 'dash', - 'running', - ], - }, - { - code: 'šŸ’«', - keywords: [ - 'comic', - 'dizzy', - 'star', - ], - }, - { - code: 'šŸ’¬', - keywords: [ - 'balloon', - 'bubble', - 'comic', - 'dialog', - 'speech', - ], - }, - { - code: 'šŸ—Ø', - keywords: [ - 'dialog', - 'speech', - ], - }, - { - code: 'šŸ—Æ', - keywords: [ - 'angry', - 'balloon', - 'bubble', - 'mad', - ], - }, - { - code: 'šŸ’­', - keywords: [ - 'balloon', - 'bubble', - 'comic', - 'thought', - ], - }, - { - code: 'šŸ•³', - keywords: [ - 'hole', - ], - }, - { - code: 'šŸ‘“', - keywords: [ - 'clothing', - 'eye', - 'eyeglasses', - 'eyewear', - 'glasses', - ], - }, - { - code: 'šŸ•¶', - keywords: [ - 'dark', - 'eye', - 'eyewear', - 'glasses', - 'sunglasses', - ], - }, - { - code: 'šŸ‘”', - keywords: [ - 'clothing', - 'necktie', - ], - }, - { - code: 'šŸ‘•', - keywords: [ - 'clothing', - 'shirt', - 'tshirt', - ], - }, - { - code: 'šŸ‘–', - keywords: [ - 'clothing', - 'jeans', - 'pants', - 'trousers', - ], - }, - { - code: 'šŸ‘—', - keywords: [ - 'clothing', - 'dress', - ], - }, - { - code: 'šŸ‘˜', - keywords: [ - 'clothing', - 'kimono', - ], - }, - { - code: 'šŸ‘™', - keywords: [ - 'bikini', - 'clothing', - 'swim', - ], - }, - { - code: 'šŸ‘š', - keywords: [ - 'clothing', - 'woman', - ], - }, - { - code: 'šŸ‘›', - keywords: [ - 'clothing', - 'coin', - 'purse', - ], - }, - { - code: 'šŸ‘œ', - keywords: [ - 'bag', - 'clothing', - 'handbag', - ], - }, - { - code: 'šŸ‘', - keywords: [ - 'bag', - 'clothing', - 'pouch', - ], - }, - { - code: 'šŸ›', - keywords: [ - 'bag', - 'hotel', - 'shopping', - ], - }, - { - code: 'šŸŽ’', - keywords: [ - 'activity', - 'bag', - 'satchel', - 'school', - ], - }, - { - code: 'šŸ‘ž', - keywords: [ - 'clothing', - 'man', - 'shoe', - ], - }, - { - code: 'šŸ‘Ÿ', - keywords: [ - 'athletic', - 'clothing', - 'shoe', - 'sneaker', - ], - }, - { - code: 'šŸ‘ ', - keywords: [ - 'clothing', - 'heel', - 'shoe', - 'woman', - ], - }, - { - code: 'šŸ‘”', - keywords: [ - 'clothing', - 'sandal', - 'shoe', - 'woman', - ], - }, - { - code: 'šŸ‘¢', - keywords: [ - 'boot', - 'clothing', - 'shoe', - 'woman', - ], - }, - { - code: 'šŸ‘‘', - keywords: [ - 'clothing', - 'crown', - 'king', - 'queen', - ], - }, - { - code: 'šŸ‘’', - keywords: [ - 'clothing', - 'hat', - 'woman', - ], - }, - { - code: 'šŸŽ©', - keywords: [ - 'activity', - 'clothing', - 'entertainment', - 'hat', - 'top', - 'tophat', - ], - }, - { - code: 'šŸŽ“', - keywords: [ - 'activity', - 'cap', - 'celebration', - 'clothing', - 'graduation', - 'hat', - ], - }, - { - code: 'ā›‘', - keywords: [ - 'aid', - 'cross', - 'face', - 'hat', - 'helmet', - ], - }, - { - code: 'šŸ“æ', - keywords: [ - 'beads', - 'clothing', - 'necklace', - 'prayer', - 'religion', - ], - }, - { - code: 'šŸ’„', - keywords: [ - 'cosmetics', - 'lipstick', - 'makeup', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'diamond', - 'ring', - 'romance', - ], - }, - { - code: 'šŸ’Ž', - keywords: [ - 'diamond', - 'gem', - 'jewel', - 'romance', - ], - }, - ], - 'Animals & Nature': [ - { - code: 'šŸµ', - keywords: [ - 'face', - 'monkey', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'monkey', - ], - }, - { - code: 'šŸ¦', - keywords: [ - 'gorilla', - ], - }, - { - code: 'šŸ¶', - keywords: [ - 'dog', - 'face', - 'pet', - ], - }, - { - code: 'šŸ•', - keywords: [ - 'dog', - 'pet', - ], - }, - { - code: 'šŸ©', - keywords: [ - 'dog', - 'poodle', - ], - }, - { - code: 'šŸŗ', - keywords: [ - 'face', - 'wolf', - ], - }, - { - code: 'šŸ¦Š', - keywords: [ - 'face', - 'fox', - ], - }, - { - code: 'šŸ±', - keywords: [ - 'cat', - 'face', - 'pet', - ], - }, - { - code: 'šŸˆ', - keywords: [ - 'cat', - 'pet', - ], - }, - { - code: 'šŸ¦', - keywords: [ - 'face', - 'leo', - 'lion', - 'zodiac', - ], - }, - { - code: 'šŸÆ', - keywords: [ - 'face', - 'tiger', - ], - }, - { - code: 'šŸ…', - keywords: [ - 'tiger', - ], - }, - { - code: 'šŸ†', - keywords: [ - 'leopard', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'face', - 'horse', - ], - }, - { - code: 'šŸŽ', - keywords: [ - 'horse', - 'racehorse', - 'racing', - ], - }, - { - code: 'šŸ¦Œ', - keywords: [ - 'deer', - ], - }, - { - code: 'šŸ¦„', - keywords: [ - 'face', - 'unicorn', - ], - }, - { - code: 'šŸ®', - keywords: [ - 'cow', - 'face', - ], - }, - { - code: 'šŸ‚', - keywords: [ - 'bull', - 'ox', - 'taurus', - 'zodiac', - ], - }, - { - code: 'šŸƒ', - keywords: [ - 'buffalo', - 'water', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'cow', - ], - }, - { - code: 'šŸ·', - keywords: [ - 'face', - 'pig', - ], - }, - { - code: 'šŸ–', - keywords: [ - 'pig', - 'sow', - ], - }, - { - code: 'šŸ—', - keywords: [ - 'boar', - 'pig', - ], - }, - { - code: 'šŸ½', - keywords: [ - 'face', - 'nose', - 'pig', - ], - }, - { - code: 'šŸ', - keywords: [ - 'aries', - 'ram', - 'sheep', - 'zodiac', - ], - }, - { - code: 'šŸ‘', - keywords: [ - 'ewe', - 'sheep', - ], - }, - { - code: 'šŸ', - keywords: [ - 'capricorn', - 'goat', - 'zodiac', - ], - }, - { - code: 'šŸŖ', - keywords: [ - 'camel', - 'dromedary', - 'hump', - ], - }, - { - code: 'šŸ«', - keywords: [ - 'bactrian', - 'camel', - 'hump', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'elephant', - ], - }, - { - code: 'šŸ¦', - keywords: [ - 'rhinoceros', - ], - }, - { - code: 'šŸ­', - keywords: [ - 'face', - 'mouse', - ], - }, - { - code: 'šŸ', - keywords: [ - 'mouse', - ], - }, - { - code: 'šŸ€', - keywords: [ - 'rat', - ], - }, - { - code: 'šŸ¹', - keywords: [ - 'face', - 'hamster', - 'pet', - ], - }, - { - code: 'šŸ°', - keywords: [ - 'bunny', - 'face', - 'pet', - 'rabbit', - ], - }, - { - code: 'šŸ‡', - keywords: [ - 'bunny', - 'pet', - 'rabbit', - ], - }, - { - code: 'šŸæ', - keywords: [ - 'chipmunk', - ], - }, - { - code: 'šŸ¦‡', - keywords: [ - 'bat', - 'vampire', - ], - }, - { - code: 'šŸ»', - keywords: [ - 'bear', - 'face', - ], - }, - { - code: 'šŸØ', - keywords: [ - 'bear', - 'koala', - ], - }, - { - code: 'šŸ¼', - keywords: [ - 'face', - 'panda', - ], - }, - { - code: 'šŸ¾', - keywords: [ - 'feet', - 'paw', - 'print', - ], - }, - { - code: 'šŸ¦ƒ', - keywords: [ - 'turkey', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'chicken', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'rooster', - ], - }, - { - code: 'šŸ£', - keywords: [ - 'baby', - 'chick', - 'hatching', - ], - }, - { - code: 'šŸ¤', - keywords: [ - 'baby', - 'chick', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'baby', - 'chick', - ], - }, - { - code: 'šŸ¦', - keywords: [ - 'bird', - ], - }, - { - code: 'šŸ§', - keywords: [ - 'penguin', - ], - }, - { - code: 'šŸ•Š', - keywords: [ - 'bird', - 'dove', - 'fly', - 'peace', - ], - }, - { - code: 'šŸ¦…', - keywords: [ - 'bird', - 'eagle', - ], - }, - { - code: 'šŸ¦†', - keywords: [ - 'bird', - 'duck', - ], - }, - { - code: 'šŸ¦‰', - keywords: [ - 'bird', - 'owl', - 'wise', - ], - }, - { - code: 'šŸø', - keywords: [ - 'face', - 'frog', - ], - }, - { - code: 'šŸŠ', - keywords: [ - 'crocodile', - ], - }, - { - code: 'šŸ¢', - keywords: [ - 'turtle', - ], - }, - { - code: 'šŸ¦Ž', - keywords: [ - 'lizard', - 'reptile', - ], - }, - { - code: 'šŸ', - keywords: [ - 'bearer', - 'ophiuchus', - 'serpent', - 'snake', - 'zodiac', - ], - }, - { - code: 'šŸ²', - keywords: [ - 'dragon', - 'face', - 'fairy tale', - ], - }, - { - code: 'šŸ‰', - keywords: [ - 'dragon', - 'fairy tale', - ], - }, - { - code: 'šŸ³', - keywords: [ - 'face', - 'spouting', - 'whale', - ], - }, - { - code: 'šŸ‹', - keywords: [ - 'whale', - ], - }, - { - code: 'šŸ¬', - keywords: [ - 'dolphin', - 'flipper', - ], - }, - { - code: 'šŸŸ', - keywords: [ - 'fish', - 'pisces', - 'zodiac', - ], - }, - { - code: 'šŸ ', - keywords: [ - 'fish', - 'tropical', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'blowfish', - 'fish', - ], - }, - { - code: 'šŸ¦ˆ', - keywords: [ - 'fish', - 'shark', - ], - }, - { - code: 'šŸ™', - keywords: [ - 'octopus', - ], - }, - { - code: 'šŸš', - keywords: [ - 'shell', - 'spiral', - ], - }, - { - code: 'šŸ¦€', - keywords: [ - 'cancer', - 'crab', - 'zodiac', - ], - }, - { - code: 'šŸ¦', - keywords: [ - 'shellfish', - 'shrimp', - 'small', - ], - }, - { - code: 'šŸ¦‘', - keywords: [ - 'molusc', - 'squid', - ], - }, - { - code: 'šŸ¦‹', - keywords: [ - 'butterfly', - 'insect', - 'pretty', - ], - }, - { - code: 'šŸŒ', - keywords: [ - 'snail', - ], - }, - { - code: 'šŸ›', - keywords: [ - 'bug', - 'insect', - ], - }, - { - code: 'šŸœ', - keywords: [ - 'ant', - 'insect', - ], - }, - { - code: 'šŸ', - keywords: [ - 'bee', - 'honeybee', - 'insect', - ], - }, - { - code: 'šŸž', - keywords: [ - 'beetle', - 'insect', - 'lady beetle', - 'ladybird', - 'ladybug', - ], - }, - { - code: 'šŸ•·', - keywords: [ - 'insect', - 'spider', - ], - }, - { - code: 'šŸ•ø', - keywords: [ - 'spider', - 'web', - ], - }, - { - code: 'šŸ¦‚', - keywords: [ - 'scorpio', - 'scorpion', - 'scorpius', - 'zodiac', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'bouquet', - 'flower', - 'plant', - 'romance', - ], - }, - { - code: 'šŸŒø', - keywords: [ - 'blossom', - 'cherry', - 'flower', - 'plant', - ], - }, - { - code: 'šŸ’®', - keywords: [ - 'flower', - ], - }, - { - code: 'šŸµ', - keywords: [ - 'plant', - 'rosette', - ], - }, - { - code: 'šŸŒ¹', - keywords: [ - 'flower', - 'plant', - 'rose', - ], - }, - { - code: 'šŸ„€', - keywords: [ - 'flower', - 'wilted', - ], - }, - { - code: 'šŸŒŗ', - keywords: [ - 'flower', - 'hibiscus', - 'plant', - ], - }, - { - code: 'šŸŒ»', - keywords: [ - 'flower', - 'plant', - 'sun', - 'sunflower', - ], - }, - { - code: 'šŸŒ¼', - keywords: [ - 'blossom', - 'flower', - 'plant', - ], - }, - { - code: 'šŸŒ·', - keywords: [ - 'flower', - 'plant', - 'tulip', - ], - }, - { - code: 'šŸŒ±', - keywords: [ - 'plant', - 'seedling', - 'young', - ], - }, - { - code: 'šŸŒ²', - keywords: [ - 'evergreen', - 'plant', - 'tree', - ], - }, - { - code: 'šŸŒ³', - keywords: [ - 'deciduous', - 'plant', - 'shedding', - 'tree', - ], - }, - { - code: 'šŸŒ“', - keywords: [ - 'palm', - 'plant', - 'tree', - ], - }, - { - code: 'šŸŒµ', - keywords: [ - 'cactus', - 'plant', - ], - }, - { - code: 'šŸŒ¾', - keywords: [ - 'ear', - 'plant', - 'rice', - ], - }, - { - code: 'šŸŒæ', - keywords: [ - 'herb', - 'leaf', - 'plant', - ], - }, - { - code: 'ā˜˜', - keywords: [ - 'plant', - 'shamrock', - ], - }, - { - code: 'šŸ€', - keywords: [ - '4', - 'clover', - 'four', - 'leaf', - 'plant', - ], - }, - { - code: 'šŸ', - keywords: [ - 'falling', - 'leaf', - 'maple', - 'plant', - ], - }, - { - code: 'šŸ‚', - keywords: [ - 'falling', - 'leaf', - 'plant', - ], - }, - { - code: 'šŸƒ', - keywords: [ - 'blow', - 'flutter', - 'leaf', - 'plant', - 'wind', - ], - }, - { - code: 'šŸ‡', - keywords: [ - 'fruit', - 'grape', - 'plant', - ], - }, - { - code: 'šŸˆ', - keywords: [ - 'fruit', - 'melon', - 'plant', - ], - }, - { - code: 'šŸ‰', - keywords: [ - 'fruit', - 'plant', - 'watermelon', - ], - }, - { - code: 'šŸŠ', - keywords: [ - 'fruit', - 'orange', - 'plant', - 'tangerine', - ], - }, - { - code: 'šŸ‹', - keywords: [ - 'citrus', - 'fruit', - 'lemon', - 'plant', - ], - }, - { - code: 'šŸŒ', - keywords: [ - 'banana', - 'fruit', - 'plant', - ], - }, - { - code: 'šŸ', - keywords: [ - 'fruit', - 'pineapple', - 'plant', - ], - }, - { - code: 'šŸŽ', - keywords: [ - 'apple', - 'fruit', - 'plant', - 'red', - ], - }, - { - code: 'šŸ', - keywords: [ - 'apple', - 'fruit', - 'green', - 'plant', - ], - }, - { - code: 'šŸ', - keywords: [ - 'fruit', - 'pear', - 'plant', - ], - }, - { - code: 'šŸ‘', - keywords: [ - 'fruit', - 'peach', - 'plant', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'cherry', - 'fruit', - 'plant', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'berry', - 'fruit', - 'plant', - 'strawberry', - ], - }, - { - code: 'šŸ…', - keywords: [ - 'plant', - 'tomato', - 'vegetable', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'fruit', - 'kiwi', - ], - }, - { - code: 'šŸ„‘', - keywords: [ - 'avocado', - 'fruit', - ], - }, - { - code: 'šŸ†', - keywords: [ - 'aubergine', - 'eggplant', - 'plant', - 'vegetable', - ], - }, - { - code: 'šŸ„”', - keywords: [ - 'potato', - 'vegetable', - ], - }, - { - code: 'šŸ„•', - keywords: [ - 'carrot', - 'vegetable', - ], - }, - { - code: 'šŸŒ½', - keywords: [ - 'corn', - 'ear', - 'maize', - 'maze', - 'plant', - ], - }, - { - code: 'šŸŒ¶', - keywords: [ - 'hot', - 'pepper', - 'plant', - ], - }, - { - code: 'šŸ„’', - keywords: [ - 'cucumber', - 'pickle', - 'vegetable', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'mushroom', - 'plant', - ], - }, - { - code: 'šŸ„œ', - keywords: [ - 'nut', - 'peanut', - 'vegetable', - ], - }, - { - code: 'šŸŒ°', - keywords: [ - 'chestnut', - 'plant', - ], - }, - { - code: 'šŸž', - keywords: [ - 'bread', - 'loaf', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'bread', - 'crescent roll', - 'croissant', - 'french', - ], - }, - { - code: 'šŸ„–', - keywords: [ - 'baguette', - 'bread', - 'french', - ], - }, - { - code: 'šŸ„ž', - keywords: [ - 'crĆŖpe', - 'hotcake', - 'pancake', - ], - }, - { - code: 'šŸ§€', - keywords: [ - 'cheese', - ], - }, - { - code: 'šŸ–', - keywords: [ - 'bone', - 'meat', - ], - }, - { - code: 'šŸ—', - keywords: [ - 'bone', - 'chicken', - 'leg', - 'poultry', - ], - }, - { - code: 'šŸ„“', - keywords: [ - 'bacon', - 'meat', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'burger', - 'hamburger', - ], - }, - { - code: 'šŸŸ', - keywords: [ - 'french', - 'fries', - ], - }, - { - code: 'šŸ•', - keywords: [ - 'cheese', - 'pizza', - 'slice', - ], - }, - { - code: 'šŸŒ­', - keywords: [ - 'frankfurter', - 'hot dog', - 'hotdog', - 'sausage', - ], - }, - { - code: 'šŸŒ®', - keywords: [ - 'mexican', - 'taco', - ], - }, - { - code: 'šŸŒÆ', - keywords: [ - 'burrito', - 'mexican', - ], - }, - { - code: 'šŸ„™', - keywords: [ - 'falafel', - 'flatbread', - 'gyro', - 'kebab', - 'stuffed', - ], - }, - { - code: 'šŸ„š', - keywords: [ - 'egg', - ], - }, - { - code: 'šŸ³', - keywords: [ - 'cooking', - 'egg', - 'frying', - 'pan', - ], - }, - { - code: 'šŸ„˜', - keywords: [ - 'casserole', - 'paella', - 'pan', - 'shallow', - ], - }, - { - code: 'šŸ²', - keywords: [ - 'pot', - 'stew', - ], - }, - { - code: 'šŸ„—', - keywords: [ - 'green', - 'salad', - ], - }, - { - code: 'šŸæ', - keywords: [ - 'popcorn', - ], - }, - { - code: 'šŸ±', - keywords: [ - 'bento', - 'box', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'cracker', - 'rice', - ], - }, - { - code: 'šŸ™', - keywords: [ - 'ball', - 'japanese', - 'rice', - ], - }, - { - code: 'šŸš', - keywords: [ - 'cooked', - 'rice', - ], - }, - { - code: 'šŸ›', - keywords: [ - 'curry', - 'rice', - ], - }, - { - code: 'šŸœ', - keywords: [ - 'bowl', - 'noodle', - 'ramen', - 'steaming', - ], - }, - { - code: 'šŸ', - keywords: [ - 'pasta', - 'spaghetti', - ], - }, - { - code: 'šŸ ', - keywords: [ - 'potato', - 'roasted', - 'sweet', - ], - }, - { - code: 'šŸ¢', - keywords: [ - 'kebab', - 'oden', - 'seafood', - 'skewer', - 'stick', - ], - }, - { - code: 'šŸ£', - keywords: [ - 'sushi', - ], - }, - { - code: 'šŸ¤', - keywords: [ - 'fried', - 'prawn', - 'shrimp', - 'tempura', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'cake', - 'fish', - 'pastry', - 'swirl', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'dango', - 'dessert', - 'japanese', - 'skewer', - 'stick', - 'sweet', - ], - }, - { - code: 'šŸ¦', - keywords: [ - 'cream', - 'dessert', - 'ice', - 'icecream', - 'soft', - 'sweet', - ], - }, - { - code: 'šŸ§', - keywords: [ - 'dessert', - 'ice', - 'shaved', - 'sweet', - ], - }, - { - code: 'šŸØ', - keywords: [ - 'cream', - 'dessert', - 'ice', - 'sweet', - ], - }, - { - code: 'šŸ©', - keywords: [ - 'dessert', - 'donut', - 'doughnut', - 'sweet', - ], - }, - { - code: 'šŸŖ', - keywords: [ - 'cookie', - 'dessert', - 'sweet', - ], - }, - { - code: 'šŸŽ‚', - keywords: [ - 'birthday', - 'cake', - 'celebration', - 'dessert', - 'pastry', - 'sweet', - ], - }, - { - code: 'šŸ°', - keywords: [ - 'cake', - 'dessert', - 'pastry', - 'shortcake', - 'slice', - 'sweet', - ], - }, - { - code: 'šŸ«', - keywords: [ - 'bar', - 'chocolate', - 'dessert', - 'sweet', - ], - }, - { - code: 'šŸ¬', - keywords: [ - 'candy', - 'dessert', - 'sweet', - ], - }, - { - code: 'šŸ­', - keywords: [ - 'candy', - 'dessert', - 'lollipop', - 'sweet', - ], - }, - { - code: 'šŸ®', - keywords: [ - 'custard', - 'dessert', - 'pudding', - 'sweet', - ], - }, - { - code: 'šŸÆ', - keywords: [ - 'honey', - 'honeypot', - 'pot', - 'sweet', - ], - }, - { - code: 'šŸ¼', - keywords: [ - 'baby', - 'bottle', - 'drink', - 'milk', - ], - }, - { - code: 'šŸ„›', - keywords: [ - 'drink', - 'glass', - 'milk', - ], - }, - { - code: 'ā˜•', - keywords: [ - 'beverage', - 'coffee', - 'drink', - 'hot', - 'steaming', - 'tea', - ], - }, - { - code: 'šŸµ', - keywords: [ - 'beverage', - 'cup', - 'drink', - 'tea', - 'teacup', - ], - }, - { - code: 'šŸ¶', - keywords: [ - 'bar', - 'beverage', - 'bottle', - 'cup', - 'drink', - 'sake', - ], - }, - { - code: 'šŸ¾', - keywords: [ - 'bar', - 'bottle', - 'cork', - 'drink', - 'popping', - ], - }, - { - code: 'šŸ·', - keywords: [ - 'bar', - 'beverage', - 'drink', - 'glass', - 'wine', - ], - }, - { - code: 'šŸø', - keywords: [ - 'bar', - 'cocktail', - 'drink', - 'glass', - ], - }, - { - code: 'šŸ¹', - keywords: [ - 'bar', - 'drink', - 'tropical', - ], - }, - { - code: 'šŸŗ', - keywords: [ - 'bar', - 'beer', - 'drink', - 'mug', - ], - }, - { - code: 'šŸ»', - keywords: [ - 'bar', - 'beer', - 'clink', - 'drink', - 'mug', - ], - }, - { - code: 'šŸ„‚', - keywords: [ - 'celebrate', - 'clink', - 'drink', - 'glass', - ], - }, - { - code: 'šŸ„ƒ', - keywords: [ - 'glass', - 'liquor', - 'shot', - 'tumbler', - 'whisky', - ], - }, - { - code: 'šŸ½', - keywords: [ - 'cooking', - 'fork', - 'knife', - 'plate', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'cooking', - 'fork', - 'knife', - ], - }, - { - code: 'šŸ„„', - keywords: [ - 'spoon', - 'tableware', - ], - }, - { - code: 'šŸ”Ŗ', - keywords: [ - 'cooking', - 'hocho', - 'knife', - 'tool', - 'weapon', - ], - }, - { - code: 'šŸŗ', - keywords: [ - 'amphora', - 'aquarius', - 'cooking', - 'drink', - 'jug', - 'tool', - 'weapon', - 'zodiac', - ], - }, - ], - 'Travel & Places': [ - { - code: 'šŸŒ', - keywords: [ - 'africa', - 'earth', - 'europe', - 'globe', - 'world', - ], - }, - { - code: 'šŸŒŽ', - keywords: [ - 'americas', - 'earth', - 'globe', - 'world', - ], - }, - { - code: 'šŸŒ', - keywords: [ - 'asia', - 'australia', - 'earth', - 'globe', - 'world', - ], - }, - { - code: 'šŸŒ', - keywords: [ - 'earth', - 'globe', - 'meridians', - 'world', - ], - }, - { - code: 'šŸ—ŗ', - keywords: [ - 'map', - 'world', - ], - }, - { - code: 'šŸ—¾', - keywords: [ - 'japan', - 'map', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'cold', - 'mountain', - 'snow', - ], - }, - { - code: 'ā›°', - keywords: [ - 'mountain', - ], - }, - { - code: 'šŸŒ‹', - keywords: [ - 'eruption', - 'mountain', - 'volcano', - 'weather', - ], - }, - { - code: 'šŸ—»', - keywords: [ - 'fuji', - 'mountain', - ], - }, - { - code: 'šŸ•', - keywords: [ - 'camping', - ], - }, - { - code: 'šŸ–', - keywords: [ - 'beach', - 'umbrella', - ], - }, - { - code: 'šŸœ', - keywords: [ - 'desert', - ], - }, - { - code: 'šŸ', - keywords: [ - 'desert', - 'island', - ], - }, - { - code: 'šŸž', - keywords: [ - 'national park', - 'park', - ], - }, - { - code: 'šŸŸ', - keywords: [ - 'stadium', - ], - }, - { - code: 'šŸ›', - keywords: [ - 'building', - 'classical', - ], - }, - { - code: 'šŸ—', - keywords: [ - 'building', - 'construction', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'building', - 'house', - ], - }, - { - code: 'šŸ™', - keywords: [ - 'building', - 'city', - ], - }, - { - code: 'šŸš', - keywords: [ - 'building', - 'derelict', - 'house', - ], - }, - { - code: 'šŸ ', - keywords: [ - 'building', - 'home', - 'house', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'building', - 'garden', - 'home', - 'house', - ], - }, - { - code: 'šŸ¢', - keywords: [ - 'building', - ], - }, - { - code: 'šŸ£', - keywords: [ - 'building', - 'japanese', - 'post', - ], - }, - { - code: 'šŸ¤', - keywords: [ - 'building', - 'european', - 'post', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'building', - 'doctor', - 'hospital', - 'medicine', - ], - }, - { - code: 'šŸ¦', - keywords: [ - 'bank', - 'building', - ], - }, - { - code: 'šŸØ', - keywords: [ - 'building', - 'hotel', - ], - }, - { - code: 'šŸ©', - keywords: [ - 'building', - 'hotel', - 'love', - ], - }, - { - code: 'šŸŖ', - keywords: [ - 'building', - 'convenience', - 'store', - ], - }, - { - code: 'šŸ«', - keywords: [ - 'building', - 'school', - ], - }, - { - code: 'šŸ¬', - keywords: [ - 'building', - 'department', - 'store', - ], - }, - { - code: 'šŸ­', - keywords: [ - 'building', - 'factory', - ], - }, - { - code: 'šŸÆ', - keywords: [ - 'building', - 'castle', - 'japanese', - ], - }, - { - code: 'šŸ°', - keywords: [ - 'building', - 'castle', - 'european', - ], - }, - { - code: 'šŸ’’', - keywords: [ - 'activity', - 'chapel', - 'romance', - 'wedding', - ], - }, - { - code: 'šŸ—¼', - keywords: [ - 'tokyo', - 'tower', - ], - }, - { - code: 'šŸ—½', - keywords: [ - 'liberty', - 'statue', - ], - }, - { - code: 'ā›Ŗ', - keywords: [ - 'building', - 'christian', - 'church', - 'cross', - 'religion', - ], - }, - { - code: 'šŸ•Œ', - keywords: [ - 'islam', - 'mosque', - 'muslim', - 'religion', - ], - }, - { - code: 'šŸ•', - keywords: [ - 'jew', - 'jewish', - 'religion', - 'synagogue', - 'temple', - ], - }, - { - code: 'ā›©', - keywords: [ - 'religion', - 'shinto', - 'shrine', - ], - }, - { - code: 'šŸ•‹', - keywords: [ - 'islam', - 'kaaba', - 'muslim', - 'religion', - ], - }, - { - code: 'ā›²', - keywords: [ - 'fountain', - ], - }, - { - code: 'ā›ŗ', - keywords: [ - 'camping', - 'tent', - ], - }, - { - code: 'šŸŒ', - keywords: [ - 'fog', - 'weather', - ], - }, - { - code: 'šŸŒƒ', - keywords: [ - 'night', - 'star', - 'weather', - ], - }, - { - code: 'šŸŒ„', - keywords: [ - 'morning', - 'mountain', - 'sun', - 'sunrise', - 'weather', - ], - }, - { - code: 'šŸŒ…', - keywords: [ - 'morning', - 'sun', - 'sunrise', - 'weather', - ], - }, - { - code: 'šŸŒ†', - keywords: [ - 'building', - 'city', - 'dusk', - 'evening', - 'landscape', - 'sun', - 'sunset', - 'weather', - ], - }, - { - code: 'šŸŒ‡', - keywords: [ - 'building', - 'dusk', - 'sun', - 'sunset', - 'weather', - ], - }, - { - code: 'šŸŒ‰', - keywords: [ - 'bridge', - 'night', - 'weather', - ], - }, - { - code: 'ā™Ø', - keywords: [ - 'hot', - 'hotsprings', - 'springs', - 'steaming', - ], - }, - { - code: 'šŸŒŒ', - keywords: [ - 'milky way', - 'space', - 'weather', - ], - }, - { - code: 'šŸŽ ', - keywords: [ - 'activity', - 'carousel', - 'entertainment', - 'horse', - ], - }, - { - code: 'šŸŽ”', - keywords: [ - 'activity', - 'amusement park', - 'entertainment', - 'ferris', - 'wheel', - ], - }, - { - code: 'šŸŽ¢', - keywords: [ - 'activity', - 'amusement park', - 'coaster', - 'entertainment', - 'roller', - ], - }, - { - code: 'šŸ’ˆ', - keywords: [ - 'barber', - 'haircut', - 'pole', - ], - }, - { - code: 'šŸŽŖ', - keywords: [ - 'activity', - 'circus', - 'entertainment', - 'tent', - ], - }, - { - code: 'šŸŽ­', - keywords: [ - 'activity', - 'art', - 'entertainment', - 'mask', - 'performing', - 'theater', - 'theatre', - ], - }, - { - code: 'šŸ–¼', - keywords: [ - 'art', - 'frame', - 'museum', - 'painting', - 'picture', - ], - }, - { - code: 'šŸŽØ', - keywords: [ - 'activity', - 'art', - 'entertainment', - 'museum', - 'painting', - 'palette', - ], - }, - { - code: 'šŸŽ°', - keywords: [ - 'activity', - 'game', - 'slot', - ], - }, - { - code: 'šŸš‚', - keywords: [ - 'engine', - 'locomotive', - 'railway', - 'steam', - 'train', - 'vehicle', - ], - }, - { - code: 'šŸšƒ', - keywords: [ - 'car', - 'electric', - 'railway', - 'train', - 'tram', - 'trolleybus', - 'vehicle', - ], - }, - { - code: 'šŸš„', - keywords: [ - 'railway', - 'shinkansen', - 'speed', - 'train', - 'vehicle', - ], - }, - { - code: 'šŸš…', - keywords: [ - 'bullet', - 'railway', - 'shinkansen', - 'speed', - 'train', - 'vehicle', - ], - }, - { - code: 'šŸš†', - keywords: [ - 'railway', - 'train', - 'vehicle', - ], - }, - { - code: 'šŸš‡', - keywords: [ - 'metro', - 'subway', - 'vehicle', - ], - }, - { - code: 'šŸšˆ', - keywords: [ - 'railway', - 'vehicle', - ], - }, - { - code: 'šŸš‰', - keywords: [ - 'railway', - 'station', - 'train', - 'vehicle', - ], - }, - { - code: 'šŸšŠ', - keywords: [ - 'tram', - 'trolleybus', - 'vehicle', - ], - }, - { - code: 'šŸš', - keywords: [ - 'monorail', - 'vehicle', - ], - }, - { - code: 'šŸšž', - keywords: [ - 'car', - 'mountain', - 'railway', - 'vehicle', - ], - }, - { - code: 'šŸš‹', - keywords: [ - 'car', - 'tram', - 'trolleybus', - 'vehicle', - ], - }, - { - code: 'šŸšŒ', - keywords: [ - 'bus', - 'vehicle', - ], - }, - { - code: 'šŸš', - keywords: [ - 'bus', - 'oncoming', - 'vehicle', - ], - }, - { - code: 'šŸšŽ', - keywords: [ - 'bus', - 'tram', - 'trolley', - 'trolleybus', - 'vehicle', - ], - }, - { - code: 'šŸš', - keywords: [ - 'bus', - 'busstop', - 'stop', - ], - }, - { - code: 'šŸš', - keywords: [ - 'bus', - 'minibus', - 'vehicle', - ], - }, - { - code: 'šŸš‘', - keywords: [ - 'ambulance', - 'vehicle', - ], - }, - { - code: 'šŸš’', - keywords: [ - 'engine', - 'fire', - 'truck', - 'vehicle', - ], - }, - { - code: 'šŸš“', - keywords: [ - 'car', - 'patrol', - 'police', - 'vehicle', - ], - }, - { - code: 'šŸš”', - keywords: [ - 'car', - 'oncoming', - 'police', - 'vehicle', - ], - }, - { - code: 'šŸš•', - keywords: [ - 'taxi', - 'vehicle', - ], - }, - { - code: 'šŸš–', - keywords: [ - 'oncoming', - 'taxi', - 'vehicle', - ], - }, - { - code: 'šŸš—', - keywords: [ - 'automobile', - 'car', - 'vehicle', - ], - }, - { - code: 'šŸš˜', - keywords: [ - 'automobile', - 'car', - 'oncoming', - 'vehicle', - ], - }, - { - code: 'šŸš™', - keywords: [ - 'recreational', - 'rv', - 'vehicle', - ], - }, - { - code: 'šŸšš', - keywords: [ - 'delivery', - 'truck', - 'vehicle', - ], - }, - { - code: 'šŸš›', - keywords: [ - 'lorry', - 'semi', - 'truck', - 'vehicle', - ], - }, - { - code: 'šŸšœ', - keywords: [ - 'tractor', - 'vehicle', - ], - }, - { - code: 'šŸš²', - keywords: [ - 'bicycle', - 'bike', - 'vehicle', - ], - }, - { - code: 'ā›½', - keywords: [ - 'fuel', - 'fuelpump', - 'gas', - 'pump', - 'station', - ], - }, - { - code: 'šŸ›£', - keywords: [ - 'highway', - 'motorway', - 'road', - ], - }, - { - code: 'šŸ›¤', - keywords: [ - 'railway', - 'train', - ], - }, - { - code: 'šŸšØ', - keywords: [ - 'beacon', - 'car', - 'light', - 'police', - 'revolving', - 'vehicle', - ], - }, - { - code: 'šŸš„', - keywords: [ - 'light', - 'signal', - 'traffic', - ], - }, - { - code: 'šŸš¦', - keywords: [ - 'light', - 'signal', - 'traffic', - ], - }, - { - code: 'šŸš§', - keywords: [ - 'barrier', - 'construction', - ], - }, - { - code: 'šŸ›‘', - keywords: [ - 'octagonal', - 'stop', - ], - }, - { - code: 'šŸ›“', - keywords: [ - 'kick', - 'scooter', - ], - }, - { - code: 'šŸ›µ', - keywords: [ - 'motor', - 'scooter', - ], - }, - { - code: 'āš“', - keywords: [ - 'anchor', - 'ship', - 'tool', - ], - }, - { - code: 'ā›µ', - keywords: [ - 'boat', - 'resort', - 'sailboat', - 'sea', - 'vehicle', - 'yacht', - ], - }, - { - code: 'šŸš£', - keywords: [ - 'boat', - 'rowboat', - 'vehicle', - ], - types: [ - 'šŸš£šŸæ', - 'šŸš£šŸ¾', - 'šŸš£šŸ½', - 'šŸš£šŸ¼', - 'šŸš£šŸ»', - ], - }, - { - code: 'šŸ›¶', - keywords: [ - 'boat', - 'canoe', - ], - }, - { - code: 'šŸš¤', - keywords: [ - 'boat', - 'speedboat', - 'vehicle', - ], - }, - { - code: 'šŸ›³', - keywords: [ - 'passenger', - 'ship', - 'vehicle', - ], - }, - { - code: 'ā›“', - keywords: [ - 'boat', - 'ferry', - ], - }, - { - code: 'šŸ›„', - keywords: [ - 'boat', - 'motorboat', - 'vehicle', - ], - }, - { - code: 'šŸš¢', - keywords: [ - 'ship', - 'vehicle', - ], - }, - { - code: 'āœˆ', - keywords: [ - 'airplane', - 'vehicle', - ], - }, - { - code: 'šŸ›©', - keywords: [ - 'airplane', - 'vehicle', - ], - }, - { - code: 'šŸ›«', - keywords: [ - 'airplane', - 'check-in', - 'departure', - 'departures', - 'vehicle', - ], - }, - { - code: 'šŸ›¬', - keywords: [ - 'airplane', - 'arrivals', - 'arriving', - 'landing', - 'vehicle', - ], - }, - { - code: 'šŸ’ŗ', - keywords: [ - 'chair', - 'seat', - ], - }, - { - code: 'šŸš', - keywords: [ - 'helicopter', - 'vehicle', - ], - }, - { - code: 'šŸšŸ', - keywords: [ - 'railway', - 'suspension', - 'vehicle', - ], - }, - { - code: 'šŸš ', - keywords: [ - 'cable', - 'gondola', - 'mountain', - 'vehicle', - ], - }, - { - code: 'šŸš”', - keywords: [ - 'aerial', - 'cable', - 'car', - 'gondola', - 'ropeway', - 'tramway', - 'vehicle', - ], - }, - { - code: 'šŸš€', - keywords: [ - 'rocket', - 'space', - 'vehicle', - ], - }, - { - code: 'šŸ›°', - keywords: [ - 'satellite', - 'space', - 'vehicle', - ], - }, - { - code: 'šŸ›Ž', - keywords: [ - 'bell', - 'bellhop', - 'hotel', - ], - }, - { - code: 'šŸšŖ', - keywords: [ - 'door', - ], - }, - { - code: 'šŸ›Œ', - keywords: [ - 'hotel', - 'sleep', - ], - }, - { - code: 'šŸ›', - keywords: [ - 'bed', - 'hotel', - 'sleep', - ], - }, - { - code: 'šŸ›‹', - keywords: [ - 'couch', - 'hotel', - 'lamp', - ], - }, - { - code: 'šŸš½', - keywords: [ - 'toilet', - ], - }, - { - code: 'šŸšæ', - keywords: [ - 'shower', - 'water', - ], - }, - { - code: 'šŸ›€', - keywords: [ - 'bath', - 'bathtub', - ], - types: [ - 'šŸ›€šŸæ', - 'šŸ›€šŸ¾', - 'šŸ›€šŸ½', - 'šŸ›€šŸ¼', - 'šŸ›€šŸ»', - ], - }, - { - code: 'šŸ›', - keywords: [ - 'bath', - 'bathtub', - ], - }, - { - code: 'āŒ›', - keywords: [ - 'hourglass', - 'sand', - 'timer', - ], - }, - { - code: 'ā³', - keywords: [ - 'hourglass', - 'sand', - 'timer', - ], - }, - { - code: 'āŒš', - keywords: [ - 'clock', - 'watch', - ], - }, - { - code: 'ā°', - keywords: [ - 'alarm', - 'clock', - ], - }, - { - code: 'ā±', - keywords: [ - 'clock', - 'stopwatch', - ], - }, - { - code: 'ā²', - keywords: [ - 'clock', - 'timer', - ], - }, - { - code: 'šŸ•°', - keywords: [ - 'clock', - ], - }, - { - code: 'šŸ•›', - keywords: [ - '00', - '12', - '12:00', - 'clock', - 'oā€™clock', - 'twelve', - ], - }, - { - code: 'šŸ•§', - keywords: [ - '12', - '12:30', - '30', - 'clock', - 'thirty', - 'twelve', - ], - }, - { - code: 'šŸ•', - keywords: [ - '00', - '1', - '1:00', - 'clock', - 'oā€™clock', - 'one', - ], - }, - { - code: 'šŸ•œ', - keywords: [ - '1', - '1:30', - '30', - 'clock', - 'one', - 'thirty', - ], - }, - { - code: 'šŸ•‘', - keywords: [ - '00', - '2', - '2:00', - 'clock', - 'oā€™clock', - 'two', - ], - }, - { - code: 'šŸ•', - keywords: [ - '2', - '2:30', - '30', - 'clock', - 'thirty', - 'two', - ], - }, - { - code: 'šŸ•’', - keywords: [ - '00', - '3', - '3:00', - 'clock', - 'oā€™clock', - 'three', - ], - }, - { - code: 'šŸ•ž', - keywords: [ - '3', - '3:30', - '30', - 'clock', - 'thirty', - 'three', - ], - }, - { - code: 'šŸ•“', - keywords: [ - '00', - '4', - '4:00', - 'clock', - 'four', - 'oā€™clock', - ], - }, - { - code: 'šŸ•Ÿ', - keywords: [ - '30', - '4', - '4:30', - 'clock', - 'four', - 'thirty', - ], - }, - { - code: 'šŸ•”', - keywords: [ - '00', - '5', - '5:00', - 'clock', - 'five', - 'oā€™clock', - ], - }, - { - code: 'šŸ• ', - keywords: [ - '30', - '5', - '5:30', - 'clock', - 'five', - 'thirty', - ], - }, - { - code: 'šŸ••', - keywords: [ - '00', - '6', - '6:00', - 'clock', - 'oā€™clock', - 'six', - ], - }, - { - code: 'šŸ•”', - keywords: [ - '30', - '6', - '6:30', - 'clock', - 'six', - 'thirty', - ], - }, - { - code: 'šŸ•–', - keywords: [ - '00', - '7', - '7:00', - 'clock', - 'oā€™clock', - 'seven', - ], - }, - { - code: 'šŸ•¢', - keywords: [ - '30', - '7', - '7:30', - 'clock', - 'seven', - 'thirty', - ], - }, - { - code: 'šŸ•—', - keywords: [ - '00', - '8', - '8:00', - 'clock', - 'eight', - 'oā€™clock', - ], - }, - { - code: 'šŸ•£', - keywords: [ - '30', - '8', - '8:30', - 'clock', - 'eight', - 'thirty', - ], - }, - { - code: 'šŸ•˜', - keywords: [ - '00', - '9', - '9:00', - 'clock', - 'nine', - 'oā€™clock', - ], - }, - { - code: 'šŸ•¤', - keywords: [ - '30', - '9', - '9:30', - 'clock', - 'nine', - 'thirty', - ], - }, - { - code: 'šŸ•™', - keywords: [ - '00', - '10', - '10:00', - 'clock', - 'oā€™clock', - 'ten', - ], - }, - { - code: 'šŸ•„', - keywords: [ - '10', - '10:30', - '30', - 'clock', - 'ten', - 'thirty', - ], - }, - { - code: 'šŸ•š', - keywords: [ - '00', - '11', - '11:00', - 'clock', - 'eleven', - 'oā€™clock', - ], - }, - { - code: 'šŸ•¦', - keywords: [ - '11', - '11:30', - '30', - 'clock', - 'eleven', - 'thirty', - ], - }, - { - code: 'šŸŒ‘', - keywords: [ - 'dark', - 'moon', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒ’', - keywords: [ - 'crescent', - 'moon', - 'space', - 'waxing', - 'weather', - ], - }, - { - code: 'šŸŒ“', - keywords: [ - 'moon', - 'quarter', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒ”', - keywords: [ - 'gibbous', - 'moon', - 'space', - 'waxing', - 'weather', - ], - }, - { - code: 'šŸŒ•', - keywords: [ - 'full', - 'moon', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒ–', - keywords: [ - 'gibbous', - 'moon', - 'space', - 'waning', - 'weather', - ], - }, - { - code: 'šŸŒ—', - keywords: [ - 'moon', - 'quarter', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒ˜', - keywords: [ - 'crescent', - 'moon', - 'space', - 'waning', - 'weather', - ], - }, - { - code: 'šŸŒ™', - keywords: [ - 'crescent', - 'moon', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒš', - keywords: [ - 'face', - 'moon', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒ›', - keywords: [ - 'face', - 'moon', - 'quarter', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒœ', - keywords: [ - 'face', - 'moon', - 'quarter', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒ”', - keywords: [ - 'thermometer', - 'weather', - ], - }, - { - code: 'ā˜€', - keywords: [ - 'bright', - 'rays', - 'space', - 'sun', - 'sunny', - 'weather', - ], - }, - { - code: 'šŸŒ', - keywords: [ - 'bright', - 'face', - 'full', - 'moon', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒž', - keywords: [ - 'bright', - 'face', - 'space', - 'sun', - 'weather', - ], - }, - { - code: 'ā­', - keywords: [ - 'star', - ], - }, - { - code: 'šŸŒŸ', - keywords: [ - 'glittery', - 'glow', - 'shining', - 'sparkle', - 'star', - ], - }, - { - code: 'šŸŒ ', - keywords: [ - 'activity', - 'falling', - 'shooting', - 'space', - 'star', - ], - }, - { - code: 'ā˜', - keywords: [ - 'cloud', - 'weather', - ], - }, - { - code: 'ā›…', - keywords: [ - 'cloud', - 'sun', - 'weather', - ], - }, - { - code: 'ā›ˆ', - keywords: [ - 'cloud', - 'rain', - 'thunder', - 'weather', - ], - }, - { - code: 'šŸŒ¤', - keywords: [ - 'cloud', - 'sun', - 'weather', - ], - }, - { - code: 'šŸŒ„', - keywords: [ - 'cloud', - 'sun', - 'weather', - ], - }, - { - code: 'šŸŒ¦', - keywords: [ - 'cloud', - 'rain', - 'sun', - 'weather', - ], - }, - { - code: 'šŸŒ§', - keywords: [ - 'cloud', - 'rain', - 'weather', - ], - }, - { - code: 'šŸŒØ', - keywords: [ - 'cloud', - 'cold', - 'snow', - 'weather', - ], - }, - { - code: 'šŸŒ©', - keywords: [ - 'cloud', - 'lightning', - 'weather', - ], - }, - { - code: 'šŸŒŖ', - keywords: [ - 'cloud', - 'tornado', - 'weather', - 'whirlwind', - ], - }, - { - code: 'šŸŒ«', - keywords: [ - 'cloud', - 'fog', - 'weather', - ], - }, - { - code: 'šŸŒ¬', - keywords: [ - 'blow', - 'cloud', - 'face', - 'weather', - 'wind', - ], - }, - { - code: 'šŸŒ€', - keywords: [ - 'cyclone', - 'dizzy', - 'twister', - 'typhoon', - 'weather', - ], - }, - { - code: 'šŸŒˆ', - keywords: [ - 'rain', - 'rainbow', - 'weather', - ], - }, - { - code: 'šŸŒ‚', - keywords: [ - 'clothing', - 'rain', - 'umbrella', - 'weather', - ], - }, - { - code: 'ā˜‚', - keywords: [ - 'clothing', - 'rain', - 'umbrella', - 'weather', - ], - }, - { - code: 'ā˜”', - keywords: [ - 'clothing', - 'drop', - 'rain', - 'umbrella', - 'weather', - ], - }, - { - code: 'ā›±', - keywords: [ - 'rain', - 'sun', - 'umbrella', - 'weather', - ], - }, - { - code: 'āš”', - keywords: [ - 'danger', - 'electric', - 'electricity', - 'lightning', - 'voltage', - 'zap', - ], - }, - { - code: 'ā„', - keywords: [ - 'cold', - 'snow', - 'snowflake', - 'weather', - ], - }, - { - code: 'ā˜ƒ', - keywords: [ - 'cold', - 'snow', - 'snowman', - 'weather', - ], - }, - { - code: 'ā›„', - keywords: [ - 'cold', - 'snow', - 'snowman', - 'weather', - ], - }, - { - code: 'ā˜„', - keywords: [ - 'comet', - 'space', - ], - }, - { - code: 'šŸ”„', - keywords: [ - 'fire', - 'flame', - 'tool', - ], - }, - { - code: 'šŸ’§', - keywords: [ - 'cold', - 'comic', - 'drop', - 'sweat', - 'weather', - ], - }, - { - code: 'šŸŒŠ', - keywords: [ - 'ocean', - 'water', - 'wave', - 'weather', - ], - }, - ], - Activities: [ - { - code: 'šŸŽƒ', - keywords: [ - 'activity', - 'celebration', - 'entertainment', - 'halloween', - 'jack', - 'lantern', - ], - }, - { - code: 'šŸŽ„', - keywords: [ - 'activity', - 'celebration', - 'christmas', - 'entertainment', - 'tree', - ], - }, - { - code: 'šŸŽ†', - keywords: [ - 'activity', - 'celebration', - 'entertainment', - 'fireworks', - ], - }, - { - code: 'šŸŽ‡', - keywords: [ - 'activity', - 'celebration', - 'entertainment', - 'fireworks', - 'sparkle', - ], - }, - { - code: 'āœØ', - keywords: [ - 'entertainment', - 'sparkle', - 'star', - ], - }, - { - code: 'šŸŽˆ', - keywords: [ - 'activity', - 'balloon', - 'celebration', - 'entertainment', - ], - }, - { - code: 'šŸŽ‰', - keywords: [ - 'activity', - 'celebration', - 'entertainment', - 'party', - 'popper', - 'tada', - ], - }, - { - code: 'šŸŽŠ', - keywords: [ - 'activity', - 'ball', - 'celebration', - 'confetti', - 'entertainment', - ], - }, - { - code: 'šŸŽ‹', - keywords: [ - 'activity', - 'banner', - 'celebration', - 'entertainment', - 'japanese', - 'tree', - ], - }, - { - code: 'šŸŽ', - keywords: [ - 'activity', - 'bamboo', - 'celebration', - 'japanese', - 'pine', - 'plant', - ], - }, - { - code: 'šŸŽŽ', - keywords: [ - 'activity', - 'celebration', - 'doll', - 'entertainment', - 'festival', - 'japanese', - ], - }, - { - code: 'šŸŽ', - keywords: [ - 'activity', - 'carp', - 'celebration', - 'entertainment', - 'flag', - 'streamer', - ], - }, - { - code: 'šŸŽ', - keywords: [ - 'activity', - 'bell', - 'celebration', - 'chime', - 'entertainment', - 'wind', - ], - }, - { - code: 'šŸŽ‘', - keywords: [ - 'activity', - 'celebration', - 'ceremony', - 'entertainment', - 'moon', - ], - }, - { - code: 'šŸŽ€', - keywords: [ - 'celebration', - 'ribbon', - ], - }, - { - code: 'šŸŽ', - keywords: [ - 'box', - 'celebration', - 'entertainment', - 'gift', - 'present', - 'wrapped', - ], - }, - { - code: 'šŸŽ—', - keywords: [ - 'celebration', - 'reminder', - 'ribbon', - ], - }, - { - code: 'šŸŽŸ', - keywords: [ - 'admission', - 'entertainment', - 'ticket', - ], - }, - { - code: 'šŸŽ«', - keywords: [ - 'activity', - 'admission', - 'entertainment', - 'ticket', - ], - }, - { - code: 'šŸŽ–', - keywords: [ - 'celebration', - 'medal', - 'military', - ], - }, - { - code: 'šŸ†', - keywords: [ - 'prize', - 'trophy', - ], - }, - { - code: 'šŸ…', - keywords: [ - 'medal', - ], - }, - { - code: 'šŸ„‡', - keywords: [ - 'first', - 'gold', - 'medal', - ], - }, - { - code: 'šŸ„ˆ', - keywords: [ - 'medal', - 'second', - 'silver', - ], - }, - { - code: 'šŸ„‰', - keywords: [ - 'bronze', - 'medal', - 'third', - ], - }, - { - code: 'āš½', - keywords: [ - 'ball', - 'soccer', - ], - }, - { - code: 'āš¾', - keywords: [ - 'ball', - 'baseball', - ], - }, - { - code: 'šŸ€', - keywords: [ - 'ball', - 'basketball', - 'hoop', - ], - }, - { - code: 'šŸ', - keywords: [ - 'ball', - 'game', - 'volleyball', - ], - }, - { - code: 'šŸˆ', - keywords: [ - 'american', - 'ball', - 'football', - ], - }, - { - code: 'šŸ‰', - keywords: [ - 'ball', - 'football', - 'rugby', - ], - }, - { - code: 'šŸŽ¾', - keywords: [ - 'ball', - 'racquet', - 'tennis', - ], - }, - { - code: 'šŸŽ±', - keywords: [ - '8', - '8 ball', - 'ball', - 'billiard', - 'eight', - 'game', - ], - }, - { - code: 'šŸŽ³', - keywords: [ - 'ball', - 'bowling', - 'game', - ], - }, - { - code: 'šŸ', - keywords: [ - 'ball', - 'bat', - 'cricket', - 'game', - ], - }, - { - code: 'šŸ‘', - keywords: [ - 'ball', - 'field', - 'game', - 'hockey', - 'stick', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'game', - 'hockey', - 'ice', - 'puck', - 'stick', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'ball', - 'bat', - 'game', - 'paddle', - 'table tennis', - ], - }, - { - code: 'šŸø', - keywords: [ - 'badminton', - 'birdie', - 'game', - 'racquet', - 'shuttlecock', - ], - }, - { - code: 'šŸ„Š', - keywords: [ - 'boxing', - 'glove', - ], - }, - { - code: 'šŸ„‹', - keywords: [ - 'judo', - 'karate', - 'martial arts', - 'taekwondo', - 'uniform', - ], - }, - { - code: 'ā›³', - keywords: [ - 'flag', - 'golf', - 'hole', - ], - }, - { - code: 'šŸŒ', - keywords: [ - 'ball', - 'golf', - ], - }, - { - code: 'ā›ø', - keywords: [ - 'ice', - 'skate', - ], - }, - { - code: 'šŸŽ£', - keywords: [ - 'entertainment', - 'fish', - 'pole', - ], - }, - { - code: 'šŸŽ½', - keywords: [ - 'running', - 'sash', - 'shirt', - ], - }, - { - code: 'šŸŽæ', - keywords: [ - 'ski', - 'snow', - ], - }, - { - code: 'ā›·', - keywords: [ - 'ski', - 'snow', - ], - }, - { - code: 'šŸ‚', - keywords: [ - 'ski', - 'snow', - 'snowboard', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'surfer', - 'surfing', - ], - types: [ - 'šŸ„šŸæ', - 'šŸ„šŸ¾', - 'šŸ„šŸ½', - 'šŸ„šŸ¼', - 'šŸ„šŸ»', - ], - }, - { - code: 'šŸ‡', - keywords: [ - 'horse', - 'jockey', - 'racehorse', - 'racing', - ], - }, - { - code: 'šŸŠ', - keywords: [ - 'swim', - 'swimmer', - ], - types: [ - 'šŸŠšŸæ', - 'šŸŠšŸ¾', - 'šŸŠšŸ½', - 'šŸŠšŸ¼', - 'šŸŠšŸ»', - ], - }, - { - code: 'ā›¹', - keywords: [ - 'ball', - ], - types: [ - 'ā›¹šŸæ', - 'ā›¹šŸ¾', - 'ā›¹šŸ½', - 'ā›¹šŸ¼', - 'ā›¹šŸ»', - ], - }, - { - code: 'šŸ‹', - keywords: [ - 'lifter', - 'weight', - ], - types: [ - 'šŸ‹šŸæ', - 'šŸ‹šŸ¾', - 'šŸ‹šŸ½', - 'šŸ‹šŸ¼', - 'šŸ‹šŸ»', - ], - }, - { - code: 'šŸš“', - keywords: [ - 'bicycle', - 'bicyclist', - 'bike', - 'cyclist', - ], - types: [ - 'šŸš“šŸæ', - 'šŸš“šŸ¾', - 'šŸš“šŸ½', - 'šŸš“šŸ¼', - 'šŸš“šŸ»', - ], - }, - { - code: 'šŸšµ', - keywords: [ - 'bicycle', - 'bicyclist', - 'bike', - 'cyclist', - 'mountain', - ], - types: [ - 'šŸšµšŸæ', - 'šŸšµšŸ¾', - 'šŸšµšŸ½', - 'šŸšµšŸ¼', - 'šŸšµšŸ»', - ], - }, - { - code: 'šŸŽ', - keywords: [ - 'car', - 'racing', - ], - }, - { - code: 'šŸ', - keywords: [ - 'motorcycle', - 'racing', - ], - }, - { - code: 'šŸ¤ø', - keywords: [ - 'cartwheel', - 'gymnastics', - ], - types: [ - 'šŸ¤øšŸæ', - 'šŸ¤øšŸ¾', - 'šŸ¤øšŸ½', - 'šŸ¤øšŸ¼', - 'šŸ¤øšŸ»', - ], - }, - { - code: 'šŸ¤¼', - keywords: [ - 'wrestle', - 'wrestler', - ], - types: [ - 'šŸ¤¼šŸæ', - 'šŸ¤¼šŸ¾', - 'šŸ¤¼šŸ½', - 'šŸ¤¼šŸ¼', - 'šŸ¤¼šŸ»', - ], - }, - { - code: 'šŸ¤½', - keywords: [ - 'polo', - 'water', - ], - types: [ - 'šŸ¤½šŸæ', - 'šŸ¤½šŸ¾', - 'šŸ¤½šŸ½', - 'šŸ¤½šŸ¼', - 'šŸ¤½šŸ»', - ], - }, - { - code: 'šŸ¤¾', - keywords: [ - 'ball', - 'handball', - ], - types: [ - 'šŸ¤¾šŸæ', - 'šŸ¤¾šŸ¾', - 'šŸ¤¾šŸ½', - 'šŸ¤¾šŸ¼', - 'šŸ¤¾šŸ»', - ], - }, - { - code: 'šŸ¤ŗ', - keywords: [ - 'fencer', - 'fencing', - 'sword', - ], - }, - { - code: 'šŸ„…', - keywords: [ - 'goal', - 'net', - ], - }, - { - code: 'šŸ¤¹', - keywords: [ - 'balance', - 'juggle', - 'multitask', - 'skill', - ], - types: [ - 'šŸ¤¹šŸæ', - 'šŸ¤¹šŸ¾', - 'šŸ¤¹šŸ½', - 'šŸ¤¹šŸ¼', - 'šŸ¤¹šŸ»', - ], - }, - { - code: 'šŸŽÆ', - keywords: [ - 'activity', - 'bull', - 'bullseye', - 'dart', - 'entertainment', - 'eye', - 'game', - 'hit', - 'target', - ], - }, - { - code: 'šŸŽ®', - keywords: [ - 'controller', - 'entertainment', - 'game', - 'video game', - ], - }, - { - code: 'šŸ•¹', - keywords: [ - 'entertainment', - 'game', - 'joystick', - 'video game', - ], - }, - { - code: 'šŸŽ²', - keywords: [ - 'dice', - 'die', - 'entertainment', - 'game', - ], - }, - { - code: 'ā™ ', - keywords: [ - 'card', - 'game', - 'spade', - 'suit', - ], - }, - { - code: 'ā™„', - keywords: [ - 'card', - 'game', - 'heart', - 'hearts', - 'suit', - ], - }, - { - code: 'ā™¦', - keywords: [ - 'card', - 'diamond', - 'diamonds', - 'game', - 'suit', - ], - }, - { - code: 'ā™£', - keywords: [ - 'card', - 'club', - 'clubs', - 'game', - 'suit', - ], - }, - { - code: 'šŸƒ', - keywords: [ - 'card', - 'entertainment', - 'game', - 'joker', - 'playing', - ], - }, - { - code: 'šŸ€„', - keywords: [ - 'game', - 'mahjong', - 'red', - ], - }, - { - code: 'šŸŽ“', - keywords: [ - 'activity', - 'card', - 'entertainment', - 'flower', - 'game', - 'japanese', - 'playing', - ], - }, - ], - Objects: [ - { - code: 'šŸ”‡', - keywords: [ - 'mute', - 'quiet', - 'silent', - 'speaker', - 'volume', - ], - }, - { - code: 'šŸ”ˆ', - keywords: [ - 'speaker', - 'volume', - ], - }, - { - code: 'šŸ”‰', - keywords: [ - 'low', - 'speaker', - 'volume', - 'wave', - ], - }, - { - code: 'šŸ”Š', - keywords: [ - '3', - 'entertainment', - 'high', - 'loud', - 'speaker', - 'three', - 'volume', - ], - }, - { - code: 'šŸ“¢', - keywords: [ - 'communication', - 'loud', - 'loudspeaker', - 'public address', - ], - }, - { - code: 'šŸ“£', - keywords: [ - 'cheering', - 'communication', - 'megaphone', - ], - }, - { - code: 'šŸ“Æ', - keywords: [ - 'communication', - 'entertainment', - 'horn', - 'post', - 'postal', - ], - }, - { - code: 'šŸ””', - keywords: [ - 'bell', - ], - }, - { - code: 'šŸ”•', - keywords: [ - 'bell', - 'forbidden', - 'mute', - 'no', - 'not', - 'prohibited', - 'quiet', - 'silent', - ], - }, - { - code: 'šŸŽ¼', - keywords: [ - 'activity', - 'entertainment', - 'music', - 'score', - ], - }, - { - code: 'šŸŽµ', - keywords: [ - 'activity', - 'entertainment', - 'music', - 'note', - ], - }, - { - code: 'šŸŽ¶', - keywords: [ - 'activity', - 'entertainment', - 'music', - 'note', - 'notes', - ], - }, - { - code: 'šŸŽ™', - keywords: [ - 'mic', - 'microphone', - 'music', - 'studio', - ], - }, - { - code: 'šŸŽš', - keywords: [ - 'level', - 'music', - 'slider', - ], - }, - { - code: 'šŸŽ›', - keywords: [ - 'control', - 'knobs', - 'music', - ], - }, - { - code: 'šŸŽ¤', - keywords: [ - 'activity', - 'entertainment', - 'karaoke', - 'mic', - 'microphone', - ], - }, - { - code: 'šŸŽ§', - keywords: [ - 'activity', - 'earbud', - 'entertainment', - 'headphone', - ], - }, - { - code: 'šŸ“»', - keywords: [ - 'entertainment', - 'radio', - 'video', - ], - }, - { - code: 'šŸŽ·', - keywords: [ - 'activity', - 'entertainment', - 'instrument', - 'music', - 'sax', - 'saxophone', - ], - }, - { - code: 'šŸŽø', - keywords: [ - 'activity', - 'entertainment', - 'guitar', - 'instrument', - 'music', - ], - }, - { - code: 'šŸŽ¹', - keywords: [ - 'activity', - 'entertainment', - 'instrument', - 'keyboard', - 'music', - 'piano', - ], - }, - { - code: 'šŸŽŗ', - keywords: [ - 'activity', - 'entertainment', - 'instrument', - 'music', - 'trumpet', - ], - }, - { - code: 'šŸŽ»', - keywords: [ - 'activity', - 'entertainment', - 'instrument', - 'music', - 'violin', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'drum', - 'drumsticks', - 'music', - ], - }, - { - code: 'šŸ“±', - keywords: [ - 'cell', - 'communication', - 'mobile', - 'phone', - 'telephone', - ], - }, - { - code: 'šŸ“²', - keywords: [ - 'arrow', - 'call', - 'cell', - 'communication', - 'mobile', - 'phone', - 'receive', - 'telephone', - ], - }, - { - code: 'ā˜Ž', - keywords: [ - 'phone', - 'telephone', - ], - }, - { - code: 'šŸ“ž', - keywords: [ - 'communication', - 'phone', - 'receiver', - 'telephone', - ], - }, - { - code: 'šŸ“Ÿ', - keywords: [ - 'communication', - 'pager', - ], - }, - { - code: 'šŸ“ ', - keywords: [ - 'communication', - 'fax', - ], - }, - { - code: 'šŸ”‹', - keywords: [ - 'battery', - ], - }, - { - code: 'šŸ”Œ', - keywords: [ - 'electric', - 'electricity', - 'plug', - ], - }, - { - code: 'šŸ’»', - keywords: [ - 'computer', - 'pc', - 'personal', - ], - }, - { - code: 'šŸ–„', - keywords: [ - 'computer', - 'desktop', - ], - }, - { - code: 'šŸ–Ø', - keywords: [ - 'computer', - 'printer', - ], - }, - { - code: 'āŒØ', - keywords: [ - 'computer', - 'keyboard', - ], - }, - { - code: 'šŸ–±', - keywords: [ - '3', - 'button', - 'computer', - 'mouse', - 'three', - ], - }, - { - code: 'šŸ–²', - keywords: [ - 'computer', - 'trackball', - ], - }, - { - code: 'šŸ’½', - keywords: [ - 'computer', - 'disk', - 'entertainment', - 'minidisk', - 'optical', - ], - }, - { - code: 'šŸ’¾', - keywords: [ - 'computer', - 'disk', - 'floppy', - ], - }, - { - code: 'šŸ’æ', - keywords: [ - 'blu-ray', - 'cd', - 'computer', - 'disk', - 'dvd', - 'optical', - ], - }, - { - code: 'šŸ“€', - keywords: [ - 'blu-ray', - 'cd', - 'computer', - 'disk', - 'dvd', - 'entertainment', - 'optical', - ], - }, - { - code: 'šŸŽ„', - keywords: [ - 'activity', - 'camera', - 'cinema', - 'entertainment', - 'movie', - ], - }, - { - code: 'šŸŽž', - keywords: [ - 'cinema', - 'entertainment', - 'film', - 'frames', - 'movie', - ], - }, - { - code: 'šŸ“½', - keywords: [ - 'cinema', - 'entertainment', - 'film', - 'movie', - 'projector', - 'video', - ], - }, - { - code: 'šŸŽ¬', - keywords: [ - 'activity', - 'clapper', - 'entertainment', - 'movie', - ], - }, - { - code: 'šŸ“ŗ', - keywords: [ - 'entertainment', - 'television', - 'tv', - 'video', - ], - }, - { - code: 'šŸ“·', - keywords: [ - 'camera', - 'entertainment', - 'video', - ], - }, - { - code: 'šŸ“ø', - keywords: [ - 'camera', - 'flash', - 'video', - ], - }, - { - code: 'šŸ“¹', - keywords: [ - 'camera', - 'entertainment', - 'video', - ], - }, - { - code: 'šŸ“¼', - keywords: [ - 'entertainment', - 'tape', - 'vhs', - 'video', - 'videocassette', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'glass', - 'magnifying', - 'search', - 'tool', - ], - }, - { - code: 'šŸ”Ž', - keywords: [ - 'glass', - 'magnifying', - 'search', - 'tool', - ], - }, - { - code: 'šŸ”¬', - keywords: [ - 'microscope', - 'tool', - ], - }, - { - code: 'šŸ”­', - keywords: [ - 'telescope', - 'tool', - ], - }, - { - code: 'šŸ“”', - keywords: [ - 'antenna', - 'communication', - 'dish', - 'satellite', - ], - }, - { - code: 'šŸ•Æ', - keywords: [ - 'candle', - 'light', - ], - }, - { - code: 'šŸ’”', - keywords: [ - 'bulb', - 'comic', - 'electric', - 'idea', - 'light', - ], - }, - { - code: 'šŸ”¦', - keywords: [ - 'electric', - 'flashlight', - 'light', - 'tool', - 'torch', - ], - }, - { - code: 'šŸ®', - keywords: [ - 'bar', - 'japanese', - 'lantern', - 'light', - 'red', - ], - }, - { - code: 'šŸ“”', - keywords: [ - 'book', - 'cover', - 'decorated', - 'notebook', - ], - }, - { - code: 'šŸ“•', - keywords: [ - 'book', - 'closed', - ], - }, - { - code: 'šŸ“–', - keywords: [ - 'book', - 'open', - ], - }, - { - code: 'šŸ“—', - keywords: [ - 'book', - 'green', - ], - }, - { - code: 'šŸ“˜', - keywords: [ - 'blue', - 'book', - ], - }, - { - code: 'šŸ“™', - keywords: [ - 'book', - 'orange', - ], - }, - { - code: 'šŸ“š', - keywords: [ - 'book', - 'books', - ], - }, - { - code: 'šŸ““', - keywords: [ - 'notebook', - ], - }, - { - code: 'šŸ“’', - keywords: [ - 'ledger', - 'notebook', - ], - }, - { - code: 'šŸ“ƒ', - keywords: [ - 'curl', - 'document', - 'page', - ], - }, - { - code: 'šŸ“œ', - keywords: [ - 'paper', - 'scroll', - ], - }, - { - code: 'šŸ“„', - keywords: [ - 'document', - 'page', - ], - }, - { - code: 'šŸ“°', - keywords: [ - 'communication', - 'news', - 'newspaper', - 'paper', - ], - }, - { - code: 'šŸ—ž', - keywords: [ - 'news', - 'newspaper', - 'paper', - 'rolled', - ], - }, - { - code: 'šŸ“‘', - keywords: [ - 'bookmark', - 'mark', - 'marker', - 'tabs', - ], - }, - { - code: 'šŸ”–', - keywords: [ - 'bookmark', - 'mark', - ], - }, - { - code: 'šŸ·', - keywords: [ - 'label', - ], - }, - { - code: 'šŸ’°', - keywords: [ - 'bag', - 'dollar', - 'money', - 'moneybag', - ], - }, - { - code: 'šŸ’“', - keywords: [ - 'bank', - 'banknote', - 'bill', - 'currency', - 'money', - 'note', - 'yen', - ], - }, - { - code: 'šŸ’µ', - keywords: [ - 'bank', - 'banknote', - 'bill', - 'currency', - 'dollar', - 'money', - 'note', - ], - }, - { - code: 'šŸ’¶', - keywords: [ - 'bank', - 'banknote', - 'bill', - 'currency', - 'euro', - 'money', - 'note', - ], - }, - { - code: 'šŸ’·', - keywords: [ - 'bank', - 'banknote', - 'bill', - 'currency', - 'money', - 'note', - 'pound', - ], - }, - { - code: 'šŸ’ø', - keywords: [ - 'bank', - 'banknote', - 'bill', - 'dollar', - 'fly', - 'money', - 'note', - 'wings', - ], - }, - { - code: 'šŸ’³', - keywords: [ - 'bank', - 'card', - 'credit', - 'money', - ], - }, - { - code: 'šŸ’¹', - keywords: [ - 'bank', - 'chart', - 'currency', - 'graph', - 'growth', - 'market', - 'money', - 'rise', - 'trend', - 'upward', - 'yen', - ], - }, - { - code: 'šŸ’±', - keywords: [ - 'bank', - 'currency', - 'exchange', - 'money', - ], - }, - { - code: 'šŸ’²', - keywords: [ - 'currency', - 'dollar', - 'money', - ], - }, - { - code: 'āœ‰', - keywords: [ - 'e-mail', - 'email', - 'envelope', - ], - }, - { - code: 'šŸ“§', - keywords: [ - 'communication', - 'e-mail', - 'email', - 'letter', - 'mail', - ], - }, - { - code: 'šŸ“Ø', - keywords: [ - 'communication', - 'e-mail', - 'email', - 'envelope', - 'incoming', - 'letter', - 'mail', - 'receive', - ], - }, - { - code: 'šŸ“©', - keywords: [ - 'arrow', - 'communication', - 'down', - 'e-mail', - 'email', - 'envelope', - 'letter', - 'mail', - 'outgoing', - 'sent', - ], - }, - { - code: 'šŸ“¤', - keywords: [ - 'box', - 'communication', - 'letter', - 'mail', - 'outbox', - 'sent', - 'tray', - ], - }, - { - code: 'šŸ“„', - keywords: [ - 'box', - 'communication', - 'inbox', - 'letter', - 'mail', - 'receive', - 'tray', - ], - }, - { - code: 'šŸ“¦', - keywords: [ - 'box', - 'communication', - 'package', - 'parcel', - ], - }, - { - code: 'šŸ“«', - keywords: [ - 'closed', - 'communication', - 'flag', - 'mail', - 'mailbox', - 'postbox', - ], - }, - { - code: 'šŸ“Ŗ', - keywords: [ - 'closed', - 'communication', - 'flag', - 'lowered', - 'mail', - 'mailbox', - 'postbox', - ], - }, - { - code: 'šŸ“¬', - keywords: [ - 'communication', - 'flag', - 'mail', - 'mailbox', - 'open', - 'postbox', - ], - }, - { - code: 'šŸ“­', - keywords: [ - 'communication', - 'flag', - 'lowered', - 'mail', - 'mailbox', - 'open', - 'postbox', - ], - }, - { - code: 'šŸ“®', - keywords: [ - 'communication', - 'mail', - 'mailbox', - 'postbox', - ], - }, - { - code: 'šŸ—³', - keywords: [ - 'ballot', - 'box', - ], - }, - { - code: 'āœ', - keywords: [ - 'pencil', - ], - }, - { - code: 'āœ’', - keywords: [ - 'nib', - 'pen', - ], - }, - { - code: 'šŸ–‹', - keywords: [ - 'communication', - 'fountain', - 'pen', - ], - }, - { - code: 'šŸ–Š', - keywords: [ - 'ballpoint', - 'communication', - 'pen', - ], - }, - { - code: 'šŸ–Œ', - keywords: [ - 'communication', - 'paintbrush', - 'painting', - ], - }, - { - code: 'šŸ–', - keywords: [ - 'communication', - 'crayon', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'communication', - 'memo', - 'pencil', - ], - }, - { - code: 'šŸ’¼', - keywords: [ - 'briefcase', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'file', - 'folder', - ], - }, - { - code: 'šŸ“‚', - keywords: [ - 'file', - 'folder', - 'open', - ], - }, - { - code: 'šŸ—‚', - keywords: [ - 'card', - 'dividers', - 'index', - ], - }, - { - code: 'šŸ“…', - keywords: [ - 'calendar', - 'date', - ], - }, - { - code: 'šŸ“†', - keywords: [ - 'calendar', - ], - }, - { - code: 'šŸ—’', - keywords: [ - 'note', - 'pad', - 'spiral', - ], - }, - { - code: 'šŸ—“', - keywords: [ - 'calendar', - 'pad', - 'spiral', - ], - }, - { - code: 'šŸ“‡', - keywords: [ - 'card', - 'index', - 'rolodex', - ], - }, - { - code: 'šŸ“ˆ', - keywords: [ - 'chart', - 'graph', - 'growth', - 'trend', - 'upward', - ], - }, - { - code: 'šŸ“‰', - keywords: [ - 'chart', - 'down', - 'graph', - 'trend', - ], - }, - { - code: 'šŸ“Š', - keywords: [ - 'bar', - 'chart', - 'graph', - ], - }, - { - code: 'šŸ“‹', - keywords: [ - 'clipboard', - ], - }, - { - code: 'šŸ“Œ', - keywords: [ - 'pin', - 'pushpin', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'pin', - 'pushpin', - ], - }, - { - code: 'šŸ“Ž', - keywords: [ - 'paperclip', - ], - }, - { - code: 'šŸ–‡', - keywords: [ - 'communication', - 'link', - 'paperclip', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'ruler', - 'straight edge', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'ruler', - 'set', - 'triangle', - ], - }, - { - code: 'āœ‚', - keywords: [ - 'scissors', - 'tool', - ], - }, - { - code: 'šŸ—ƒ', - keywords: [ - 'box', - 'card', - 'file', - ], - }, - { - code: 'šŸ—„', - keywords: [ - 'cabinet', - 'file', - ], - }, - { - code: 'šŸ—‘', - keywords: [ - 'wastebasket', - ], - }, - { - code: 'šŸ”’', - keywords: [ - 'closed', - 'lock', - ], - }, - { - code: 'šŸ”“', - keywords: [ - 'lock', - 'open', - 'unlock', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'ink', - 'lock', - 'nib', - 'pen', - 'privacy', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'closed', - 'key', - 'lock', - 'secure', - ], - }, - { - code: 'šŸ”‘', - keywords: [ - 'key', - 'lock', - 'password', - ], - }, - { - code: 'šŸ—', - keywords: [ - 'clue', - 'key', - 'lock', - 'old', - ], - }, - { - code: 'šŸ”Ø', - keywords: [ - 'hammer', - 'tool', - ], - }, - { - code: 'ā›', - keywords: [ - 'mining', - 'pick', - 'tool', - ], - }, - { - code: 'āš’', - keywords: [ - 'hammer', - 'pick', - 'tool', - ], - }, - { - code: 'šŸ› ', - keywords: [ - 'hammer', - 'tool', - 'wrench', - ], - }, - { - code: 'šŸ—”', - keywords: [ - 'dagger', - 'knife', - 'weapon', - ], - }, - { - code: 'āš”', - keywords: [ - 'crossed', - 'swords', - 'weapon', - ], - }, - { - code: 'šŸ”«', - keywords: [ - 'gun', - 'handgun', - 'pistol', - 'revolver', - 'tool', - 'weapon', - ], - }, - { - code: 'šŸ¹', - keywords: [ - 'archer', - 'arrow', - 'bow', - 'sagittarius', - 'tool', - 'weapon', - 'zodiac', - ], - }, - { - code: 'šŸ›”', - keywords: [ - 'shield', - 'weapon', - ], - }, - { - code: 'šŸ”§', - keywords: [ - 'tool', - 'wrench', - ], - }, - { - code: 'šŸ”©', - keywords: [ - 'bolt', - 'nut', - 'tool', - ], - }, - { - code: 'āš™', - keywords: [ - 'gear', - 'tool', - ], - }, - { - code: 'šŸ—œ', - keywords: [ - 'compression', - 'tool', - 'vice', - ], - }, - { - code: 'āš—', - keywords: [ - 'alembic', - 'chemistry', - 'tool', - ], - }, - { - code: 'āš–', - keywords: [ - 'balance', - 'justice', - 'libra', - 'scales', - 'tool', - 'weight', - 'zodiac', - ], - }, - { - code: 'šŸ”—', - keywords: [ - 'link', - ], - }, - { - code: 'ā›“', - keywords: [ - 'chain', - ], - }, - { - code: 'šŸ’‰', - keywords: [ - 'doctor', - 'medicine', - 'needle', - 'shot', - 'sick', - 'syringe', - 'tool', - ], - }, - { - code: 'šŸ’Š', - keywords: [ - 'doctor', - 'medicine', - 'pill', - 'sick', - ], - }, - { - code: 'šŸš¬', - keywords: [ - 'activity', - 'smoking', - ], - }, - { - code: 'āš°', - keywords: [ - 'coffin', - 'death', - ], - }, - { - code: 'āš±', - keywords: [ - 'death', - 'funeral', - 'urn', - ], - }, - { - code: 'šŸ—æ', - keywords: [ - 'face', - 'moyai', - 'statue', - ], - }, - { - code: 'šŸ›¢', - keywords: [ - 'drum', - 'oil', - ], - }, - { - code: 'šŸ”®', - keywords: [ - 'ball', - 'crystal', - 'fairy tale', - 'fantasy', - 'fortune', - 'tool', - ], - }, - { - code: 'šŸ›’', - keywords: [ - 'cart', - 'shopping', - 'trolley', - ], - }, - ], - Symbols: [ - { - code: 'šŸ§', - keywords: [ - 'atm', - 'automated', - 'bank', - 'teller', - ], - }, - { - code: 'šŸš®', - keywords: [ - 'litter', - 'litterbox', - ], - }, - { - code: 'šŸš°', - keywords: [ - 'drink', - 'potable', - 'water', - ], - }, - { - code: 'ā™æ', - keywords: [ - 'access', - 'wheelchair', - ], - }, - { - code: 'šŸš¹', - keywords: [ - 'lavatory', - 'man', - 'restroom', - 'wc', - ], - }, - { - code: 'šŸšŗ', - keywords: [ - 'lavatory', - 'restroom', - 'wc', - 'woman', - ], - }, - { - code: 'šŸš»', - keywords: [ - 'lavatory', - 'restroom', - 'wc', - ], - }, - { - code: 'šŸš¼', - keywords: [ - 'baby', - 'changing', - ], - }, - { - code: 'šŸš¾', - keywords: [ - 'closet', - 'lavatory', - 'restroom', - 'water', - 'wc', - ], - }, - { - code: 'šŸ›‚', - keywords: [ - 'control', - 'passport', - ], - }, - { - code: 'šŸ›ƒ', - keywords: [ - 'customs', - ], - }, - { - code: 'šŸ›„', - keywords: [ - 'baggage', - 'claim', - ], - }, - { - code: 'šŸ›…', - keywords: [ - 'baggage', - 'left luggage', - 'locker', - 'luggage', - ], - }, - { - code: 'āš ', - keywords: [ - 'warning', - ], - }, - { - code: 'šŸšø', - keywords: [ - 'child', - 'crossing', - 'pedestrian', - 'traffic', - ], - }, - { - code: 'ā›”', - keywords: [ - 'entry', - 'forbidden', - 'no', - 'not', - 'prohibited', - 'traffic', - ], - }, - { - code: 'šŸš«', - keywords: [ - 'entry', - 'forbidden', - 'no', - 'not', - 'prohibited', - ], - }, - { - code: 'šŸš³', - keywords: [ - 'bicycle', - 'bike', - 'forbidden', - 'no', - 'not', - 'prohibited', - 'vehicle', - ], - }, - { - code: 'šŸš­', - keywords: [ - 'forbidden', - 'no', - 'not', - 'prohibited', - 'smoking', - ], - }, - { - code: 'šŸšÆ', - keywords: [ - 'forbidden', - 'litter', - 'no', - 'not', - 'prohibited', - ], - }, - { - code: 'šŸš±', - keywords: [ - 'drink', - 'forbidden', - 'no', - 'not', - 'potable', - 'prohibited', - 'water', - ], - }, - { - code: 'šŸš·', - keywords: [ - 'forbidden', - 'no', - 'not', - 'pedestrian', - 'prohibited', - ], - }, - { - code: 'šŸ“µ', - keywords: [ - 'cell', - 'communication', - 'forbidden', - 'mobile', - 'no', - 'not', - 'phone', - 'prohibited', - 'telephone', - ], - }, - { - code: 'šŸ”ž', - keywords: [ - '18', - 'age restriction', - 'eighteen', - 'forbidden', - 'no', - 'not', - 'prohibited', - 'underage', - ], - }, - { - code: 'ā˜¢', - keywords: [ - 'radioactive', - ], - }, - { - code: 'ā˜£', - keywords: [ - 'biohazard', - ], - }, - { - code: 'ā¬†', - keywords: [ - 'arrow', - 'cardinal', - 'direction', - 'north', - ], - }, - { - code: 'ā†—', - keywords: [ - 'arrow', - 'direction', - 'intercardinal', - 'northeast', - ], - }, - { - code: 'āž”', - keywords: [ - 'arrow', - 'cardinal', - 'direction', - 'east', - ], - }, - { - code: 'ā†˜', - keywords: [ - 'arrow', - 'direction', - 'intercardinal', - 'southeast', - ], - }, - { - code: 'ā¬‡', - keywords: [ - 'arrow', - 'cardinal', - 'direction', - 'down', - 'south', - ], - }, - { - code: 'ā†™', - keywords: [ - 'arrow', - 'direction', - 'intercardinal', - 'southwest', - ], - }, - { - code: 'ā¬…', - keywords: [ - 'arrow', - 'cardinal', - 'direction', - 'west', - ], - }, - { - code: 'ā†–', - keywords: [ - 'arrow', - 'direction', - 'intercardinal', - 'northwest', - ], - }, - { - code: 'ā†•', - keywords: [ - 'arrow', - ], - }, - { - code: 'ā†”', - keywords: [ - 'arrow', - ], - }, - { - code: 'ā†©', - keywords: [ - 'arrow', - ], - }, - { - code: 'ā†Ŗ', - keywords: [ - 'arrow', - ], - }, - { - code: 'ā¤“', - keywords: [ - 'arrow', - ], - }, - { - code: 'ā¤µ', - keywords: [ - 'arrow', - 'down', - ], - }, - { - code: 'šŸ”ƒ', - keywords: [ - 'arrow', - 'clockwise', - 'reload', - ], - }, - { - code: 'šŸ”„', - keywords: [ - 'anticlockwise', - 'arrow', - 'counterclockwise', - 'withershins', - ], - }, - { - code: 'šŸ”™', - keywords: [ - 'arrow', - 'back', - ], - }, - { - code: 'šŸ”š', - keywords: [ - 'arrow', - 'end', - ], - }, - { - code: 'šŸ”›', - keywords: [ - 'arrow', - 'mark', - 'on', - ], - }, - { - code: 'šŸ”œ', - keywords: [ - 'arrow', - 'soon', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'arrow', - 'top', - 'up', - ], - }, - { - code: 'šŸ›', - keywords: [ - 'religion', - 'worship', - ], - }, - { - code: 'āš›', - keywords: [ - 'atheist', - 'atom', - ], - }, - { - code: 'šŸ•‰', - keywords: [ - 'hindu', - 'om', - 'religion', - ], - }, - { - code: 'āœ”', - keywords: [ - 'david', - 'jew', - 'jewish', - 'religion', - 'star', - ], - }, - { - code: 'ā˜ø', - keywords: [ - 'buddhist', - 'dharma', - 'religion', - 'wheel', - ], - }, - { - code: 'ā˜Æ', - keywords: [ - 'religion', - 'tao', - 'taoist', - 'yang', - 'yin', - ], - }, - { - code: 'āœ', - keywords: [ - 'christian', - 'cross', - 'religion', - ], - }, - { - code: 'ā˜¦', - keywords: [ - 'christian', - 'cross', - 'religion', - ], - }, - { - code: 'ā˜Ŗ', - keywords: [ - 'islam', - 'muslim', - 'religion', - ], - }, - { - code: 'ā˜®', - keywords: [ - 'peace', - ], - }, - { - code: 'šŸ•Ž', - keywords: [ - 'candelabrum', - 'candlestick', - 'menorah', - 'religion', - ], - }, - { - code: 'šŸ”Æ', - keywords: [ - 'fortune', - 'star', - ], - }, - { - code: 'ā™»', - keywords: [ - 'recycle', - ], - }, - { - code: 'šŸ“›', - keywords: [ - 'badge', - 'name', - ], - }, - { - code: 'āšœ', - keywords: [ - 'fleur-de-lis', - ], - }, - { - code: 'šŸ”°', - keywords: [ - 'beginner', - 'chevron', - 'green', - 'japanese', - 'leaf', - 'tool', - 'yellow', - ], - }, - { - code: 'šŸ”±', - keywords: [ - 'anchor', - 'emblem', - 'ship', - 'tool', - 'trident', - ], - }, - { - code: 'ā­•', - keywords: [ - 'circle', - 'o', - ], - }, - { - code: 'āœ…', - keywords: [ - 'check', - 'mark', - ], - }, - { - code: 'ā˜‘', - keywords: [ - 'ballot', - 'box', - 'check', - ], - }, - { - code: 'āœ”', - keywords: [ - 'check', - 'mark', - ], - }, - { - code: 'āœ–', - keywords: [ - 'cancel', - 'multiplication', - 'multiply', - 'x', - ], - }, - { - code: 'āŒ', - keywords: [ - 'cancel', - 'mark', - 'multiplication', - 'multiply', - 'x', - ], - }, - { - code: 'āŽ', - keywords: [ - 'mark', - 'square', - ], - }, - { - code: 'āž•', - keywords: [ - 'math', - 'plus', - ], - }, - { - code: 'āž–', - keywords: [ - 'math', - 'minus', - ], - }, - { - code: 'āž—', - keywords: [ - 'division', - 'math', - ], - }, - { - code: 'āž°', - keywords: [ - 'curl', - 'loop', - ], - }, - { - code: 'āžæ', - keywords: [ - 'curl', - 'double', - 'loop', - ], - }, - { - code: 'ć€½', - keywords: [ - 'mark', - 'part', - ], - }, - { - code: 'āœ³', - keywords: [ - 'asterisk', - ], - }, - { - code: 'āœ“', - keywords: [ - 'star', - ], - }, - { - code: 'ā‡', - keywords: [ - 'sparkle', - ], - }, - { - code: 'ā€¼', - keywords: [ - 'bangbang', - 'exclamation', - 'mark', - 'punctuation', - ], - }, - { - code: 'ā‰', - keywords: [ - 'exclamation', - 'interrobang', - 'mark', - 'punctuation', - 'question', - ], - }, - { - code: 'ā“', - keywords: [ - 'mark', - 'punctuation', - 'question', - ], - }, - { - code: 'ā”', - keywords: [ - 'mark', - 'outlined', - 'punctuation', - 'question', - ], - }, - { - code: 'ā•', - keywords: [ - 'exclamation', - 'mark', - 'outlined', - 'punctuation', - ], - }, - { - code: 'ā—', - keywords: [ - 'exclamation', - 'mark', - 'punctuation', - ], - }, - { - code: '怰', - keywords: [ - 'dash', - 'punctuation', - 'wavy', - ], - }, - { - code: 'Ā©', - keywords: [ - 'copyright', - ], - }, - { - code: 'Ā®', - keywords: [ - 'registered', - ], - }, - { - code: 'ā„¢', - keywords: [ - 'mark', - 'tm', - 'trademark', - ], - }, - { - code: 'ā™ˆ', - keywords: [ - 'aries', - 'ram', - 'zodiac', - ], - }, - { - code: 'ā™‰', - keywords: [ - 'bull', - 'ox', - 'taurus', - 'zodiac', - ], - }, - { - code: 'ā™Š', - keywords: [ - 'gemini', - 'twins', - 'zodiac', - ], - }, - { - code: 'ā™‹', - keywords: [ - 'cancer', - 'crab', - 'zodiac', - ], - }, - { - code: 'ā™Œ', - keywords: [ - 'leo', - 'lion', - 'zodiac', - ], - }, - { - code: 'ā™', - keywords: [ - 'maiden', - 'virgin', - 'virgo', - 'zodiac', - ], - }, - { - code: 'ā™Ž', - keywords: [ - 'balance', - 'justice', - 'libra', - 'scales', - 'zodiac', - ], - }, - { - code: 'ā™', - keywords: [ - 'scorpio', - 'scorpion', - 'scorpius', - 'zodiac', - ], - }, - { - code: 'ā™', - keywords: [ - 'archer', - 'sagittarius', - 'zodiac', - ], - }, - { - code: 'ā™‘', - keywords: [ - 'capricorn', - 'goat', - 'zodiac', - ], - }, - { - code: 'ā™’', - keywords: [ - 'aquarius', - 'bearer', - 'water', - 'zodiac', - ], - }, - { - code: 'ā™“', - keywords: [ - 'fish', - 'pisces', - 'zodiac', - ], - }, - { - code: 'ā›Ž', - keywords: [ - 'bearer', - 'ophiuchus', - 'serpent', - 'snake', - 'zodiac', - ], - }, - { - code: 'šŸ”€', - keywords: [ - 'arrow', - 'crossed', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'arrow', - 'clockwise', - 'repeat', - ], - }, - { - code: 'šŸ”‚', - keywords: [ - 'arrow', - 'clockwise', - 'once', - ], - }, - { - code: 'ā–¶', - keywords: [ - 'arrow', - 'play', - 'right', - 'triangle', - ], - }, - { - code: 'ā©', - keywords: [ - 'arrow', - 'double', - 'fast', - 'forward', - ], - }, - { - code: 'ā­', - keywords: [ - 'arrow', - 'next scene', - 'next track', - 'triangle', - ], - }, - { - code: 'āÆ', - keywords: [ - 'arrow', - 'pause', - 'play', - 'right', - 'triangle', - ], - }, - { - code: 'ā—€', - keywords: [ - 'arrow', - 'left', - 'reverse', - 'triangle', - ], - }, - { - code: 'āŖ', - keywords: [ - 'arrow', - 'double', - 'rewind', - ], - }, - { - code: 'ā®', - keywords: [ - 'arrow', - 'previous scene', - 'previous track', - 'triangle', - ], - }, - { - code: 'šŸ”¼', - keywords: [ - 'arrow', - 'button', - 'red', - ], - }, - { - code: 'ā«', - keywords: [ - 'arrow', - 'double', - ], - }, - { - code: 'šŸ”½', - keywords: [ - 'arrow', - 'button', - 'down', - 'red', - ], - }, - { - code: 'ā¬', - keywords: [ - 'arrow', - 'double', - 'down', - ], - }, - { - code: 'āø', - keywords: [ - 'bar', - 'double', - 'pause', - 'vertical', - ], - }, - { - code: 'ā¹', - keywords: [ - 'square', - 'stop', - ], - }, - { - code: 'āŗ', - keywords: [ - 'circle', - 'record', - ], - }, - { - code: 'ā', - keywords: [ - 'eject', - ], - }, - { - code: 'šŸŽ¦', - keywords: [ - 'activity', - 'camera', - 'cinema', - 'entertainment', - 'film', - 'movie', - ], - }, - { - code: 'šŸ”…', - keywords: [ - 'brightness', - 'dim', - 'low', - ], - }, - { - code: 'šŸ”†', - keywords: [ - 'bright', - 'brightness', - ], - }, - { - code: 'šŸ“¶', - keywords: [ - 'antenna', - 'bar', - 'cell', - 'communication', - 'mobile', - 'phone', - 'signal', - 'telephone', - ], - }, - { - code: 'šŸ“³', - keywords: [ - 'cell', - 'communication', - 'mobile', - 'mode', - 'phone', - 'telephone', - 'vibration', - ], - }, - { - code: 'šŸ““', - keywords: [ - 'cell', - 'communication', - 'mobile', - 'off', - 'phone', - 'telephone', - ], - }, - { - code: '#ļøāƒ£', - keywords: [ - 'hash', - 'keycap', - 'pound', - ], - }, - { - code: '*ļøāƒ£', - keywords: [ - 'asterisk', - 'keycap', - 'star', - ], - }, - { - code: '0ļøāƒ£', - keywords: [ - '0', - 'keycap', - 'zero', - ], - }, - { - code: '1ļøāƒ£', - keywords: [ - '1', - 'keycap', - 'one', - ], - }, - { - code: '2ļøāƒ£', - keywords: [ - '2', - 'keycap', - 'two', - ], - }, - { - code: '3ļøāƒ£', - keywords: [ - '3', - 'keycap', - 'three', - ], - }, - { - code: '4ļøāƒ£', - keywords: [ - '4', - 'four', - 'keycap', - ], - }, - { - code: '5ļøāƒ£', - keywords: [ - '5', - 'five', - 'keycap', - ], - }, - { - code: '6ļøāƒ£', - keywords: [ - '6', - 'keycap', - 'six', - ], - }, - { - code: '7ļøāƒ£', - keywords: [ - '7', - 'keycap', - 'seven', - ], - }, - { - code: '8ļøāƒ£', - keywords: [ - '8', - 'eight', - 'keycap', - ], - }, - { - code: '9ļøāƒ£', - keywords: [ - '9', - 'keycap', - 'nine', - ], - }, - { - code: 'šŸ”Ÿ', - keywords: [ - '10', - 'keycap', - 'ten', - ], - }, - { - code: 'šŸ’Æ', - keywords: [ - '100', - 'full', - 'hundred', - 'score', - ], - }, - { - code: 'šŸ” ', - keywords: [ - 'input', - 'latin', - 'letters', - 'uppercase', - ], - }, - { - code: 'šŸ””', - keywords: [ - 'abcd', - 'input', - 'latin', - 'letters', - 'lowercase', - ], - }, - { - code: 'šŸ”¢', - keywords: [ - '1234', - 'input', - 'numbers', - ], - }, - { - code: 'šŸ”£', - keywords: [ - 'input', - ], - }, - { - code: 'šŸ”¤', - keywords: [ - 'abc', - 'alphabet', - 'input', - 'latin', - 'letters', - ], - }, - { - code: 'šŸ…°', - keywords: [ - 'a', - 'blood', - ], - }, - { - code: 'šŸ†Ž', - keywords: [ - 'ab', - 'blood', - ], - }, - { - code: 'šŸ…±', - keywords: [ - 'b', - 'blood', - ], - }, - { - code: 'šŸ†‘', - keywords: [ - 'cl', - ], - }, - { - code: 'šŸ†’', - keywords: [ - 'cool', - ], - }, - { - code: 'šŸ†“', - keywords: [ - 'free', - ], - }, - { - code: 'ā„¹', - keywords: [ - 'i', - 'information', - ], - }, - { - code: 'šŸ†”', - keywords: [ - 'id', - 'identity', - ], - }, - { - code: 'ā“‚', - keywords: [ - 'circle', - 'm', - ], - }, - { - code: 'šŸ†•', - keywords: [ - 'new', - ], - }, - { - code: 'šŸ†–', - keywords: [ - 'ng', - ], - }, - { - code: 'šŸ…¾', - keywords: [ - 'blood', - 'o', - ], - }, - { - code: 'šŸ†—', - keywords: [ - 'ok', - ], - }, - { - code: 'šŸ…æ', - keywords: [ - 'parking', - ], - }, - { - code: 'šŸ†˜', - keywords: [ - 'help', - 'sos', - ], - }, - { - code: 'šŸ†™', - keywords: [ - 'mark', - 'up', - ], - }, - { - code: 'šŸ†š', - keywords: [ - 'versus', - 'vs', - ], - }, - { - code: 'šŸˆ', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸˆ‚', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸˆ·', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸˆ¶', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸˆÆ', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸ‰', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸˆ¹', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸˆš', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸˆ²', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸ‰‘', - keywords: [ - 'chinese', - ], - }, - { - code: 'šŸˆø', - keywords: [ - 'chinese', - ], - }, - { - code: 'šŸˆ“', - keywords: [ - 'chinese', - ], - }, - { - code: 'šŸˆ³', - keywords: [ - 'chinese', - ], - }, - { - code: '抗', - keywords: [ - 'chinese', - 'congratulation', - 'congratulations', - 'ideograph', - ], - }, - { - code: '抙', - keywords: [ - 'chinese', - 'ideograph', - 'secret', - ], - }, - { - code: 'šŸˆŗ', - keywords: [ - 'chinese', - ], - }, - { - code: 'šŸˆµ', - keywords: [ - 'chinese', - ], - }, - { - code: 'ā–Ŗ', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'ā–«', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'ā—»', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'ā—¼', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'ā—½', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'ā—¾', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'ā¬›', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'ā¬œ', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'šŸ”¶', - keywords: [ - 'diamond', - 'geometric', - 'orange', - ], - }, - { - code: 'šŸ”·', - keywords: [ - 'blue', - 'diamond', - 'geometric', - ], - }, - { - code: 'šŸ”ø', - keywords: [ - 'diamond', - 'geometric', - 'orange', - ], - }, - { - code: 'šŸ”¹', - keywords: [ - 'blue', - 'diamond', - 'geometric', - ], - }, - { - code: 'šŸ”ŗ', - keywords: [ - 'geometric', - 'red', - ], - }, - { - code: 'šŸ”»', - keywords: [ - 'down', - 'geometric', - 'red', - ], - }, - { - code: 'šŸ’ ', - keywords: [ - 'comic', - 'diamond', - 'geometric', - 'inside', - ], - }, - { - code: 'šŸ”˜', - keywords: [ - 'button', - 'geometric', - 'radio', - ], - }, - { - code: 'šŸ”²', - keywords: [ - 'button', - 'geometric', - 'square', - ], - }, - { - code: 'šŸ”³', - keywords: [ - 'button', - 'geometric', - 'outlined', - 'square', - ], - }, - { - code: 'āšŖ', - keywords: [ - 'circle', - 'geometric', - ], - }, - { - code: 'āš«', - keywords: [ - 'circle', - 'geometric', - ], - }, - { - code: 'šŸ”“', - keywords: [ - 'circle', - 'geometric', - 'red', - ], - }, - { - code: 'šŸ”µ', - keywords: [ - 'blue', - 'circle', - 'geometric', - ], - }, - ], - Flags: [ - { - code: 'šŸ', - keywords: [ - 'checkered', - 'chequered', - 'flag', - 'racing', - ], - }, - { - code: 'šŸš©', - keywords: [ - 'flag', - 'post', - ], - }, - { - code: 'šŸŽŒ', - keywords: [ - 'activity', - 'celebration', - 'cross', - 'crossed', - 'flag', - 'japanese', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'flag', - 'waving', - ], - }, - { - code: 'šŸ³', - keywords: [ - 'flag', - 'waving', - ], - }, - { - code: 'šŸ‡¦šŸ‡Ø', - keywords: [ - 'ascension', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡¦šŸ‡©', - keywords: [ - 'andorra', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡Ŗ', - keywords: [ - 'emirates', - 'flag', - 'uae', - 'united', - ], - }, - { - code: 'šŸ‡¦šŸ‡«', - keywords: [ - 'afghanistan', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡¬', - keywords: [ - 'antigua', - 'barbuda', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡®', - keywords: [ - 'anguilla', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡±', - keywords: [ - 'albania', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡²', - keywords: [ - 'armenia', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡“', - keywords: [ - 'angola', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡¶', - keywords: [ - 'antarctica', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡·', - keywords: [ - 'argentina', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡ø', - keywords: [ - 'american', - 'flag', - 'samoa', - ], - }, - { - code: 'šŸ‡¦šŸ‡¹', - keywords: [ - 'austria', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡ŗ', - keywords: [ - 'australia', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡¼', - keywords: [ - 'aruba', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡½', - keywords: [ - 'Ć„land', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡æ', - keywords: [ - 'azerbaijan', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡¦', - keywords: [ - 'bosnia', - 'flag', - 'herzegovina', - ], - }, - { - code: 'šŸ‡§šŸ‡§', - keywords: [ - 'barbados', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡©', - keywords: [ - 'bangladesh', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡Ŗ', - keywords: [ - 'belgium', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡«', - keywords: [ - 'burkina faso', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡¬', - keywords: [ - 'bulgaria', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡­', - keywords: [ - 'bahrain', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡®', - keywords: [ - 'burundi', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡Æ', - keywords: [ - 'benin', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡±', - keywords: [ - 'barthelemy', - 'barthĆ©lemy', - 'flag', - 'saint', - ], - }, - { - code: 'šŸ‡§šŸ‡²', - keywords: [ - 'bermuda', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡³', - keywords: [ - 'brunei', - 'darussalam', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡“', - keywords: [ - 'bolivia', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡¶', - keywords: [ - 'bonaire', - 'caribbean', - 'eustatius', - 'flag', - 'netherlands', - 'saba', - 'sint', - ], - }, - { - code: 'šŸ‡§šŸ‡·', - keywords: [ - 'brazil', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡ø', - keywords: [ - 'bahamas', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡¹', - keywords: [ - 'bhutan', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡»', - keywords: [ - 'bouvet', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡§šŸ‡¼', - keywords: [ - 'botswana', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡¾', - keywords: [ - 'belarus', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡æ', - keywords: [ - 'belize', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡¦', - keywords: [ - 'canada', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡Ø', - keywords: [ - 'cocos', - 'flag', - 'island', - 'keeling', - ], - }, - { - code: 'šŸ‡ØšŸ‡©', - keywords: [ - 'congo', - 'congo-kinshasa', - 'democratic republic of congo', - 'drc', - 'flag', - 'kinshasa', - 'republic', - ], - }, - { - code: 'šŸ‡ØšŸ‡«', - keywords: [ - 'central african republic', - 'flag', - 'republic', - ], - }, - { - code: 'šŸ‡ØšŸ‡¬', - keywords: [ - 'brazzaville', - 'congo', - 'congo republic', - 'congo-brazzaville', - 'flag', - 'republic', - 'republic of the congo', - ], - }, - { - code: 'šŸ‡ØšŸ‡­', - keywords: [ - 'flag', - 'switzerland', - ], - }, - { - code: 'šŸ‡ØšŸ‡®', - keywords: [ - 'cote ivoire', - 'cĆ“te ivoire', - 'flag', - 'ivory coast', - ], - }, - { - code: 'šŸ‡ØšŸ‡°', - keywords: [ - 'cook', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡ØšŸ‡±', - keywords: [ - 'chile', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡²', - keywords: [ - 'cameroon', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡³', - keywords: [ - 'china', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡“', - keywords: [ - 'colombia', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡µ', - keywords: [ - 'clipperton', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡ØšŸ‡·', - keywords: [ - 'costa rica', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡ŗ', - keywords: [ - 'cuba', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡»', - keywords: [ - 'cabo', - 'cape', - 'flag', - 'verde', - ], - }, - { - code: 'šŸ‡ØšŸ‡¼', - keywords: [ - 'antilles', - 'curacao', - 'curaƧao', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡½', - keywords: [ - 'christmas', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡ØšŸ‡¾', - keywords: [ - 'cyprus', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡æ', - keywords: [ - 'czech republic', - 'flag', - ], - }, - { - code: 'šŸ‡©šŸ‡Ŗ', - keywords: [ - 'flag', - 'germany', - ], - }, - { - code: 'šŸ‡©šŸ‡¬', - keywords: [ - 'diego garcia', - 'flag', - ], - }, - { - code: 'šŸ‡©šŸ‡Æ', - keywords: [ - 'djibouti', - 'flag', - ], - }, - { - code: 'šŸ‡©šŸ‡°', - keywords: [ - 'denmark', - 'flag', - ], - }, - { - code: 'šŸ‡©šŸ‡²', - keywords: [ - 'dominica', - 'flag', - ], - }, - { - code: 'šŸ‡©šŸ‡“', - keywords: [ - 'dominican republic', - 'flag', - ], - }, - { - code: 'šŸ‡©šŸ‡æ', - keywords: [ - 'algeria', - 'flag', - ], - }, - { - code: 'šŸ‡ŖšŸ‡¦', - keywords: [ - 'ceuta', - 'flag', - 'melilla', - ], - }, - { - code: 'šŸ‡ŖšŸ‡Ø', - keywords: [ - 'ecuador', - 'flag', - ], - }, - { - code: 'šŸ‡ŖšŸ‡Ŗ', - keywords: [ - 'estonia', - 'flag', - ], - }, - { - code: 'šŸ‡ŖšŸ‡¬', - keywords: [ - 'egypt', - 'flag', - ], - }, - { - code: 'šŸ‡ŖšŸ‡­', - keywords: [ - 'flag', - 'sahara', - 'west', - 'western sahara', - ], - }, - { - code: 'šŸ‡ŖšŸ‡·', - keywords: [ - 'eritrea', - 'flag', - ], - }, - { - code: 'šŸ‡ŖšŸ‡ø', - keywords: [ - 'flag', - 'spain', - ], - }, - { - code: 'šŸ‡ŖšŸ‡¹', - keywords: [ - 'ethiopia', - 'flag', - ], - }, - { - code: 'šŸ‡ŖšŸ‡ŗ', - keywords: [ - 'european union', - 'flag', - ], - }, - { - code: 'šŸ‡«šŸ‡®', - keywords: [ - 'finland', - 'flag', - ], - }, - { - code: 'šŸ‡«šŸ‡Æ', - keywords: [ - 'fiji', - 'flag', - ], - }, - { - code: 'šŸ‡«šŸ‡°', - keywords: [ - 'falkland', - 'falklands', - 'flag', - 'island', - 'islas', - 'malvinas', - ], - }, - { - code: 'šŸ‡«šŸ‡²', - keywords: [ - 'flag', - 'micronesia', - ], - }, - { - code: 'šŸ‡«šŸ‡“', - keywords: [ - 'faroe', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡«šŸ‡·', - keywords: [ - 'flag', - 'france', - ], - }, - { - code: 'šŸ‡¬šŸ‡¦', - keywords: [ - 'flag', - 'gabon', - ], - }, - { - code: 'šŸ‡¬šŸ‡§', - keywords: [ - 'britain', - 'british', - 'cornwall', - 'england', - 'flag', - 'great britain', - 'ireland', - 'northern ireland', - 'scotland', - 'uk', - 'union jack', - 'united', - 'united kingdom', - 'wales', - ], - }, - { - code: 'šŸ‡¬šŸ‡©', - keywords: [ - 'flag', - 'grenada', - ], - }, - { - code: 'šŸ‡¬šŸ‡Ŗ', - keywords: [ - 'flag', - 'georgia', - ], - }, - { - code: 'šŸ‡¬šŸ‡«', - keywords: [ - 'flag', - 'french', - 'guiana', - ], - }, - { - code: 'šŸ‡¬šŸ‡¬', - keywords: [ - 'flag', - 'guernsey', - ], - }, - { - code: 'šŸ‡¬šŸ‡­', - keywords: [ - 'flag', - 'ghana', - ], - }, - { - code: 'šŸ‡¬šŸ‡®', - keywords: [ - 'flag', - 'gibraltar', - ], - }, - { - code: 'šŸ‡¬šŸ‡±', - keywords: [ - 'flag', - 'greenland', - ], - }, - { - code: 'šŸ‡¬šŸ‡²', - keywords: [ - 'flag', - 'gambia', - ], - }, - { - code: 'šŸ‡¬šŸ‡³', - keywords: [ - 'flag', - 'guinea', - ], - }, - { - code: 'šŸ‡¬šŸ‡µ', - keywords: [ - 'flag', - 'guadeloupe', - ], - }, - { - code: 'šŸ‡¬šŸ‡¶', - keywords: [ - 'equatorial guinea', - 'flag', - 'guinea', - ], - }, - { - code: 'šŸ‡¬šŸ‡·', - keywords: [ - 'flag', - 'greece', - ], - }, - { - code: 'šŸ‡¬šŸ‡ø', - keywords: [ - 'flag', - 'georgia', - 'island', - 'south', - 'south georgia', - 'south sandwich', - ], - }, - { - code: 'šŸ‡¬šŸ‡¹', - keywords: [ - 'flag', - 'guatemala', - ], - }, - { - code: 'šŸ‡¬šŸ‡ŗ', - keywords: [ - 'flag', - 'guam', - ], - }, - { - code: 'šŸ‡¬šŸ‡¼', - keywords: [ - 'bissau', - 'flag', - 'guinea', - ], - }, - { - code: 'šŸ‡¬šŸ‡¾', - keywords: [ - 'flag', - 'guyana', - ], - }, - { - code: 'šŸ‡­šŸ‡°', - keywords: [ - 'china', - 'flag', - 'hong kong', - ], - }, - { - code: 'šŸ‡­šŸ‡²', - keywords: [ - 'flag', - 'heard', - 'island', - 'mcdonald', - ], - }, - { - code: 'šŸ‡­šŸ‡³', - keywords: [ - 'flag', - 'honduras', - ], - }, - { - code: 'šŸ‡­šŸ‡·', - keywords: [ - 'croatia', - 'flag', - ], - }, - { - code: 'šŸ‡­šŸ‡¹', - keywords: [ - 'flag', - 'haiti', - ], - }, - { - code: 'šŸ‡­šŸ‡ŗ', - keywords: [ - 'flag', - 'hungary', - ], - }, - { - code: 'šŸ‡®šŸ‡Ø', - keywords: [ - 'canary', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡®šŸ‡©', - keywords: [ - 'flag', - 'indonesia', - ], - }, - { - code: 'šŸ‡®šŸ‡Ŗ', - keywords: [ - 'flag', - 'ireland', - ], - }, - { - code: 'šŸ‡®šŸ‡±', - keywords: [ - 'flag', - 'israel', - ], - }, - { - code: 'šŸ‡®šŸ‡²', - keywords: [ - 'flag', - 'isle of man', - ], - }, - { - code: 'šŸ‡®šŸ‡³', - keywords: [ - 'flag', - 'india', - ], - }, - { - code: 'šŸ‡®šŸ‡“', - keywords: [ - 'british', - 'chagos', - 'flag', - 'indian ocean', - 'island', - ], - }, - { - code: 'šŸ‡®šŸ‡¶', - keywords: [ - 'flag', - 'iraq', - ], - }, - { - code: 'šŸ‡®šŸ‡·', - keywords: [ - 'flag', - 'iran', - ], - }, - { - code: 'šŸ‡®šŸ‡ø', - keywords: [ - 'flag', - 'iceland', - ], - }, - { - code: 'šŸ‡®šŸ‡¹', - keywords: [ - 'flag', - 'italy', - ], - }, - { - code: 'šŸ‡ÆšŸ‡Ŗ', - keywords: [ - 'flag', - 'jersey', - ], - }, - { - code: 'šŸ‡ÆšŸ‡²', - keywords: [ - 'flag', - 'jamaica', - ], - }, - { - code: 'šŸ‡ÆšŸ‡“', - keywords: [ - 'flag', - 'jordan', - ], - }, - { - code: 'šŸ‡ÆšŸ‡µ', - keywords: [ - 'flag', - 'japan', - ], - }, - { - code: 'šŸ‡°šŸ‡Ŗ', - keywords: [ - 'flag', - 'kenya', - ], - }, - { - code: 'šŸ‡°šŸ‡¬', - keywords: [ - 'flag', - 'kyrgyzstan', - ], - }, - { - code: 'šŸ‡°šŸ‡­', - keywords: [ - 'cambodia', - 'flag', - ], - }, - { - code: 'šŸ‡°šŸ‡®', - keywords: [ - 'flag', - 'kiribati', - ], - }, - { - code: 'šŸ‡°šŸ‡²', - keywords: [ - 'comoros', - 'flag', - ], - }, - { - code: 'šŸ‡°šŸ‡³', - keywords: [ - 'flag', - 'kitts', - 'nevis', - 'saint', - ], - }, - { - code: 'šŸ‡°šŸ‡µ', - keywords: [ - 'flag', - 'korea', - 'north', - 'north korea', - ], - }, - { - code: 'šŸ‡°šŸ‡·', - keywords: [ - 'flag', - 'korea', - 'south', - 'south korea', - ], - }, - { - code: 'šŸ‡°šŸ‡¼', - keywords: [ - 'flag', - 'kuwait', - ], - }, - { - code: 'šŸ‡°šŸ‡¾', - keywords: [ - 'cayman', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡°šŸ‡æ', - keywords: [ - 'flag', - 'kazakhstan', - ], - }, - { - code: 'šŸ‡±šŸ‡¦', - keywords: [ - 'flag', - 'laos', - ], - }, - { - code: 'šŸ‡±šŸ‡§', - keywords: [ - 'flag', - 'lebanon', - ], - }, - { - code: 'šŸ‡±šŸ‡Ø', - keywords: [ - 'flag', - 'lucia', - 'saint', - ], - }, - { - code: 'šŸ‡±šŸ‡®', - keywords: [ - 'flag', - 'liechtenstein', - ], - }, - { - code: 'šŸ‡±šŸ‡°', - keywords: [ - 'flag', - 'sri lanka', - ], - }, - { - code: 'šŸ‡±šŸ‡·', - keywords: [ - 'flag', - 'liberia', - ], - }, - { - code: 'šŸ‡±šŸ‡ø', - keywords: [ - 'flag', - 'lesotho', - ], - }, - { - code: 'šŸ‡±šŸ‡¹', - keywords: [ - 'flag', - 'lithuania', - ], - }, - { - code: 'šŸ‡±šŸ‡ŗ', - keywords: [ - 'flag', - 'luxembourg', - ], - }, - { - code: 'šŸ‡±šŸ‡»', - keywords: [ - 'flag', - 'latvia', - ], - }, - { - code: 'šŸ‡±šŸ‡¾', - keywords: [ - 'flag', - 'libya', - ], - }, - { - code: 'šŸ‡²šŸ‡¦', - keywords: [ - 'flag', - 'morocco', - ], - }, - { - code: 'šŸ‡²šŸ‡Ø', - keywords: [ - 'flag', - 'monaco', - ], - }, - { - code: 'šŸ‡²šŸ‡©', - keywords: [ - 'flag', - 'moldova', - ], - }, - { - code: 'šŸ‡²šŸ‡Ŗ', - keywords: [ - 'flag', - 'montenegro', - ], - }, - { - code: 'šŸ‡²šŸ‡«', - keywords: [ - 'flag', - 'french', - 'martin', - 'saint', - ], - }, - { - code: 'šŸ‡²šŸ‡¬', - keywords: [ - 'flag', - 'madagascar', - ], - }, - { - code: 'šŸ‡²šŸ‡­', - keywords: [ - 'flag', - 'island', - 'marshall', - ], - }, - { - code: 'šŸ‡²šŸ‡°', - keywords: [ - 'flag', - 'macedonia', - ], - }, - { - code: 'šŸ‡²šŸ‡±', - keywords: [ - 'flag', - 'mali', - ], - }, - { - code: 'šŸ‡²šŸ‡²', - keywords: [ - 'burma', - 'flag', - 'myanmar', - ], - }, - { - code: 'šŸ‡²šŸ‡³', - keywords: [ - 'flag', - 'mongolia', - ], - }, - { - code: 'šŸ‡²šŸ‡“', - keywords: [ - 'china', - 'flag', - 'macao', - 'macau', - ], - }, - { - code: 'šŸ‡²šŸ‡µ', - keywords: [ - 'flag', - 'island', - 'mariana', - 'north', - 'northern mariana', - ], - }, - { - code: 'šŸ‡²šŸ‡¶', - keywords: [ - 'flag', - 'martinique', - ], - }, - { - code: 'šŸ‡²šŸ‡·', - keywords: [ - 'flag', - 'mauritania', - ], - }, - { - code: 'šŸ‡²šŸ‡ø', - keywords: [ - 'flag', - 'montserrat', - ], - }, - { - code: 'šŸ‡²šŸ‡¹', - keywords: [ - 'flag', - 'malta', - ], - }, - { - code: 'šŸ‡²šŸ‡ŗ', - keywords: [ - 'flag', - 'mauritius', - ], - }, - { - code: 'šŸ‡²šŸ‡»', - keywords: [ - 'flag', - 'maldives', - ], - }, - { - code: 'šŸ‡²šŸ‡¼', - keywords: [ - 'flag', - 'malawi', - ], - }, - { - code: 'šŸ‡²šŸ‡½', - keywords: [ - 'flag', - 'mexico', - ], - }, - { - code: 'šŸ‡²šŸ‡¾', - keywords: [ - 'flag', - 'malaysia', - ], - }, - { - code: 'šŸ‡²šŸ‡æ', - keywords: [ - 'flag', - 'mozambique', - ], - }, - { - code: 'šŸ‡³šŸ‡¦', - keywords: [ - 'flag', - 'namibia', - ], - }, - { - code: 'šŸ‡³šŸ‡Ø', - keywords: [ - 'flag', - 'new', - 'new caledonia', - ], - }, - { - code: 'šŸ‡³šŸ‡Ŗ', - keywords: [ - 'flag', - 'niger', - ], - }, - { - code: 'šŸ‡³šŸ‡«', - keywords: [ - 'flag', - 'island', - 'norfolk', - ], - }, - { - code: 'šŸ‡³šŸ‡¬', - keywords: [ - 'flag', - 'nigeria', - ], - }, - { - code: 'šŸ‡³šŸ‡®', - keywords: [ - 'flag', - 'nicaragua', - ], - }, - { - code: 'šŸ‡³šŸ‡±', - keywords: [ - 'flag', - 'netherlands', - ], - }, - { - code: 'šŸ‡³šŸ‡“', - keywords: [ - 'flag', - 'norway', - ], - }, - { - code: 'šŸ‡³šŸ‡µ', - keywords: [ - 'flag', - 'nepal', - ], - }, - { - code: 'šŸ‡³šŸ‡·', - keywords: [ - 'flag', - 'nauru', - ], - }, - { - code: 'šŸ‡³šŸ‡ŗ', - keywords: [ - 'flag', - 'niue', - ], - }, - { - code: 'šŸ‡³šŸ‡æ', - keywords: [ - 'flag', - 'new', - 'new zealand', - ], - }, - { - code: 'šŸ‡“šŸ‡²', - keywords: [ - 'flag', - 'oman', - ], - }, - { - code: 'šŸ‡µšŸ‡¦', - keywords: [ - 'flag', - 'panama', - ], - }, - { - code: 'šŸ‡µšŸ‡Ŗ', - keywords: [ - 'flag', - 'peru', - ], - }, - { - code: 'šŸ‡µšŸ‡«', - keywords: [ - 'flag', - 'french', - 'polynesia', - ], - }, - { - code: 'šŸ‡µšŸ‡¬', - keywords: [ - 'flag', - 'guinea', - 'new', - 'papua new guinea', - ], - }, - { - code: 'šŸ‡µšŸ‡­', - keywords: [ - 'flag', - 'philippines', - ], - }, - { - code: 'šŸ‡µšŸ‡°', - keywords: [ - 'flag', - 'pakistan', - ], - }, - { - code: 'šŸ‡µšŸ‡±', - keywords: [ - 'flag', - 'poland', - ], - }, - { - code: 'šŸ‡µšŸ‡²', - keywords: [ - 'flag', - 'miquelon', - 'pierre', - 'saint', - ], - }, - { - code: 'šŸ‡µšŸ‡³', - keywords: [ - 'flag', - 'island', - 'pitcairn', - ], - }, - { - code: 'šŸ‡µšŸ‡·', - keywords: [ - 'flag', - 'puerto rico', - ], - }, - { - code: 'šŸ‡µšŸ‡ø', - keywords: [ - 'flag', - 'palestine', - ], - }, - { - code: 'šŸ‡µšŸ‡¹', - keywords: [ - 'flag', - 'portugal', - ], - }, - { - code: 'šŸ‡µšŸ‡¼', - keywords: [ - 'flag', - 'palau', - ], - }, - { - code: 'šŸ‡µšŸ‡¾', - keywords: [ - 'flag', - 'paraguay', - ], - }, - { - code: 'šŸ‡¶šŸ‡¦', - keywords: [ - 'flag', - 'qatar', - ], - }, - { - code: 'šŸ‡·šŸ‡Ŗ', - keywords: [ - 'flag', - 'reunion', - 'rĆ©union', - ], - }, - { - code: 'šŸ‡·šŸ‡“', - keywords: [ - 'flag', - 'romania', - ], - }, - { - code: 'šŸ‡·šŸ‡ø', - keywords: [ - 'flag', - 'serbia', - ], - }, - { - code: 'šŸ‡·šŸ‡ŗ', - keywords: [ - 'flag', - 'russia', - ], - }, - { - code: 'šŸ‡·šŸ‡¼', - keywords: [ - 'flag', - 'rwanda', - ], - }, - { - code: 'šŸ‡øšŸ‡¦', - keywords: [ - 'flag', - 'saudi arabia', - ], - }, - { - code: 'šŸ‡øšŸ‡§', - keywords: [ - 'flag', - 'island', - 'solomon', - ], - }, - { - code: 'šŸ‡øšŸ‡Ø', - keywords: [ - 'flag', - 'seychelles', - ], - }, - { - code: 'šŸ‡øšŸ‡©', - keywords: [ - 'flag', - 'sudan', - ], - }, - { - code: 'šŸ‡øšŸ‡Ŗ', - keywords: [ - 'flag', - 'sweden', - ], - }, - { - code: 'šŸ‡øšŸ‡¬', - keywords: [ - 'flag', - 'singapore', - ], - }, - { - code: 'šŸ‡øšŸ‡­', - keywords: [ - 'flag', - 'helena', - 'saint', - ], - }, - { - code: 'šŸ‡øšŸ‡®', - keywords: [ - 'flag', - 'slovenia', - ], - }, - { - code: 'šŸ‡øšŸ‡Æ', - keywords: [ - 'flag', - 'jan mayen', - 'svalbard', - ], - }, - { - code: 'šŸ‡øšŸ‡°', - keywords: [ - 'flag', - 'slovakia', - ], - }, - { - code: 'šŸ‡øšŸ‡±', - keywords: [ - 'flag', - 'sierra leone', - ], - }, - { - code: 'šŸ‡øšŸ‡²', - keywords: [ - 'flag', - 'san marino', - ], - }, - { - code: 'šŸ‡øšŸ‡³', - keywords: [ - 'flag', - 'senegal', - ], - }, - { - code: 'šŸ‡øšŸ‡“', - keywords: [ - 'flag', - 'somalia', - ], - }, - { - code: 'šŸ‡øšŸ‡·', - keywords: [ - 'flag', - 'suriname', - ], - }, - { - code: 'šŸ‡øšŸ‡ø', - keywords: [ - 'flag', - 'south', - 'south sudan', - 'sudan', - ], - }, - { - code: 'šŸ‡øšŸ‡¹', - keywords: [ - 'flag', - 'principe', - 'prĆ­ncipe', - 'sao tome', - 'sĆ£o tomĆ©', - ], - }, - { - code: 'šŸ‡øšŸ‡»', - keywords: [ - 'el salvador', - 'flag', - ], - }, - { - code: 'šŸ‡øšŸ‡½', - keywords: [ - 'flag', - 'maarten', - 'sint', - ], - }, - { - code: 'šŸ‡øšŸ‡¾', - keywords: [ - 'flag', - 'syria', - ], - }, - { - code: 'šŸ‡øšŸ‡æ', - keywords: [ - 'flag', - 'swaziland', - ], - }, - { - code: 'šŸ‡¹šŸ‡¦', - keywords: [ - 'flag', - 'tristan da cunha', - ], - }, - { - code: 'šŸ‡¹šŸ‡Ø', - keywords: [ - 'caicos', - 'flag', - 'island', - 'turks', - ], - }, - { - code: 'šŸ‡¹šŸ‡©', - keywords: [ - 'chad', - 'flag', - ], - }, - { - code: 'šŸ‡¹šŸ‡«', - keywords: [ - 'antarctic', - 'flag', - 'french', - ], - }, - { - code: 'šŸ‡¹šŸ‡¬', - keywords: [ - 'flag', - 'togo', - ], - }, - { - code: 'šŸ‡¹šŸ‡­', - keywords: [ - 'flag', - 'thailand', - ], - }, - { - code: 'šŸ‡¹šŸ‡Æ', - keywords: [ - 'flag', - 'tajikistan', - ], - }, - { - code: 'šŸ‡¹šŸ‡°', - keywords: [ - 'flag', - 'tokelau', - ], - }, - { - code: 'šŸ‡¹šŸ‡±', - keywords: [ - 'east', - 'east timor', - 'flag', - 'timor-leste', - ], - }, - { - code: 'šŸ‡¹šŸ‡²', - keywords: [ - 'flag', - 'turkmenistan', - ], - }, - { - code: 'šŸ‡¹šŸ‡³', - keywords: [ - 'flag', - 'tunisia', - ], - }, - { - code: 'šŸ‡¹šŸ‡“', - keywords: [ - 'flag', - 'tonga', - ], - }, - { - code: 'šŸ‡¹šŸ‡·', - keywords: [ - 'flag', - 'turkey', - ], - }, - { - code: 'šŸ‡¹šŸ‡¹', - keywords: [ - 'flag', - 'tobago', - 'trinidad', - ], - }, - { - code: 'šŸ‡¹šŸ‡»', - keywords: [ - 'flag', - 'tuvalu', - ], - }, - { - code: 'šŸ‡¹šŸ‡¼', - keywords: [ - 'china', - 'flag', - 'taiwan', - ], - }, - { - code: 'šŸ‡¹šŸ‡æ', - keywords: [ - 'flag', - 'tanzania', - ], - }, - { - code: 'šŸ‡ŗšŸ‡¦', - keywords: [ - 'flag', - 'ukraine', - ], - }, - { - code: 'šŸ‡ŗšŸ‡¬', - keywords: [ - 'flag', - 'uganda', - ], - }, - { - code: 'šŸ‡ŗšŸ‡²', - keywords: [ - 'america', - 'flag', - 'island', - 'minor outlying', - 'united', - 'united states', - 'us', - 'usa', - ], - }, - { - code: 'šŸ‡ŗšŸ‡ø', - keywords: [ - 'america', - 'flag', - 'stars and stripes', - 'united', - 'united states', - ], - }, - { - code: 'šŸ‡ŗšŸ‡¾', - keywords: [ - 'flag', - 'uruguay', - ], - }, - { - code: 'šŸ‡ŗšŸ‡æ', - keywords: [ - 'flag', - 'uzbekistan', - ], - }, - { - code: 'šŸ‡»šŸ‡¦', - keywords: [ - 'flag', - 'vatican', - ], - }, - { - code: 'šŸ‡»šŸ‡Ø', - keywords: [ - 'flag', - 'grenadines', - 'saint', - 'vincent', - ], - }, - { - code: 'šŸ‡»šŸ‡Ŗ', - keywords: [ - 'flag', - 'venezuela', - ], - }, - { - code: 'šŸ‡»šŸ‡¬', - keywords: [ - 'british', - 'flag', - 'island', - 'virgin', - ], - }, - { - code: 'šŸ‡»šŸ‡®', - keywords: [ - 'america', - 'american', - 'flag', - 'island', - 'united', - 'united states', - 'us', - 'usa', - 'virgin', - ], - }, - { - code: 'šŸ‡»šŸ‡³', - keywords: [ - 'flag', - 'viet nam', - 'vietnam', - ], - }, - { - code: 'šŸ‡»šŸ‡ŗ', - keywords: [ - 'flag', - 'vanuatu', - ], - }, - { - code: 'šŸ‡¼šŸ‡«', - keywords: [ - 'flag', - 'futuna', - 'wallis', - ], - }, - { - code: 'šŸ‡¼šŸ‡ø', - keywords: [ - 'flag', - 'samoa', - ], - }, - { - code: 'šŸ‡½šŸ‡°', - keywords: [ - 'flag', - 'kosovo', - ], - }, - { - code: 'šŸ‡¾šŸ‡Ŗ', - keywords: [ - 'flag', - 'yemen', - ], - }, - { - code: 'šŸ‡¾šŸ‡¹', - keywords: [ - 'flag', - 'mayotte', - ], - }, - { - code: 'šŸ‡æšŸ‡¦', - keywords: [ - 'flag', - 'south', - 'south africa', - ], - }, - { - code: 'šŸ‡æšŸ‡²', - keywords: [ - 'flag', - 'zambia', - ], - }, - { - code: 'šŸ‡æšŸ‡¼', - keywords: [ - 'flag', - 'zimbabwe', - ], - }, - ], -}; +const emojis = [ + { + code: 'Smileys & People', + header: true, + }, + { + code: 'šŸ˜€', + keywords: [ + 'face', + 'grin', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'eye', + 'face', + 'grin', + 'smile', + ], + }, + { + code: 'šŸ˜‚', + keywords: [ + 'face', + 'joy', + 'laugh', + 'tear', + ], + }, + { + code: 'šŸ¤£', + keywords: [ + 'face', + 'floor', + 'laugh', + 'lol', + 'rofl', + 'rolling', + ], + }, + { + code: 'šŸ˜ƒ', + keywords: [ + 'face', + 'mouth', + 'open', + 'smile', + ], + }, + { + code: 'šŸ˜„', + keywords: [ + 'eye', + 'face', + 'mouth', + 'open', + 'smile', + ], + }, + { + code: 'šŸ˜…', + keywords: [ + 'cold', + 'face', + 'open', + 'smile', + 'sweat', + ], + }, + { + code: 'šŸ˜†', + keywords: [ + 'face', + 'laugh', + 'mouth', + 'open', + 'satisfied', + 'smile', + ], + }, + { + code: 'šŸ˜‰', + keywords: [ + 'face', + 'wink', + ], + }, + { + code: 'šŸ˜Š', + keywords: [ + 'blush', + 'eye', + 'face', + 'smile', + ], + }, + { + code: 'šŸ˜‹', + keywords: [ + 'delicious', + 'face', + 'savouring', + 'smile', + 'um', + 'yum', + ], + }, + { + code: 'šŸ˜Ž', + keywords: [ + 'bright', + 'cool', + 'eye', + 'eyewear', + 'face', + 'glasses', + 'smile', + 'sun', + 'sunglasses', + 'weather', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'eye', + 'face', + 'heart', + 'love', + 'smile', + ], + }, + { + code: 'šŸ˜˜', + keywords: [ + 'face', + 'heart', + 'kiss', + ], + }, + { + code: 'šŸ˜—', + keywords: [ + 'face', + 'kiss', + ], + }, + { + code: 'šŸ˜™', + keywords: [ + 'eye', + 'face', + 'kiss', + 'smile', + ], + }, + { + code: 'šŸ˜š', + keywords: [ + 'closed', + 'eye', + 'face', + 'kiss', + ], + }, + { + code: 'ā˜ŗ', + keywords: [ + 'face', + 'outlined', + 'relaxed', + 'smile', + ], + }, + { + code: 'šŸ™‚', + keywords: [ + 'face', + 'smile', + ], + }, + { + code: 'šŸ¤—', + keywords: [ + 'face', + 'hug', + 'hugging', + ], + }, + { + code: 'šŸ¤”', + keywords: [ + 'face', + 'thinking', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'deadpan', + 'face', + 'neutral', + ], + }, + { + code: 'šŸ˜‘', + keywords: [ + 'expressionless', + 'face', + 'inexpressive', + 'unexpressive', + ], + }, + { + code: 'šŸ˜¶', + keywords: [ + 'face', + 'mouth', + 'quiet', + 'silent', + ], + }, + { + code: 'šŸ™„', + keywords: [ + 'eyes', + 'face', + 'rolling', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'face', + 'smirk', + ], + }, + { + code: 'šŸ˜£', + keywords: [ + 'face', + 'persevere', + ], + }, + { + code: 'šŸ˜„', + keywords: [ + 'disappointed', + 'face', + 'relieved', + 'whew', + ], + }, + { + code: 'šŸ˜®', + keywords: [ + 'face', + 'mouth', + 'open', + 'sympathy', + ], + }, + { + code: 'šŸ¤', + keywords: [ + 'face', + 'mouth', + 'zipper', + ], + }, + { + code: 'šŸ˜Æ', + keywords: [ + 'face', + 'hushed', + 'stunned', + 'surprised', + ], + }, + { + code: 'šŸ˜Ŗ', + keywords: [ + 'face', + 'sleep', + ], + }, + { + code: 'šŸ˜«', + keywords: [ + 'face', + 'tired', + ], + }, + { + code: 'šŸ˜“', + keywords: [ + 'face', + 'sleep', + 'zzz', + ], + }, + { + code: 'šŸ˜Œ', + keywords: [ + 'face', + 'relieved', + ], + }, + { + code: 'šŸ¤“', + keywords: [ + 'face', + 'geek', + 'nerd', + ], + }, + { + code: 'šŸ˜›', + keywords: [ + 'face', + 'tongue', + ], + }, + { + code: 'šŸ˜œ', + keywords: [ + 'eye', + 'face', + 'joke', + 'tongue', + 'wink', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'eye', + 'face', + 'horrible', + 'taste', + 'tongue', + ], + }, + { + code: 'šŸ¤¤', + keywords: [ + 'drooling', + 'face', + ], + }, + { + code: 'šŸ˜’', + keywords: [ + 'face', + 'unamused', + 'unhappy', + ], + }, + { + code: 'šŸ˜“', + keywords: [ + 'cold', + 'face', + 'sweat', + ], + }, + { + code: 'šŸ˜”', + keywords: [ + 'dejected', + 'face', + 'pensive', + ], + }, + { + code: 'šŸ˜•', + keywords: [ + 'confused', + 'face', + ], + }, + { + code: 'šŸ™ƒ', + keywords: [ + 'face', + 'upside-down', + ], + }, + { + code: 'šŸ¤‘', + keywords: [ + 'face', + 'money', + 'mouth', + ], + }, + { + code: 'šŸ˜²', + keywords: [ + 'astonished', + 'face', + 'shocked', + 'totally', + ], + }, + { + code: 'ā˜¹', + keywords: [ + 'face', + 'frown', + ], + }, + { + code: 'šŸ™', + keywords: [ + 'face', + 'frown', + ], + }, + { + code: 'šŸ˜–', + keywords: [ + 'confounded', + 'face', + ], + }, + { + code: 'šŸ˜ž', + keywords: [ + 'disappointed', + 'face', + ], + }, + { + code: 'šŸ˜Ÿ', + keywords: [ + 'face', + 'worried', + ], + }, + { + code: 'šŸ˜¤', + keywords: [ + 'face', + 'triumph', + 'won', + ], + }, + { + code: 'šŸ˜¢', + keywords: [ + 'cry', + 'face', + 'sad', + 'tear', + ], + }, + { + code: 'šŸ˜­', + keywords: [ + 'cry', + 'face', + 'sad', + 'sob', + 'tear', + ], + }, + { + code: 'šŸ˜¦', + keywords: [ + 'face', + 'frown', + 'mouth', + 'open', + ], + }, + { + code: 'šŸ˜§', + keywords: [ + 'anguished', + 'face', + ], + }, + { + code: 'šŸ˜Ø', + keywords: [ + 'face', + 'fear', + 'fearful', + 'scared', + ], + }, + { + code: 'šŸ˜©', + keywords: [ + 'face', + 'tired', + 'weary', + ], + }, + { + code: 'šŸ˜¬', + keywords: [ + 'face', + 'grimace', + ], + }, + { + code: 'šŸ˜°', + keywords: [ + 'blue', + 'cold', + 'face', + 'mouth', + 'open', + 'rushed', + 'sweat', + ], + }, + { + code: 'šŸ˜±', + keywords: [ + 'face', + 'fear', + 'fearful', + 'munch', + 'scared', + 'scream', + ], + }, + { + code: 'šŸ˜³', + keywords: [ + 'dazed', + 'face', + 'flushed', + ], + }, + { + code: 'šŸ˜µ', + keywords: [ + 'dizzy', + 'face', + ], + }, + { + code: 'šŸ˜”', + keywords: [ + 'angry', + 'face', + 'mad', + 'pouting', + 'rage', + 'red', + ], + }, + { + code: 'šŸ˜ ', + keywords: [ + 'angry', + 'face', + 'mad', + ], + }, + { + code: 'šŸ˜‡', + keywords: [ + 'angel', + 'face', + 'fairy tale', + 'fantasy', + 'halo', + 'innocent', + 'smile', + ], + }, + { + code: 'šŸ¤ ', + keywords: [ + 'cowboy', + 'cowgirl', + 'face', + 'hat', + ], + }, + { + code: 'šŸ¤”', + keywords: [ + 'clown', + 'face', + ], + }, + { + code: 'šŸ¤„', + keywords: [ + 'face', + 'lie', + 'pinocchio', + ], + }, + { + code: 'šŸ˜·', + keywords: [ + 'cold', + 'doctor', + 'face', + 'mask', + 'medicine', + 'sick', + ], + }, + { + code: 'šŸ¤’', + keywords: [ + 'face', + 'ill', + 'sick', + 'thermometer', + ], + }, + { + code: 'šŸ¤•', + keywords: [ + 'bandage', + 'face', + 'hurt', + 'injury', + ], + }, + { + code: 'šŸ¤¢', + keywords: [ + 'face', + 'nauseated', + 'vomit', + ], + }, + { + code: 'šŸ¤§', + keywords: [ + 'face', + 'gesundheit', + 'sneeze', + ], + }, + { + code: 'šŸ˜ˆ', + keywords: [ + 'face', + 'fairy tale', + 'fantasy', + 'horns', + 'smile', + ], + }, + { + code: 'šŸ‘æ', + keywords: [ + 'demon', + 'devil', + 'face', + 'fairy tale', + 'fantasy', + 'imp', + ], + }, + { + code: 'šŸ‘¹', + keywords: [ + 'creature', + 'face', + 'fairy tale', + 'fantasy', + 'japanese', + 'monster', + 'ogre', + ], + }, + { + code: 'šŸ‘ŗ', + keywords: [ + 'creature', + 'face', + 'fairy tale', + 'fantasy', + 'goblin', + 'japanese', + 'monster', + ], + }, + { + code: 'šŸ’€', + keywords: [ + 'body', + 'death', + 'face', + 'fairy tale', + 'monster', + 'skull', + ], + }, + { + code: 'ā˜ ', + keywords: [ + 'body', + 'crossbones', + 'death', + 'face', + 'monster', + 'skull', + ], + }, + { + code: 'šŸ‘»', + keywords: [ + 'creature', + 'face', + 'fairy tale', + 'fantasy', + 'ghost', + 'monster', + ], + }, + { + code: 'šŸ‘½', + keywords: [ + 'alien', + 'creature', + 'extraterrestrial', + 'face', + 'fairy tale', + 'fantasy', + 'monster', + 'space', + 'ufo', + ], + }, + { + code: 'šŸ‘¾', + keywords: [ + 'alien', + 'creature', + 'extraterrestrial', + 'face', + 'fairy tale', + 'fantasy', + 'monster', + 'space', + 'ufo', + ], + }, + { + code: 'šŸ¤–', + keywords: [ + 'face', + 'monster', + 'robot', + ], + }, + { + code: 'šŸ’©', + keywords: [ + 'comic', + 'dung', + 'face', + 'monster', + 'poo', + 'poop', + ], + }, + { + code: 'šŸ˜ŗ', + keywords: [ + 'cat', + 'face', + 'mouth', + 'open', + 'smile', + ], + }, + { + code: 'šŸ˜ø', + keywords: [ + 'cat', + 'eye', + 'face', + 'grin', + 'smile', + ], + }, + { + code: 'šŸ˜¹', + keywords: [ + 'cat', + 'face', + 'joy', + 'tear', + ], + }, + { + code: 'šŸ˜»', + keywords: [ + 'cat', + 'eye', + 'face', + 'heart', + 'love', + 'smile', + ], + }, + { + code: 'šŸ˜¼', + keywords: [ + 'cat', + 'face', + 'ironic', + 'smile', + 'wry', + ], + }, + { + code: 'šŸ˜½', + keywords: [ + 'cat', + 'eye', + 'face', + 'kiss', + ], + }, + { + code: 'šŸ™€', + keywords: [ + 'cat', + 'face', + 'oh', + 'surprised', + 'weary', + ], + }, + { + code: 'šŸ˜æ', + keywords: [ + 'cat', + 'cry', + 'face', + 'sad', + 'tear', + ], + }, + { + code: 'šŸ˜¾', + keywords: [ + 'cat', + 'face', + 'pouting', + ], + }, + { + code: 'šŸ™ˆ', + keywords: [ + 'evil', + 'face', + 'forbidden', + 'gesture', + 'monkey', + 'no', + 'not', + 'prohibited', + 'see', + ], + }, + { + code: 'šŸ™‰', + keywords: [ + 'evil', + 'face', + 'forbidden', + 'gesture', + 'hear', + 'monkey', + 'no', + 'not', + 'prohibited', + ], + }, + { + code: 'šŸ™Š', + keywords: [ + 'evil', + 'face', + 'forbidden', + 'gesture', + 'monkey', + 'no', + 'not', + 'prohibited', + 'speak', + ], + }, + { + code: 'šŸ‘¦', + keywords: [ + 'boy', + ], + types: [ + 'šŸ‘¦šŸæ', + 'šŸ‘¦šŸ¾', + 'šŸ‘¦šŸ½', + 'šŸ‘¦šŸ¼', + 'šŸ‘¦šŸ»', + ], + }, + { + code: 'šŸ‘§', + keywords: [ + 'girl', + 'maiden', + 'virgin', + 'virgo', + 'zodiac', + ], + types: [ + 'šŸ‘§šŸæ', + 'šŸ‘§šŸ¾', + 'šŸ‘§šŸ½', + 'šŸ‘§šŸ¼', + 'šŸ‘§šŸ»', + ], + }, + { + code: 'šŸ‘Ø', + keywords: [ + 'man', + ], + types: [ + 'šŸ‘ØšŸæ', + 'šŸ‘ØšŸ¾', + 'šŸ‘ØšŸ½', + 'šŸ‘ØšŸ¼', + 'šŸ‘ØšŸ»', + ], + }, + { + code: 'šŸ‘©', + keywords: [ + 'woman', + ], + types: [ + 'šŸ‘©šŸæ', + 'šŸ‘©šŸ¾', + 'šŸ‘©šŸ½', + 'šŸ‘©šŸ¼', + 'šŸ‘©šŸ»', + ], + }, + { + code: 'šŸ‘“', + keywords: [ + 'man', + 'old', + ], + types: [ + 'šŸ‘“šŸæ', + 'šŸ‘“šŸ¾', + 'šŸ‘“šŸ½', + 'šŸ‘“šŸ¼', + 'šŸ‘“šŸ»', + ], + }, + { + code: 'šŸ‘µ', + keywords: [ + 'old', + 'woman', + ], + types: [ + 'šŸ‘µšŸæ', + 'šŸ‘µšŸ¾', + 'šŸ‘µšŸ½', + 'šŸ‘µšŸ¼', + 'šŸ‘µšŸ»', + ], + }, + { + code: 'šŸ‘¶', + keywords: [ + 'baby', + ], + types: [ + 'šŸ‘¶šŸæ', + 'šŸ‘¶šŸ¾', + 'šŸ‘¶šŸ½', + 'šŸ‘¶šŸ¼', + 'šŸ‘¶šŸ»', + ], + }, + { + code: 'šŸ‘¼', + keywords: [ + 'angel', + 'baby', + 'face', + 'fairy tale', + 'fantasy', + ], + types: [ + 'šŸ‘¼šŸæ', + 'šŸ‘¼šŸ¾', + 'šŸ‘¼šŸ½', + 'šŸ‘¼šŸ¼', + 'šŸ‘¼šŸ»', + ], + }, + { + code: 'šŸ‘±', + keywords: [ + 'blond', + ], + types: [ + 'šŸ‘±šŸæ', + 'šŸ‘±šŸ¾', + 'šŸ‘±šŸ½', + 'šŸ‘±šŸ¼', + 'šŸ‘±šŸ»', + ], + }, + { + code: 'šŸ‘®', + keywords: [ + 'cop', + 'officer', + 'police', + ], + types: [ + 'šŸ‘®šŸæ', + 'šŸ‘®šŸ¾', + 'šŸ‘®šŸ½', + 'šŸ‘®šŸ¼', + 'šŸ‘®šŸ»', + ], + }, + { + code: 'šŸ‘²', + keywords: [ + 'gua pi mao', + 'hat', + 'man', + ], + types: [ + 'šŸ‘²šŸæ', + 'šŸ‘²šŸ¾', + 'šŸ‘²šŸ½', + 'šŸ‘²šŸ¼', + 'šŸ‘²šŸ»', + ], + }, + { + code: 'šŸ‘³', + keywords: [ + 'man', + 'turban', + ], + types: [ + 'šŸ‘³šŸæ', + 'šŸ‘³šŸ¾', + 'šŸ‘³šŸ½', + 'šŸ‘³šŸ¼', + 'šŸ‘³šŸ»', + ], + }, + { + code: 'šŸ‘·', + keywords: [ + 'construction', + 'hat', + 'worker', + ], + types: [ + 'šŸ‘·šŸæ', + 'šŸ‘·šŸ¾', + 'šŸ‘·šŸ½', + 'šŸ‘·šŸ¼', + 'šŸ‘·šŸ»', + ], + }, + { + code: 'šŸ‘ø', + keywords: [ + 'fairy tale', + 'fantasy', + 'princess', + ], + types: [ + 'šŸ‘øšŸæ', + 'šŸ‘øšŸ¾', + 'šŸ‘øšŸ½', + 'šŸ‘øšŸ¼', + 'šŸ‘øšŸ»', + ], + }, + { + code: 'šŸ¤“', + keywords: [ + 'prince', + ], + types: [ + 'šŸ¤“šŸæ', + 'šŸ¤“šŸ¾', + 'šŸ¤“šŸ½', + 'šŸ¤“šŸ¼', + 'šŸ¤“šŸ»', + ], + }, + { + code: 'šŸ’‚', + keywords: [ + 'guard', + 'guardsman', + ], + types: [ + 'šŸ’‚šŸæ', + 'šŸ’‚šŸ¾', + 'šŸ’‚šŸ½', + 'šŸ’‚šŸ¼', + 'šŸ’‚šŸ»', + ], + }, + { + code: 'šŸ•µ', + keywords: [ + 'detective', + 'sleuth', + 'spy', + ], + types: [ + 'šŸ•µšŸæ', + 'šŸ•µšŸ¾', + 'šŸ•µšŸ½', + 'šŸ•µšŸ¼', + 'šŸ•µšŸ»', + ], + }, + { + code: 'šŸŽ…', + keywords: [ + 'activity', + 'celebration', + 'christmas', + 'fairy tale', + 'fantasy', + 'father', + 'santa', + ], + types: [ + 'šŸŽ…šŸæ', + 'šŸŽ…šŸ¾', + 'šŸŽ…šŸ½', + 'šŸŽ…šŸ¼', + 'šŸŽ…šŸ»', + ], + }, + { + code: 'šŸ¤¶', + keywords: [ + 'christmas', + 'mother', + 'mrs. claus', + ], + types: [ + 'šŸ¤¶šŸæ', + 'šŸ¤¶šŸ¾', + 'šŸ¤¶šŸ½', + 'šŸ¤¶šŸ¼', + 'šŸ¤¶šŸ»', + ], + }, + { + code: 'šŸ‘°', + keywords: [ + 'bride', + 'veil', + 'wedding', + ], + types: [ + 'šŸ‘°šŸæ', + 'šŸ‘°šŸ¾', + 'šŸ‘°šŸ½', + 'šŸ‘°šŸ¼', + 'šŸ‘°šŸ»', + ], + }, + { + code: 'šŸ¤µ', + keywords: [ + 'groom', + 'man', + 'tuxedo', + ], + types: [ + 'šŸ¤µšŸæ', + 'šŸ¤µšŸ¾', + 'šŸ¤µšŸ½', + 'šŸ¤µšŸ¼', + 'šŸ¤µšŸ»', + ], + }, + { + code: 'šŸ’†', + keywords: [ + 'massage', + 'salon', + ], + types: [ + 'šŸ’†šŸæ', + 'šŸ’†šŸ¾', + 'šŸ’†šŸ½', + 'šŸ’†šŸ¼', + 'šŸ’†šŸ»', + ], + }, + { + code: 'šŸ’‡', + keywords: [ + 'barber', + 'beauty', + 'haircut', + 'parlor', + ], + types: [ + 'šŸ’‡šŸæ', + 'šŸ’‡šŸ¾', + 'šŸ’‡šŸ½', + 'šŸ’‡šŸ¼', + 'šŸ’‡šŸ»', + ], + }, + { + code: 'šŸ™', + keywords: [ + 'frown', + 'gesture', + ], + types: [ + 'šŸ™šŸæ', + 'šŸ™šŸ¾', + 'šŸ™šŸ½', + 'šŸ™šŸ¼', + 'šŸ™šŸ»', + ], + }, + { + code: 'šŸ™Ž', + keywords: [ + 'gesture', + 'pouting', + ], + types: [ + 'šŸ™ŽšŸæ', + 'šŸ™ŽšŸ¾', + 'šŸ™ŽšŸ½', + 'šŸ™ŽšŸ¼', + 'šŸ™ŽšŸ»', + ], + }, + { + code: 'šŸ™…', + keywords: [ + 'forbidden', + 'gesture', + 'hand', + 'no', + 'not', + 'prohibited', + ], + types: [ + 'šŸ™…šŸæ', + 'šŸ™…šŸ¾', + 'šŸ™…šŸ½', + 'šŸ™…šŸ¼', + 'šŸ™…šŸ»', + ], + }, + { + code: 'šŸ™†', + keywords: [ + 'gesture', + 'hand', + 'ok', + ], + types: [ + 'šŸ™†šŸæ', + 'šŸ™†šŸ¾', + 'šŸ™†šŸ½', + 'šŸ™†šŸ¼', + 'šŸ™†šŸ»', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'hand', + 'help', + 'information', + 'sassy', + ], + types: [ + 'šŸ’šŸæ', + 'šŸ’šŸ¾', + 'šŸ’šŸ½', + 'šŸ’šŸ¼', + 'šŸ’šŸ»', + ], + }, + { + code: 'šŸ¤·', + keywords: [ + 'doubt', + 'ignorance', + 'indifference', + 'shrug', + ], + types: [ + 'šŸ¤·šŸæ', + 'šŸ¤·šŸ¾', + 'šŸ¤·šŸ½', + 'šŸ¤·šŸ¼', + 'šŸ¤·šŸ»', + ], + }, + { + code: 'šŸ™‹', + keywords: [ + 'gesture', + 'hand', + 'happy', + 'raised', + ], + types: [ + 'šŸ™‹šŸæ', + 'šŸ™‹šŸ¾', + 'šŸ™‹šŸ½', + 'šŸ™‹šŸ¼', + 'šŸ™‹šŸ»', + ], + }, + { + code: 'šŸ¤¦', + keywords: [ + 'disbelief', + 'exasperation', + 'face', + 'palm', + ], + types: [ + 'šŸ¤¦šŸæ', + 'šŸ¤¦šŸ¾', + 'šŸ¤¦šŸ½', + 'šŸ¤¦šŸ¼', + 'šŸ¤¦šŸ»', + ], + }, + { + code: 'šŸ™‡', + keywords: [ + 'apology', + 'bow', + 'gesture', + 'sorry', + ], + types: [ + 'šŸ™‡šŸæ', + 'šŸ™‡šŸ¾', + 'šŸ™‡šŸ½', + 'šŸ™‡šŸ¼', + 'šŸ™‡šŸ»', + ], + }, + { + code: 'šŸš¶', + keywords: [ + 'hike', + 'pedestrian', + 'walk', + 'walking', + ], + types: [ + 'šŸš¶šŸæ', + 'šŸš¶šŸ¾', + 'šŸš¶šŸ½', + 'šŸš¶šŸ¼', + 'šŸš¶šŸ»', + ], + }, + { + code: 'šŸƒ', + keywords: [ + 'marathon', + 'runner', + 'running', + ], + types: [ + 'šŸƒšŸæ', + 'šŸƒšŸ¾', + 'šŸƒšŸ½', + 'šŸƒšŸ¼', + 'šŸƒšŸ»', + ], + }, + { + code: 'šŸ’ƒ', + keywords: [ + 'dancer', + ], + types: [ + 'šŸ’ƒšŸæ', + 'šŸ’ƒšŸ¾', + 'šŸ’ƒšŸ½', + 'šŸ’ƒšŸ¼', + 'šŸ’ƒšŸ»', + ], + }, + { + code: 'šŸ•ŗ', + keywords: [ + 'dance', + 'man', + ], + types: [ + 'šŸ•ŗšŸæ', + 'šŸ•ŗšŸ¾', + 'šŸ•ŗšŸ½', + 'šŸ•ŗšŸ¼', + 'šŸ•ŗšŸ»', + ], + }, + { + code: 'šŸ¤°', + keywords: [ + 'pregnant', + 'woman', + ], + types: [ + 'šŸ¤°šŸæ', + 'šŸ¤°šŸ¾', + 'šŸ¤°šŸ½', + 'šŸ¤°šŸ¼', + 'šŸ¤°šŸ»', + ], + }, + { + code: 'šŸ‘Æ', + keywords: [ + 'bunny', + 'dancer', + 'ear', + 'girl', + 'woman', + ], + }, + { + code: 'šŸ•“', + keywords: [ + 'business', + 'man', + 'suit', + ], + }, + { + code: 'šŸ—£', + keywords: [ + 'face', + 'head', + 'silhouette', + 'speak', + 'speaking', + ], + }, + { + code: 'šŸ‘¤', + keywords: [ + 'bust', + 'silhouette', + ], + }, + { + code: 'šŸ‘„', + keywords: [ + 'bust', + 'silhouette', + ], + }, + { + code: 'šŸ‘«', + keywords: [ + 'couple', + 'hand', + 'hold', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘¬', + keywords: [ + 'couple', + 'gemini', + 'hand', + 'hold', + 'man', + 'twins', + 'zodiac', + ], + }, + { + code: 'šŸ‘­', + keywords: [ + 'couple', + 'hand', + 'hold', + 'woman', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'couple', + 'kiss', + 'romance', + ], + }, + { + code: 'šŸ‘©ā€ā¤ļøā€šŸ’‹ā€šŸ‘Ø', + keywords: [ + 'kiss', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘Øā€ā¤ļøā€šŸ’‹ā€šŸ‘Ø', + keywords: [ + 'kiss', + 'man', + ], + }, + { + code: 'šŸ‘©ā€ā¤ļøā€šŸ’‹ā€šŸ‘©', + keywords: [ + 'kiss', + 'woman', + ], + }, + { + code: 'šŸ’‘', + keywords: [ + 'couple', + 'heart', + 'love', + 'romance', + ], + }, + { + code: 'šŸ‘©ā€ā¤ļøā€šŸ‘Ø', + keywords: [ + 'couple', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘Øā€ā¤ļøā€šŸ‘Ø', + keywords: [ + 'couple', + 'man', + ], + }, + { + code: 'šŸ‘©ā€ā¤ļøā€šŸ‘©', + keywords: [ + 'couple', + 'woman', + ], + }, + { + code: 'šŸ‘Ŗ', + keywords: [ + 'child', + 'family', + 'father', + 'mother', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘§', + keywords: [ + 'family', + 'girl', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘§ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'girl', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘¦ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘§ā€šŸ‘§', + keywords: [ + 'family', + 'girl', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'man', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘§', + keywords: [ + 'family', + 'girl', + 'man', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘§ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'girl', + 'man', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘¦ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'man', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘§ā€šŸ‘§', + keywords: [ + 'family', + 'girl', + 'man', + ], + }, + { + code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'woman', + ], + }, + { + code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘§', + keywords: [ + 'family', + 'girl', + 'woman', + ], + }, + { + code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘§ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'girl', + 'woman', + ], + }, + { + code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘¦ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'woman', + ], + }, + { + code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘§ā€šŸ‘§', + keywords: [ + 'family', + 'girl', + 'woman', + ], + }, + { + code: 'šŸ»', + keywords: [ + 'emoji modifier', + 'fitzpatrick', + 'skin', + 'tone', + ], + }, + { + code: 'šŸ¼', + keywords: [ + 'emoji modifier', + 'fitzpatrick', + 'skin', + 'tone', + ], + }, + { + code: 'šŸ½', + keywords: [ + 'emoji modifier', + 'fitzpatrick', + 'skin', + 'tone', + ], + }, + { + code: 'šŸ¾', + keywords: [ + 'emoji modifier', + 'fitzpatrick', + 'skin', + 'tone', + ], + }, + { + code: 'šŸæ', + keywords: [ + 'emoji modifier', + 'fitzpatrick', + 'skin', + 'tone', + ], + }, + { + code: 'šŸ’Ŗ', + keywords: [ + 'biceps', + 'body', + 'comic', + 'flex', + 'muscle', + ], + types: [ + 'šŸ’ŖšŸæ', + 'šŸ’ŖšŸ¾', + 'šŸ’ŖšŸ½', + 'šŸ’ŖšŸ¼', + 'šŸ’ŖšŸ»', + ], + }, + { + code: 'šŸ¤³', + keywords: [ + 'camera', + 'phone', + 'selfie', + ], + types: [ + 'šŸ¤³šŸæ', + 'šŸ¤³šŸ¾', + 'šŸ¤³šŸ½', + 'šŸ¤³šŸ¼', + 'šŸ¤³šŸ»', + ], + }, + { + code: 'šŸ‘ˆ', + keywords: [ + 'backhand', + 'body', + 'finger', + 'hand', + 'index', + 'point', + ], + types: [ + 'šŸ‘ˆšŸæ', + 'šŸ‘ˆšŸ¾', + 'šŸ‘ˆšŸ½', + 'šŸ‘ˆšŸ¼', + 'šŸ‘ˆšŸ»', + ], + }, + { + code: 'šŸ‘‰', + keywords: [ + 'backhand', + 'body', + 'finger', + 'hand', + 'index', + 'point', + ], + types: [ + 'šŸ‘‰šŸæ', + 'šŸ‘‰šŸ¾', + 'šŸ‘‰šŸ½', + 'šŸ‘‰šŸ¼', + 'šŸ‘‰šŸ»', + ], + }, + { + code: 'ā˜', + keywords: [ + 'body', + 'finger', + 'hand', + 'index', + 'point', + 'up', + ], + types: [ + 'ā˜šŸæ', + 'ā˜šŸ¾', + 'ā˜šŸ½', + 'ā˜šŸ¼', + 'ā˜šŸ»', + ], + }, + { + code: 'šŸ‘†', + keywords: [ + 'backhand', + 'body', + 'finger', + 'hand', + 'index', + 'point', + 'up', + ], + types: [ + 'šŸ‘†šŸæ', + 'šŸ‘†šŸ¾', + 'šŸ‘†šŸ½', + 'šŸ‘†šŸ¼', + 'šŸ‘†šŸ»', + ], + }, + { + code: 'šŸ–•', + keywords: [ + 'body', + 'finger', + 'hand', + 'middle finger', + ], + types: [ + 'šŸ–•šŸæ', + 'šŸ–•šŸ¾', + 'šŸ–•šŸ½', + 'šŸ–•šŸ¼', + 'šŸ–•šŸ»', + ], + }, + { + code: 'šŸ‘‡', + keywords: [ + 'backhand', + 'body', + 'down', + 'finger', + 'hand', + 'index', + 'point', + ], + types: [ + 'šŸ‘‡šŸæ', + 'šŸ‘‡šŸ¾', + 'šŸ‘‡šŸ½', + 'šŸ‘‡šŸ¼', + 'šŸ‘‡šŸ»', + ], + }, + { + code: 'āœŒ', + keywords: [ + 'body', + 'hand', + 'v', + 'victory', + ], + types: [ + 'āœŒšŸæ', + 'āœŒšŸ¾', + 'āœŒšŸ½', + 'āœŒšŸ¼', + 'āœŒšŸ»', + ], + }, + { + code: 'šŸ¤ž', + keywords: [ + 'cross', + 'finger', + 'hand', + 'luck', + ], + types: [ + 'šŸ¤žšŸæ', + 'šŸ¤žšŸ¾', + 'šŸ¤žšŸ½', + 'šŸ¤žšŸ¼', + 'šŸ¤žšŸ»', + ], + }, + { + code: 'šŸ––', + keywords: [ + 'body', + 'finger', + 'hand', + 'spock', + 'vulcan', + ], + types: [ + 'šŸ––šŸæ', + 'šŸ––šŸ¾', + 'šŸ––šŸ½', + 'šŸ––šŸ¼', + 'šŸ––šŸ»', + ], + }, + { + code: 'šŸ¤˜', + keywords: [ + 'body', + 'finger', + 'hand', + 'horns', + 'rock-on', + ], + types: [ + 'šŸ¤˜šŸæ', + 'šŸ¤˜šŸ¾', + 'šŸ¤˜šŸ½', + 'šŸ¤˜šŸ¼', + 'šŸ¤˜šŸ»', + ], + }, + { + code: 'šŸ¤™', + keywords: [ + 'call', + 'hand', + ], + types: [ + 'šŸ¤™šŸæ', + 'šŸ¤™šŸ¾', + 'šŸ¤™šŸ½', + 'šŸ¤™šŸ¼', + 'šŸ¤™šŸ»', + ], + }, + { + code: 'šŸ–', + keywords: [ + 'body', + 'finger', + 'hand', + 'splayed', + ], + types: [ + 'šŸ–šŸæ', + 'šŸ–šŸ¾', + 'šŸ–šŸ½', + 'šŸ–šŸ¼', + 'šŸ–šŸ»', + ], + }, + { + code: 'āœ‹', + keywords: [ + 'body', + 'hand', + ], + types: [ + 'āœ‹šŸæ', + 'āœ‹šŸ¾', + 'āœ‹šŸ½', + 'āœ‹šŸ¼', + 'āœ‹šŸ»', + ], + }, + { + code: 'šŸ‘Œ', + keywords: [ + 'body', + 'hand', + 'ok', + ], + types: [ + 'šŸ‘ŒšŸæ', + 'šŸ‘ŒšŸ¾', + 'šŸ‘ŒšŸ½', + 'šŸ‘ŒšŸ¼', + 'šŸ‘ŒšŸ»', + ], + }, + { + code: 'šŸ‘', + keywords: [ + '+1', + 'body', + 'hand', + 'thumb', + 'thumbs up', + 'up', + ], + types: [ + 'šŸ‘šŸæ', + 'šŸ‘šŸ¾', + 'šŸ‘šŸ½', + 'šŸ‘šŸ¼', + 'šŸ‘šŸ»', + ], + }, + { + code: 'šŸ‘Ž', + keywords: [ + '-1', + 'body', + 'down', + 'hand', + 'thumb', + 'thumbs down', + ], + types: [ + 'šŸ‘ŽšŸæ', + 'šŸ‘ŽšŸ¾', + 'šŸ‘ŽšŸ½', + 'šŸ‘ŽšŸ¼', + 'šŸ‘ŽšŸ»', + ], + }, + { + code: 'āœŠ', + keywords: [ + 'body', + 'clenched', + 'fist', + 'hand', + 'punch', + ], + types: [ + 'āœŠšŸæ', + 'āœŠšŸ¾', + 'āœŠšŸ½', + 'āœŠšŸ¼', + 'āœŠšŸ»', + ], + }, + { + code: 'šŸ‘Š', + keywords: [ + 'body', + 'clenched', + 'fist', + 'hand', + 'punch', + ], + types: [ + 'šŸ‘ŠšŸæ', + 'šŸ‘ŠšŸ¾', + 'šŸ‘ŠšŸ½', + 'šŸ‘ŠšŸ¼', + 'šŸ‘ŠšŸ»', + ], + }, + { + code: 'šŸ¤›', + keywords: [ + 'fist', + 'leftwards', + ], + types: [ + 'šŸ¤›šŸæ', + 'šŸ¤›šŸ¾', + 'šŸ¤›šŸ½', + 'šŸ¤›šŸ¼', + 'šŸ¤›šŸ»', + ], + }, + { + code: 'šŸ¤œ', + keywords: [ + 'fist', + 'rightwards', + ], + types: [ + 'šŸ¤œšŸæ', + 'šŸ¤œšŸ¾', + 'šŸ¤œšŸ½', + 'šŸ¤œšŸ¼', + 'šŸ¤œšŸ»', + ], + }, + { + code: 'šŸ¤š', + keywords: [ + 'backhand', + 'raised', + ], + types: [ + 'šŸ¤ššŸæ', + 'šŸ¤ššŸ¾', + 'šŸ¤ššŸ½', + 'šŸ¤ššŸ¼', + 'šŸ¤ššŸ»', + ], + }, + { + code: 'šŸ‘‹', + keywords: [ + 'body', + 'hand', + 'wave', + 'waving', + ], + types: [ + 'šŸ‘‹šŸæ', + 'šŸ‘‹šŸ¾', + 'šŸ‘‹šŸ½', + 'šŸ‘‹šŸ¼', + 'šŸ‘‹šŸ»', + ], + }, + { + code: 'šŸ‘', + keywords: [ + 'body', + 'clap', + 'hand', + ], + types: [ + 'šŸ‘šŸæ', + 'šŸ‘šŸ¾', + 'šŸ‘šŸ½', + 'šŸ‘šŸ¼', + 'šŸ‘šŸ»', + ], + }, + { + code: 'āœ', + keywords: [ + 'body', + 'hand', + 'write', + ], + types: [ + 'āœšŸæ', + 'āœšŸ¾', + 'āœšŸ½', + 'āœšŸ¼', + 'āœšŸ»', + ], + }, + { + code: 'šŸ‘', + keywords: [ + 'body', + 'hand', + 'open', + ], + types: [ + 'šŸ‘šŸæ', + 'šŸ‘šŸ¾', + 'šŸ‘šŸ½', + 'šŸ‘šŸ¼', + 'šŸ‘šŸ»', + ], + }, + { + code: 'šŸ™Œ', + keywords: [ + 'body', + 'celebration', + 'gesture', + 'hand', + 'hooray', + 'raised', + ], + types: [ + 'šŸ™ŒšŸæ', + 'šŸ™ŒšŸ¾', + 'šŸ™ŒšŸ½', + 'šŸ™ŒšŸ¼', + 'šŸ™ŒšŸ»', + ], + }, + { + code: 'šŸ™', + keywords: [ + 'ask', + 'body', + 'bow', + 'folded', + 'gesture', + 'hand', + 'please', + 'pray', + 'thanks', + ], + types: [ + 'šŸ™šŸæ', + 'šŸ™šŸ¾', + 'šŸ™šŸ½', + 'šŸ™šŸ¼', + 'šŸ™šŸ»', + ], + }, + { + code: 'šŸ¤', + keywords: [ + 'agreement', + 'hand', + 'handshake', + 'meeting', + 'shake', + ], + types: [ + 'šŸ¤šŸæ', + 'šŸ¤šŸ¾', + 'šŸ¤šŸ½', + 'šŸ¤šŸ¼', + 'šŸ¤šŸ»', + ], + }, + { + code: 'šŸ’…', + keywords: [ + 'body', + 'care', + 'cosmetics', + 'manicure', + 'nail', + 'polish', + ], + types: [ + 'šŸ’…šŸæ', + 'šŸ’…šŸ¾', + 'šŸ’…šŸ½', + 'šŸ’…šŸ¼', + 'šŸ’…šŸ»', + ], + }, + { + code: 'šŸ‘‚', + keywords: [ + 'body', + 'ear', + ], + types: [ + 'šŸ‘‚šŸæ', + 'šŸ‘‚šŸ¾', + 'šŸ‘‚šŸ½', + 'šŸ‘‚šŸ¼', + 'šŸ‘‚šŸ»', + ], + }, + { + code: 'šŸ‘ƒ', + keywords: [ + 'body', + 'nose', + ], + types: [ + 'šŸ‘ƒšŸæ', + 'šŸ‘ƒšŸ¾', + 'šŸ‘ƒšŸ½', + 'šŸ‘ƒšŸ¼', + 'šŸ‘ƒšŸ»', + ], + }, + { + code: 'šŸ‘£', + keywords: [ + 'body', + 'clothing', + 'footprint', + 'print', + ], + }, + { + code: 'šŸ‘€', + keywords: [ + 'body', + 'eye', + 'face', + ], + }, + { + code: 'šŸ‘', + keywords: [ + 'body', + 'eye', + ], + }, + { + code: 'šŸ‘ā€šŸ—Ø', + keywords: [ + 'bubble', + 'eye', + 'speech', + 'witness', + ], + }, + { + code: 'šŸ‘…', + keywords: [ + 'body', + 'tongue', + ], + }, + { + code: 'šŸ‘„', + keywords: [ + 'body', + 'lips', + 'mouth', + ], + }, + { + code: 'šŸ’‹', + keywords: [ + 'heart', + 'kiss', + 'lips', + 'mark', + 'romance', + ], + }, + { + code: 'šŸ’˜', + keywords: [ + 'arrow', + 'cupid', + 'heart', + 'romance', + ], + }, + { + code: 'ā¤', + keywords: [ + 'heart', + ], + }, + { + code: 'šŸ’“', + keywords: [ + 'beating', + 'heart', + 'heartbeat', + 'pulsating', + ], + }, + { + code: 'šŸ’”', + keywords: [ + 'break', + 'broken', + 'heart', + ], + }, + { + code: 'šŸ’•', + keywords: [ + 'heart', + 'love', + ], + }, + { + code: 'šŸ’–', + keywords: [ + 'excited', + 'heart', + 'sparkle', + ], + }, + { + code: 'šŸ’—', + keywords: [ + 'excited', + 'growing', + 'heart', + 'heartpulse', + 'nervous', + ], + }, + { + code: 'šŸ’™', + keywords: [ + 'blue', + 'heart', + ], + }, + { + code: 'šŸ’š', + keywords: [ + 'green', + 'heart', + ], + }, + { + code: 'šŸ’›', + keywords: [ + 'heart', + 'yellow', + ], + }, + { + code: 'šŸ’œ', + keywords: [ + 'heart', + 'purple', + ], + }, + { + code: 'šŸ–¤', + keywords: [ + 'black', + 'evil', + 'heart', + 'wicked', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'heart', + 'ribbon', + 'valentine', + ], + }, + { + code: 'šŸ’ž', + keywords: [ + 'heart', + 'revolving', + ], + }, + { + code: 'šŸ’Ÿ', + keywords: [ + 'heart', + ], + }, + { + code: 'ā£', + keywords: [ + 'exclamation', + 'heart', + 'mark', + 'punctuation', + ], + }, + { + code: 'šŸ’Œ', + keywords: [ + 'heart', + 'letter', + 'love', + 'mail', + 'romance', + ], + }, + { + code: 'šŸ’¤', + keywords: [ + 'comic', + 'sleep', + 'zzz', + ], + }, + { + code: 'šŸ’¢', + keywords: [ + 'angry', + 'comic', + 'mad', + ], + }, + { + code: 'šŸ’£', + keywords: [ + 'bomb', + 'comic', + ], + }, + { + code: 'šŸ’„', + keywords: [ + 'boom', + 'collision', + 'comic', + ], + }, + { + code: 'šŸ’¦', + keywords: [ + 'comic', + 'splashing', + 'sweat', + ], + }, + { + code: 'šŸ’Ø', + keywords: [ + 'comic', + 'dash', + 'running', + ], + }, + { + code: 'šŸ’«', + keywords: [ + 'comic', + 'dizzy', + 'star', + ], + }, + { + code: 'šŸ’¬', + keywords: [ + 'balloon', + 'bubble', + 'comic', + 'dialog', + 'speech', + ], + }, + { + code: 'šŸ—Ø', + keywords: [ + 'dialog', + 'speech', + ], + }, + { + code: 'šŸ—Æ', + keywords: [ + 'angry', + 'balloon', + 'bubble', + 'mad', + ], + }, + { + code: 'šŸ’­', + keywords: [ + 'balloon', + 'bubble', + 'comic', + 'thought', + ], + }, + { + code: 'šŸ•³', + keywords: [ + 'hole', + ], + }, + { + code: 'šŸ‘“', + keywords: [ + 'clothing', + 'eye', + 'eyeglasses', + 'eyewear', + 'glasses', + ], + }, + { + code: 'šŸ•¶', + keywords: [ + 'dark', + 'eye', + 'eyewear', + 'glasses', + 'sunglasses', + ], + }, + { + code: 'šŸ‘”', + keywords: [ + 'clothing', + 'necktie', + ], + }, + { + code: 'šŸ‘•', + keywords: [ + 'clothing', + 'shirt', + 'tshirt', + ], + }, + { + code: 'šŸ‘–', + keywords: [ + 'clothing', + 'jeans', + 'pants', + 'trousers', + ], + }, + { + code: 'šŸ‘—', + keywords: [ + 'clothing', + 'dress', + ], + }, + { + code: 'šŸ‘˜', + keywords: [ + 'clothing', + 'kimono', + ], + }, + { + code: 'šŸ‘™', + keywords: [ + 'bikini', + 'clothing', + 'swim', + ], + }, + { + code: 'šŸ‘š', + keywords: [ + 'clothing', + 'woman', + ], + }, + { + code: 'šŸ‘›', + keywords: [ + 'clothing', + 'coin', + 'purse', + ], + }, + { + code: 'šŸ‘œ', + keywords: [ + 'bag', + 'clothing', + 'handbag', + ], + }, + { + code: 'šŸ‘', + keywords: [ + 'bag', + 'clothing', + 'pouch', + ], + }, + { + code: 'šŸ›', + keywords: [ + 'bag', + 'hotel', + 'shopping', + ], + }, + { + code: 'šŸŽ’', + keywords: [ + 'activity', + 'bag', + 'satchel', + 'school', + ], + }, + { + code: 'šŸ‘ž', + keywords: [ + 'clothing', + 'man', + 'shoe', + ], + }, + { + code: 'šŸ‘Ÿ', + keywords: [ + 'athletic', + 'clothing', + 'shoe', + 'sneaker', + ], + }, + { + code: 'šŸ‘ ', + keywords: [ + 'clothing', + 'heel', + 'shoe', + 'woman', + ], + }, + { + code: 'šŸ‘”', + keywords: [ + 'clothing', + 'sandal', + 'shoe', + 'woman', + ], + }, + { + code: 'šŸ‘¢', + keywords: [ + 'boot', + 'clothing', + 'shoe', + 'woman', + ], + }, + { + code: 'šŸ‘‘', + keywords: [ + 'clothing', + 'crown', + 'king', + 'queen', + ], + }, + { + code: 'šŸ‘’', + keywords: [ + 'clothing', + 'hat', + 'woman', + ], + }, + { + code: 'šŸŽ©', + keywords: [ + 'activity', + 'clothing', + 'entertainment', + 'hat', + 'top', + 'tophat', + ], + }, + { + code: 'šŸŽ“', + keywords: [ + 'activity', + 'cap', + 'celebration', + 'clothing', + 'graduation', + 'hat', + ], + }, + { + code: 'ā›‘', + keywords: [ + 'aid', + 'cross', + 'face', + 'hat', + 'helmet', + ], + }, + { + code: 'šŸ“æ', + keywords: [ + 'beads', + 'clothing', + 'necklace', + 'prayer', + 'religion', + ], + }, + { + code: 'šŸ’„', + keywords: [ + 'cosmetics', + 'lipstick', + 'makeup', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'diamond', + 'ring', + 'romance', + ], + }, + { + code: 'šŸ’Ž', + keywords: [ + 'diamond', + 'gem', + 'jewel', + 'romance', + ], + }, + { + code: 'Animals & Nature', + header: true, + }, + { + code: 'šŸµ', + keywords: [ + 'face', + 'monkey', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'monkey', + ], + }, + { + code: 'šŸ¦', + keywords: [ + 'gorilla', + ], + }, + { + code: 'šŸ¶', + keywords: [ + 'dog', + 'face', + 'pet', + ], + }, + { + code: 'šŸ•', + keywords: [ + 'dog', + 'pet', + ], + }, + { + code: 'šŸ©', + keywords: [ + 'dog', + 'poodle', + ], + }, + { + code: 'šŸŗ', + keywords: [ + 'face', + 'wolf', + ], + }, + { + code: 'šŸ¦Š', + keywords: [ + 'face', + 'fox', + ], + }, + { + code: 'šŸ±', + keywords: [ + 'cat', + 'face', + 'pet', + ], + }, + { + code: 'šŸˆ', + keywords: [ + 'cat', + 'pet', + ], + }, + { + code: 'šŸ¦', + keywords: [ + 'face', + 'leo', + 'lion', + 'zodiac', + ], + }, + { + code: 'šŸÆ', + keywords: [ + 'face', + 'tiger', + ], + }, + { + code: 'šŸ…', + keywords: [ + 'tiger', + ], + }, + { + code: 'šŸ†', + keywords: [ + 'leopard', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'face', + 'horse', + ], + }, + { + code: 'šŸŽ', + keywords: [ + 'horse', + 'racehorse', + 'racing', + ], + }, + { + code: 'šŸ¦Œ', + keywords: [ + 'deer', + ], + }, + { + code: 'šŸ¦„', + keywords: [ + 'face', + 'unicorn', + ], + }, + { + code: 'šŸ®', + keywords: [ + 'cow', + 'face', + ], + }, + { + code: 'šŸ‚', + keywords: [ + 'bull', + 'ox', + 'taurus', + 'zodiac', + ], + }, + { + code: 'šŸƒ', + keywords: [ + 'buffalo', + 'water', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'cow', + ], + }, + { + code: 'šŸ·', + keywords: [ + 'face', + 'pig', + ], + }, + { + code: 'šŸ–', + keywords: [ + 'pig', + 'sow', + ], + }, + { + code: 'šŸ—', + keywords: [ + 'boar', + 'pig', + ], + }, + { + code: 'šŸ½', + keywords: [ + 'face', + 'nose', + 'pig', + ], + }, + { + code: 'šŸ', + keywords: [ + 'aries', + 'ram', + 'sheep', + 'zodiac', + ], + }, + { + code: 'šŸ‘', + keywords: [ + 'ewe', + 'sheep', + ], + }, + { + code: 'šŸ', + keywords: [ + 'capricorn', + 'goat', + 'zodiac', + ], + }, + { + code: 'šŸŖ', + keywords: [ + 'camel', + 'dromedary', + 'hump', + ], + }, + { + code: 'šŸ«', + keywords: [ + 'bactrian', + 'camel', + 'hump', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'elephant', + ], + }, + { + code: 'šŸ¦', + keywords: [ + 'rhinoceros', + ], + }, + { + code: 'šŸ­', + keywords: [ + 'face', + 'mouse', + ], + }, + { + code: 'šŸ', + keywords: [ + 'mouse', + ], + }, + { + code: 'šŸ€', + keywords: [ + 'rat', + ], + }, + { + code: 'šŸ¹', + keywords: [ + 'face', + 'hamster', + 'pet', + ], + }, + { + code: 'šŸ°', + keywords: [ + 'bunny', + 'face', + 'pet', + 'rabbit', + ], + }, + { + code: 'šŸ‡', + keywords: [ + 'bunny', + 'pet', + 'rabbit', + ], + }, + { + code: 'šŸæ', + keywords: [ + 'chipmunk', + ], + }, + { + code: 'šŸ¦‡', + keywords: [ + 'bat', + 'vampire', + ], + }, + { + code: 'šŸ»', + keywords: [ + 'bear', + 'face', + ], + }, + { + code: 'šŸØ', + keywords: [ + 'bear', + 'koala', + ], + }, + { + code: 'šŸ¼', + keywords: [ + 'face', + 'panda', + ], + }, + { + code: 'šŸ¾', + keywords: [ + 'feet', + 'paw', + 'print', + ], + }, + { + code: 'šŸ¦ƒ', + keywords: [ + 'turkey', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'chicken', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'rooster', + ], + }, + { + code: 'šŸ£', + keywords: [ + 'baby', + 'chick', + 'hatching', + ], + }, + { + code: 'šŸ¤', + keywords: [ + 'baby', + 'chick', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'baby', + 'chick', + ], + }, + { + code: 'šŸ¦', + keywords: [ + 'bird', + ], + }, + { + code: 'šŸ§', + keywords: [ + 'penguin', + ], + }, + { + code: 'šŸ•Š', + keywords: [ + 'bird', + 'dove', + 'fly', + 'peace', + ], + }, + { + code: 'šŸ¦…', + keywords: [ + 'bird', + 'eagle', + ], + }, + { + code: 'šŸ¦†', + keywords: [ + 'bird', + 'duck', + ], + }, + { + code: 'šŸ¦‰', + keywords: [ + 'bird', + 'owl', + 'wise', + ], + }, + { + code: 'šŸø', + keywords: [ + 'face', + 'frog', + ], + }, + { + code: 'šŸŠ', + keywords: [ + 'crocodile', + ], + }, + { + code: 'šŸ¢', + keywords: [ + 'turtle', + ], + }, + { + code: 'šŸ¦Ž', + keywords: [ + 'lizard', + 'reptile', + ], + }, + { + code: 'šŸ', + keywords: [ + 'bearer', + 'ophiuchus', + 'serpent', + 'snake', + 'zodiac', + ], + }, + { + code: 'šŸ²', + keywords: [ + 'dragon', + 'face', + 'fairy tale', + ], + }, + { + code: 'šŸ‰', + keywords: [ + 'dragon', + 'fairy tale', + ], + }, + { + code: 'šŸ³', + keywords: [ + 'face', + 'spouting', + 'whale', + ], + }, + { + code: 'šŸ‹', + keywords: [ + 'whale', + ], + }, + { + code: 'šŸ¬', + keywords: [ + 'dolphin', + 'flipper', + ], + }, + { + code: 'šŸŸ', + keywords: [ + 'fish', + 'pisces', + 'zodiac', + ], + }, + { + code: 'šŸ ', + keywords: [ + 'fish', + 'tropical', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'blowfish', + 'fish', + ], + }, + { + code: 'šŸ¦ˆ', + keywords: [ + 'fish', + 'shark', + ], + }, + { + code: 'šŸ™', + keywords: [ + 'octopus', + ], + }, + { + code: 'šŸš', + keywords: [ + 'shell', + 'spiral', + ], + }, + { + code: 'šŸ¦€', + keywords: [ + 'cancer', + 'crab', + 'zodiac', + ], + }, + { + code: 'šŸ¦', + keywords: [ + 'shellfish', + 'shrimp', + 'small', + ], + }, + { + code: 'šŸ¦‘', + keywords: [ + 'molusc', + 'squid', + ], + }, + { + code: 'šŸ¦‹', + keywords: [ + 'butterfly', + 'insect', + 'pretty', + ], + }, + { + code: 'šŸŒ', + keywords: [ + 'snail', + ], + }, + { + code: 'šŸ›', + keywords: [ + 'bug', + 'insect', + ], + }, + { + code: 'šŸœ', + keywords: [ + 'ant', + 'insect', + ], + }, + { + code: 'šŸ', + keywords: [ + 'bee', + 'honeybee', + 'insect', + ], + }, + { + code: 'šŸž', + keywords: [ + 'beetle', + 'insect', + 'lady beetle', + 'ladybird', + 'ladybug', + ], + }, + { + code: 'šŸ•·', + keywords: [ + 'insect', + 'spider', + ], + }, + { + code: 'šŸ•ø', + keywords: [ + 'spider', + 'web', + ], + }, + { + code: 'šŸ¦‚', + keywords: [ + 'scorpio', + 'scorpion', + 'scorpius', + 'zodiac', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'bouquet', + 'flower', + 'plant', + 'romance', + ], + }, + { + code: 'šŸŒø', + keywords: [ + 'blossom', + 'cherry', + 'flower', + 'plant', + ], + }, + { + code: 'šŸ’®', + keywords: [ + 'flower', + ], + }, + { + code: 'šŸµ', + keywords: [ + 'plant', + 'rosette', + ], + }, + { + code: 'šŸŒ¹', + keywords: [ + 'flower', + 'plant', + 'rose', + ], + }, + { + code: 'šŸ„€', + keywords: [ + 'flower', + 'wilted', + ], + }, + { + code: 'šŸŒŗ', + keywords: [ + 'flower', + 'hibiscus', + 'plant', + ], + }, + { + code: 'šŸŒ»', + keywords: [ + 'flower', + 'plant', + 'sun', + 'sunflower', + ], + }, + { + code: 'šŸŒ¼', + keywords: [ + 'blossom', + 'flower', + 'plant', + ], + }, + { + code: 'šŸŒ·', + keywords: [ + 'flower', + 'plant', + 'tulip', + ], + }, + { + code: 'šŸŒ±', + keywords: [ + 'plant', + 'seedling', + 'young', + ], + }, + { + code: 'šŸŒ²', + keywords: [ + 'evergreen', + 'plant', + 'tree', + ], + }, + { + code: 'šŸŒ³', + keywords: [ + 'deciduous', + 'plant', + 'shedding', + 'tree', + ], + }, + { + code: 'šŸŒ“', + keywords: [ + 'palm', + 'plant', + 'tree', + ], + }, + { + code: 'šŸŒµ', + keywords: [ + 'cactus', + 'plant', + ], + }, + { + code: 'šŸŒ¾', + keywords: [ + 'ear', + 'plant', + 'rice', + ], + }, + { + code: 'šŸŒæ', + keywords: [ + 'herb', + 'leaf', + 'plant', + ], + }, + { + code: 'ā˜˜', + keywords: [ + 'plant', + 'shamrock', + ], + }, + { + code: 'šŸ€', + keywords: [ + '4', + 'clover', + 'four', + 'leaf', + 'plant', + ], + }, + { + code: 'šŸ', + keywords: [ + 'falling', + 'leaf', + 'maple', + 'plant', + ], + }, + { + code: 'šŸ‚', + keywords: [ + 'falling', + 'leaf', + 'plant', + ], + }, + { + code: 'šŸƒ', + keywords: [ + 'blow', + 'flutter', + 'leaf', + 'plant', + 'wind', + ], + }, + { + code: 'šŸ‡', + keywords: [ + 'fruit', + 'grape', + 'plant', + ], + }, + { + code: 'šŸˆ', + keywords: [ + 'fruit', + 'melon', + 'plant', + ], + }, + { + code: 'šŸ‰', + keywords: [ + 'fruit', + 'plant', + 'watermelon', + ], + }, + { + code: 'šŸŠ', + keywords: [ + 'fruit', + 'orange', + 'plant', + 'tangerine', + ], + }, + { + code: 'šŸ‹', + keywords: [ + 'citrus', + 'fruit', + 'lemon', + 'plant', + ], + }, + { + code: 'šŸŒ', + keywords: [ + 'banana', + 'fruit', + 'plant', + ], + }, + { + code: 'šŸ', + keywords: [ + 'fruit', + 'pineapple', + 'plant', + ], + }, + { + code: 'šŸŽ', + keywords: [ + 'apple', + 'fruit', + 'plant', + 'red', + ], + }, + { + code: 'šŸ', + keywords: [ + 'apple', + 'fruit', + 'green', + 'plant', + ], + }, + { + code: 'šŸ', + keywords: [ + 'fruit', + 'pear', + 'plant', + ], + }, + { + code: 'šŸ‘', + keywords: [ + 'fruit', + 'peach', + 'plant', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'cherry', + 'fruit', + 'plant', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'berry', + 'fruit', + 'plant', + 'strawberry', + ], + }, + { + code: 'šŸ…', + keywords: [ + 'plant', + 'tomato', + 'vegetable', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'fruit', + 'kiwi', + ], + }, + { + code: 'šŸ„‘', + keywords: [ + 'avocado', + 'fruit', + ], + }, + { + code: 'šŸ†', + keywords: [ + 'aubergine', + 'eggplant', + 'plant', + 'vegetable', + ], + }, + { + code: 'šŸ„”', + keywords: [ + 'potato', + 'vegetable', + ], + }, + { + code: 'šŸ„•', + keywords: [ + 'carrot', + 'vegetable', + ], + }, + { + code: 'šŸŒ½', + keywords: [ + 'corn', + 'ear', + 'maize', + 'maze', + 'plant', + ], + }, + { + code: 'šŸŒ¶', + keywords: [ + 'hot', + 'pepper', + 'plant', + ], + }, + { + code: 'šŸ„’', + keywords: [ + 'cucumber', + 'pickle', + 'vegetable', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'mushroom', + 'plant', + ], + }, + { + code: 'šŸ„œ', + keywords: [ + 'nut', + 'peanut', + 'vegetable', + ], + }, + { + code: 'šŸŒ°', + keywords: [ + 'chestnut', + 'plant', + ], + }, + { + code: 'šŸž', + keywords: [ + 'bread', + 'loaf', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'bread', + 'crescent roll', + 'croissant', + 'french', + ], + }, + { + code: 'šŸ„–', + keywords: [ + 'baguette', + 'bread', + 'french', + ], + }, + { + code: 'šŸ„ž', + keywords: [ + 'crĆŖpe', + 'hotcake', + 'pancake', + ], + }, + { + code: 'šŸ§€', + keywords: [ + 'cheese', + ], + }, + { + code: 'šŸ–', + keywords: [ + 'bone', + 'meat', + ], + }, + { + code: 'šŸ—', + keywords: [ + 'bone', + 'chicken', + 'leg', + 'poultry', + ], + }, + { + code: 'šŸ„“', + keywords: [ + 'bacon', + 'meat', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'burger', + 'hamburger', + ], + }, + { + code: 'šŸŸ', + keywords: [ + 'french', + 'fries', + ], + }, + { + code: 'šŸ•', + keywords: [ + 'cheese', + 'pizza', + 'slice', + ], + }, + { + code: 'šŸŒ­', + keywords: [ + 'frankfurter', + 'hot dog', + 'hotdog', + 'sausage', + ], + }, + { + code: 'šŸŒ®', + keywords: [ + 'mexican', + 'taco', + ], + }, + { + code: 'šŸŒÆ', + keywords: [ + 'burrito', + 'mexican', + ], + }, + { + code: 'šŸ„™', + keywords: [ + 'falafel', + 'flatbread', + 'gyro', + 'kebab', + 'stuffed', + ], + }, + { + code: 'šŸ„š', + keywords: [ + 'egg', + ], + }, + { + code: 'šŸ³', + keywords: [ + 'cooking', + 'egg', + 'frying', + 'pan', + ], + }, + { + code: 'šŸ„˜', + keywords: [ + 'casserole', + 'paella', + 'pan', + 'shallow', + ], + }, + { + code: 'šŸ²', + keywords: [ + 'pot', + 'stew', + ], + }, + { + code: 'šŸ„—', + keywords: [ + 'green', + 'salad', + ], + }, + { + code: 'šŸæ', + keywords: [ + 'popcorn', + ], + }, + { + code: 'šŸ±', + keywords: [ + 'bento', + 'box', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'cracker', + 'rice', + ], + }, + { + code: 'šŸ™', + keywords: [ + 'ball', + 'japanese', + 'rice', + ], + }, + { + code: 'šŸš', + keywords: [ + 'cooked', + 'rice', + ], + }, + { + code: 'šŸ›', + keywords: [ + 'curry', + 'rice', + ], + }, + { + code: 'šŸœ', + keywords: [ + 'bowl', + 'noodle', + 'ramen', + 'steaming', + ], + }, + { + code: 'šŸ', + keywords: [ + 'pasta', + 'spaghetti', + ], + }, + { + code: 'šŸ ', + keywords: [ + 'potato', + 'roasted', + 'sweet', + ], + }, + { + code: 'šŸ¢', + keywords: [ + 'kebab', + 'oden', + 'seafood', + 'skewer', + 'stick', + ], + }, + { + code: 'šŸ£', + keywords: [ + 'sushi', + ], + }, + { + code: 'šŸ¤', + keywords: [ + 'fried', + 'prawn', + 'shrimp', + 'tempura', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'cake', + 'fish', + 'pastry', + 'swirl', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'dango', + 'dessert', + 'japanese', + 'skewer', + 'stick', + 'sweet', + ], + }, + { + code: 'šŸ¦', + keywords: [ + 'cream', + 'dessert', + 'ice', + 'icecream', + 'soft', + 'sweet', + ], + }, + { + code: 'šŸ§', + keywords: [ + 'dessert', + 'ice', + 'shaved', + 'sweet', + ], + }, + { + code: 'šŸØ', + keywords: [ + 'cream', + 'dessert', + 'ice', + 'sweet', + ], + }, + { + code: 'šŸ©', + keywords: [ + 'dessert', + 'donut', + 'doughnut', + 'sweet', + ], + }, + { + code: 'šŸŖ', + keywords: [ + 'cookie', + 'dessert', + 'sweet', + ], + }, + { + code: 'šŸŽ‚', + keywords: [ + 'birthday', + 'cake', + 'celebration', + 'dessert', + 'pastry', + 'sweet', + ], + }, + { + code: 'šŸ°', + keywords: [ + 'cake', + 'dessert', + 'pastry', + 'shortcake', + 'slice', + 'sweet', + ], + }, + { + code: 'šŸ«', + keywords: [ + 'bar', + 'chocolate', + 'dessert', + 'sweet', + ], + }, + { + code: 'šŸ¬', + keywords: [ + 'candy', + 'dessert', + 'sweet', + ], + }, + { + code: 'šŸ­', + keywords: [ + 'candy', + 'dessert', + 'lollipop', + 'sweet', + ], + }, + { + code: 'šŸ®', + keywords: [ + 'custard', + 'dessert', + 'pudding', + 'sweet', + ], + }, + { + code: 'šŸÆ', + keywords: [ + 'honey', + 'honeypot', + 'pot', + 'sweet', + ], + }, + { + code: 'šŸ¼', + keywords: [ + 'baby', + 'bottle', + 'drink', + 'milk', + ], + }, + { + code: 'šŸ„›', + keywords: [ + 'drink', + 'glass', + 'milk', + ], + }, + { + code: 'ā˜•', + keywords: [ + 'beverage', + 'coffee', + 'drink', + 'hot', + 'steaming', + 'tea', + ], + }, + { + code: 'šŸµ', + keywords: [ + 'beverage', + 'cup', + 'drink', + 'tea', + 'teacup', + ], + }, + { + code: 'šŸ¶', + keywords: [ + 'bar', + 'beverage', + 'bottle', + 'cup', + 'drink', + 'sake', + ], + }, + { + code: 'šŸ¾', + keywords: [ + 'bar', + 'bottle', + 'cork', + 'drink', + 'popping', + ], + }, + { + code: 'šŸ·', + keywords: [ + 'bar', + 'beverage', + 'drink', + 'glass', + 'wine', + ], + }, + { + code: 'šŸø', + keywords: [ + 'bar', + 'cocktail', + 'drink', + 'glass', + ], + }, + { + code: 'šŸ¹', + keywords: [ + 'bar', + 'drink', + 'tropical', + ], + }, + { + code: 'šŸŗ', + keywords: [ + 'bar', + 'beer', + 'drink', + 'mug', + ], + }, + { + code: 'šŸ»', + keywords: [ + 'bar', + 'beer', + 'clink', + 'drink', + 'mug', + ], + }, + { + code: 'šŸ„‚', + keywords: [ + 'celebrate', + 'clink', + 'drink', + 'glass', + ], + }, + { + code: 'šŸ„ƒ', + keywords: [ + 'glass', + 'liquor', + 'shot', + 'tumbler', + 'whisky', + ], + }, + { + code: 'šŸ½', + keywords: [ + 'cooking', + 'fork', + 'knife', + 'plate', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'cooking', + 'fork', + 'knife', + ], + }, + { + code: 'šŸ„„', + keywords: [ + 'spoon', + 'tableware', + ], + }, + { + code: 'šŸ”Ŗ', + keywords: [ + 'cooking', + 'hocho', + 'knife', + 'tool', + 'weapon', + ], + }, + { + code: 'šŸŗ', + keywords: [ + 'amphora', + 'aquarius', + 'cooking', + 'drink', + 'jug', + 'tool', + 'weapon', + 'zodiac', + ], + }, + { + code: 'Travel & Places', + header: true, + }, + { + code: 'šŸŒ', + keywords: [ + 'africa', + 'earth', + 'europe', + 'globe', + 'world', + ], + }, + { + code: 'šŸŒŽ', + keywords: [ + 'americas', + 'earth', + 'globe', + 'world', + ], + }, + { + code: 'šŸŒ', + keywords: [ + 'asia', + 'australia', + 'earth', + 'globe', + 'world', + ], + }, + { + code: 'šŸŒ', + keywords: [ + 'earth', + 'globe', + 'meridians', + 'world', + ], + }, + { + code: 'šŸ—ŗ', + keywords: [ + 'map', + 'world', + ], + }, + { + code: 'šŸ—¾', + keywords: [ + 'japan', + 'map', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'cold', + 'mountain', + 'snow', + ], + }, + { + code: 'ā›°', + keywords: [ + 'mountain', + ], + }, + { + code: 'šŸŒ‹', + keywords: [ + 'eruption', + 'mountain', + 'volcano', + 'weather', + ], + }, + { + code: 'šŸ—»', + keywords: [ + 'fuji', + 'mountain', + ], + }, + { + code: 'šŸ•', + keywords: [ + 'camping', + ], + }, + { + code: 'šŸ–', + keywords: [ + 'beach', + 'umbrella', + ], + }, + { + code: 'šŸœ', + keywords: [ + 'desert', + ], + }, + { + code: 'šŸ', + keywords: [ + 'desert', + 'island', + ], + }, + { + code: 'šŸž', + keywords: [ + 'national park', + 'park', + ], + }, + { + code: 'šŸŸ', + keywords: [ + 'stadium', + ], + }, + { + code: 'šŸ›', + keywords: [ + 'building', + 'classical', + ], + }, + { + code: 'šŸ—', + keywords: [ + 'building', + 'construction', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'building', + 'house', + ], + }, + { + code: 'šŸ™', + keywords: [ + 'building', + 'city', + ], + }, + { + code: 'šŸš', + keywords: [ + 'building', + 'derelict', + 'house', + ], + }, + { + code: 'šŸ ', + keywords: [ + 'building', + 'home', + 'house', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'building', + 'garden', + 'home', + 'house', + ], + }, + { + code: 'šŸ¢', + keywords: [ + 'building', + ], + }, + { + code: 'šŸ£', + keywords: [ + 'building', + 'japanese', + 'post', + ], + }, + { + code: 'šŸ¤', + keywords: [ + 'building', + 'european', + 'post', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'building', + 'doctor', + 'hospital', + 'medicine', + ], + }, + { + code: 'šŸ¦', + keywords: [ + 'bank', + 'building', + ], + }, + { + code: 'šŸØ', + keywords: [ + 'building', + 'hotel', + ], + }, + { + code: 'šŸ©', + keywords: [ + 'building', + 'hotel', + 'love', + ], + }, + { + code: 'šŸŖ', + keywords: [ + 'building', + 'convenience', + 'store', + ], + }, + { + code: 'šŸ«', + keywords: [ + 'building', + 'school', + ], + }, + { + code: 'šŸ¬', + keywords: [ + 'building', + 'department', + 'store', + ], + }, + { + code: 'šŸ­', + keywords: [ + 'building', + 'factory', + ], + }, + { + code: 'šŸÆ', + keywords: [ + 'building', + 'castle', + 'japanese', + ], + }, + { + code: 'šŸ°', + keywords: [ + 'building', + 'castle', + 'european', + ], + }, + { + code: 'šŸ’’', + keywords: [ + 'activity', + 'chapel', + 'romance', + 'wedding', + ], + }, + { + code: 'šŸ—¼', + keywords: [ + 'tokyo', + 'tower', + ], + }, + { + code: 'šŸ—½', + keywords: [ + 'liberty', + 'statue', + ], + }, + { + code: 'ā›Ŗ', + keywords: [ + 'building', + 'christian', + 'church', + 'cross', + 'religion', + ], + }, + { + code: 'šŸ•Œ', + keywords: [ + 'islam', + 'mosque', + 'muslim', + 'religion', + ], + }, + { + code: 'šŸ•', + keywords: [ + 'jew', + 'jewish', + 'religion', + 'synagogue', + 'temple', + ], + }, + { + code: 'ā›©', + keywords: [ + 'religion', + 'shinto', + 'shrine', + ], + }, + { + code: 'šŸ•‹', + keywords: [ + 'islam', + 'kaaba', + 'muslim', + 'religion', + ], + }, + { + code: 'ā›²', + keywords: [ + 'fountain', + ], + }, + { + code: 'ā›ŗ', + keywords: [ + 'camping', + 'tent', + ], + }, + { + code: 'šŸŒ', + keywords: [ + 'fog', + 'weather', + ], + }, + { + code: 'šŸŒƒ', + keywords: [ + 'night', + 'star', + 'weather', + ], + }, + { + code: 'šŸŒ„', + keywords: [ + 'morning', + 'mountain', + 'sun', + 'sunrise', + 'weather', + ], + }, + { + code: 'šŸŒ…', + keywords: [ + 'morning', + 'sun', + 'sunrise', + 'weather', + ], + }, + { + code: 'šŸŒ†', + keywords: [ + 'building', + 'city', + 'dusk', + 'evening', + 'landscape', + 'sun', + 'sunset', + 'weather', + ], + }, + { + code: 'šŸŒ‡', + keywords: [ + 'building', + 'dusk', + 'sun', + 'sunset', + 'weather', + ], + }, + { + code: 'šŸŒ‰', + keywords: [ + 'bridge', + 'night', + 'weather', + ], + }, + { + code: 'ā™Ø', + keywords: [ + 'hot', + 'hotsprings', + 'springs', + 'steaming', + ], + }, + { + code: 'šŸŒŒ', + keywords: [ + 'milky way', + 'space', + 'weather', + ], + }, + { + code: 'šŸŽ ', + keywords: [ + 'activity', + 'carousel', + 'entertainment', + 'horse', + ], + }, + { + code: 'šŸŽ”', + keywords: [ + 'activity', + 'amusement park', + 'entertainment', + 'ferris', + 'wheel', + ], + }, + { + code: 'šŸŽ¢', + keywords: [ + 'activity', + 'amusement park', + 'coaster', + 'entertainment', + 'roller', + ], + }, + { + code: 'šŸ’ˆ', + keywords: [ + 'barber', + 'haircut', + 'pole', + ], + }, + { + code: 'šŸŽŖ', + keywords: [ + 'activity', + 'circus', + 'entertainment', + 'tent', + ], + }, + { + code: 'šŸŽ­', + keywords: [ + 'activity', + 'art', + 'entertainment', + 'mask', + 'performing', + 'theater', + 'theatre', + ], + }, + { + code: 'šŸ–¼', + keywords: [ + 'art', + 'frame', + 'museum', + 'painting', + 'picture', + ], + }, + { + code: 'šŸŽØ', + keywords: [ + 'activity', + 'art', + 'entertainment', + 'museum', + 'painting', + 'palette', + ], + }, + { + code: 'šŸŽ°', + keywords: [ + 'activity', + 'game', + 'slot', + ], + }, + { + code: 'šŸš‚', + keywords: [ + 'engine', + 'locomotive', + 'railway', + 'steam', + 'train', + 'vehicle', + ], + }, + { + code: 'šŸšƒ', + keywords: [ + 'car', + 'electric', + 'railway', + 'train', + 'tram', + 'trolleybus', + 'vehicle', + ], + }, + { + code: 'šŸš„', + keywords: [ + 'railway', + 'shinkansen', + 'speed', + 'train', + 'vehicle', + ], + }, + { + code: 'šŸš…', + keywords: [ + 'bullet', + 'railway', + 'shinkansen', + 'speed', + 'train', + 'vehicle', + ], + }, + { + code: 'šŸš†', + keywords: [ + 'railway', + 'train', + 'vehicle', + ], + }, + { + code: 'šŸš‡', + keywords: [ + 'metro', + 'subway', + 'vehicle', + ], + }, + { + code: 'šŸšˆ', + keywords: [ + 'railway', + 'vehicle', + ], + }, + { + code: 'šŸš‰', + keywords: [ + 'railway', + 'station', + 'train', + 'vehicle', + ], + }, + { + code: 'šŸšŠ', + keywords: [ + 'tram', + 'trolleybus', + 'vehicle', + ], + }, + { + code: 'šŸš', + keywords: [ + 'monorail', + 'vehicle', + ], + }, + { + code: 'šŸšž', + keywords: [ + 'car', + 'mountain', + 'railway', + 'vehicle', + ], + }, + { + code: 'šŸš‹', + keywords: [ + 'car', + 'tram', + 'trolleybus', + 'vehicle', + ], + }, + { + code: 'šŸšŒ', + keywords: [ + 'bus', + 'vehicle', + ], + }, + { + code: 'šŸš', + keywords: [ + 'bus', + 'oncoming', + 'vehicle', + ], + }, + { + code: 'šŸšŽ', + keywords: [ + 'bus', + 'tram', + 'trolley', + 'trolleybus', + 'vehicle', + ], + }, + { + code: 'šŸš', + keywords: [ + 'bus', + 'busstop', + 'stop', + ], + }, + { + code: 'šŸš', + keywords: [ + 'bus', + 'minibus', + 'vehicle', + ], + }, + { + code: 'šŸš‘', + keywords: [ + 'ambulance', + 'vehicle', + ], + }, + { + code: 'šŸš’', + keywords: [ + 'engine', + 'fire', + 'truck', + 'vehicle', + ], + }, + { + code: 'šŸš“', + keywords: [ + 'car', + 'patrol', + 'police', + 'vehicle', + ], + }, + { + code: 'šŸš”', + keywords: [ + 'car', + 'oncoming', + 'police', + 'vehicle', + ], + }, + { + code: 'šŸš•', + keywords: [ + 'taxi', + 'vehicle', + ], + }, + { + code: 'šŸš–', + keywords: [ + 'oncoming', + 'taxi', + 'vehicle', + ], + }, + { + code: 'šŸš—', + keywords: [ + 'automobile', + 'car', + 'vehicle', + ], + }, + { + code: 'šŸš˜', + keywords: [ + 'automobile', + 'car', + 'oncoming', + 'vehicle', + ], + }, + { + code: 'šŸš™', + keywords: [ + 'recreational', + 'rv', + 'vehicle', + ], + }, + { + code: 'šŸšš', + keywords: [ + 'delivery', + 'truck', + 'vehicle', + ], + }, + { + code: 'šŸš›', + keywords: [ + 'lorry', + 'semi', + 'truck', + 'vehicle', + ], + }, + { + code: 'šŸšœ', + keywords: [ + 'tractor', + 'vehicle', + ], + }, + { + code: 'šŸš²', + keywords: [ + 'bicycle', + 'bike', + 'vehicle', + ], + }, + { + code: 'ā›½', + keywords: [ + 'fuel', + 'fuelpump', + 'gas', + 'pump', + 'station', + ], + }, + { + code: 'šŸ›£', + keywords: [ + 'highway', + 'motorway', + 'road', + ], + }, + { + code: 'šŸ›¤', + keywords: [ + 'railway', + 'train', + ], + }, + { + code: 'šŸšØ', + keywords: [ + 'beacon', + 'car', + 'light', + 'police', + 'revolving', + 'vehicle', + ], + }, + { + code: 'šŸš„', + keywords: [ + 'light', + 'signal', + 'traffic', + ], + }, + { + code: 'šŸš¦', + keywords: [ + 'light', + 'signal', + 'traffic', + ], + }, + { + code: 'šŸš§', + keywords: [ + 'barrier', + 'construction', + ], + }, + { + code: 'šŸ›‘', + keywords: [ + 'octagonal', + 'stop', + ], + }, + { + code: 'šŸ›“', + keywords: [ + 'kick', + 'scooter', + ], + }, + { + code: 'šŸ›µ', + keywords: [ + 'motor', + 'scooter', + ], + }, + { + code: 'āš“', + keywords: [ + 'anchor', + 'ship', + 'tool', + ], + }, + { + code: 'ā›µ', + keywords: [ + 'boat', + 'resort', + 'sailboat', + 'sea', + 'vehicle', + 'yacht', + ], + }, + { + code: 'šŸš£', + keywords: [ + 'boat', + 'rowboat', + 'vehicle', + ], + types: [ + 'šŸš£šŸæ', + 'šŸš£šŸ¾', + 'šŸš£šŸ½', + 'šŸš£šŸ¼', + 'šŸš£šŸ»', + ], + }, + { + code: 'šŸ›¶', + keywords: [ + 'boat', + 'canoe', + ], + }, + { + code: 'šŸš¤', + keywords: [ + 'boat', + 'speedboat', + 'vehicle', + ], + }, + { + code: 'šŸ›³', + keywords: [ + 'passenger', + 'ship', + 'vehicle', + ], + }, + { + code: 'ā›“', + keywords: [ + 'boat', + 'ferry', + ], + }, + { + code: 'šŸ›„', + keywords: [ + 'boat', + 'motorboat', + 'vehicle', + ], + }, + { + code: 'šŸš¢', + keywords: [ + 'ship', + 'vehicle', + ], + }, + { + code: 'āœˆ', + keywords: [ + 'airplane', + 'vehicle', + ], + }, + { + code: 'šŸ›©', + keywords: [ + 'airplane', + 'vehicle', + ], + }, + { + code: 'šŸ›«', + keywords: [ + 'airplane', + 'check-in', + 'departure', + 'departures', + 'vehicle', + ], + }, + { + code: 'šŸ›¬', + keywords: [ + 'airplane', + 'arrivals', + 'arriving', + 'landing', + 'vehicle', + ], + }, + { + code: 'šŸ’ŗ', + keywords: [ + 'chair', + 'seat', + ], + }, + { + code: 'šŸš', + keywords: [ + 'helicopter', + 'vehicle', + ], + }, + { + code: 'šŸšŸ', + keywords: [ + 'railway', + 'suspension', + 'vehicle', + ], + }, + { + code: 'šŸš ', + keywords: [ + 'cable', + 'gondola', + 'mountain', + 'vehicle', + ], + }, + { + code: 'šŸš”', + keywords: [ + 'aerial', + 'cable', + 'car', + 'gondola', + 'ropeway', + 'tramway', + 'vehicle', + ], + }, + { + code: 'šŸš€', + keywords: [ + 'rocket', + 'space', + 'vehicle', + ], + }, + { + code: 'šŸ›°', + keywords: [ + 'satellite', + 'space', + 'vehicle', + ], + }, + { + code: 'šŸ›Ž', + keywords: [ + 'bell', + 'bellhop', + 'hotel', + ], + }, + { + code: 'šŸšŖ', + keywords: [ + 'door', + ], + }, + { + code: 'šŸ›Œ', + keywords: [ + 'hotel', + 'sleep', + ], + }, + { + code: 'šŸ›', + keywords: [ + 'bed', + 'hotel', + 'sleep', + ], + }, + { + code: 'šŸ›‹', + keywords: [ + 'couch', + 'hotel', + 'lamp', + ], + }, + { + code: 'šŸš½', + keywords: [ + 'toilet', + ], + }, + { + code: 'šŸšæ', + keywords: [ + 'shower', + 'water', + ], + }, + { + code: 'šŸ›€', + keywords: [ + 'bath', + 'bathtub', + ], + types: [ + 'šŸ›€šŸæ', + 'šŸ›€šŸ¾', + 'šŸ›€šŸ½', + 'šŸ›€šŸ¼', + 'šŸ›€šŸ»', + ], + }, + { + code: 'šŸ›', + keywords: [ + 'bath', + 'bathtub', + ], + }, + { + code: 'āŒ›', + keywords: [ + 'hourglass', + 'sand', + 'timer', + ], + }, + { + code: 'ā³', + keywords: [ + 'hourglass', + 'sand', + 'timer', + ], + }, + { + code: 'āŒš', + keywords: [ + 'clock', + 'watch', + ], + }, + { + code: 'ā°', + keywords: [ + 'alarm', + 'clock', + ], + }, + { + code: 'ā±', + keywords: [ + 'clock', + 'stopwatch', + ], + }, + { + code: 'ā²', + keywords: [ + 'clock', + 'timer', + ], + }, + { + code: 'šŸ•°', + keywords: [ + 'clock', + ], + }, + { + code: 'šŸ•›', + keywords: [ + '00', + '12', + '12:00', + 'clock', + 'oā€™clock', + 'twelve', + ], + }, + { + code: 'šŸ•§', + keywords: [ + '12', + '12:30', + '30', + 'clock', + 'thirty', + 'twelve', + ], + }, + { + code: 'šŸ•', + keywords: [ + '00', + '1', + '1:00', + 'clock', + 'oā€™clock', + 'one', + ], + }, + { + code: 'šŸ•œ', + keywords: [ + '1', + '1:30', + '30', + 'clock', + 'one', + 'thirty', + ], + }, + { + code: 'šŸ•‘', + keywords: [ + '00', + '2', + '2:00', + 'clock', + 'oā€™clock', + 'two', + ], + }, + { + code: 'šŸ•', + keywords: [ + '2', + '2:30', + '30', + 'clock', + 'thirty', + 'two', + ], + }, + { + code: 'šŸ•’', + keywords: [ + '00', + '3', + '3:00', + 'clock', + 'oā€™clock', + 'three', + ], + }, + { + code: 'šŸ•ž', + keywords: [ + '3', + '3:30', + '30', + 'clock', + 'thirty', + 'three', + ], + }, + { + code: 'šŸ•“', + keywords: [ + '00', + '4', + '4:00', + 'clock', + 'four', + 'oā€™clock', + ], + }, + { + code: 'šŸ•Ÿ', + keywords: [ + '30', + '4', + '4:30', + 'clock', + 'four', + 'thirty', + ], + }, + { + code: 'šŸ•”', + keywords: [ + '00', + '5', + '5:00', + 'clock', + 'five', + 'oā€™clock', + ], + }, + { + code: 'šŸ• ', + keywords: [ + '30', + '5', + '5:30', + 'clock', + 'five', + 'thirty', + ], + }, + { + code: 'šŸ••', + keywords: [ + '00', + '6', + '6:00', + 'clock', + 'oā€™clock', + 'six', + ], + }, + { + code: 'šŸ•”', + keywords: [ + '30', + '6', + '6:30', + 'clock', + 'six', + 'thirty', + ], + }, + { + code: 'šŸ•–', + keywords: [ + '00', + '7', + '7:00', + 'clock', + 'oā€™clock', + 'seven', + ], + }, + { + code: 'šŸ•¢', + keywords: [ + '30', + '7', + '7:30', + 'clock', + 'seven', + 'thirty', + ], + }, + { + code: 'šŸ•—', + keywords: [ + '00', + '8', + '8:00', + 'clock', + 'eight', + 'oā€™clock', + ], + }, + { + code: 'šŸ•£', + keywords: [ + '30', + '8', + '8:30', + 'clock', + 'eight', + 'thirty', + ], + }, + { + code: 'šŸ•˜', + keywords: [ + '00', + '9', + '9:00', + 'clock', + 'nine', + 'oā€™clock', + ], + }, + { + code: 'šŸ•¤', + keywords: [ + '30', + '9', + '9:30', + 'clock', + 'nine', + 'thirty', + ], + }, + { + code: 'šŸ•™', + keywords: [ + '00', + '10', + '10:00', + 'clock', + 'oā€™clock', + 'ten', + ], + }, + { + code: 'šŸ•„', + keywords: [ + '10', + '10:30', + '30', + 'clock', + 'ten', + 'thirty', + ], + }, + { + code: 'šŸ•š', + keywords: [ + '00', + '11', + '11:00', + 'clock', + 'eleven', + 'oā€™clock', + ], + }, + { + code: 'šŸ•¦', + keywords: [ + '11', + '11:30', + '30', + 'clock', + 'eleven', + 'thirty', + ], + }, + { + code: 'šŸŒ‘', + keywords: [ + 'dark', + 'moon', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒ’', + keywords: [ + 'crescent', + 'moon', + 'space', + 'waxing', + 'weather', + ], + }, + { + code: 'šŸŒ“', + keywords: [ + 'moon', + 'quarter', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒ”', + keywords: [ + 'gibbous', + 'moon', + 'space', + 'waxing', + 'weather', + ], + }, + { + code: 'šŸŒ•', + keywords: [ + 'full', + 'moon', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒ–', + keywords: [ + 'gibbous', + 'moon', + 'space', + 'waning', + 'weather', + ], + }, + { + code: 'šŸŒ—', + keywords: [ + 'moon', + 'quarter', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒ˜', + keywords: [ + 'crescent', + 'moon', + 'space', + 'waning', + 'weather', + ], + }, + { + code: 'šŸŒ™', + keywords: [ + 'crescent', + 'moon', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒš', + keywords: [ + 'face', + 'moon', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒ›', + keywords: [ + 'face', + 'moon', + 'quarter', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒœ', + keywords: [ + 'face', + 'moon', + 'quarter', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒ”', + keywords: [ + 'thermometer', + 'weather', + ], + }, + { + code: 'ā˜€', + keywords: [ + 'bright', + 'rays', + 'space', + 'sun', + 'sunny', + 'weather', + ], + }, + { + code: 'šŸŒ', + keywords: [ + 'bright', + 'face', + 'full', + 'moon', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒž', + keywords: [ + 'bright', + 'face', + 'space', + 'sun', + 'weather', + ], + }, + { + code: 'ā­', + keywords: [ + 'star', + ], + }, + { + code: 'šŸŒŸ', + keywords: [ + 'glittery', + 'glow', + 'shining', + 'sparkle', + 'star', + ], + }, + { + code: 'šŸŒ ', + keywords: [ + 'activity', + 'falling', + 'shooting', + 'space', + 'star', + ], + }, + { + code: 'ā˜', + keywords: [ + 'cloud', + 'weather', + ], + }, + { + code: 'ā›…', + keywords: [ + 'cloud', + 'sun', + 'weather', + ], + }, + { + code: 'ā›ˆ', + keywords: [ + 'cloud', + 'rain', + 'thunder', + 'weather', + ], + }, + { + code: 'šŸŒ¤', + keywords: [ + 'cloud', + 'sun', + 'weather', + ], + }, + { + code: 'šŸŒ„', + keywords: [ + 'cloud', + 'sun', + 'weather', + ], + }, + { + code: 'šŸŒ¦', + keywords: [ + 'cloud', + 'rain', + 'sun', + 'weather', + ], + }, + { + code: 'šŸŒ§', + keywords: [ + 'cloud', + 'rain', + 'weather', + ], + }, + { + code: 'šŸŒØ', + keywords: [ + 'cloud', + 'cold', + 'snow', + 'weather', + ], + }, + { + code: 'šŸŒ©', + keywords: [ + 'cloud', + 'lightning', + 'weather', + ], + }, + { + code: 'šŸŒŖ', + keywords: [ + 'cloud', + 'tornado', + 'weather', + 'whirlwind', + ], + }, + { + code: 'šŸŒ«', + keywords: [ + 'cloud', + 'fog', + 'weather', + ], + }, + { + code: 'šŸŒ¬', + keywords: [ + 'blow', + 'cloud', + 'face', + 'weather', + 'wind', + ], + }, + { + code: 'šŸŒ€', + keywords: [ + 'cyclone', + 'dizzy', + 'twister', + 'typhoon', + 'weather', + ], + }, + { + code: 'šŸŒˆ', + keywords: [ + 'rain', + 'rainbow', + 'weather', + ], + }, + { + code: 'šŸŒ‚', + keywords: [ + 'clothing', + 'rain', + 'umbrella', + 'weather', + ], + }, + { + code: 'ā˜‚', + keywords: [ + 'clothing', + 'rain', + 'umbrella', + 'weather', + ], + }, + { + code: 'ā˜”', + keywords: [ + 'clothing', + 'drop', + 'rain', + 'umbrella', + 'weather', + ], + }, + { + code: 'ā›±', + keywords: [ + 'rain', + 'sun', + 'umbrella', + 'weather', + ], + }, + { + code: 'āš”', + keywords: [ + 'danger', + 'electric', + 'electricity', + 'lightning', + 'voltage', + 'zap', + ], + }, + { + code: 'ā„', + keywords: [ + 'cold', + 'snow', + 'snowflake', + 'weather', + ], + }, + { + code: 'ā˜ƒ', + keywords: [ + 'cold', + 'snow', + 'snowman', + 'weather', + ], + }, + { + code: 'ā›„', + keywords: [ + 'cold', + 'snow', + 'snowman', + 'weather', + ], + }, + { + code: 'ā˜„', + keywords: [ + 'comet', + 'space', + ], + }, + { + code: 'šŸ”„', + keywords: [ + 'fire', + 'flame', + 'tool', + ], + }, + { + code: 'šŸ’§', + keywords: [ + 'cold', + 'comic', + 'drop', + 'sweat', + 'weather', + ], + }, + { + code: 'šŸŒŠ', + keywords: [ + 'ocean', + 'water', + 'wave', + 'weather', + ], + }, + { + code: 'Activities', + header: true, + }, + { + code: 'šŸŽƒ', + keywords: [ + 'activity', + 'celebration', + 'entertainment', + 'halloween', + 'jack', + 'lantern', + ], + }, + { + code: 'šŸŽ„', + keywords: [ + 'activity', + 'celebration', + 'christmas', + 'entertainment', + 'tree', + ], + }, + { + code: 'šŸŽ†', + keywords: [ + 'activity', + 'celebration', + 'entertainment', + 'fireworks', + ], + }, + { + code: 'šŸŽ‡', + keywords: [ + 'activity', + 'celebration', + 'entertainment', + 'fireworks', + 'sparkle', + ], + }, + { + code: 'āœØ', + keywords: [ + 'entertainment', + 'sparkle', + 'star', + ], + }, + { + code: 'šŸŽˆ', + keywords: [ + 'activity', + 'balloon', + 'celebration', + 'entertainment', + ], + }, + { + code: 'šŸŽ‰', + keywords: [ + 'activity', + 'celebration', + 'entertainment', + 'party', + 'popper', + 'tada', + ], + }, + { + code: 'šŸŽŠ', + keywords: [ + 'activity', + 'ball', + 'celebration', + 'confetti', + 'entertainment', + ], + }, + { + code: 'šŸŽ‹', + keywords: [ + 'activity', + 'banner', + 'celebration', + 'entertainment', + 'japanese', + 'tree', + ], + }, + { + code: 'šŸŽ', + keywords: [ + 'activity', + 'bamboo', + 'celebration', + 'japanese', + 'pine', + 'plant', + ], + }, + { + code: 'šŸŽŽ', + keywords: [ + 'activity', + 'celebration', + 'doll', + 'entertainment', + 'festival', + 'japanese', + ], + }, + { + code: 'šŸŽ', + keywords: [ + 'activity', + 'carp', + 'celebration', + 'entertainment', + 'flag', + 'streamer', + ], + }, + { + code: 'šŸŽ', + keywords: [ + 'activity', + 'bell', + 'celebration', + 'chime', + 'entertainment', + 'wind', + ], + }, + { + code: 'šŸŽ‘', + keywords: [ + 'activity', + 'celebration', + 'ceremony', + 'entertainment', + 'moon', + ], + }, + { + code: 'šŸŽ€', + keywords: [ + 'celebration', + 'ribbon', + ], + }, + { + code: 'šŸŽ', + keywords: [ + 'box', + 'celebration', + 'entertainment', + 'gift', + 'present', + 'wrapped', + ], + }, + { + code: 'šŸŽ—', + keywords: [ + 'celebration', + 'reminder', + 'ribbon', + ], + }, + { + code: 'šŸŽŸ', + keywords: [ + 'admission', + 'entertainment', + 'ticket', + ], + }, + { + code: 'šŸŽ«', + keywords: [ + 'activity', + 'admission', + 'entertainment', + 'ticket', + ], + }, + { + code: 'šŸŽ–', + keywords: [ + 'celebration', + 'medal', + 'military', + ], + }, + { + code: 'šŸ†', + keywords: [ + 'prize', + 'trophy', + ], + }, + { + code: 'šŸ…', + keywords: [ + 'medal', + ], + }, + { + code: 'šŸ„‡', + keywords: [ + 'first', + 'gold', + 'medal', + ], + }, + { + code: 'šŸ„ˆ', + keywords: [ + 'medal', + 'second', + 'silver', + ], + }, + { + code: 'šŸ„‰', + keywords: [ + 'bronze', + 'medal', + 'third', + ], + }, + { + code: 'āš½', + keywords: [ + 'ball', + 'soccer', + ], + }, + { + code: 'āš¾', + keywords: [ + 'ball', + 'baseball', + ], + }, + { + code: 'šŸ€', + keywords: [ + 'ball', + 'basketball', + 'hoop', + ], + }, + { + code: 'šŸ', + keywords: [ + 'ball', + 'game', + 'volleyball', + ], + }, + { + code: 'šŸˆ', + keywords: [ + 'american', + 'ball', + 'football', + ], + }, + { + code: 'šŸ‰', + keywords: [ + 'ball', + 'football', + 'rugby', + ], + }, + { + code: 'šŸŽ¾', + keywords: [ + 'ball', + 'racquet', + 'tennis', + ], + }, + { + code: 'šŸŽ±', + keywords: [ + '8', + '8 ball', + 'ball', + 'billiard', + 'eight', + 'game', + ], + }, + { + code: 'šŸŽ³', + keywords: [ + 'ball', + 'bowling', + 'game', + ], + }, + { + code: 'šŸ', + keywords: [ + 'ball', + 'bat', + 'cricket', + 'game', + ], + }, + { + code: 'šŸ‘', + keywords: [ + 'ball', + 'field', + 'game', + 'hockey', + 'stick', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'game', + 'hockey', + 'ice', + 'puck', + 'stick', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'ball', + 'bat', + 'game', + 'paddle', + 'table tennis', + ], + }, + { + code: 'šŸø', + keywords: [ + 'badminton', + 'birdie', + 'game', + 'racquet', + 'shuttlecock', + ], + }, + { + code: 'šŸ„Š', + keywords: [ + 'boxing', + 'glove', + ], + }, + { + code: 'šŸ„‹', + keywords: [ + 'judo', + 'karate', + 'martial arts', + 'taekwondo', + 'uniform', + ], + }, + { + code: 'ā›³', + keywords: [ + 'flag', + 'golf', + 'hole', + ], + }, + { + code: 'šŸŒ', + keywords: [ + 'ball', + 'golf', + ], + }, + { + code: 'ā›ø', + keywords: [ + 'ice', + 'skate', + ], + }, + { + code: 'šŸŽ£', + keywords: [ + 'entertainment', + 'fish', + 'pole', + ], + }, + { + code: 'šŸŽ½', + keywords: [ + 'running', + 'sash', + 'shirt', + ], + }, + { + code: 'šŸŽæ', + keywords: [ + 'ski', + 'snow', + ], + }, + { + code: 'ā›·', + keywords: [ + 'ski', + 'snow', + ], + }, + { + code: 'šŸ‚', + keywords: [ + 'ski', + 'snow', + 'snowboard', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'surfer', + 'surfing', + ], + types: [ + 'šŸ„šŸæ', + 'šŸ„šŸ¾', + 'šŸ„šŸ½', + 'šŸ„šŸ¼', + 'šŸ„šŸ»', + ], + }, + { + code: 'šŸ‡', + keywords: [ + 'horse', + 'jockey', + 'racehorse', + 'racing', + ], + }, + { + code: 'šŸŠ', + keywords: [ + 'swim', + 'swimmer', + ], + types: [ + 'šŸŠšŸæ', + 'šŸŠšŸ¾', + 'šŸŠšŸ½', + 'šŸŠšŸ¼', + 'šŸŠšŸ»', + ], + }, + { + code: 'ā›¹', + keywords: [ + 'ball', + ], + types: [ + 'ā›¹šŸæ', + 'ā›¹šŸ¾', + 'ā›¹šŸ½', + 'ā›¹šŸ¼', + 'ā›¹šŸ»', + ], + }, + { + code: 'šŸ‹', + keywords: [ + 'lifter', + 'weight', + ], + types: [ + 'šŸ‹šŸæ', + 'šŸ‹šŸ¾', + 'šŸ‹šŸ½', + 'šŸ‹šŸ¼', + 'šŸ‹šŸ»', + ], + }, + { + code: 'šŸš“', + keywords: [ + 'bicycle', + 'bicyclist', + 'bike', + 'cyclist', + ], + types: [ + 'šŸš“šŸæ', + 'šŸš“šŸ¾', + 'šŸš“šŸ½', + 'šŸš“šŸ¼', + 'šŸš“šŸ»', + ], + }, + { + code: 'šŸšµ', + keywords: [ + 'bicycle', + 'bicyclist', + 'bike', + 'cyclist', + 'mountain', + ], + types: [ + 'šŸšµšŸæ', + 'šŸšµšŸ¾', + 'šŸšµšŸ½', + 'šŸšµšŸ¼', + 'šŸšµšŸ»', + ], + }, + { + code: 'šŸŽ', + keywords: [ + 'car', + 'racing', + ], + }, + { + code: 'šŸ', + keywords: [ + 'motorcycle', + 'racing', + ], + }, + { + code: 'šŸ¤ø', + keywords: [ + 'cartwheel', + 'gymnastics', + ], + types: [ + 'šŸ¤øšŸæ', + 'šŸ¤øšŸ¾', + 'šŸ¤øšŸ½', + 'šŸ¤øšŸ¼', + 'šŸ¤øšŸ»', + ], + }, + { + code: 'šŸ¤¼', + keywords: [ + 'wrestle', + 'wrestler', + ], + types: [ + 'šŸ¤¼šŸæ', + 'šŸ¤¼šŸ¾', + 'šŸ¤¼šŸ½', + 'šŸ¤¼šŸ¼', + 'šŸ¤¼šŸ»', + ], + }, + { + code: 'šŸ¤½', + keywords: [ + 'polo', + 'water', + ], + types: [ + 'šŸ¤½šŸæ', + 'šŸ¤½šŸ¾', + 'šŸ¤½šŸ½', + 'šŸ¤½šŸ¼', + 'šŸ¤½šŸ»', + ], + }, + { + code: 'šŸ¤¾', + keywords: [ + 'ball', + 'handball', + ], + types: [ + 'šŸ¤¾šŸæ', + 'šŸ¤¾šŸ¾', + 'šŸ¤¾šŸ½', + 'šŸ¤¾šŸ¼', + 'šŸ¤¾šŸ»', + ], + }, + { + code: 'šŸ¤ŗ', + keywords: [ + 'fencer', + 'fencing', + 'sword', + ], + }, + { + code: 'šŸ„…', + keywords: [ + 'goal', + 'net', + ], + }, + { + code: 'šŸ¤¹', + keywords: [ + 'balance', + 'juggle', + 'multitask', + 'skill', + ], + types: [ + 'šŸ¤¹šŸæ', + 'šŸ¤¹šŸ¾', + 'šŸ¤¹šŸ½', + 'šŸ¤¹šŸ¼', + 'šŸ¤¹šŸ»', + ], + }, + { + code: 'šŸŽÆ', + keywords: [ + 'activity', + 'bull', + 'bullseye', + 'dart', + 'entertainment', + 'eye', + 'game', + 'hit', + 'target', + ], + }, + { + code: 'šŸŽ®', + keywords: [ + 'controller', + 'entertainment', + 'game', + 'video game', + ], + }, + { + code: 'šŸ•¹', + keywords: [ + 'entertainment', + 'game', + 'joystick', + 'video game', + ], + }, + { + code: 'šŸŽ²', + keywords: [ + 'dice', + 'die', + 'entertainment', + 'game', + ], + }, + { + code: 'ā™ ', + keywords: [ + 'card', + 'game', + 'spade', + 'suit', + ], + }, + { + code: 'ā™„', + keywords: [ + 'card', + 'game', + 'heart', + 'hearts', + 'suit', + ], + }, + { + code: 'ā™¦', + keywords: [ + 'card', + 'diamond', + 'diamonds', + 'game', + 'suit', + ], + }, + { + code: 'ā™£', + keywords: [ + 'card', + 'club', + 'clubs', + 'game', + 'suit', + ], + }, + { + code: 'šŸƒ', + keywords: [ + 'card', + 'entertainment', + 'game', + 'joker', + 'playing', + ], + }, + { + code: 'šŸ€„', + keywords: [ + 'game', + 'mahjong', + 'red', + ], + }, + { + code: 'šŸŽ“', + keywords: [ + 'activity', + 'card', + 'entertainment', + 'flower', + 'game', + 'japanese', + 'playing', + ], + }, + { + code: 'Objects', + header: true, + }, + { + code: 'šŸ”‡', + keywords: [ + 'mute', + 'quiet', + 'silent', + 'speaker', + 'volume', + ], + }, + { + code: 'šŸ”ˆ', + keywords: [ + 'speaker', + 'volume', + ], + }, + { + code: 'šŸ”‰', + keywords: [ + 'low', + 'speaker', + 'volume', + 'wave', + ], + }, + { + code: 'šŸ”Š', + keywords: [ + '3', + 'entertainment', + 'high', + 'loud', + 'speaker', + 'three', + 'volume', + ], + }, + { + code: 'šŸ“¢', + keywords: [ + 'communication', + 'loud', + 'loudspeaker', + 'public address', + ], + }, + { + code: 'šŸ“£', + keywords: [ + 'cheering', + 'communication', + 'megaphone', + ], + }, + { + code: 'šŸ“Æ', + keywords: [ + 'communication', + 'entertainment', + 'horn', + 'post', + 'postal', + ], + }, + { + code: 'šŸ””', + keywords: [ + 'bell', + ], + }, + { + code: 'šŸ”•', + keywords: [ + 'bell', + 'forbidden', + 'mute', + 'no', + 'not', + 'prohibited', + 'quiet', + 'silent', + ], + }, + { + code: 'šŸŽ¼', + keywords: [ + 'activity', + 'entertainment', + 'music', + 'score', + ], + }, + { + code: 'šŸŽµ', + keywords: [ + 'activity', + 'entertainment', + 'music', + 'note', + ], + }, + { + code: 'šŸŽ¶', + keywords: [ + 'activity', + 'entertainment', + 'music', + 'note', + 'notes', + ], + }, + { + code: 'šŸŽ™', + keywords: [ + 'mic', + 'microphone', + 'music', + 'studio', + ], + }, + { + code: 'šŸŽš', + keywords: [ + 'level', + 'music', + 'slider', + ], + }, + { + code: 'šŸŽ›', + keywords: [ + 'control', + 'knobs', + 'music', + ], + }, + { + code: 'šŸŽ¤', + keywords: [ + 'activity', + 'entertainment', + 'karaoke', + 'mic', + 'microphone', + ], + }, + { + code: 'šŸŽ§', + keywords: [ + 'activity', + 'earbud', + 'entertainment', + 'headphone', + ], + }, + { + code: 'šŸ“»', + keywords: [ + 'entertainment', + 'radio', + 'video', + ], + }, + { + code: 'šŸŽ·', + keywords: [ + 'activity', + 'entertainment', + 'instrument', + 'music', + 'sax', + 'saxophone', + ], + }, + { + code: 'šŸŽø', + keywords: [ + 'activity', + 'entertainment', + 'guitar', + 'instrument', + 'music', + ], + }, + { + code: 'šŸŽ¹', + keywords: [ + 'activity', + 'entertainment', + 'instrument', + 'keyboard', + 'music', + 'piano', + ], + }, + { + code: 'šŸŽŗ', + keywords: [ + 'activity', + 'entertainment', + 'instrument', + 'music', + 'trumpet', + ], + }, + { + code: 'šŸŽ»', + keywords: [ + 'activity', + 'entertainment', + 'instrument', + 'music', + 'violin', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'drum', + 'drumsticks', + 'music', + ], + }, + { + code: 'šŸ“±', + keywords: [ + 'cell', + 'communication', + 'mobile', + 'phone', + 'telephone', + ], + }, + { + code: 'šŸ“²', + keywords: [ + 'arrow', + 'call', + 'cell', + 'communication', + 'mobile', + 'phone', + 'receive', + 'telephone', + ], + }, + { + code: 'ā˜Ž', + keywords: [ + 'phone', + 'telephone', + ], + }, + { + code: 'šŸ“ž', + keywords: [ + 'communication', + 'phone', + 'receiver', + 'telephone', + ], + }, + { + code: 'šŸ“Ÿ', + keywords: [ + 'communication', + 'pager', + ], + }, + { + code: 'šŸ“ ', + keywords: [ + 'communication', + 'fax', + ], + }, + { + code: 'šŸ”‹', + keywords: [ + 'battery', + ], + }, + { + code: 'šŸ”Œ', + keywords: [ + 'electric', + 'electricity', + 'plug', + ], + }, + { + code: 'šŸ’»', + keywords: [ + 'computer', + 'pc', + 'personal', + ], + }, + { + code: 'šŸ–„', + keywords: [ + 'computer', + 'desktop', + ], + }, + { + code: 'šŸ–Ø', + keywords: [ + 'computer', + 'printer', + ], + }, + { + code: 'āŒØ', + keywords: [ + 'computer', + 'keyboard', + ], + }, + { + code: 'šŸ–±', + keywords: [ + '3', + 'button', + 'computer', + 'mouse', + 'three', + ], + }, + { + code: 'šŸ–²', + keywords: [ + 'computer', + 'trackball', + ], + }, + { + code: 'šŸ’½', + keywords: [ + 'computer', + 'disk', + 'entertainment', + 'minidisk', + 'optical', + ], + }, + { + code: 'šŸ’¾', + keywords: [ + 'computer', + 'disk', + 'floppy', + ], + }, + { + code: 'šŸ’æ', + keywords: [ + 'blu-ray', + 'cd', + 'computer', + 'disk', + 'dvd', + 'optical', + ], + }, + { + code: 'šŸ“€', + keywords: [ + 'blu-ray', + 'cd', + 'computer', + 'disk', + 'dvd', + 'entertainment', + 'optical', + ], + }, + { + code: 'šŸŽ„', + keywords: [ + 'activity', + 'camera', + 'cinema', + 'entertainment', + 'movie', + ], + }, + { + code: 'šŸŽž', + keywords: [ + 'cinema', + 'entertainment', + 'film', + 'frames', + 'movie', + ], + }, + { + code: 'šŸ“½', + keywords: [ + 'cinema', + 'entertainment', + 'film', + 'movie', + 'projector', + 'video', + ], + }, + { + code: 'šŸŽ¬', + keywords: [ + 'activity', + 'clapper', + 'entertainment', + 'movie', + ], + }, + { + code: 'šŸ“ŗ', + keywords: [ + 'entertainment', + 'television', + 'tv', + 'video', + ], + }, + { + code: 'šŸ“·', + keywords: [ + 'camera', + 'entertainment', + 'video', + ], + }, + { + code: 'šŸ“ø', + keywords: [ + 'camera', + 'flash', + 'video', + ], + }, + { + code: 'šŸ“¹', + keywords: [ + 'camera', + 'entertainment', + 'video', + ], + }, + { + code: 'šŸ“¼', + keywords: [ + 'entertainment', + 'tape', + 'vhs', + 'video', + 'videocassette', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'glass', + 'magnifying', + 'search', + 'tool', + ], + }, + { + code: 'šŸ”Ž', + keywords: [ + 'glass', + 'magnifying', + 'search', + 'tool', + ], + }, + { + code: 'šŸ”¬', + keywords: [ + 'microscope', + 'tool', + ], + }, + { + code: 'šŸ”­', + keywords: [ + 'telescope', + 'tool', + ], + }, + { + code: 'šŸ“”', + keywords: [ + 'antenna', + 'communication', + 'dish', + 'satellite', + ], + }, + { + code: 'šŸ•Æ', + keywords: [ + 'candle', + 'light', + ], + }, + { + code: 'šŸ’”', + keywords: [ + 'bulb', + 'comic', + 'electric', + 'idea', + 'light', + ], + }, + { + code: 'šŸ”¦', + keywords: [ + 'electric', + 'flashlight', + 'light', + 'tool', + 'torch', + ], + }, + { + code: 'šŸ®', + keywords: [ + 'bar', + 'japanese', + 'lantern', + 'light', + 'red', + ], + }, + { + code: 'šŸ“”', + keywords: [ + 'book', + 'cover', + 'decorated', + 'notebook', + ], + }, + { + code: 'šŸ“•', + keywords: [ + 'book', + 'closed', + ], + }, + { + code: 'šŸ“–', + keywords: [ + 'book', + 'open', + ], + }, + { + code: 'šŸ“—', + keywords: [ + 'book', + 'green', + ], + }, + { + code: 'šŸ“˜', + keywords: [ + 'blue', + 'book', + ], + }, + { + code: 'šŸ“™', + keywords: [ + 'book', + 'orange', + ], + }, + { + code: 'šŸ“š', + keywords: [ + 'book', + 'books', + ], + }, + { + code: 'šŸ““', + keywords: [ + 'notebook', + ], + }, + { + code: 'šŸ“’', + keywords: [ + 'ledger', + 'notebook', + ], + }, + { + code: 'šŸ“ƒ', + keywords: [ + 'curl', + 'document', + 'page', + ], + }, + { + code: 'šŸ“œ', + keywords: [ + 'paper', + 'scroll', + ], + }, + { + code: 'šŸ“„', + keywords: [ + 'document', + 'page', + ], + }, + { + code: 'šŸ“°', + keywords: [ + 'communication', + 'news', + 'newspaper', + 'paper', + ], + }, + { + code: 'šŸ—ž', + keywords: [ + 'news', + 'newspaper', + 'paper', + 'rolled', + ], + }, + { + code: 'šŸ“‘', + keywords: [ + 'bookmark', + 'mark', + 'marker', + 'tabs', + ], + }, + { + code: 'šŸ”–', + keywords: [ + 'bookmark', + 'mark', + ], + }, + { + code: 'šŸ·', + keywords: [ + 'label', + ], + }, + { + code: 'šŸ’°', + keywords: [ + 'bag', + 'dollar', + 'money', + 'moneybag', + ], + }, + { + code: 'šŸ’“', + keywords: [ + 'bank', + 'banknote', + 'bill', + 'currency', + 'money', + 'note', + 'yen', + ], + }, + { + code: 'šŸ’µ', + keywords: [ + 'bank', + 'banknote', + 'bill', + 'currency', + 'dollar', + 'money', + 'note', + ], + }, + { + code: 'šŸ’¶', + keywords: [ + 'bank', + 'banknote', + 'bill', + 'currency', + 'euro', + 'money', + 'note', + ], + }, + { + code: 'šŸ’·', + keywords: [ + 'bank', + 'banknote', + 'bill', + 'currency', + 'money', + 'note', + 'pound', + ], + }, + { + code: 'šŸ’ø', + keywords: [ + 'bank', + 'banknote', + 'bill', + 'dollar', + 'fly', + 'money', + 'note', + 'wings', + ], + }, + { + code: 'šŸ’³', + keywords: [ + 'bank', + 'card', + 'credit', + 'money', + ], + }, + { + code: 'šŸ’¹', + keywords: [ + 'bank', + 'chart', + 'currency', + 'graph', + 'growth', + 'market', + 'money', + 'rise', + 'trend', + 'upward', + 'yen', + ], + }, + { + code: 'šŸ’±', + keywords: [ + 'bank', + 'currency', + 'exchange', + 'money', + ], + }, + { + code: 'šŸ’²', + keywords: [ + 'currency', + 'dollar', + 'money', + ], + }, + { + code: 'āœ‰', + keywords: [ + 'e-mail', + 'email', + 'envelope', + ], + }, + { + code: 'šŸ“§', + keywords: [ + 'communication', + 'e-mail', + 'email', + 'letter', + 'mail', + ], + }, + { + code: 'šŸ“Ø', + keywords: [ + 'communication', + 'e-mail', + 'email', + 'envelope', + 'incoming', + 'letter', + 'mail', + 'receive', + ], + }, + { + code: 'šŸ“©', + keywords: [ + 'arrow', + 'communication', + 'down', + 'e-mail', + 'email', + 'envelope', + 'letter', + 'mail', + 'outgoing', + 'sent', + ], + }, + { + code: 'šŸ“¤', + keywords: [ + 'box', + 'communication', + 'letter', + 'mail', + 'outbox', + 'sent', + 'tray', + ], + }, + { + code: 'šŸ“„', + keywords: [ + 'box', + 'communication', + 'inbox', + 'letter', + 'mail', + 'receive', + 'tray', + ], + }, + { + code: 'šŸ“¦', + keywords: [ + 'box', + 'communication', + 'package', + 'parcel', + ], + }, + { + code: 'šŸ“«', + keywords: [ + 'closed', + 'communication', + 'flag', + 'mail', + 'mailbox', + 'postbox', + ], + }, + { + code: 'šŸ“Ŗ', + keywords: [ + 'closed', + 'communication', + 'flag', + 'lowered', + 'mail', + 'mailbox', + 'postbox', + ], + }, + { + code: 'šŸ“¬', + keywords: [ + 'communication', + 'flag', + 'mail', + 'mailbox', + 'open', + 'postbox', + ], + }, + { + code: 'šŸ“­', + keywords: [ + 'communication', + 'flag', + 'lowered', + 'mail', + 'mailbox', + 'open', + 'postbox', + ], + }, + { + code: 'šŸ“®', + keywords: [ + 'communication', + 'mail', + 'mailbox', + 'postbox', + ], + }, + { + code: 'šŸ—³', + keywords: [ + 'ballot', + 'box', + ], + }, + { + code: 'āœ', + keywords: [ + 'pencil', + ], + }, + { + code: 'āœ’', + keywords: [ + 'nib', + 'pen', + ], + }, + { + code: 'šŸ–‹', + keywords: [ + 'communication', + 'fountain', + 'pen', + ], + }, + { + code: 'šŸ–Š', + keywords: [ + 'ballpoint', + 'communication', + 'pen', + ], + }, + { + code: 'šŸ–Œ', + keywords: [ + 'communication', + 'paintbrush', + 'painting', + ], + }, + { + code: 'šŸ–', + keywords: [ + 'communication', + 'crayon', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'communication', + 'memo', + 'pencil', + ], + }, + { + code: 'šŸ’¼', + keywords: [ + 'briefcase', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'file', + 'folder', + ], + }, + { + code: 'šŸ“‚', + keywords: [ + 'file', + 'folder', + 'open', + ], + }, + { + code: 'šŸ—‚', + keywords: [ + 'card', + 'dividers', + 'index', + ], + }, + { + code: 'šŸ“…', + keywords: [ + 'calendar', + 'date', + ], + }, + { + code: 'šŸ“†', + keywords: [ + 'calendar', + ], + }, + { + code: 'šŸ—’', + keywords: [ + 'note', + 'pad', + 'spiral', + ], + }, + { + code: 'šŸ—“', + keywords: [ + 'calendar', + 'pad', + 'spiral', + ], + }, + { + code: 'šŸ“‡', + keywords: [ + 'card', + 'index', + 'rolodex', + ], + }, + { + code: 'šŸ“ˆ', + keywords: [ + 'chart', + 'graph', + 'growth', + 'trend', + 'upward', + ], + }, + { + code: 'šŸ“‰', + keywords: [ + 'chart', + 'down', + 'graph', + 'trend', + ], + }, + { + code: 'šŸ“Š', + keywords: [ + 'bar', + 'chart', + 'graph', + ], + }, + { + code: 'šŸ“‹', + keywords: [ + 'clipboard', + ], + }, + { + code: 'šŸ“Œ', + keywords: [ + 'pin', + 'pushpin', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'pin', + 'pushpin', + ], + }, + { + code: 'šŸ“Ž', + keywords: [ + 'paperclip', + ], + }, + { + code: 'šŸ–‡', + keywords: [ + 'communication', + 'link', + 'paperclip', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'ruler', + 'straight edge', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'ruler', + 'set', + 'triangle', + ], + }, + { + code: 'āœ‚', + keywords: [ + 'scissors', + 'tool', + ], + }, + { + code: 'šŸ—ƒ', + keywords: [ + 'box', + 'card', + 'file', + ], + }, + { + code: 'šŸ—„', + keywords: [ + 'cabinet', + 'file', + ], + }, + { + code: 'šŸ—‘', + keywords: [ + 'wastebasket', + ], + }, + { + code: 'šŸ”’', + keywords: [ + 'closed', + 'lock', + ], + }, + { + code: 'šŸ”“', + keywords: [ + 'lock', + 'open', + 'unlock', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'ink', + 'lock', + 'nib', + 'pen', + 'privacy', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'closed', + 'key', + 'lock', + 'secure', + ], + }, + { + code: 'šŸ”‘', + keywords: [ + 'key', + 'lock', + 'password', + ], + }, + { + code: 'šŸ—', + keywords: [ + 'clue', + 'key', + 'lock', + 'old', + ], + }, + { + code: 'šŸ”Ø', + keywords: [ + 'hammer', + 'tool', + ], + }, + { + code: 'ā›', + keywords: [ + 'mining', + 'pick', + 'tool', + ], + }, + { + code: 'āš’', + keywords: [ + 'hammer', + 'pick', + 'tool', + ], + }, + { + code: 'šŸ› ', + keywords: [ + 'hammer', + 'tool', + 'wrench', + ], + }, + { + code: 'šŸ—”', + keywords: [ + 'dagger', + 'knife', + 'weapon', + ], + }, + { + code: 'āš”', + keywords: [ + 'crossed', + 'swords', + 'weapon', + ], + }, + { + code: 'šŸ”«', + keywords: [ + 'gun', + 'handgun', + 'pistol', + 'revolver', + 'tool', + 'weapon', + ], + }, + { + code: 'šŸ¹', + keywords: [ + 'archer', + 'arrow', + 'bow', + 'sagittarius', + 'tool', + 'weapon', + 'zodiac', + ], + }, + { + code: 'šŸ›”', + keywords: [ + 'shield', + 'weapon', + ], + }, + { + code: 'šŸ”§', + keywords: [ + 'tool', + 'wrench', + ], + }, + { + code: 'šŸ”©', + keywords: [ + 'bolt', + 'nut', + 'tool', + ], + }, + { + code: 'āš™', + keywords: [ + 'gear', + 'tool', + ], + }, + { + code: 'šŸ—œ', + keywords: [ + 'compression', + 'tool', + 'vice', + ], + }, + { + code: 'āš—', + keywords: [ + 'alembic', + 'chemistry', + 'tool', + ], + }, + { + code: 'āš–', + keywords: [ + 'balance', + 'justice', + 'libra', + 'scales', + 'tool', + 'weight', + 'zodiac', + ], + }, + { + code: 'šŸ”—', + keywords: [ + 'link', + ], + }, + { + code: 'ā›“', + keywords: [ + 'chain', + ], + }, + { + code: 'šŸ’‰', + keywords: [ + 'doctor', + 'medicine', + 'needle', + 'shot', + 'sick', + 'syringe', + 'tool', + ], + }, + { + code: 'šŸ’Š', + keywords: [ + 'doctor', + 'medicine', + 'pill', + 'sick', + ], + }, + { + code: 'šŸš¬', + keywords: [ + 'activity', + 'smoking', + ], + }, + { + code: 'āš°', + keywords: [ + 'coffin', + 'death', + ], + }, + { + code: 'āš±', + keywords: [ + 'death', + 'funeral', + 'urn', + ], + }, + { + code: 'šŸ—æ', + keywords: [ + 'face', + 'moyai', + 'statue', + ], + }, + { + code: 'šŸ›¢', + keywords: [ + 'drum', + 'oil', + ], + }, + { + code: 'šŸ”®', + keywords: [ + 'ball', + 'crystal', + 'fairy tale', + 'fantasy', + 'fortune', + 'tool', + ], + }, + { + code: 'šŸ›’', + keywords: [ + 'cart', + 'shopping', + 'trolley', + ], + }, + { + code: 'Symbols', + header: true, + }, + { + code: 'šŸ§', + keywords: [ + 'atm', + 'automated', + 'bank', + 'teller', + ], + }, + { + code: 'šŸš®', + keywords: [ + 'litter', + 'litterbox', + ], + }, + { + code: 'šŸš°', + keywords: [ + 'drink', + 'potable', + 'water', + ], + }, + { + code: 'ā™æ', + keywords: [ + 'access', + 'wheelchair', + ], + }, + { + code: 'šŸš¹', + keywords: [ + 'lavatory', + 'man', + 'restroom', + 'wc', + ], + }, + { + code: 'šŸšŗ', + keywords: [ + 'lavatory', + 'restroom', + 'wc', + 'woman', + ], + }, + { + code: 'šŸš»', + keywords: [ + 'lavatory', + 'restroom', + 'wc', + ], + }, + { + code: 'šŸš¼', + keywords: [ + 'baby', + 'changing', + ], + }, + { + code: 'šŸš¾', + keywords: [ + 'closet', + 'lavatory', + 'restroom', + 'water', + 'wc', + ], + }, + { + code: 'šŸ›‚', + keywords: [ + 'control', + 'passport', + ], + }, + { + code: 'šŸ›ƒ', + keywords: [ + 'customs', + ], + }, + { + code: 'šŸ›„', + keywords: [ + 'baggage', + 'claim', + ], + }, + { + code: 'šŸ›…', + keywords: [ + 'baggage', + 'left luggage', + 'locker', + 'luggage', + ], + }, + { + code: 'āš ', + keywords: [ + 'warning', + ], + }, + { + code: 'šŸšø', + keywords: [ + 'child', + 'crossing', + 'pedestrian', + 'traffic', + ], + }, + { + code: 'ā›”', + keywords: [ + 'entry', + 'forbidden', + 'no', + 'not', + 'prohibited', + 'traffic', + ], + }, + { + code: 'šŸš«', + keywords: [ + 'entry', + 'forbidden', + 'no', + 'not', + 'prohibited', + ], + }, + { + code: 'šŸš³', + keywords: [ + 'bicycle', + 'bike', + 'forbidden', + 'no', + 'not', + 'prohibited', + 'vehicle', + ], + }, + { + code: 'šŸš­', + keywords: [ + 'forbidden', + 'no', + 'not', + 'prohibited', + 'smoking', + ], + }, + { + code: 'šŸšÆ', + keywords: [ + 'forbidden', + 'litter', + 'no', + 'not', + 'prohibited', + ], + }, + { + code: 'šŸš±', + keywords: [ + 'drink', + 'forbidden', + 'no', + 'not', + 'potable', + 'prohibited', + 'water', + ], + }, + { + code: 'šŸš·', + keywords: [ + 'forbidden', + 'no', + 'not', + 'pedestrian', + 'prohibited', + ], + }, + { + code: 'šŸ“µ', + keywords: [ + 'cell', + 'communication', + 'forbidden', + 'mobile', + 'no', + 'not', + 'phone', + 'prohibited', + 'telephone', + ], + }, + { + code: 'šŸ”ž', + keywords: [ + '18', + 'age restriction', + 'eighteen', + 'forbidden', + 'no', + 'not', + 'prohibited', + 'underage', + ], + }, + { + code: 'ā˜¢', + keywords: [ + 'radioactive', + ], + }, + { + code: 'ā˜£', + keywords: [ + 'biohazard', + ], + }, + { + code: 'ā¬†', + keywords: [ + 'arrow', + 'cardinal', + 'direction', + 'north', + ], + }, + { + code: 'ā†—', + keywords: [ + 'arrow', + 'direction', + 'intercardinal', + 'northeast', + ], + }, + { + code: 'āž”', + keywords: [ + 'arrow', + 'cardinal', + 'direction', + 'east', + ], + }, + { + code: 'ā†˜', + keywords: [ + 'arrow', + 'direction', + 'intercardinal', + 'southeast', + ], + }, + { + code: 'ā¬‡', + keywords: [ + 'arrow', + 'cardinal', + 'direction', + 'down', + 'south', + ], + }, + { + code: 'ā†™', + keywords: [ + 'arrow', + 'direction', + 'intercardinal', + 'southwest', + ], + }, + { + code: 'ā¬…', + keywords: [ + 'arrow', + 'cardinal', + 'direction', + 'west', + ], + }, + { + code: 'ā†–', + keywords: [ + 'arrow', + 'direction', + 'intercardinal', + 'northwest', + ], + }, + { + code: 'ā†•', + keywords: [ + 'arrow', + ], + }, + { + code: 'ā†”', + keywords: [ + 'arrow', + ], + }, + { + code: 'ā†©', + keywords: [ + 'arrow', + ], + }, + { + code: 'ā†Ŗ', + keywords: [ + 'arrow', + ], + }, + { + code: 'ā¤“', + keywords: [ + 'arrow', + ], + }, + { + code: 'ā¤µ', + keywords: [ + 'arrow', + 'down', + ], + }, + { + code: 'šŸ”ƒ', + keywords: [ + 'arrow', + 'clockwise', + 'reload', + ], + }, + { + code: 'šŸ”„', + keywords: [ + 'anticlockwise', + 'arrow', + 'counterclockwise', + 'withershins', + ], + }, + { + code: 'šŸ”™', + keywords: [ + 'arrow', + 'back', + ], + }, + { + code: 'šŸ”š', + keywords: [ + 'arrow', + 'end', + ], + }, + { + code: 'šŸ”›', + keywords: [ + 'arrow', + 'mark', + 'on', + ], + }, + { + code: 'šŸ”œ', + keywords: [ + 'arrow', + 'soon', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'arrow', + 'top', + 'up', + ], + }, + { + code: 'šŸ›', + keywords: [ + 'religion', + 'worship', + ], + }, + { + code: 'āš›', + keywords: [ + 'atheist', + 'atom', + ], + }, + { + code: 'šŸ•‰', + keywords: [ + 'hindu', + 'om', + 'religion', + ], + }, + { + code: 'āœ”', + keywords: [ + 'david', + 'jew', + 'jewish', + 'religion', + 'star', + ], + }, + { + code: 'ā˜ø', + keywords: [ + 'buddhist', + 'dharma', + 'religion', + 'wheel', + ], + }, + { + code: 'ā˜Æ', + keywords: [ + 'religion', + 'tao', + 'taoist', + 'yang', + 'yin', + ], + }, + { + code: 'āœ', + keywords: [ + 'christian', + 'cross', + 'religion', + ], + }, + { + code: 'ā˜¦', + keywords: [ + 'christian', + 'cross', + 'religion', + ], + }, + { + code: 'ā˜Ŗ', + keywords: [ + 'islam', + 'muslim', + 'religion', + ], + }, + { + code: 'ā˜®', + keywords: [ + 'peace', + ], + }, + { + code: 'šŸ•Ž', + keywords: [ + 'candelabrum', + 'candlestick', + 'menorah', + 'religion', + ], + }, + { + code: 'šŸ”Æ', + keywords: [ + 'fortune', + 'star', + ], + }, + { + code: 'ā™»', + keywords: [ + 'recycle', + ], + }, + { + code: 'šŸ“›', + keywords: [ + 'badge', + 'name', + ], + }, + { + code: 'āšœ', + keywords: [ + 'fleur-de-lis', + ], + }, + { + code: 'šŸ”°', + keywords: [ + 'beginner', + 'chevron', + 'green', + 'japanese', + 'leaf', + 'tool', + 'yellow', + ], + }, + { + code: 'šŸ”±', + keywords: [ + 'anchor', + 'emblem', + 'ship', + 'tool', + 'trident', + ], + }, + { + code: 'ā­•', + keywords: [ + 'circle', + 'o', + ], + }, + { + code: 'āœ…', + keywords: [ + 'check', + 'mark', + ], + }, + { + code: 'ā˜‘', + keywords: [ + 'ballot', + 'box', + 'check', + ], + }, + { + code: 'āœ”', + keywords: [ + 'check', + 'mark', + ], + }, + { + code: 'āœ–', + keywords: [ + 'cancel', + 'multiplication', + 'multiply', + 'x', + ], + }, + { + code: 'āŒ', + keywords: [ + 'cancel', + 'mark', + 'multiplication', + 'multiply', + 'x', + ], + }, + { + code: 'āŽ', + keywords: [ + 'mark', + 'square', + ], + }, + { + code: 'āž•', + keywords: [ + 'math', + 'plus', + ], + }, + { + code: 'āž–', + keywords: [ + 'math', + 'minus', + ], + }, + { + code: 'āž—', + keywords: [ + 'division', + 'math', + ], + }, + { + code: 'āž°', + keywords: [ + 'curl', + 'loop', + ], + }, + { + code: 'āžæ', + keywords: [ + 'curl', + 'double', + 'loop', + ], + }, + { + code: 'ć€½', + keywords: [ + 'mark', + 'part', + ], + }, + { + code: 'āœ³', + keywords: [ + 'asterisk', + ], + }, + { + code: 'āœ“', + keywords: [ + 'star', + ], + }, + { + code: 'ā‡', + keywords: [ + 'sparkle', + ], + }, + { + code: 'ā€¼', + keywords: [ + 'bangbang', + 'exclamation', + 'mark', + 'punctuation', + ], + }, + { + code: 'ā‰', + keywords: [ + 'exclamation', + 'interrobang', + 'mark', + 'punctuation', + 'question', + ], + }, + { + code: 'ā“', + keywords: [ + 'mark', + 'punctuation', + 'question', + ], + }, + { + code: 'ā”', + keywords: [ + 'mark', + 'outlined', + 'punctuation', + 'question', + ], + }, + { + code: 'ā•', + keywords: [ + 'exclamation', + 'mark', + 'outlined', + 'punctuation', + ], + }, + { + code: 'ā—', + keywords: [ + 'exclamation', + 'mark', + 'punctuation', + ], + }, + { + code: '怰', + keywords: [ + 'dash', + 'punctuation', + 'wavy', + ], + }, + { + code: 'Ā©', + keywords: [ + 'copyright', + ], + }, + { + code: 'Ā®', + keywords: [ + 'registered', + ], + }, + { + code: 'ā„¢', + keywords: [ + 'mark', + 'tm', + 'trademark', + ], + }, + { + code: 'ā™ˆ', + keywords: [ + 'aries', + 'ram', + 'zodiac', + ], + }, + { + code: 'ā™‰', + keywords: [ + 'bull', + 'ox', + 'taurus', + 'zodiac', + ], + }, + { + code: 'ā™Š', + keywords: [ + 'gemini', + 'twins', + 'zodiac', + ], + }, + { + code: 'ā™‹', + keywords: [ + 'cancer', + 'crab', + 'zodiac', + ], + }, + { + code: 'ā™Œ', + keywords: [ + 'leo', + 'lion', + 'zodiac', + ], + }, + { + code: 'ā™', + keywords: [ + 'maiden', + 'virgin', + 'virgo', + 'zodiac', + ], + }, + { + code: 'ā™Ž', + keywords: [ + 'balance', + 'justice', + 'libra', + 'scales', + 'zodiac', + ], + }, + { + code: 'ā™', + keywords: [ + 'scorpio', + 'scorpion', + 'scorpius', + 'zodiac', + ], + }, + { + code: 'ā™', + keywords: [ + 'archer', + 'sagittarius', + 'zodiac', + ], + }, + { + code: 'ā™‘', + keywords: [ + 'capricorn', + 'goat', + 'zodiac', + ], + }, + { + code: 'ā™’', + keywords: [ + 'aquarius', + 'bearer', + 'water', + 'zodiac', + ], + }, + { + code: 'ā™“', + keywords: [ + 'fish', + 'pisces', + 'zodiac', + ], + }, + { + code: 'ā›Ž', + keywords: [ + 'bearer', + 'ophiuchus', + 'serpent', + 'snake', + 'zodiac', + ], + }, + { + code: 'šŸ”€', + keywords: [ + 'arrow', + 'crossed', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'arrow', + 'clockwise', + 'repeat', + ], + }, + { + code: 'šŸ”‚', + keywords: [ + 'arrow', + 'clockwise', + 'once', + ], + }, + { + code: 'ā–¶', + keywords: [ + 'arrow', + 'play', + 'right', + 'triangle', + ], + }, + { + code: 'ā©', + keywords: [ + 'arrow', + 'double', + 'fast', + 'forward', + ], + }, + { + code: 'ā­', + keywords: [ + 'arrow', + 'next scene', + 'next track', + 'triangle', + ], + }, + { + code: 'āÆ', + keywords: [ + 'arrow', + 'pause', + 'play', + 'right', + 'triangle', + ], + }, + { + code: 'ā—€', + keywords: [ + 'arrow', + 'left', + 'reverse', + 'triangle', + ], + }, + { + code: 'āŖ', + keywords: [ + 'arrow', + 'double', + 'rewind', + ], + }, + { + code: 'ā®', + keywords: [ + 'arrow', + 'previous scene', + 'previous track', + 'triangle', + ], + }, + { + code: 'šŸ”¼', + keywords: [ + 'arrow', + 'button', + 'red', + ], + }, + { + code: 'ā«', + keywords: [ + 'arrow', + 'double', + ], + }, + { + code: 'šŸ”½', + keywords: [ + 'arrow', + 'button', + 'down', + 'red', + ], + }, + { + code: 'ā¬', + keywords: [ + 'arrow', + 'double', + 'down', + ], + }, + { + code: 'āø', + keywords: [ + 'bar', + 'double', + 'pause', + 'vertical', + ], + }, + { + code: 'ā¹', + keywords: [ + 'square', + 'stop', + ], + }, + { + code: 'āŗ', + keywords: [ + 'circle', + 'record', + ], + }, + { + code: 'ā', + keywords: [ + 'eject', + ], + }, + { + code: 'šŸŽ¦', + keywords: [ + 'activity', + 'camera', + 'cinema', + 'entertainment', + 'film', + 'movie', + ], + }, + { + code: 'šŸ”…', + keywords: [ + 'brightness', + 'dim', + 'low', + ], + }, + { + code: 'šŸ”†', + keywords: [ + 'bright', + 'brightness', + ], + }, + { + code: 'šŸ“¶', + keywords: [ + 'antenna', + 'bar', + 'cell', + 'communication', + 'mobile', + 'phone', + 'signal', + 'telephone', + ], + }, + { + code: 'šŸ“³', + keywords: [ + 'cell', + 'communication', + 'mobile', + 'mode', + 'phone', + 'telephone', + 'vibration', + ], + }, + { + code: 'šŸ““', + keywords: [ + 'cell', + 'communication', + 'mobile', + 'off', + 'phone', + 'telephone', + ], + }, + { + code: '#ļøāƒ£', + keywords: [ + 'hash', + 'keycap', + 'pound', + ], + }, + { + code: '*ļøāƒ£', + keywords: [ + 'asterisk', + 'keycap', + 'star', + ], + }, + { + code: '0ļøāƒ£', + keywords: [ + '0', + 'keycap', + 'zero', + ], + }, + { + code: '1ļøāƒ£', + keywords: [ + '1', + 'keycap', + 'one', + ], + }, + { + code: '2ļøāƒ£', + keywords: [ + '2', + 'keycap', + 'two', + ], + }, + { + code: '3ļøāƒ£', + keywords: [ + '3', + 'keycap', + 'three', + ], + }, + { + code: '4ļøāƒ£', + keywords: [ + '4', + 'four', + 'keycap', + ], + }, + { + code: '5ļøāƒ£', + keywords: [ + '5', + 'five', + 'keycap', + ], + }, + { + code: '6ļøāƒ£', + keywords: [ + '6', + 'keycap', + 'six', + ], + }, + { + code: '7ļøāƒ£', + keywords: [ + '7', + 'keycap', + 'seven', + ], + }, + { + code: '8ļøāƒ£', + keywords: [ + '8', + 'eight', + 'keycap', + ], + }, + { + code: '9ļøāƒ£', + keywords: [ + '9', + 'keycap', + 'nine', + ], + }, + { + code: 'šŸ”Ÿ', + keywords: [ + '10', + 'keycap', + 'ten', + ], + }, + { + code: 'šŸ’Æ', + keywords: [ + '100', + 'full', + 'hundred', + 'score', + ], + }, + { + code: 'šŸ” ', + keywords: [ + 'input', + 'latin', + 'letters', + 'uppercase', + ], + }, + { + code: 'šŸ””', + keywords: [ + 'abcd', + 'input', + 'latin', + 'letters', + 'lowercase', + ], + }, + { + code: 'šŸ”¢', + keywords: [ + '1234', + 'input', + 'numbers', + ], + }, + { + code: 'šŸ”£', + keywords: [ + 'input', + ], + }, + { + code: 'šŸ”¤', + keywords: [ + 'abc', + 'alphabet', + 'input', + 'latin', + 'letters', + ], + }, + { + code: 'šŸ…°', + keywords: [ + 'a', + 'blood', + ], + }, + { + code: 'šŸ†Ž', + keywords: [ + 'ab', + 'blood', + ], + }, + { + code: 'šŸ…±', + keywords: [ + 'b', + 'blood', + ], + }, + { + code: 'šŸ†‘', + keywords: [ + 'cl', + ], + }, + { + code: 'šŸ†’', + keywords: [ + 'cool', + ], + }, + { + code: 'šŸ†“', + keywords: [ + 'free', + ], + }, + { + code: 'ā„¹', + keywords: [ + 'i', + 'information', + ], + }, + { + code: 'šŸ†”', + keywords: [ + 'id', + 'identity', + ], + }, + { + code: 'ā“‚', + keywords: [ + 'circle', + 'm', + ], + }, + { + code: 'šŸ†•', + keywords: [ + 'new', + ], + }, + { + code: 'šŸ†–', + keywords: [ + 'ng', + ], + }, + { + code: 'šŸ…¾', + keywords: [ + 'blood', + 'o', + ], + }, + { + code: 'šŸ†—', + keywords: [ + 'ok', + ], + }, + { + code: 'šŸ…æ', + keywords: [ + 'parking', + ], + }, + { + code: 'šŸ†˜', + keywords: [ + 'help', + 'sos', + ], + }, + { + code: 'šŸ†™', + keywords: [ + 'mark', + 'up', + ], + }, + { + code: 'šŸ†š', + keywords: [ + 'versus', + 'vs', + ], + }, + { + code: 'šŸˆ', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸˆ‚', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸˆ·', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸˆ¶', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸˆÆ', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸ‰', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸˆ¹', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸˆš', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸˆ²', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸ‰‘', + keywords: [ + 'chinese', + ], + }, + { + code: 'šŸˆø', + keywords: [ + 'chinese', + ], + }, + { + code: 'šŸˆ“', + keywords: [ + 'chinese', + ], + }, + { + code: 'šŸˆ³', + keywords: [ + 'chinese', + ], + }, + { + code: '抗', + keywords: [ + 'chinese', + 'congratulation', + 'congratulations', + 'ideograph', + ], + }, + { + code: '抙', + keywords: [ + 'chinese', + 'ideograph', + 'secret', + ], + }, + { + code: 'šŸˆŗ', + keywords: [ + 'chinese', + ], + }, + { + code: 'šŸˆµ', + keywords: [ + 'chinese', + ], + }, + { + code: 'ā–Ŗ', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'ā–«', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'ā—»', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'ā—¼', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'ā—½', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'ā—¾', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'ā¬›', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'ā¬œ', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'šŸ”¶', + keywords: [ + 'diamond', + 'geometric', + 'orange', + ], + }, + { + code: 'šŸ”·', + keywords: [ + 'blue', + 'diamond', + 'geometric', + ], + }, + { + code: 'šŸ”ø', + keywords: [ + 'diamond', + 'geometric', + 'orange', + ], + }, + { + code: 'šŸ”¹', + keywords: [ + 'blue', + 'diamond', + 'geometric', + ], + }, + { + code: 'šŸ”ŗ', + keywords: [ + 'geometric', + 'red', + ], + }, + { + code: 'šŸ”»', + keywords: [ + 'down', + 'geometric', + 'red', + ], + }, + { + code: 'šŸ’ ', + keywords: [ + 'comic', + 'diamond', + 'geometric', + 'inside', + ], + }, + { + code: 'šŸ”˜', + keywords: [ + 'button', + 'geometric', + 'radio', + ], + }, + { + code: 'šŸ”²', + keywords: [ + 'button', + 'geometric', + 'square', + ], + }, + { + code: 'šŸ”³', + keywords: [ + 'button', + 'geometric', + 'outlined', + 'square', + ], + }, + { + code: 'āšŖ', + keywords: [ + 'circle', + 'geometric', + ], + }, + { + code: 'āš«', + keywords: [ + 'circle', + 'geometric', + ], + }, + { + code: 'šŸ”“', + keywords: [ + 'circle', + 'geometric', + 'red', + ], + }, + { + code: 'šŸ”µ', + keywords: [ + 'blue', + 'circle', + 'geometric', + ], + }, + { + code: 'Flags', + header: true, + }, + { + code: 'šŸ', + keywords: [ + 'checkered', + 'chequered', + 'flag', + 'racing', + ], + }, + { + code: 'šŸš©', + keywords: [ + 'flag', + 'post', + ], + }, + { + code: 'šŸŽŒ', + keywords: [ + 'activity', + 'celebration', + 'cross', + 'crossed', + 'flag', + 'japanese', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'flag', + 'waving', + ], + }, + { + code: 'šŸ³', + keywords: [ + 'flag', + 'waving', + ], + }, + { + code: 'šŸ‡¦šŸ‡Ø', + keywords: [ + 'ascension', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡¦šŸ‡©', + keywords: [ + 'andorra', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡Ŗ', + keywords: [ + 'emirates', + 'flag', + 'uae', + 'united', + ], + }, + { + code: 'šŸ‡¦šŸ‡«', + keywords: [ + 'afghanistan', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡¬', + keywords: [ + 'antigua', + 'barbuda', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡®', + keywords: [ + 'anguilla', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡±', + keywords: [ + 'albania', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡²', + keywords: [ + 'armenia', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡“', + keywords: [ + 'angola', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡¶', + keywords: [ + 'antarctica', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡·', + keywords: [ + 'argentina', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡ø', + keywords: [ + 'american', + 'flag', + 'samoa', + ], + }, + { + code: 'šŸ‡¦šŸ‡¹', + keywords: [ + 'austria', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡ŗ', + keywords: [ + 'australia', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡¼', + keywords: [ + 'aruba', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡½', + keywords: [ + 'Ć„land', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡æ', + keywords: [ + 'azerbaijan', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡¦', + keywords: [ + 'bosnia', + 'flag', + 'herzegovina', + ], + }, + { + code: 'šŸ‡§šŸ‡§', + keywords: [ + 'barbados', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡©', + keywords: [ + 'bangladesh', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡Ŗ', + keywords: [ + 'belgium', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡«', + keywords: [ + 'burkina faso', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡¬', + keywords: [ + 'bulgaria', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡­', + keywords: [ + 'bahrain', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡®', + keywords: [ + 'burundi', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡Æ', + keywords: [ + 'benin', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡±', + keywords: [ + 'barthelemy', + 'barthĆ©lemy', + 'flag', + 'saint', + ], + }, + { + code: 'šŸ‡§šŸ‡²', + keywords: [ + 'bermuda', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡³', + keywords: [ + 'brunei', + 'darussalam', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡“', + keywords: [ + 'bolivia', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡¶', + keywords: [ + 'bonaire', + 'caribbean', + 'eustatius', + 'flag', + 'netherlands', + 'saba', + 'sint', + ], + }, + { + code: 'šŸ‡§šŸ‡·', + keywords: [ + 'brazil', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡ø', + keywords: [ + 'bahamas', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡¹', + keywords: [ + 'bhutan', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡»', + keywords: [ + 'bouvet', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡§šŸ‡¼', + keywords: [ + 'botswana', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡¾', + keywords: [ + 'belarus', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡æ', + keywords: [ + 'belize', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡¦', + keywords: [ + 'canada', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡Ø', + keywords: [ + 'cocos', + 'flag', + 'island', + 'keeling', + ], + }, + { + code: 'šŸ‡ØšŸ‡©', + keywords: [ + 'congo', + 'congo-kinshasa', + 'democratic republic of congo', + 'drc', + 'flag', + 'kinshasa', + 'republic', + ], + }, + { + code: 'šŸ‡ØšŸ‡«', + keywords: [ + 'central african republic', + 'flag', + 'republic', + ], + }, + { + code: 'šŸ‡ØšŸ‡¬', + keywords: [ + 'brazzaville', + 'congo', + 'congo republic', + 'congo-brazzaville', + 'flag', + 'republic', + 'republic of the congo', + ], + }, + { + code: 'šŸ‡ØšŸ‡­', + keywords: [ + 'flag', + 'switzerland', + ], + }, + { + code: 'šŸ‡ØšŸ‡®', + keywords: [ + 'cote ivoire', + 'cĆ“te ivoire', + 'flag', + 'ivory coast', + ], + }, + { + code: 'šŸ‡ØšŸ‡°', + keywords: [ + 'cook', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡ØšŸ‡±', + keywords: [ + 'chile', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡²', + keywords: [ + 'cameroon', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡³', + keywords: [ + 'china', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡“', + keywords: [ + 'colombia', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡µ', + keywords: [ + 'clipperton', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡ØšŸ‡·', + keywords: [ + 'costa rica', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡ŗ', + keywords: [ + 'cuba', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡»', + keywords: [ + 'cabo', + 'cape', + 'flag', + 'verde', + ], + }, + { + code: 'šŸ‡ØšŸ‡¼', + keywords: [ + 'antilles', + 'curacao', + 'curaƧao', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡½', + keywords: [ + 'christmas', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡ØšŸ‡¾', + keywords: [ + 'cyprus', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡æ', + keywords: [ + 'czech republic', + 'flag', + ], + }, + { + code: 'šŸ‡©šŸ‡Ŗ', + keywords: [ + 'flag', + 'germany', + ], + }, + { + code: 'šŸ‡©šŸ‡¬', + keywords: [ + 'diego garcia', + 'flag', + ], + }, + { + code: 'šŸ‡©šŸ‡Æ', + keywords: [ + 'djibouti', + 'flag', + ], + }, + { + code: 'šŸ‡©šŸ‡°', + keywords: [ + 'denmark', + 'flag', + ], + }, + { + code: 'šŸ‡©šŸ‡²', + keywords: [ + 'dominica', + 'flag', + ], + }, + { + code: 'šŸ‡©šŸ‡“', + keywords: [ + 'dominican republic', + 'flag', + ], + }, + { + code: 'šŸ‡©šŸ‡æ', + keywords: [ + 'algeria', + 'flag', + ], + }, + { + code: 'šŸ‡ŖšŸ‡¦', + keywords: [ + 'ceuta', + 'flag', + 'melilla', + ], + }, + { + code: 'šŸ‡ŖšŸ‡Ø', + keywords: [ + 'ecuador', + 'flag', + ], + }, + { + code: 'šŸ‡ŖšŸ‡Ŗ', + keywords: [ + 'estonia', + 'flag', + ], + }, + { + code: 'šŸ‡ŖšŸ‡¬', + keywords: [ + 'egypt', + 'flag', + ], + }, + { + code: 'šŸ‡ŖšŸ‡­', + keywords: [ + 'flag', + 'sahara', + 'west', + 'western sahara', + ], + }, + { + code: 'šŸ‡ŖšŸ‡·', + keywords: [ + 'eritrea', + 'flag', + ], + }, + { + code: 'šŸ‡ŖšŸ‡ø', + keywords: [ + 'flag', + 'spain', + ], + }, + { + code: 'šŸ‡ŖšŸ‡¹', + keywords: [ + 'ethiopia', + 'flag', + ], + }, + { + code: 'šŸ‡ŖšŸ‡ŗ', + keywords: [ + 'european union', + 'flag', + ], + }, + { + code: 'šŸ‡«šŸ‡®', + keywords: [ + 'finland', + 'flag', + ], + }, + { + code: 'šŸ‡«šŸ‡Æ', + keywords: [ + 'fiji', + 'flag', + ], + }, + { + code: 'šŸ‡«šŸ‡°', + keywords: [ + 'falkland', + 'falklands', + 'flag', + 'island', + 'islas', + 'malvinas', + ], + }, + { + code: 'šŸ‡«šŸ‡²', + keywords: [ + 'flag', + 'micronesia', + ], + }, + { + code: 'šŸ‡«šŸ‡“', + keywords: [ + 'faroe', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡«šŸ‡·', + keywords: [ + 'flag', + 'france', + ], + }, + { + code: 'šŸ‡¬šŸ‡¦', + keywords: [ + 'flag', + 'gabon', + ], + }, + { + code: 'šŸ‡¬šŸ‡§', + keywords: [ + 'britain', + 'british', + 'cornwall', + 'england', + 'flag', + 'great britain', + 'ireland', + 'northern ireland', + 'scotland', + 'uk', + 'union jack', + 'united', + 'united kingdom', + 'wales', + ], + }, + { + code: 'šŸ‡¬šŸ‡©', + keywords: [ + 'flag', + 'grenada', + ], + }, + { + code: 'šŸ‡¬šŸ‡Ŗ', + keywords: [ + 'flag', + 'georgia', + ], + }, + { + code: 'šŸ‡¬šŸ‡«', + keywords: [ + 'flag', + 'french', + 'guiana', + ], + }, + { + code: 'šŸ‡¬šŸ‡¬', + keywords: [ + 'flag', + 'guernsey', + ], + }, + { + code: 'šŸ‡¬šŸ‡­', + keywords: [ + 'flag', + 'ghana', + ], + }, + { + code: 'šŸ‡¬šŸ‡®', + keywords: [ + 'flag', + 'gibraltar', + ], + }, + { + code: 'šŸ‡¬šŸ‡±', + keywords: [ + 'flag', + 'greenland', + ], + }, + { + code: 'šŸ‡¬šŸ‡²', + keywords: [ + 'flag', + 'gambia', + ], + }, + { + code: 'šŸ‡¬šŸ‡³', + keywords: [ + 'flag', + 'guinea', + ], + }, + { + code: 'šŸ‡¬šŸ‡µ', + keywords: [ + 'flag', + 'guadeloupe', + ], + }, + { + code: 'šŸ‡¬šŸ‡¶', + keywords: [ + 'equatorial guinea', + 'flag', + 'guinea', + ], + }, + { + code: 'šŸ‡¬šŸ‡·', + keywords: [ + 'flag', + 'greece', + ], + }, + { + code: 'šŸ‡¬šŸ‡ø', + keywords: [ + 'flag', + 'georgia', + 'island', + 'south', + 'south georgia', + 'south sandwich', + ], + }, + { + code: 'šŸ‡¬šŸ‡¹', + keywords: [ + 'flag', + 'guatemala', + ], + }, + { + code: 'šŸ‡¬šŸ‡ŗ', + keywords: [ + 'flag', + 'guam', + ], + }, + { + code: 'šŸ‡¬šŸ‡¼', + keywords: [ + 'bissau', + 'flag', + 'guinea', + ], + }, + { + code: 'šŸ‡¬šŸ‡¾', + keywords: [ + 'flag', + 'guyana', + ], + }, + { + code: 'šŸ‡­šŸ‡°', + keywords: [ + 'china', + 'flag', + 'hong kong', + ], + }, + { + code: 'šŸ‡­šŸ‡²', + keywords: [ + 'flag', + 'heard', + 'island', + 'mcdonald', + ], + }, + { + code: 'šŸ‡­šŸ‡³', + keywords: [ + 'flag', + 'honduras', + ], + }, + { + code: 'šŸ‡­šŸ‡·', + keywords: [ + 'croatia', + 'flag', + ], + }, + { + code: 'šŸ‡­šŸ‡¹', + keywords: [ + 'flag', + 'haiti', + ], + }, + { + code: 'šŸ‡­šŸ‡ŗ', + keywords: [ + 'flag', + 'hungary', + ], + }, + { + code: 'šŸ‡®šŸ‡Ø', + keywords: [ + 'canary', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡®šŸ‡©', + keywords: [ + 'flag', + 'indonesia', + ], + }, + { + code: 'šŸ‡®šŸ‡Ŗ', + keywords: [ + 'flag', + 'ireland', + ], + }, + { + code: 'šŸ‡®šŸ‡±', + keywords: [ + 'flag', + 'israel', + ], + }, + { + code: 'šŸ‡®šŸ‡²', + keywords: [ + 'flag', + 'isle of man', + ], + }, + { + code: 'šŸ‡®šŸ‡³', + keywords: [ + 'flag', + 'india', + ], + }, + { + code: 'šŸ‡®šŸ‡“', + keywords: [ + 'british', + 'chagos', + 'flag', + 'indian ocean', + 'island', + ], + }, + { + code: 'šŸ‡®šŸ‡¶', + keywords: [ + 'flag', + 'iraq', + ], + }, + { + code: 'šŸ‡®šŸ‡·', + keywords: [ + 'flag', + 'iran', + ], + }, + { + code: 'šŸ‡®šŸ‡ø', + keywords: [ + 'flag', + 'iceland', + ], + }, + { + code: 'šŸ‡®šŸ‡¹', + keywords: [ + 'flag', + 'italy', + ], + }, + { + code: 'šŸ‡ÆšŸ‡Ŗ', + keywords: [ + 'flag', + 'jersey', + ], + }, + { + code: 'šŸ‡ÆšŸ‡²', + keywords: [ + 'flag', + 'jamaica', + ], + }, + { + code: 'šŸ‡ÆšŸ‡“', + keywords: [ + 'flag', + 'jordan', + ], + }, + { + code: 'šŸ‡ÆšŸ‡µ', + keywords: [ + 'flag', + 'japan', + ], + }, + { + code: 'šŸ‡°šŸ‡Ŗ', + keywords: [ + 'flag', + 'kenya', + ], + }, + { + code: 'šŸ‡°šŸ‡¬', + keywords: [ + 'flag', + 'kyrgyzstan', + ], + }, + { + code: 'šŸ‡°šŸ‡­', + keywords: [ + 'cambodia', + 'flag', + ], + }, + { + code: 'šŸ‡°šŸ‡®', + keywords: [ + 'flag', + 'kiribati', + ], + }, + { + code: 'šŸ‡°šŸ‡²', + keywords: [ + 'comoros', + 'flag', + ], + }, + { + code: 'šŸ‡°šŸ‡³', + keywords: [ + 'flag', + 'kitts', + 'nevis', + 'saint', + ], + }, + { + code: 'šŸ‡°šŸ‡µ', + keywords: [ + 'flag', + 'korea', + 'north', + 'north korea', + ], + }, + { + code: 'šŸ‡°šŸ‡·', + keywords: [ + 'flag', + 'korea', + 'south', + 'south korea', + ], + }, + { + code: 'šŸ‡°šŸ‡¼', + keywords: [ + 'flag', + 'kuwait', + ], + }, + { + code: 'šŸ‡°šŸ‡¾', + keywords: [ + 'cayman', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡°šŸ‡æ', + keywords: [ + 'flag', + 'kazakhstan', + ], + }, + { + code: 'šŸ‡±šŸ‡¦', + keywords: [ + 'flag', + 'laos', + ], + }, + { + code: 'šŸ‡±šŸ‡§', + keywords: [ + 'flag', + 'lebanon', + ], + }, + { + code: 'šŸ‡±šŸ‡Ø', + keywords: [ + 'flag', + 'lucia', + 'saint', + ], + }, + { + code: 'šŸ‡±šŸ‡®', + keywords: [ + 'flag', + 'liechtenstein', + ], + }, + { + code: 'šŸ‡±šŸ‡°', + keywords: [ + 'flag', + 'sri lanka', + ], + }, + { + code: 'šŸ‡±šŸ‡·', + keywords: [ + 'flag', + 'liberia', + ], + }, + { + code: 'šŸ‡±šŸ‡ø', + keywords: [ + 'flag', + 'lesotho', + ], + }, + { + code: 'šŸ‡±šŸ‡¹', + keywords: [ + 'flag', + 'lithuania', + ], + }, + { + code: 'šŸ‡±šŸ‡ŗ', + keywords: [ + 'flag', + 'luxembourg', + ], + }, + { + code: 'šŸ‡±šŸ‡»', + keywords: [ + 'flag', + 'latvia', + ], + }, + { + code: 'šŸ‡±šŸ‡¾', + keywords: [ + 'flag', + 'libya', + ], + }, + { + code: 'šŸ‡²šŸ‡¦', + keywords: [ + 'flag', + 'morocco', + ], + }, + { + code: 'šŸ‡²šŸ‡Ø', + keywords: [ + 'flag', + 'monaco', + ], + }, + { + code: 'šŸ‡²šŸ‡©', + keywords: [ + 'flag', + 'moldova', + ], + }, + { + code: 'šŸ‡²šŸ‡Ŗ', + keywords: [ + 'flag', + 'montenegro', + ], + }, + { + code: 'šŸ‡²šŸ‡«', + keywords: [ + 'flag', + 'french', + 'martin', + 'saint', + ], + }, + { + code: 'šŸ‡²šŸ‡¬', + keywords: [ + 'flag', + 'madagascar', + ], + }, + { + code: 'šŸ‡²šŸ‡­', + keywords: [ + 'flag', + 'island', + 'marshall', + ], + }, + { + code: 'šŸ‡²šŸ‡°', + keywords: [ + 'flag', + 'macedonia', + ], + }, + { + code: 'šŸ‡²šŸ‡±', + keywords: [ + 'flag', + 'mali', + ], + }, + { + code: 'šŸ‡²šŸ‡²', + keywords: [ + 'burma', + 'flag', + 'myanmar', + ], + }, + { + code: 'šŸ‡²šŸ‡³', + keywords: [ + 'flag', + 'mongolia', + ], + }, + { + code: 'šŸ‡²šŸ‡“', + keywords: [ + 'china', + 'flag', + 'macao', + 'macau', + ], + }, + { + code: 'šŸ‡²šŸ‡µ', + keywords: [ + 'flag', + 'island', + 'mariana', + 'north', + 'northern mariana', + ], + }, + { + code: 'šŸ‡²šŸ‡¶', + keywords: [ + 'flag', + 'martinique', + ], + }, + { + code: 'šŸ‡²šŸ‡·', + keywords: [ + 'flag', + 'mauritania', + ], + }, + { + code: 'šŸ‡²šŸ‡ø', + keywords: [ + 'flag', + 'montserrat', + ], + }, + { + code: 'šŸ‡²šŸ‡¹', + keywords: [ + 'flag', + 'malta', + ], + }, + { + code: 'šŸ‡²šŸ‡ŗ', + keywords: [ + 'flag', + 'mauritius', + ], + }, + { + code: 'šŸ‡²šŸ‡»', + keywords: [ + 'flag', + 'maldives', + ], + }, + { + code: 'šŸ‡²šŸ‡¼', + keywords: [ + 'flag', + 'malawi', + ], + }, + { + code: 'šŸ‡²šŸ‡½', + keywords: [ + 'flag', + 'mexico', + ], + }, + { + code: 'šŸ‡²šŸ‡¾', + keywords: [ + 'flag', + 'malaysia', + ], + }, + { + code: 'šŸ‡²šŸ‡æ', + keywords: [ + 'flag', + 'mozambique', + ], + }, + { + code: 'šŸ‡³šŸ‡¦', + keywords: [ + 'flag', + 'namibia', + ], + }, + { + code: 'šŸ‡³šŸ‡Ø', + keywords: [ + 'flag', + 'new', + 'new caledonia', + ], + }, + { + code: 'šŸ‡³šŸ‡Ŗ', + keywords: [ + 'flag', + 'niger', + ], + }, + { + code: 'šŸ‡³šŸ‡«', + keywords: [ + 'flag', + 'island', + 'norfolk', + ], + }, + { + code: 'šŸ‡³šŸ‡¬', + keywords: [ + 'flag', + 'nigeria', + ], + }, + { + code: 'šŸ‡³šŸ‡®', + keywords: [ + 'flag', + 'nicaragua', + ], + }, + { + code: 'šŸ‡³šŸ‡±', + keywords: [ + 'flag', + 'netherlands', + ], + }, + { + code: 'šŸ‡³šŸ‡“', + keywords: [ + 'flag', + 'norway', + ], + }, + { + code: 'šŸ‡³šŸ‡µ', + keywords: [ + 'flag', + 'nepal', + ], + }, + { + code: 'šŸ‡³šŸ‡·', + keywords: [ + 'flag', + 'nauru', + ], + }, + { + code: 'šŸ‡³šŸ‡ŗ', + keywords: [ + 'flag', + 'niue', + ], + }, + { + code: 'šŸ‡³šŸ‡æ', + keywords: [ + 'flag', + 'new', + 'new zealand', + ], + }, + { + code: 'šŸ‡“šŸ‡²', + keywords: [ + 'flag', + 'oman', + ], + }, + { + code: 'šŸ‡µšŸ‡¦', + keywords: [ + 'flag', + 'panama', + ], + }, + { + code: 'šŸ‡µšŸ‡Ŗ', + keywords: [ + 'flag', + 'peru', + ], + }, + { + code: 'šŸ‡µšŸ‡«', + keywords: [ + 'flag', + 'french', + 'polynesia', + ], + }, + { + code: 'šŸ‡µšŸ‡¬', + keywords: [ + 'flag', + 'guinea', + 'new', + 'papua new guinea', + ], + }, + { + code: 'šŸ‡µšŸ‡­', + keywords: [ + 'flag', + 'philippines', + ], + }, + { + code: 'šŸ‡µšŸ‡°', + keywords: [ + 'flag', + 'pakistan', + ], + }, + { + code: 'šŸ‡µšŸ‡±', + keywords: [ + 'flag', + 'poland', + ], + }, + { + code: 'šŸ‡µšŸ‡²', + keywords: [ + 'flag', + 'miquelon', + 'pierre', + 'saint', + ], + }, + { + code: 'šŸ‡µšŸ‡³', + keywords: [ + 'flag', + 'island', + 'pitcairn', + ], + }, + { + code: 'šŸ‡µšŸ‡·', + keywords: [ + 'flag', + 'puerto rico', + ], + }, + { + code: 'šŸ‡µšŸ‡ø', + keywords: [ + 'flag', + 'palestine', + ], + }, + { + code: 'šŸ‡µšŸ‡¹', + keywords: [ + 'flag', + 'portugal', + ], + }, + { + code: 'šŸ‡µšŸ‡¼', + keywords: [ + 'flag', + 'palau', + ], + }, + { + code: 'šŸ‡µšŸ‡¾', + keywords: [ + 'flag', + 'paraguay', + ], + }, + { + code: 'šŸ‡¶šŸ‡¦', + keywords: [ + 'flag', + 'qatar', + ], + }, + { + code: 'šŸ‡·šŸ‡Ŗ', + keywords: [ + 'flag', + 'reunion', + 'rĆ©union', + ], + }, + { + code: 'šŸ‡·šŸ‡“', + keywords: [ + 'flag', + 'romania', + ], + }, + { + code: 'šŸ‡·šŸ‡ø', + keywords: [ + 'flag', + 'serbia', + ], + }, + { + code: 'šŸ‡·šŸ‡ŗ', + keywords: [ + 'flag', + 'russia', + ], + }, + { + code: 'šŸ‡·šŸ‡¼', + keywords: [ + 'flag', + 'rwanda', + ], + }, + { + code: 'šŸ‡øšŸ‡¦', + keywords: [ + 'flag', + 'saudi arabia', + ], + }, + { + code: 'šŸ‡øšŸ‡§', + keywords: [ + 'flag', + 'island', + 'solomon', + ], + }, + { + code: 'šŸ‡øšŸ‡Ø', + keywords: [ + 'flag', + 'seychelles', + ], + }, + { + code: 'šŸ‡øšŸ‡©', + keywords: [ + 'flag', + 'sudan', + ], + }, + { + code: 'šŸ‡øšŸ‡Ŗ', + keywords: [ + 'flag', + 'sweden', + ], + }, + { + code: 'šŸ‡øšŸ‡¬', + keywords: [ + 'flag', + 'singapore', + ], + }, + { + code: 'šŸ‡øšŸ‡­', + keywords: [ + 'flag', + 'helena', + 'saint', + ], + }, + { + code: 'šŸ‡øšŸ‡®', + keywords: [ + 'flag', + 'slovenia', + ], + }, + { + code: 'šŸ‡øšŸ‡Æ', + keywords: [ + 'flag', + 'jan mayen', + 'svalbard', + ], + }, + { + code: 'šŸ‡øšŸ‡°', + keywords: [ + 'flag', + 'slovakia', + ], + }, + { + code: 'šŸ‡øšŸ‡±', + keywords: [ + 'flag', + 'sierra leone', + ], + }, + { + code: 'šŸ‡øšŸ‡²', + keywords: [ + 'flag', + 'san marino', + ], + }, + { + code: 'šŸ‡øšŸ‡³', + keywords: [ + 'flag', + 'senegal', + ], + }, + { + code: 'šŸ‡øšŸ‡“', + keywords: [ + 'flag', + 'somalia', + ], + }, + { + code: 'šŸ‡øšŸ‡·', + keywords: [ + 'flag', + 'suriname', + ], + }, + { + code: 'šŸ‡øšŸ‡ø', + keywords: [ + 'flag', + 'south', + 'south sudan', + 'sudan', + ], + }, + { + code: 'šŸ‡øšŸ‡¹', + keywords: [ + 'flag', + 'principe', + 'prĆ­ncipe', + 'sao tome', + 'sĆ£o tomĆ©', + ], + }, + { + code: 'šŸ‡øšŸ‡»', + keywords: [ + 'el salvador', + 'flag', + ], + }, + { + code: 'šŸ‡øšŸ‡½', + keywords: [ + 'flag', + 'maarten', + 'sint', + ], + }, + { + code: 'šŸ‡øšŸ‡¾', + keywords: [ + 'flag', + 'syria', + ], + }, + { + code: 'šŸ‡øšŸ‡æ', + keywords: [ + 'flag', + 'swaziland', + ], + }, + { + code: 'šŸ‡¹šŸ‡¦', + keywords: [ + 'flag', + 'tristan da cunha', + ], + }, + { + code: 'šŸ‡¹šŸ‡Ø', + keywords: [ + 'caicos', + 'flag', + 'island', + 'turks', + ], + }, + { + code: 'šŸ‡¹šŸ‡©', + keywords: [ + 'chad', + 'flag', + ], + }, + { + code: 'šŸ‡¹šŸ‡«', + keywords: [ + 'antarctic', + 'flag', + 'french', + ], + }, + { + code: 'šŸ‡¹šŸ‡¬', + keywords: [ + 'flag', + 'togo', + ], + }, + { + code: 'šŸ‡¹šŸ‡­', + keywords: [ + 'flag', + 'thailand', + ], + }, + { + code: 'šŸ‡¹šŸ‡Æ', + keywords: [ + 'flag', + 'tajikistan', + ], + }, + { + code: 'šŸ‡¹šŸ‡°', + keywords: [ + 'flag', + 'tokelau', + ], + }, + { + code: 'šŸ‡¹šŸ‡±', + keywords: [ + 'east', + 'east timor', + 'flag', + 'timor-leste', + ], + }, + { + code: 'šŸ‡¹šŸ‡²', + keywords: [ + 'flag', + 'turkmenistan', + ], + }, + { + code: 'šŸ‡¹šŸ‡³', + keywords: [ + 'flag', + 'tunisia', + ], + }, + { + code: 'šŸ‡¹šŸ‡“', + keywords: [ + 'flag', + 'tonga', + ], + }, + { + code: 'šŸ‡¹šŸ‡·', + keywords: [ + 'flag', + 'turkey', + ], + }, + { + code: 'šŸ‡¹šŸ‡¹', + keywords: [ + 'flag', + 'tobago', + 'trinidad', + ], + }, + { + code: 'šŸ‡¹šŸ‡»', + keywords: [ + 'flag', + 'tuvalu', + ], + }, + { + code: 'šŸ‡¹šŸ‡¼', + keywords: [ + 'china', + 'flag', + 'taiwan', + ], + }, + { + code: 'šŸ‡¹šŸ‡æ', + keywords: [ + 'flag', + 'tanzania', + ], + }, + { + code: 'šŸ‡ŗšŸ‡¦', + keywords: [ + 'flag', + 'ukraine', + ], + }, + { + code: 'šŸ‡ŗšŸ‡¬', + keywords: [ + 'flag', + 'uganda', + ], + }, + { + code: 'šŸ‡ŗšŸ‡²', + keywords: [ + 'america', + 'flag', + 'island', + 'minor outlying', + 'united', + 'united states', + 'us', + 'usa', + ], + }, + { + code: 'šŸ‡ŗšŸ‡ø', + keywords: [ + 'america', + 'flag', + 'stars and stripes', + 'united', + 'united states', + ], + }, + { + code: 'šŸ‡ŗšŸ‡¾', + keywords: [ + 'flag', + 'uruguay', + ], + }, + { + code: 'šŸ‡ŗšŸ‡æ', + keywords: [ + 'flag', + 'uzbekistan', + ], + }, + { + code: 'šŸ‡»šŸ‡¦', + keywords: [ + 'flag', + 'vatican', + ], + }, + { + code: 'šŸ‡»šŸ‡Ø', + keywords: [ + 'flag', + 'grenadines', + 'saint', + 'vincent', + ], + }, + { + code: 'šŸ‡»šŸ‡Ŗ', + keywords: [ + 'flag', + 'venezuela', + ], + }, + { + code: 'šŸ‡»šŸ‡¬', + keywords: [ + 'british', + 'flag', + 'island', + 'virgin', + ], + }, + { + code: 'šŸ‡»šŸ‡®', + keywords: [ + 'america', + 'american', + 'flag', + 'island', + 'united', + 'united states', + 'us', + 'usa', + 'virgin', + ], + }, + { + code: 'šŸ‡»šŸ‡³', + keywords: [ + 'flag', + 'viet nam', + 'vietnam', + ], + }, + { + code: 'šŸ‡»šŸ‡ŗ', + keywords: [ + 'flag', + 'vanuatu', + ], + }, + { + code: 'šŸ‡¼šŸ‡«', + keywords: [ + 'flag', + 'futuna', + 'wallis', + ], + }, + { + code: 'šŸ‡¼šŸ‡ø', + keywords: [ + 'flag', + 'samoa', + ], + }, + { + code: 'šŸ‡½šŸ‡°', + keywords: [ + 'flag', + 'kosovo', + ], + }, + { + code: 'šŸ‡¾šŸ‡Ŗ', + keywords: [ + 'flag', + 'yemen', + ], + }, + { + code: 'šŸ‡¾šŸ‡¹', + keywords: [ + 'flag', + 'mayotte', + ], + }, + { + code: 'šŸ‡æšŸ‡¦', + keywords: [ + 'flag', + 'south', + 'south africa', + ], + }, + { + code: 'šŸ‡æšŸ‡²', + keywords: [ + 'flag', + 'zambia', + ], + }, + { + code: 'šŸ‡æšŸ‡¼', + keywords: [ + 'flag', + 'zimbabwe', + ], + }, +]; export default emojis; From 18e4c1e79eab12742e934d6eaf475d6a4194b2e4 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 22 Mar 2021 09:37:25 -0600 Subject: [PATCH 010/380] Add emoji icon to expensicons list --- src/components/Icon/Expensicons.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/Icon/Expensicons.js b/src/components/Icon/Expensicons.js index 21e5b0890e05..c6a872f6d4a1 100644 --- a/src/components/Icon/Expensicons.js +++ b/src/components/Icon/Expensicons.js @@ -21,6 +21,7 @@ import Gear from '../../../assets/images/gear.svg'; import Wallet from '../../../assets/images/wallet.svg'; import Lock from '../../../assets/images/lock.svg'; import ArrowRight from '../../../assets/images/arrow-right.svg'; +import Emoji from '../../../assets/images/emoji.svg'; export { BackArrow, @@ -46,4 +47,5 @@ export { Wallet, Lock, ArrowRight, + Emoji, }; From cd72afd51ed3e854fe1b559f08a604382a823eb2 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 22 Mar 2021 09:37:51 -0600 Subject: [PATCH 011/380] Use emoji button instead of send --- src/pages/home/report/ReportActionCompose.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index c17100f5f2bd..ebb47f233f99 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -9,7 +9,7 @@ import themeColors from '../../../styles/themes/default'; import TextInputFocusable from '../../../components/TextInputFocusable'; import ONYXKEYS from '../../../ONYXKEYS'; import Icon from '../../../components/Icon'; -import {Paperclip, Send} from '../../../components/Icon/Expensicons'; +import {Paperclip, Send, Emoji} from '../../../components/Icon/Expensicons'; import AttachmentPicker from '../../../components/AttachmentPicker'; import {addAction, saveReportComment, broadcastUserIsTyping} from '../../../libs/actions/Report'; import ReportTypingIndicator from './ReportTypingIndicator'; @@ -188,6 +188,7 @@ class ReportActionCompose extends React.Component { this.hideEmojiPicker(); this.textInput.value += emoji; this.setIsFocused(true); + this.updateComment(this.textInput.value); } /** @@ -318,13 +319,11 @@ class ReportActionCompose extends React.Component { /> - + Date: Mon, 22 Mar 2021 09:38:16 -0600 Subject: [PATCH 012/380] Add styles for emoji picker button --- src/styles/styles.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/styles/styles.js b/src/styles/styles.js index 4d54f5427c47..00eab13925ab 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -739,6 +739,18 @@ const styles = { justifyContent: 'center', }, + chatItemEmojiButton: { + alignSelf: 'flex-end', + borderRadius: 6, + height: 32, + paddingTop: 6, + paddingRight: 6, + paddingBottom: 6, + paddingLeft: 6, + margin: 3, + justifyContent: 'center', + }, + chatItemAttachButton: { alignItems: 'center', alignSelf: 'flex-end', From abf77ce9072dc07f7218d38c5ea1d8035f6b5d94 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 22 Mar 2021 10:10:18 -0600 Subject: [PATCH 013/380] Update structure to match SectionList requirements --- assets/emojis.js | 23879 +++++++++++++++++++++++---------------------- 1 file changed, 11943 insertions(+), 11936 deletions(-) diff --git a/assets/emojis.js b/assets/emojis.js index c162e7e491be..e928cc757fd3 100644 --- a/assets/emojis.js +++ b/assets/emojis.js @@ -26,11942 +26,11949 @@ const emojis = [ { - code: 'Smileys & People', - header: true, - }, - { - code: 'šŸ˜€', - keywords: [ - 'face', - 'grin', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'eye', - 'face', - 'grin', - 'smile', - ], - }, - { - code: 'šŸ˜‚', - keywords: [ - 'face', - 'joy', - 'laugh', - 'tear', - ], - }, - { - code: 'šŸ¤£', - keywords: [ - 'face', - 'floor', - 'laugh', - 'lol', - 'rofl', - 'rolling', - ], - }, - { - code: 'šŸ˜ƒ', - keywords: [ - 'face', - 'mouth', - 'open', - 'smile', - ], - }, - { - code: 'šŸ˜„', - keywords: [ - 'eye', - 'face', - 'mouth', - 'open', - 'smile', - ], - }, - { - code: 'šŸ˜…', - keywords: [ - 'cold', - 'face', - 'open', - 'smile', - 'sweat', - ], - }, - { - code: 'šŸ˜†', - keywords: [ - 'face', - 'laugh', - 'mouth', - 'open', - 'satisfied', - 'smile', - ], - }, - { - code: 'šŸ˜‰', - keywords: [ - 'face', - 'wink', - ], - }, - { - code: 'šŸ˜Š', - keywords: [ - 'blush', - 'eye', - 'face', - 'smile', - ], - }, - { - code: 'šŸ˜‹', - keywords: [ - 'delicious', - 'face', - 'savouring', - 'smile', - 'um', - 'yum', - ], - }, - { - code: 'šŸ˜Ž', - keywords: [ - 'bright', - 'cool', - 'eye', - 'eyewear', - 'face', - 'glasses', - 'smile', - 'sun', - 'sunglasses', - 'weather', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'eye', - 'face', - 'heart', - 'love', - 'smile', - ], - }, - { - code: 'šŸ˜˜', - keywords: [ - 'face', - 'heart', - 'kiss', - ], - }, - { - code: 'šŸ˜—', - keywords: [ - 'face', - 'kiss', - ], - }, - { - code: 'šŸ˜™', - keywords: [ - 'eye', - 'face', - 'kiss', - 'smile', - ], - }, - { - code: 'šŸ˜š', - keywords: [ - 'closed', - 'eye', - 'face', - 'kiss', - ], - }, - { - code: 'ā˜ŗ', - keywords: [ - 'face', - 'outlined', - 'relaxed', - 'smile', - ], - }, - { - code: 'šŸ™‚', - keywords: [ - 'face', - 'smile', - ], - }, - { - code: 'šŸ¤—', - keywords: [ - 'face', - 'hug', - 'hugging', - ], - }, - { - code: 'šŸ¤”', - keywords: [ - 'face', - 'thinking', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'deadpan', - 'face', - 'neutral', - ], - }, - { - code: 'šŸ˜‘', - keywords: [ - 'expressionless', - 'face', - 'inexpressive', - 'unexpressive', - ], - }, - { - code: 'šŸ˜¶', - keywords: [ - 'face', - 'mouth', - 'quiet', - 'silent', - ], - }, - { - code: 'šŸ™„', - keywords: [ - 'eyes', - 'face', - 'rolling', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'face', - 'smirk', - ], - }, - { - code: 'šŸ˜£', - keywords: [ - 'face', - 'persevere', - ], - }, - { - code: 'šŸ˜„', - keywords: [ - 'disappointed', - 'face', - 'relieved', - 'whew', - ], - }, - { - code: 'šŸ˜®', - keywords: [ - 'face', - 'mouth', - 'open', - 'sympathy', - ], - }, - { - code: 'šŸ¤', - keywords: [ - 'face', - 'mouth', - 'zipper', - ], - }, - { - code: 'šŸ˜Æ', - keywords: [ - 'face', - 'hushed', - 'stunned', - 'surprised', - ], - }, - { - code: 'šŸ˜Ŗ', - keywords: [ - 'face', - 'sleep', - ], - }, - { - code: 'šŸ˜«', - keywords: [ - 'face', - 'tired', - ], - }, - { - code: 'šŸ˜“', - keywords: [ - 'face', - 'sleep', - 'zzz', - ], - }, - { - code: 'šŸ˜Œ', - keywords: [ - 'face', - 'relieved', - ], - }, - { - code: 'šŸ¤“', - keywords: [ - 'face', - 'geek', - 'nerd', - ], - }, - { - code: 'šŸ˜›', - keywords: [ - 'face', - 'tongue', - ], - }, - { - code: 'šŸ˜œ', - keywords: [ - 'eye', - 'face', - 'joke', - 'tongue', - 'wink', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'eye', - 'face', - 'horrible', - 'taste', - 'tongue', - ], - }, - { - code: 'šŸ¤¤', - keywords: [ - 'drooling', - 'face', - ], - }, - { - code: 'šŸ˜’', - keywords: [ - 'face', - 'unamused', - 'unhappy', - ], - }, - { - code: 'šŸ˜“', - keywords: [ - 'cold', - 'face', - 'sweat', - ], - }, - { - code: 'šŸ˜”', - keywords: [ - 'dejected', - 'face', - 'pensive', - ], - }, - { - code: 'šŸ˜•', - keywords: [ - 'confused', - 'face', - ], - }, - { - code: 'šŸ™ƒ', - keywords: [ - 'face', - 'upside-down', - ], - }, - { - code: 'šŸ¤‘', - keywords: [ - 'face', - 'money', - 'mouth', - ], - }, - { - code: 'šŸ˜²', - keywords: [ - 'astonished', - 'face', - 'shocked', - 'totally', - ], - }, - { - code: 'ā˜¹', - keywords: [ - 'face', - 'frown', - ], - }, - { - code: 'šŸ™', - keywords: [ - 'face', - 'frown', - ], - }, - { - code: 'šŸ˜–', - keywords: [ - 'confounded', - 'face', - ], - }, - { - code: 'šŸ˜ž', - keywords: [ - 'disappointed', - 'face', - ], - }, - { - code: 'šŸ˜Ÿ', - keywords: [ - 'face', - 'worried', - ], - }, - { - code: 'šŸ˜¤', - keywords: [ - 'face', - 'triumph', - 'won', - ], - }, - { - code: 'šŸ˜¢', - keywords: [ - 'cry', - 'face', - 'sad', - 'tear', - ], - }, - { - code: 'šŸ˜­', - keywords: [ - 'cry', - 'face', - 'sad', - 'sob', - 'tear', - ], - }, - { - code: 'šŸ˜¦', - keywords: [ - 'face', - 'frown', - 'mouth', - 'open', - ], - }, - { - code: 'šŸ˜§', - keywords: [ - 'anguished', - 'face', - ], - }, - { - code: 'šŸ˜Ø', - keywords: [ - 'face', - 'fear', - 'fearful', - 'scared', - ], - }, - { - code: 'šŸ˜©', - keywords: [ - 'face', - 'tired', - 'weary', - ], - }, - { - code: 'šŸ˜¬', - keywords: [ - 'face', - 'grimace', - ], - }, - { - code: 'šŸ˜°', - keywords: [ - 'blue', - 'cold', - 'face', - 'mouth', - 'open', - 'rushed', - 'sweat', - ], - }, - { - code: 'šŸ˜±', - keywords: [ - 'face', - 'fear', - 'fearful', - 'munch', - 'scared', - 'scream', - ], - }, - { - code: 'šŸ˜³', - keywords: [ - 'dazed', - 'face', - 'flushed', - ], - }, - { - code: 'šŸ˜µ', - keywords: [ - 'dizzy', - 'face', - ], - }, - { - code: 'šŸ˜”', - keywords: [ - 'angry', - 'face', - 'mad', - 'pouting', - 'rage', - 'red', - ], - }, - { - code: 'šŸ˜ ', - keywords: [ - 'angry', - 'face', - 'mad', - ], - }, - { - code: 'šŸ˜‡', - keywords: [ - 'angel', - 'face', - 'fairy tale', - 'fantasy', - 'halo', - 'innocent', - 'smile', - ], - }, - { - code: 'šŸ¤ ', - keywords: [ - 'cowboy', - 'cowgirl', - 'face', - 'hat', - ], - }, - { - code: 'šŸ¤”', - keywords: [ - 'clown', - 'face', - ], - }, - { - code: 'šŸ¤„', - keywords: [ - 'face', - 'lie', - 'pinocchio', - ], - }, - { - code: 'šŸ˜·', - keywords: [ - 'cold', - 'doctor', - 'face', - 'mask', - 'medicine', - 'sick', - ], - }, - { - code: 'šŸ¤’', - keywords: [ - 'face', - 'ill', - 'sick', - 'thermometer', - ], - }, - { - code: 'šŸ¤•', - keywords: [ - 'bandage', - 'face', - 'hurt', - 'injury', - ], - }, - { - code: 'šŸ¤¢', - keywords: [ - 'face', - 'nauseated', - 'vomit', - ], - }, - { - code: 'šŸ¤§', - keywords: [ - 'face', - 'gesundheit', - 'sneeze', - ], - }, - { - code: 'šŸ˜ˆ', - keywords: [ - 'face', - 'fairy tale', - 'fantasy', - 'horns', - 'smile', - ], - }, - { - code: 'šŸ‘æ', - keywords: [ - 'demon', - 'devil', - 'face', - 'fairy tale', - 'fantasy', - 'imp', - ], - }, - { - code: 'šŸ‘¹', - keywords: [ - 'creature', - 'face', - 'fairy tale', - 'fantasy', - 'japanese', - 'monster', - 'ogre', - ], - }, - { - code: 'šŸ‘ŗ', - keywords: [ - 'creature', - 'face', - 'fairy tale', - 'fantasy', - 'goblin', - 'japanese', - 'monster', - ], - }, - { - code: 'šŸ’€', - keywords: [ - 'body', - 'death', - 'face', - 'fairy tale', - 'monster', - 'skull', - ], - }, - { - code: 'ā˜ ', - keywords: [ - 'body', - 'crossbones', - 'death', - 'face', - 'monster', - 'skull', - ], - }, - { - code: 'šŸ‘»', - keywords: [ - 'creature', - 'face', - 'fairy tale', - 'fantasy', - 'ghost', - 'monster', - ], - }, - { - code: 'šŸ‘½', - keywords: [ - 'alien', - 'creature', - 'extraterrestrial', - 'face', - 'fairy tale', - 'fantasy', - 'monster', - 'space', - 'ufo', - ], - }, - { - code: 'šŸ‘¾', - keywords: [ - 'alien', - 'creature', - 'extraterrestrial', - 'face', - 'fairy tale', - 'fantasy', - 'monster', - 'space', - 'ufo', - ], - }, - { - code: 'šŸ¤–', - keywords: [ - 'face', - 'monster', - 'robot', - ], - }, - { - code: 'šŸ’©', - keywords: [ - 'comic', - 'dung', - 'face', - 'monster', - 'poo', - 'poop', - ], - }, - { - code: 'šŸ˜ŗ', - keywords: [ - 'cat', - 'face', - 'mouth', - 'open', - 'smile', - ], - }, - { - code: 'šŸ˜ø', - keywords: [ - 'cat', - 'eye', - 'face', - 'grin', - 'smile', - ], - }, - { - code: 'šŸ˜¹', - keywords: [ - 'cat', - 'face', - 'joy', - 'tear', - ], - }, - { - code: 'šŸ˜»', - keywords: [ - 'cat', - 'eye', - 'face', - 'heart', - 'love', - 'smile', - ], - }, - { - code: 'šŸ˜¼', - keywords: [ - 'cat', - 'face', - 'ironic', - 'smile', - 'wry', - ], - }, - { - code: 'šŸ˜½', - keywords: [ - 'cat', - 'eye', - 'face', - 'kiss', - ], - }, - { - code: 'šŸ™€', - keywords: [ - 'cat', - 'face', - 'oh', - 'surprised', - 'weary', - ], - }, - { - code: 'šŸ˜æ', - keywords: [ - 'cat', - 'cry', - 'face', - 'sad', - 'tear', - ], - }, - { - code: 'šŸ˜¾', - keywords: [ - 'cat', - 'face', - 'pouting', - ], - }, - { - code: 'šŸ™ˆ', - keywords: [ - 'evil', - 'face', - 'forbidden', - 'gesture', - 'monkey', - 'no', - 'not', - 'prohibited', - 'see', - ], - }, - { - code: 'šŸ™‰', - keywords: [ - 'evil', - 'face', - 'forbidden', - 'gesture', - 'hear', - 'monkey', - 'no', - 'not', - 'prohibited', - ], - }, - { - code: 'šŸ™Š', - keywords: [ - 'evil', - 'face', - 'forbidden', - 'gesture', - 'monkey', - 'no', - 'not', - 'prohibited', - 'speak', - ], - }, - { - code: 'šŸ‘¦', - keywords: [ - 'boy', - ], - types: [ - 'šŸ‘¦šŸæ', - 'šŸ‘¦šŸ¾', - 'šŸ‘¦šŸ½', - 'šŸ‘¦šŸ¼', - 'šŸ‘¦šŸ»', - ], - }, - { - code: 'šŸ‘§', - keywords: [ - 'girl', - 'maiden', - 'virgin', - 'virgo', - 'zodiac', - ], - types: [ - 'šŸ‘§šŸæ', - 'šŸ‘§šŸ¾', - 'šŸ‘§šŸ½', - 'šŸ‘§šŸ¼', - 'šŸ‘§šŸ»', - ], - }, - { - code: 'šŸ‘Ø', - keywords: [ - 'man', - ], - types: [ - 'šŸ‘ØšŸæ', - 'šŸ‘ØšŸ¾', - 'šŸ‘ØšŸ½', - 'šŸ‘ØšŸ¼', - 'šŸ‘ØšŸ»', - ], - }, - { - code: 'šŸ‘©', - keywords: [ - 'woman', - ], - types: [ - 'šŸ‘©šŸæ', - 'šŸ‘©šŸ¾', - 'šŸ‘©šŸ½', - 'šŸ‘©šŸ¼', - 'šŸ‘©šŸ»', - ], - }, - { - code: 'šŸ‘“', - keywords: [ - 'man', - 'old', - ], - types: [ - 'šŸ‘“šŸæ', - 'šŸ‘“šŸ¾', - 'šŸ‘“šŸ½', - 'šŸ‘“šŸ¼', - 'šŸ‘“šŸ»', - ], - }, - { - code: 'šŸ‘µ', - keywords: [ - 'old', - 'woman', - ], - types: [ - 'šŸ‘µšŸæ', - 'šŸ‘µšŸ¾', - 'šŸ‘µšŸ½', - 'šŸ‘µšŸ¼', - 'šŸ‘µšŸ»', - ], - }, - { - code: 'šŸ‘¶', - keywords: [ - 'baby', - ], - types: [ - 'šŸ‘¶šŸæ', - 'šŸ‘¶šŸ¾', - 'šŸ‘¶šŸ½', - 'šŸ‘¶šŸ¼', - 'šŸ‘¶šŸ»', - ], - }, - { - code: 'šŸ‘¼', - keywords: [ - 'angel', - 'baby', - 'face', - 'fairy tale', - 'fantasy', - ], - types: [ - 'šŸ‘¼šŸæ', - 'šŸ‘¼šŸ¾', - 'šŸ‘¼šŸ½', - 'šŸ‘¼šŸ¼', - 'šŸ‘¼šŸ»', - ], - }, - { - code: 'šŸ‘±', - keywords: [ - 'blond', - ], - types: [ - 'šŸ‘±šŸæ', - 'šŸ‘±šŸ¾', - 'šŸ‘±šŸ½', - 'šŸ‘±šŸ¼', - 'šŸ‘±šŸ»', - ], - }, - { - code: 'šŸ‘®', - keywords: [ - 'cop', - 'officer', - 'police', - ], - types: [ - 'šŸ‘®šŸæ', - 'šŸ‘®šŸ¾', - 'šŸ‘®šŸ½', - 'šŸ‘®šŸ¼', - 'šŸ‘®šŸ»', - ], - }, - { - code: 'šŸ‘²', - keywords: [ - 'gua pi mao', - 'hat', - 'man', - ], - types: [ - 'šŸ‘²šŸæ', - 'šŸ‘²šŸ¾', - 'šŸ‘²šŸ½', - 'šŸ‘²šŸ¼', - 'šŸ‘²šŸ»', - ], - }, - { - code: 'šŸ‘³', - keywords: [ - 'man', - 'turban', - ], - types: [ - 'šŸ‘³šŸæ', - 'šŸ‘³šŸ¾', - 'šŸ‘³šŸ½', - 'šŸ‘³šŸ¼', - 'šŸ‘³šŸ»', - ], - }, - { - code: 'šŸ‘·', - keywords: [ - 'construction', - 'hat', - 'worker', - ], - types: [ - 'šŸ‘·šŸæ', - 'šŸ‘·šŸ¾', - 'šŸ‘·šŸ½', - 'šŸ‘·šŸ¼', - 'šŸ‘·šŸ»', - ], - }, - { - code: 'šŸ‘ø', - keywords: [ - 'fairy tale', - 'fantasy', - 'princess', - ], - types: [ - 'šŸ‘øšŸæ', - 'šŸ‘øšŸ¾', - 'šŸ‘øšŸ½', - 'šŸ‘øšŸ¼', - 'šŸ‘øšŸ»', - ], - }, - { - code: 'šŸ¤“', - keywords: [ - 'prince', - ], - types: [ - 'šŸ¤“šŸæ', - 'šŸ¤“šŸ¾', - 'šŸ¤“šŸ½', - 'šŸ¤“šŸ¼', - 'šŸ¤“šŸ»', - ], - }, - { - code: 'šŸ’‚', - keywords: [ - 'guard', - 'guardsman', - ], - types: [ - 'šŸ’‚šŸæ', - 'šŸ’‚šŸ¾', - 'šŸ’‚šŸ½', - 'šŸ’‚šŸ¼', - 'šŸ’‚šŸ»', - ], - }, - { - code: 'šŸ•µ', - keywords: [ - 'detective', - 'sleuth', - 'spy', - ], - types: [ - 'šŸ•µšŸæ', - 'šŸ•µšŸ¾', - 'šŸ•µšŸ½', - 'šŸ•µšŸ¼', - 'šŸ•µšŸ»', - ], - }, - { - code: 'šŸŽ…', - keywords: [ - 'activity', - 'celebration', - 'christmas', - 'fairy tale', - 'fantasy', - 'father', - 'santa', - ], - types: [ - 'šŸŽ…šŸæ', - 'šŸŽ…šŸ¾', - 'šŸŽ…šŸ½', - 'šŸŽ…šŸ¼', - 'šŸŽ…šŸ»', - ], - }, - { - code: 'šŸ¤¶', - keywords: [ - 'christmas', - 'mother', - 'mrs. claus', - ], - types: [ - 'šŸ¤¶šŸæ', - 'šŸ¤¶šŸ¾', - 'šŸ¤¶šŸ½', - 'šŸ¤¶šŸ¼', - 'šŸ¤¶šŸ»', - ], - }, - { - code: 'šŸ‘°', - keywords: [ - 'bride', - 'veil', - 'wedding', - ], - types: [ - 'šŸ‘°šŸæ', - 'šŸ‘°šŸ¾', - 'šŸ‘°šŸ½', - 'šŸ‘°šŸ¼', - 'šŸ‘°šŸ»', - ], - }, - { - code: 'šŸ¤µ', - keywords: [ - 'groom', - 'man', - 'tuxedo', - ], - types: [ - 'šŸ¤µšŸæ', - 'šŸ¤µšŸ¾', - 'šŸ¤µšŸ½', - 'šŸ¤µšŸ¼', - 'šŸ¤µšŸ»', - ], - }, - { - code: 'šŸ’†', - keywords: [ - 'massage', - 'salon', - ], - types: [ - 'šŸ’†šŸæ', - 'šŸ’†šŸ¾', - 'šŸ’†šŸ½', - 'šŸ’†šŸ¼', - 'šŸ’†šŸ»', - ], - }, - { - code: 'šŸ’‡', - keywords: [ - 'barber', - 'beauty', - 'haircut', - 'parlor', - ], - types: [ - 'šŸ’‡šŸæ', - 'šŸ’‡šŸ¾', - 'šŸ’‡šŸ½', - 'šŸ’‡šŸ¼', - 'šŸ’‡šŸ»', - ], - }, - { - code: 'šŸ™', - keywords: [ - 'frown', - 'gesture', - ], - types: [ - 'šŸ™šŸæ', - 'šŸ™šŸ¾', - 'šŸ™šŸ½', - 'šŸ™šŸ¼', - 'šŸ™šŸ»', - ], - }, - { - code: 'šŸ™Ž', - keywords: [ - 'gesture', - 'pouting', - ], - types: [ - 'šŸ™ŽšŸæ', - 'šŸ™ŽšŸ¾', - 'šŸ™ŽšŸ½', - 'šŸ™ŽšŸ¼', - 'šŸ™ŽšŸ»', - ], - }, - { - code: 'šŸ™…', - keywords: [ - 'forbidden', - 'gesture', - 'hand', - 'no', - 'not', - 'prohibited', - ], - types: [ - 'šŸ™…šŸæ', - 'šŸ™…šŸ¾', - 'šŸ™…šŸ½', - 'šŸ™…šŸ¼', - 'šŸ™…šŸ»', - ], - }, - { - code: 'šŸ™†', - keywords: [ - 'gesture', - 'hand', - 'ok', - ], - types: [ - 'šŸ™†šŸæ', - 'šŸ™†šŸ¾', - 'šŸ™†šŸ½', - 'šŸ™†šŸ¼', - 'šŸ™†šŸ»', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'hand', - 'help', - 'information', - 'sassy', - ], - types: [ - 'šŸ’šŸæ', - 'šŸ’šŸ¾', - 'šŸ’šŸ½', - 'šŸ’šŸ¼', - 'šŸ’šŸ»', - ], - }, - { - code: 'šŸ¤·', - keywords: [ - 'doubt', - 'ignorance', - 'indifference', - 'shrug', - ], - types: [ - 'šŸ¤·šŸæ', - 'šŸ¤·šŸ¾', - 'šŸ¤·šŸ½', - 'šŸ¤·šŸ¼', - 'šŸ¤·šŸ»', - ], - }, - { - code: 'šŸ™‹', - keywords: [ - 'gesture', - 'hand', - 'happy', - 'raised', - ], - types: [ - 'šŸ™‹šŸæ', - 'šŸ™‹šŸ¾', - 'šŸ™‹šŸ½', - 'šŸ™‹šŸ¼', - 'šŸ™‹šŸ»', - ], - }, - { - code: 'šŸ¤¦', - keywords: [ - 'disbelief', - 'exasperation', - 'face', - 'palm', - ], - types: [ - 'šŸ¤¦šŸæ', - 'šŸ¤¦šŸ¾', - 'šŸ¤¦šŸ½', - 'šŸ¤¦šŸ¼', - 'šŸ¤¦šŸ»', - ], - }, - { - code: 'šŸ™‡', - keywords: [ - 'apology', - 'bow', - 'gesture', - 'sorry', - ], - types: [ - 'šŸ™‡šŸæ', - 'šŸ™‡šŸ¾', - 'šŸ™‡šŸ½', - 'šŸ™‡šŸ¼', - 'šŸ™‡šŸ»', - ], - }, - { - code: 'šŸš¶', - keywords: [ - 'hike', - 'pedestrian', - 'walk', - 'walking', - ], - types: [ - 'šŸš¶šŸæ', - 'šŸš¶šŸ¾', - 'šŸš¶šŸ½', - 'šŸš¶šŸ¼', - 'šŸš¶šŸ»', - ], - }, - { - code: 'šŸƒ', - keywords: [ - 'marathon', - 'runner', - 'running', - ], - types: [ - 'šŸƒšŸæ', - 'šŸƒšŸ¾', - 'šŸƒšŸ½', - 'šŸƒšŸ¼', - 'šŸƒšŸ»', - ], - }, - { - code: 'šŸ’ƒ', - keywords: [ - 'dancer', - ], - types: [ - 'šŸ’ƒšŸæ', - 'šŸ’ƒšŸ¾', - 'šŸ’ƒšŸ½', - 'šŸ’ƒšŸ¼', - 'šŸ’ƒšŸ»', - ], - }, - { - code: 'šŸ•ŗ', - keywords: [ - 'dance', - 'man', - ], - types: [ - 'šŸ•ŗšŸæ', - 'šŸ•ŗšŸ¾', - 'šŸ•ŗšŸ½', - 'šŸ•ŗšŸ¼', - 'šŸ•ŗšŸ»', - ], - }, - { - code: 'šŸ¤°', - keywords: [ - 'pregnant', - 'woman', - ], - types: [ - 'šŸ¤°šŸæ', - 'šŸ¤°šŸ¾', - 'šŸ¤°šŸ½', - 'šŸ¤°šŸ¼', - 'šŸ¤°šŸ»', - ], - }, - { - code: 'šŸ‘Æ', - keywords: [ - 'bunny', - 'dancer', - 'ear', - 'girl', - 'woman', - ], - }, - { - code: 'šŸ•“', - keywords: [ - 'business', - 'man', - 'suit', - ], - }, - { - code: 'šŸ—£', - keywords: [ - 'face', - 'head', - 'silhouette', - 'speak', - 'speaking', - ], - }, - { - code: 'šŸ‘¤', - keywords: [ - 'bust', - 'silhouette', - ], - }, - { - code: 'šŸ‘„', - keywords: [ - 'bust', - 'silhouette', - ], - }, - { - code: 'šŸ‘«', - keywords: [ - 'couple', - 'hand', - 'hold', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘¬', - keywords: [ - 'couple', - 'gemini', - 'hand', - 'hold', - 'man', - 'twins', - 'zodiac', - ], - }, - { - code: 'šŸ‘­', - keywords: [ - 'couple', - 'hand', - 'hold', - 'woman', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'couple', - 'kiss', - 'romance', - ], - }, - { - code: 'šŸ‘©ā€ā¤ļøā€šŸ’‹ā€šŸ‘Ø', - keywords: [ - 'kiss', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘Øā€ā¤ļøā€šŸ’‹ā€šŸ‘Ø', - keywords: [ - 'kiss', - 'man', - ], - }, - { - code: 'šŸ‘©ā€ā¤ļøā€šŸ’‹ā€šŸ‘©', - keywords: [ - 'kiss', - 'woman', - ], - }, - { - code: 'šŸ’‘', - keywords: [ - 'couple', - 'heart', - 'love', - 'romance', - ], - }, - { - code: 'šŸ‘©ā€ā¤ļøā€šŸ‘Ø', - keywords: [ - 'couple', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘Øā€ā¤ļøā€šŸ‘Ø', - keywords: [ - 'couple', - 'man', - ], - }, - { - code: 'šŸ‘©ā€ā¤ļøā€šŸ‘©', - keywords: [ - 'couple', - 'woman', - ], - }, - { - code: 'šŸ‘Ŗ', - keywords: [ - 'child', - 'family', - 'father', - 'mother', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘§', - keywords: [ - 'family', - 'girl', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘§ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'girl', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘¦ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘§ā€šŸ‘§', - keywords: [ - 'family', - 'girl', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'man', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘§', - keywords: [ - 'family', - 'girl', - 'man', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘§ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'girl', - 'man', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘¦ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'man', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘§ā€šŸ‘§', - keywords: [ - 'family', - 'girl', - 'man', - ], - }, - { - code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'woman', - ], - }, - { - code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘§', - keywords: [ - 'family', - 'girl', - 'woman', - ], - }, - { - code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘§ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'girl', - 'woman', - ], - }, - { - code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘¦ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'woman', - ], - }, - { - code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘§ā€šŸ‘§', - keywords: [ - 'family', - 'girl', - 'woman', - ], - }, - { - code: 'šŸ»', - keywords: [ - 'emoji modifier', - 'fitzpatrick', - 'skin', - 'tone', - ], - }, - { - code: 'šŸ¼', - keywords: [ - 'emoji modifier', - 'fitzpatrick', - 'skin', - 'tone', - ], - }, - { - code: 'šŸ½', - keywords: [ - 'emoji modifier', - 'fitzpatrick', - 'skin', - 'tone', - ], - }, - { - code: 'šŸ¾', - keywords: [ - 'emoji modifier', - 'fitzpatrick', - 'skin', - 'tone', - ], - }, - { - code: 'šŸæ', - keywords: [ - 'emoji modifier', - 'fitzpatrick', - 'skin', - 'tone', - ], - }, - { - code: 'šŸ’Ŗ', - keywords: [ - 'biceps', - 'body', - 'comic', - 'flex', - 'muscle', - ], - types: [ - 'šŸ’ŖšŸæ', - 'šŸ’ŖšŸ¾', - 'šŸ’ŖšŸ½', - 'šŸ’ŖšŸ¼', - 'šŸ’ŖšŸ»', - ], - }, - { - code: 'šŸ¤³', - keywords: [ - 'camera', - 'phone', - 'selfie', - ], - types: [ - 'šŸ¤³šŸæ', - 'šŸ¤³šŸ¾', - 'šŸ¤³šŸ½', - 'šŸ¤³šŸ¼', - 'šŸ¤³šŸ»', - ], - }, - { - code: 'šŸ‘ˆ', - keywords: [ - 'backhand', - 'body', - 'finger', - 'hand', - 'index', - 'point', - ], - types: [ - 'šŸ‘ˆšŸæ', - 'šŸ‘ˆšŸ¾', - 'šŸ‘ˆšŸ½', - 'šŸ‘ˆšŸ¼', - 'šŸ‘ˆšŸ»', - ], - }, - { - code: 'šŸ‘‰', - keywords: [ - 'backhand', - 'body', - 'finger', - 'hand', - 'index', - 'point', - ], - types: [ - 'šŸ‘‰šŸæ', - 'šŸ‘‰šŸ¾', - 'šŸ‘‰šŸ½', - 'šŸ‘‰šŸ¼', - 'šŸ‘‰šŸ»', - ], - }, - { - code: 'ā˜', - keywords: [ - 'body', - 'finger', - 'hand', - 'index', - 'point', - 'up', - ], - types: [ - 'ā˜šŸæ', - 'ā˜šŸ¾', - 'ā˜šŸ½', - 'ā˜šŸ¼', - 'ā˜šŸ»', - ], - }, - { - code: 'šŸ‘†', - keywords: [ - 'backhand', - 'body', - 'finger', - 'hand', - 'index', - 'point', - 'up', - ], - types: [ - 'šŸ‘†šŸæ', - 'šŸ‘†šŸ¾', - 'šŸ‘†šŸ½', - 'šŸ‘†šŸ¼', - 'šŸ‘†šŸ»', - ], - }, - { - code: 'šŸ–•', - keywords: [ - 'body', - 'finger', - 'hand', - 'middle finger', - ], - types: [ - 'šŸ–•šŸæ', - 'šŸ–•šŸ¾', - 'šŸ–•šŸ½', - 'šŸ–•šŸ¼', - 'šŸ–•šŸ»', - ], - }, - { - code: 'šŸ‘‡', - keywords: [ - 'backhand', - 'body', - 'down', - 'finger', - 'hand', - 'index', - 'point', - ], - types: [ - 'šŸ‘‡šŸæ', - 'šŸ‘‡šŸ¾', - 'šŸ‘‡šŸ½', - 'šŸ‘‡šŸ¼', - 'šŸ‘‡šŸ»', - ], - }, - { - code: 'āœŒ', - keywords: [ - 'body', - 'hand', - 'v', - 'victory', - ], - types: [ - 'āœŒšŸæ', - 'āœŒšŸ¾', - 'āœŒšŸ½', - 'āœŒšŸ¼', - 'āœŒšŸ»', - ], - }, - { - code: 'šŸ¤ž', - keywords: [ - 'cross', - 'finger', - 'hand', - 'luck', - ], - types: [ - 'šŸ¤žšŸæ', - 'šŸ¤žšŸ¾', - 'šŸ¤žšŸ½', - 'šŸ¤žšŸ¼', - 'šŸ¤žšŸ»', - ], - }, - { - code: 'šŸ––', - keywords: [ - 'body', - 'finger', - 'hand', - 'spock', - 'vulcan', - ], - types: [ - 'šŸ––šŸæ', - 'šŸ––šŸ¾', - 'šŸ––šŸ½', - 'šŸ––šŸ¼', - 'šŸ––šŸ»', - ], - }, - { - code: 'šŸ¤˜', - keywords: [ - 'body', - 'finger', - 'hand', - 'horns', - 'rock-on', - ], - types: [ - 'šŸ¤˜šŸæ', - 'šŸ¤˜šŸ¾', - 'šŸ¤˜šŸ½', - 'šŸ¤˜šŸ¼', - 'šŸ¤˜šŸ»', - ], - }, - { - code: 'šŸ¤™', - keywords: [ - 'call', - 'hand', - ], - types: [ - 'šŸ¤™šŸæ', - 'šŸ¤™šŸ¾', - 'šŸ¤™šŸ½', - 'šŸ¤™šŸ¼', - 'šŸ¤™šŸ»', - ], - }, - { - code: 'šŸ–', - keywords: [ - 'body', - 'finger', - 'hand', - 'splayed', - ], - types: [ - 'šŸ–šŸæ', - 'šŸ–šŸ¾', - 'šŸ–šŸ½', - 'šŸ–šŸ¼', - 'šŸ–šŸ»', - ], - }, - { - code: 'āœ‹', - keywords: [ - 'body', - 'hand', - ], - types: [ - 'āœ‹šŸæ', - 'āœ‹šŸ¾', - 'āœ‹šŸ½', - 'āœ‹šŸ¼', - 'āœ‹šŸ»', - ], - }, - { - code: 'šŸ‘Œ', - keywords: [ - 'body', - 'hand', - 'ok', - ], - types: [ - 'šŸ‘ŒšŸæ', - 'šŸ‘ŒšŸ¾', - 'šŸ‘ŒšŸ½', - 'šŸ‘ŒšŸ¼', - 'šŸ‘ŒšŸ»', - ], - }, - { - code: 'šŸ‘', - keywords: [ - '+1', - 'body', - 'hand', - 'thumb', - 'thumbs up', - 'up', - ], - types: [ - 'šŸ‘šŸæ', - 'šŸ‘šŸ¾', - 'šŸ‘šŸ½', - 'šŸ‘šŸ¼', - 'šŸ‘šŸ»', - ], - }, - { - code: 'šŸ‘Ž', - keywords: [ - '-1', - 'body', - 'down', - 'hand', - 'thumb', - 'thumbs down', - ], - types: [ - 'šŸ‘ŽšŸæ', - 'šŸ‘ŽšŸ¾', - 'šŸ‘ŽšŸ½', - 'šŸ‘ŽšŸ¼', - 'šŸ‘ŽšŸ»', - ], - }, - { - code: 'āœŠ', - keywords: [ - 'body', - 'clenched', - 'fist', - 'hand', - 'punch', - ], - types: [ - 'āœŠšŸæ', - 'āœŠšŸ¾', - 'āœŠšŸ½', - 'āœŠšŸ¼', - 'āœŠšŸ»', - ], - }, - { - code: 'šŸ‘Š', - keywords: [ - 'body', - 'clenched', - 'fist', - 'hand', - 'punch', - ], - types: [ - 'šŸ‘ŠšŸæ', - 'šŸ‘ŠšŸ¾', - 'šŸ‘ŠšŸ½', - 'šŸ‘ŠšŸ¼', - 'šŸ‘ŠšŸ»', - ], - }, - { - code: 'šŸ¤›', - keywords: [ - 'fist', - 'leftwards', - ], - types: [ - 'šŸ¤›šŸæ', - 'šŸ¤›šŸ¾', - 'šŸ¤›šŸ½', - 'šŸ¤›šŸ¼', - 'šŸ¤›šŸ»', - ], - }, - { - code: 'šŸ¤œ', - keywords: [ - 'fist', - 'rightwards', - ], - types: [ - 'šŸ¤œšŸæ', - 'šŸ¤œšŸ¾', - 'šŸ¤œšŸ½', - 'šŸ¤œšŸ¼', - 'šŸ¤œšŸ»', - ], - }, - { - code: 'šŸ¤š', - keywords: [ - 'backhand', - 'raised', - ], - types: [ - 'šŸ¤ššŸæ', - 'šŸ¤ššŸ¾', - 'šŸ¤ššŸ½', - 'šŸ¤ššŸ¼', - 'šŸ¤ššŸ»', - ], - }, - { - code: 'šŸ‘‹', - keywords: [ - 'body', - 'hand', - 'wave', - 'waving', - ], - types: [ - 'šŸ‘‹šŸæ', - 'šŸ‘‹šŸ¾', - 'šŸ‘‹šŸ½', - 'šŸ‘‹šŸ¼', - 'šŸ‘‹šŸ»', - ], - }, - { - code: 'šŸ‘', - keywords: [ - 'body', - 'clap', - 'hand', - ], - types: [ - 'šŸ‘šŸæ', - 'šŸ‘šŸ¾', - 'šŸ‘šŸ½', - 'šŸ‘šŸ¼', - 'šŸ‘šŸ»', - ], - }, - { - code: 'āœ', - keywords: [ - 'body', - 'hand', - 'write', - ], - types: [ - 'āœšŸæ', - 'āœšŸ¾', - 'āœšŸ½', - 'āœšŸ¼', - 'āœšŸ»', - ], - }, - { - code: 'šŸ‘', - keywords: [ - 'body', - 'hand', - 'open', - ], - types: [ - 'šŸ‘šŸæ', - 'šŸ‘šŸ¾', - 'šŸ‘šŸ½', - 'šŸ‘šŸ¼', - 'šŸ‘šŸ»', - ], - }, - { - code: 'šŸ™Œ', - keywords: [ - 'body', - 'celebration', - 'gesture', - 'hand', - 'hooray', - 'raised', - ], - types: [ - 'šŸ™ŒšŸæ', - 'šŸ™ŒšŸ¾', - 'šŸ™ŒšŸ½', - 'šŸ™ŒšŸ¼', - 'šŸ™ŒšŸ»', - ], - }, - { - code: 'šŸ™', - keywords: [ - 'ask', - 'body', - 'bow', - 'folded', - 'gesture', - 'hand', - 'please', - 'pray', - 'thanks', - ], - types: [ - 'šŸ™šŸæ', - 'šŸ™šŸ¾', - 'šŸ™šŸ½', - 'šŸ™šŸ¼', - 'šŸ™šŸ»', - ], - }, - { - code: 'šŸ¤', - keywords: [ - 'agreement', - 'hand', - 'handshake', - 'meeting', - 'shake', - ], - types: [ - 'šŸ¤šŸæ', - 'šŸ¤šŸ¾', - 'šŸ¤šŸ½', - 'šŸ¤šŸ¼', - 'šŸ¤šŸ»', - ], - }, - { - code: 'šŸ’…', - keywords: [ - 'body', - 'care', - 'cosmetics', - 'manicure', - 'nail', - 'polish', - ], - types: [ - 'šŸ’…šŸæ', - 'šŸ’…šŸ¾', - 'šŸ’…šŸ½', - 'šŸ’…šŸ¼', - 'šŸ’…šŸ»', - ], - }, - { - code: 'šŸ‘‚', - keywords: [ - 'body', - 'ear', - ], - types: [ - 'šŸ‘‚šŸæ', - 'šŸ‘‚šŸ¾', - 'šŸ‘‚šŸ½', - 'šŸ‘‚šŸ¼', - 'šŸ‘‚šŸ»', - ], - }, - { - code: 'šŸ‘ƒ', - keywords: [ - 'body', - 'nose', - ], - types: [ - 'šŸ‘ƒšŸæ', - 'šŸ‘ƒšŸ¾', - 'šŸ‘ƒšŸ½', - 'šŸ‘ƒšŸ¼', - 'šŸ‘ƒšŸ»', - ], - }, - { - code: 'šŸ‘£', - keywords: [ - 'body', - 'clothing', - 'footprint', - 'print', - ], - }, - { - code: 'šŸ‘€', - keywords: [ - 'body', - 'eye', - 'face', - ], - }, - { - code: 'šŸ‘', - keywords: [ - 'body', - 'eye', - ], - }, - { - code: 'šŸ‘ā€šŸ—Ø', - keywords: [ - 'bubble', - 'eye', - 'speech', - 'witness', - ], - }, - { - code: 'šŸ‘…', - keywords: [ - 'body', - 'tongue', - ], - }, - { - code: 'šŸ‘„', - keywords: [ - 'body', - 'lips', - 'mouth', - ], - }, - { - code: 'šŸ’‹', - keywords: [ - 'heart', - 'kiss', - 'lips', - 'mark', - 'romance', - ], - }, - { - code: 'šŸ’˜', - keywords: [ - 'arrow', - 'cupid', - 'heart', - 'romance', - ], - }, - { - code: 'ā¤', - keywords: [ - 'heart', - ], - }, - { - code: 'šŸ’“', - keywords: [ - 'beating', - 'heart', - 'heartbeat', - 'pulsating', - ], - }, - { - code: 'šŸ’”', - keywords: [ - 'break', - 'broken', - 'heart', - ], - }, - { - code: 'šŸ’•', - keywords: [ - 'heart', - 'love', - ], - }, - { - code: 'šŸ’–', - keywords: [ - 'excited', - 'heart', - 'sparkle', - ], - }, - { - code: 'šŸ’—', - keywords: [ - 'excited', - 'growing', - 'heart', - 'heartpulse', - 'nervous', - ], - }, - { - code: 'šŸ’™', - keywords: [ - 'blue', - 'heart', - ], - }, - { - code: 'šŸ’š', - keywords: [ - 'green', - 'heart', - ], - }, - { - code: 'šŸ’›', - keywords: [ - 'heart', - 'yellow', - ], - }, - { - code: 'šŸ’œ', - keywords: [ - 'heart', - 'purple', - ], - }, - { - code: 'šŸ–¤', - keywords: [ - 'black', - 'evil', - 'heart', - 'wicked', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'heart', - 'ribbon', - 'valentine', - ], - }, - { - code: 'šŸ’ž', - keywords: [ - 'heart', - 'revolving', - ], - }, - { - code: 'šŸ’Ÿ', - keywords: [ - 'heart', - ], - }, - { - code: 'ā£', - keywords: [ - 'exclamation', - 'heart', - 'mark', - 'punctuation', - ], - }, - { - code: 'šŸ’Œ', - keywords: [ - 'heart', - 'letter', - 'love', - 'mail', - 'romance', - ], - }, - { - code: 'šŸ’¤', - keywords: [ - 'comic', - 'sleep', - 'zzz', - ], - }, - { - code: 'šŸ’¢', - keywords: [ - 'angry', - 'comic', - 'mad', - ], - }, - { - code: 'šŸ’£', - keywords: [ - 'bomb', - 'comic', - ], - }, - { - code: 'šŸ’„', - keywords: [ - 'boom', - 'collision', - 'comic', - ], - }, - { - code: 'šŸ’¦', - keywords: [ - 'comic', - 'splashing', - 'sweat', - ], - }, - { - code: 'šŸ’Ø', - keywords: [ - 'comic', - 'dash', - 'running', - ], - }, - { - code: 'šŸ’«', - keywords: [ - 'comic', - 'dizzy', - 'star', - ], - }, - { - code: 'šŸ’¬', - keywords: [ - 'balloon', - 'bubble', - 'comic', - 'dialog', - 'speech', - ], - }, - { - code: 'šŸ—Ø', - keywords: [ - 'dialog', - 'speech', - ], - }, - { - code: 'šŸ—Æ', - keywords: [ - 'angry', - 'balloon', - 'bubble', - 'mad', - ], - }, - { - code: 'šŸ’­', - keywords: [ - 'balloon', - 'bubble', - 'comic', - 'thought', - ], - }, - { - code: 'šŸ•³', - keywords: [ - 'hole', - ], - }, - { - code: 'šŸ‘“', - keywords: [ - 'clothing', - 'eye', - 'eyeglasses', - 'eyewear', - 'glasses', - ], - }, - { - code: 'šŸ•¶', - keywords: [ - 'dark', - 'eye', - 'eyewear', - 'glasses', - 'sunglasses', - ], - }, - { - code: 'šŸ‘”', - keywords: [ - 'clothing', - 'necktie', - ], - }, - { - code: 'šŸ‘•', - keywords: [ - 'clothing', - 'shirt', - 'tshirt', - ], - }, - { - code: 'šŸ‘–', - keywords: [ - 'clothing', - 'jeans', - 'pants', - 'trousers', - ], - }, - { - code: 'šŸ‘—', - keywords: [ - 'clothing', - 'dress', - ], - }, - { - code: 'šŸ‘˜', - keywords: [ - 'clothing', - 'kimono', - ], - }, - { - code: 'šŸ‘™', - keywords: [ - 'bikini', - 'clothing', - 'swim', - ], - }, - { - code: 'šŸ‘š', - keywords: [ - 'clothing', - 'woman', - ], - }, - { - code: 'šŸ‘›', - keywords: [ - 'clothing', - 'coin', - 'purse', - ], - }, - { - code: 'šŸ‘œ', - keywords: [ - 'bag', - 'clothing', - 'handbag', - ], - }, - { - code: 'šŸ‘', - keywords: [ - 'bag', - 'clothing', - 'pouch', - ], - }, - { - code: 'šŸ›', - keywords: [ - 'bag', - 'hotel', - 'shopping', - ], - }, - { - code: 'šŸŽ’', - keywords: [ - 'activity', - 'bag', - 'satchel', - 'school', - ], - }, - { - code: 'šŸ‘ž', - keywords: [ - 'clothing', - 'man', - 'shoe', - ], - }, - { - code: 'šŸ‘Ÿ', - keywords: [ - 'athletic', - 'clothing', - 'shoe', - 'sneaker', - ], - }, - { - code: 'šŸ‘ ', - keywords: [ - 'clothing', - 'heel', - 'shoe', - 'woman', - ], - }, - { - code: 'šŸ‘”', - keywords: [ - 'clothing', - 'sandal', - 'shoe', - 'woman', - ], - }, - { - code: 'šŸ‘¢', - keywords: [ - 'boot', - 'clothing', - 'shoe', - 'woman', - ], - }, - { - code: 'šŸ‘‘', - keywords: [ - 'clothing', - 'crown', - 'king', - 'queen', - ], - }, - { - code: 'šŸ‘’', - keywords: [ - 'clothing', - 'hat', - 'woman', - ], - }, - { - code: 'šŸŽ©', - keywords: [ - 'activity', - 'clothing', - 'entertainment', - 'hat', - 'top', - 'tophat', - ], - }, - { - code: 'šŸŽ“', - keywords: [ - 'activity', - 'cap', - 'celebration', - 'clothing', - 'graduation', - 'hat', - ], - }, - { - code: 'ā›‘', - keywords: [ - 'aid', - 'cross', - 'face', - 'hat', - 'helmet', - ], - }, - { - code: 'šŸ“æ', - keywords: [ - 'beads', - 'clothing', - 'necklace', - 'prayer', - 'religion', - ], - }, - { - code: 'šŸ’„', - keywords: [ - 'cosmetics', - 'lipstick', - 'makeup', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'diamond', - 'ring', - 'romance', - ], - }, - { - code: 'šŸ’Ž', - keywords: [ - 'diamond', - 'gem', - 'jewel', - 'romance', - ], - }, - { - code: 'Animals & Nature', - header: true, - }, - { - code: 'šŸµ', - keywords: [ - 'face', - 'monkey', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'monkey', - ], - }, - { - code: 'šŸ¦', - keywords: [ - 'gorilla', - ], - }, - { - code: 'šŸ¶', - keywords: [ - 'dog', - 'face', - 'pet', - ], - }, - { - code: 'šŸ•', - keywords: [ - 'dog', - 'pet', - ], - }, - { - code: 'šŸ©', - keywords: [ - 'dog', - 'poodle', - ], - }, - { - code: 'šŸŗ', - keywords: [ - 'face', - 'wolf', - ], - }, - { - code: 'šŸ¦Š', - keywords: [ - 'face', - 'fox', - ], - }, - { - code: 'šŸ±', - keywords: [ - 'cat', - 'face', - 'pet', - ], - }, - { - code: 'šŸˆ', - keywords: [ - 'cat', - 'pet', - ], - }, - { - code: 'šŸ¦', - keywords: [ - 'face', - 'leo', - 'lion', - 'zodiac', - ], - }, - { - code: 'šŸÆ', - keywords: [ - 'face', - 'tiger', - ], - }, - { - code: 'šŸ…', - keywords: [ - 'tiger', - ], - }, - { - code: 'šŸ†', - keywords: [ - 'leopard', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'face', - 'horse', - ], - }, - { - code: 'šŸŽ', - keywords: [ - 'horse', - 'racehorse', - 'racing', - ], - }, - { - code: 'šŸ¦Œ', - keywords: [ - 'deer', - ], - }, - { - code: 'šŸ¦„', - keywords: [ - 'face', - 'unicorn', - ], - }, - { - code: 'šŸ®', - keywords: [ - 'cow', - 'face', - ], - }, - { - code: 'šŸ‚', - keywords: [ - 'bull', - 'ox', - 'taurus', - 'zodiac', - ], - }, - { - code: 'šŸƒ', - keywords: [ - 'buffalo', - 'water', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'cow', - ], - }, - { - code: 'šŸ·', - keywords: [ - 'face', - 'pig', - ], - }, - { - code: 'šŸ–', - keywords: [ - 'pig', - 'sow', - ], - }, - { - code: 'šŸ—', - keywords: [ - 'boar', - 'pig', - ], - }, - { - code: 'šŸ½', - keywords: [ - 'face', - 'nose', - 'pig', - ], - }, - { - code: 'šŸ', - keywords: [ - 'aries', - 'ram', - 'sheep', - 'zodiac', - ], - }, - { - code: 'šŸ‘', - keywords: [ - 'ewe', - 'sheep', - ], - }, - { - code: 'šŸ', - keywords: [ - 'capricorn', - 'goat', - 'zodiac', - ], - }, - { - code: 'šŸŖ', - keywords: [ - 'camel', - 'dromedary', - 'hump', - ], - }, - { - code: 'šŸ«', - keywords: [ - 'bactrian', - 'camel', - 'hump', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'elephant', - ], - }, - { - code: 'šŸ¦', - keywords: [ - 'rhinoceros', - ], - }, - { - code: 'šŸ­', - keywords: [ - 'face', - 'mouse', - ], - }, - { - code: 'šŸ', - keywords: [ - 'mouse', - ], - }, - { - code: 'šŸ€', - keywords: [ - 'rat', - ], - }, - { - code: 'šŸ¹', - keywords: [ - 'face', - 'hamster', - 'pet', - ], - }, - { - code: 'šŸ°', - keywords: [ - 'bunny', - 'face', - 'pet', - 'rabbit', - ], - }, - { - code: 'šŸ‡', - keywords: [ - 'bunny', - 'pet', - 'rabbit', - ], - }, - { - code: 'šŸæ', - keywords: [ - 'chipmunk', - ], - }, - { - code: 'šŸ¦‡', - keywords: [ - 'bat', - 'vampire', - ], - }, - { - code: 'šŸ»', - keywords: [ - 'bear', - 'face', - ], - }, - { - code: 'šŸØ', - keywords: [ - 'bear', - 'koala', - ], - }, - { - code: 'šŸ¼', - keywords: [ - 'face', - 'panda', - ], - }, - { - code: 'šŸ¾', - keywords: [ - 'feet', - 'paw', - 'print', - ], - }, - { - code: 'šŸ¦ƒ', - keywords: [ - 'turkey', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'chicken', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'rooster', - ], - }, - { - code: 'šŸ£', - keywords: [ - 'baby', - 'chick', - 'hatching', - ], - }, - { - code: 'šŸ¤', - keywords: [ - 'baby', - 'chick', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'baby', - 'chick', - ], - }, - { - code: 'šŸ¦', - keywords: [ - 'bird', - ], - }, - { - code: 'šŸ§', - keywords: [ - 'penguin', - ], - }, - { - code: 'šŸ•Š', - keywords: [ - 'bird', - 'dove', - 'fly', - 'peace', - ], - }, - { - code: 'šŸ¦…', - keywords: [ - 'bird', - 'eagle', - ], - }, - { - code: 'šŸ¦†', - keywords: [ - 'bird', - 'duck', - ], - }, - { - code: 'šŸ¦‰', - keywords: [ - 'bird', - 'owl', - 'wise', - ], - }, - { - code: 'šŸø', - keywords: [ - 'face', - 'frog', - ], - }, - { - code: 'šŸŠ', - keywords: [ - 'crocodile', - ], - }, - { - code: 'šŸ¢', - keywords: [ - 'turtle', - ], - }, - { - code: 'šŸ¦Ž', - keywords: [ - 'lizard', - 'reptile', - ], - }, - { - code: 'šŸ', - keywords: [ - 'bearer', - 'ophiuchus', - 'serpent', - 'snake', - 'zodiac', - ], - }, - { - code: 'šŸ²', - keywords: [ - 'dragon', - 'face', - 'fairy tale', - ], - }, - { - code: 'šŸ‰', - keywords: [ - 'dragon', - 'fairy tale', - ], - }, - { - code: 'šŸ³', - keywords: [ - 'face', - 'spouting', - 'whale', - ], - }, - { - code: 'šŸ‹', - keywords: [ - 'whale', - ], - }, - { - code: 'šŸ¬', - keywords: [ - 'dolphin', - 'flipper', - ], - }, - { - code: 'šŸŸ', - keywords: [ - 'fish', - 'pisces', - 'zodiac', - ], - }, - { - code: 'šŸ ', - keywords: [ - 'fish', - 'tropical', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'blowfish', - 'fish', - ], - }, - { - code: 'šŸ¦ˆ', - keywords: [ - 'fish', - 'shark', - ], - }, - { - code: 'šŸ™', - keywords: [ - 'octopus', - ], - }, - { - code: 'šŸš', - keywords: [ - 'shell', - 'spiral', - ], - }, - { - code: 'šŸ¦€', - keywords: [ - 'cancer', - 'crab', - 'zodiac', - ], - }, - { - code: 'šŸ¦', - keywords: [ - 'shellfish', - 'shrimp', - 'small', - ], - }, - { - code: 'šŸ¦‘', - keywords: [ - 'molusc', - 'squid', - ], - }, - { - code: 'šŸ¦‹', - keywords: [ - 'butterfly', - 'insect', - 'pretty', - ], - }, - { - code: 'šŸŒ', - keywords: [ - 'snail', - ], - }, - { - code: 'šŸ›', - keywords: [ - 'bug', - 'insect', - ], - }, - { - code: 'šŸœ', - keywords: [ - 'ant', - 'insect', - ], - }, - { - code: 'šŸ', - keywords: [ - 'bee', - 'honeybee', - 'insect', - ], - }, - { - code: 'šŸž', - keywords: [ - 'beetle', - 'insect', - 'lady beetle', - 'ladybird', - 'ladybug', - ], - }, - { - code: 'šŸ•·', - keywords: [ - 'insect', - 'spider', - ], - }, - { - code: 'šŸ•ø', - keywords: [ - 'spider', - 'web', - ], - }, - { - code: 'šŸ¦‚', - keywords: [ - 'scorpio', - 'scorpion', - 'scorpius', - 'zodiac', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'bouquet', - 'flower', - 'plant', - 'romance', - ], - }, - { - code: 'šŸŒø', - keywords: [ - 'blossom', - 'cherry', - 'flower', - 'plant', - ], - }, - { - code: 'šŸ’®', - keywords: [ - 'flower', - ], - }, - { - code: 'šŸµ', - keywords: [ - 'plant', - 'rosette', - ], - }, - { - code: 'šŸŒ¹', - keywords: [ - 'flower', - 'plant', - 'rose', - ], - }, - { - code: 'šŸ„€', - keywords: [ - 'flower', - 'wilted', - ], - }, - { - code: 'šŸŒŗ', - keywords: [ - 'flower', - 'hibiscus', - 'plant', - ], - }, - { - code: 'šŸŒ»', - keywords: [ - 'flower', - 'plant', - 'sun', - 'sunflower', - ], - }, - { - code: 'šŸŒ¼', - keywords: [ - 'blossom', - 'flower', - 'plant', - ], - }, - { - code: 'šŸŒ·', - keywords: [ - 'flower', - 'plant', - 'tulip', - ], - }, - { - code: 'šŸŒ±', - keywords: [ - 'plant', - 'seedling', - 'young', - ], - }, - { - code: 'šŸŒ²', - keywords: [ - 'evergreen', - 'plant', - 'tree', - ], - }, - { - code: 'šŸŒ³', - keywords: [ - 'deciduous', - 'plant', - 'shedding', - 'tree', - ], - }, - { - code: 'šŸŒ“', - keywords: [ - 'palm', - 'plant', - 'tree', - ], - }, - { - code: 'šŸŒµ', - keywords: [ - 'cactus', - 'plant', - ], - }, - { - code: 'šŸŒ¾', - keywords: [ - 'ear', - 'plant', - 'rice', - ], - }, - { - code: 'šŸŒæ', - keywords: [ - 'herb', - 'leaf', - 'plant', - ], - }, - { - code: 'ā˜˜', - keywords: [ - 'plant', - 'shamrock', - ], - }, - { - code: 'šŸ€', - keywords: [ - '4', - 'clover', - 'four', - 'leaf', - 'plant', - ], - }, - { - code: 'šŸ', - keywords: [ - 'falling', - 'leaf', - 'maple', - 'plant', - ], - }, - { - code: 'šŸ‚', - keywords: [ - 'falling', - 'leaf', - 'plant', - ], - }, - { - code: 'šŸƒ', - keywords: [ - 'blow', - 'flutter', - 'leaf', - 'plant', - 'wind', - ], - }, - { - code: 'šŸ‡', - keywords: [ - 'fruit', - 'grape', - 'plant', - ], - }, - { - code: 'šŸˆ', - keywords: [ - 'fruit', - 'melon', - 'plant', - ], - }, - { - code: 'šŸ‰', - keywords: [ - 'fruit', - 'plant', - 'watermelon', - ], - }, - { - code: 'šŸŠ', - keywords: [ - 'fruit', - 'orange', - 'plant', - 'tangerine', - ], - }, - { - code: 'šŸ‹', - keywords: [ - 'citrus', - 'fruit', - 'lemon', - 'plant', - ], - }, - { - code: 'šŸŒ', - keywords: [ - 'banana', - 'fruit', - 'plant', - ], - }, - { - code: 'šŸ', - keywords: [ - 'fruit', - 'pineapple', - 'plant', - ], - }, - { - code: 'šŸŽ', - keywords: [ - 'apple', - 'fruit', - 'plant', - 'red', - ], - }, - { - code: 'šŸ', - keywords: [ - 'apple', - 'fruit', - 'green', - 'plant', - ], - }, - { - code: 'šŸ', - keywords: [ - 'fruit', - 'pear', - 'plant', - ], - }, - { - code: 'šŸ‘', - keywords: [ - 'fruit', - 'peach', - 'plant', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'cherry', - 'fruit', - 'plant', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'berry', - 'fruit', - 'plant', - 'strawberry', - ], - }, - { - code: 'šŸ…', - keywords: [ - 'plant', - 'tomato', - 'vegetable', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'fruit', - 'kiwi', - ], - }, - { - code: 'šŸ„‘', - keywords: [ - 'avocado', - 'fruit', - ], - }, - { - code: 'šŸ†', - keywords: [ - 'aubergine', - 'eggplant', - 'plant', - 'vegetable', - ], - }, - { - code: 'šŸ„”', - keywords: [ - 'potato', - 'vegetable', - ], - }, - { - code: 'šŸ„•', - keywords: [ - 'carrot', - 'vegetable', - ], - }, - { - code: 'šŸŒ½', - keywords: [ - 'corn', - 'ear', - 'maize', - 'maze', - 'plant', - ], - }, - { - code: 'šŸŒ¶', - keywords: [ - 'hot', - 'pepper', - 'plant', - ], - }, - { - code: 'šŸ„’', - keywords: [ - 'cucumber', - 'pickle', - 'vegetable', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'mushroom', - 'plant', - ], - }, - { - code: 'šŸ„œ', - keywords: [ - 'nut', - 'peanut', - 'vegetable', - ], - }, - { - code: 'šŸŒ°', - keywords: [ - 'chestnut', - 'plant', - ], - }, - { - code: 'šŸž', - keywords: [ - 'bread', - 'loaf', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'bread', - 'crescent roll', - 'croissant', - 'french', - ], - }, - { - code: 'šŸ„–', - keywords: [ - 'baguette', - 'bread', - 'french', - ], - }, - { - code: 'šŸ„ž', - keywords: [ - 'crĆŖpe', - 'hotcake', - 'pancake', - ], - }, - { - code: 'šŸ§€', - keywords: [ - 'cheese', - ], - }, - { - code: 'šŸ–', - keywords: [ - 'bone', - 'meat', - ], - }, - { - code: 'šŸ—', - keywords: [ - 'bone', - 'chicken', - 'leg', - 'poultry', - ], - }, - { - code: 'šŸ„“', - keywords: [ - 'bacon', - 'meat', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'burger', - 'hamburger', - ], - }, - { - code: 'šŸŸ', - keywords: [ - 'french', - 'fries', - ], - }, - { - code: 'šŸ•', - keywords: [ - 'cheese', - 'pizza', - 'slice', - ], - }, - { - code: 'šŸŒ­', - keywords: [ - 'frankfurter', - 'hot dog', - 'hotdog', - 'sausage', - ], - }, - { - code: 'šŸŒ®', - keywords: [ - 'mexican', - 'taco', - ], - }, - { - code: 'šŸŒÆ', - keywords: [ - 'burrito', - 'mexican', - ], - }, - { - code: 'šŸ„™', - keywords: [ - 'falafel', - 'flatbread', - 'gyro', - 'kebab', - 'stuffed', - ], - }, - { - code: 'šŸ„š', - keywords: [ - 'egg', - ], - }, - { - code: 'šŸ³', - keywords: [ - 'cooking', - 'egg', - 'frying', - 'pan', - ], - }, - { - code: 'šŸ„˜', - keywords: [ - 'casserole', - 'paella', - 'pan', - 'shallow', - ], - }, - { - code: 'šŸ²', - keywords: [ - 'pot', - 'stew', - ], - }, - { - code: 'šŸ„—', - keywords: [ - 'green', - 'salad', - ], - }, - { - code: 'šŸæ', - keywords: [ - 'popcorn', - ], - }, - { - code: 'šŸ±', - keywords: [ - 'bento', - 'box', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'cracker', - 'rice', - ], - }, - { - code: 'šŸ™', - keywords: [ - 'ball', - 'japanese', - 'rice', - ], - }, - { - code: 'šŸš', - keywords: [ - 'cooked', - 'rice', - ], - }, - { - code: 'šŸ›', - keywords: [ - 'curry', - 'rice', - ], - }, - { - code: 'šŸœ', - keywords: [ - 'bowl', - 'noodle', - 'ramen', - 'steaming', - ], - }, - { - code: 'šŸ', - keywords: [ - 'pasta', - 'spaghetti', - ], - }, - { - code: 'šŸ ', - keywords: [ - 'potato', - 'roasted', - 'sweet', - ], - }, - { - code: 'šŸ¢', - keywords: [ - 'kebab', - 'oden', - 'seafood', - 'skewer', - 'stick', - ], - }, - { - code: 'šŸ£', - keywords: [ - 'sushi', - ], - }, - { - code: 'šŸ¤', - keywords: [ - 'fried', - 'prawn', - 'shrimp', - 'tempura', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'cake', - 'fish', - 'pastry', - 'swirl', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'dango', - 'dessert', - 'japanese', - 'skewer', - 'stick', - 'sweet', - ], - }, - { - code: 'šŸ¦', - keywords: [ - 'cream', - 'dessert', - 'ice', - 'icecream', - 'soft', - 'sweet', - ], - }, - { - code: 'šŸ§', - keywords: [ - 'dessert', - 'ice', - 'shaved', - 'sweet', - ], - }, - { - code: 'šŸØ', - keywords: [ - 'cream', - 'dessert', - 'ice', - 'sweet', - ], - }, - { - code: 'šŸ©', - keywords: [ - 'dessert', - 'donut', - 'doughnut', - 'sweet', - ], - }, - { - code: 'šŸŖ', - keywords: [ - 'cookie', - 'dessert', - 'sweet', - ], - }, - { - code: 'šŸŽ‚', - keywords: [ - 'birthday', - 'cake', - 'celebration', - 'dessert', - 'pastry', - 'sweet', - ], - }, - { - code: 'šŸ°', - keywords: [ - 'cake', - 'dessert', - 'pastry', - 'shortcake', - 'slice', - 'sweet', - ], - }, - { - code: 'šŸ«', - keywords: [ - 'bar', - 'chocolate', - 'dessert', - 'sweet', - ], - }, - { - code: 'šŸ¬', - keywords: [ - 'candy', - 'dessert', - 'sweet', - ], - }, - { - code: 'šŸ­', - keywords: [ - 'candy', - 'dessert', - 'lollipop', - 'sweet', - ], - }, - { - code: 'šŸ®', - keywords: [ - 'custard', - 'dessert', - 'pudding', - 'sweet', - ], - }, - { - code: 'šŸÆ', - keywords: [ - 'honey', - 'honeypot', - 'pot', - 'sweet', - ], - }, - { - code: 'šŸ¼', - keywords: [ - 'baby', - 'bottle', - 'drink', - 'milk', - ], - }, - { - code: 'šŸ„›', - keywords: [ - 'drink', - 'glass', - 'milk', - ], - }, - { - code: 'ā˜•', - keywords: [ - 'beverage', - 'coffee', - 'drink', - 'hot', - 'steaming', - 'tea', - ], - }, - { - code: 'šŸµ', - keywords: [ - 'beverage', - 'cup', - 'drink', - 'tea', - 'teacup', - ], - }, - { - code: 'šŸ¶', - keywords: [ - 'bar', - 'beverage', - 'bottle', - 'cup', - 'drink', - 'sake', - ], - }, - { - code: 'šŸ¾', - keywords: [ - 'bar', - 'bottle', - 'cork', - 'drink', - 'popping', - ], - }, - { - code: 'šŸ·', - keywords: [ - 'bar', - 'beverage', - 'drink', - 'glass', - 'wine', - ], - }, - { - code: 'šŸø', - keywords: [ - 'bar', - 'cocktail', - 'drink', - 'glass', - ], - }, - { - code: 'šŸ¹', - keywords: [ - 'bar', - 'drink', - 'tropical', - ], - }, - { - code: 'šŸŗ', - keywords: [ - 'bar', - 'beer', - 'drink', - 'mug', - ], - }, - { - code: 'šŸ»', - keywords: [ - 'bar', - 'beer', - 'clink', - 'drink', - 'mug', - ], - }, - { - code: 'šŸ„‚', - keywords: [ - 'celebrate', - 'clink', - 'drink', - 'glass', - ], - }, - { - code: 'šŸ„ƒ', - keywords: [ - 'glass', - 'liquor', - 'shot', - 'tumbler', - 'whisky', - ], - }, - { - code: 'šŸ½', - keywords: [ - 'cooking', - 'fork', - 'knife', - 'plate', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'cooking', - 'fork', - 'knife', - ], - }, - { - code: 'šŸ„„', - keywords: [ - 'spoon', - 'tableware', - ], - }, - { - code: 'šŸ”Ŗ', - keywords: [ - 'cooking', - 'hocho', - 'knife', - 'tool', - 'weapon', - ], - }, - { - code: 'šŸŗ', - keywords: [ - 'amphora', - 'aquarius', - 'cooking', - 'drink', - 'jug', - 'tool', - 'weapon', - 'zodiac', - ], - }, - { - code: 'Travel & Places', - header: true, - }, - { - code: 'šŸŒ', - keywords: [ - 'africa', - 'earth', - 'europe', - 'globe', - 'world', - ], - }, - { - code: 'šŸŒŽ', - keywords: [ - 'americas', - 'earth', - 'globe', - 'world', - ], - }, - { - code: 'šŸŒ', - keywords: [ - 'asia', - 'australia', - 'earth', - 'globe', - 'world', - ], - }, - { - code: 'šŸŒ', - keywords: [ - 'earth', - 'globe', - 'meridians', - 'world', - ], - }, - { - code: 'šŸ—ŗ', - keywords: [ - 'map', - 'world', - ], - }, - { - code: 'šŸ—¾', - keywords: [ - 'japan', - 'map', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'cold', - 'mountain', - 'snow', - ], - }, - { - code: 'ā›°', - keywords: [ - 'mountain', - ], - }, - { - code: 'šŸŒ‹', - keywords: [ - 'eruption', - 'mountain', - 'volcano', - 'weather', - ], - }, - { - code: 'šŸ—»', - keywords: [ - 'fuji', - 'mountain', - ], - }, - { - code: 'šŸ•', - keywords: [ - 'camping', - ], - }, - { - code: 'šŸ–', - keywords: [ - 'beach', - 'umbrella', - ], - }, - { - code: 'šŸœ', - keywords: [ - 'desert', - ], - }, - { - code: 'šŸ', - keywords: [ - 'desert', - 'island', - ], - }, - { - code: 'šŸž', - keywords: [ - 'national park', - 'park', - ], - }, - { - code: 'šŸŸ', - keywords: [ - 'stadium', - ], - }, - { - code: 'šŸ›', - keywords: [ - 'building', - 'classical', - ], - }, - { - code: 'šŸ—', - keywords: [ - 'building', - 'construction', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'building', - 'house', - ], - }, - { - code: 'šŸ™', - keywords: [ - 'building', - 'city', - ], - }, - { - code: 'šŸš', - keywords: [ - 'building', - 'derelict', - 'house', - ], - }, - { - code: 'šŸ ', - keywords: [ - 'building', - 'home', - 'house', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'building', - 'garden', - 'home', - 'house', - ], - }, - { - code: 'šŸ¢', - keywords: [ - 'building', - ], - }, - { - code: 'šŸ£', - keywords: [ - 'building', - 'japanese', - 'post', - ], - }, - { - code: 'šŸ¤', - keywords: [ - 'building', - 'european', - 'post', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'building', - 'doctor', - 'hospital', - 'medicine', - ], - }, - { - code: 'šŸ¦', - keywords: [ - 'bank', - 'building', - ], - }, - { - code: 'šŸØ', - keywords: [ - 'building', - 'hotel', - ], - }, - { - code: 'šŸ©', - keywords: [ - 'building', - 'hotel', - 'love', - ], - }, - { - code: 'šŸŖ', - keywords: [ - 'building', - 'convenience', - 'store', - ], - }, - { - code: 'šŸ«', - keywords: [ - 'building', - 'school', - ], - }, - { - code: 'šŸ¬', - keywords: [ - 'building', - 'department', - 'store', - ], - }, - { - code: 'šŸ­', - keywords: [ - 'building', - 'factory', - ], - }, - { - code: 'šŸÆ', - keywords: [ - 'building', - 'castle', - 'japanese', - ], - }, - { - code: 'šŸ°', - keywords: [ - 'building', - 'castle', - 'european', - ], - }, - { - code: 'šŸ’’', - keywords: [ - 'activity', - 'chapel', - 'romance', - 'wedding', - ], - }, - { - code: 'šŸ—¼', - keywords: [ - 'tokyo', - 'tower', - ], - }, - { - code: 'šŸ—½', - keywords: [ - 'liberty', - 'statue', - ], - }, - { - code: 'ā›Ŗ', - keywords: [ - 'building', - 'christian', - 'church', - 'cross', - 'religion', - ], - }, - { - code: 'šŸ•Œ', - keywords: [ - 'islam', - 'mosque', - 'muslim', - 'religion', - ], - }, - { - code: 'šŸ•', - keywords: [ - 'jew', - 'jewish', - 'religion', - 'synagogue', - 'temple', - ], - }, - { - code: 'ā›©', - keywords: [ - 'religion', - 'shinto', - 'shrine', - ], - }, - { - code: 'šŸ•‹', - keywords: [ - 'islam', - 'kaaba', - 'muslim', - 'religion', - ], - }, - { - code: 'ā›²', - keywords: [ - 'fountain', - ], - }, - { - code: 'ā›ŗ', - keywords: [ - 'camping', - 'tent', - ], - }, - { - code: 'šŸŒ', - keywords: [ - 'fog', - 'weather', - ], - }, - { - code: 'šŸŒƒ', - keywords: [ - 'night', - 'star', - 'weather', - ], - }, - { - code: 'šŸŒ„', - keywords: [ - 'morning', - 'mountain', - 'sun', - 'sunrise', - 'weather', - ], - }, - { - code: 'šŸŒ…', - keywords: [ - 'morning', - 'sun', - 'sunrise', - 'weather', - ], - }, - { - code: 'šŸŒ†', - keywords: [ - 'building', - 'city', - 'dusk', - 'evening', - 'landscape', - 'sun', - 'sunset', - 'weather', - ], - }, - { - code: 'šŸŒ‡', - keywords: [ - 'building', - 'dusk', - 'sun', - 'sunset', - 'weather', - ], - }, - { - code: 'šŸŒ‰', - keywords: [ - 'bridge', - 'night', - 'weather', - ], - }, - { - code: 'ā™Ø', - keywords: [ - 'hot', - 'hotsprings', - 'springs', - 'steaming', - ], - }, - { - code: 'šŸŒŒ', - keywords: [ - 'milky way', - 'space', - 'weather', - ], - }, - { - code: 'šŸŽ ', - keywords: [ - 'activity', - 'carousel', - 'entertainment', - 'horse', - ], - }, - { - code: 'šŸŽ”', - keywords: [ - 'activity', - 'amusement park', - 'entertainment', - 'ferris', - 'wheel', - ], - }, - { - code: 'šŸŽ¢', - keywords: [ - 'activity', - 'amusement park', - 'coaster', - 'entertainment', - 'roller', - ], - }, - { - code: 'šŸ’ˆ', - keywords: [ - 'barber', - 'haircut', - 'pole', - ], - }, - { - code: 'šŸŽŖ', - keywords: [ - 'activity', - 'circus', - 'entertainment', - 'tent', - ], - }, - { - code: 'šŸŽ­', - keywords: [ - 'activity', - 'art', - 'entertainment', - 'mask', - 'performing', - 'theater', - 'theatre', - ], - }, - { - code: 'šŸ–¼', - keywords: [ - 'art', - 'frame', - 'museum', - 'painting', - 'picture', - ], - }, - { - code: 'šŸŽØ', - keywords: [ - 'activity', - 'art', - 'entertainment', - 'museum', - 'painting', - 'palette', - ], - }, - { - code: 'šŸŽ°', - keywords: [ - 'activity', - 'game', - 'slot', - ], - }, - { - code: 'šŸš‚', - keywords: [ - 'engine', - 'locomotive', - 'railway', - 'steam', - 'train', - 'vehicle', - ], - }, - { - code: 'šŸšƒ', - keywords: [ - 'car', - 'electric', - 'railway', - 'train', - 'tram', - 'trolleybus', - 'vehicle', - ], - }, - { - code: 'šŸš„', - keywords: [ - 'railway', - 'shinkansen', - 'speed', - 'train', - 'vehicle', - ], - }, - { - code: 'šŸš…', - keywords: [ - 'bullet', - 'railway', - 'shinkansen', - 'speed', - 'train', - 'vehicle', - ], - }, - { - code: 'šŸš†', - keywords: [ - 'railway', - 'train', - 'vehicle', - ], - }, - { - code: 'šŸš‡', - keywords: [ - 'metro', - 'subway', - 'vehicle', - ], - }, - { - code: 'šŸšˆ', - keywords: [ - 'railway', - 'vehicle', - ], - }, - { - code: 'šŸš‰', - keywords: [ - 'railway', - 'station', - 'train', - 'vehicle', - ], - }, - { - code: 'šŸšŠ', - keywords: [ - 'tram', - 'trolleybus', - 'vehicle', - ], - }, - { - code: 'šŸš', - keywords: [ - 'monorail', - 'vehicle', - ], - }, - { - code: 'šŸšž', - keywords: [ - 'car', - 'mountain', - 'railway', - 'vehicle', - ], - }, - { - code: 'šŸš‹', - keywords: [ - 'car', - 'tram', - 'trolleybus', - 'vehicle', - ], - }, - { - code: 'šŸšŒ', - keywords: [ - 'bus', - 'vehicle', - ], - }, - { - code: 'šŸš', - keywords: [ - 'bus', - 'oncoming', - 'vehicle', - ], - }, - { - code: 'šŸšŽ', - keywords: [ - 'bus', - 'tram', - 'trolley', - 'trolleybus', - 'vehicle', - ], - }, - { - code: 'šŸš', - keywords: [ - 'bus', - 'busstop', - 'stop', - ], - }, - { - code: 'šŸš', - keywords: [ - 'bus', - 'minibus', - 'vehicle', - ], - }, - { - code: 'šŸš‘', - keywords: [ - 'ambulance', - 'vehicle', - ], - }, - { - code: 'šŸš’', - keywords: [ - 'engine', - 'fire', - 'truck', - 'vehicle', - ], - }, - { - code: 'šŸš“', - keywords: [ - 'car', - 'patrol', - 'police', - 'vehicle', - ], - }, - { - code: 'šŸš”', - keywords: [ - 'car', - 'oncoming', - 'police', - 'vehicle', - ], - }, - { - code: 'šŸš•', - keywords: [ - 'taxi', - 'vehicle', - ], - }, - { - code: 'šŸš–', - keywords: [ - 'oncoming', - 'taxi', - 'vehicle', - ], - }, - { - code: 'šŸš—', - keywords: [ - 'automobile', - 'car', - 'vehicle', - ], - }, - { - code: 'šŸš˜', - keywords: [ - 'automobile', - 'car', - 'oncoming', - 'vehicle', - ], - }, - { - code: 'šŸš™', - keywords: [ - 'recreational', - 'rv', - 'vehicle', - ], - }, - { - code: 'šŸšš', - keywords: [ - 'delivery', - 'truck', - 'vehicle', - ], - }, - { - code: 'šŸš›', - keywords: [ - 'lorry', - 'semi', - 'truck', - 'vehicle', - ], - }, - { - code: 'šŸšœ', - keywords: [ - 'tractor', - 'vehicle', - ], - }, - { - code: 'šŸš²', - keywords: [ - 'bicycle', - 'bike', - 'vehicle', - ], - }, - { - code: 'ā›½', - keywords: [ - 'fuel', - 'fuelpump', - 'gas', - 'pump', - 'station', - ], - }, - { - code: 'šŸ›£', - keywords: [ - 'highway', - 'motorway', - 'road', - ], - }, - { - code: 'šŸ›¤', - keywords: [ - 'railway', - 'train', - ], - }, - { - code: 'šŸšØ', - keywords: [ - 'beacon', - 'car', - 'light', - 'police', - 'revolving', - 'vehicle', - ], - }, - { - code: 'šŸš„', - keywords: [ - 'light', - 'signal', - 'traffic', - ], - }, - { - code: 'šŸš¦', - keywords: [ - 'light', - 'signal', - 'traffic', - ], - }, - { - code: 'šŸš§', - keywords: [ - 'barrier', - 'construction', - ], - }, - { - code: 'šŸ›‘', - keywords: [ - 'octagonal', - 'stop', - ], - }, - { - code: 'šŸ›“', - keywords: [ - 'kick', - 'scooter', - ], - }, - { - code: 'šŸ›µ', - keywords: [ - 'motor', - 'scooter', - ], - }, - { - code: 'āš“', - keywords: [ - 'anchor', - 'ship', - 'tool', - ], - }, - { - code: 'ā›µ', - keywords: [ - 'boat', - 'resort', - 'sailboat', - 'sea', - 'vehicle', - 'yacht', - ], - }, - { - code: 'šŸš£', - keywords: [ - 'boat', - 'rowboat', - 'vehicle', - ], - types: [ - 'šŸš£šŸæ', - 'šŸš£šŸ¾', - 'šŸš£šŸ½', - 'šŸš£šŸ¼', - 'šŸš£šŸ»', - ], - }, - { - code: 'šŸ›¶', - keywords: [ - 'boat', - 'canoe', - ], - }, - { - code: 'šŸš¤', - keywords: [ - 'boat', - 'speedboat', - 'vehicle', - ], - }, - { - code: 'šŸ›³', - keywords: [ - 'passenger', - 'ship', - 'vehicle', - ], - }, - { - code: 'ā›“', - keywords: [ - 'boat', - 'ferry', - ], - }, - { - code: 'šŸ›„', - keywords: [ - 'boat', - 'motorboat', - 'vehicle', - ], - }, - { - code: 'šŸš¢', - keywords: [ - 'ship', - 'vehicle', - ], - }, - { - code: 'āœˆ', - keywords: [ - 'airplane', - 'vehicle', - ], - }, - { - code: 'šŸ›©', - keywords: [ - 'airplane', - 'vehicle', - ], - }, - { - code: 'šŸ›«', - keywords: [ - 'airplane', - 'check-in', - 'departure', - 'departures', - 'vehicle', - ], - }, - { - code: 'šŸ›¬', - keywords: [ - 'airplane', - 'arrivals', - 'arriving', - 'landing', - 'vehicle', - ], - }, - { - code: 'šŸ’ŗ', - keywords: [ - 'chair', - 'seat', - ], - }, - { - code: 'šŸš', - keywords: [ - 'helicopter', - 'vehicle', - ], - }, - { - code: 'šŸšŸ', - keywords: [ - 'railway', - 'suspension', - 'vehicle', - ], - }, - { - code: 'šŸš ', - keywords: [ - 'cable', - 'gondola', - 'mountain', - 'vehicle', - ], - }, - { - code: 'šŸš”', - keywords: [ - 'aerial', - 'cable', - 'car', - 'gondola', - 'ropeway', - 'tramway', - 'vehicle', - ], - }, - { - code: 'šŸš€', - keywords: [ - 'rocket', - 'space', - 'vehicle', - ], - }, - { - code: 'šŸ›°', - keywords: [ - 'satellite', - 'space', - 'vehicle', - ], - }, - { - code: 'šŸ›Ž', - keywords: [ - 'bell', - 'bellhop', - 'hotel', - ], - }, - { - code: 'šŸšŖ', - keywords: [ - 'door', - ], - }, - { - code: 'šŸ›Œ', - keywords: [ - 'hotel', - 'sleep', - ], - }, - { - code: 'šŸ›', - keywords: [ - 'bed', - 'hotel', - 'sleep', - ], - }, - { - code: 'šŸ›‹', - keywords: [ - 'couch', - 'hotel', - 'lamp', - ], - }, - { - code: 'šŸš½', - keywords: [ - 'toilet', - ], - }, - { - code: 'šŸšæ', - keywords: [ - 'shower', - 'water', - ], - }, - { - code: 'šŸ›€', - keywords: [ - 'bath', - 'bathtub', - ], - types: [ - 'šŸ›€šŸæ', - 'šŸ›€šŸ¾', - 'šŸ›€šŸ½', - 'šŸ›€šŸ¼', - 'šŸ›€šŸ»', - ], - }, - { - code: 'šŸ›', - keywords: [ - 'bath', - 'bathtub', - ], - }, - { - code: 'āŒ›', - keywords: [ - 'hourglass', - 'sand', - 'timer', - ], - }, - { - code: 'ā³', - keywords: [ - 'hourglass', - 'sand', - 'timer', - ], - }, - { - code: 'āŒš', - keywords: [ - 'clock', - 'watch', - ], - }, - { - code: 'ā°', - keywords: [ - 'alarm', - 'clock', - ], - }, - { - code: 'ā±', - keywords: [ - 'clock', - 'stopwatch', - ], - }, - { - code: 'ā²', - keywords: [ - 'clock', - 'timer', - ], - }, - { - code: 'šŸ•°', - keywords: [ - 'clock', - ], - }, - { - code: 'šŸ•›', - keywords: [ - '00', - '12', - '12:00', - 'clock', - 'oā€™clock', - 'twelve', - ], - }, - { - code: 'šŸ•§', - keywords: [ - '12', - '12:30', - '30', - 'clock', - 'thirty', - 'twelve', - ], - }, - { - code: 'šŸ•', - keywords: [ - '00', - '1', - '1:00', - 'clock', - 'oā€™clock', - 'one', - ], - }, - { - code: 'šŸ•œ', - keywords: [ - '1', - '1:30', - '30', - 'clock', - 'one', - 'thirty', - ], - }, - { - code: 'šŸ•‘', - keywords: [ - '00', - '2', - '2:00', - 'clock', - 'oā€™clock', - 'two', - ], - }, - { - code: 'šŸ•', - keywords: [ - '2', - '2:30', - '30', - 'clock', - 'thirty', - 'two', - ], - }, - { - code: 'šŸ•’', - keywords: [ - '00', - '3', - '3:00', - 'clock', - 'oā€™clock', - 'three', - ], - }, - { - code: 'šŸ•ž', - keywords: [ - '3', - '3:30', - '30', - 'clock', - 'thirty', - 'three', - ], - }, - { - code: 'šŸ•“', - keywords: [ - '00', - '4', - '4:00', - 'clock', - 'four', - 'oā€™clock', - ], - }, - { - code: 'šŸ•Ÿ', - keywords: [ - '30', - '4', - '4:30', - 'clock', - 'four', - 'thirty', - ], - }, - { - code: 'šŸ•”', - keywords: [ - '00', - '5', - '5:00', - 'clock', - 'five', - 'oā€™clock', - ], - }, - { - code: 'šŸ• ', - keywords: [ - '30', - '5', - '5:30', - 'clock', - 'five', - 'thirty', - ], - }, - { - code: 'šŸ••', - keywords: [ - '00', - '6', - '6:00', - 'clock', - 'oā€™clock', - 'six', - ], - }, - { - code: 'šŸ•”', - keywords: [ - '30', - '6', - '6:30', - 'clock', - 'six', - 'thirty', - ], - }, - { - code: 'šŸ•–', - keywords: [ - '00', - '7', - '7:00', - 'clock', - 'oā€™clock', - 'seven', - ], - }, - { - code: 'šŸ•¢', - keywords: [ - '30', - '7', - '7:30', - 'clock', - 'seven', - 'thirty', - ], - }, - { - code: 'šŸ•—', - keywords: [ - '00', - '8', - '8:00', - 'clock', - 'eight', - 'oā€™clock', - ], - }, - { - code: 'šŸ•£', - keywords: [ - '30', - '8', - '8:30', - 'clock', - 'eight', - 'thirty', - ], - }, - { - code: 'šŸ•˜', - keywords: [ - '00', - '9', - '9:00', - 'clock', - 'nine', - 'oā€™clock', - ], - }, - { - code: 'šŸ•¤', - keywords: [ - '30', - '9', - '9:30', - 'clock', - 'nine', - 'thirty', - ], - }, - { - code: 'šŸ•™', - keywords: [ - '00', - '10', - '10:00', - 'clock', - 'oā€™clock', - 'ten', - ], - }, - { - code: 'šŸ•„', - keywords: [ - '10', - '10:30', - '30', - 'clock', - 'ten', - 'thirty', - ], - }, - { - code: 'šŸ•š', - keywords: [ - '00', - '11', - '11:00', - 'clock', - 'eleven', - 'oā€™clock', - ], - }, - { - code: 'šŸ•¦', - keywords: [ - '11', - '11:30', - '30', - 'clock', - 'eleven', - 'thirty', - ], - }, - { - code: 'šŸŒ‘', - keywords: [ - 'dark', - 'moon', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒ’', - keywords: [ - 'crescent', - 'moon', - 'space', - 'waxing', - 'weather', - ], - }, - { - code: 'šŸŒ“', - keywords: [ - 'moon', - 'quarter', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒ”', - keywords: [ - 'gibbous', - 'moon', - 'space', - 'waxing', - 'weather', - ], - }, - { - code: 'šŸŒ•', - keywords: [ - 'full', - 'moon', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒ–', - keywords: [ - 'gibbous', - 'moon', - 'space', - 'waning', - 'weather', - ], - }, - { - code: 'šŸŒ—', - keywords: [ - 'moon', - 'quarter', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒ˜', - keywords: [ - 'crescent', - 'moon', - 'space', - 'waning', - 'weather', - ], - }, - { - code: 'šŸŒ™', - keywords: [ - 'crescent', - 'moon', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒš', - keywords: [ - 'face', - 'moon', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒ›', - keywords: [ - 'face', - 'moon', - 'quarter', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒœ', - keywords: [ - 'face', - 'moon', - 'quarter', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒ”', - keywords: [ - 'thermometer', - 'weather', - ], - }, - { - code: 'ā˜€', - keywords: [ - 'bright', - 'rays', - 'space', - 'sun', - 'sunny', - 'weather', - ], - }, - { - code: 'šŸŒ', - keywords: [ - 'bright', - 'face', - 'full', - 'moon', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒž', - keywords: [ - 'bright', - 'face', - 'space', - 'sun', - 'weather', - ], - }, - { - code: 'ā­', - keywords: [ - 'star', - ], - }, - { - code: 'šŸŒŸ', - keywords: [ - 'glittery', - 'glow', - 'shining', - 'sparkle', - 'star', - ], - }, - { - code: 'šŸŒ ', - keywords: [ - 'activity', - 'falling', - 'shooting', - 'space', - 'star', - ], - }, - { - code: 'ā˜', - keywords: [ - 'cloud', - 'weather', - ], - }, - { - code: 'ā›…', - keywords: [ - 'cloud', - 'sun', - 'weather', - ], - }, - { - code: 'ā›ˆ', - keywords: [ - 'cloud', - 'rain', - 'thunder', - 'weather', - ], - }, - { - code: 'šŸŒ¤', - keywords: [ - 'cloud', - 'sun', - 'weather', - ], - }, - { - code: 'šŸŒ„', - keywords: [ - 'cloud', - 'sun', - 'weather', - ], - }, - { - code: 'šŸŒ¦', - keywords: [ - 'cloud', - 'rain', - 'sun', - 'weather', - ], - }, - { - code: 'šŸŒ§', - keywords: [ - 'cloud', - 'rain', - 'weather', - ], - }, - { - code: 'šŸŒØ', - keywords: [ - 'cloud', - 'cold', - 'snow', - 'weather', - ], - }, - { - code: 'šŸŒ©', - keywords: [ - 'cloud', - 'lightning', - 'weather', - ], - }, - { - code: 'šŸŒŖ', - keywords: [ - 'cloud', - 'tornado', - 'weather', - 'whirlwind', - ], - }, - { - code: 'šŸŒ«', - keywords: [ - 'cloud', - 'fog', - 'weather', - ], - }, - { - code: 'šŸŒ¬', - keywords: [ - 'blow', - 'cloud', - 'face', - 'weather', - 'wind', - ], - }, - { - code: 'šŸŒ€', - keywords: [ - 'cyclone', - 'dizzy', - 'twister', - 'typhoon', - 'weather', - ], - }, - { - code: 'šŸŒˆ', - keywords: [ - 'rain', - 'rainbow', - 'weather', - ], - }, - { - code: 'šŸŒ‚', - keywords: [ - 'clothing', - 'rain', - 'umbrella', - 'weather', - ], - }, - { - code: 'ā˜‚', - keywords: [ - 'clothing', - 'rain', - 'umbrella', - 'weather', - ], - }, - { - code: 'ā˜”', - keywords: [ - 'clothing', - 'drop', - 'rain', - 'umbrella', - 'weather', - ], - }, - { - code: 'ā›±', - keywords: [ - 'rain', - 'sun', - 'umbrella', - 'weather', - ], - }, - { - code: 'āš”', - keywords: [ - 'danger', - 'electric', - 'electricity', - 'lightning', - 'voltage', - 'zap', - ], - }, - { - code: 'ā„', - keywords: [ - 'cold', - 'snow', - 'snowflake', - 'weather', - ], - }, - { - code: 'ā˜ƒ', - keywords: [ - 'cold', - 'snow', - 'snowman', - 'weather', - ], - }, - { - code: 'ā›„', - keywords: [ - 'cold', - 'snow', - 'snowman', - 'weather', - ], - }, - { - code: 'ā˜„', - keywords: [ - 'comet', - 'space', - ], - }, - { - code: 'šŸ”„', - keywords: [ - 'fire', - 'flame', - 'tool', - ], - }, - { - code: 'šŸ’§', - keywords: [ - 'cold', - 'comic', - 'drop', - 'sweat', - 'weather', - ], - }, - { - code: 'šŸŒŠ', - keywords: [ - 'ocean', - 'water', - 'wave', - 'weather', - ], - }, - { - code: 'Activities', - header: true, - }, - { - code: 'šŸŽƒ', - keywords: [ - 'activity', - 'celebration', - 'entertainment', - 'halloween', - 'jack', - 'lantern', - ], - }, - { - code: 'šŸŽ„', - keywords: [ - 'activity', - 'celebration', - 'christmas', - 'entertainment', - 'tree', - ], - }, - { - code: 'šŸŽ†', - keywords: [ - 'activity', - 'celebration', - 'entertainment', - 'fireworks', - ], - }, - { - code: 'šŸŽ‡', - keywords: [ - 'activity', - 'celebration', - 'entertainment', - 'fireworks', - 'sparkle', - ], - }, - { - code: 'āœØ', - keywords: [ - 'entertainment', - 'sparkle', - 'star', - ], - }, - { - code: 'šŸŽˆ', - keywords: [ - 'activity', - 'balloon', - 'celebration', - 'entertainment', - ], - }, - { - code: 'šŸŽ‰', - keywords: [ - 'activity', - 'celebration', - 'entertainment', - 'party', - 'popper', - 'tada', - ], - }, - { - code: 'šŸŽŠ', - keywords: [ - 'activity', - 'ball', - 'celebration', - 'confetti', - 'entertainment', - ], - }, - { - code: 'šŸŽ‹', - keywords: [ - 'activity', - 'banner', - 'celebration', - 'entertainment', - 'japanese', - 'tree', - ], - }, - { - code: 'šŸŽ', - keywords: [ - 'activity', - 'bamboo', - 'celebration', - 'japanese', - 'pine', - 'plant', - ], - }, - { - code: 'šŸŽŽ', - keywords: [ - 'activity', - 'celebration', - 'doll', - 'entertainment', - 'festival', - 'japanese', - ], - }, - { - code: 'šŸŽ', - keywords: [ - 'activity', - 'carp', - 'celebration', - 'entertainment', - 'flag', - 'streamer', - ], - }, - { - code: 'šŸŽ', - keywords: [ - 'activity', - 'bell', - 'celebration', - 'chime', - 'entertainment', - 'wind', - ], - }, - { - code: 'šŸŽ‘', - keywords: [ - 'activity', - 'celebration', - 'ceremony', - 'entertainment', - 'moon', - ], - }, - { - code: 'šŸŽ€', - keywords: [ - 'celebration', - 'ribbon', - ], - }, - { - code: 'šŸŽ', - keywords: [ - 'box', - 'celebration', - 'entertainment', - 'gift', - 'present', - 'wrapped', - ], - }, - { - code: 'šŸŽ—', - keywords: [ - 'celebration', - 'reminder', - 'ribbon', - ], - }, - { - code: 'šŸŽŸ', - keywords: [ - 'admission', - 'entertainment', - 'ticket', - ], - }, - { - code: 'šŸŽ«', - keywords: [ - 'activity', - 'admission', - 'entertainment', - 'ticket', - ], - }, - { - code: 'šŸŽ–', - keywords: [ - 'celebration', - 'medal', - 'military', - ], - }, - { - code: 'šŸ†', - keywords: [ - 'prize', - 'trophy', - ], - }, - { - code: 'šŸ…', - keywords: [ - 'medal', - ], - }, - { - code: 'šŸ„‡', - keywords: [ - 'first', - 'gold', - 'medal', - ], - }, - { - code: 'šŸ„ˆ', - keywords: [ - 'medal', - 'second', - 'silver', - ], - }, - { - code: 'šŸ„‰', - keywords: [ - 'bronze', - 'medal', - 'third', - ], - }, - { - code: 'āš½', - keywords: [ - 'ball', - 'soccer', - ], - }, - { - code: 'āš¾', - keywords: [ - 'ball', - 'baseball', - ], - }, - { - code: 'šŸ€', - keywords: [ - 'ball', - 'basketball', - 'hoop', - ], - }, - { - code: 'šŸ', - keywords: [ - 'ball', - 'game', - 'volleyball', - ], - }, - { - code: 'šŸˆ', - keywords: [ - 'american', - 'ball', - 'football', - ], - }, - { - code: 'šŸ‰', - keywords: [ - 'ball', - 'football', - 'rugby', - ], - }, - { - code: 'šŸŽ¾', - keywords: [ - 'ball', - 'racquet', - 'tennis', - ], - }, - { - code: 'šŸŽ±', - keywords: [ - '8', - '8 ball', - 'ball', - 'billiard', - 'eight', - 'game', - ], - }, - { - code: 'šŸŽ³', - keywords: [ - 'ball', - 'bowling', - 'game', - ], - }, - { - code: 'šŸ', - keywords: [ - 'ball', - 'bat', - 'cricket', - 'game', - ], - }, - { - code: 'šŸ‘', - keywords: [ - 'ball', - 'field', - 'game', - 'hockey', - 'stick', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'game', - 'hockey', - 'ice', - 'puck', - 'stick', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'ball', - 'bat', - 'game', - 'paddle', - 'table tennis', - ], - }, - { - code: 'šŸø', - keywords: [ - 'badminton', - 'birdie', - 'game', - 'racquet', - 'shuttlecock', - ], - }, - { - code: 'šŸ„Š', - keywords: [ - 'boxing', - 'glove', - ], - }, - { - code: 'šŸ„‹', - keywords: [ - 'judo', - 'karate', - 'martial arts', - 'taekwondo', - 'uniform', - ], - }, - { - code: 'ā›³', - keywords: [ - 'flag', - 'golf', - 'hole', - ], - }, - { - code: 'šŸŒ', - keywords: [ - 'ball', - 'golf', - ], - }, - { - code: 'ā›ø', - keywords: [ - 'ice', - 'skate', - ], - }, - { - code: 'šŸŽ£', - keywords: [ - 'entertainment', - 'fish', - 'pole', - ], - }, - { - code: 'šŸŽ½', - keywords: [ - 'running', - 'sash', - 'shirt', - ], - }, - { - code: 'šŸŽæ', - keywords: [ - 'ski', - 'snow', - ], - }, - { - code: 'ā›·', - keywords: [ - 'ski', - 'snow', - ], - }, - { - code: 'šŸ‚', - keywords: [ - 'ski', - 'snow', - 'snowboard', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'surfer', - 'surfing', - ], - types: [ - 'šŸ„šŸæ', - 'šŸ„šŸ¾', - 'šŸ„šŸ½', - 'šŸ„šŸ¼', - 'šŸ„šŸ»', - ], - }, - { - code: 'šŸ‡', - keywords: [ - 'horse', - 'jockey', - 'racehorse', - 'racing', - ], - }, - { - code: 'šŸŠ', - keywords: [ - 'swim', - 'swimmer', - ], - types: [ - 'šŸŠšŸæ', - 'šŸŠšŸ¾', - 'šŸŠšŸ½', - 'šŸŠšŸ¼', - 'šŸŠšŸ»', - ], - }, - { - code: 'ā›¹', - keywords: [ - 'ball', - ], - types: [ - 'ā›¹šŸæ', - 'ā›¹šŸ¾', - 'ā›¹šŸ½', - 'ā›¹šŸ¼', - 'ā›¹šŸ»', - ], - }, - { - code: 'šŸ‹', - keywords: [ - 'lifter', - 'weight', - ], - types: [ - 'šŸ‹šŸæ', - 'šŸ‹šŸ¾', - 'šŸ‹šŸ½', - 'šŸ‹šŸ¼', - 'šŸ‹šŸ»', - ], - }, - { - code: 'šŸš“', - keywords: [ - 'bicycle', - 'bicyclist', - 'bike', - 'cyclist', - ], - types: [ - 'šŸš“šŸæ', - 'šŸš“šŸ¾', - 'šŸš“šŸ½', - 'šŸš“šŸ¼', - 'šŸš“šŸ»', - ], - }, - { - code: 'šŸšµ', - keywords: [ - 'bicycle', - 'bicyclist', - 'bike', - 'cyclist', - 'mountain', - ], - types: [ - 'šŸšµšŸæ', - 'šŸšµšŸ¾', - 'šŸšµšŸ½', - 'šŸšµšŸ¼', - 'šŸšµšŸ»', - ], - }, - { - code: 'šŸŽ', - keywords: [ - 'car', - 'racing', - ], - }, - { - code: 'šŸ', - keywords: [ - 'motorcycle', - 'racing', - ], - }, - { - code: 'šŸ¤ø', - keywords: [ - 'cartwheel', - 'gymnastics', - ], - types: [ - 'šŸ¤øšŸæ', - 'šŸ¤øšŸ¾', - 'šŸ¤øšŸ½', - 'šŸ¤øšŸ¼', - 'šŸ¤øšŸ»', - ], - }, - { - code: 'šŸ¤¼', - keywords: [ - 'wrestle', - 'wrestler', - ], - types: [ - 'šŸ¤¼šŸæ', - 'šŸ¤¼šŸ¾', - 'šŸ¤¼šŸ½', - 'šŸ¤¼šŸ¼', - 'šŸ¤¼šŸ»', - ], - }, - { - code: 'šŸ¤½', - keywords: [ - 'polo', - 'water', - ], - types: [ - 'šŸ¤½šŸæ', - 'šŸ¤½šŸ¾', - 'šŸ¤½šŸ½', - 'šŸ¤½šŸ¼', - 'šŸ¤½šŸ»', - ], - }, - { - code: 'šŸ¤¾', - keywords: [ - 'ball', - 'handball', - ], - types: [ - 'šŸ¤¾šŸæ', - 'šŸ¤¾šŸ¾', - 'šŸ¤¾šŸ½', - 'šŸ¤¾šŸ¼', - 'šŸ¤¾šŸ»', - ], - }, - { - code: 'šŸ¤ŗ', - keywords: [ - 'fencer', - 'fencing', - 'sword', - ], - }, - { - code: 'šŸ„…', - keywords: [ - 'goal', - 'net', - ], - }, - { - code: 'šŸ¤¹', - keywords: [ - 'balance', - 'juggle', - 'multitask', - 'skill', - ], - types: [ - 'šŸ¤¹šŸæ', - 'šŸ¤¹šŸ¾', - 'šŸ¤¹šŸ½', - 'šŸ¤¹šŸ¼', - 'šŸ¤¹šŸ»', - ], - }, - { - code: 'šŸŽÆ', - keywords: [ - 'activity', - 'bull', - 'bullseye', - 'dart', - 'entertainment', - 'eye', - 'game', - 'hit', - 'target', - ], - }, - { - code: 'šŸŽ®', - keywords: [ - 'controller', - 'entertainment', - 'game', - 'video game', - ], - }, - { - code: 'šŸ•¹', - keywords: [ - 'entertainment', - 'game', - 'joystick', - 'video game', - ], - }, - { - code: 'šŸŽ²', - keywords: [ - 'dice', - 'die', - 'entertainment', - 'game', - ], - }, - { - code: 'ā™ ', - keywords: [ - 'card', - 'game', - 'spade', - 'suit', - ], - }, - { - code: 'ā™„', - keywords: [ - 'card', - 'game', - 'heart', - 'hearts', - 'suit', - ], - }, - { - code: 'ā™¦', - keywords: [ - 'card', - 'diamond', - 'diamonds', - 'game', - 'suit', - ], - }, - { - code: 'ā™£', - keywords: [ - 'card', - 'club', - 'clubs', - 'game', - 'suit', - ], - }, - { - code: 'šŸƒ', - keywords: [ - 'card', - 'entertainment', - 'game', - 'joker', - 'playing', - ], - }, - { - code: 'šŸ€„', - keywords: [ - 'game', - 'mahjong', - 'red', - ], - }, - { - code: 'šŸŽ“', - keywords: [ - 'activity', - 'card', - 'entertainment', - 'flower', - 'game', - 'japanese', - 'playing', - ], - }, - { - code: 'Objects', - header: true, - }, - { - code: 'šŸ”‡', - keywords: [ - 'mute', - 'quiet', - 'silent', - 'speaker', - 'volume', - ], - }, - { - code: 'šŸ”ˆ', - keywords: [ - 'speaker', - 'volume', - ], - }, - { - code: 'šŸ”‰', - keywords: [ - 'low', - 'speaker', - 'volume', - 'wave', - ], - }, - { - code: 'šŸ”Š', - keywords: [ - '3', - 'entertainment', - 'high', - 'loud', - 'speaker', - 'three', - 'volume', - ], - }, - { - code: 'šŸ“¢', - keywords: [ - 'communication', - 'loud', - 'loudspeaker', - 'public address', - ], - }, - { - code: 'šŸ“£', - keywords: [ - 'cheering', - 'communication', - 'megaphone', - ], - }, - { - code: 'šŸ“Æ', - keywords: [ - 'communication', - 'entertainment', - 'horn', - 'post', - 'postal', - ], - }, - { - code: 'šŸ””', - keywords: [ - 'bell', - ], - }, - { - code: 'šŸ”•', - keywords: [ - 'bell', - 'forbidden', - 'mute', - 'no', - 'not', - 'prohibited', - 'quiet', - 'silent', - ], - }, - { - code: 'šŸŽ¼', - keywords: [ - 'activity', - 'entertainment', - 'music', - 'score', - ], - }, - { - code: 'šŸŽµ', - keywords: [ - 'activity', - 'entertainment', - 'music', - 'note', - ], - }, - { - code: 'šŸŽ¶', - keywords: [ - 'activity', - 'entertainment', - 'music', - 'note', - 'notes', - ], - }, - { - code: 'šŸŽ™', - keywords: [ - 'mic', - 'microphone', - 'music', - 'studio', - ], - }, - { - code: 'šŸŽš', - keywords: [ - 'level', - 'music', - 'slider', - ], - }, - { - code: 'šŸŽ›', - keywords: [ - 'control', - 'knobs', - 'music', - ], - }, - { - code: 'šŸŽ¤', - keywords: [ - 'activity', - 'entertainment', - 'karaoke', - 'mic', - 'microphone', - ], - }, - { - code: 'šŸŽ§', - keywords: [ - 'activity', - 'earbud', - 'entertainment', - 'headphone', - ], - }, - { - code: 'šŸ“»', - keywords: [ - 'entertainment', - 'radio', - 'video', - ], - }, - { - code: 'šŸŽ·', - keywords: [ - 'activity', - 'entertainment', - 'instrument', - 'music', - 'sax', - 'saxophone', - ], - }, - { - code: 'šŸŽø', - keywords: [ - 'activity', - 'entertainment', - 'guitar', - 'instrument', - 'music', - ], - }, - { - code: 'šŸŽ¹', - keywords: [ - 'activity', - 'entertainment', - 'instrument', - 'keyboard', - 'music', - 'piano', - ], - }, - { - code: 'šŸŽŗ', - keywords: [ - 'activity', - 'entertainment', - 'instrument', - 'music', - 'trumpet', - ], - }, - { - code: 'šŸŽ»', - keywords: [ - 'activity', - 'entertainment', - 'instrument', - 'music', - 'violin', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'drum', - 'drumsticks', - 'music', - ], - }, - { - code: 'šŸ“±', - keywords: [ - 'cell', - 'communication', - 'mobile', - 'phone', - 'telephone', - ], - }, - { - code: 'šŸ“²', - keywords: [ - 'arrow', - 'call', - 'cell', - 'communication', - 'mobile', - 'phone', - 'receive', - 'telephone', - ], - }, - { - code: 'ā˜Ž', - keywords: [ - 'phone', - 'telephone', - ], - }, - { - code: 'šŸ“ž', - keywords: [ - 'communication', - 'phone', - 'receiver', - 'telephone', - ], - }, - { - code: 'šŸ“Ÿ', - keywords: [ - 'communication', - 'pager', - ], - }, - { - code: 'šŸ“ ', - keywords: [ - 'communication', - 'fax', - ], - }, - { - code: 'šŸ”‹', - keywords: [ - 'battery', - ], - }, - { - code: 'šŸ”Œ', - keywords: [ - 'electric', - 'electricity', - 'plug', - ], - }, - { - code: 'šŸ’»', - keywords: [ - 'computer', - 'pc', - 'personal', - ], - }, - { - code: 'šŸ–„', - keywords: [ - 'computer', - 'desktop', - ], - }, - { - code: 'šŸ–Ø', - keywords: [ - 'computer', - 'printer', - ], - }, - { - code: 'āŒØ', - keywords: [ - 'computer', - 'keyboard', - ], - }, - { - code: 'šŸ–±', - keywords: [ - '3', - 'button', - 'computer', - 'mouse', - 'three', - ], - }, - { - code: 'šŸ–²', - keywords: [ - 'computer', - 'trackball', - ], - }, - { - code: 'šŸ’½', - keywords: [ - 'computer', - 'disk', - 'entertainment', - 'minidisk', - 'optical', - ], - }, - { - code: 'šŸ’¾', - keywords: [ - 'computer', - 'disk', - 'floppy', - ], - }, - { - code: 'šŸ’æ', - keywords: [ - 'blu-ray', - 'cd', - 'computer', - 'disk', - 'dvd', - 'optical', - ], - }, - { - code: 'šŸ“€', - keywords: [ - 'blu-ray', - 'cd', - 'computer', - 'disk', - 'dvd', - 'entertainment', - 'optical', - ], - }, - { - code: 'šŸŽ„', - keywords: [ - 'activity', - 'camera', - 'cinema', - 'entertainment', - 'movie', - ], - }, - { - code: 'šŸŽž', - keywords: [ - 'cinema', - 'entertainment', - 'film', - 'frames', - 'movie', - ], - }, - { - code: 'šŸ“½', - keywords: [ - 'cinema', - 'entertainment', - 'film', - 'movie', - 'projector', - 'video', - ], - }, - { - code: 'šŸŽ¬', - keywords: [ - 'activity', - 'clapper', - 'entertainment', - 'movie', - ], - }, - { - code: 'šŸ“ŗ', - keywords: [ - 'entertainment', - 'television', - 'tv', - 'video', - ], - }, - { - code: 'šŸ“·', - keywords: [ - 'camera', - 'entertainment', - 'video', - ], - }, - { - code: 'šŸ“ø', - keywords: [ - 'camera', - 'flash', - 'video', - ], - }, - { - code: 'šŸ“¹', - keywords: [ - 'camera', - 'entertainment', - 'video', - ], - }, - { - code: 'šŸ“¼', - keywords: [ - 'entertainment', - 'tape', - 'vhs', - 'video', - 'videocassette', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'glass', - 'magnifying', - 'search', - 'tool', - ], - }, - { - code: 'šŸ”Ž', - keywords: [ - 'glass', - 'magnifying', - 'search', - 'tool', - ], - }, - { - code: 'šŸ”¬', - keywords: [ - 'microscope', - 'tool', - ], - }, - { - code: 'šŸ”­', - keywords: [ - 'telescope', - 'tool', - ], - }, - { - code: 'šŸ“”', - keywords: [ - 'antenna', - 'communication', - 'dish', - 'satellite', - ], - }, - { - code: 'šŸ•Æ', - keywords: [ - 'candle', - 'light', - ], - }, - { - code: 'šŸ’”', - keywords: [ - 'bulb', - 'comic', - 'electric', - 'idea', - 'light', - ], - }, - { - code: 'šŸ”¦', - keywords: [ - 'electric', - 'flashlight', - 'light', - 'tool', - 'torch', - ], - }, - { - code: 'šŸ®', - keywords: [ - 'bar', - 'japanese', - 'lantern', - 'light', - 'red', - ], - }, - { - code: 'šŸ“”', - keywords: [ - 'book', - 'cover', - 'decorated', - 'notebook', - ], - }, - { - code: 'šŸ“•', - keywords: [ - 'book', - 'closed', - ], - }, - { - code: 'šŸ“–', - keywords: [ - 'book', - 'open', - ], - }, - { - code: 'šŸ“—', - keywords: [ - 'book', - 'green', - ], - }, - { - code: 'šŸ“˜', - keywords: [ - 'blue', - 'book', - ], - }, - { - code: 'šŸ“™', - keywords: [ - 'book', - 'orange', - ], - }, - { - code: 'šŸ“š', - keywords: [ - 'book', - 'books', - ], - }, - { - code: 'šŸ““', - keywords: [ - 'notebook', - ], - }, - { - code: 'šŸ“’', - keywords: [ - 'ledger', - 'notebook', - ], - }, - { - code: 'šŸ“ƒ', - keywords: [ - 'curl', - 'document', - 'page', - ], - }, - { - code: 'šŸ“œ', - keywords: [ - 'paper', - 'scroll', - ], - }, - { - code: 'šŸ“„', - keywords: [ - 'document', - 'page', - ], - }, - { - code: 'šŸ“°', - keywords: [ - 'communication', - 'news', - 'newspaper', - 'paper', - ], - }, - { - code: 'šŸ—ž', - keywords: [ - 'news', - 'newspaper', - 'paper', - 'rolled', - ], - }, - { - code: 'šŸ“‘', - keywords: [ - 'bookmark', - 'mark', - 'marker', - 'tabs', - ], - }, - { - code: 'šŸ”–', - keywords: [ - 'bookmark', - 'mark', - ], - }, - { - code: 'šŸ·', - keywords: [ - 'label', - ], - }, - { - code: 'šŸ’°', - keywords: [ - 'bag', - 'dollar', - 'money', - 'moneybag', - ], - }, - { - code: 'šŸ’“', - keywords: [ - 'bank', - 'banknote', - 'bill', - 'currency', - 'money', - 'note', - 'yen', - ], - }, - { - code: 'šŸ’µ', - keywords: [ - 'bank', - 'banknote', - 'bill', - 'currency', - 'dollar', - 'money', - 'note', - ], - }, - { - code: 'šŸ’¶', - keywords: [ - 'bank', - 'banknote', - 'bill', - 'currency', - 'euro', - 'money', - 'note', - ], - }, - { - code: 'šŸ’·', - keywords: [ - 'bank', - 'banknote', - 'bill', - 'currency', - 'money', - 'note', - 'pound', - ], - }, - { - code: 'šŸ’ø', - keywords: [ - 'bank', - 'banknote', - 'bill', - 'dollar', - 'fly', - 'money', - 'note', - 'wings', - ], - }, - { - code: 'šŸ’³', - keywords: [ - 'bank', - 'card', - 'credit', - 'money', - ], - }, - { - code: 'šŸ’¹', - keywords: [ - 'bank', - 'chart', - 'currency', - 'graph', - 'growth', - 'market', - 'money', - 'rise', - 'trend', - 'upward', - 'yen', - ], - }, - { - code: 'šŸ’±', - keywords: [ - 'bank', - 'currency', - 'exchange', - 'money', - ], - }, - { - code: 'šŸ’²', - keywords: [ - 'currency', - 'dollar', - 'money', - ], - }, - { - code: 'āœ‰', - keywords: [ - 'e-mail', - 'email', - 'envelope', - ], - }, - { - code: 'šŸ“§', - keywords: [ - 'communication', - 'e-mail', - 'email', - 'letter', - 'mail', - ], - }, - { - code: 'šŸ“Ø', - keywords: [ - 'communication', - 'e-mail', - 'email', - 'envelope', - 'incoming', - 'letter', - 'mail', - 'receive', - ], - }, - { - code: 'šŸ“©', - keywords: [ - 'arrow', - 'communication', - 'down', - 'e-mail', - 'email', - 'envelope', - 'letter', - 'mail', - 'outgoing', - 'sent', - ], - }, - { - code: 'šŸ“¤', - keywords: [ - 'box', - 'communication', - 'letter', - 'mail', - 'outbox', - 'sent', - 'tray', - ], - }, - { - code: 'šŸ“„', - keywords: [ - 'box', - 'communication', - 'inbox', - 'letter', - 'mail', - 'receive', - 'tray', - ], - }, - { - code: 'šŸ“¦', - keywords: [ - 'box', - 'communication', - 'package', - 'parcel', - ], - }, - { - code: 'šŸ“«', - keywords: [ - 'closed', - 'communication', - 'flag', - 'mail', - 'mailbox', - 'postbox', - ], - }, - { - code: 'šŸ“Ŗ', - keywords: [ - 'closed', - 'communication', - 'flag', - 'lowered', - 'mail', - 'mailbox', - 'postbox', - ], - }, - { - code: 'šŸ“¬', - keywords: [ - 'communication', - 'flag', - 'mail', - 'mailbox', - 'open', - 'postbox', - ], - }, - { - code: 'šŸ“­', - keywords: [ - 'communication', - 'flag', - 'lowered', - 'mail', - 'mailbox', - 'open', - 'postbox', - ], - }, - { - code: 'šŸ“®', - keywords: [ - 'communication', - 'mail', - 'mailbox', - 'postbox', - ], - }, - { - code: 'šŸ—³', - keywords: [ - 'ballot', - 'box', - ], - }, - { - code: 'āœ', - keywords: [ - 'pencil', - ], - }, - { - code: 'āœ’', - keywords: [ - 'nib', - 'pen', - ], - }, - { - code: 'šŸ–‹', - keywords: [ - 'communication', - 'fountain', - 'pen', - ], - }, - { - code: 'šŸ–Š', - keywords: [ - 'ballpoint', - 'communication', - 'pen', - ], - }, - { - code: 'šŸ–Œ', - keywords: [ - 'communication', - 'paintbrush', - 'painting', - ], - }, - { - code: 'šŸ–', - keywords: [ - 'communication', - 'crayon', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'communication', - 'memo', - 'pencil', - ], - }, - { - code: 'šŸ’¼', - keywords: [ - 'briefcase', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'file', - 'folder', - ], - }, - { - code: 'šŸ“‚', - keywords: [ - 'file', - 'folder', - 'open', - ], - }, - { - code: 'šŸ—‚', - keywords: [ - 'card', - 'dividers', - 'index', - ], - }, - { - code: 'šŸ“…', - keywords: [ - 'calendar', - 'date', - ], - }, - { - code: 'šŸ“†', - keywords: [ - 'calendar', - ], - }, - { - code: 'šŸ—’', - keywords: [ - 'note', - 'pad', - 'spiral', - ], - }, - { - code: 'šŸ—“', - keywords: [ - 'calendar', - 'pad', - 'spiral', - ], - }, - { - code: 'šŸ“‡', - keywords: [ - 'card', - 'index', - 'rolodex', - ], - }, - { - code: 'šŸ“ˆ', - keywords: [ - 'chart', - 'graph', - 'growth', - 'trend', - 'upward', - ], - }, - { - code: 'šŸ“‰', - keywords: [ - 'chart', - 'down', - 'graph', - 'trend', - ], - }, - { - code: 'šŸ“Š', - keywords: [ - 'bar', - 'chart', - 'graph', - ], - }, - { - code: 'šŸ“‹', - keywords: [ - 'clipboard', - ], - }, - { - code: 'šŸ“Œ', - keywords: [ - 'pin', - 'pushpin', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'pin', - 'pushpin', - ], - }, - { - code: 'šŸ“Ž', - keywords: [ - 'paperclip', - ], - }, - { - code: 'šŸ–‡', - keywords: [ - 'communication', - 'link', - 'paperclip', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'ruler', - 'straight edge', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'ruler', - 'set', - 'triangle', - ], - }, - { - code: 'āœ‚', - keywords: [ - 'scissors', - 'tool', - ], - }, - { - code: 'šŸ—ƒ', - keywords: [ - 'box', - 'card', - 'file', - ], - }, - { - code: 'šŸ—„', - keywords: [ - 'cabinet', - 'file', - ], - }, - { - code: 'šŸ—‘', - keywords: [ - 'wastebasket', - ], - }, - { - code: 'šŸ”’', - keywords: [ - 'closed', - 'lock', - ], - }, - { - code: 'šŸ”“', - keywords: [ - 'lock', - 'open', - 'unlock', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'ink', - 'lock', - 'nib', - 'pen', - 'privacy', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'closed', - 'key', - 'lock', - 'secure', - ], - }, - { - code: 'šŸ”‘', - keywords: [ - 'key', - 'lock', - 'password', - ], - }, - { - code: 'šŸ—', - keywords: [ - 'clue', - 'key', - 'lock', - 'old', - ], - }, - { - code: 'šŸ”Ø', - keywords: [ - 'hammer', - 'tool', - ], - }, - { - code: 'ā›', - keywords: [ - 'mining', - 'pick', - 'tool', - ], - }, - { - code: 'āš’', - keywords: [ - 'hammer', - 'pick', - 'tool', - ], - }, - { - code: 'šŸ› ', - keywords: [ - 'hammer', - 'tool', - 'wrench', - ], - }, - { - code: 'šŸ—”', - keywords: [ - 'dagger', - 'knife', - 'weapon', - ], - }, - { - code: 'āš”', - keywords: [ - 'crossed', - 'swords', - 'weapon', - ], - }, - { - code: 'šŸ”«', - keywords: [ - 'gun', - 'handgun', - 'pistol', - 'revolver', - 'tool', - 'weapon', - ], - }, - { - code: 'šŸ¹', - keywords: [ - 'archer', - 'arrow', - 'bow', - 'sagittarius', - 'tool', - 'weapon', - 'zodiac', - ], - }, - { - code: 'šŸ›”', - keywords: [ - 'shield', - 'weapon', - ], - }, - { - code: 'šŸ”§', - keywords: [ - 'tool', - 'wrench', - ], - }, - { - code: 'šŸ”©', - keywords: [ - 'bolt', - 'nut', - 'tool', - ], - }, - { - code: 'āš™', - keywords: [ - 'gear', - 'tool', - ], - }, - { - code: 'šŸ—œ', - keywords: [ - 'compression', - 'tool', - 'vice', - ], - }, - { - code: 'āš—', - keywords: [ - 'alembic', - 'chemistry', - 'tool', - ], - }, - { - code: 'āš–', - keywords: [ - 'balance', - 'justice', - 'libra', - 'scales', - 'tool', - 'weight', - 'zodiac', - ], - }, - { - code: 'šŸ”—', - keywords: [ - 'link', - ], - }, - { - code: 'ā›“', - keywords: [ - 'chain', - ], - }, - { - code: 'šŸ’‰', - keywords: [ - 'doctor', - 'medicine', - 'needle', - 'shot', - 'sick', - 'syringe', - 'tool', - ], - }, - { - code: 'šŸ’Š', - keywords: [ - 'doctor', - 'medicine', - 'pill', - 'sick', - ], - }, - { - code: 'šŸš¬', - keywords: [ - 'activity', - 'smoking', - ], - }, - { - code: 'āš°', - keywords: [ - 'coffin', - 'death', - ], - }, - { - code: 'āš±', - keywords: [ - 'death', - 'funeral', - 'urn', - ], - }, - { - code: 'šŸ—æ', - keywords: [ - 'face', - 'moyai', - 'statue', - ], - }, - { - code: 'šŸ›¢', - keywords: [ - 'drum', - 'oil', - ], - }, - { - code: 'šŸ”®', - keywords: [ - 'ball', - 'crystal', - 'fairy tale', - 'fantasy', - 'fortune', - 'tool', - ], - }, - { - code: 'šŸ›’', - keywords: [ - 'cart', - 'shopping', - 'trolley', - ], - }, - { - code: 'Symbols', - header: true, - }, - { - code: 'šŸ§', - keywords: [ - 'atm', - 'automated', - 'bank', - 'teller', - ], - }, - { - code: 'šŸš®', - keywords: [ - 'litter', - 'litterbox', - ], - }, - { - code: 'šŸš°', - keywords: [ - 'drink', - 'potable', - 'water', - ], - }, - { - code: 'ā™æ', - keywords: [ - 'access', - 'wheelchair', - ], - }, - { - code: 'šŸš¹', - keywords: [ - 'lavatory', - 'man', - 'restroom', - 'wc', - ], - }, - { - code: 'šŸšŗ', - keywords: [ - 'lavatory', - 'restroom', - 'wc', - 'woman', - ], - }, - { - code: 'šŸš»', - keywords: [ - 'lavatory', - 'restroom', - 'wc', - ], - }, - { - code: 'šŸš¼', - keywords: [ - 'baby', - 'changing', - ], - }, - { - code: 'šŸš¾', - keywords: [ - 'closet', - 'lavatory', - 'restroom', - 'water', - 'wc', - ], - }, - { - code: 'šŸ›‚', - keywords: [ - 'control', - 'passport', - ], - }, - { - code: 'šŸ›ƒ', - keywords: [ - 'customs', - ], - }, - { - code: 'šŸ›„', - keywords: [ - 'baggage', - 'claim', - ], - }, - { - code: 'šŸ›…', - keywords: [ - 'baggage', - 'left luggage', - 'locker', - 'luggage', - ], - }, - { - code: 'āš ', - keywords: [ - 'warning', - ], - }, - { - code: 'šŸšø', - keywords: [ - 'child', - 'crossing', - 'pedestrian', - 'traffic', - ], - }, - { - code: 'ā›”', - keywords: [ - 'entry', - 'forbidden', - 'no', - 'not', - 'prohibited', - 'traffic', - ], - }, - { - code: 'šŸš«', - keywords: [ - 'entry', - 'forbidden', - 'no', - 'not', - 'prohibited', - ], - }, - { - code: 'šŸš³', - keywords: [ - 'bicycle', - 'bike', - 'forbidden', - 'no', - 'not', - 'prohibited', - 'vehicle', - ], - }, - { - code: 'šŸš­', - keywords: [ - 'forbidden', - 'no', - 'not', - 'prohibited', - 'smoking', - ], - }, - { - code: 'šŸšÆ', - keywords: [ - 'forbidden', - 'litter', - 'no', - 'not', - 'prohibited', - ], - }, - { - code: 'šŸš±', - keywords: [ - 'drink', - 'forbidden', - 'no', - 'not', - 'potable', - 'prohibited', - 'water', - ], - }, - { - code: 'šŸš·', - keywords: [ - 'forbidden', - 'no', - 'not', - 'pedestrian', - 'prohibited', - ], - }, - { - code: 'šŸ“µ', - keywords: [ - 'cell', - 'communication', - 'forbidden', - 'mobile', - 'no', - 'not', - 'phone', - 'prohibited', - 'telephone', - ], - }, - { - code: 'šŸ”ž', - keywords: [ - '18', - 'age restriction', - 'eighteen', - 'forbidden', - 'no', - 'not', - 'prohibited', - 'underage', - ], - }, - { - code: 'ā˜¢', - keywords: [ - 'radioactive', - ], - }, - { - code: 'ā˜£', - keywords: [ - 'biohazard', - ], - }, - { - code: 'ā¬†', - keywords: [ - 'arrow', - 'cardinal', - 'direction', - 'north', - ], - }, - { - code: 'ā†—', - keywords: [ - 'arrow', - 'direction', - 'intercardinal', - 'northeast', - ], - }, - { - code: 'āž”', - keywords: [ - 'arrow', - 'cardinal', - 'direction', - 'east', - ], - }, - { - code: 'ā†˜', - keywords: [ - 'arrow', - 'direction', - 'intercardinal', - 'southeast', - ], - }, - { - code: 'ā¬‡', - keywords: [ - 'arrow', - 'cardinal', - 'direction', - 'down', - 'south', - ], - }, - { - code: 'ā†™', - keywords: [ - 'arrow', - 'direction', - 'intercardinal', - 'southwest', - ], - }, - { - code: 'ā¬…', - keywords: [ - 'arrow', - 'cardinal', - 'direction', - 'west', - ], - }, - { - code: 'ā†–', - keywords: [ - 'arrow', - 'direction', - 'intercardinal', - 'northwest', - ], - }, - { - code: 'ā†•', - keywords: [ - 'arrow', - ], - }, - { - code: 'ā†”', - keywords: [ - 'arrow', - ], - }, - { - code: 'ā†©', - keywords: [ - 'arrow', - ], - }, - { - code: 'ā†Ŗ', - keywords: [ - 'arrow', - ], - }, - { - code: 'ā¤“', - keywords: [ - 'arrow', - ], - }, - { - code: 'ā¤µ', - keywords: [ - 'arrow', - 'down', - ], - }, - { - code: 'šŸ”ƒ', - keywords: [ - 'arrow', - 'clockwise', - 'reload', - ], - }, - { - code: 'šŸ”„', - keywords: [ - 'anticlockwise', - 'arrow', - 'counterclockwise', - 'withershins', - ], - }, - { - code: 'šŸ”™', - keywords: [ - 'arrow', - 'back', - ], - }, - { - code: 'šŸ”š', - keywords: [ - 'arrow', - 'end', - ], - }, - { - code: 'šŸ”›', - keywords: [ - 'arrow', - 'mark', - 'on', - ], - }, - { - code: 'šŸ”œ', - keywords: [ - 'arrow', - 'soon', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'arrow', - 'top', - 'up', - ], - }, - { - code: 'šŸ›', - keywords: [ - 'religion', - 'worship', - ], - }, - { - code: 'āš›', - keywords: [ - 'atheist', - 'atom', - ], - }, - { - code: 'šŸ•‰', - keywords: [ - 'hindu', - 'om', - 'religion', - ], - }, - { - code: 'āœ”', - keywords: [ - 'david', - 'jew', - 'jewish', - 'religion', - 'star', - ], - }, - { - code: 'ā˜ø', - keywords: [ - 'buddhist', - 'dharma', - 'religion', - 'wheel', - ], - }, - { - code: 'ā˜Æ', - keywords: [ - 'religion', - 'tao', - 'taoist', - 'yang', - 'yin', - ], - }, - { - code: 'āœ', - keywords: [ - 'christian', - 'cross', - 'religion', - ], - }, - { - code: 'ā˜¦', - keywords: [ - 'christian', - 'cross', - 'religion', - ], - }, - { - code: 'ā˜Ŗ', - keywords: [ - 'islam', - 'muslim', - 'religion', - ], - }, - { - code: 'ā˜®', - keywords: [ - 'peace', - ], - }, - { - code: 'šŸ•Ž', - keywords: [ - 'candelabrum', - 'candlestick', - 'menorah', - 'religion', - ], - }, - { - code: 'šŸ”Æ', - keywords: [ - 'fortune', - 'star', - ], - }, - { - code: 'ā™»', - keywords: [ - 'recycle', - ], - }, - { - code: 'šŸ“›', - keywords: [ - 'badge', - 'name', - ], - }, - { - code: 'āšœ', - keywords: [ - 'fleur-de-lis', - ], - }, - { - code: 'šŸ”°', - keywords: [ - 'beginner', - 'chevron', - 'green', - 'japanese', - 'leaf', - 'tool', - 'yellow', - ], - }, - { - code: 'šŸ”±', - keywords: [ - 'anchor', - 'emblem', - 'ship', - 'tool', - 'trident', - ], - }, - { - code: 'ā­•', - keywords: [ - 'circle', - 'o', - ], - }, - { - code: 'āœ…', - keywords: [ - 'check', - 'mark', - ], - }, - { - code: 'ā˜‘', - keywords: [ - 'ballot', - 'box', - 'check', - ], - }, - { - code: 'āœ”', - keywords: [ - 'check', - 'mark', - ], - }, - { - code: 'āœ–', - keywords: [ - 'cancel', - 'multiplication', - 'multiply', - 'x', - ], - }, - { - code: 'āŒ', - keywords: [ - 'cancel', - 'mark', - 'multiplication', - 'multiply', - 'x', - ], - }, - { - code: 'āŽ', - keywords: [ - 'mark', - 'square', - ], - }, - { - code: 'āž•', - keywords: [ - 'math', - 'plus', - ], - }, - { - code: 'āž–', - keywords: [ - 'math', - 'minus', - ], - }, - { - code: 'āž—', - keywords: [ - 'division', - 'math', - ], - }, - { - code: 'āž°', - keywords: [ - 'curl', - 'loop', - ], - }, - { - code: 'āžæ', - keywords: [ - 'curl', - 'double', - 'loop', - ], - }, - { - code: 'ć€½', - keywords: [ - 'mark', - 'part', - ], - }, - { - code: 'āœ³', - keywords: [ - 'asterisk', - ], - }, - { - code: 'āœ“', - keywords: [ - 'star', - ], - }, - { - code: 'ā‡', - keywords: [ - 'sparkle', - ], - }, - { - code: 'ā€¼', - keywords: [ - 'bangbang', - 'exclamation', - 'mark', - 'punctuation', - ], - }, - { - code: 'ā‰', - keywords: [ - 'exclamation', - 'interrobang', - 'mark', - 'punctuation', - 'question', - ], - }, - { - code: 'ā“', - keywords: [ - 'mark', - 'punctuation', - 'question', - ], - }, - { - code: 'ā”', - keywords: [ - 'mark', - 'outlined', - 'punctuation', - 'question', - ], - }, - { - code: 'ā•', - keywords: [ - 'exclamation', - 'mark', - 'outlined', - 'punctuation', - ], - }, - { - code: 'ā—', - keywords: [ - 'exclamation', - 'mark', - 'punctuation', - ], - }, - { - code: '怰', - keywords: [ - 'dash', - 'punctuation', - 'wavy', - ], - }, - { - code: 'Ā©', - keywords: [ - 'copyright', - ], - }, - { - code: 'Ā®', - keywords: [ - 'registered', - ], - }, - { - code: 'ā„¢', - keywords: [ - 'mark', - 'tm', - 'trademark', - ], - }, - { - code: 'ā™ˆ', - keywords: [ - 'aries', - 'ram', - 'zodiac', - ], - }, - { - code: 'ā™‰', - keywords: [ - 'bull', - 'ox', - 'taurus', - 'zodiac', - ], - }, - { - code: 'ā™Š', - keywords: [ - 'gemini', - 'twins', - 'zodiac', - ], - }, - { - code: 'ā™‹', - keywords: [ - 'cancer', - 'crab', - 'zodiac', - ], - }, - { - code: 'ā™Œ', - keywords: [ - 'leo', - 'lion', - 'zodiac', - ], - }, - { - code: 'ā™', - keywords: [ - 'maiden', - 'virgin', - 'virgo', - 'zodiac', - ], - }, - { - code: 'ā™Ž', - keywords: [ - 'balance', - 'justice', - 'libra', - 'scales', - 'zodiac', - ], - }, - { - code: 'ā™', - keywords: [ - 'scorpio', - 'scorpion', - 'scorpius', - 'zodiac', - ], - }, - { - code: 'ā™', - keywords: [ - 'archer', - 'sagittarius', - 'zodiac', - ], - }, - { - code: 'ā™‘', - keywords: [ - 'capricorn', - 'goat', - 'zodiac', - ], - }, - { - code: 'ā™’', - keywords: [ - 'aquarius', - 'bearer', - 'water', - 'zodiac', - ], - }, - { - code: 'ā™“', - keywords: [ - 'fish', - 'pisces', - 'zodiac', - ], - }, - { - code: 'ā›Ž', - keywords: [ - 'bearer', - 'ophiuchus', - 'serpent', - 'snake', - 'zodiac', - ], - }, - { - code: 'šŸ”€', - keywords: [ - 'arrow', - 'crossed', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'arrow', - 'clockwise', - 'repeat', - ], - }, - { - code: 'šŸ”‚', - keywords: [ - 'arrow', - 'clockwise', - 'once', - ], - }, - { - code: 'ā–¶', - keywords: [ - 'arrow', - 'play', - 'right', - 'triangle', - ], - }, - { - code: 'ā©', - keywords: [ - 'arrow', - 'double', - 'fast', - 'forward', - ], - }, - { - code: 'ā­', - keywords: [ - 'arrow', - 'next scene', - 'next track', - 'triangle', - ], - }, - { - code: 'āÆ', - keywords: [ - 'arrow', - 'pause', - 'play', - 'right', - 'triangle', - ], - }, - { - code: 'ā—€', - keywords: [ - 'arrow', - 'left', - 'reverse', - 'triangle', - ], - }, - { - code: 'āŖ', - keywords: [ - 'arrow', - 'double', - 'rewind', - ], - }, - { - code: 'ā®', - keywords: [ - 'arrow', - 'previous scene', - 'previous track', - 'triangle', - ], - }, - { - code: 'šŸ”¼', - keywords: [ - 'arrow', - 'button', - 'red', - ], - }, - { - code: 'ā«', - keywords: [ - 'arrow', - 'double', - ], - }, - { - code: 'šŸ”½', - keywords: [ - 'arrow', - 'button', - 'down', - 'red', - ], - }, - { - code: 'ā¬', - keywords: [ - 'arrow', - 'double', - 'down', - ], - }, - { - code: 'āø', - keywords: [ - 'bar', - 'double', - 'pause', - 'vertical', - ], - }, - { - code: 'ā¹', - keywords: [ - 'square', - 'stop', - ], - }, - { - code: 'āŗ', - keywords: [ - 'circle', - 'record', - ], - }, - { - code: 'ā', - keywords: [ - 'eject', - ], - }, - { - code: 'šŸŽ¦', - keywords: [ - 'activity', - 'camera', - 'cinema', - 'entertainment', - 'film', - 'movie', - ], - }, - { - code: 'šŸ”…', - keywords: [ - 'brightness', - 'dim', - 'low', - ], - }, - { - code: 'šŸ”†', - keywords: [ - 'bright', - 'brightness', - ], - }, - { - code: 'šŸ“¶', - keywords: [ - 'antenna', - 'bar', - 'cell', - 'communication', - 'mobile', - 'phone', - 'signal', - 'telephone', - ], - }, - { - code: 'šŸ“³', - keywords: [ - 'cell', - 'communication', - 'mobile', - 'mode', - 'phone', - 'telephone', - 'vibration', - ], - }, - { - code: 'šŸ““', - keywords: [ - 'cell', - 'communication', - 'mobile', - 'off', - 'phone', - 'telephone', - ], - }, - { - code: '#ļøāƒ£', - keywords: [ - 'hash', - 'keycap', - 'pound', - ], - }, - { - code: '*ļøāƒ£', - keywords: [ - 'asterisk', - 'keycap', - 'star', - ], - }, - { - code: '0ļøāƒ£', - keywords: [ - '0', - 'keycap', - 'zero', - ], - }, - { - code: '1ļøāƒ£', - keywords: [ - '1', - 'keycap', - 'one', - ], - }, - { - code: '2ļøāƒ£', - keywords: [ - '2', - 'keycap', - 'two', - ], - }, - { - code: '3ļøāƒ£', - keywords: [ - '3', - 'keycap', - 'three', - ], - }, - { - code: '4ļøāƒ£', - keywords: [ - '4', - 'four', - 'keycap', - ], - }, - { - code: '5ļøāƒ£', - keywords: [ - '5', - 'five', - 'keycap', - ], - }, - { - code: '6ļøāƒ£', - keywords: [ - '6', - 'keycap', - 'six', - ], - }, - { - code: '7ļøāƒ£', - keywords: [ - '7', - 'keycap', - 'seven', - ], - }, - { - code: '8ļøāƒ£', - keywords: [ - '8', - 'eight', - 'keycap', - ], - }, - { - code: '9ļøāƒ£', - keywords: [ - '9', - 'keycap', - 'nine', - ], - }, - { - code: 'šŸ”Ÿ', - keywords: [ - '10', - 'keycap', - 'ten', - ], - }, - { - code: 'šŸ’Æ', - keywords: [ - '100', - 'full', - 'hundred', - 'score', - ], - }, - { - code: 'šŸ” ', - keywords: [ - 'input', - 'latin', - 'letters', - 'uppercase', - ], - }, - { - code: 'šŸ””', - keywords: [ - 'abcd', - 'input', - 'latin', - 'letters', - 'lowercase', - ], - }, - { - code: 'šŸ”¢', - keywords: [ - '1234', - 'input', - 'numbers', - ], - }, - { - code: 'šŸ”£', - keywords: [ - 'input', - ], - }, - { - code: 'šŸ”¤', - keywords: [ - 'abc', - 'alphabet', - 'input', - 'latin', - 'letters', - ], - }, - { - code: 'šŸ…°', - keywords: [ - 'a', - 'blood', - ], - }, - { - code: 'šŸ†Ž', - keywords: [ - 'ab', - 'blood', - ], - }, - { - code: 'šŸ…±', - keywords: [ - 'b', - 'blood', - ], - }, - { - code: 'šŸ†‘', - keywords: [ - 'cl', - ], - }, - { - code: 'šŸ†’', - keywords: [ - 'cool', - ], - }, - { - code: 'šŸ†“', - keywords: [ - 'free', - ], - }, - { - code: 'ā„¹', - keywords: [ - 'i', - 'information', - ], - }, - { - code: 'šŸ†”', - keywords: [ - 'id', - 'identity', - ], - }, - { - code: 'ā“‚', - keywords: [ - 'circle', - 'm', - ], - }, - { - code: 'šŸ†•', - keywords: [ - 'new', - ], - }, - { - code: 'šŸ†–', - keywords: [ - 'ng', - ], - }, - { - code: 'šŸ…¾', - keywords: [ - 'blood', - 'o', - ], - }, - { - code: 'šŸ†—', - keywords: [ - 'ok', - ], - }, - { - code: 'šŸ…æ', - keywords: [ - 'parking', - ], - }, - { - code: 'šŸ†˜', - keywords: [ - 'help', - 'sos', - ], - }, - { - code: 'šŸ†™', - keywords: [ - 'mark', - 'up', - ], - }, - { - code: 'šŸ†š', - keywords: [ - 'versus', - 'vs', - ], - }, - { - code: 'šŸˆ', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸˆ‚', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸˆ·', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸˆ¶', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸˆÆ', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸ‰', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸˆ¹', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸˆš', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸˆ²', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸ‰‘', - keywords: [ - 'chinese', - ], - }, - { - code: 'šŸˆø', - keywords: [ - 'chinese', - ], - }, - { - code: 'šŸˆ“', - keywords: [ - 'chinese', - ], - }, - { - code: 'šŸˆ³', - keywords: [ - 'chinese', - ], - }, - { - code: '抗', - keywords: [ - 'chinese', - 'congratulation', - 'congratulations', - 'ideograph', - ], - }, - { - code: '抙', - keywords: [ - 'chinese', - 'ideograph', - 'secret', - ], - }, - { - code: 'šŸˆŗ', - keywords: [ - 'chinese', - ], - }, - { - code: 'šŸˆµ', - keywords: [ - 'chinese', - ], - }, - { - code: 'ā–Ŗ', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'ā–«', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'ā—»', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'ā—¼', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'ā—½', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'ā—¾', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'ā¬›', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'ā¬œ', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'šŸ”¶', - keywords: [ - 'diamond', - 'geometric', - 'orange', - ], - }, - { - code: 'šŸ”·', - keywords: [ - 'blue', - 'diamond', - 'geometric', - ], - }, - { - code: 'šŸ”ø', - keywords: [ - 'diamond', - 'geometric', - 'orange', - ], - }, - { - code: 'šŸ”¹', - keywords: [ - 'blue', - 'diamond', - 'geometric', - ], - }, - { - code: 'šŸ”ŗ', - keywords: [ - 'geometric', - 'red', - ], - }, - { - code: 'šŸ”»', - keywords: [ - 'down', - 'geometric', - 'red', - ], - }, - { - code: 'šŸ’ ', - keywords: [ - 'comic', - 'diamond', - 'geometric', - 'inside', - ], - }, - { - code: 'šŸ”˜', - keywords: [ - 'button', - 'geometric', - 'radio', - ], - }, - { - code: 'šŸ”²', - keywords: [ - 'button', - 'geometric', - 'square', - ], - }, - { - code: 'šŸ”³', - keywords: [ - 'button', - 'geometric', - 'outlined', - 'square', - ], - }, - { - code: 'āšŖ', - keywords: [ - 'circle', - 'geometric', - ], - }, - { - code: 'āš«', - keywords: [ - 'circle', - 'geometric', - ], - }, - { - code: 'šŸ”“', - keywords: [ - 'circle', - 'geometric', - 'red', - ], - }, - { - code: 'šŸ”µ', - keywords: [ - 'blue', - 'circle', - 'geometric', - ], - }, - { - code: 'Flags', - header: true, - }, - { - code: 'šŸ', - keywords: [ - 'checkered', - 'chequered', - 'flag', - 'racing', - ], - }, - { - code: 'šŸš©', - keywords: [ - 'flag', - 'post', - ], - }, - { - code: 'šŸŽŒ', - keywords: [ - 'activity', - 'celebration', - 'cross', - 'crossed', - 'flag', - 'japanese', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'flag', - 'waving', - ], - }, - { - code: 'šŸ³', - keywords: [ - 'flag', - 'waving', - ], - }, - { - code: 'šŸ‡¦šŸ‡Ø', - keywords: [ - 'ascension', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡¦šŸ‡©', - keywords: [ - 'andorra', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡Ŗ', - keywords: [ - 'emirates', - 'flag', - 'uae', - 'united', - ], - }, - { - code: 'šŸ‡¦šŸ‡«', - keywords: [ - 'afghanistan', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡¬', - keywords: [ - 'antigua', - 'barbuda', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡®', - keywords: [ - 'anguilla', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡±', - keywords: [ - 'albania', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡²', - keywords: [ - 'armenia', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡“', - keywords: [ - 'angola', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡¶', - keywords: [ - 'antarctica', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡·', - keywords: [ - 'argentina', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡ø', - keywords: [ - 'american', - 'flag', - 'samoa', - ], - }, - { - code: 'šŸ‡¦šŸ‡¹', - keywords: [ - 'austria', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡ŗ', - keywords: [ - 'australia', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡¼', - keywords: [ - 'aruba', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡½', - keywords: [ - 'Ć„land', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡æ', - keywords: [ - 'azerbaijan', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡¦', - keywords: [ - 'bosnia', - 'flag', - 'herzegovina', - ], - }, - { - code: 'šŸ‡§šŸ‡§', - keywords: [ - 'barbados', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡©', - keywords: [ - 'bangladesh', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡Ŗ', - keywords: [ - 'belgium', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡«', - keywords: [ - 'burkina faso', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡¬', - keywords: [ - 'bulgaria', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡­', - keywords: [ - 'bahrain', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡®', - keywords: [ - 'burundi', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡Æ', - keywords: [ - 'benin', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡±', - keywords: [ - 'barthelemy', - 'barthĆ©lemy', - 'flag', - 'saint', - ], - }, - { - code: 'šŸ‡§šŸ‡²', - keywords: [ - 'bermuda', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡³', - keywords: [ - 'brunei', - 'darussalam', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡“', - keywords: [ - 'bolivia', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡¶', - keywords: [ - 'bonaire', - 'caribbean', - 'eustatius', - 'flag', - 'netherlands', - 'saba', - 'sint', - ], - }, - { - code: 'šŸ‡§šŸ‡·', - keywords: [ - 'brazil', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡ø', - keywords: [ - 'bahamas', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡¹', - keywords: [ - 'bhutan', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡»', - keywords: [ - 'bouvet', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡§šŸ‡¼', - keywords: [ - 'botswana', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡¾', - keywords: [ - 'belarus', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡æ', - keywords: [ - 'belize', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡¦', - keywords: [ - 'canada', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡Ø', - keywords: [ - 'cocos', - 'flag', - 'island', - 'keeling', - ], - }, - { - code: 'šŸ‡ØšŸ‡©', - keywords: [ - 'congo', - 'congo-kinshasa', - 'democratic republic of congo', - 'drc', - 'flag', - 'kinshasa', - 'republic', - ], - }, - { - code: 'šŸ‡ØšŸ‡«', - keywords: [ - 'central african republic', - 'flag', - 'republic', - ], - }, - { - code: 'šŸ‡ØšŸ‡¬', - keywords: [ - 'brazzaville', - 'congo', - 'congo republic', - 'congo-brazzaville', - 'flag', - 'republic', - 'republic of the congo', - ], - }, - { - code: 'šŸ‡ØšŸ‡­', - keywords: [ - 'flag', - 'switzerland', - ], - }, - { - code: 'šŸ‡ØšŸ‡®', - keywords: [ - 'cote ivoire', - 'cĆ“te ivoire', - 'flag', - 'ivory coast', - ], - }, - { - code: 'šŸ‡ØšŸ‡°', - keywords: [ - 'cook', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡ØšŸ‡±', - keywords: [ - 'chile', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡²', - keywords: [ - 'cameroon', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡³', - keywords: [ - 'china', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡“', - keywords: [ - 'colombia', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡µ', - keywords: [ - 'clipperton', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡ØšŸ‡·', - keywords: [ - 'costa rica', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡ŗ', - keywords: [ - 'cuba', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡»', - keywords: [ - 'cabo', - 'cape', - 'flag', - 'verde', - ], - }, - { - code: 'šŸ‡ØšŸ‡¼', - keywords: [ - 'antilles', - 'curacao', - 'curaƧao', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡½', - keywords: [ - 'christmas', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡ØšŸ‡¾', - keywords: [ - 'cyprus', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡æ', - keywords: [ - 'czech republic', - 'flag', - ], - }, - { - code: 'šŸ‡©šŸ‡Ŗ', - keywords: [ - 'flag', - 'germany', - ], - }, - { - code: 'šŸ‡©šŸ‡¬', - keywords: [ - 'diego garcia', - 'flag', - ], - }, - { - code: 'šŸ‡©šŸ‡Æ', - keywords: [ - 'djibouti', - 'flag', - ], - }, - { - code: 'šŸ‡©šŸ‡°', - keywords: [ - 'denmark', - 'flag', - ], - }, - { - code: 'šŸ‡©šŸ‡²', - keywords: [ - 'dominica', - 'flag', - ], - }, - { - code: 'šŸ‡©šŸ‡“', - keywords: [ - 'dominican republic', - 'flag', - ], - }, - { - code: 'šŸ‡©šŸ‡æ', - keywords: [ - 'algeria', - 'flag', - ], - }, - { - code: 'šŸ‡ŖšŸ‡¦', - keywords: [ - 'ceuta', - 'flag', - 'melilla', - ], - }, - { - code: 'šŸ‡ŖšŸ‡Ø', - keywords: [ - 'ecuador', - 'flag', - ], - }, - { - code: 'šŸ‡ŖšŸ‡Ŗ', - keywords: [ - 'estonia', - 'flag', - ], - }, - { - code: 'šŸ‡ŖšŸ‡¬', - keywords: [ - 'egypt', - 'flag', - ], - }, - { - code: 'šŸ‡ŖšŸ‡­', - keywords: [ - 'flag', - 'sahara', - 'west', - 'western sahara', - ], - }, - { - code: 'šŸ‡ŖšŸ‡·', - keywords: [ - 'eritrea', - 'flag', - ], - }, - { - code: 'šŸ‡ŖšŸ‡ø', - keywords: [ - 'flag', - 'spain', - ], - }, - { - code: 'šŸ‡ŖšŸ‡¹', - keywords: [ - 'ethiopia', - 'flag', - ], - }, - { - code: 'šŸ‡ŖšŸ‡ŗ', - keywords: [ - 'european union', - 'flag', - ], - }, - { - code: 'šŸ‡«šŸ‡®', - keywords: [ - 'finland', - 'flag', - ], - }, - { - code: 'šŸ‡«šŸ‡Æ', - keywords: [ - 'fiji', - 'flag', - ], - }, - { - code: 'šŸ‡«šŸ‡°', - keywords: [ - 'falkland', - 'falklands', - 'flag', - 'island', - 'islas', - 'malvinas', - ], - }, - { - code: 'šŸ‡«šŸ‡²', - keywords: [ - 'flag', - 'micronesia', - ], - }, - { - code: 'šŸ‡«šŸ‡“', - keywords: [ - 'faroe', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡«šŸ‡·', - keywords: [ - 'flag', - 'france', - ], - }, - { - code: 'šŸ‡¬šŸ‡¦', - keywords: [ - 'flag', - 'gabon', - ], - }, - { - code: 'šŸ‡¬šŸ‡§', - keywords: [ - 'britain', - 'british', - 'cornwall', - 'england', - 'flag', - 'great britain', - 'ireland', - 'northern ireland', - 'scotland', - 'uk', - 'union jack', - 'united', - 'united kingdom', - 'wales', - ], - }, - { - code: 'šŸ‡¬šŸ‡©', - keywords: [ - 'flag', - 'grenada', - ], - }, - { - code: 'šŸ‡¬šŸ‡Ŗ', - keywords: [ - 'flag', - 'georgia', - ], - }, - { - code: 'šŸ‡¬šŸ‡«', - keywords: [ - 'flag', - 'french', - 'guiana', - ], - }, - { - code: 'šŸ‡¬šŸ‡¬', - keywords: [ - 'flag', - 'guernsey', - ], - }, - { - code: 'šŸ‡¬šŸ‡­', - keywords: [ - 'flag', - 'ghana', - ], - }, - { - code: 'šŸ‡¬šŸ‡®', - keywords: [ - 'flag', - 'gibraltar', - ], - }, - { - code: 'šŸ‡¬šŸ‡±', - keywords: [ - 'flag', - 'greenland', - ], - }, - { - code: 'šŸ‡¬šŸ‡²', - keywords: [ - 'flag', - 'gambia', - ], - }, - { - code: 'šŸ‡¬šŸ‡³', - keywords: [ - 'flag', - 'guinea', - ], - }, - { - code: 'šŸ‡¬šŸ‡µ', - keywords: [ - 'flag', - 'guadeloupe', - ], - }, - { - code: 'šŸ‡¬šŸ‡¶', - keywords: [ - 'equatorial guinea', - 'flag', - 'guinea', - ], - }, - { - code: 'šŸ‡¬šŸ‡·', - keywords: [ - 'flag', - 'greece', - ], - }, - { - code: 'šŸ‡¬šŸ‡ø', - keywords: [ - 'flag', - 'georgia', - 'island', - 'south', - 'south georgia', - 'south sandwich', - ], - }, - { - code: 'šŸ‡¬šŸ‡¹', - keywords: [ - 'flag', - 'guatemala', - ], - }, - { - code: 'šŸ‡¬šŸ‡ŗ', - keywords: [ - 'flag', - 'guam', - ], - }, - { - code: 'šŸ‡¬šŸ‡¼', - keywords: [ - 'bissau', - 'flag', - 'guinea', - ], - }, - { - code: 'šŸ‡¬šŸ‡¾', - keywords: [ - 'flag', - 'guyana', - ], - }, - { - code: 'šŸ‡­šŸ‡°', - keywords: [ - 'china', - 'flag', - 'hong kong', - ], - }, - { - code: 'šŸ‡­šŸ‡²', - keywords: [ - 'flag', - 'heard', - 'island', - 'mcdonald', - ], - }, - { - code: 'šŸ‡­šŸ‡³', - keywords: [ - 'flag', - 'honduras', - ], - }, - { - code: 'šŸ‡­šŸ‡·', - keywords: [ - 'croatia', - 'flag', - ], - }, - { - code: 'šŸ‡­šŸ‡¹', - keywords: [ - 'flag', - 'haiti', - ], - }, - { - code: 'šŸ‡­šŸ‡ŗ', - keywords: [ - 'flag', - 'hungary', - ], - }, - { - code: 'šŸ‡®šŸ‡Ø', - keywords: [ - 'canary', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡®šŸ‡©', - keywords: [ - 'flag', - 'indonesia', - ], - }, - { - code: 'šŸ‡®šŸ‡Ŗ', - keywords: [ - 'flag', - 'ireland', - ], - }, - { - code: 'šŸ‡®šŸ‡±', - keywords: [ - 'flag', - 'israel', - ], - }, - { - code: 'šŸ‡®šŸ‡²', - keywords: [ - 'flag', - 'isle of man', - ], - }, - { - code: 'šŸ‡®šŸ‡³', - keywords: [ - 'flag', - 'india', - ], - }, - { - code: 'šŸ‡®šŸ‡“', - keywords: [ - 'british', - 'chagos', - 'flag', - 'indian ocean', - 'island', - ], - }, - { - code: 'šŸ‡®šŸ‡¶', - keywords: [ - 'flag', - 'iraq', - ], - }, - { - code: 'šŸ‡®šŸ‡·', - keywords: [ - 'flag', - 'iran', - ], - }, - { - code: 'šŸ‡®šŸ‡ø', - keywords: [ - 'flag', - 'iceland', - ], - }, - { - code: 'šŸ‡®šŸ‡¹', - keywords: [ - 'flag', - 'italy', - ], - }, - { - code: 'šŸ‡ÆšŸ‡Ŗ', - keywords: [ - 'flag', - 'jersey', - ], - }, - { - code: 'šŸ‡ÆšŸ‡²', - keywords: [ - 'flag', - 'jamaica', - ], - }, - { - code: 'šŸ‡ÆšŸ‡“', - keywords: [ - 'flag', - 'jordan', - ], - }, - { - code: 'šŸ‡ÆšŸ‡µ', - keywords: [ - 'flag', - 'japan', - ], - }, - { - code: 'šŸ‡°šŸ‡Ŗ', - keywords: [ - 'flag', - 'kenya', - ], - }, - { - code: 'šŸ‡°šŸ‡¬', - keywords: [ - 'flag', - 'kyrgyzstan', - ], - }, - { - code: 'šŸ‡°šŸ‡­', - keywords: [ - 'cambodia', - 'flag', - ], - }, - { - code: 'šŸ‡°šŸ‡®', - keywords: [ - 'flag', - 'kiribati', - ], - }, - { - code: 'šŸ‡°šŸ‡²', - keywords: [ - 'comoros', - 'flag', - ], - }, - { - code: 'šŸ‡°šŸ‡³', - keywords: [ - 'flag', - 'kitts', - 'nevis', - 'saint', - ], - }, - { - code: 'šŸ‡°šŸ‡µ', - keywords: [ - 'flag', - 'korea', - 'north', - 'north korea', - ], - }, - { - code: 'šŸ‡°šŸ‡·', - keywords: [ - 'flag', - 'korea', - 'south', - 'south korea', - ], - }, - { - code: 'šŸ‡°šŸ‡¼', - keywords: [ - 'flag', - 'kuwait', - ], - }, - { - code: 'šŸ‡°šŸ‡¾', - keywords: [ - 'cayman', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡°šŸ‡æ', - keywords: [ - 'flag', - 'kazakhstan', - ], - }, - { - code: 'šŸ‡±šŸ‡¦', - keywords: [ - 'flag', - 'laos', - ], - }, - { - code: 'šŸ‡±šŸ‡§', - keywords: [ - 'flag', - 'lebanon', - ], - }, - { - code: 'šŸ‡±šŸ‡Ø', - keywords: [ - 'flag', - 'lucia', - 'saint', - ], - }, - { - code: 'šŸ‡±šŸ‡®', - keywords: [ - 'flag', - 'liechtenstein', - ], - }, - { - code: 'šŸ‡±šŸ‡°', - keywords: [ - 'flag', - 'sri lanka', - ], - }, - { - code: 'šŸ‡±šŸ‡·', - keywords: [ - 'flag', - 'liberia', - ], - }, - { - code: 'šŸ‡±šŸ‡ø', - keywords: [ - 'flag', - 'lesotho', - ], - }, - { - code: 'šŸ‡±šŸ‡¹', - keywords: [ - 'flag', - 'lithuania', - ], - }, - { - code: 'šŸ‡±šŸ‡ŗ', - keywords: [ - 'flag', - 'luxembourg', - ], - }, - { - code: 'šŸ‡±šŸ‡»', - keywords: [ - 'flag', - 'latvia', - ], - }, - { - code: 'šŸ‡±šŸ‡¾', - keywords: [ - 'flag', - 'libya', - ], - }, - { - code: 'šŸ‡²šŸ‡¦', - keywords: [ - 'flag', - 'morocco', - ], - }, - { - code: 'šŸ‡²šŸ‡Ø', - keywords: [ - 'flag', - 'monaco', - ], - }, - { - code: 'šŸ‡²šŸ‡©', - keywords: [ - 'flag', - 'moldova', - ], - }, - { - code: 'šŸ‡²šŸ‡Ŗ', - keywords: [ - 'flag', - 'montenegro', - ], - }, - { - code: 'šŸ‡²šŸ‡«', - keywords: [ - 'flag', - 'french', - 'martin', - 'saint', - ], - }, - { - code: 'šŸ‡²šŸ‡¬', - keywords: [ - 'flag', - 'madagascar', - ], - }, - { - code: 'šŸ‡²šŸ‡­', - keywords: [ - 'flag', - 'island', - 'marshall', - ], - }, - { - code: 'šŸ‡²šŸ‡°', - keywords: [ - 'flag', - 'macedonia', - ], - }, - { - code: 'šŸ‡²šŸ‡±', - keywords: [ - 'flag', - 'mali', - ], - }, - { - code: 'šŸ‡²šŸ‡²', - keywords: [ - 'burma', - 'flag', - 'myanmar', - ], - }, - { - code: 'šŸ‡²šŸ‡³', - keywords: [ - 'flag', - 'mongolia', - ], - }, - { - code: 'šŸ‡²šŸ‡“', - keywords: [ - 'china', - 'flag', - 'macao', - 'macau', - ], - }, - { - code: 'šŸ‡²šŸ‡µ', - keywords: [ - 'flag', - 'island', - 'mariana', - 'north', - 'northern mariana', - ], - }, - { - code: 'šŸ‡²šŸ‡¶', - keywords: [ - 'flag', - 'martinique', - ], - }, - { - code: 'šŸ‡²šŸ‡·', - keywords: [ - 'flag', - 'mauritania', - ], - }, - { - code: 'šŸ‡²šŸ‡ø', - keywords: [ - 'flag', - 'montserrat', - ], - }, - { - code: 'šŸ‡²šŸ‡¹', - keywords: [ - 'flag', - 'malta', - ], - }, - { - code: 'šŸ‡²šŸ‡ŗ', - keywords: [ - 'flag', - 'mauritius', - ], - }, - { - code: 'šŸ‡²šŸ‡»', - keywords: [ - 'flag', - 'maldives', - ], - }, - { - code: 'šŸ‡²šŸ‡¼', - keywords: [ - 'flag', - 'malawi', - ], - }, - { - code: 'šŸ‡²šŸ‡½', - keywords: [ - 'flag', - 'mexico', - ], - }, - { - code: 'šŸ‡²šŸ‡¾', - keywords: [ - 'flag', - 'malaysia', - ], - }, - { - code: 'šŸ‡²šŸ‡æ', - keywords: [ - 'flag', - 'mozambique', - ], - }, - { - code: 'šŸ‡³šŸ‡¦', - keywords: [ - 'flag', - 'namibia', - ], - }, - { - code: 'šŸ‡³šŸ‡Ø', - keywords: [ - 'flag', - 'new', - 'new caledonia', - ], - }, - { - code: 'šŸ‡³šŸ‡Ŗ', - keywords: [ - 'flag', - 'niger', - ], - }, - { - code: 'šŸ‡³šŸ‡«', - keywords: [ - 'flag', - 'island', - 'norfolk', - ], - }, - { - code: 'šŸ‡³šŸ‡¬', - keywords: [ - 'flag', - 'nigeria', - ], - }, - { - code: 'šŸ‡³šŸ‡®', - keywords: [ - 'flag', - 'nicaragua', - ], - }, - { - code: 'šŸ‡³šŸ‡±', - keywords: [ - 'flag', - 'netherlands', - ], - }, - { - code: 'šŸ‡³šŸ‡“', - keywords: [ - 'flag', - 'norway', - ], - }, - { - code: 'šŸ‡³šŸ‡µ', - keywords: [ - 'flag', - 'nepal', - ], - }, - { - code: 'šŸ‡³šŸ‡·', - keywords: [ - 'flag', - 'nauru', - ], - }, - { - code: 'šŸ‡³šŸ‡ŗ', - keywords: [ - 'flag', - 'niue', - ], - }, - { - code: 'šŸ‡³šŸ‡æ', - keywords: [ - 'flag', - 'new', - 'new zealand', - ], - }, - { - code: 'šŸ‡“šŸ‡²', - keywords: [ - 'flag', - 'oman', - ], - }, - { - code: 'šŸ‡µšŸ‡¦', - keywords: [ - 'flag', - 'panama', - ], - }, - { - code: 'šŸ‡µšŸ‡Ŗ', - keywords: [ - 'flag', - 'peru', - ], - }, - { - code: 'šŸ‡µšŸ‡«', - keywords: [ - 'flag', - 'french', - 'polynesia', - ], - }, - { - code: 'šŸ‡µšŸ‡¬', - keywords: [ - 'flag', - 'guinea', - 'new', - 'papua new guinea', - ], - }, - { - code: 'šŸ‡µšŸ‡­', - keywords: [ - 'flag', - 'philippines', - ], - }, - { - code: 'šŸ‡µšŸ‡°', - keywords: [ - 'flag', - 'pakistan', - ], - }, - { - code: 'šŸ‡µšŸ‡±', - keywords: [ - 'flag', - 'poland', - ], - }, - { - code: 'šŸ‡µšŸ‡²', - keywords: [ - 'flag', - 'miquelon', - 'pierre', - 'saint', - ], - }, - { - code: 'šŸ‡µšŸ‡³', - keywords: [ - 'flag', - 'island', - 'pitcairn', - ], - }, - { - code: 'šŸ‡µšŸ‡·', - keywords: [ - 'flag', - 'puerto rico', - ], - }, - { - code: 'šŸ‡µšŸ‡ø', - keywords: [ - 'flag', - 'palestine', - ], - }, - { - code: 'šŸ‡µšŸ‡¹', - keywords: [ - 'flag', - 'portugal', - ], - }, - { - code: 'šŸ‡µšŸ‡¼', - keywords: [ - 'flag', - 'palau', - ], - }, - { - code: 'šŸ‡µšŸ‡¾', - keywords: [ - 'flag', - 'paraguay', - ], - }, - { - code: 'šŸ‡¶šŸ‡¦', - keywords: [ - 'flag', - 'qatar', - ], - }, - { - code: 'šŸ‡·šŸ‡Ŗ', - keywords: [ - 'flag', - 'reunion', - 'rĆ©union', - ], - }, - { - code: 'šŸ‡·šŸ‡“', - keywords: [ - 'flag', - 'romania', - ], - }, - { - code: 'šŸ‡·šŸ‡ø', - keywords: [ - 'flag', - 'serbia', - ], - }, - { - code: 'šŸ‡·šŸ‡ŗ', - keywords: [ - 'flag', - 'russia', - ], - }, - { - code: 'šŸ‡·šŸ‡¼', - keywords: [ - 'flag', - 'rwanda', - ], - }, - { - code: 'šŸ‡øšŸ‡¦', - keywords: [ - 'flag', - 'saudi arabia', - ], - }, - { - code: 'šŸ‡øšŸ‡§', - keywords: [ - 'flag', - 'island', - 'solomon', - ], - }, - { - code: 'šŸ‡øšŸ‡Ø', - keywords: [ - 'flag', - 'seychelles', - ], - }, - { - code: 'šŸ‡øšŸ‡©', - keywords: [ - 'flag', - 'sudan', - ], - }, - { - code: 'šŸ‡øšŸ‡Ŗ', - keywords: [ - 'flag', - 'sweden', - ], - }, - { - code: 'šŸ‡øšŸ‡¬', - keywords: [ - 'flag', - 'singapore', - ], - }, - { - code: 'šŸ‡øšŸ‡­', - keywords: [ - 'flag', - 'helena', - 'saint', - ], - }, - { - code: 'šŸ‡øšŸ‡®', - keywords: [ - 'flag', - 'slovenia', - ], - }, - { - code: 'šŸ‡øšŸ‡Æ', - keywords: [ - 'flag', - 'jan mayen', - 'svalbard', - ], - }, - { - code: 'šŸ‡øšŸ‡°', - keywords: [ - 'flag', - 'slovakia', - ], - }, - { - code: 'šŸ‡øšŸ‡±', - keywords: [ - 'flag', - 'sierra leone', - ], - }, - { - code: 'šŸ‡øšŸ‡²', - keywords: [ - 'flag', - 'san marino', - ], - }, - { - code: 'šŸ‡øšŸ‡³', - keywords: [ - 'flag', - 'senegal', - ], - }, - { - code: 'šŸ‡øšŸ‡“', - keywords: [ - 'flag', - 'somalia', - ], - }, - { - code: 'šŸ‡øšŸ‡·', - keywords: [ - 'flag', - 'suriname', - ], - }, - { - code: 'šŸ‡øšŸ‡ø', - keywords: [ - 'flag', - 'south', - 'south sudan', - 'sudan', - ], - }, - { - code: 'šŸ‡øšŸ‡¹', - keywords: [ - 'flag', - 'principe', - 'prĆ­ncipe', - 'sao tome', - 'sĆ£o tomĆ©', - ], - }, - { - code: 'šŸ‡øšŸ‡»', - keywords: [ - 'el salvador', - 'flag', - ], - }, - { - code: 'šŸ‡øšŸ‡½', - keywords: [ - 'flag', - 'maarten', - 'sint', - ], - }, - { - code: 'šŸ‡øšŸ‡¾', - keywords: [ - 'flag', - 'syria', - ], - }, - { - code: 'šŸ‡øšŸ‡æ', - keywords: [ - 'flag', - 'swaziland', - ], - }, - { - code: 'šŸ‡¹šŸ‡¦', - keywords: [ - 'flag', - 'tristan da cunha', - ], - }, - { - code: 'šŸ‡¹šŸ‡Ø', - keywords: [ - 'caicos', - 'flag', - 'island', - 'turks', - ], - }, - { - code: 'šŸ‡¹šŸ‡©', - keywords: [ - 'chad', - 'flag', - ], - }, - { - code: 'šŸ‡¹šŸ‡«', - keywords: [ - 'antarctic', - 'flag', - 'french', - ], - }, - { - code: 'šŸ‡¹šŸ‡¬', - keywords: [ - 'flag', - 'togo', - ], - }, - { - code: 'šŸ‡¹šŸ‡­', - keywords: [ - 'flag', - 'thailand', - ], - }, - { - code: 'šŸ‡¹šŸ‡Æ', - keywords: [ - 'flag', - 'tajikistan', - ], - }, - { - code: 'šŸ‡¹šŸ‡°', - keywords: [ - 'flag', - 'tokelau', - ], - }, - { - code: 'šŸ‡¹šŸ‡±', - keywords: [ - 'east', - 'east timor', - 'flag', - 'timor-leste', - ], - }, - { - code: 'šŸ‡¹šŸ‡²', - keywords: [ - 'flag', - 'turkmenistan', - ], - }, - { - code: 'šŸ‡¹šŸ‡³', - keywords: [ - 'flag', - 'tunisia', - ], - }, - { - code: 'šŸ‡¹šŸ‡“', - keywords: [ - 'flag', - 'tonga', - ], - }, - { - code: 'šŸ‡¹šŸ‡·', - keywords: [ - 'flag', - 'turkey', - ], - }, - { - code: 'šŸ‡¹šŸ‡¹', - keywords: [ - 'flag', - 'tobago', - 'trinidad', - ], - }, - { - code: 'šŸ‡¹šŸ‡»', - keywords: [ - 'flag', - 'tuvalu', - ], - }, - { - code: 'šŸ‡¹šŸ‡¼', - keywords: [ - 'china', - 'flag', - 'taiwan', - ], - }, - { - code: 'šŸ‡¹šŸ‡æ', - keywords: [ - 'flag', - 'tanzania', - ], - }, - { - code: 'šŸ‡ŗšŸ‡¦', - keywords: [ - 'flag', - 'ukraine', - ], - }, - { - code: 'šŸ‡ŗšŸ‡¬', - keywords: [ - 'flag', - 'uganda', - ], - }, - { - code: 'šŸ‡ŗšŸ‡²', - keywords: [ - 'america', - 'flag', - 'island', - 'minor outlying', - 'united', - 'united states', - 'us', - 'usa', - ], - }, - { - code: 'šŸ‡ŗšŸ‡ø', - keywords: [ - 'america', - 'flag', - 'stars and stripes', - 'united', - 'united states', - ], - }, - { - code: 'šŸ‡ŗšŸ‡¾', - keywords: [ - 'flag', - 'uruguay', - ], - }, - { - code: 'šŸ‡ŗšŸ‡æ', - keywords: [ - 'flag', - 'uzbekistan', - ], - }, - { - code: 'šŸ‡»šŸ‡¦', - keywords: [ - 'flag', - 'vatican', - ], - }, - { - code: 'šŸ‡»šŸ‡Ø', - keywords: [ - 'flag', - 'grenadines', - 'saint', - 'vincent', - ], - }, - { - code: 'šŸ‡»šŸ‡Ŗ', - keywords: [ - 'flag', - 'venezuela', - ], - }, - { - code: 'šŸ‡»šŸ‡¬', - keywords: [ - 'british', - 'flag', - 'island', - 'virgin', - ], - }, - { - code: 'šŸ‡»šŸ‡®', - keywords: [ - 'america', - 'american', - 'flag', - 'island', - 'united', - 'united states', - 'us', - 'usa', - 'virgin', - ], - }, - { - code: 'šŸ‡»šŸ‡³', - keywords: [ - 'flag', - 'viet nam', - 'vietnam', - ], - }, - { - code: 'šŸ‡»šŸ‡ŗ', - keywords: [ - 'flag', - 'vanuatu', - ], - }, - { - code: 'šŸ‡¼šŸ‡«', - keywords: [ - 'flag', - 'futuna', - 'wallis', - ], - }, - { - code: 'šŸ‡¼šŸ‡ø', - keywords: [ - 'flag', - 'samoa', - ], - }, - { - code: 'šŸ‡½šŸ‡°', - keywords: [ - 'flag', - 'kosovo', - ], - }, - { - code: 'šŸ‡¾šŸ‡Ŗ', - keywords: [ - 'flag', - 'yemen', - ], - }, - { - code: 'šŸ‡¾šŸ‡¹', - keywords: [ - 'flag', - 'mayotte', - ], - }, - { - code: 'šŸ‡æšŸ‡¦', - keywords: [ - 'flag', - 'south', - 'south africa', - ], - }, - { - code: 'šŸ‡æšŸ‡²', - keywords: [ - 'flag', - 'zambia', - ], - }, - { - code: 'šŸ‡æšŸ‡¼', - keywords: [ - 'flag', - 'zimbabwe', + title: 'Smileys & People', + data: [ + { + code: 'šŸ˜€', + keywords: [ + 'face', + 'grin', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'eye', + 'face', + 'grin', + 'smile', + ], + }, + { + code: 'šŸ˜‚', + keywords: [ + 'face', + 'joy', + 'laugh', + 'tear', + ], + }, + { + code: 'šŸ¤£', + keywords: [ + 'face', + 'floor', + 'laugh', + 'lol', + 'rofl', + 'rolling', + ], + }, + { + code: 'šŸ˜ƒ', + keywords: [ + 'face', + 'mouth', + 'open', + 'smile', + ], + }, + { + code: 'šŸ˜„', + keywords: [ + 'eye', + 'face', + 'mouth', + 'open', + 'smile', + ], + }, + { + code: 'šŸ˜…', + keywords: [ + 'cold', + 'face', + 'open', + 'smile', + 'sweat', + ], + }, + { + code: 'šŸ˜†', + keywords: [ + 'face', + 'laugh', + 'mouth', + 'open', + 'satisfied', + 'smile', + ], + }, + { + code: 'šŸ˜‰', + keywords: [ + 'face', + 'wink', + ], + }, + { + code: 'šŸ˜Š', + keywords: [ + 'blush', + 'eye', + 'face', + 'smile', + ], + }, + { + code: 'šŸ˜‹', + keywords: [ + 'delicious', + 'face', + 'savouring', + 'smile', + 'um', + 'yum', + ], + }, + { + code: 'šŸ˜Ž', + keywords: [ + 'bright', + 'cool', + 'eye', + 'eyewear', + 'face', + 'glasses', + 'smile', + 'sun', + 'sunglasses', + 'weather', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'eye', + 'face', + 'heart', + 'love', + 'smile', + ], + }, + { + code: 'šŸ˜˜', + keywords: [ + 'face', + 'heart', + 'kiss', + ], + }, + { + code: 'šŸ˜—', + keywords: [ + 'face', + 'kiss', + ], + }, + { + code: 'šŸ˜™', + keywords: [ + 'eye', + 'face', + 'kiss', + 'smile', + ], + }, + { + code: 'šŸ˜š', + keywords: [ + 'closed', + 'eye', + 'face', + 'kiss', + ], + }, + { + code: 'ā˜ŗ', + keywords: [ + 'face', + 'outlined', + 'relaxed', + 'smile', + ], + }, + { + code: 'šŸ™‚', + keywords: [ + 'face', + 'smile', + ], + }, + { + code: 'šŸ¤—', + keywords: [ + 'face', + 'hug', + 'hugging', + ], + }, + { + code: 'šŸ¤”', + keywords: [ + 'face', + 'thinking', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'deadpan', + 'face', + 'neutral', + ], + }, + { + code: 'šŸ˜‘', + keywords: [ + 'expressionless', + 'face', + 'inexpressive', + 'unexpressive', + ], + }, + { + code: 'šŸ˜¶', + keywords: [ + 'face', + 'mouth', + 'quiet', + 'silent', + ], + }, + { + code: 'šŸ™„', + keywords: [ + 'eyes', + 'face', + 'rolling', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'face', + 'smirk', + ], + }, + { + code: 'šŸ˜£', + keywords: [ + 'face', + 'persevere', + ], + }, + { + code: 'šŸ˜„', + keywords: [ + 'disappointed', + 'face', + 'relieved', + 'whew', + ], + }, + { + code: 'šŸ˜®', + keywords: [ + 'face', + 'mouth', + 'open', + 'sympathy', + ], + }, + { + code: 'šŸ¤', + keywords: [ + 'face', + 'mouth', + 'zipper', + ], + }, + { + code: 'šŸ˜Æ', + keywords: [ + 'face', + 'hushed', + 'stunned', + 'surprised', + ], + }, + { + code: 'šŸ˜Ŗ', + keywords: [ + 'face', + 'sleep', + ], + }, + { + code: 'šŸ˜«', + keywords: [ + 'face', + 'tired', + ], + }, + { + code: 'šŸ˜“', + keywords: [ + 'face', + 'sleep', + 'zzz', + ], + }, + { + code: 'šŸ˜Œ', + keywords: [ + 'face', + 'relieved', + ], + }, + { + code: 'šŸ¤“', + keywords: [ + 'face', + 'geek', + 'nerd', + ], + }, + { + code: 'šŸ˜›', + keywords: [ + 'face', + 'tongue', + ], + }, + { + code: 'šŸ˜œ', + keywords: [ + 'eye', + 'face', + 'joke', + 'tongue', + 'wink', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'eye', + 'face', + 'horrible', + 'taste', + 'tongue', + ], + }, + { + code: 'šŸ¤¤', + keywords: [ + 'drooling', + 'face', + ], + }, + { + code: 'šŸ˜’', + keywords: [ + 'face', + 'unamused', + 'unhappy', + ], + }, + { + code: 'šŸ˜“', + keywords: [ + 'cold', + 'face', + 'sweat', + ], + }, + { + code: 'šŸ˜”', + keywords: [ + 'dejected', + 'face', + 'pensive', + ], + }, + { + code: 'šŸ˜•', + keywords: [ + 'confused', + 'face', + ], + }, + { + code: 'šŸ™ƒ', + keywords: [ + 'face', + 'upside-down', + ], + }, + { + code: 'šŸ¤‘', + keywords: [ + 'face', + 'money', + 'mouth', + ], + }, + { + code: 'šŸ˜²', + keywords: [ + 'astonished', + 'face', + 'shocked', + 'totally', + ], + }, + { + code: 'ā˜¹', + keywords: [ + 'face', + 'frown', + ], + }, + { + code: 'šŸ™', + keywords: [ + 'face', + 'frown', + ], + }, + { + code: 'šŸ˜–', + keywords: [ + 'confounded', + 'face', + ], + }, + { + code: 'šŸ˜ž', + keywords: [ + 'disappointed', + 'face', + ], + }, + { + code: 'šŸ˜Ÿ', + keywords: [ + 'face', + 'worried', + ], + }, + { + code: 'šŸ˜¤', + keywords: [ + 'face', + 'triumph', + 'won', + ], + }, + { + code: 'šŸ˜¢', + keywords: [ + 'cry', + 'face', + 'sad', + 'tear', + ], + }, + { + code: 'šŸ˜­', + keywords: [ + 'cry', + 'face', + 'sad', + 'sob', + 'tear', + ], + }, + { + code: 'šŸ˜¦', + keywords: [ + 'face', + 'frown', + 'mouth', + 'open', + ], + }, + { + code: 'šŸ˜§', + keywords: [ + 'anguished', + 'face', + ], + }, + { + code: 'šŸ˜Ø', + keywords: [ + 'face', + 'fear', + 'fearful', + 'scared', + ], + }, + { + code: 'šŸ˜©', + keywords: [ + 'face', + 'tired', + 'weary', + ], + }, + { + code: 'šŸ˜¬', + keywords: [ + 'face', + 'grimace', + ], + }, + { + code: 'šŸ˜°', + keywords: [ + 'blue', + 'cold', + 'face', + 'mouth', + 'open', + 'rushed', + 'sweat', + ], + }, + { + code: 'šŸ˜±', + keywords: [ + 'face', + 'fear', + 'fearful', + 'munch', + 'scared', + 'scream', + ], + }, + { + code: 'šŸ˜³', + keywords: [ + 'dazed', + 'face', + 'flushed', + ], + }, + { + code: 'šŸ˜µ', + keywords: [ + 'dizzy', + 'face', + ], + }, + { + code: 'šŸ˜”', + keywords: [ + 'angry', + 'face', + 'mad', + 'pouting', + 'rage', + 'red', + ], + }, + { + code: 'šŸ˜ ', + keywords: [ + 'angry', + 'face', + 'mad', + ], + }, + { + code: 'šŸ˜‡', + keywords: [ + 'angel', + 'face', + 'fairy tale', + 'fantasy', + 'halo', + 'innocent', + 'smile', + ], + }, + { + code: 'šŸ¤ ', + keywords: [ + 'cowboy', + 'cowgirl', + 'face', + 'hat', + ], + }, + { + code: 'šŸ¤”', + keywords: [ + 'clown', + 'face', + ], + }, + { + code: 'šŸ¤„', + keywords: [ + 'face', + 'lie', + 'pinocchio', + ], + }, + { + code: 'šŸ˜·', + keywords: [ + 'cold', + 'doctor', + 'face', + 'mask', + 'medicine', + 'sick', + ], + }, + { + code: 'šŸ¤’', + keywords: [ + 'face', + 'ill', + 'sick', + 'thermometer', + ], + }, + { + code: 'šŸ¤•', + keywords: [ + 'bandage', + 'face', + 'hurt', + 'injury', + ], + }, + { + code: 'šŸ¤¢', + keywords: [ + 'face', + 'nauseated', + 'vomit', + ], + }, + { + code: 'šŸ¤§', + keywords: [ + 'face', + 'gesundheit', + 'sneeze', + ], + }, + { + code: 'šŸ˜ˆ', + keywords: [ + 'face', + 'fairy tale', + 'fantasy', + 'horns', + 'smile', + ], + }, + { + code: 'šŸ‘æ', + keywords: [ + 'demon', + 'devil', + 'face', + 'fairy tale', + 'fantasy', + 'imp', + ], + }, + { + code: 'šŸ‘¹', + keywords: [ + 'creature', + 'face', + 'fairy tale', + 'fantasy', + 'japanese', + 'monster', + 'ogre', + ], + }, + { + code: 'šŸ‘ŗ', + keywords: [ + 'creature', + 'face', + 'fairy tale', + 'fantasy', + 'goblin', + 'japanese', + 'monster', + ], + }, + { + code: 'šŸ’€', + keywords: [ + 'body', + 'death', + 'face', + 'fairy tale', + 'monster', + 'skull', + ], + }, + { + code: 'ā˜ ', + keywords: [ + 'body', + 'crossbones', + 'death', + 'face', + 'monster', + 'skull', + ], + }, + { + code: 'šŸ‘»', + keywords: [ + 'creature', + 'face', + 'fairy tale', + 'fantasy', + 'ghost', + 'monster', + ], + }, + { + code: 'šŸ‘½', + keywords: [ + 'alien', + 'creature', + 'extraterrestrial', + 'face', + 'fairy tale', + 'fantasy', + 'monster', + 'space', + 'ufo', + ], + }, + { + code: 'šŸ‘¾', + keywords: [ + 'alien', + 'creature', + 'extraterrestrial', + 'face', + 'fairy tale', + 'fantasy', + 'monster', + 'space', + 'ufo', + ], + }, + { + code: 'šŸ¤–', + keywords: [ + 'face', + 'monster', + 'robot', + ], + }, + { + code: 'šŸ’©', + keywords: [ + 'comic', + 'dung', + 'face', + 'monster', + 'poo', + 'poop', + ], + }, + { + code: 'šŸ˜ŗ', + keywords: [ + 'cat', + 'face', + 'mouth', + 'open', + 'smile', + ], + }, + { + code: 'šŸ˜ø', + keywords: [ + 'cat', + 'eye', + 'face', + 'grin', + 'smile', + ], + }, + { + code: 'šŸ˜¹', + keywords: [ + 'cat', + 'face', + 'joy', + 'tear', + ], + }, + { + code: 'šŸ˜»', + keywords: [ + 'cat', + 'eye', + 'face', + 'heart', + 'love', + 'smile', + ], + }, + { + code: 'šŸ˜¼', + keywords: [ + 'cat', + 'face', + 'ironic', + 'smile', + 'wry', + ], + }, + { + code: 'šŸ˜½', + keywords: [ + 'cat', + 'eye', + 'face', + 'kiss', + ], + }, + { + code: 'šŸ™€', + keywords: [ + 'cat', + 'face', + 'oh', + 'surprised', + 'weary', + ], + }, + { + code: 'šŸ˜æ', + keywords: [ + 'cat', + 'cry', + 'face', + 'sad', + 'tear', + ], + }, + { + code: 'šŸ˜¾', + keywords: [ + 'cat', + 'face', + 'pouting', + ], + }, + { + code: 'šŸ™ˆ', + keywords: [ + 'evil', + 'face', + 'forbidden', + 'gesture', + 'monkey', + 'no', + 'not', + 'prohibited', + 'see', + ], + }, + { + code: 'šŸ™‰', + keywords: [ + 'evil', + 'face', + 'forbidden', + 'gesture', + 'hear', + 'monkey', + 'no', + 'not', + 'prohibited', + ], + }, + { + code: 'šŸ™Š', + keywords: [ + 'evil', + 'face', + 'forbidden', + 'gesture', + 'monkey', + 'no', + 'not', + 'prohibited', + 'speak', + ], + }, + { + code: 'šŸ‘¦', + keywords: [ + 'boy', + ], + types: [ + 'šŸ‘¦šŸæ', + 'šŸ‘¦šŸ¾', + 'šŸ‘¦šŸ½', + 'šŸ‘¦šŸ¼', + 'šŸ‘¦šŸ»', + ], + }, + { + code: 'šŸ‘§', + keywords: [ + 'girl', + 'maiden', + 'virgin', + 'virgo', + 'zodiac', + ], + types: [ + 'šŸ‘§šŸæ', + 'šŸ‘§šŸ¾', + 'šŸ‘§šŸ½', + 'šŸ‘§šŸ¼', + 'šŸ‘§šŸ»', + ], + }, + { + code: 'šŸ‘Ø', + keywords: [ + 'man', + ], + types: [ + 'šŸ‘ØšŸæ', + 'šŸ‘ØšŸ¾', + 'šŸ‘ØšŸ½', + 'šŸ‘ØšŸ¼', + 'šŸ‘ØšŸ»', + ], + }, + { + code: 'šŸ‘©', + keywords: [ + 'woman', + ], + types: [ + 'šŸ‘©šŸæ', + 'šŸ‘©šŸ¾', + 'šŸ‘©šŸ½', + 'šŸ‘©šŸ¼', + 'šŸ‘©šŸ»', + ], + }, + { + code: 'šŸ‘“', + keywords: [ + 'man', + 'old', + ], + types: [ + 'šŸ‘“šŸæ', + 'šŸ‘“šŸ¾', + 'šŸ‘“šŸ½', + 'šŸ‘“šŸ¼', + 'šŸ‘“šŸ»', + ], + }, + { + code: 'šŸ‘µ', + keywords: [ + 'old', + 'woman', + ], + types: [ + 'šŸ‘µšŸæ', + 'šŸ‘µšŸ¾', + 'šŸ‘µšŸ½', + 'šŸ‘µšŸ¼', + 'šŸ‘µšŸ»', + ], + }, + { + code: 'šŸ‘¶', + keywords: [ + 'baby', + ], + types: [ + 'šŸ‘¶šŸæ', + 'šŸ‘¶šŸ¾', + 'šŸ‘¶šŸ½', + 'šŸ‘¶šŸ¼', + 'šŸ‘¶šŸ»', + ], + }, + { + code: 'šŸ‘¼', + keywords: [ + 'angel', + 'baby', + 'face', + 'fairy tale', + 'fantasy', + ], + types: [ + 'šŸ‘¼šŸæ', + 'šŸ‘¼šŸ¾', + 'šŸ‘¼šŸ½', + 'šŸ‘¼šŸ¼', + 'šŸ‘¼šŸ»', + ], + }, + { + code: 'šŸ‘±', + keywords: [ + 'blond', + ], + types: [ + 'šŸ‘±šŸæ', + 'šŸ‘±šŸ¾', + 'šŸ‘±šŸ½', + 'šŸ‘±šŸ¼', + 'šŸ‘±šŸ»', + ], + }, + { + code: 'šŸ‘®', + keywords: [ + 'cop', + 'officer', + 'police', + ], + types: [ + 'šŸ‘®šŸæ', + 'šŸ‘®šŸ¾', + 'šŸ‘®šŸ½', + 'šŸ‘®šŸ¼', + 'šŸ‘®šŸ»', + ], + }, + { + code: 'šŸ‘²', + keywords: [ + 'gua pi mao', + 'hat', + 'man', + ], + types: [ + 'šŸ‘²šŸæ', + 'šŸ‘²šŸ¾', + 'šŸ‘²šŸ½', + 'šŸ‘²šŸ¼', + 'šŸ‘²šŸ»', + ], + }, + { + code: 'šŸ‘³', + keywords: [ + 'man', + 'turban', + ], + types: [ + 'šŸ‘³šŸæ', + 'šŸ‘³šŸ¾', + 'šŸ‘³šŸ½', + 'šŸ‘³šŸ¼', + 'šŸ‘³šŸ»', + ], + }, + { + code: 'šŸ‘·', + keywords: [ + 'construction', + 'hat', + 'worker', + ], + types: [ + 'šŸ‘·šŸæ', + 'šŸ‘·šŸ¾', + 'šŸ‘·šŸ½', + 'šŸ‘·šŸ¼', + 'šŸ‘·šŸ»', + ], + }, + { + code: 'šŸ‘ø', + keywords: [ + 'fairy tale', + 'fantasy', + 'princess', + ], + types: [ + 'šŸ‘øšŸæ', + 'šŸ‘øšŸ¾', + 'šŸ‘øšŸ½', + 'šŸ‘øšŸ¼', + 'šŸ‘øšŸ»', + ], + }, + { + code: 'šŸ¤“', + keywords: [ + 'prince', + ], + types: [ + 'šŸ¤“šŸæ', + 'šŸ¤“šŸ¾', + 'šŸ¤“šŸ½', + 'šŸ¤“šŸ¼', + 'šŸ¤“šŸ»', + ], + }, + { + code: 'šŸ’‚', + keywords: [ + 'guard', + 'guardsman', + ], + types: [ + 'šŸ’‚šŸæ', + 'šŸ’‚šŸ¾', + 'šŸ’‚šŸ½', + 'šŸ’‚šŸ¼', + 'šŸ’‚šŸ»', + ], + }, + { + code: 'šŸ•µ', + keywords: [ + 'detective', + 'sleuth', + 'spy', + ], + types: [ + 'šŸ•µšŸæ', + 'šŸ•µšŸ¾', + 'šŸ•µšŸ½', + 'šŸ•µšŸ¼', + 'šŸ•µšŸ»', + ], + }, + { + code: 'šŸŽ…', + keywords: [ + 'activity', + 'celebration', + 'christmas', + 'fairy tale', + 'fantasy', + 'father', + 'santa', + ], + types: [ + 'šŸŽ…šŸæ', + 'šŸŽ…šŸ¾', + 'šŸŽ…šŸ½', + 'šŸŽ…šŸ¼', + 'šŸŽ…šŸ»', + ], + }, + { + code: 'šŸ¤¶', + keywords: [ + 'christmas', + 'mother', + 'mrs. claus', + ], + types: [ + 'šŸ¤¶šŸæ', + 'šŸ¤¶šŸ¾', + 'šŸ¤¶šŸ½', + 'šŸ¤¶šŸ¼', + 'šŸ¤¶šŸ»', + ], + }, + { + code: 'šŸ‘°', + keywords: [ + 'bride', + 'veil', + 'wedding', + ], + types: [ + 'šŸ‘°šŸæ', + 'šŸ‘°šŸ¾', + 'šŸ‘°šŸ½', + 'šŸ‘°šŸ¼', + 'šŸ‘°šŸ»', + ], + }, + { + code: 'šŸ¤µ', + keywords: [ + 'groom', + 'man', + 'tuxedo', + ], + types: [ + 'šŸ¤µšŸæ', + 'šŸ¤µšŸ¾', + 'šŸ¤µšŸ½', + 'šŸ¤µšŸ¼', + 'šŸ¤µšŸ»', + ], + }, + { + code: 'šŸ’†', + keywords: [ + 'massage', + 'salon', + ], + types: [ + 'šŸ’†šŸæ', + 'šŸ’†šŸ¾', + 'šŸ’†šŸ½', + 'šŸ’†šŸ¼', + 'šŸ’†šŸ»', + ], + }, + { + code: 'šŸ’‡', + keywords: [ + 'barber', + 'beauty', + 'haircut', + 'parlor', + ], + types: [ + 'šŸ’‡šŸæ', + 'šŸ’‡šŸ¾', + 'šŸ’‡šŸ½', + 'šŸ’‡šŸ¼', + 'šŸ’‡šŸ»', + ], + }, + { + code: 'šŸ™', + keywords: [ + 'frown', + 'gesture', + ], + types: [ + 'šŸ™šŸæ', + 'šŸ™šŸ¾', + 'šŸ™šŸ½', + 'šŸ™šŸ¼', + 'šŸ™šŸ»', + ], + }, + { + code: 'šŸ™Ž', + keywords: [ + 'gesture', + 'pouting', + ], + types: [ + 'šŸ™ŽšŸæ', + 'šŸ™ŽšŸ¾', + 'šŸ™ŽšŸ½', + 'šŸ™ŽšŸ¼', + 'šŸ™ŽšŸ»', + ], + }, + { + code: 'šŸ™…', + keywords: [ + 'forbidden', + 'gesture', + 'hand', + 'no', + 'not', + 'prohibited', + ], + types: [ + 'šŸ™…šŸæ', + 'šŸ™…šŸ¾', + 'šŸ™…šŸ½', + 'šŸ™…šŸ¼', + 'šŸ™…šŸ»', + ], + }, + { + code: 'šŸ™†', + keywords: [ + 'gesture', + 'hand', + 'ok', + ], + types: [ + 'šŸ™†šŸæ', + 'šŸ™†šŸ¾', + 'šŸ™†šŸ½', + 'šŸ™†šŸ¼', + 'šŸ™†šŸ»', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'hand', + 'help', + 'information', + 'sassy', + ], + types: [ + 'šŸ’šŸæ', + 'šŸ’šŸ¾', + 'šŸ’šŸ½', + 'šŸ’šŸ¼', + 'šŸ’šŸ»', + ], + }, + { + code: 'šŸ¤·', + keywords: [ + 'doubt', + 'ignorance', + 'indifference', + 'shrug', + ], + types: [ + 'šŸ¤·šŸæ', + 'šŸ¤·šŸ¾', + 'šŸ¤·šŸ½', + 'šŸ¤·šŸ¼', + 'šŸ¤·šŸ»', + ], + }, + { + code: 'šŸ™‹', + keywords: [ + 'gesture', + 'hand', + 'happy', + 'raised', + ], + types: [ + 'šŸ™‹šŸæ', + 'šŸ™‹šŸ¾', + 'šŸ™‹šŸ½', + 'šŸ™‹šŸ¼', + 'šŸ™‹šŸ»', + ], + }, + { + code: 'šŸ¤¦', + keywords: [ + 'disbelief', + 'exasperation', + 'face', + 'palm', + ], + types: [ + 'šŸ¤¦šŸæ', + 'šŸ¤¦šŸ¾', + 'šŸ¤¦šŸ½', + 'šŸ¤¦šŸ¼', + 'šŸ¤¦šŸ»', + ], + }, + { + code: 'šŸ™‡', + keywords: [ + 'apology', + 'bow', + 'gesture', + 'sorry', + ], + types: [ + 'šŸ™‡šŸæ', + 'šŸ™‡šŸ¾', + 'šŸ™‡šŸ½', + 'šŸ™‡šŸ¼', + 'šŸ™‡šŸ»', + ], + }, + { + code: 'šŸš¶', + keywords: [ + 'hike', + 'pedestrian', + 'walk', + 'walking', + ], + types: [ + 'šŸš¶šŸæ', + 'šŸš¶šŸ¾', + 'šŸš¶šŸ½', + 'šŸš¶šŸ¼', + 'šŸš¶šŸ»', + ], + }, + { + code: 'šŸƒ', + keywords: [ + 'marathon', + 'runner', + 'running', + ], + types: [ + 'šŸƒšŸæ', + 'šŸƒšŸ¾', + 'šŸƒšŸ½', + 'šŸƒšŸ¼', + 'šŸƒšŸ»', + ], + }, + { + code: 'šŸ’ƒ', + keywords: [ + 'dancer', + ], + types: [ + 'šŸ’ƒšŸæ', + 'šŸ’ƒšŸ¾', + 'šŸ’ƒšŸ½', + 'šŸ’ƒšŸ¼', + 'šŸ’ƒšŸ»', + ], + }, + { + code: 'šŸ•ŗ', + keywords: [ + 'dance', + 'man', + ], + types: [ + 'šŸ•ŗšŸæ', + 'šŸ•ŗšŸ¾', + 'šŸ•ŗšŸ½', + 'šŸ•ŗšŸ¼', + 'šŸ•ŗšŸ»', + ], + }, + { + code: 'šŸ¤°', + keywords: [ + 'pregnant', + 'woman', + ], + types: [ + 'šŸ¤°šŸæ', + 'šŸ¤°šŸ¾', + 'šŸ¤°šŸ½', + 'šŸ¤°šŸ¼', + 'šŸ¤°šŸ»', + ], + }, + { + code: 'šŸ‘Æ', + keywords: [ + 'bunny', + 'dancer', + 'ear', + 'girl', + 'woman', + ], + }, + { + code: 'šŸ•“', + keywords: [ + 'business', + 'man', + 'suit', + ], + }, + { + code: 'šŸ—£', + keywords: [ + 'face', + 'head', + 'silhouette', + 'speak', + 'speaking', + ], + }, + { + code: 'šŸ‘¤', + keywords: [ + 'bust', + 'silhouette', + ], + }, + { + code: 'šŸ‘„', + keywords: [ + 'bust', + 'silhouette', + ], + }, + { + code: 'šŸ‘«', + keywords: [ + 'couple', + 'hand', + 'hold', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘¬', + keywords: [ + 'couple', + 'gemini', + 'hand', + 'hold', + 'man', + 'twins', + 'zodiac', + ], + }, + { + code: 'šŸ‘­', + keywords: [ + 'couple', + 'hand', + 'hold', + 'woman', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'couple', + 'kiss', + 'romance', + ], + }, + { + code: 'šŸ‘©ā€ā¤ļøā€šŸ’‹ā€šŸ‘Ø', + keywords: [ + 'kiss', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘Øā€ā¤ļøā€šŸ’‹ā€šŸ‘Ø', + keywords: [ + 'kiss', + 'man', + ], + }, + { + code: 'šŸ‘©ā€ā¤ļøā€šŸ’‹ā€šŸ‘©', + keywords: [ + 'kiss', + 'woman', + ], + }, + { + code: 'šŸ’‘', + keywords: [ + 'couple', + 'heart', + 'love', + 'romance', + ], + }, + { + code: 'šŸ‘©ā€ā¤ļøā€šŸ‘Ø', + keywords: [ + 'couple', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘Øā€ā¤ļøā€šŸ‘Ø', + keywords: [ + 'couple', + 'man', + ], + }, + { + code: 'šŸ‘©ā€ā¤ļøā€šŸ‘©', + keywords: [ + 'couple', + 'woman', + ], + }, + { + code: 'šŸ‘Ŗ', + keywords: [ + 'child', + 'family', + 'father', + 'mother', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘§', + keywords: [ + 'family', + 'girl', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘§ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'girl', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘¦ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘§ā€šŸ‘§', + keywords: [ + 'family', + 'girl', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'man', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘§', + keywords: [ + 'family', + 'girl', + 'man', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘§ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'girl', + 'man', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘¦ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'man', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘§ā€šŸ‘§', + keywords: [ + 'family', + 'girl', + 'man', + ], + }, + { + code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'woman', + ], + }, + { + code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘§', + keywords: [ + 'family', + 'girl', + 'woman', + ], + }, + { + code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘§ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'girl', + 'woman', + ], + }, + { + code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘¦ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'woman', + ], + }, + { + code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘§ā€šŸ‘§', + keywords: [ + 'family', + 'girl', + 'woman', + ], + }, + { + code: 'šŸ»', + keywords: [ + 'emoji modifier', + 'fitzpatrick', + 'skin', + 'tone', + ], + }, + { + code: 'šŸ¼', + keywords: [ + 'emoji modifier', + 'fitzpatrick', + 'skin', + 'tone', + ], + }, + { + code: 'šŸ½', + keywords: [ + 'emoji modifier', + 'fitzpatrick', + 'skin', + 'tone', + ], + }, + { + code: 'šŸ¾', + keywords: [ + 'emoji modifier', + 'fitzpatrick', + 'skin', + 'tone', + ], + }, + { + code: 'šŸæ', + keywords: [ + 'emoji modifier', + 'fitzpatrick', + 'skin', + 'tone', + ], + }, + { + code: 'šŸ’Ŗ', + keywords: [ + 'biceps', + 'body', + 'comic', + 'flex', + 'muscle', + ], + types: [ + 'šŸ’ŖšŸæ', + 'šŸ’ŖšŸ¾', + 'šŸ’ŖšŸ½', + 'šŸ’ŖšŸ¼', + 'šŸ’ŖšŸ»', + ], + }, + { + code: 'šŸ¤³', + keywords: [ + 'camera', + 'phone', + 'selfie', + ], + types: [ + 'šŸ¤³šŸæ', + 'šŸ¤³šŸ¾', + 'šŸ¤³šŸ½', + 'šŸ¤³šŸ¼', + 'šŸ¤³šŸ»', + ], + }, + { + code: 'šŸ‘ˆ', + keywords: [ + 'backhand', + 'body', + 'finger', + 'hand', + 'index', + 'point', + ], + types: [ + 'šŸ‘ˆšŸæ', + 'šŸ‘ˆšŸ¾', + 'šŸ‘ˆšŸ½', + 'šŸ‘ˆšŸ¼', + 'šŸ‘ˆšŸ»', + ], + }, + { + code: 'šŸ‘‰', + keywords: [ + 'backhand', + 'body', + 'finger', + 'hand', + 'index', + 'point', + ], + types: [ + 'šŸ‘‰šŸæ', + 'šŸ‘‰šŸ¾', + 'šŸ‘‰šŸ½', + 'šŸ‘‰šŸ¼', + 'šŸ‘‰šŸ»', + ], + }, + { + code: 'ā˜', + keywords: [ + 'body', + 'finger', + 'hand', + 'index', + 'point', + 'up', + ], + types: [ + 'ā˜šŸæ', + 'ā˜šŸ¾', + 'ā˜šŸ½', + 'ā˜šŸ¼', + 'ā˜šŸ»', + ], + }, + { + code: 'šŸ‘†', + keywords: [ + 'backhand', + 'body', + 'finger', + 'hand', + 'index', + 'point', + 'up', + ], + types: [ + 'šŸ‘†šŸæ', + 'šŸ‘†šŸ¾', + 'šŸ‘†šŸ½', + 'šŸ‘†šŸ¼', + 'šŸ‘†šŸ»', + ], + }, + { + code: 'šŸ–•', + keywords: [ + 'body', + 'finger', + 'hand', + 'middle finger', + ], + types: [ + 'šŸ–•šŸæ', + 'šŸ–•šŸ¾', + 'šŸ–•šŸ½', + 'šŸ–•šŸ¼', + 'šŸ–•šŸ»', + ], + }, + { + code: 'šŸ‘‡', + keywords: [ + 'backhand', + 'body', + 'down', + 'finger', + 'hand', + 'index', + 'point', + ], + types: [ + 'šŸ‘‡šŸæ', + 'šŸ‘‡šŸ¾', + 'šŸ‘‡šŸ½', + 'šŸ‘‡šŸ¼', + 'šŸ‘‡šŸ»', + ], + }, + { + code: 'āœŒ', + keywords: [ + 'body', + 'hand', + 'v', + 'victory', + ], + types: [ + 'āœŒšŸæ', + 'āœŒšŸ¾', + 'āœŒšŸ½', + 'āœŒšŸ¼', + 'āœŒšŸ»', + ], + }, + { + code: 'šŸ¤ž', + keywords: [ + 'cross', + 'finger', + 'hand', + 'luck', + ], + types: [ + 'šŸ¤žšŸæ', + 'šŸ¤žšŸ¾', + 'šŸ¤žšŸ½', + 'šŸ¤žšŸ¼', + 'šŸ¤žšŸ»', + ], + }, + { + code: 'šŸ––', + keywords: [ + 'body', + 'finger', + 'hand', + 'spock', + 'vulcan', + ], + types: [ + 'šŸ––šŸæ', + 'šŸ––šŸ¾', + 'šŸ––šŸ½', + 'šŸ––šŸ¼', + 'šŸ––šŸ»', + ], + }, + { + code: 'šŸ¤˜', + keywords: [ + 'body', + 'finger', + 'hand', + 'horns', + 'rock-on', + ], + types: [ + 'šŸ¤˜šŸæ', + 'šŸ¤˜šŸ¾', + 'šŸ¤˜šŸ½', + 'šŸ¤˜šŸ¼', + 'šŸ¤˜šŸ»', + ], + }, + { + code: 'šŸ¤™', + keywords: [ + 'call', + 'hand', + ], + types: [ + 'šŸ¤™šŸæ', + 'šŸ¤™šŸ¾', + 'šŸ¤™šŸ½', + 'šŸ¤™šŸ¼', + 'šŸ¤™šŸ»', + ], + }, + { + code: 'šŸ–', + keywords: [ + 'body', + 'finger', + 'hand', + 'splayed', + ], + types: [ + 'šŸ–šŸæ', + 'šŸ–šŸ¾', + 'šŸ–šŸ½', + 'šŸ–šŸ¼', + 'šŸ–šŸ»', + ], + }, + { + code: 'āœ‹', + keywords: [ + 'body', + 'hand', + ], + types: [ + 'āœ‹šŸæ', + 'āœ‹šŸ¾', + 'āœ‹šŸ½', + 'āœ‹šŸ¼', + 'āœ‹šŸ»', + ], + }, + { + code: 'šŸ‘Œ', + keywords: [ + 'body', + 'hand', + 'ok', + ], + types: [ + 'šŸ‘ŒšŸæ', + 'šŸ‘ŒšŸ¾', + 'šŸ‘ŒšŸ½', + 'šŸ‘ŒšŸ¼', + 'šŸ‘ŒšŸ»', + ], + }, + { + code: 'šŸ‘', + keywords: [ + '+1', + 'body', + 'hand', + 'thumb', + 'thumbs up', + 'up', + ], + types: [ + 'šŸ‘šŸæ', + 'šŸ‘šŸ¾', + 'šŸ‘šŸ½', + 'šŸ‘šŸ¼', + 'šŸ‘šŸ»', + ], + }, + { + code: 'šŸ‘Ž', + keywords: [ + '-1', + 'body', + 'down', + 'hand', + 'thumb', + 'thumbs down', + ], + types: [ + 'šŸ‘ŽšŸæ', + 'šŸ‘ŽšŸ¾', + 'šŸ‘ŽšŸ½', + 'šŸ‘ŽšŸ¼', + 'šŸ‘ŽšŸ»', + ], + }, + { + code: 'āœŠ', + keywords: [ + 'body', + 'clenched', + 'fist', + 'hand', + 'punch', + ], + types: [ + 'āœŠšŸæ', + 'āœŠšŸ¾', + 'āœŠšŸ½', + 'āœŠšŸ¼', + 'āœŠšŸ»', + ], + }, + { + code: 'šŸ‘Š', + keywords: [ + 'body', + 'clenched', + 'fist', + 'hand', + 'punch', + ], + types: [ + 'šŸ‘ŠšŸæ', + 'šŸ‘ŠšŸ¾', + 'šŸ‘ŠšŸ½', + 'šŸ‘ŠšŸ¼', + 'šŸ‘ŠšŸ»', + ], + }, + { + code: 'šŸ¤›', + keywords: [ + 'fist', + 'leftwards', + ], + types: [ + 'šŸ¤›šŸæ', + 'šŸ¤›šŸ¾', + 'šŸ¤›šŸ½', + 'šŸ¤›šŸ¼', + 'šŸ¤›šŸ»', + ], + }, + { + code: 'šŸ¤œ', + keywords: [ + 'fist', + 'rightwards', + ], + types: [ + 'šŸ¤œšŸæ', + 'šŸ¤œšŸ¾', + 'šŸ¤œšŸ½', + 'šŸ¤œšŸ¼', + 'šŸ¤œšŸ»', + ], + }, + { + code: 'šŸ¤š', + keywords: [ + 'backhand', + 'raised', + ], + types: [ + 'šŸ¤ššŸæ', + 'šŸ¤ššŸ¾', + 'šŸ¤ššŸ½', + 'šŸ¤ššŸ¼', + 'šŸ¤ššŸ»', + ], + }, + { + code: 'šŸ‘‹', + keywords: [ + 'body', + 'hand', + 'wave', + 'waving', + ], + types: [ + 'šŸ‘‹šŸæ', + 'šŸ‘‹šŸ¾', + 'šŸ‘‹šŸ½', + 'šŸ‘‹šŸ¼', + 'šŸ‘‹šŸ»', + ], + }, + { + code: 'šŸ‘', + keywords: [ + 'body', + 'clap', + 'hand', + ], + types: [ + 'šŸ‘šŸæ', + 'šŸ‘šŸ¾', + 'šŸ‘šŸ½', + 'šŸ‘šŸ¼', + 'šŸ‘šŸ»', + ], + }, + { + code: 'āœ', + keywords: [ + 'body', + 'hand', + 'write', + ], + types: [ + 'āœšŸæ', + 'āœšŸ¾', + 'āœšŸ½', + 'āœšŸ¼', + 'āœšŸ»', + ], + }, + { + code: 'šŸ‘', + keywords: [ + 'body', + 'hand', + 'open', + ], + types: [ + 'šŸ‘šŸæ', + 'šŸ‘šŸ¾', + 'šŸ‘šŸ½', + 'šŸ‘šŸ¼', + 'šŸ‘šŸ»', + ], + }, + { + code: 'šŸ™Œ', + keywords: [ + 'body', + 'celebration', + 'gesture', + 'hand', + 'hooray', + 'raised', + ], + types: [ + 'šŸ™ŒšŸæ', + 'šŸ™ŒšŸ¾', + 'šŸ™ŒšŸ½', + 'šŸ™ŒšŸ¼', + 'šŸ™ŒšŸ»', + ], + }, + { + code: 'šŸ™', + keywords: [ + 'ask', + 'body', + 'bow', + 'folded', + 'gesture', + 'hand', + 'please', + 'pray', + 'thanks', + ], + types: [ + 'šŸ™šŸæ', + 'šŸ™šŸ¾', + 'šŸ™šŸ½', + 'šŸ™šŸ¼', + 'šŸ™šŸ»', + ], + }, + { + code: 'šŸ¤', + keywords: [ + 'agreement', + 'hand', + 'handshake', + 'meeting', + 'shake', + ], + types: [ + 'šŸ¤šŸæ', + 'šŸ¤šŸ¾', + 'šŸ¤šŸ½', + 'šŸ¤šŸ¼', + 'šŸ¤šŸ»', + ], + }, + { + code: 'šŸ’…', + keywords: [ + 'body', + 'care', + 'cosmetics', + 'manicure', + 'nail', + 'polish', + ], + types: [ + 'šŸ’…šŸæ', + 'šŸ’…šŸ¾', + 'šŸ’…šŸ½', + 'šŸ’…šŸ¼', + 'šŸ’…šŸ»', + ], + }, + { + code: 'šŸ‘‚', + keywords: [ + 'body', + 'ear', + ], + types: [ + 'šŸ‘‚šŸæ', + 'šŸ‘‚šŸ¾', + 'šŸ‘‚šŸ½', + 'šŸ‘‚šŸ¼', + 'šŸ‘‚šŸ»', + ], + }, + { + code: 'šŸ‘ƒ', + keywords: [ + 'body', + 'nose', + ], + types: [ + 'šŸ‘ƒšŸæ', + 'šŸ‘ƒšŸ¾', + 'šŸ‘ƒšŸ½', + 'šŸ‘ƒšŸ¼', + 'šŸ‘ƒšŸ»', + ], + }, + { + code: 'šŸ‘£', + keywords: [ + 'body', + 'clothing', + 'footprint', + 'print', + ], + }, + { + code: 'šŸ‘€', + keywords: [ + 'body', + 'eye', + 'face', + ], + }, + { + code: 'šŸ‘', + keywords: [ + 'body', + 'eye', + ], + }, + { + code: 'šŸ‘ā€šŸ—Ø', + keywords: [ + 'bubble', + 'eye', + 'speech', + 'witness', + ], + }, + { + code: 'šŸ‘…', + keywords: [ + 'body', + 'tongue', + ], + }, + { + code: 'šŸ‘„', + keywords: [ + 'body', + 'lips', + 'mouth', + ], + }, + { + code: 'šŸ’‹', + keywords: [ + 'heart', + 'kiss', + 'lips', + 'mark', + 'romance', + ], + }, + { + code: 'šŸ’˜', + keywords: [ + 'arrow', + 'cupid', + 'heart', + 'romance', + ], + }, + { + code: 'ā¤', + keywords: [ + 'heart', + ], + }, + { + code: 'šŸ’“', + keywords: [ + 'beating', + 'heart', + 'heartbeat', + 'pulsating', + ], + }, + { + code: 'šŸ’”', + keywords: [ + 'break', + 'broken', + 'heart', + ], + }, + { + code: 'šŸ’•', + keywords: [ + 'heart', + 'love', + ], + }, + { + code: 'šŸ’–', + keywords: [ + 'excited', + 'heart', + 'sparkle', + ], + }, + { + code: 'šŸ’—', + keywords: [ + 'excited', + 'growing', + 'heart', + 'heartpulse', + 'nervous', + ], + }, + { + code: 'šŸ’™', + keywords: [ + 'blue', + 'heart', + ], + }, + { + code: 'šŸ’š', + keywords: [ + 'green', + 'heart', + ], + }, + { + code: 'šŸ’›', + keywords: [ + 'heart', + 'yellow', + ], + }, + { + code: 'šŸ’œ', + keywords: [ + 'heart', + 'purple', + ], + }, + { + code: 'šŸ–¤', + keywords: [ + 'black', + 'evil', + 'heart', + 'wicked', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'heart', + 'ribbon', + 'valentine', + ], + }, + { + code: 'šŸ’ž', + keywords: [ + 'heart', + 'revolving', + ], + }, + { + code: 'šŸ’Ÿ', + keywords: [ + 'heart', + ], + }, + { + code: 'ā£', + keywords: [ + 'exclamation', + 'heart', + 'mark', + 'punctuation', + ], + }, + { + code: 'šŸ’Œ', + keywords: [ + 'heart', + 'letter', + 'love', + 'mail', + 'romance', + ], + }, + { + code: 'šŸ’¤', + keywords: [ + 'comic', + 'sleep', + 'zzz', + ], + }, + { + code: 'šŸ’¢', + keywords: [ + 'angry', + 'comic', + 'mad', + ], + }, + { + code: 'šŸ’£', + keywords: [ + 'bomb', + 'comic', + ], + }, + { + code: 'šŸ’„', + keywords: [ + 'boom', + 'collision', + 'comic', + ], + }, + { + code: 'šŸ’¦', + keywords: [ + 'comic', + 'splashing', + 'sweat', + ], + }, + { + code: 'šŸ’Ø', + keywords: [ + 'comic', + 'dash', + 'running', + ], + }, + { + code: 'šŸ’«', + keywords: [ + 'comic', + 'dizzy', + 'star', + ], + }, + { + code: 'šŸ’¬', + keywords: [ + 'balloon', + 'bubble', + 'comic', + 'dialog', + 'speech', + ], + }, + { + code: 'šŸ—Ø', + keywords: [ + 'dialog', + 'speech', + ], + }, + { + code: 'šŸ—Æ', + keywords: [ + 'angry', + 'balloon', + 'bubble', + 'mad', + ], + }, + { + code: 'šŸ’­', + keywords: [ + 'balloon', + 'bubble', + 'comic', + 'thought', + ], + }, + { + code: 'šŸ•³', + keywords: [ + 'hole', + ], + }, + { + code: 'šŸ‘“', + keywords: [ + 'clothing', + 'eye', + 'eyeglasses', + 'eyewear', + 'glasses', + ], + }, + { + code: 'šŸ•¶', + keywords: [ + 'dark', + 'eye', + 'eyewear', + 'glasses', + 'sunglasses', + ], + }, + { + code: 'šŸ‘”', + keywords: [ + 'clothing', + 'necktie', + ], + }, + { + code: 'šŸ‘•', + keywords: [ + 'clothing', + 'shirt', + 'tshirt', + ], + }, + { + code: 'šŸ‘–', + keywords: [ + 'clothing', + 'jeans', + 'pants', + 'trousers', + ], + }, + { + code: 'šŸ‘—', + keywords: [ + 'clothing', + 'dress', + ], + }, + { + code: 'šŸ‘˜', + keywords: [ + 'clothing', + 'kimono', + ], + }, + { + code: 'šŸ‘™', + keywords: [ + 'bikini', + 'clothing', + 'swim', + ], + }, + { + code: 'šŸ‘š', + keywords: [ + 'clothing', + 'woman', + ], + }, + { + code: 'šŸ‘›', + keywords: [ + 'clothing', + 'coin', + 'purse', + ], + }, + { + code: 'šŸ‘œ', + keywords: [ + 'bag', + 'clothing', + 'handbag', + ], + }, + { + code: 'šŸ‘', + keywords: [ + 'bag', + 'clothing', + 'pouch', + ], + }, + { + code: 'šŸ›', + keywords: [ + 'bag', + 'hotel', + 'shopping', + ], + }, + { + code: 'šŸŽ’', + keywords: [ + 'activity', + 'bag', + 'satchel', + 'school', + ], + }, + { + code: 'šŸ‘ž', + keywords: [ + 'clothing', + 'man', + 'shoe', + ], + }, + { + code: 'šŸ‘Ÿ', + keywords: [ + 'athletic', + 'clothing', + 'shoe', + 'sneaker', + ], + }, + { + code: 'šŸ‘ ', + keywords: [ + 'clothing', + 'heel', + 'shoe', + 'woman', + ], + }, + { + code: 'šŸ‘”', + keywords: [ + 'clothing', + 'sandal', + 'shoe', + 'woman', + ], + }, + { + code: 'šŸ‘¢', + keywords: [ + 'boot', + 'clothing', + 'shoe', + 'woman', + ], + }, + { + code: 'šŸ‘‘', + keywords: [ + 'clothing', + 'crown', + 'king', + 'queen', + ], + }, + { + code: 'šŸ‘’', + keywords: [ + 'clothing', + 'hat', + 'woman', + ], + }, + { + code: 'šŸŽ©', + keywords: [ + 'activity', + 'clothing', + 'entertainment', + 'hat', + 'top', + 'tophat', + ], + }, + { + code: 'šŸŽ“', + keywords: [ + 'activity', + 'cap', + 'celebration', + 'clothing', + 'graduation', + 'hat', + ], + }, + { + code: 'ā›‘', + keywords: [ + 'aid', + 'cross', + 'face', + 'hat', + 'helmet', + ], + }, + { + code: 'šŸ“æ', + keywords: [ + 'beads', + 'clothing', + 'necklace', + 'prayer', + 'religion', + ], + }, + { + code: 'šŸ’„', + keywords: [ + 'cosmetics', + 'lipstick', + 'makeup', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'diamond', + 'ring', + 'romance', + ], + }, + { + code: 'šŸ’Ž', + keywords: [ + 'diamond', + 'gem', + 'jewel', + 'romance', + ], + }, + ], + }, + { + title: 'Animals & Nature', + data: [ + { + code: 'šŸµ', + keywords: [ + 'face', + 'monkey', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'monkey', + ], + }, + { + code: 'šŸ¦', + keywords: [ + 'gorilla', + ], + }, + { + code: 'šŸ¶', + keywords: [ + 'dog', + 'face', + 'pet', + ], + }, + { + code: 'šŸ•', + keywords: [ + 'dog', + 'pet', + ], + }, + { + code: 'šŸ©', + keywords: [ + 'dog', + 'poodle', + ], + }, + { + code: 'šŸŗ', + keywords: [ + 'face', + 'wolf', + ], + }, + { + code: 'šŸ¦Š', + keywords: [ + 'face', + 'fox', + ], + }, + { + code: 'šŸ±', + keywords: [ + 'cat', + 'face', + 'pet', + ], + }, + { + code: 'šŸˆ', + keywords: [ + 'cat', + 'pet', + ], + }, + { + code: 'šŸ¦', + keywords: [ + 'face', + 'leo', + 'lion', + 'zodiac', + ], + }, + { + code: 'šŸÆ', + keywords: [ + 'face', + 'tiger', + ], + }, + { + code: 'šŸ…', + keywords: [ + 'tiger', + ], + }, + { + code: 'šŸ†', + keywords: [ + 'leopard', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'face', + 'horse', + ], + }, + { + code: 'šŸŽ', + keywords: [ + 'horse', + 'racehorse', + 'racing', + ], + }, + { + code: 'šŸ¦Œ', + keywords: [ + 'deer', + ], + }, + { + code: 'šŸ¦„', + keywords: [ + 'face', + 'unicorn', + ], + }, + { + code: 'šŸ®', + keywords: [ + 'cow', + 'face', + ], + }, + { + code: 'šŸ‚', + keywords: [ + 'bull', + 'ox', + 'taurus', + 'zodiac', + ], + }, + { + code: 'šŸƒ', + keywords: [ + 'buffalo', + 'water', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'cow', + ], + }, + { + code: 'šŸ·', + keywords: [ + 'face', + 'pig', + ], + }, + { + code: 'šŸ–', + keywords: [ + 'pig', + 'sow', + ], + }, + { + code: 'šŸ—', + keywords: [ + 'boar', + 'pig', + ], + }, + { + code: 'šŸ½', + keywords: [ + 'face', + 'nose', + 'pig', + ], + }, + { + code: 'šŸ', + keywords: [ + 'aries', + 'ram', + 'sheep', + 'zodiac', + ], + }, + { + code: 'šŸ‘', + keywords: [ + 'ewe', + 'sheep', + ], + }, + { + code: 'šŸ', + keywords: [ + 'capricorn', + 'goat', + 'zodiac', + ], + }, + { + code: 'šŸŖ', + keywords: [ + 'camel', + 'dromedary', + 'hump', + ], + }, + { + code: 'šŸ«', + keywords: [ + 'bactrian', + 'camel', + 'hump', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'elephant', + ], + }, + { + code: 'šŸ¦', + keywords: [ + 'rhinoceros', + ], + }, + { + code: 'šŸ­', + keywords: [ + 'face', + 'mouse', + ], + }, + { + code: 'šŸ', + keywords: [ + 'mouse', + ], + }, + { + code: 'šŸ€', + keywords: [ + 'rat', + ], + }, + { + code: 'šŸ¹', + keywords: [ + 'face', + 'hamster', + 'pet', + ], + }, + { + code: 'šŸ°', + keywords: [ + 'bunny', + 'face', + 'pet', + 'rabbit', + ], + }, + { + code: 'šŸ‡', + keywords: [ + 'bunny', + 'pet', + 'rabbit', + ], + }, + { + code: 'šŸæ', + keywords: [ + 'chipmunk', + ], + }, + { + code: 'šŸ¦‡', + keywords: [ + 'bat', + 'vampire', + ], + }, + { + code: 'šŸ»', + keywords: [ + 'bear', + 'face', + ], + }, + { + code: 'šŸØ', + keywords: [ + 'bear', + 'koala', + ], + }, + { + code: 'šŸ¼', + keywords: [ + 'face', + 'panda', + ], + }, + { + code: 'šŸ¾', + keywords: [ + 'feet', + 'paw', + 'print', + ], + }, + { + code: 'šŸ¦ƒ', + keywords: [ + 'turkey', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'chicken', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'rooster', + ], + }, + { + code: 'šŸ£', + keywords: [ + 'baby', + 'chick', + 'hatching', + ], + }, + { + code: 'šŸ¤', + keywords: [ + 'baby', + 'chick', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'baby', + 'chick', + ], + }, + { + code: 'šŸ¦', + keywords: [ + 'bird', + ], + }, + { + code: 'šŸ§', + keywords: [ + 'penguin', + ], + }, + { + code: 'šŸ•Š', + keywords: [ + 'bird', + 'dove', + 'fly', + 'peace', + ], + }, + { + code: 'šŸ¦…', + keywords: [ + 'bird', + 'eagle', + ], + }, + { + code: 'šŸ¦†', + keywords: [ + 'bird', + 'duck', + ], + }, + { + code: 'šŸ¦‰', + keywords: [ + 'bird', + 'owl', + 'wise', + ], + }, + { + code: 'šŸø', + keywords: [ + 'face', + 'frog', + ], + }, + { + code: 'šŸŠ', + keywords: [ + 'crocodile', + ], + }, + { + code: 'šŸ¢', + keywords: [ + 'turtle', + ], + }, + { + code: 'šŸ¦Ž', + keywords: [ + 'lizard', + 'reptile', + ], + }, + { + code: 'šŸ', + keywords: [ + 'bearer', + 'ophiuchus', + 'serpent', + 'snake', + 'zodiac', + ], + }, + { + code: 'šŸ²', + keywords: [ + 'dragon', + 'face', + 'fairy tale', + ], + }, + { + code: 'šŸ‰', + keywords: [ + 'dragon', + 'fairy tale', + ], + }, + { + code: 'šŸ³', + keywords: [ + 'face', + 'spouting', + 'whale', + ], + }, + { + code: 'šŸ‹', + keywords: [ + 'whale', + ], + }, + { + code: 'šŸ¬', + keywords: [ + 'dolphin', + 'flipper', + ], + }, + { + code: 'šŸŸ', + keywords: [ + 'fish', + 'pisces', + 'zodiac', + ], + }, + { + code: 'šŸ ', + keywords: [ + 'fish', + 'tropical', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'blowfish', + 'fish', + ], + }, + { + code: 'šŸ¦ˆ', + keywords: [ + 'fish', + 'shark', + ], + }, + { + code: 'šŸ™', + keywords: [ + 'octopus', + ], + }, + { + code: 'šŸš', + keywords: [ + 'shell', + 'spiral', + ], + }, + { + code: 'šŸ¦€', + keywords: [ + 'cancer', + 'crab', + 'zodiac', + ], + }, + { + code: 'šŸ¦', + keywords: [ + 'shellfish', + 'shrimp', + 'small', + ], + }, + { + code: 'šŸ¦‘', + keywords: [ + 'molusc', + 'squid', + ], + }, + { + code: 'šŸ¦‹', + keywords: [ + 'butterfly', + 'insect', + 'pretty', + ], + }, + { + code: 'šŸŒ', + keywords: [ + 'snail', + ], + }, + { + code: 'šŸ›', + keywords: [ + 'bug', + 'insect', + ], + }, + { + code: 'šŸœ', + keywords: [ + 'ant', + 'insect', + ], + }, + { + code: 'šŸ', + keywords: [ + 'bee', + 'honeybee', + 'insect', + ], + }, + { + code: 'šŸž', + keywords: [ + 'beetle', + 'insect', + 'lady beetle', + 'ladybird', + 'ladybug', + ], + }, + { + code: 'šŸ•·', + keywords: [ + 'insect', + 'spider', + ], + }, + { + code: 'šŸ•ø', + keywords: [ + 'spider', + 'web', + ], + }, + { + code: 'šŸ¦‚', + keywords: [ + 'scorpio', + 'scorpion', + 'scorpius', + 'zodiac', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'bouquet', + 'flower', + 'plant', + 'romance', + ], + }, + { + code: 'šŸŒø', + keywords: [ + 'blossom', + 'cherry', + 'flower', + 'plant', + ], + }, + { + code: 'šŸ’®', + keywords: [ + 'flower', + ], + }, + { + code: 'šŸµ', + keywords: [ + 'plant', + 'rosette', + ], + }, + { + code: 'šŸŒ¹', + keywords: [ + 'flower', + 'plant', + 'rose', + ], + }, + { + code: 'šŸ„€', + keywords: [ + 'flower', + 'wilted', + ], + }, + { + code: 'šŸŒŗ', + keywords: [ + 'flower', + 'hibiscus', + 'plant', + ], + }, + { + code: 'šŸŒ»', + keywords: [ + 'flower', + 'plant', + 'sun', + 'sunflower', + ], + }, + { + code: 'šŸŒ¼', + keywords: [ + 'blossom', + 'flower', + 'plant', + ], + }, + { + code: 'šŸŒ·', + keywords: [ + 'flower', + 'plant', + 'tulip', + ], + }, + { + code: 'šŸŒ±', + keywords: [ + 'plant', + 'seedling', + 'young', + ], + }, + { + code: 'šŸŒ²', + keywords: [ + 'evergreen', + 'plant', + 'tree', + ], + }, + { + code: 'šŸŒ³', + keywords: [ + 'deciduous', + 'plant', + 'shedding', + 'tree', + ], + }, + { + code: 'šŸŒ“', + keywords: [ + 'palm', + 'plant', + 'tree', + ], + }, + { + code: 'šŸŒµ', + keywords: [ + 'cactus', + 'plant', + ], + }, + { + code: 'šŸŒ¾', + keywords: [ + 'ear', + 'plant', + 'rice', + ], + }, + { + code: 'šŸŒæ', + keywords: [ + 'herb', + 'leaf', + 'plant', + ], + }, + { + code: 'ā˜˜', + keywords: [ + 'plant', + 'shamrock', + ], + }, + { + code: 'šŸ€', + keywords: [ + '4', + 'clover', + 'four', + 'leaf', + 'plant', + ], + }, + { + code: 'šŸ', + keywords: [ + 'falling', + 'leaf', + 'maple', + 'plant', + ], + }, + { + code: 'šŸ‚', + keywords: [ + 'falling', + 'leaf', + 'plant', + ], + }, + { + code: 'šŸƒ', + keywords: [ + 'blow', + 'flutter', + 'leaf', + 'plant', + 'wind', + ], + }, + { + code: 'šŸ‡', + keywords: [ + 'fruit', + 'grape', + 'plant', + ], + }, + { + code: 'šŸˆ', + keywords: [ + 'fruit', + 'melon', + 'plant', + ], + }, + { + code: 'šŸ‰', + keywords: [ + 'fruit', + 'plant', + 'watermelon', + ], + }, + { + code: 'šŸŠ', + keywords: [ + 'fruit', + 'orange', + 'plant', + 'tangerine', + ], + }, + { + code: 'šŸ‹', + keywords: [ + 'citrus', + 'fruit', + 'lemon', + 'plant', + ], + }, + { + code: 'šŸŒ', + keywords: [ + 'banana', + 'fruit', + 'plant', + ], + }, + { + code: 'šŸ', + keywords: [ + 'fruit', + 'pineapple', + 'plant', + ], + }, + { + code: 'šŸŽ', + keywords: [ + 'apple', + 'fruit', + 'plant', + 'red', + ], + }, + { + code: 'šŸ', + keywords: [ + 'apple', + 'fruit', + 'green', + 'plant', + ], + }, + { + code: 'šŸ', + keywords: [ + 'fruit', + 'pear', + 'plant', + ], + }, + { + code: 'šŸ‘', + keywords: [ + 'fruit', + 'peach', + 'plant', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'cherry', + 'fruit', + 'plant', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'berry', + 'fruit', + 'plant', + 'strawberry', + ], + }, + { + code: 'šŸ…', + keywords: [ + 'plant', + 'tomato', + 'vegetable', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'fruit', + 'kiwi', + ], + }, + { + code: 'šŸ„‘', + keywords: [ + 'avocado', + 'fruit', + ], + }, + { + code: 'šŸ†', + keywords: [ + 'aubergine', + 'eggplant', + 'plant', + 'vegetable', + ], + }, + { + code: 'šŸ„”', + keywords: [ + 'potato', + 'vegetable', + ], + }, + { + code: 'šŸ„•', + keywords: [ + 'carrot', + 'vegetable', + ], + }, + { + code: 'šŸŒ½', + keywords: [ + 'corn', + 'ear', + 'maize', + 'maze', + 'plant', + ], + }, + { + code: 'šŸŒ¶', + keywords: [ + 'hot', + 'pepper', + 'plant', + ], + }, + { + code: 'šŸ„’', + keywords: [ + 'cucumber', + 'pickle', + 'vegetable', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'mushroom', + 'plant', + ], + }, + { + code: 'šŸ„œ', + keywords: [ + 'nut', + 'peanut', + 'vegetable', + ], + }, + { + code: 'šŸŒ°', + keywords: [ + 'chestnut', + 'plant', + ], + }, + { + code: 'šŸž', + keywords: [ + 'bread', + 'loaf', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'bread', + 'crescent roll', + 'croissant', + 'french', + ], + }, + { + code: 'šŸ„–', + keywords: [ + 'baguette', + 'bread', + 'french', + ], + }, + { + code: 'šŸ„ž', + keywords: [ + 'crĆŖpe', + 'hotcake', + 'pancake', + ], + }, + { + code: 'šŸ§€', + keywords: [ + 'cheese', + ], + }, + { + code: 'šŸ–', + keywords: [ + 'bone', + 'meat', + ], + }, + { + code: 'šŸ—', + keywords: [ + 'bone', + 'chicken', + 'leg', + 'poultry', + ], + }, + { + code: 'šŸ„“', + keywords: [ + 'bacon', + 'meat', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'burger', + 'hamburger', + ], + }, + { + code: 'šŸŸ', + keywords: [ + 'french', + 'fries', + ], + }, + { + code: 'šŸ•', + keywords: [ + 'cheese', + 'pizza', + 'slice', + ], + }, + { + code: 'šŸŒ­', + keywords: [ + 'frankfurter', + 'hot dog', + 'hotdog', + 'sausage', + ], + }, + { + code: 'šŸŒ®', + keywords: [ + 'mexican', + 'taco', + ], + }, + { + code: 'šŸŒÆ', + keywords: [ + 'burrito', + 'mexican', + ], + }, + { + code: 'šŸ„™', + keywords: [ + 'falafel', + 'flatbread', + 'gyro', + 'kebab', + 'stuffed', + ], + }, + { + code: 'šŸ„š', + keywords: [ + 'egg', + ], + }, + { + code: 'šŸ³', + keywords: [ + 'cooking', + 'egg', + 'frying', + 'pan', + ], + }, + { + code: 'šŸ„˜', + keywords: [ + 'casserole', + 'paella', + 'pan', + 'shallow', + ], + }, + { + code: 'šŸ²', + keywords: [ + 'pot', + 'stew', + ], + }, + { + code: 'šŸ„—', + keywords: [ + 'green', + 'salad', + ], + }, + { + code: 'šŸæ', + keywords: [ + 'popcorn', + ], + }, + { + code: 'šŸ±', + keywords: [ + 'bento', + 'box', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'cracker', + 'rice', + ], + }, + { + code: 'šŸ™', + keywords: [ + 'ball', + 'japanese', + 'rice', + ], + }, + { + code: 'šŸš', + keywords: [ + 'cooked', + 'rice', + ], + }, + { + code: 'šŸ›', + keywords: [ + 'curry', + 'rice', + ], + }, + { + code: 'šŸœ', + keywords: [ + 'bowl', + 'noodle', + 'ramen', + 'steaming', + ], + }, + { + code: 'šŸ', + keywords: [ + 'pasta', + 'spaghetti', + ], + }, + { + code: 'šŸ ', + keywords: [ + 'potato', + 'roasted', + 'sweet', + ], + }, + { + code: 'šŸ¢', + keywords: [ + 'kebab', + 'oden', + 'seafood', + 'skewer', + 'stick', + ], + }, + { + code: 'šŸ£', + keywords: [ + 'sushi', + ], + }, + { + code: 'šŸ¤', + keywords: [ + 'fried', + 'prawn', + 'shrimp', + 'tempura', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'cake', + 'fish', + 'pastry', + 'swirl', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'dango', + 'dessert', + 'japanese', + 'skewer', + 'stick', + 'sweet', + ], + }, + { + code: 'šŸ¦', + keywords: [ + 'cream', + 'dessert', + 'ice', + 'icecream', + 'soft', + 'sweet', + ], + }, + { + code: 'šŸ§', + keywords: [ + 'dessert', + 'ice', + 'shaved', + 'sweet', + ], + }, + { + code: 'šŸØ', + keywords: [ + 'cream', + 'dessert', + 'ice', + 'sweet', + ], + }, + { + code: 'šŸ©', + keywords: [ + 'dessert', + 'donut', + 'doughnut', + 'sweet', + ], + }, + { + code: 'šŸŖ', + keywords: [ + 'cookie', + 'dessert', + 'sweet', + ], + }, + { + code: 'šŸŽ‚', + keywords: [ + 'birthday', + 'cake', + 'celebration', + 'dessert', + 'pastry', + 'sweet', + ], + }, + { + code: 'šŸ°', + keywords: [ + 'cake', + 'dessert', + 'pastry', + 'shortcake', + 'slice', + 'sweet', + ], + }, + { + code: 'šŸ«', + keywords: [ + 'bar', + 'chocolate', + 'dessert', + 'sweet', + ], + }, + { + code: 'šŸ¬', + keywords: [ + 'candy', + 'dessert', + 'sweet', + ], + }, + { + code: 'šŸ­', + keywords: [ + 'candy', + 'dessert', + 'lollipop', + 'sweet', + ], + }, + { + code: 'šŸ®', + keywords: [ + 'custard', + 'dessert', + 'pudding', + 'sweet', + ], + }, + { + code: 'šŸÆ', + keywords: [ + 'honey', + 'honeypot', + 'pot', + 'sweet', + ], + }, + { + code: 'šŸ¼', + keywords: [ + 'baby', + 'bottle', + 'drink', + 'milk', + ], + }, + { + code: 'šŸ„›', + keywords: [ + 'drink', + 'glass', + 'milk', + ], + }, + { + code: 'ā˜•', + keywords: [ + 'beverage', + 'coffee', + 'drink', + 'hot', + 'steaming', + 'tea', + ], + }, + { + code: 'šŸµ', + keywords: [ + 'beverage', + 'cup', + 'drink', + 'tea', + 'teacup', + ], + }, + { + code: 'šŸ¶', + keywords: [ + 'bar', + 'beverage', + 'bottle', + 'cup', + 'drink', + 'sake', + ], + }, + { + code: 'šŸ¾', + keywords: [ + 'bar', + 'bottle', + 'cork', + 'drink', + 'popping', + ], + }, + { + code: 'šŸ·', + keywords: [ + 'bar', + 'beverage', + 'drink', + 'glass', + 'wine', + ], + }, + { + code: 'šŸø', + keywords: [ + 'bar', + 'cocktail', + 'drink', + 'glass', + ], + }, + { + code: 'šŸ¹', + keywords: [ + 'bar', + 'drink', + 'tropical', + ], + }, + { + code: 'šŸŗ', + keywords: [ + 'bar', + 'beer', + 'drink', + 'mug', + ], + }, + { + code: 'šŸ»', + keywords: [ + 'bar', + 'beer', + 'clink', + 'drink', + 'mug', + ], + }, + { + code: 'šŸ„‚', + keywords: [ + 'celebrate', + 'clink', + 'drink', + 'glass', + ], + }, + { + code: 'šŸ„ƒ', + keywords: [ + 'glass', + 'liquor', + 'shot', + 'tumbler', + 'whisky', + ], + }, + { + code: 'šŸ½', + keywords: [ + 'cooking', + 'fork', + 'knife', + 'plate', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'cooking', + 'fork', + 'knife', + ], + }, + { + code: 'šŸ„„', + keywords: [ + 'spoon', + 'tableware', + ], + }, + { + code: 'šŸ”Ŗ', + keywords: [ + 'cooking', + 'hocho', + 'knife', + 'tool', + 'weapon', + ], + }, + { + code: 'šŸŗ', + keywords: [ + 'amphora', + 'aquarius', + 'cooking', + 'drink', + 'jug', + 'tool', + 'weapon', + 'zodiac', + ], + }, + ], + }, + { + title: 'Travel & Places', + data: [ + { + code: 'šŸŒ', + keywords: [ + 'africa', + 'earth', + 'europe', + 'globe', + 'world', + ], + }, + { + code: 'šŸŒŽ', + keywords: [ + 'americas', + 'earth', + 'globe', + 'world', + ], + }, + { + code: 'šŸŒ', + keywords: [ + 'asia', + 'australia', + 'earth', + 'globe', + 'world', + ], + }, + { + code: 'šŸŒ', + keywords: [ + 'earth', + 'globe', + 'meridians', + 'world', + ], + }, + { + code: 'šŸ—ŗ', + keywords: [ + 'map', + 'world', + ], + }, + { + code: 'šŸ—¾', + keywords: [ + 'japan', + 'map', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'cold', + 'mountain', + 'snow', + ], + }, + { + code: 'ā›°', + keywords: [ + 'mountain', + ], + }, + { + code: 'šŸŒ‹', + keywords: [ + 'eruption', + 'mountain', + 'volcano', + 'weather', + ], + }, + { + code: 'šŸ—»', + keywords: [ + 'fuji', + 'mountain', + ], + }, + { + code: 'šŸ•', + keywords: [ + 'camping', + ], + }, + { + code: 'šŸ–', + keywords: [ + 'beach', + 'umbrella', + ], + }, + { + code: 'šŸœ', + keywords: [ + 'desert', + ], + }, + { + code: 'šŸ', + keywords: [ + 'desert', + 'island', + ], + }, + { + code: 'šŸž', + keywords: [ + 'national park', + 'park', + ], + }, + { + code: 'šŸŸ', + keywords: [ + 'stadium', + ], + }, + { + code: 'šŸ›', + keywords: [ + 'building', + 'classical', + ], + }, + { + code: 'šŸ—', + keywords: [ + 'building', + 'construction', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'building', + 'house', + ], + }, + { + code: 'šŸ™', + keywords: [ + 'building', + 'city', + ], + }, + { + code: 'šŸš', + keywords: [ + 'building', + 'derelict', + 'house', + ], + }, + { + code: 'šŸ ', + keywords: [ + 'building', + 'home', + 'house', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'building', + 'garden', + 'home', + 'house', + ], + }, + { + code: 'šŸ¢', + keywords: [ + 'building', + ], + }, + { + code: 'šŸ£', + keywords: [ + 'building', + 'japanese', + 'post', + ], + }, + { + code: 'šŸ¤', + keywords: [ + 'building', + 'european', + 'post', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'building', + 'doctor', + 'hospital', + 'medicine', + ], + }, + { + code: 'šŸ¦', + keywords: [ + 'bank', + 'building', + ], + }, + { + code: 'šŸØ', + keywords: [ + 'building', + 'hotel', + ], + }, + { + code: 'šŸ©', + keywords: [ + 'building', + 'hotel', + 'love', + ], + }, + { + code: 'šŸŖ', + keywords: [ + 'building', + 'convenience', + 'store', + ], + }, + { + code: 'šŸ«', + keywords: [ + 'building', + 'school', + ], + }, + { + code: 'šŸ¬', + keywords: [ + 'building', + 'department', + 'store', + ], + }, + { + code: 'šŸ­', + keywords: [ + 'building', + 'factory', + ], + }, + { + code: 'šŸÆ', + keywords: [ + 'building', + 'castle', + 'japanese', + ], + }, + { + code: 'šŸ°', + keywords: [ + 'building', + 'castle', + 'european', + ], + }, + { + code: 'šŸ’’', + keywords: [ + 'activity', + 'chapel', + 'romance', + 'wedding', + ], + }, + { + code: 'šŸ—¼', + keywords: [ + 'tokyo', + 'tower', + ], + }, + { + code: 'šŸ—½', + keywords: [ + 'liberty', + 'statue', + ], + }, + { + code: 'ā›Ŗ', + keywords: [ + 'building', + 'christian', + 'church', + 'cross', + 'religion', + ], + }, + { + code: 'šŸ•Œ', + keywords: [ + 'islam', + 'mosque', + 'muslim', + 'religion', + ], + }, + { + code: 'šŸ•', + keywords: [ + 'jew', + 'jewish', + 'religion', + 'synagogue', + 'temple', + ], + }, + { + code: 'ā›©', + keywords: [ + 'religion', + 'shinto', + 'shrine', + ], + }, + { + code: 'šŸ•‹', + keywords: [ + 'islam', + 'kaaba', + 'muslim', + 'religion', + ], + }, + { + code: 'ā›²', + keywords: [ + 'fountain', + ], + }, + { + code: 'ā›ŗ', + keywords: [ + 'camping', + 'tent', + ], + }, + { + code: 'šŸŒ', + keywords: [ + 'fog', + 'weather', + ], + }, + { + code: 'šŸŒƒ', + keywords: [ + 'night', + 'star', + 'weather', + ], + }, + { + code: 'šŸŒ„', + keywords: [ + 'morning', + 'mountain', + 'sun', + 'sunrise', + 'weather', + ], + }, + { + code: 'šŸŒ…', + keywords: [ + 'morning', + 'sun', + 'sunrise', + 'weather', + ], + }, + { + code: 'šŸŒ†', + keywords: [ + 'building', + 'city', + 'dusk', + 'evening', + 'landscape', + 'sun', + 'sunset', + 'weather', + ], + }, + { + code: 'šŸŒ‡', + keywords: [ + 'building', + 'dusk', + 'sun', + 'sunset', + 'weather', + ], + }, + { + code: 'šŸŒ‰', + keywords: [ + 'bridge', + 'night', + 'weather', + ], + }, + { + code: 'ā™Ø', + keywords: [ + 'hot', + 'hotsprings', + 'springs', + 'steaming', + ], + }, + { + code: 'šŸŒŒ', + keywords: [ + 'milky way', + 'space', + 'weather', + ], + }, + { + code: 'šŸŽ ', + keywords: [ + 'activity', + 'carousel', + 'entertainment', + 'horse', + ], + }, + { + code: 'šŸŽ”', + keywords: [ + 'activity', + 'amusement park', + 'entertainment', + 'ferris', + 'wheel', + ], + }, + { + code: 'šŸŽ¢', + keywords: [ + 'activity', + 'amusement park', + 'coaster', + 'entertainment', + 'roller', + ], + }, + { + code: 'šŸ’ˆ', + keywords: [ + 'barber', + 'haircut', + 'pole', + ], + }, + { + code: 'šŸŽŖ', + keywords: [ + 'activity', + 'circus', + 'entertainment', + 'tent', + ], + }, + { + code: 'šŸŽ­', + keywords: [ + 'activity', + 'art', + 'entertainment', + 'mask', + 'performing', + 'theater', + 'theatre', + ], + }, + { + code: 'šŸ–¼', + keywords: [ + 'art', + 'frame', + 'museum', + 'painting', + 'picture', + ], + }, + { + code: 'šŸŽØ', + keywords: [ + 'activity', + 'art', + 'entertainment', + 'museum', + 'painting', + 'palette', + ], + }, + { + code: 'šŸŽ°', + keywords: [ + 'activity', + 'game', + 'slot', + ], + }, + { + code: 'šŸš‚', + keywords: [ + 'engine', + 'locomotive', + 'railway', + 'steam', + 'train', + 'vehicle', + ], + }, + { + code: 'šŸšƒ', + keywords: [ + 'car', + 'electric', + 'railway', + 'train', + 'tram', + 'trolleybus', + 'vehicle', + ], + }, + { + code: 'šŸš„', + keywords: [ + 'railway', + 'shinkansen', + 'speed', + 'train', + 'vehicle', + ], + }, + { + code: 'šŸš…', + keywords: [ + 'bullet', + 'railway', + 'shinkansen', + 'speed', + 'train', + 'vehicle', + ], + }, + { + code: 'šŸš†', + keywords: [ + 'railway', + 'train', + 'vehicle', + ], + }, + { + code: 'šŸš‡', + keywords: [ + 'metro', + 'subway', + 'vehicle', + ], + }, + { + code: 'šŸšˆ', + keywords: [ + 'railway', + 'vehicle', + ], + }, + { + code: 'šŸš‰', + keywords: [ + 'railway', + 'station', + 'train', + 'vehicle', + ], + }, + { + code: 'šŸšŠ', + keywords: [ + 'tram', + 'trolleybus', + 'vehicle', + ], + }, + { + code: 'šŸš', + keywords: [ + 'monorail', + 'vehicle', + ], + }, + { + code: 'šŸšž', + keywords: [ + 'car', + 'mountain', + 'railway', + 'vehicle', + ], + }, + { + code: 'šŸš‹', + keywords: [ + 'car', + 'tram', + 'trolleybus', + 'vehicle', + ], + }, + { + code: 'šŸšŒ', + keywords: [ + 'bus', + 'vehicle', + ], + }, + { + code: 'šŸš', + keywords: [ + 'bus', + 'oncoming', + 'vehicle', + ], + }, + { + code: 'šŸšŽ', + keywords: [ + 'bus', + 'tram', + 'trolley', + 'trolleybus', + 'vehicle', + ], + }, + { + code: 'šŸš', + keywords: [ + 'bus', + 'busstop', + 'stop', + ], + }, + { + code: 'šŸš', + keywords: [ + 'bus', + 'minibus', + 'vehicle', + ], + }, + { + code: 'šŸš‘', + keywords: [ + 'ambulance', + 'vehicle', + ], + }, + { + code: 'šŸš’', + keywords: [ + 'engine', + 'fire', + 'truck', + 'vehicle', + ], + }, + { + code: 'šŸš“', + keywords: [ + 'car', + 'patrol', + 'police', + 'vehicle', + ], + }, + { + code: 'šŸš”', + keywords: [ + 'car', + 'oncoming', + 'police', + 'vehicle', + ], + }, + { + code: 'šŸš•', + keywords: [ + 'taxi', + 'vehicle', + ], + }, + { + code: 'šŸš–', + keywords: [ + 'oncoming', + 'taxi', + 'vehicle', + ], + }, + { + code: 'šŸš—', + keywords: [ + 'automobile', + 'car', + 'vehicle', + ], + }, + { + code: 'šŸš˜', + keywords: [ + 'automobile', + 'car', + 'oncoming', + 'vehicle', + ], + }, + { + code: 'šŸš™', + keywords: [ + 'recreational', + 'rv', + 'vehicle', + ], + }, + { + code: 'šŸšš', + keywords: [ + 'delivery', + 'truck', + 'vehicle', + ], + }, + { + code: 'šŸš›', + keywords: [ + 'lorry', + 'semi', + 'truck', + 'vehicle', + ], + }, + { + code: 'šŸšœ', + keywords: [ + 'tractor', + 'vehicle', + ], + }, + { + code: 'šŸš²', + keywords: [ + 'bicycle', + 'bike', + 'vehicle', + ], + }, + { + code: 'ā›½', + keywords: [ + 'fuel', + 'fuelpump', + 'gas', + 'pump', + 'station', + ], + }, + { + code: 'šŸ›£', + keywords: [ + 'highway', + 'motorway', + 'road', + ], + }, + { + code: 'šŸ›¤', + keywords: [ + 'railway', + 'train', + ], + }, + { + code: 'šŸšØ', + keywords: [ + 'beacon', + 'car', + 'light', + 'police', + 'revolving', + 'vehicle', + ], + }, + { + code: 'šŸš„', + keywords: [ + 'light', + 'signal', + 'traffic', + ], + }, + { + code: 'šŸš¦', + keywords: [ + 'light', + 'signal', + 'traffic', + ], + }, + { + code: 'šŸš§', + keywords: [ + 'barrier', + 'construction', + ], + }, + { + code: 'šŸ›‘', + keywords: [ + 'octagonal', + 'stop', + ], + }, + { + code: 'šŸ›“', + keywords: [ + 'kick', + 'scooter', + ], + }, + { + code: 'šŸ›µ', + keywords: [ + 'motor', + 'scooter', + ], + }, + { + code: 'āš“', + keywords: [ + 'anchor', + 'ship', + 'tool', + ], + }, + { + code: 'ā›µ', + keywords: [ + 'boat', + 'resort', + 'sailboat', + 'sea', + 'vehicle', + 'yacht', + ], + }, + { + code: 'šŸš£', + keywords: [ + 'boat', + 'rowboat', + 'vehicle', + ], + types: [ + 'šŸš£šŸæ', + 'šŸš£šŸ¾', + 'šŸš£šŸ½', + 'šŸš£šŸ¼', + 'šŸš£šŸ»', + ], + }, + { + code: 'šŸ›¶', + keywords: [ + 'boat', + 'canoe', + ], + }, + { + code: 'šŸš¤', + keywords: [ + 'boat', + 'speedboat', + 'vehicle', + ], + }, + { + code: 'šŸ›³', + keywords: [ + 'passenger', + 'ship', + 'vehicle', + ], + }, + { + code: 'ā›“', + keywords: [ + 'boat', + 'ferry', + ], + }, + { + code: 'šŸ›„', + keywords: [ + 'boat', + 'motorboat', + 'vehicle', + ], + }, + { + code: 'šŸš¢', + keywords: [ + 'ship', + 'vehicle', + ], + }, + { + code: 'āœˆ', + keywords: [ + 'airplane', + 'vehicle', + ], + }, + { + code: 'šŸ›©', + keywords: [ + 'airplane', + 'vehicle', + ], + }, + { + code: 'šŸ›«', + keywords: [ + 'airplane', + 'check-in', + 'departure', + 'departures', + 'vehicle', + ], + }, + { + code: 'šŸ›¬', + keywords: [ + 'airplane', + 'arrivals', + 'arriving', + 'landing', + 'vehicle', + ], + }, + { + code: 'šŸ’ŗ', + keywords: [ + 'chair', + 'seat', + ], + }, + { + code: 'šŸš', + keywords: [ + 'helicopter', + 'vehicle', + ], + }, + { + code: 'šŸšŸ', + keywords: [ + 'railway', + 'suspension', + 'vehicle', + ], + }, + { + code: 'šŸš ', + keywords: [ + 'cable', + 'gondola', + 'mountain', + 'vehicle', + ], + }, + { + code: 'šŸš”', + keywords: [ + 'aerial', + 'cable', + 'car', + 'gondola', + 'ropeway', + 'tramway', + 'vehicle', + ], + }, + { + code: 'šŸš€', + keywords: [ + 'rocket', + 'space', + 'vehicle', + ], + }, + { + code: 'šŸ›°', + keywords: [ + 'satellite', + 'space', + 'vehicle', + ], + }, + { + code: 'šŸ›Ž', + keywords: [ + 'bell', + 'bellhop', + 'hotel', + ], + }, + { + code: 'šŸšŖ', + keywords: [ + 'door', + ], + }, + { + code: 'šŸ›Œ', + keywords: [ + 'hotel', + 'sleep', + ], + }, + { + code: 'šŸ›', + keywords: [ + 'bed', + 'hotel', + 'sleep', + ], + }, + { + code: 'šŸ›‹', + keywords: [ + 'couch', + 'hotel', + 'lamp', + ], + }, + { + code: 'šŸš½', + keywords: [ + 'toilet', + ], + }, + { + code: 'šŸšæ', + keywords: [ + 'shower', + 'water', + ], + }, + { + code: 'šŸ›€', + keywords: [ + 'bath', + 'bathtub', + ], + types: [ + 'šŸ›€šŸæ', + 'šŸ›€šŸ¾', + 'šŸ›€šŸ½', + 'šŸ›€šŸ¼', + 'šŸ›€šŸ»', + ], + }, + { + code: 'šŸ›', + keywords: [ + 'bath', + 'bathtub', + ], + }, + { + code: 'āŒ›', + keywords: [ + 'hourglass', + 'sand', + 'timer', + ], + }, + { + code: 'ā³', + keywords: [ + 'hourglass', + 'sand', + 'timer', + ], + }, + { + code: 'āŒš', + keywords: [ + 'clock', + 'watch', + ], + }, + { + code: 'ā°', + keywords: [ + 'alarm', + 'clock', + ], + }, + { + code: 'ā±', + keywords: [ + 'clock', + 'stopwatch', + ], + }, + { + code: 'ā²', + keywords: [ + 'clock', + 'timer', + ], + }, + { + code: 'šŸ•°', + keywords: [ + 'clock', + ], + }, + { + code: 'šŸ•›', + keywords: [ + '00', + '12', + '12:00', + 'clock', + 'oā€™clock', + 'twelve', + ], + }, + { + code: 'šŸ•§', + keywords: [ + '12', + '12:30', + '30', + 'clock', + 'thirty', + 'twelve', + ], + }, + { + code: 'šŸ•', + keywords: [ + '00', + '1', + '1:00', + 'clock', + 'oā€™clock', + 'one', + ], + }, + { + code: 'šŸ•œ', + keywords: [ + '1', + '1:30', + '30', + 'clock', + 'one', + 'thirty', + ], + }, + { + code: 'šŸ•‘', + keywords: [ + '00', + '2', + '2:00', + 'clock', + 'oā€™clock', + 'two', + ], + }, + { + code: 'šŸ•', + keywords: [ + '2', + '2:30', + '30', + 'clock', + 'thirty', + 'two', + ], + }, + { + code: 'šŸ•’', + keywords: [ + '00', + '3', + '3:00', + 'clock', + 'oā€™clock', + 'three', + ], + }, + { + code: 'šŸ•ž', + keywords: [ + '3', + '3:30', + '30', + 'clock', + 'thirty', + 'three', + ], + }, + { + code: 'šŸ•“', + keywords: [ + '00', + '4', + '4:00', + 'clock', + 'four', + 'oā€™clock', + ], + }, + { + code: 'šŸ•Ÿ', + keywords: [ + '30', + '4', + '4:30', + 'clock', + 'four', + 'thirty', + ], + }, + { + code: 'šŸ•”', + keywords: [ + '00', + '5', + '5:00', + 'clock', + 'five', + 'oā€™clock', + ], + }, + { + code: 'šŸ• ', + keywords: [ + '30', + '5', + '5:30', + 'clock', + 'five', + 'thirty', + ], + }, + { + code: 'šŸ••', + keywords: [ + '00', + '6', + '6:00', + 'clock', + 'oā€™clock', + 'six', + ], + }, + { + code: 'šŸ•”', + keywords: [ + '30', + '6', + '6:30', + 'clock', + 'six', + 'thirty', + ], + }, + { + code: 'šŸ•–', + keywords: [ + '00', + '7', + '7:00', + 'clock', + 'oā€™clock', + 'seven', + ], + }, + { + code: 'šŸ•¢', + keywords: [ + '30', + '7', + '7:30', + 'clock', + 'seven', + 'thirty', + ], + }, + { + code: 'šŸ•—', + keywords: [ + '00', + '8', + '8:00', + 'clock', + 'eight', + 'oā€™clock', + ], + }, + { + code: 'šŸ•£', + keywords: [ + '30', + '8', + '8:30', + 'clock', + 'eight', + 'thirty', + ], + }, + { + code: 'šŸ•˜', + keywords: [ + '00', + '9', + '9:00', + 'clock', + 'nine', + 'oā€™clock', + ], + }, + { + code: 'šŸ•¤', + keywords: [ + '30', + '9', + '9:30', + 'clock', + 'nine', + 'thirty', + ], + }, + { + code: 'šŸ•™', + keywords: [ + '00', + '10', + '10:00', + 'clock', + 'oā€™clock', + 'ten', + ], + }, + { + code: 'šŸ•„', + keywords: [ + '10', + '10:30', + '30', + 'clock', + 'ten', + 'thirty', + ], + }, + { + code: 'šŸ•š', + keywords: [ + '00', + '11', + '11:00', + 'clock', + 'eleven', + 'oā€™clock', + ], + }, + { + code: 'šŸ•¦', + keywords: [ + '11', + '11:30', + '30', + 'clock', + 'eleven', + 'thirty', + ], + }, + { + code: 'šŸŒ‘', + keywords: [ + 'dark', + 'moon', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒ’', + keywords: [ + 'crescent', + 'moon', + 'space', + 'waxing', + 'weather', + ], + }, + { + code: 'šŸŒ“', + keywords: [ + 'moon', + 'quarter', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒ”', + keywords: [ + 'gibbous', + 'moon', + 'space', + 'waxing', + 'weather', + ], + }, + { + code: 'šŸŒ•', + keywords: [ + 'full', + 'moon', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒ–', + keywords: [ + 'gibbous', + 'moon', + 'space', + 'waning', + 'weather', + ], + }, + { + code: 'šŸŒ—', + keywords: [ + 'moon', + 'quarter', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒ˜', + keywords: [ + 'crescent', + 'moon', + 'space', + 'waning', + 'weather', + ], + }, + { + code: 'šŸŒ™', + keywords: [ + 'crescent', + 'moon', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒš', + keywords: [ + 'face', + 'moon', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒ›', + keywords: [ + 'face', + 'moon', + 'quarter', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒœ', + keywords: [ + 'face', + 'moon', + 'quarter', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒ”', + keywords: [ + 'thermometer', + 'weather', + ], + }, + { + code: 'ā˜€', + keywords: [ + 'bright', + 'rays', + 'space', + 'sun', + 'sunny', + 'weather', + ], + }, + { + code: 'šŸŒ', + keywords: [ + 'bright', + 'face', + 'full', + 'moon', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒž', + keywords: [ + 'bright', + 'face', + 'space', + 'sun', + 'weather', + ], + }, + { + code: 'ā­', + keywords: [ + 'star', + ], + }, + { + code: 'šŸŒŸ', + keywords: [ + 'glittery', + 'glow', + 'shining', + 'sparkle', + 'star', + ], + }, + { + code: 'šŸŒ ', + keywords: [ + 'activity', + 'falling', + 'shooting', + 'space', + 'star', + ], + }, + { + code: 'ā˜', + keywords: [ + 'cloud', + 'weather', + ], + }, + { + code: 'ā›…', + keywords: [ + 'cloud', + 'sun', + 'weather', + ], + }, + { + code: 'ā›ˆ', + keywords: [ + 'cloud', + 'rain', + 'thunder', + 'weather', + ], + }, + { + code: 'šŸŒ¤', + keywords: [ + 'cloud', + 'sun', + 'weather', + ], + }, + { + code: 'šŸŒ„', + keywords: [ + 'cloud', + 'sun', + 'weather', + ], + }, + { + code: 'šŸŒ¦', + keywords: [ + 'cloud', + 'rain', + 'sun', + 'weather', + ], + }, + { + code: 'šŸŒ§', + keywords: [ + 'cloud', + 'rain', + 'weather', + ], + }, + { + code: 'šŸŒØ', + keywords: [ + 'cloud', + 'cold', + 'snow', + 'weather', + ], + }, + { + code: 'šŸŒ©', + keywords: [ + 'cloud', + 'lightning', + 'weather', + ], + }, + { + code: 'šŸŒŖ', + keywords: [ + 'cloud', + 'tornado', + 'weather', + 'whirlwind', + ], + }, + { + code: 'šŸŒ«', + keywords: [ + 'cloud', + 'fog', + 'weather', + ], + }, + { + code: 'šŸŒ¬', + keywords: [ + 'blow', + 'cloud', + 'face', + 'weather', + 'wind', + ], + }, + { + code: 'šŸŒ€', + keywords: [ + 'cyclone', + 'dizzy', + 'twister', + 'typhoon', + 'weather', + ], + }, + { + code: 'šŸŒˆ', + keywords: [ + 'rain', + 'rainbow', + 'weather', + ], + }, + { + code: 'šŸŒ‚', + keywords: [ + 'clothing', + 'rain', + 'umbrella', + 'weather', + ], + }, + { + code: 'ā˜‚', + keywords: [ + 'clothing', + 'rain', + 'umbrella', + 'weather', + ], + }, + { + code: 'ā˜”', + keywords: [ + 'clothing', + 'drop', + 'rain', + 'umbrella', + 'weather', + ], + }, + { + code: 'ā›±', + keywords: [ + 'rain', + 'sun', + 'umbrella', + 'weather', + ], + }, + { + code: 'āš”', + keywords: [ + 'danger', + 'electric', + 'electricity', + 'lightning', + 'voltage', + 'zap', + ], + }, + { + code: 'ā„', + keywords: [ + 'cold', + 'snow', + 'snowflake', + 'weather', + ], + }, + { + code: 'ā˜ƒ', + keywords: [ + 'cold', + 'snow', + 'snowman', + 'weather', + ], + }, + { + code: 'ā›„', + keywords: [ + 'cold', + 'snow', + 'snowman', + 'weather', + ], + }, + { + code: 'ā˜„', + keywords: [ + 'comet', + 'space', + ], + }, + { + code: 'šŸ”„', + keywords: [ + 'fire', + 'flame', + 'tool', + ], + }, + { + code: 'šŸ’§', + keywords: [ + 'cold', + 'comic', + 'drop', + 'sweat', + 'weather', + ], + }, + { + code: 'šŸŒŠ', + keywords: [ + 'ocean', + 'water', + 'wave', + 'weather', + ], + }, + ], + }, + { + title: 'Activities', + data: [ + { + code: 'šŸŽƒ', + keywords: [ + 'activity', + 'celebration', + 'entertainment', + 'halloween', + 'jack', + 'lantern', + ], + }, + { + code: 'šŸŽ„', + keywords: [ + 'activity', + 'celebration', + 'christmas', + 'entertainment', + 'tree', + ], + }, + { + code: 'šŸŽ†', + keywords: [ + 'activity', + 'celebration', + 'entertainment', + 'fireworks', + ], + }, + { + code: 'šŸŽ‡', + keywords: [ + 'activity', + 'celebration', + 'entertainment', + 'fireworks', + 'sparkle', + ], + }, + { + code: 'āœØ', + keywords: [ + 'entertainment', + 'sparkle', + 'star', + ], + }, + { + code: 'šŸŽˆ', + keywords: [ + 'activity', + 'balloon', + 'celebration', + 'entertainment', + ], + }, + { + code: 'šŸŽ‰', + keywords: [ + 'activity', + 'celebration', + 'entertainment', + 'party', + 'popper', + 'tada', + ], + }, + { + code: 'šŸŽŠ', + keywords: [ + 'activity', + 'ball', + 'celebration', + 'confetti', + 'entertainment', + ], + }, + { + code: 'šŸŽ‹', + keywords: [ + 'activity', + 'banner', + 'celebration', + 'entertainment', + 'japanese', + 'tree', + ], + }, + { + code: 'šŸŽ', + keywords: [ + 'activity', + 'bamboo', + 'celebration', + 'japanese', + 'pine', + 'plant', + ], + }, + { + code: 'šŸŽŽ', + keywords: [ + 'activity', + 'celebration', + 'doll', + 'entertainment', + 'festival', + 'japanese', + ], + }, + { + code: 'šŸŽ', + keywords: [ + 'activity', + 'carp', + 'celebration', + 'entertainment', + 'flag', + 'streamer', + ], + }, + { + code: 'šŸŽ', + keywords: [ + 'activity', + 'bell', + 'celebration', + 'chime', + 'entertainment', + 'wind', + ], + }, + { + code: 'šŸŽ‘', + keywords: [ + 'activity', + 'celebration', + 'ceremony', + 'entertainment', + 'moon', + ], + }, + { + code: 'šŸŽ€', + keywords: [ + 'celebration', + 'ribbon', + ], + }, + { + code: 'šŸŽ', + keywords: [ + 'box', + 'celebration', + 'entertainment', + 'gift', + 'present', + 'wrapped', + ], + }, + { + code: 'šŸŽ—', + keywords: [ + 'celebration', + 'reminder', + 'ribbon', + ], + }, + { + code: 'šŸŽŸ', + keywords: [ + 'admission', + 'entertainment', + 'ticket', + ], + }, + { + code: 'šŸŽ«', + keywords: [ + 'activity', + 'admission', + 'entertainment', + 'ticket', + ], + }, + { + code: 'šŸŽ–', + keywords: [ + 'celebration', + 'medal', + 'military', + ], + }, + { + code: 'šŸ†', + keywords: [ + 'prize', + 'trophy', + ], + }, + { + code: 'šŸ…', + keywords: [ + 'medal', + ], + }, + { + code: 'šŸ„‡', + keywords: [ + 'first', + 'gold', + 'medal', + ], + }, + { + code: 'šŸ„ˆ', + keywords: [ + 'medal', + 'second', + 'silver', + ], + }, + { + code: 'šŸ„‰', + keywords: [ + 'bronze', + 'medal', + 'third', + ], + }, + { + code: 'āš½', + keywords: [ + 'ball', + 'soccer', + ], + }, + { + code: 'āš¾', + keywords: [ + 'ball', + 'baseball', + ], + }, + { + code: 'šŸ€', + keywords: [ + 'ball', + 'basketball', + 'hoop', + ], + }, + { + code: 'šŸ', + keywords: [ + 'ball', + 'game', + 'volleyball', + ], + }, + { + code: 'šŸˆ', + keywords: [ + 'american', + 'ball', + 'football', + ], + }, + { + code: 'šŸ‰', + keywords: [ + 'ball', + 'football', + 'rugby', + ], + }, + { + code: 'šŸŽ¾', + keywords: [ + 'ball', + 'racquet', + 'tennis', + ], + }, + { + code: 'šŸŽ±', + keywords: [ + '8', + '8 ball', + 'ball', + 'billiard', + 'eight', + 'game', + ], + }, + { + code: 'šŸŽ³', + keywords: [ + 'ball', + 'bowling', + 'game', + ], + }, + { + code: 'šŸ', + keywords: [ + 'ball', + 'bat', + 'cricket', + 'game', + ], + }, + { + code: 'šŸ‘', + keywords: [ + 'ball', + 'field', + 'game', + 'hockey', + 'stick', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'game', + 'hockey', + 'ice', + 'puck', + 'stick', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'ball', + 'bat', + 'game', + 'paddle', + 'table tennis', + ], + }, + { + code: 'šŸø', + keywords: [ + 'badminton', + 'birdie', + 'game', + 'racquet', + 'shuttlecock', + ], + }, + { + code: 'šŸ„Š', + keywords: [ + 'boxing', + 'glove', + ], + }, + { + code: 'šŸ„‹', + keywords: [ + 'judo', + 'karate', + 'martial arts', + 'taekwondo', + 'uniform', + ], + }, + { + code: 'ā›³', + keywords: [ + 'flag', + 'golf', + 'hole', + ], + }, + { + code: 'šŸŒ', + keywords: [ + 'ball', + 'golf', + ], + }, + { + code: 'ā›ø', + keywords: [ + 'ice', + 'skate', + ], + }, + { + code: 'šŸŽ£', + keywords: [ + 'entertainment', + 'fish', + 'pole', + ], + }, + { + code: 'šŸŽ½', + keywords: [ + 'running', + 'sash', + 'shirt', + ], + }, + { + code: 'šŸŽæ', + keywords: [ + 'ski', + 'snow', + ], + }, + { + code: 'ā›·', + keywords: [ + 'ski', + 'snow', + ], + }, + { + code: 'šŸ‚', + keywords: [ + 'ski', + 'snow', + 'snowboard', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'surfer', + 'surfing', + ], + types: [ + 'šŸ„šŸæ', + 'šŸ„šŸ¾', + 'šŸ„šŸ½', + 'šŸ„šŸ¼', + 'šŸ„šŸ»', + ], + }, + { + code: 'šŸ‡', + keywords: [ + 'horse', + 'jockey', + 'racehorse', + 'racing', + ], + }, + { + code: 'šŸŠ', + keywords: [ + 'swim', + 'swimmer', + ], + types: [ + 'šŸŠšŸæ', + 'šŸŠšŸ¾', + 'šŸŠšŸ½', + 'šŸŠšŸ¼', + 'šŸŠšŸ»', + ], + }, + { + code: 'ā›¹', + keywords: [ + 'ball', + ], + types: [ + 'ā›¹šŸæ', + 'ā›¹šŸ¾', + 'ā›¹šŸ½', + 'ā›¹šŸ¼', + 'ā›¹šŸ»', + ], + }, + { + code: 'šŸ‹', + keywords: [ + 'lifter', + 'weight', + ], + types: [ + 'šŸ‹šŸæ', + 'šŸ‹šŸ¾', + 'šŸ‹šŸ½', + 'šŸ‹šŸ¼', + 'šŸ‹šŸ»', + ], + }, + { + code: 'šŸš“', + keywords: [ + 'bicycle', + 'bicyclist', + 'bike', + 'cyclist', + ], + types: [ + 'šŸš“šŸæ', + 'šŸš“šŸ¾', + 'šŸš“šŸ½', + 'šŸš“šŸ¼', + 'šŸš“šŸ»', + ], + }, + { + code: 'šŸšµ', + keywords: [ + 'bicycle', + 'bicyclist', + 'bike', + 'cyclist', + 'mountain', + ], + types: [ + 'šŸšµšŸæ', + 'šŸšµšŸ¾', + 'šŸšµšŸ½', + 'šŸšµšŸ¼', + 'šŸšµšŸ»', + ], + }, + { + code: 'šŸŽ', + keywords: [ + 'car', + 'racing', + ], + }, + { + code: 'šŸ', + keywords: [ + 'motorcycle', + 'racing', + ], + }, + { + code: 'šŸ¤ø', + keywords: [ + 'cartwheel', + 'gymnastics', + ], + types: [ + 'šŸ¤øšŸæ', + 'šŸ¤øšŸ¾', + 'šŸ¤øšŸ½', + 'šŸ¤øšŸ¼', + 'šŸ¤øšŸ»', + ], + }, + { + code: 'šŸ¤¼', + keywords: [ + 'wrestle', + 'wrestler', + ], + types: [ + 'šŸ¤¼šŸæ', + 'šŸ¤¼šŸ¾', + 'šŸ¤¼šŸ½', + 'šŸ¤¼šŸ¼', + 'šŸ¤¼šŸ»', + ], + }, + { + code: 'šŸ¤½', + keywords: [ + 'polo', + 'water', + ], + types: [ + 'šŸ¤½šŸæ', + 'šŸ¤½šŸ¾', + 'šŸ¤½šŸ½', + 'šŸ¤½šŸ¼', + 'šŸ¤½šŸ»', + ], + }, + { + code: 'šŸ¤¾', + keywords: [ + 'ball', + 'handball', + ], + types: [ + 'šŸ¤¾šŸæ', + 'šŸ¤¾šŸ¾', + 'šŸ¤¾šŸ½', + 'šŸ¤¾šŸ¼', + 'šŸ¤¾šŸ»', + ], + }, + { + code: 'šŸ¤ŗ', + keywords: [ + 'fencer', + 'fencing', + 'sword', + ], + }, + { + code: 'šŸ„…', + keywords: [ + 'goal', + 'net', + ], + }, + { + code: 'šŸ¤¹', + keywords: [ + 'balance', + 'juggle', + 'multitask', + 'skill', + ], + types: [ + 'šŸ¤¹šŸæ', + 'šŸ¤¹šŸ¾', + 'šŸ¤¹šŸ½', + 'šŸ¤¹šŸ¼', + 'šŸ¤¹šŸ»', + ], + }, + { + code: 'šŸŽÆ', + keywords: [ + 'activity', + 'bull', + 'bullseye', + 'dart', + 'entertainment', + 'eye', + 'game', + 'hit', + 'target', + ], + }, + { + code: 'šŸŽ®', + keywords: [ + 'controller', + 'entertainment', + 'game', + 'video game', + ], + }, + { + code: 'šŸ•¹', + keywords: [ + 'entertainment', + 'game', + 'joystick', + 'video game', + ], + }, + { + code: 'šŸŽ²', + keywords: [ + 'dice', + 'die', + 'entertainment', + 'game', + ], + }, + { + code: 'ā™ ', + keywords: [ + 'card', + 'game', + 'spade', + 'suit', + ], + }, + { + code: 'ā™„', + keywords: [ + 'card', + 'game', + 'heart', + 'hearts', + 'suit', + ], + }, + { + code: 'ā™¦', + keywords: [ + 'card', + 'diamond', + 'diamonds', + 'game', + 'suit', + ], + }, + { + code: 'ā™£', + keywords: [ + 'card', + 'club', + 'clubs', + 'game', + 'suit', + ], + }, + { + code: 'šŸƒ', + keywords: [ + 'card', + 'entertainment', + 'game', + 'joker', + 'playing', + ], + }, + { + code: 'šŸ€„', + keywords: [ + 'game', + 'mahjong', + 'red', + ], + }, + { + code: 'šŸŽ“', + keywords: [ + 'activity', + 'card', + 'entertainment', + 'flower', + 'game', + 'japanese', + 'playing', + ], + }, + ], + }, + { + title: 'Objects', + data: [ + { + code: 'šŸ”‡', + keywords: [ + 'mute', + 'quiet', + 'silent', + 'speaker', + 'volume', + ], + }, + { + code: 'šŸ”ˆ', + keywords: [ + 'speaker', + 'volume', + ], + }, + { + code: 'šŸ”‰', + keywords: [ + 'low', + 'speaker', + 'volume', + 'wave', + ], + }, + { + code: 'šŸ”Š', + keywords: [ + '3', + 'entertainment', + 'high', + 'loud', + 'speaker', + 'three', + 'volume', + ], + }, + { + code: 'šŸ“¢', + keywords: [ + 'communication', + 'loud', + 'loudspeaker', + 'public address', + ], + }, + { + code: 'šŸ“£', + keywords: [ + 'cheering', + 'communication', + 'megaphone', + ], + }, + { + code: 'šŸ“Æ', + keywords: [ + 'communication', + 'entertainment', + 'horn', + 'post', + 'postal', + ], + }, + { + code: 'šŸ””', + keywords: [ + 'bell', + ], + }, + { + code: 'šŸ”•', + keywords: [ + 'bell', + 'forbidden', + 'mute', + 'no', + 'not', + 'prohibited', + 'quiet', + 'silent', + ], + }, + { + code: 'šŸŽ¼', + keywords: [ + 'activity', + 'entertainment', + 'music', + 'score', + ], + }, + { + code: 'šŸŽµ', + keywords: [ + 'activity', + 'entertainment', + 'music', + 'note', + ], + }, + { + code: 'šŸŽ¶', + keywords: [ + 'activity', + 'entertainment', + 'music', + 'note', + 'notes', + ], + }, + { + code: 'šŸŽ™', + keywords: [ + 'mic', + 'microphone', + 'music', + 'studio', + ], + }, + { + code: 'šŸŽš', + keywords: [ + 'level', + 'music', + 'slider', + ], + }, + { + code: 'šŸŽ›', + keywords: [ + 'control', + 'knobs', + 'music', + ], + }, + { + code: 'šŸŽ¤', + keywords: [ + 'activity', + 'entertainment', + 'karaoke', + 'mic', + 'microphone', + ], + }, + { + code: 'šŸŽ§', + keywords: [ + 'activity', + 'earbud', + 'entertainment', + 'headphone', + ], + }, + { + code: 'šŸ“»', + keywords: [ + 'entertainment', + 'radio', + 'video', + ], + }, + { + code: 'šŸŽ·', + keywords: [ + 'activity', + 'entertainment', + 'instrument', + 'music', + 'sax', + 'saxophone', + ], + }, + { + code: 'šŸŽø', + keywords: [ + 'activity', + 'entertainment', + 'guitar', + 'instrument', + 'music', + ], + }, + { + code: 'šŸŽ¹', + keywords: [ + 'activity', + 'entertainment', + 'instrument', + 'keyboard', + 'music', + 'piano', + ], + }, + { + code: 'šŸŽŗ', + keywords: [ + 'activity', + 'entertainment', + 'instrument', + 'music', + 'trumpet', + ], + }, + { + code: 'šŸŽ»', + keywords: [ + 'activity', + 'entertainment', + 'instrument', + 'music', + 'violin', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'drum', + 'drumsticks', + 'music', + ], + }, + { + code: 'šŸ“±', + keywords: [ + 'cell', + 'communication', + 'mobile', + 'phone', + 'telephone', + ], + }, + { + code: 'šŸ“²', + keywords: [ + 'arrow', + 'call', + 'cell', + 'communication', + 'mobile', + 'phone', + 'receive', + 'telephone', + ], + }, + { + code: 'ā˜Ž', + keywords: [ + 'phone', + 'telephone', + ], + }, + { + code: 'šŸ“ž', + keywords: [ + 'communication', + 'phone', + 'receiver', + 'telephone', + ], + }, + { + code: 'šŸ“Ÿ', + keywords: [ + 'communication', + 'pager', + ], + }, + { + code: 'šŸ“ ', + keywords: [ + 'communication', + 'fax', + ], + }, + { + code: 'šŸ”‹', + keywords: [ + 'battery', + ], + }, + { + code: 'šŸ”Œ', + keywords: [ + 'electric', + 'electricity', + 'plug', + ], + }, + { + code: 'šŸ’»', + keywords: [ + 'computer', + 'pc', + 'personal', + ], + }, + { + code: 'šŸ–„', + keywords: [ + 'computer', + 'desktop', + ], + }, + { + code: 'šŸ–Ø', + keywords: [ + 'computer', + 'printer', + ], + }, + { + code: 'āŒØ', + keywords: [ + 'computer', + 'keyboard', + ], + }, + { + code: 'šŸ–±', + keywords: [ + '3', + 'button', + 'computer', + 'mouse', + 'three', + ], + }, + { + code: 'šŸ–²', + keywords: [ + 'computer', + 'trackball', + ], + }, + { + code: 'šŸ’½', + keywords: [ + 'computer', + 'disk', + 'entertainment', + 'minidisk', + 'optical', + ], + }, + { + code: 'šŸ’¾', + keywords: [ + 'computer', + 'disk', + 'floppy', + ], + }, + { + code: 'šŸ’æ', + keywords: [ + 'blu-ray', + 'cd', + 'computer', + 'disk', + 'dvd', + 'optical', + ], + }, + { + code: 'šŸ“€', + keywords: [ + 'blu-ray', + 'cd', + 'computer', + 'disk', + 'dvd', + 'entertainment', + 'optical', + ], + }, + { + code: 'šŸŽ„', + keywords: [ + 'activity', + 'camera', + 'cinema', + 'entertainment', + 'movie', + ], + }, + { + code: 'šŸŽž', + keywords: [ + 'cinema', + 'entertainment', + 'film', + 'frames', + 'movie', + ], + }, + { + code: 'šŸ“½', + keywords: [ + 'cinema', + 'entertainment', + 'film', + 'movie', + 'projector', + 'video', + ], + }, + { + code: 'šŸŽ¬', + keywords: [ + 'activity', + 'clapper', + 'entertainment', + 'movie', + ], + }, + { + code: 'šŸ“ŗ', + keywords: [ + 'entertainment', + 'television', + 'tv', + 'video', + ], + }, + { + code: 'šŸ“·', + keywords: [ + 'camera', + 'entertainment', + 'video', + ], + }, + { + code: 'šŸ“ø', + keywords: [ + 'camera', + 'flash', + 'video', + ], + }, + { + code: 'šŸ“¹', + keywords: [ + 'camera', + 'entertainment', + 'video', + ], + }, + { + code: 'šŸ“¼', + keywords: [ + 'entertainment', + 'tape', + 'vhs', + 'video', + 'videocassette', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'glass', + 'magnifying', + 'search', + 'tool', + ], + }, + { + code: 'šŸ”Ž', + keywords: [ + 'glass', + 'magnifying', + 'search', + 'tool', + ], + }, + { + code: 'šŸ”¬', + keywords: [ + 'microscope', + 'tool', + ], + }, + { + code: 'šŸ”­', + keywords: [ + 'telescope', + 'tool', + ], + }, + { + code: 'šŸ“”', + keywords: [ + 'antenna', + 'communication', + 'dish', + 'satellite', + ], + }, + { + code: 'šŸ•Æ', + keywords: [ + 'candle', + 'light', + ], + }, + { + code: 'šŸ’”', + keywords: [ + 'bulb', + 'comic', + 'electric', + 'idea', + 'light', + ], + }, + { + code: 'šŸ”¦', + keywords: [ + 'electric', + 'flashlight', + 'light', + 'tool', + 'torch', + ], + }, + { + code: 'šŸ®', + keywords: [ + 'bar', + 'japanese', + 'lantern', + 'light', + 'red', + ], + }, + { + code: 'šŸ“”', + keywords: [ + 'book', + 'cover', + 'decorated', + 'notebook', + ], + }, + { + code: 'šŸ“•', + keywords: [ + 'book', + 'closed', + ], + }, + { + code: 'šŸ“–', + keywords: [ + 'book', + 'open', + ], + }, + { + code: 'šŸ“—', + keywords: [ + 'book', + 'green', + ], + }, + { + code: 'šŸ“˜', + keywords: [ + 'blue', + 'book', + ], + }, + { + code: 'šŸ“™', + keywords: [ + 'book', + 'orange', + ], + }, + { + code: 'šŸ“š', + keywords: [ + 'book', + 'books', + ], + }, + { + code: 'šŸ““', + keywords: [ + 'notebook', + ], + }, + { + code: 'šŸ“’', + keywords: [ + 'ledger', + 'notebook', + ], + }, + { + code: 'šŸ“ƒ', + keywords: [ + 'curl', + 'document', + 'page', + ], + }, + { + code: 'šŸ“œ', + keywords: [ + 'paper', + 'scroll', + ], + }, + { + code: 'šŸ“„', + keywords: [ + 'document', + 'page', + ], + }, + { + code: 'šŸ“°', + keywords: [ + 'communication', + 'news', + 'newspaper', + 'paper', + ], + }, + { + code: 'šŸ—ž', + keywords: [ + 'news', + 'newspaper', + 'paper', + 'rolled', + ], + }, + { + code: 'šŸ“‘', + keywords: [ + 'bookmark', + 'mark', + 'marker', + 'tabs', + ], + }, + { + code: 'šŸ”–', + keywords: [ + 'bookmark', + 'mark', + ], + }, + { + code: 'šŸ·', + keywords: [ + 'label', + ], + }, + { + code: 'šŸ’°', + keywords: [ + 'bag', + 'dollar', + 'money', + 'moneybag', + ], + }, + { + code: 'šŸ’“', + keywords: [ + 'bank', + 'banknote', + 'bill', + 'currency', + 'money', + 'note', + 'yen', + ], + }, + { + code: 'šŸ’µ', + keywords: [ + 'bank', + 'banknote', + 'bill', + 'currency', + 'dollar', + 'money', + 'note', + ], + }, + { + code: 'šŸ’¶', + keywords: [ + 'bank', + 'banknote', + 'bill', + 'currency', + 'euro', + 'money', + 'note', + ], + }, + { + code: 'šŸ’·', + keywords: [ + 'bank', + 'banknote', + 'bill', + 'currency', + 'money', + 'note', + 'pound', + ], + }, + { + code: 'šŸ’ø', + keywords: [ + 'bank', + 'banknote', + 'bill', + 'dollar', + 'fly', + 'money', + 'note', + 'wings', + ], + }, + { + code: 'šŸ’³', + keywords: [ + 'bank', + 'card', + 'credit', + 'money', + ], + }, + { + code: 'šŸ’¹', + keywords: [ + 'bank', + 'chart', + 'currency', + 'graph', + 'growth', + 'market', + 'money', + 'rise', + 'trend', + 'upward', + 'yen', + ], + }, + { + code: 'šŸ’±', + keywords: [ + 'bank', + 'currency', + 'exchange', + 'money', + ], + }, + { + code: 'šŸ’²', + keywords: [ + 'currency', + 'dollar', + 'money', + ], + }, + { + code: 'āœ‰', + keywords: [ + 'e-mail', + 'email', + 'envelope', + ], + }, + { + code: 'šŸ“§', + keywords: [ + 'communication', + 'e-mail', + 'email', + 'letter', + 'mail', + ], + }, + { + code: 'šŸ“Ø', + keywords: [ + 'communication', + 'e-mail', + 'email', + 'envelope', + 'incoming', + 'letter', + 'mail', + 'receive', + ], + }, + { + code: 'šŸ“©', + keywords: [ + 'arrow', + 'communication', + 'down', + 'e-mail', + 'email', + 'envelope', + 'letter', + 'mail', + 'outgoing', + 'sent', + ], + }, + { + code: 'šŸ“¤', + keywords: [ + 'box', + 'communication', + 'letter', + 'mail', + 'outbox', + 'sent', + 'tray', + ], + }, + { + code: 'šŸ“„', + keywords: [ + 'box', + 'communication', + 'inbox', + 'letter', + 'mail', + 'receive', + 'tray', + ], + }, + { + code: 'šŸ“¦', + keywords: [ + 'box', + 'communication', + 'package', + 'parcel', + ], + }, + { + code: 'šŸ“«', + keywords: [ + 'closed', + 'communication', + 'flag', + 'mail', + 'mailbox', + 'postbox', + ], + }, + { + code: 'šŸ“Ŗ', + keywords: [ + 'closed', + 'communication', + 'flag', + 'lowered', + 'mail', + 'mailbox', + 'postbox', + ], + }, + { + code: 'šŸ“¬', + keywords: [ + 'communication', + 'flag', + 'mail', + 'mailbox', + 'open', + 'postbox', + ], + }, + { + code: 'šŸ“­', + keywords: [ + 'communication', + 'flag', + 'lowered', + 'mail', + 'mailbox', + 'open', + 'postbox', + ], + }, + { + code: 'šŸ“®', + keywords: [ + 'communication', + 'mail', + 'mailbox', + 'postbox', + ], + }, + { + code: 'šŸ—³', + keywords: [ + 'ballot', + 'box', + ], + }, + { + code: 'āœ', + keywords: [ + 'pencil', + ], + }, + { + code: 'āœ’', + keywords: [ + 'nib', + 'pen', + ], + }, + { + code: 'šŸ–‹', + keywords: [ + 'communication', + 'fountain', + 'pen', + ], + }, + { + code: 'šŸ–Š', + keywords: [ + 'ballpoint', + 'communication', + 'pen', + ], + }, + { + code: 'šŸ–Œ', + keywords: [ + 'communication', + 'paintbrush', + 'painting', + ], + }, + { + code: 'šŸ–', + keywords: [ + 'communication', + 'crayon', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'communication', + 'memo', + 'pencil', + ], + }, + { + code: 'šŸ’¼', + keywords: [ + 'briefcase', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'file', + 'folder', + ], + }, + { + code: 'šŸ“‚', + keywords: [ + 'file', + 'folder', + 'open', + ], + }, + { + code: 'šŸ—‚', + keywords: [ + 'card', + 'dividers', + 'index', + ], + }, + { + code: 'šŸ“…', + keywords: [ + 'calendar', + 'date', + ], + }, + { + code: 'šŸ“†', + keywords: [ + 'calendar', + ], + }, + { + code: 'šŸ—’', + keywords: [ + 'note', + 'pad', + 'spiral', + ], + }, + { + code: 'šŸ—“', + keywords: [ + 'calendar', + 'pad', + 'spiral', + ], + }, + { + code: 'šŸ“‡', + keywords: [ + 'card', + 'index', + 'rolodex', + ], + }, + { + code: 'šŸ“ˆ', + keywords: [ + 'chart', + 'graph', + 'growth', + 'trend', + 'upward', + ], + }, + { + code: 'šŸ“‰', + keywords: [ + 'chart', + 'down', + 'graph', + 'trend', + ], + }, + { + code: 'šŸ“Š', + keywords: [ + 'bar', + 'chart', + 'graph', + ], + }, + { + code: 'šŸ“‹', + keywords: [ + 'clipboard', + ], + }, + { + code: 'šŸ“Œ', + keywords: [ + 'pin', + 'pushpin', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'pin', + 'pushpin', + ], + }, + { + code: 'šŸ“Ž', + keywords: [ + 'paperclip', + ], + }, + { + code: 'šŸ–‡', + keywords: [ + 'communication', + 'link', + 'paperclip', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'ruler', + 'straight edge', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'ruler', + 'set', + 'triangle', + ], + }, + { + code: 'āœ‚', + keywords: [ + 'scissors', + 'tool', + ], + }, + { + code: 'šŸ—ƒ', + keywords: [ + 'box', + 'card', + 'file', + ], + }, + { + code: 'šŸ—„', + keywords: [ + 'cabinet', + 'file', + ], + }, + { + code: 'šŸ—‘', + keywords: [ + 'wastebasket', + ], + }, + { + code: 'šŸ”’', + keywords: [ + 'closed', + 'lock', + ], + }, + { + code: 'šŸ”“', + keywords: [ + 'lock', + 'open', + 'unlock', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'ink', + 'lock', + 'nib', + 'pen', + 'privacy', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'closed', + 'key', + 'lock', + 'secure', + ], + }, + { + code: 'šŸ”‘', + keywords: [ + 'key', + 'lock', + 'password', + ], + }, + { + code: 'šŸ—', + keywords: [ + 'clue', + 'key', + 'lock', + 'old', + ], + }, + { + code: 'šŸ”Ø', + keywords: [ + 'hammer', + 'tool', + ], + }, + { + code: 'ā›', + keywords: [ + 'mining', + 'pick', + 'tool', + ], + }, + { + code: 'āš’', + keywords: [ + 'hammer', + 'pick', + 'tool', + ], + }, + { + code: 'šŸ› ', + keywords: [ + 'hammer', + 'tool', + 'wrench', + ], + }, + { + code: 'šŸ—”', + keywords: [ + 'dagger', + 'knife', + 'weapon', + ], + }, + { + code: 'āš”', + keywords: [ + 'crossed', + 'swords', + 'weapon', + ], + }, + { + code: 'šŸ”«', + keywords: [ + 'gun', + 'handgun', + 'pistol', + 'revolver', + 'tool', + 'weapon', + ], + }, + { + code: 'šŸ¹', + keywords: [ + 'archer', + 'arrow', + 'bow', + 'sagittarius', + 'tool', + 'weapon', + 'zodiac', + ], + }, + { + code: 'šŸ›”', + keywords: [ + 'shield', + 'weapon', + ], + }, + { + code: 'šŸ”§', + keywords: [ + 'tool', + 'wrench', + ], + }, + { + code: 'šŸ”©', + keywords: [ + 'bolt', + 'nut', + 'tool', + ], + }, + { + code: 'āš™', + keywords: [ + 'gear', + 'tool', + ], + }, + { + code: 'šŸ—œ', + keywords: [ + 'compression', + 'tool', + 'vice', + ], + }, + { + code: 'āš—', + keywords: [ + 'alembic', + 'chemistry', + 'tool', + ], + }, + { + code: 'āš–', + keywords: [ + 'balance', + 'justice', + 'libra', + 'scales', + 'tool', + 'weight', + 'zodiac', + ], + }, + { + code: 'šŸ”—', + keywords: [ + 'link', + ], + }, + { + code: 'ā›“', + keywords: [ + 'chain', + ], + }, + { + code: 'šŸ’‰', + keywords: [ + 'doctor', + 'medicine', + 'needle', + 'shot', + 'sick', + 'syringe', + 'tool', + ], + }, + { + code: 'šŸ’Š', + keywords: [ + 'doctor', + 'medicine', + 'pill', + 'sick', + ], + }, + { + code: 'šŸš¬', + keywords: [ + 'activity', + 'smoking', + ], + }, + { + code: 'āš°', + keywords: [ + 'coffin', + 'death', + ], + }, + { + code: 'āš±', + keywords: [ + 'death', + 'funeral', + 'urn', + ], + }, + { + code: 'šŸ—æ', + keywords: [ + 'face', + 'moyai', + 'statue', + ], + }, + { + code: 'šŸ›¢', + keywords: [ + 'drum', + 'oil', + ], + }, + { + code: 'šŸ”®', + keywords: [ + 'ball', + 'crystal', + 'fairy tale', + 'fantasy', + 'fortune', + 'tool', + ], + }, + { + code: 'šŸ›’', + keywords: [ + 'cart', + 'shopping', + 'trolley', + ], + }, + ], + }, + { + title: 'Symbols', + data: [ + { + code: 'šŸ§', + keywords: [ + 'atm', + 'automated', + 'bank', + 'teller', + ], + }, + { + code: 'šŸš®', + keywords: [ + 'litter', + 'litterbox', + ], + }, + { + code: 'šŸš°', + keywords: [ + 'drink', + 'potable', + 'water', + ], + }, + { + code: 'ā™æ', + keywords: [ + 'access', + 'wheelchair', + ], + }, + { + code: 'šŸš¹', + keywords: [ + 'lavatory', + 'man', + 'restroom', + 'wc', + ], + }, + { + code: 'šŸšŗ', + keywords: [ + 'lavatory', + 'restroom', + 'wc', + 'woman', + ], + }, + { + code: 'šŸš»', + keywords: [ + 'lavatory', + 'restroom', + 'wc', + ], + }, + { + code: 'šŸš¼', + keywords: [ + 'baby', + 'changing', + ], + }, + { + code: 'šŸš¾', + keywords: [ + 'closet', + 'lavatory', + 'restroom', + 'water', + 'wc', + ], + }, + { + code: 'šŸ›‚', + keywords: [ + 'control', + 'passport', + ], + }, + { + code: 'šŸ›ƒ', + keywords: [ + 'customs', + ], + }, + { + code: 'šŸ›„', + keywords: [ + 'baggage', + 'claim', + ], + }, + { + code: 'šŸ›…', + keywords: [ + 'baggage', + 'left luggage', + 'locker', + 'luggage', + ], + }, + { + code: 'āš ', + keywords: [ + 'warning', + ], + }, + { + code: 'šŸšø', + keywords: [ + 'child', + 'crossing', + 'pedestrian', + 'traffic', + ], + }, + { + code: 'ā›”', + keywords: [ + 'entry', + 'forbidden', + 'no', + 'not', + 'prohibited', + 'traffic', + ], + }, + { + code: 'šŸš«', + keywords: [ + 'entry', + 'forbidden', + 'no', + 'not', + 'prohibited', + ], + }, + { + code: 'šŸš³', + keywords: [ + 'bicycle', + 'bike', + 'forbidden', + 'no', + 'not', + 'prohibited', + 'vehicle', + ], + }, + { + code: 'šŸš­', + keywords: [ + 'forbidden', + 'no', + 'not', + 'prohibited', + 'smoking', + ], + }, + { + code: 'šŸšÆ', + keywords: [ + 'forbidden', + 'litter', + 'no', + 'not', + 'prohibited', + ], + }, + { + code: 'šŸš±', + keywords: [ + 'drink', + 'forbidden', + 'no', + 'not', + 'potable', + 'prohibited', + 'water', + ], + }, + { + code: 'šŸš·', + keywords: [ + 'forbidden', + 'no', + 'not', + 'pedestrian', + 'prohibited', + ], + }, + { + code: 'šŸ“µ', + keywords: [ + 'cell', + 'communication', + 'forbidden', + 'mobile', + 'no', + 'not', + 'phone', + 'prohibited', + 'telephone', + ], + }, + { + code: 'šŸ”ž', + keywords: [ + '18', + 'age restriction', + 'eighteen', + 'forbidden', + 'no', + 'not', + 'prohibited', + 'underage', + ], + }, + { + code: 'ā˜¢', + keywords: [ + 'radioactive', + ], + }, + { + code: 'ā˜£', + keywords: [ + 'biohazard', + ], + }, + { + code: 'ā¬†', + keywords: [ + 'arrow', + 'cardinal', + 'direction', + 'north', + ], + }, + { + code: 'ā†—', + keywords: [ + 'arrow', + 'direction', + 'intercardinal', + 'northeast', + ], + }, + { + code: 'āž”', + keywords: [ + 'arrow', + 'cardinal', + 'direction', + 'east', + ], + }, + { + code: 'ā†˜', + keywords: [ + 'arrow', + 'direction', + 'intercardinal', + 'southeast', + ], + }, + { + code: 'ā¬‡', + keywords: [ + 'arrow', + 'cardinal', + 'direction', + 'down', + 'south', + ], + }, + { + code: 'ā†™', + keywords: [ + 'arrow', + 'direction', + 'intercardinal', + 'southwest', + ], + }, + { + code: 'ā¬…', + keywords: [ + 'arrow', + 'cardinal', + 'direction', + 'west', + ], + }, + { + code: 'ā†–', + keywords: [ + 'arrow', + 'direction', + 'intercardinal', + 'northwest', + ], + }, + { + code: 'ā†•', + keywords: [ + 'arrow', + ], + }, + { + code: 'ā†”', + keywords: [ + 'arrow', + ], + }, + { + code: 'ā†©', + keywords: [ + 'arrow', + ], + }, + { + code: 'ā†Ŗ', + keywords: [ + 'arrow', + ], + }, + { + code: 'ā¤“', + keywords: [ + 'arrow', + ], + }, + { + code: 'ā¤µ', + keywords: [ + 'arrow', + 'down', + ], + }, + { + code: 'šŸ”ƒ', + keywords: [ + 'arrow', + 'clockwise', + 'reload', + ], + }, + { + code: 'šŸ”„', + keywords: [ + 'anticlockwise', + 'arrow', + 'counterclockwise', + 'withershins', + ], + }, + { + code: 'šŸ”™', + keywords: [ + 'arrow', + 'back', + ], + }, + { + code: 'šŸ”š', + keywords: [ + 'arrow', + 'end', + ], + }, + { + code: 'šŸ”›', + keywords: [ + 'arrow', + 'mark', + 'on', + ], + }, + { + code: 'šŸ”œ', + keywords: [ + 'arrow', + 'soon', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'arrow', + 'top', + 'up', + ], + }, + { + code: 'šŸ›', + keywords: [ + 'religion', + 'worship', + ], + }, + { + code: 'āš›', + keywords: [ + 'atheist', + 'atom', + ], + }, + { + code: 'šŸ•‰', + keywords: [ + 'hindu', + 'om', + 'religion', + ], + }, + { + code: 'āœ”', + keywords: [ + 'david', + 'jew', + 'jewish', + 'religion', + 'star', + ], + }, + { + code: 'ā˜ø', + keywords: [ + 'buddhist', + 'dharma', + 'religion', + 'wheel', + ], + }, + { + code: 'ā˜Æ', + keywords: [ + 'religion', + 'tao', + 'taoist', + 'yang', + 'yin', + ], + }, + { + code: 'āœ', + keywords: [ + 'christian', + 'cross', + 'religion', + ], + }, + { + code: 'ā˜¦', + keywords: [ + 'christian', + 'cross', + 'religion', + ], + }, + { + code: 'ā˜Ŗ', + keywords: [ + 'islam', + 'muslim', + 'religion', + ], + }, + { + code: 'ā˜®', + keywords: [ + 'peace', + ], + }, + { + code: 'šŸ•Ž', + keywords: [ + 'candelabrum', + 'candlestick', + 'menorah', + 'religion', + ], + }, + { + code: 'šŸ”Æ', + keywords: [ + 'fortune', + 'star', + ], + }, + { + code: 'ā™»', + keywords: [ + 'recycle', + ], + }, + { + code: 'šŸ“›', + keywords: [ + 'badge', + 'name', + ], + }, + { + code: 'āšœ', + keywords: [ + 'fleur-de-lis', + ], + }, + { + code: 'šŸ”°', + keywords: [ + 'beginner', + 'chevron', + 'green', + 'japanese', + 'leaf', + 'tool', + 'yellow', + ], + }, + { + code: 'šŸ”±', + keywords: [ + 'anchor', + 'emblem', + 'ship', + 'tool', + 'trident', + ], + }, + { + code: 'ā­•', + keywords: [ + 'circle', + 'o', + ], + }, + { + code: 'āœ…', + keywords: [ + 'check', + 'mark', + ], + }, + { + code: 'ā˜‘', + keywords: [ + 'ballot', + 'box', + 'check', + ], + }, + { + code: 'āœ”', + keywords: [ + 'check', + 'mark', + ], + }, + { + code: 'āœ–', + keywords: [ + 'cancel', + 'multiplication', + 'multiply', + 'x', + ], + }, + { + code: 'āŒ', + keywords: [ + 'cancel', + 'mark', + 'multiplication', + 'multiply', + 'x', + ], + }, + { + code: 'āŽ', + keywords: [ + 'mark', + 'square', + ], + }, + { + code: 'āž•', + keywords: [ + 'math', + 'plus', + ], + }, + { + code: 'āž–', + keywords: [ + 'math', + 'minus', + ], + }, + { + code: 'āž—', + keywords: [ + 'division', + 'math', + ], + }, + { + code: 'āž°', + keywords: [ + 'curl', + 'loop', + ], + }, + { + code: 'āžæ', + keywords: [ + 'curl', + 'double', + 'loop', + ], + }, + { + code: 'ć€½', + keywords: [ + 'mark', + 'part', + ], + }, + { + code: 'āœ³', + keywords: [ + 'asterisk', + ], + }, + { + code: 'āœ“', + keywords: [ + 'star', + ], + }, + { + code: 'ā‡', + keywords: [ + 'sparkle', + ], + }, + { + code: 'ā€¼', + keywords: [ + 'bangbang', + 'exclamation', + 'mark', + 'punctuation', + ], + }, + { + code: 'ā‰', + keywords: [ + 'exclamation', + 'interrobang', + 'mark', + 'punctuation', + 'question', + ], + }, + { + code: 'ā“', + keywords: [ + 'mark', + 'punctuation', + 'question', + ], + }, + { + code: 'ā”', + keywords: [ + 'mark', + 'outlined', + 'punctuation', + 'question', + ], + }, + { + code: 'ā•', + keywords: [ + 'exclamation', + 'mark', + 'outlined', + 'punctuation', + ], + }, + { + code: 'ā—', + keywords: [ + 'exclamation', + 'mark', + 'punctuation', + ], + }, + { + code: '怰', + keywords: [ + 'dash', + 'punctuation', + 'wavy', + ], + }, + { + code: 'Ā©', + keywords: [ + 'copyright', + ], + }, + { + code: 'Ā®', + keywords: [ + 'registered', + ], + }, + { + code: 'ā„¢', + keywords: [ + 'mark', + 'tm', + 'trademark', + ], + }, + { + code: 'ā™ˆ', + keywords: [ + 'aries', + 'ram', + 'zodiac', + ], + }, + { + code: 'ā™‰', + keywords: [ + 'bull', + 'ox', + 'taurus', + 'zodiac', + ], + }, + { + code: 'ā™Š', + keywords: [ + 'gemini', + 'twins', + 'zodiac', + ], + }, + { + code: 'ā™‹', + keywords: [ + 'cancer', + 'crab', + 'zodiac', + ], + }, + { + code: 'ā™Œ', + keywords: [ + 'leo', + 'lion', + 'zodiac', + ], + }, + { + code: 'ā™', + keywords: [ + 'maiden', + 'virgin', + 'virgo', + 'zodiac', + ], + }, + { + code: 'ā™Ž', + keywords: [ + 'balance', + 'justice', + 'libra', + 'scales', + 'zodiac', + ], + }, + { + code: 'ā™', + keywords: [ + 'scorpio', + 'scorpion', + 'scorpius', + 'zodiac', + ], + }, + { + code: 'ā™', + keywords: [ + 'archer', + 'sagittarius', + 'zodiac', + ], + }, + { + code: 'ā™‘', + keywords: [ + 'capricorn', + 'goat', + 'zodiac', + ], + }, + { + code: 'ā™’', + keywords: [ + 'aquarius', + 'bearer', + 'water', + 'zodiac', + ], + }, + { + code: 'ā™“', + keywords: [ + 'fish', + 'pisces', + 'zodiac', + ], + }, + { + code: 'ā›Ž', + keywords: [ + 'bearer', + 'ophiuchus', + 'serpent', + 'snake', + 'zodiac', + ], + }, + { + code: 'šŸ”€', + keywords: [ + 'arrow', + 'crossed', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'arrow', + 'clockwise', + 'repeat', + ], + }, + { + code: 'šŸ”‚', + keywords: [ + 'arrow', + 'clockwise', + 'once', + ], + }, + { + code: 'ā–¶', + keywords: [ + 'arrow', + 'play', + 'right', + 'triangle', + ], + }, + { + code: 'ā©', + keywords: [ + 'arrow', + 'double', + 'fast', + 'forward', + ], + }, + { + code: 'ā­', + keywords: [ + 'arrow', + 'next scene', + 'next track', + 'triangle', + ], + }, + { + code: 'āÆ', + keywords: [ + 'arrow', + 'pause', + 'play', + 'right', + 'triangle', + ], + }, + { + code: 'ā—€', + keywords: [ + 'arrow', + 'left', + 'reverse', + 'triangle', + ], + }, + { + code: 'āŖ', + keywords: [ + 'arrow', + 'double', + 'rewind', + ], + }, + { + code: 'ā®', + keywords: [ + 'arrow', + 'previous scene', + 'previous track', + 'triangle', + ], + }, + { + code: 'šŸ”¼', + keywords: [ + 'arrow', + 'button', + 'red', + ], + }, + { + code: 'ā«', + keywords: [ + 'arrow', + 'double', + ], + }, + { + code: 'šŸ”½', + keywords: [ + 'arrow', + 'button', + 'down', + 'red', + ], + }, + { + code: 'ā¬', + keywords: [ + 'arrow', + 'double', + 'down', + ], + }, + { + code: 'āø', + keywords: [ + 'bar', + 'double', + 'pause', + 'vertical', + ], + }, + { + code: 'ā¹', + keywords: [ + 'square', + 'stop', + ], + }, + { + code: 'āŗ', + keywords: [ + 'circle', + 'record', + ], + }, + { + code: 'ā', + keywords: [ + 'eject', + ], + }, + { + code: 'šŸŽ¦', + keywords: [ + 'activity', + 'camera', + 'cinema', + 'entertainment', + 'film', + 'movie', + ], + }, + { + code: 'šŸ”…', + keywords: [ + 'brightness', + 'dim', + 'low', + ], + }, + { + code: 'šŸ”†', + keywords: [ + 'bright', + 'brightness', + ], + }, + { + code: 'šŸ“¶', + keywords: [ + 'antenna', + 'bar', + 'cell', + 'communication', + 'mobile', + 'phone', + 'signal', + 'telephone', + ], + }, + { + code: 'šŸ“³', + keywords: [ + 'cell', + 'communication', + 'mobile', + 'mode', + 'phone', + 'telephone', + 'vibration', + ], + }, + { + code: 'šŸ““', + keywords: [ + 'cell', + 'communication', + 'mobile', + 'off', + 'phone', + 'telephone', + ], + }, + { + code: '#ļøāƒ£', + keywords: [ + 'hash', + 'keycap', + 'pound', + ], + }, + { + code: '*ļøāƒ£', + keywords: [ + 'asterisk', + 'keycap', + 'star', + ], + }, + { + code: '0ļøāƒ£', + keywords: [ + '0', + 'keycap', + 'zero', + ], + }, + { + code: '1ļøāƒ£', + keywords: [ + '1', + 'keycap', + 'one', + ], + }, + { + code: '2ļøāƒ£', + keywords: [ + '2', + 'keycap', + 'two', + ], + }, + { + code: '3ļøāƒ£', + keywords: [ + '3', + 'keycap', + 'three', + ], + }, + { + code: '4ļøāƒ£', + keywords: [ + '4', + 'four', + 'keycap', + ], + }, + { + code: '5ļøāƒ£', + keywords: [ + '5', + 'five', + 'keycap', + ], + }, + { + code: '6ļøāƒ£', + keywords: [ + '6', + 'keycap', + 'six', + ], + }, + { + code: '7ļøāƒ£', + keywords: [ + '7', + 'keycap', + 'seven', + ], + }, + { + code: '8ļøāƒ£', + keywords: [ + '8', + 'eight', + 'keycap', + ], + }, + { + code: '9ļøāƒ£', + keywords: [ + '9', + 'keycap', + 'nine', + ], + }, + { + code: 'šŸ”Ÿ', + keywords: [ + '10', + 'keycap', + 'ten', + ], + }, + { + code: 'šŸ’Æ', + keywords: [ + '100', + 'full', + 'hundred', + 'score', + ], + }, + { + code: 'šŸ” ', + keywords: [ + 'input', + 'latin', + 'letters', + 'uppercase', + ], + }, + { + code: 'šŸ””', + keywords: [ + 'abcd', + 'input', + 'latin', + 'letters', + 'lowercase', + ], + }, + { + code: 'šŸ”¢', + keywords: [ + '1234', + 'input', + 'numbers', + ], + }, + { + code: 'šŸ”£', + keywords: [ + 'input', + ], + }, + { + code: 'šŸ”¤', + keywords: [ + 'abc', + 'alphabet', + 'input', + 'latin', + 'letters', + ], + }, + { + code: 'šŸ…°', + keywords: [ + 'a', + 'blood', + ], + }, + { + code: 'šŸ†Ž', + keywords: [ + 'ab', + 'blood', + ], + }, + { + code: 'šŸ…±', + keywords: [ + 'b', + 'blood', + ], + }, + { + code: 'šŸ†‘', + keywords: [ + 'cl', + ], + }, + { + code: 'šŸ†’', + keywords: [ + 'cool', + ], + }, + { + code: 'šŸ†“', + keywords: [ + 'free', + ], + }, + { + code: 'ā„¹', + keywords: [ + 'i', + 'information', + ], + }, + { + code: 'šŸ†”', + keywords: [ + 'id', + 'identity', + ], + }, + { + code: 'ā“‚', + keywords: [ + 'circle', + 'm', + ], + }, + { + code: 'šŸ†•', + keywords: [ + 'new', + ], + }, + { + code: 'šŸ†–', + keywords: [ + 'ng', + ], + }, + { + code: 'šŸ…¾', + keywords: [ + 'blood', + 'o', + ], + }, + { + code: 'šŸ†—', + keywords: [ + 'ok', + ], + }, + { + code: 'šŸ…æ', + keywords: [ + 'parking', + ], + }, + { + code: 'šŸ†˜', + keywords: [ + 'help', + 'sos', + ], + }, + { + code: 'šŸ†™', + keywords: [ + 'mark', + 'up', + ], + }, + { + code: 'šŸ†š', + keywords: [ + 'versus', + 'vs', + ], + }, + { + code: 'šŸˆ', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸˆ‚', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸˆ·', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸˆ¶', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸˆÆ', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸ‰', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸˆ¹', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸˆš', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸˆ²', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸ‰‘', + keywords: [ + 'chinese', + ], + }, + { + code: 'šŸˆø', + keywords: [ + 'chinese', + ], + }, + { + code: 'šŸˆ“', + keywords: [ + 'chinese', + ], + }, + { + code: 'šŸˆ³', + keywords: [ + 'chinese', + ], + }, + { + code: '抗', + keywords: [ + 'chinese', + 'congratulation', + 'congratulations', + 'ideograph', + ], + }, + { + code: '抙', + keywords: [ + 'chinese', + 'ideograph', + 'secret', + ], + }, + { + code: 'šŸˆŗ', + keywords: [ + 'chinese', + ], + }, + { + code: 'šŸˆµ', + keywords: [ + 'chinese', + ], + }, + { + code: 'ā–Ŗ', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'ā–«', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'ā—»', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'ā—¼', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'ā—½', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'ā—¾', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'ā¬›', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'ā¬œ', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'šŸ”¶', + keywords: [ + 'diamond', + 'geometric', + 'orange', + ], + }, + { + code: 'šŸ”·', + keywords: [ + 'blue', + 'diamond', + 'geometric', + ], + }, + { + code: 'šŸ”ø', + keywords: [ + 'diamond', + 'geometric', + 'orange', + ], + }, + { + code: 'šŸ”¹', + keywords: [ + 'blue', + 'diamond', + 'geometric', + ], + }, + { + code: 'šŸ”ŗ', + keywords: [ + 'geometric', + 'red', + ], + }, + { + code: 'šŸ”»', + keywords: [ + 'down', + 'geometric', + 'red', + ], + }, + { + code: 'šŸ’ ', + keywords: [ + 'comic', + 'diamond', + 'geometric', + 'inside', + ], + }, + { + code: 'šŸ”˜', + keywords: [ + 'button', + 'geometric', + 'radio', + ], + }, + { + code: 'šŸ”²', + keywords: [ + 'button', + 'geometric', + 'square', + ], + }, + { + code: 'šŸ”³', + keywords: [ + 'button', + 'geometric', + 'outlined', + 'square', + ], + }, + { + code: 'āšŖ', + keywords: [ + 'circle', + 'geometric', + ], + }, + { + code: 'āš«', + keywords: [ + 'circle', + 'geometric', + ], + }, + { + code: 'šŸ”“', + keywords: [ + 'circle', + 'geometric', + 'red', + ], + }, + { + code: 'šŸ”µ', + keywords: [ + 'blue', + 'circle', + 'geometric', + ], + }, + ], + }, + { + title: 'Flags', + data: [ + { + code: 'šŸ', + keywords: [ + 'checkered', + 'chequered', + 'flag', + 'racing', + ], + }, + { + code: 'šŸš©', + keywords: [ + 'flag', + 'post', + ], + }, + { + code: 'šŸŽŒ', + keywords: [ + 'activity', + 'celebration', + 'cross', + 'crossed', + 'flag', + 'japanese', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'flag', + 'waving', + ], + }, + { + code: 'šŸ³', + keywords: [ + 'flag', + 'waving', + ], + }, + { + code: 'šŸ‡¦šŸ‡Ø', + keywords: [ + 'ascension', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡¦šŸ‡©', + keywords: [ + 'andorra', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡Ŗ', + keywords: [ + 'emirates', + 'flag', + 'uae', + 'united', + ], + }, + { + code: 'šŸ‡¦šŸ‡«', + keywords: [ + 'afghanistan', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡¬', + keywords: [ + 'antigua', + 'barbuda', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡®', + keywords: [ + 'anguilla', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡±', + keywords: [ + 'albania', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡²', + keywords: [ + 'armenia', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡“', + keywords: [ + 'angola', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡¶', + keywords: [ + 'antarctica', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡·', + keywords: [ + 'argentina', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡ø', + keywords: [ + 'american', + 'flag', + 'samoa', + ], + }, + { + code: 'šŸ‡¦šŸ‡¹', + keywords: [ + 'austria', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡ŗ', + keywords: [ + 'australia', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡¼', + keywords: [ + 'aruba', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡½', + keywords: [ + 'Ć„land', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡æ', + keywords: [ + 'azerbaijan', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡¦', + keywords: [ + 'bosnia', + 'flag', + 'herzegovina', + ], + }, + { + code: 'šŸ‡§šŸ‡§', + keywords: [ + 'barbados', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡©', + keywords: [ + 'bangladesh', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡Ŗ', + keywords: [ + 'belgium', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡«', + keywords: [ + 'burkina faso', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡¬', + keywords: [ + 'bulgaria', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡­', + keywords: [ + 'bahrain', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡®', + keywords: [ + 'burundi', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡Æ', + keywords: [ + 'benin', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡±', + keywords: [ + 'barthelemy', + 'barthĆ©lemy', + 'flag', + 'saint', + ], + }, + { + code: 'šŸ‡§šŸ‡²', + keywords: [ + 'bermuda', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡³', + keywords: [ + 'brunei', + 'darussalam', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡“', + keywords: [ + 'bolivia', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡¶', + keywords: [ + 'bonaire', + 'caribbean', + 'eustatius', + 'flag', + 'netherlands', + 'saba', + 'sint', + ], + }, + { + code: 'šŸ‡§šŸ‡·', + keywords: [ + 'brazil', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡ø', + keywords: [ + 'bahamas', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡¹', + keywords: [ + 'bhutan', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡»', + keywords: [ + 'bouvet', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡§šŸ‡¼', + keywords: [ + 'botswana', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡¾', + keywords: [ + 'belarus', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡æ', + keywords: [ + 'belize', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡¦', + keywords: [ + 'canada', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡Ø', + keywords: [ + 'cocos', + 'flag', + 'island', + 'keeling', + ], + }, + { + code: 'šŸ‡ØšŸ‡©', + keywords: [ + 'congo', + 'congo-kinshasa', + 'democratic republic of congo', + 'drc', + 'flag', + 'kinshasa', + 'republic', + ], + }, + { + code: 'šŸ‡ØšŸ‡«', + keywords: [ + 'central african republic', + 'flag', + 'republic', + ], + }, + { + code: 'šŸ‡ØšŸ‡¬', + keywords: [ + 'brazzaville', + 'congo', + 'congo republic', + 'congo-brazzaville', + 'flag', + 'republic', + 'republic of the congo', + ], + }, + { + code: 'šŸ‡ØšŸ‡­', + keywords: [ + 'flag', + 'switzerland', + ], + }, + { + code: 'šŸ‡ØšŸ‡®', + keywords: [ + 'cote ivoire', + 'cĆ“te ivoire', + 'flag', + 'ivory coast', + ], + }, + { + code: 'šŸ‡ØšŸ‡°', + keywords: [ + 'cook', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡ØšŸ‡±', + keywords: [ + 'chile', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡²', + keywords: [ + 'cameroon', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡³', + keywords: [ + 'china', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡“', + keywords: [ + 'colombia', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡µ', + keywords: [ + 'clipperton', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡ØšŸ‡·', + keywords: [ + 'costa rica', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡ŗ', + keywords: [ + 'cuba', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡»', + keywords: [ + 'cabo', + 'cape', + 'flag', + 'verde', + ], + }, + { + code: 'šŸ‡ØšŸ‡¼', + keywords: [ + 'antilles', + 'curacao', + 'curaƧao', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡½', + keywords: [ + 'christmas', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡ØšŸ‡¾', + keywords: [ + 'cyprus', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡æ', + keywords: [ + 'czech republic', + 'flag', + ], + }, + { + code: 'šŸ‡©šŸ‡Ŗ', + keywords: [ + 'flag', + 'germany', + ], + }, + { + code: 'šŸ‡©šŸ‡¬', + keywords: [ + 'diego garcia', + 'flag', + ], + }, + { + code: 'šŸ‡©šŸ‡Æ', + keywords: [ + 'djibouti', + 'flag', + ], + }, + { + code: 'šŸ‡©šŸ‡°', + keywords: [ + 'denmark', + 'flag', + ], + }, + { + code: 'šŸ‡©šŸ‡²', + keywords: [ + 'dominica', + 'flag', + ], + }, + { + code: 'šŸ‡©šŸ‡“', + keywords: [ + 'dominican republic', + 'flag', + ], + }, + { + code: 'šŸ‡©šŸ‡æ', + keywords: [ + 'algeria', + 'flag', + ], + }, + { + code: 'šŸ‡ŖšŸ‡¦', + keywords: [ + 'ceuta', + 'flag', + 'melilla', + ], + }, + { + code: 'šŸ‡ŖšŸ‡Ø', + keywords: [ + 'ecuador', + 'flag', + ], + }, + { + code: 'šŸ‡ŖšŸ‡Ŗ', + keywords: [ + 'estonia', + 'flag', + ], + }, + { + code: 'šŸ‡ŖšŸ‡¬', + keywords: [ + 'egypt', + 'flag', + ], + }, + { + code: 'šŸ‡ŖšŸ‡­', + keywords: [ + 'flag', + 'sahara', + 'west', + 'western sahara', + ], + }, + { + code: 'šŸ‡ŖšŸ‡·', + keywords: [ + 'eritrea', + 'flag', + ], + }, + { + code: 'šŸ‡ŖšŸ‡ø', + keywords: [ + 'flag', + 'spain', + ], + }, + { + code: 'šŸ‡ŖšŸ‡¹', + keywords: [ + 'ethiopia', + 'flag', + ], + }, + { + code: 'šŸ‡ŖšŸ‡ŗ', + keywords: [ + 'european union', + 'flag', + ], + }, + { + code: 'šŸ‡«šŸ‡®', + keywords: [ + 'finland', + 'flag', + ], + }, + { + code: 'šŸ‡«šŸ‡Æ', + keywords: [ + 'fiji', + 'flag', + ], + }, + { + code: 'šŸ‡«šŸ‡°', + keywords: [ + 'falkland', + 'falklands', + 'flag', + 'island', + 'islas', + 'malvinas', + ], + }, + { + code: 'šŸ‡«šŸ‡²', + keywords: [ + 'flag', + 'micronesia', + ], + }, + { + code: 'šŸ‡«šŸ‡“', + keywords: [ + 'faroe', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡«šŸ‡·', + keywords: [ + 'flag', + 'france', + ], + }, + { + code: 'šŸ‡¬šŸ‡¦', + keywords: [ + 'flag', + 'gabon', + ], + }, + { + code: 'šŸ‡¬šŸ‡§', + keywords: [ + 'britain', + 'british', + 'cornwall', + 'england', + 'flag', + 'great britain', + 'ireland', + 'northern ireland', + 'scotland', + 'uk', + 'union jack', + 'united', + 'united kingdom', + 'wales', + ], + }, + { + code: 'šŸ‡¬šŸ‡©', + keywords: [ + 'flag', + 'grenada', + ], + }, + { + code: 'šŸ‡¬šŸ‡Ŗ', + keywords: [ + 'flag', + 'georgia', + ], + }, + { + code: 'šŸ‡¬šŸ‡«', + keywords: [ + 'flag', + 'french', + 'guiana', + ], + }, + { + code: 'šŸ‡¬šŸ‡¬', + keywords: [ + 'flag', + 'guernsey', + ], + }, + { + code: 'šŸ‡¬šŸ‡­', + keywords: [ + 'flag', + 'ghana', + ], + }, + { + code: 'šŸ‡¬šŸ‡®', + keywords: [ + 'flag', + 'gibraltar', + ], + }, + { + code: 'šŸ‡¬šŸ‡±', + keywords: [ + 'flag', + 'greenland', + ], + }, + { + code: 'šŸ‡¬šŸ‡²', + keywords: [ + 'flag', + 'gambia', + ], + }, + { + code: 'šŸ‡¬šŸ‡³', + keywords: [ + 'flag', + 'guinea', + ], + }, + { + code: 'šŸ‡¬šŸ‡µ', + keywords: [ + 'flag', + 'guadeloupe', + ], + }, + { + code: 'šŸ‡¬šŸ‡¶', + keywords: [ + 'equatorial guinea', + 'flag', + 'guinea', + ], + }, + { + code: 'šŸ‡¬šŸ‡·', + keywords: [ + 'flag', + 'greece', + ], + }, + { + code: 'šŸ‡¬šŸ‡ø', + keywords: [ + 'flag', + 'georgia', + 'island', + 'south', + 'south georgia', + 'south sandwich', + ], + }, + { + code: 'šŸ‡¬šŸ‡¹', + keywords: [ + 'flag', + 'guatemala', + ], + }, + { + code: 'šŸ‡¬šŸ‡ŗ', + keywords: [ + 'flag', + 'guam', + ], + }, + { + code: 'šŸ‡¬šŸ‡¼', + keywords: [ + 'bissau', + 'flag', + 'guinea', + ], + }, + { + code: 'šŸ‡¬šŸ‡¾', + keywords: [ + 'flag', + 'guyana', + ], + }, + { + code: 'šŸ‡­šŸ‡°', + keywords: [ + 'china', + 'flag', + 'hong kong', + ], + }, + { + code: 'šŸ‡­šŸ‡²', + keywords: [ + 'flag', + 'heard', + 'island', + 'mcdonald', + ], + }, + { + code: 'šŸ‡­šŸ‡³', + keywords: [ + 'flag', + 'honduras', + ], + }, + { + code: 'šŸ‡­šŸ‡·', + keywords: [ + 'croatia', + 'flag', + ], + }, + { + code: 'šŸ‡­šŸ‡¹', + keywords: [ + 'flag', + 'haiti', + ], + }, + { + code: 'šŸ‡­šŸ‡ŗ', + keywords: [ + 'flag', + 'hungary', + ], + }, + { + code: 'šŸ‡®šŸ‡Ø', + keywords: [ + 'canary', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡®šŸ‡©', + keywords: [ + 'flag', + 'indonesia', + ], + }, + { + code: 'šŸ‡®šŸ‡Ŗ', + keywords: [ + 'flag', + 'ireland', + ], + }, + { + code: 'šŸ‡®šŸ‡±', + keywords: [ + 'flag', + 'israel', + ], + }, + { + code: 'šŸ‡®šŸ‡²', + keywords: [ + 'flag', + 'isle of man', + ], + }, + { + code: 'šŸ‡®šŸ‡³', + keywords: [ + 'flag', + 'india', + ], + }, + { + code: 'šŸ‡®šŸ‡“', + keywords: [ + 'british', + 'chagos', + 'flag', + 'indian ocean', + 'island', + ], + }, + { + code: 'šŸ‡®šŸ‡¶', + keywords: [ + 'flag', + 'iraq', + ], + }, + { + code: 'šŸ‡®šŸ‡·', + keywords: [ + 'flag', + 'iran', + ], + }, + { + code: 'šŸ‡®šŸ‡ø', + keywords: [ + 'flag', + 'iceland', + ], + }, + { + code: 'šŸ‡®šŸ‡¹', + keywords: [ + 'flag', + 'italy', + ], + }, + { + code: 'šŸ‡ÆšŸ‡Ŗ', + keywords: [ + 'flag', + 'jersey', + ], + }, + { + code: 'šŸ‡ÆšŸ‡²', + keywords: [ + 'flag', + 'jamaica', + ], + }, + { + code: 'šŸ‡ÆšŸ‡“', + keywords: [ + 'flag', + 'jordan', + ], + }, + { + code: 'šŸ‡ÆšŸ‡µ', + keywords: [ + 'flag', + 'japan', + ], + }, + { + code: 'šŸ‡°šŸ‡Ŗ', + keywords: [ + 'flag', + 'kenya', + ], + }, + { + code: 'šŸ‡°šŸ‡¬', + keywords: [ + 'flag', + 'kyrgyzstan', + ], + }, + { + code: 'šŸ‡°šŸ‡­', + keywords: [ + 'cambodia', + 'flag', + ], + }, + { + code: 'šŸ‡°šŸ‡®', + keywords: [ + 'flag', + 'kiribati', + ], + }, + { + code: 'šŸ‡°šŸ‡²', + keywords: [ + 'comoros', + 'flag', + ], + }, + { + code: 'šŸ‡°šŸ‡³', + keywords: [ + 'flag', + 'kitts', + 'nevis', + 'saint', + ], + }, + { + code: 'šŸ‡°šŸ‡µ', + keywords: [ + 'flag', + 'korea', + 'north', + 'north korea', + ], + }, + { + code: 'šŸ‡°šŸ‡·', + keywords: [ + 'flag', + 'korea', + 'south', + 'south korea', + ], + }, + { + code: 'šŸ‡°šŸ‡¼', + keywords: [ + 'flag', + 'kuwait', + ], + }, + { + code: 'šŸ‡°šŸ‡¾', + keywords: [ + 'cayman', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡°šŸ‡æ', + keywords: [ + 'flag', + 'kazakhstan', + ], + }, + { + code: 'šŸ‡±šŸ‡¦', + keywords: [ + 'flag', + 'laos', + ], + }, + { + code: 'šŸ‡±šŸ‡§', + keywords: [ + 'flag', + 'lebanon', + ], + }, + { + code: 'šŸ‡±šŸ‡Ø', + keywords: [ + 'flag', + 'lucia', + 'saint', + ], + }, + { + code: 'šŸ‡±šŸ‡®', + keywords: [ + 'flag', + 'liechtenstein', + ], + }, + { + code: 'šŸ‡±šŸ‡°', + keywords: [ + 'flag', + 'sri lanka', + ], + }, + { + code: 'šŸ‡±šŸ‡·', + keywords: [ + 'flag', + 'liberia', + ], + }, + { + code: 'šŸ‡±šŸ‡ø', + keywords: [ + 'flag', + 'lesotho', + ], + }, + { + code: 'šŸ‡±šŸ‡¹', + keywords: [ + 'flag', + 'lithuania', + ], + }, + { + code: 'šŸ‡±šŸ‡ŗ', + keywords: [ + 'flag', + 'luxembourg', + ], + }, + { + code: 'šŸ‡±šŸ‡»', + keywords: [ + 'flag', + 'latvia', + ], + }, + { + code: 'šŸ‡±šŸ‡¾', + keywords: [ + 'flag', + 'libya', + ], + }, + { + code: 'šŸ‡²šŸ‡¦', + keywords: [ + 'flag', + 'morocco', + ], + }, + { + code: 'šŸ‡²šŸ‡Ø', + keywords: [ + 'flag', + 'monaco', + ], + }, + { + code: 'šŸ‡²šŸ‡©', + keywords: [ + 'flag', + 'moldova', + ], + }, + { + code: 'šŸ‡²šŸ‡Ŗ', + keywords: [ + 'flag', + 'montenegro', + ], + }, + { + code: 'šŸ‡²šŸ‡«', + keywords: [ + 'flag', + 'french', + 'martin', + 'saint', + ], + }, + { + code: 'šŸ‡²šŸ‡¬', + keywords: [ + 'flag', + 'madagascar', + ], + }, + { + code: 'šŸ‡²šŸ‡­', + keywords: [ + 'flag', + 'island', + 'marshall', + ], + }, + { + code: 'šŸ‡²šŸ‡°', + keywords: [ + 'flag', + 'macedonia', + ], + }, + { + code: 'šŸ‡²šŸ‡±', + keywords: [ + 'flag', + 'mali', + ], + }, + { + code: 'šŸ‡²šŸ‡²', + keywords: [ + 'burma', + 'flag', + 'myanmar', + ], + }, + { + code: 'šŸ‡²šŸ‡³', + keywords: [ + 'flag', + 'mongolia', + ], + }, + { + code: 'šŸ‡²šŸ‡“', + keywords: [ + 'china', + 'flag', + 'macao', + 'macau', + ], + }, + { + code: 'šŸ‡²šŸ‡µ', + keywords: [ + 'flag', + 'island', + 'mariana', + 'north', + 'northern mariana', + ], + }, + { + code: 'šŸ‡²šŸ‡¶', + keywords: [ + 'flag', + 'martinique', + ], + }, + { + code: 'šŸ‡²šŸ‡·', + keywords: [ + 'flag', + 'mauritania', + ], + }, + { + code: 'šŸ‡²šŸ‡ø', + keywords: [ + 'flag', + 'montserrat', + ], + }, + { + code: 'šŸ‡²šŸ‡¹', + keywords: [ + 'flag', + 'malta', + ], + }, + { + code: 'šŸ‡²šŸ‡ŗ', + keywords: [ + 'flag', + 'mauritius', + ], + }, + { + code: 'šŸ‡²šŸ‡»', + keywords: [ + 'flag', + 'maldives', + ], + }, + { + code: 'šŸ‡²šŸ‡¼', + keywords: [ + 'flag', + 'malawi', + ], + }, + { + code: 'šŸ‡²šŸ‡½', + keywords: [ + 'flag', + 'mexico', + ], + }, + { + code: 'šŸ‡²šŸ‡¾', + keywords: [ + 'flag', + 'malaysia', + ], + }, + { + code: 'šŸ‡²šŸ‡æ', + keywords: [ + 'flag', + 'mozambique', + ], + }, + { + code: 'šŸ‡³šŸ‡¦', + keywords: [ + 'flag', + 'namibia', + ], + }, + { + code: 'šŸ‡³šŸ‡Ø', + keywords: [ + 'flag', + 'new', + 'new caledonia', + ], + }, + { + code: 'šŸ‡³šŸ‡Ŗ', + keywords: [ + 'flag', + 'niger', + ], + }, + { + code: 'šŸ‡³šŸ‡«', + keywords: [ + 'flag', + 'island', + 'norfolk', + ], + }, + { + code: 'šŸ‡³šŸ‡¬', + keywords: [ + 'flag', + 'nigeria', + ], + }, + { + code: 'šŸ‡³šŸ‡®', + keywords: [ + 'flag', + 'nicaragua', + ], + }, + { + code: 'šŸ‡³šŸ‡±', + keywords: [ + 'flag', + 'netherlands', + ], + }, + { + code: 'šŸ‡³šŸ‡“', + keywords: [ + 'flag', + 'norway', + ], + }, + { + code: 'šŸ‡³šŸ‡µ', + keywords: [ + 'flag', + 'nepal', + ], + }, + { + code: 'šŸ‡³šŸ‡·', + keywords: [ + 'flag', + 'nauru', + ], + }, + { + code: 'šŸ‡³šŸ‡ŗ', + keywords: [ + 'flag', + 'niue', + ], + }, + { + code: 'šŸ‡³šŸ‡æ', + keywords: [ + 'flag', + 'new', + 'new zealand', + ], + }, + { + code: 'šŸ‡“šŸ‡²', + keywords: [ + 'flag', + 'oman', + ], + }, + { + code: 'šŸ‡µšŸ‡¦', + keywords: [ + 'flag', + 'panama', + ], + }, + { + code: 'šŸ‡µšŸ‡Ŗ', + keywords: [ + 'flag', + 'peru', + ], + }, + { + code: 'šŸ‡µšŸ‡«', + keywords: [ + 'flag', + 'french', + 'polynesia', + ], + }, + { + code: 'šŸ‡µšŸ‡¬', + keywords: [ + 'flag', + 'guinea', + 'new', + 'papua new guinea', + ], + }, + { + code: 'šŸ‡µšŸ‡­', + keywords: [ + 'flag', + 'philippines', + ], + }, + { + code: 'šŸ‡µšŸ‡°', + keywords: [ + 'flag', + 'pakistan', + ], + }, + { + code: 'šŸ‡µšŸ‡±', + keywords: [ + 'flag', + 'poland', + ], + }, + { + code: 'šŸ‡µšŸ‡²', + keywords: [ + 'flag', + 'miquelon', + 'pierre', + 'saint', + ], + }, + { + code: 'šŸ‡µšŸ‡³', + keywords: [ + 'flag', + 'island', + 'pitcairn', + ], + }, + { + code: 'šŸ‡µšŸ‡·', + keywords: [ + 'flag', + 'puerto rico', + ], + }, + { + code: 'šŸ‡µšŸ‡ø', + keywords: [ + 'flag', + 'palestine', + ], + }, + { + code: 'šŸ‡µšŸ‡¹', + keywords: [ + 'flag', + 'portugal', + ], + }, + { + code: 'šŸ‡µšŸ‡¼', + keywords: [ + 'flag', + 'palau', + ], + }, + { + code: 'šŸ‡µšŸ‡¾', + keywords: [ + 'flag', + 'paraguay', + ], + }, + { + code: 'šŸ‡¶šŸ‡¦', + keywords: [ + 'flag', + 'qatar', + ], + }, + { + code: 'šŸ‡·šŸ‡Ŗ', + keywords: [ + 'flag', + 'reunion', + 'rĆ©union', + ], + }, + { + code: 'šŸ‡·šŸ‡“', + keywords: [ + 'flag', + 'romania', + ], + }, + { + code: 'šŸ‡·šŸ‡ø', + keywords: [ + 'flag', + 'serbia', + ], + }, + { + code: 'šŸ‡·šŸ‡ŗ', + keywords: [ + 'flag', + 'russia', + ], + }, + { + code: 'šŸ‡·šŸ‡¼', + keywords: [ + 'flag', + 'rwanda', + ], + }, + { + code: 'šŸ‡øšŸ‡¦', + keywords: [ + 'flag', + 'saudi arabia', + ], + }, + { + code: 'šŸ‡øšŸ‡§', + keywords: [ + 'flag', + 'island', + 'solomon', + ], + }, + { + code: 'šŸ‡øšŸ‡Ø', + keywords: [ + 'flag', + 'seychelles', + ], + }, + { + code: 'šŸ‡øšŸ‡©', + keywords: [ + 'flag', + 'sudan', + ], + }, + { + code: 'šŸ‡øšŸ‡Ŗ', + keywords: [ + 'flag', + 'sweden', + ], + }, + { + code: 'šŸ‡øšŸ‡¬', + keywords: [ + 'flag', + 'singapore', + ], + }, + { + code: 'šŸ‡øšŸ‡­', + keywords: [ + 'flag', + 'helena', + 'saint', + ], + }, + { + code: 'šŸ‡øšŸ‡®', + keywords: [ + 'flag', + 'slovenia', + ], + }, + { + code: 'šŸ‡øšŸ‡Æ', + keywords: [ + 'flag', + 'jan mayen', + 'svalbard', + ], + }, + { + code: 'šŸ‡øšŸ‡°', + keywords: [ + 'flag', + 'slovakia', + ], + }, + { + code: 'šŸ‡øšŸ‡±', + keywords: [ + 'flag', + 'sierra leone', + ], + }, + { + code: 'šŸ‡øšŸ‡²', + keywords: [ + 'flag', + 'san marino', + ], + }, + { + code: 'šŸ‡øšŸ‡³', + keywords: [ + 'flag', + 'senegal', + ], + }, + { + code: 'šŸ‡øšŸ‡“', + keywords: [ + 'flag', + 'somalia', + ], + }, + { + code: 'šŸ‡øšŸ‡·', + keywords: [ + 'flag', + 'suriname', + ], + }, + { + code: 'šŸ‡øšŸ‡ø', + keywords: [ + 'flag', + 'south', + 'south sudan', + 'sudan', + ], + }, + { + code: 'šŸ‡øšŸ‡¹', + keywords: [ + 'flag', + 'principe', + 'prĆ­ncipe', + 'sao tome', + 'sĆ£o tomĆ©', + ], + }, + { + code: 'šŸ‡øšŸ‡»', + keywords: [ + 'el salvador', + 'flag', + ], + }, + { + code: 'šŸ‡øšŸ‡½', + keywords: [ + 'flag', + 'maarten', + 'sint', + ], + }, + { + code: 'šŸ‡øšŸ‡¾', + keywords: [ + 'flag', + 'syria', + ], + }, + { + code: 'šŸ‡øšŸ‡æ', + keywords: [ + 'flag', + 'swaziland', + ], + }, + { + code: 'šŸ‡¹šŸ‡¦', + keywords: [ + 'flag', + 'tristan da cunha', + ], + }, + { + code: 'šŸ‡¹šŸ‡Ø', + keywords: [ + 'caicos', + 'flag', + 'island', + 'turks', + ], + }, + { + code: 'šŸ‡¹šŸ‡©', + keywords: [ + 'chad', + 'flag', + ], + }, + { + code: 'šŸ‡¹šŸ‡«', + keywords: [ + 'antarctic', + 'flag', + 'french', + ], + }, + { + code: 'šŸ‡¹šŸ‡¬', + keywords: [ + 'flag', + 'togo', + ], + }, + { + code: 'šŸ‡¹šŸ‡­', + keywords: [ + 'flag', + 'thailand', + ], + }, + { + code: 'šŸ‡¹šŸ‡Æ', + keywords: [ + 'flag', + 'tajikistan', + ], + }, + { + code: 'šŸ‡¹šŸ‡°', + keywords: [ + 'flag', + 'tokelau', + ], + }, + { + code: 'šŸ‡¹šŸ‡±', + keywords: [ + 'east', + 'east timor', + 'flag', + 'timor-leste', + ], + }, + { + code: 'šŸ‡¹šŸ‡²', + keywords: [ + 'flag', + 'turkmenistan', + ], + }, + { + code: 'šŸ‡¹šŸ‡³', + keywords: [ + 'flag', + 'tunisia', + ], + }, + { + code: 'šŸ‡¹šŸ‡“', + keywords: [ + 'flag', + 'tonga', + ], + }, + { + code: 'šŸ‡¹šŸ‡·', + keywords: [ + 'flag', + 'turkey', + ], + }, + { + code: 'šŸ‡¹šŸ‡¹', + keywords: [ + 'flag', + 'tobago', + 'trinidad', + ], + }, + { + code: 'šŸ‡¹šŸ‡»', + keywords: [ + 'flag', + 'tuvalu', + ], + }, + { + code: 'šŸ‡¹šŸ‡¼', + keywords: [ + 'china', + 'flag', + 'taiwan', + ], + }, + { + code: 'šŸ‡¹šŸ‡æ', + keywords: [ + 'flag', + 'tanzania', + ], + }, + { + code: 'šŸ‡ŗšŸ‡¦', + keywords: [ + 'flag', + 'ukraine', + ], + }, + { + code: 'šŸ‡ŗšŸ‡¬', + keywords: [ + 'flag', + 'uganda', + ], + }, + { + code: 'šŸ‡ŗšŸ‡²', + keywords: [ + 'america', + 'flag', + 'island', + 'minor outlying', + 'united', + 'united states', + 'us', + 'usa', + ], + }, + { + code: 'šŸ‡ŗšŸ‡ø', + keywords: [ + 'america', + 'flag', + 'stars and stripes', + 'united', + 'united states', + ], + }, + { + code: 'šŸ‡ŗšŸ‡¾', + keywords: [ + 'flag', + 'uruguay', + ], + }, + { + code: 'šŸ‡ŗšŸ‡æ', + keywords: [ + 'flag', + 'uzbekistan', + ], + }, + { + code: 'šŸ‡»šŸ‡¦', + keywords: [ + 'flag', + 'vatican', + ], + }, + { + code: 'šŸ‡»šŸ‡Ø', + keywords: [ + 'flag', + 'grenadines', + 'saint', + 'vincent', + ], + }, + { + code: 'šŸ‡»šŸ‡Ŗ', + keywords: [ + 'flag', + 'venezuela', + ], + }, + { + code: 'šŸ‡»šŸ‡¬', + keywords: [ + 'british', + 'flag', + 'island', + 'virgin', + ], + }, + { + code: 'šŸ‡»šŸ‡®', + keywords: [ + 'america', + 'american', + 'flag', + 'island', + 'united', + 'united states', + 'us', + 'usa', + 'virgin', + ], + }, + { + code: 'šŸ‡»šŸ‡³', + keywords: [ + 'flag', + 'viet nam', + 'vietnam', + ], + }, + { + code: 'šŸ‡»šŸ‡ŗ', + keywords: [ + 'flag', + 'vanuatu', + ], + }, + { + code: 'šŸ‡¼šŸ‡«', + keywords: [ + 'flag', + 'futuna', + 'wallis', + ], + }, + { + code: 'šŸ‡¼šŸ‡ø', + keywords: [ + 'flag', + 'samoa', + ], + }, + { + code: 'šŸ‡½šŸ‡°', + keywords: [ + 'flag', + 'kosovo', + ], + }, + { + code: 'šŸ‡¾šŸ‡Ŗ', + keywords: [ + 'flag', + 'yemen', + ], + }, + { + code: 'šŸ‡¾šŸ‡¹', + keywords: [ + 'flag', + 'mayotte', + ], + }, + { + code: 'šŸ‡æšŸ‡¦', + keywords: [ + 'flag', + 'south', + 'south africa', + ], + }, + { + code: 'šŸ‡æšŸ‡²', + keywords: [ + 'flag', + 'zambia', + ], + }, + { + code: 'šŸ‡æšŸ‡¼', + keywords: [ + 'flag', + 'zimbabwe', + ], + }, ], }, ]; From b75744ea7d38e3b61f3cd5c248f2dd8baaafb82c Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 22 Mar 2021 14:01:20 -0600 Subject: [PATCH 014/380] Re-format back to having all emojis in a single list --- assets/emojis.js | 23879 ++++++++++++++++++++++----------------------- 1 file changed, 11936 insertions(+), 11943 deletions(-) diff --git a/assets/emojis.js b/assets/emojis.js index e928cc757fd3..c162e7e491be 100644 --- a/assets/emojis.js +++ b/assets/emojis.js @@ -26,11949 +26,11942 @@ const emojis = [ { - title: 'Smileys & People', - data: [ - { - code: 'šŸ˜€', - keywords: [ - 'face', - 'grin', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'eye', - 'face', - 'grin', - 'smile', - ], - }, - { - code: 'šŸ˜‚', - keywords: [ - 'face', - 'joy', - 'laugh', - 'tear', - ], - }, - { - code: 'šŸ¤£', - keywords: [ - 'face', - 'floor', - 'laugh', - 'lol', - 'rofl', - 'rolling', - ], - }, - { - code: 'šŸ˜ƒ', - keywords: [ - 'face', - 'mouth', - 'open', - 'smile', - ], - }, - { - code: 'šŸ˜„', - keywords: [ - 'eye', - 'face', - 'mouth', - 'open', - 'smile', - ], - }, - { - code: 'šŸ˜…', - keywords: [ - 'cold', - 'face', - 'open', - 'smile', - 'sweat', - ], - }, - { - code: 'šŸ˜†', - keywords: [ - 'face', - 'laugh', - 'mouth', - 'open', - 'satisfied', - 'smile', - ], - }, - { - code: 'šŸ˜‰', - keywords: [ - 'face', - 'wink', - ], - }, - { - code: 'šŸ˜Š', - keywords: [ - 'blush', - 'eye', - 'face', - 'smile', - ], - }, - { - code: 'šŸ˜‹', - keywords: [ - 'delicious', - 'face', - 'savouring', - 'smile', - 'um', - 'yum', - ], - }, - { - code: 'šŸ˜Ž', - keywords: [ - 'bright', - 'cool', - 'eye', - 'eyewear', - 'face', - 'glasses', - 'smile', - 'sun', - 'sunglasses', - 'weather', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'eye', - 'face', - 'heart', - 'love', - 'smile', - ], - }, - { - code: 'šŸ˜˜', - keywords: [ - 'face', - 'heart', - 'kiss', - ], - }, - { - code: 'šŸ˜—', - keywords: [ - 'face', - 'kiss', - ], - }, - { - code: 'šŸ˜™', - keywords: [ - 'eye', - 'face', - 'kiss', - 'smile', - ], - }, - { - code: 'šŸ˜š', - keywords: [ - 'closed', - 'eye', - 'face', - 'kiss', - ], - }, - { - code: 'ā˜ŗ', - keywords: [ - 'face', - 'outlined', - 'relaxed', - 'smile', - ], - }, - { - code: 'šŸ™‚', - keywords: [ - 'face', - 'smile', - ], - }, - { - code: 'šŸ¤—', - keywords: [ - 'face', - 'hug', - 'hugging', - ], - }, - { - code: 'šŸ¤”', - keywords: [ - 'face', - 'thinking', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'deadpan', - 'face', - 'neutral', - ], - }, - { - code: 'šŸ˜‘', - keywords: [ - 'expressionless', - 'face', - 'inexpressive', - 'unexpressive', - ], - }, - { - code: 'šŸ˜¶', - keywords: [ - 'face', - 'mouth', - 'quiet', - 'silent', - ], - }, - { - code: 'šŸ™„', - keywords: [ - 'eyes', - 'face', - 'rolling', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'face', - 'smirk', - ], - }, - { - code: 'šŸ˜£', - keywords: [ - 'face', - 'persevere', - ], - }, - { - code: 'šŸ˜„', - keywords: [ - 'disappointed', - 'face', - 'relieved', - 'whew', - ], - }, - { - code: 'šŸ˜®', - keywords: [ - 'face', - 'mouth', - 'open', - 'sympathy', - ], - }, - { - code: 'šŸ¤', - keywords: [ - 'face', - 'mouth', - 'zipper', - ], - }, - { - code: 'šŸ˜Æ', - keywords: [ - 'face', - 'hushed', - 'stunned', - 'surprised', - ], - }, - { - code: 'šŸ˜Ŗ', - keywords: [ - 'face', - 'sleep', - ], - }, - { - code: 'šŸ˜«', - keywords: [ - 'face', - 'tired', - ], - }, - { - code: 'šŸ˜“', - keywords: [ - 'face', - 'sleep', - 'zzz', - ], - }, - { - code: 'šŸ˜Œ', - keywords: [ - 'face', - 'relieved', - ], - }, - { - code: 'šŸ¤“', - keywords: [ - 'face', - 'geek', - 'nerd', - ], - }, - { - code: 'šŸ˜›', - keywords: [ - 'face', - 'tongue', - ], - }, - { - code: 'šŸ˜œ', - keywords: [ - 'eye', - 'face', - 'joke', - 'tongue', - 'wink', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'eye', - 'face', - 'horrible', - 'taste', - 'tongue', - ], - }, - { - code: 'šŸ¤¤', - keywords: [ - 'drooling', - 'face', - ], - }, - { - code: 'šŸ˜’', - keywords: [ - 'face', - 'unamused', - 'unhappy', - ], - }, - { - code: 'šŸ˜“', - keywords: [ - 'cold', - 'face', - 'sweat', - ], - }, - { - code: 'šŸ˜”', - keywords: [ - 'dejected', - 'face', - 'pensive', - ], - }, - { - code: 'šŸ˜•', - keywords: [ - 'confused', - 'face', - ], - }, - { - code: 'šŸ™ƒ', - keywords: [ - 'face', - 'upside-down', - ], - }, - { - code: 'šŸ¤‘', - keywords: [ - 'face', - 'money', - 'mouth', - ], - }, - { - code: 'šŸ˜²', - keywords: [ - 'astonished', - 'face', - 'shocked', - 'totally', - ], - }, - { - code: 'ā˜¹', - keywords: [ - 'face', - 'frown', - ], - }, - { - code: 'šŸ™', - keywords: [ - 'face', - 'frown', - ], - }, - { - code: 'šŸ˜–', - keywords: [ - 'confounded', - 'face', - ], - }, - { - code: 'šŸ˜ž', - keywords: [ - 'disappointed', - 'face', - ], - }, - { - code: 'šŸ˜Ÿ', - keywords: [ - 'face', - 'worried', - ], - }, - { - code: 'šŸ˜¤', - keywords: [ - 'face', - 'triumph', - 'won', - ], - }, - { - code: 'šŸ˜¢', - keywords: [ - 'cry', - 'face', - 'sad', - 'tear', - ], - }, - { - code: 'šŸ˜­', - keywords: [ - 'cry', - 'face', - 'sad', - 'sob', - 'tear', - ], - }, - { - code: 'šŸ˜¦', - keywords: [ - 'face', - 'frown', - 'mouth', - 'open', - ], - }, - { - code: 'šŸ˜§', - keywords: [ - 'anguished', - 'face', - ], - }, - { - code: 'šŸ˜Ø', - keywords: [ - 'face', - 'fear', - 'fearful', - 'scared', - ], - }, - { - code: 'šŸ˜©', - keywords: [ - 'face', - 'tired', - 'weary', - ], - }, - { - code: 'šŸ˜¬', - keywords: [ - 'face', - 'grimace', - ], - }, - { - code: 'šŸ˜°', - keywords: [ - 'blue', - 'cold', - 'face', - 'mouth', - 'open', - 'rushed', - 'sweat', - ], - }, - { - code: 'šŸ˜±', - keywords: [ - 'face', - 'fear', - 'fearful', - 'munch', - 'scared', - 'scream', - ], - }, - { - code: 'šŸ˜³', - keywords: [ - 'dazed', - 'face', - 'flushed', - ], - }, - { - code: 'šŸ˜µ', - keywords: [ - 'dizzy', - 'face', - ], - }, - { - code: 'šŸ˜”', - keywords: [ - 'angry', - 'face', - 'mad', - 'pouting', - 'rage', - 'red', - ], - }, - { - code: 'šŸ˜ ', - keywords: [ - 'angry', - 'face', - 'mad', - ], - }, - { - code: 'šŸ˜‡', - keywords: [ - 'angel', - 'face', - 'fairy tale', - 'fantasy', - 'halo', - 'innocent', - 'smile', - ], - }, - { - code: 'šŸ¤ ', - keywords: [ - 'cowboy', - 'cowgirl', - 'face', - 'hat', - ], - }, - { - code: 'šŸ¤”', - keywords: [ - 'clown', - 'face', - ], - }, - { - code: 'šŸ¤„', - keywords: [ - 'face', - 'lie', - 'pinocchio', - ], - }, - { - code: 'šŸ˜·', - keywords: [ - 'cold', - 'doctor', - 'face', - 'mask', - 'medicine', - 'sick', - ], - }, - { - code: 'šŸ¤’', - keywords: [ - 'face', - 'ill', - 'sick', - 'thermometer', - ], - }, - { - code: 'šŸ¤•', - keywords: [ - 'bandage', - 'face', - 'hurt', - 'injury', - ], - }, - { - code: 'šŸ¤¢', - keywords: [ - 'face', - 'nauseated', - 'vomit', - ], - }, - { - code: 'šŸ¤§', - keywords: [ - 'face', - 'gesundheit', - 'sneeze', - ], - }, - { - code: 'šŸ˜ˆ', - keywords: [ - 'face', - 'fairy tale', - 'fantasy', - 'horns', - 'smile', - ], - }, - { - code: 'šŸ‘æ', - keywords: [ - 'demon', - 'devil', - 'face', - 'fairy tale', - 'fantasy', - 'imp', - ], - }, - { - code: 'šŸ‘¹', - keywords: [ - 'creature', - 'face', - 'fairy tale', - 'fantasy', - 'japanese', - 'monster', - 'ogre', - ], - }, - { - code: 'šŸ‘ŗ', - keywords: [ - 'creature', - 'face', - 'fairy tale', - 'fantasy', - 'goblin', - 'japanese', - 'monster', - ], - }, - { - code: 'šŸ’€', - keywords: [ - 'body', - 'death', - 'face', - 'fairy tale', - 'monster', - 'skull', - ], - }, - { - code: 'ā˜ ', - keywords: [ - 'body', - 'crossbones', - 'death', - 'face', - 'monster', - 'skull', - ], - }, - { - code: 'šŸ‘»', - keywords: [ - 'creature', - 'face', - 'fairy tale', - 'fantasy', - 'ghost', - 'monster', - ], - }, - { - code: 'šŸ‘½', - keywords: [ - 'alien', - 'creature', - 'extraterrestrial', - 'face', - 'fairy tale', - 'fantasy', - 'monster', - 'space', - 'ufo', - ], - }, - { - code: 'šŸ‘¾', - keywords: [ - 'alien', - 'creature', - 'extraterrestrial', - 'face', - 'fairy tale', - 'fantasy', - 'monster', - 'space', - 'ufo', - ], - }, - { - code: 'šŸ¤–', - keywords: [ - 'face', - 'monster', - 'robot', - ], - }, - { - code: 'šŸ’©', - keywords: [ - 'comic', - 'dung', - 'face', - 'monster', - 'poo', - 'poop', - ], - }, - { - code: 'šŸ˜ŗ', - keywords: [ - 'cat', - 'face', - 'mouth', - 'open', - 'smile', - ], - }, - { - code: 'šŸ˜ø', - keywords: [ - 'cat', - 'eye', - 'face', - 'grin', - 'smile', - ], - }, - { - code: 'šŸ˜¹', - keywords: [ - 'cat', - 'face', - 'joy', - 'tear', - ], - }, - { - code: 'šŸ˜»', - keywords: [ - 'cat', - 'eye', - 'face', - 'heart', - 'love', - 'smile', - ], - }, - { - code: 'šŸ˜¼', - keywords: [ - 'cat', - 'face', - 'ironic', - 'smile', - 'wry', - ], - }, - { - code: 'šŸ˜½', - keywords: [ - 'cat', - 'eye', - 'face', - 'kiss', - ], - }, - { - code: 'šŸ™€', - keywords: [ - 'cat', - 'face', - 'oh', - 'surprised', - 'weary', - ], - }, - { - code: 'šŸ˜æ', - keywords: [ - 'cat', - 'cry', - 'face', - 'sad', - 'tear', - ], - }, - { - code: 'šŸ˜¾', - keywords: [ - 'cat', - 'face', - 'pouting', - ], - }, - { - code: 'šŸ™ˆ', - keywords: [ - 'evil', - 'face', - 'forbidden', - 'gesture', - 'monkey', - 'no', - 'not', - 'prohibited', - 'see', - ], - }, - { - code: 'šŸ™‰', - keywords: [ - 'evil', - 'face', - 'forbidden', - 'gesture', - 'hear', - 'monkey', - 'no', - 'not', - 'prohibited', - ], - }, - { - code: 'šŸ™Š', - keywords: [ - 'evil', - 'face', - 'forbidden', - 'gesture', - 'monkey', - 'no', - 'not', - 'prohibited', - 'speak', - ], - }, - { - code: 'šŸ‘¦', - keywords: [ - 'boy', - ], - types: [ - 'šŸ‘¦šŸæ', - 'šŸ‘¦šŸ¾', - 'šŸ‘¦šŸ½', - 'šŸ‘¦šŸ¼', - 'šŸ‘¦šŸ»', - ], - }, - { - code: 'šŸ‘§', - keywords: [ - 'girl', - 'maiden', - 'virgin', - 'virgo', - 'zodiac', - ], - types: [ - 'šŸ‘§šŸæ', - 'šŸ‘§šŸ¾', - 'šŸ‘§šŸ½', - 'šŸ‘§šŸ¼', - 'šŸ‘§šŸ»', - ], - }, - { - code: 'šŸ‘Ø', - keywords: [ - 'man', - ], - types: [ - 'šŸ‘ØšŸæ', - 'šŸ‘ØšŸ¾', - 'šŸ‘ØšŸ½', - 'šŸ‘ØšŸ¼', - 'šŸ‘ØšŸ»', - ], - }, - { - code: 'šŸ‘©', - keywords: [ - 'woman', - ], - types: [ - 'šŸ‘©šŸæ', - 'šŸ‘©šŸ¾', - 'šŸ‘©šŸ½', - 'šŸ‘©šŸ¼', - 'šŸ‘©šŸ»', - ], - }, - { - code: 'šŸ‘“', - keywords: [ - 'man', - 'old', - ], - types: [ - 'šŸ‘“šŸæ', - 'šŸ‘“šŸ¾', - 'šŸ‘“šŸ½', - 'šŸ‘“šŸ¼', - 'šŸ‘“šŸ»', - ], - }, - { - code: 'šŸ‘µ', - keywords: [ - 'old', - 'woman', - ], - types: [ - 'šŸ‘µšŸæ', - 'šŸ‘µšŸ¾', - 'šŸ‘µšŸ½', - 'šŸ‘µšŸ¼', - 'šŸ‘µšŸ»', - ], - }, - { - code: 'šŸ‘¶', - keywords: [ - 'baby', - ], - types: [ - 'šŸ‘¶šŸæ', - 'šŸ‘¶šŸ¾', - 'šŸ‘¶šŸ½', - 'šŸ‘¶šŸ¼', - 'šŸ‘¶šŸ»', - ], - }, - { - code: 'šŸ‘¼', - keywords: [ - 'angel', - 'baby', - 'face', - 'fairy tale', - 'fantasy', - ], - types: [ - 'šŸ‘¼šŸæ', - 'šŸ‘¼šŸ¾', - 'šŸ‘¼šŸ½', - 'šŸ‘¼šŸ¼', - 'šŸ‘¼šŸ»', - ], - }, - { - code: 'šŸ‘±', - keywords: [ - 'blond', - ], - types: [ - 'šŸ‘±šŸæ', - 'šŸ‘±šŸ¾', - 'šŸ‘±šŸ½', - 'šŸ‘±šŸ¼', - 'šŸ‘±šŸ»', - ], - }, - { - code: 'šŸ‘®', - keywords: [ - 'cop', - 'officer', - 'police', - ], - types: [ - 'šŸ‘®šŸæ', - 'šŸ‘®šŸ¾', - 'šŸ‘®šŸ½', - 'šŸ‘®šŸ¼', - 'šŸ‘®šŸ»', - ], - }, - { - code: 'šŸ‘²', - keywords: [ - 'gua pi mao', - 'hat', - 'man', - ], - types: [ - 'šŸ‘²šŸæ', - 'šŸ‘²šŸ¾', - 'šŸ‘²šŸ½', - 'šŸ‘²šŸ¼', - 'šŸ‘²šŸ»', - ], - }, - { - code: 'šŸ‘³', - keywords: [ - 'man', - 'turban', - ], - types: [ - 'šŸ‘³šŸæ', - 'šŸ‘³šŸ¾', - 'šŸ‘³šŸ½', - 'šŸ‘³šŸ¼', - 'šŸ‘³šŸ»', - ], - }, - { - code: 'šŸ‘·', - keywords: [ - 'construction', - 'hat', - 'worker', - ], - types: [ - 'šŸ‘·šŸæ', - 'šŸ‘·šŸ¾', - 'šŸ‘·šŸ½', - 'šŸ‘·šŸ¼', - 'šŸ‘·šŸ»', - ], - }, - { - code: 'šŸ‘ø', - keywords: [ - 'fairy tale', - 'fantasy', - 'princess', - ], - types: [ - 'šŸ‘øšŸæ', - 'šŸ‘øšŸ¾', - 'šŸ‘øšŸ½', - 'šŸ‘øšŸ¼', - 'šŸ‘øšŸ»', - ], - }, - { - code: 'šŸ¤“', - keywords: [ - 'prince', - ], - types: [ - 'šŸ¤“šŸæ', - 'šŸ¤“šŸ¾', - 'šŸ¤“šŸ½', - 'šŸ¤“šŸ¼', - 'šŸ¤“šŸ»', - ], - }, - { - code: 'šŸ’‚', - keywords: [ - 'guard', - 'guardsman', - ], - types: [ - 'šŸ’‚šŸæ', - 'šŸ’‚šŸ¾', - 'šŸ’‚šŸ½', - 'šŸ’‚šŸ¼', - 'šŸ’‚šŸ»', - ], - }, - { - code: 'šŸ•µ', - keywords: [ - 'detective', - 'sleuth', - 'spy', - ], - types: [ - 'šŸ•µšŸæ', - 'šŸ•µšŸ¾', - 'šŸ•µšŸ½', - 'šŸ•µšŸ¼', - 'šŸ•µšŸ»', - ], - }, - { - code: 'šŸŽ…', - keywords: [ - 'activity', - 'celebration', - 'christmas', - 'fairy tale', - 'fantasy', - 'father', - 'santa', - ], - types: [ - 'šŸŽ…šŸæ', - 'šŸŽ…šŸ¾', - 'šŸŽ…šŸ½', - 'šŸŽ…šŸ¼', - 'šŸŽ…šŸ»', - ], - }, - { - code: 'šŸ¤¶', - keywords: [ - 'christmas', - 'mother', - 'mrs. claus', - ], - types: [ - 'šŸ¤¶šŸæ', - 'šŸ¤¶šŸ¾', - 'šŸ¤¶šŸ½', - 'šŸ¤¶šŸ¼', - 'šŸ¤¶šŸ»', - ], - }, - { - code: 'šŸ‘°', - keywords: [ - 'bride', - 'veil', - 'wedding', - ], - types: [ - 'šŸ‘°šŸæ', - 'šŸ‘°šŸ¾', - 'šŸ‘°šŸ½', - 'šŸ‘°šŸ¼', - 'šŸ‘°šŸ»', - ], - }, - { - code: 'šŸ¤µ', - keywords: [ - 'groom', - 'man', - 'tuxedo', - ], - types: [ - 'šŸ¤µšŸæ', - 'šŸ¤µšŸ¾', - 'šŸ¤µšŸ½', - 'šŸ¤µšŸ¼', - 'šŸ¤µšŸ»', - ], - }, - { - code: 'šŸ’†', - keywords: [ - 'massage', - 'salon', - ], - types: [ - 'šŸ’†šŸæ', - 'šŸ’†šŸ¾', - 'šŸ’†šŸ½', - 'šŸ’†šŸ¼', - 'šŸ’†šŸ»', - ], - }, - { - code: 'šŸ’‡', - keywords: [ - 'barber', - 'beauty', - 'haircut', - 'parlor', - ], - types: [ - 'šŸ’‡šŸæ', - 'šŸ’‡šŸ¾', - 'šŸ’‡šŸ½', - 'šŸ’‡šŸ¼', - 'šŸ’‡šŸ»', - ], - }, - { - code: 'šŸ™', - keywords: [ - 'frown', - 'gesture', - ], - types: [ - 'šŸ™šŸæ', - 'šŸ™šŸ¾', - 'šŸ™šŸ½', - 'šŸ™šŸ¼', - 'šŸ™šŸ»', - ], - }, - { - code: 'šŸ™Ž', - keywords: [ - 'gesture', - 'pouting', - ], - types: [ - 'šŸ™ŽšŸæ', - 'šŸ™ŽšŸ¾', - 'šŸ™ŽšŸ½', - 'šŸ™ŽšŸ¼', - 'šŸ™ŽšŸ»', - ], - }, - { - code: 'šŸ™…', - keywords: [ - 'forbidden', - 'gesture', - 'hand', - 'no', - 'not', - 'prohibited', - ], - types: [ - 'šŸ™…šŸæ', - 'šŸ™…šŸ¾', - 'šŸ™…šŸ½', - 'šŸ™…šŸ¼', - 'šŸ™…šŸ»', - ], - }, - { - code: 'šŸ™†', - keywords: [ - 'gesture', - 'hand', - 'ok', - ], - types: [ - 'šŸ™†šŸæ', - 'šŸ™†šŸ¾', - 'šŸ™†šŸ½', - 'šŸ™†šŸ¼', - 'šŸ™†šŸ»', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'hand', - 'help', - 'information', - 'sassy', - ], - types: [ - 'šŸ’šŸæ', - 'šŸ’šŸ¾', - 'šŸ’šŸ½', - 'šŸ’šŸ¼', - 'šŸ’šŸ»', - ], - }, - { - code: 'šŸ¤·', - keywords: [ - 'doubt', - 'ignorance', - 'indifference', - 'shrug', - ], - types: [ - 'šŸ¤·šŸæ', - 'šŸ¤·šŸ¾', - 'šŸ¤·šŸ½', - 'šŸ¤·šŸ¼', - 'šŸ¤·šŸ»', - ], - }, - { - code: 'šŸ™‹', - keywords: [ - 'gesture', - 'hand', - 'happy', - 'raised', - ], - types: [ - 'šŸ™‹šŸæ', - 'šŸ™‹šŸ¾', - 'šŸ™‹šŸ½', - 'šŸ™‹šŸ¼', - 'šŸ™‹šŸ»', - ], - }, - { - code: 'šŸ¤¦', - keywords: [ - 'disbelief', - 'exasperation', - 'face', - 'palm', - ], - types: [ - 'šŸ¤¦šŸæ', - 'šŸ¤¦šŸ¾', - 'šŸ¤¦šŸ½', - 'šŸ¤¦šŸ¼', - 'šŸ¤¦šŸ»', - ], - }, - { - code: 'šŸ™‡', - keywords: [ - 'apology', - 'bow', - 'gesture', - 'sorry', - ], - types: [ - 'šŸ™‡šŸæ', - 'šŸ™‡šŸ¾', - 'šŸ™‡šŸ½', - 'šŸ™‡šŸ¼', - 'šŸ™‡šŸ»', - ], - }, - { - code: 'šŸš¶', - keywords: [ - 'hike', - 'pedestrian', - 'walk', - 'walking', - ], - types: [ - 'šŸš¶šŸæ', - 'šŸš¶šŸ¾', - 'šŸš¶šŸ½', - 'šŸš¶šŸ¼', - 'šŸš¶šŸ»', - ], - }, - { - code: 'šŸƒ', - keywords: [ - 'marathon', - 'runner', - 'running', - ], - types: [ - 'šŸƒšŸæ', - 'šŸƒšŸ¾', - 'šŸƒšŸ½', - 'šŸƒšŸ¼', - 'šŸƒšŸ»', - ], - }, - { - code: 'šŸ’ƒ', - keywords: [ - 'dancer', - ], - types: [ - 'šŸ’ƒšŸæ', - 'šŸ’ƒšŸ¾', - 'šŸ’ƒšŸ½', - 'šŸ’ƒšŸ¼', - 'šŸ’ƒšŸ»', - ], - }, - { - code: 'šŸ•ŗ', - keywords: [ - 'dance', - 'man', - ], - types: [ - 'šŸ•ŗšŸæ', - 'šŸ•ŗšŸ¾', - 'šŸ•ŗšŸ½', - 'šŸ•ŗšŸ¼', - 'šŸ•ŗšŸ»', - ], - }, - { - code: 'šŸ¤°', - keywords: [ - 'pregnant', - 'woman', - ], - types: [ - 'šŸ¤°šŸæ', - 'šŸ¤°šŸ¾', - 'šŸ¤°šŸ½', - 'šŸ¤°šŸ¼', - 'šŸ¤°šŸ»', - ], - }, - { - code: 'šŸ‘Æ', - keywords: [ - 'bunny', - 'dancer', - 'ear', - 'girl', - 'woman', - ], - }, - { - code: 'šŸ•“', - keywords: [ - 'business', - 'man', - 'suit', - ], - }, - { - code: 'šŸ—£', - keywords: [ - 'face', - 'head', - 'silhouette', - 'speak', - 'speaking', - ], - }, - { - code: 'šŸ‘¤', - keywords: [ - 'bust', - 'silhouette', - ], - }, - { - code: 'šŸ‘„', - keywords: [ - 'bust', - 'silhouette', - ], - }, - { - code: 'šŸ‘«', - keywords: [ - 'couple', - 'hand', - 'hold', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘¬', - keywords: [ - 'couple', - 'gemini', - 'hand', - 'hold', - 'man', - 'twins', - 'zodiac', - ], - }, - { - code: 'šŸ‘­', - keywords: [ - 'couple', - 'hand', - 'hold', - 'woman', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'couple', - 'kiss', - 'romance', - ], - }, - { - code: 'šŸ‘©ā€ā¤ļøā€šŸ’‹ā€šŸ‘Ø', - keywords: [ - 'kiss', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘Øā€ā¤ļøā€šŸ’‹ā€šŸ‘Ø', - keywords: [ - 'kiss', - 'man', - ], - }, - { - code: 'šŸ‘©ā€ā¤ļøā€šŸ’‹ā€šŸ‘©', - keywords: [ - 'kiss', - 'woman', - ], - }, - { - code: 'šŸ’‘', - keywords: [ - 'couple', - 'heart', - 'love', - 'romance', - ], - }, - { - code: 'šŸ‘©ā€ā¤ļøā€šŸ‘Ø', - keywords: [ - 'couple', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘Øā€ā¤ļøā€šŸ‘Ø', - keywords: [ - 'couple', - 'man', - ], - }, - { - code: 'šŸ‘©ā€ā¤ļøā€šŸ‘©', - keywords: [ - 'couple', - 'woman', - ], - }, - { - code: 'šŸ‘Ŗ', - keywords: [ - 'child', - 'family', - 'father', - 'mother', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘§', - keywords: [ - 'family', - 'girl', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘§ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'girl', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘¦ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘§ā€šŸ‘§', - keywords: [ - 'family', - 'girl', - 'man', - 'woman', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'man', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘§', - keywords: [ - 'family', - 'girl', - 'man', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘§ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'girl', - 'man', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘¦ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'man', - ], - }, - { - code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘§ā€šŸ‘§', - keywords: [ - 'family', - 'girl', - 'man', - ], - }, - { - code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'woman', - ], - }, - { - code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘§', - keywords: [ - 'family', - 'girl', - 'woman', - ], - }, - { - code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘§ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'girl', - 'woman', - ], - }, - { - code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘¦ā€šŸ‘¦', - keywords: [ - 'boy', - 'family', - 'woman', - ], - }, - { - code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘§ā€šŸ‘§', - keywords: [ - 'family', - 'girl', - 'woman', - ], - }, - { - code: 'šŸ»', - keywords: [ - 'emoji modifier', - 'fitzpatrick', - 'skin', - 'tone', - ], - }, - { - code: 'šŸ¼', - keywords: [ - 'emoji modifier', - 'fitzpatrick', - 'skin', - 'tone', - ], - }, - { - code: 'šŸ½', - keywords: [ - 'emoji modifier', - 'fitzpatrick', - 'skin', - 'tone', - ], - }, - { - code: 'šŸ¾', - keywords: [ - 'emoji modifier', - 'fitzpatrick', - 'skin', - 'tone', - ], - }, - { - code: 'šŸæ', - keywords: [ - 'emoji modifier', - 'fitzpatrick', - 'skin', - 'tone', - ], - }, - { - code: 'šŸ’Ŗ', - keywords: [ - 'biceps', - 'body', - 'comic', - 'flex', - 'muscle', - ], - types: [ - 'šŸ’ŖšŸæ', - 'šŸ’ŖšŸ¾', - 'šŸ’ŖšŸ½', - 'šŸ’ŖšŸ¼', - 'šŸ’ŖšŸ»', - ], - }, - { - code: 'šŸ¤³', - keywords: [ - 'camera', - 'phone', - 'selfie', - ], - types: [ - 'šŸ¤³šŸæ', - 'šŸ¤³šŸ¾', - 'šŸ¤³šŸ½', - 'šŸ¤³šŸ¼', - 'šŸ¤³šŸ»', - ], - }, - { - code: 'šŸ‘ˆ', - keywords: [ - 'backhand', - 'body', - 'finger', - 'hand', - 'index', - 'point', - ], - types: [ - 'šŸ‘ˆšŸæ', - 'šŸ‘ˆšŸ¾', - 'šŸ‘ˆšŸ½', - 'šŸ‘ˆšŸ¼', - 'šŸ‘ˆšŸ»', - ], - }, - { - code: 'šŸ‘‰', - keywords: [ - 'backhand', - 'body', - 'finger', - 'hand', - 'index', - 'point', - ], - types: [ - 'šŸ‘‰šŸæ', - 'šŸ‘‰šŸ¾', - 'šŸ‘‰šŸ½', - 'šŸ‘‰šŸ¼', - 'šŸ‘‰šŸ»', - ], - }, - { - code: 'ā˜', - keywords: [ - 'body', - 'finger', - 'hand', - 'index', - 'point', - 'up', - ], - types: [ - 'ā˜šŸæ', - 'ā˜šŸ¾', - 'ā˜šŸ½', - 'ā˜šŸ¼', - 'ā˜šŸ»', - ], - }, - { - code: 'šŸ‘†', - keywords: [ - 'backhand', - 'body', - 'finger', - 'hand', - 'index', - 'point', - 'up', - ], - types: [ - 'šŸ‘†šŸæ', - 'šŸ‘†šŸ¾', - 'šŸ‘†šŸ½', - 'šŸ‘†šŸ¼', - 'šŸ‘†šŸ»', - ], - }, - { - code: 'šŸ–•', - keywords: [ - 'body', - 'finger', - 'hand', - 'middle finger', - ], - types: [ - 'šŸ–•šŸæ', - 'šŸ–•šŸ¾', - 'šŸ–•šŸ½', - 'šŸ–•šŸ¼', - 'šŸ–•šŸ»', - ], - }, - { - code: 'šŸ‘‡', - keywords: [ - 'backhand', - 'body', - 'down', - 'finger', - 'hand', - 'index', - 'point', - ], - types: [ - 'šŸ‘‡šŸæ', - 'šŸ‘‡šŸ¾', - 'šŸ‘‡šŸ½', - 'šŸ‘‡šŸ¼', - 'šŸ‘‡šŸ»', - ], - }, - { - code: 'āœŒ', - keywords: [ - 'body', - 'hand', - 'v', - 'victory', - ], - types: [ - 'āœŒšŸæ', - 'āœŒšŸ¾', - 'āœŒšŸ½', - 'āœŒšŸ¼', - 'āœŒšŸ»', - ], - }, - { - code: 'šŸ¤ž', - keywords: [ - 'cross', - 'finger', - 'hand', - 'luck', - ], - types: [ - 'šŸ¤žšŸæ', - 'šŸ¤žšŸ¾', - 'šŸ¤žšŸ½', - 'šŸ¤žšŸ¼', - 'šŸ¤žšŸ»', - ], - }, - { - code: 'šŸ––', - keywords: [ - 'body', - 'finger', - 'hand', - 'spock', - 'vulcan', - ], - types: [ - 'šŸ––šŸæ', - 'šŸ––šŸ¾', - 'šŸ––šŸ½', - 'šŸ––šŸ¼', - 'šŸ––šŸ»', - ], - }, - { - code: 'šŸ¤˜', - keywords: [ - 'body', - 'finger', - 'hand', - 'horns', - 'rock-on', - ], - types: [ - 'šŸ¤˜šŸæ', - 'šŸ¤˜šŸ¾', - 'šŸ¤˜šŸ½', - 'šŸ¤˜šŸ¼', - 'šŸ¤˜šŸ»', - ], - }, - { - code: 'šŸ¤™', - keywords: [ - 'call', - 'hand', - ], - types: [ - 'šŸ¤™šŸæ', - 'šŸ¤™šŸ¾', - 'šŸ¤™šŸ½', - 'šŸ¤™šŸ¼', - 'šŸ¤™šŸ»', - ], - }, - { - code: 'šŸ–', - keywords: [ - 'body', - 'finger', - 'hand', - 'splayed', - ], - types: [ - 'šŸ–šŸæ', - 'šŸ–šŸ¾', - 'šŸ–šŸ½', - 'šŸ–šŸ¼', - 'šŸ–šŸ»', - ], - }, - { - code: 'āœ‹', - keywords: [ - 'body', - 'hand', - ], - types: [ - 'āœ‹šŸæ', - 'āœ‹šŸ¾', - 'āœ‹šŸ½', - 'āœ‹šŸ¼', - 'āœ‹šŸ»', - ], - }, - { - code: 'šŸ‘Œ', - keywords: [ - 'body', - 'hand', - 'ok', - ], - types: [ - 'šŸ‘ŒšŸæ', - 'šŸ‘ŒšŸ¾', - 'šŸ‘ŒšŸ½', - 'šŸ‘ŒšŸ¼', - 'šŸ‘ŒšŸ»', - ], - }, - { - code: 'šŸ‘', - keywords: [ - '+1', - 'body', - 'hand', - 'thumb', - 'thumbs up', - 'up', - ], - types: [ - 'šŸ‘šŸæ', - 'šŸ‘šŸ¾', - 'šŸ‘šŸ½', - 'šŸ‘šŸ¼', - 'šŸ‘šŸ»', - ], - }, - { - code: 'šŸ‘Ž', - keywords: [ - '-1', - 'body', - 'down', - 'hand', - 'thumb', - 'thumbs down', - ], - types: [ - 'šŸ‘ŽšŸæ', - 'šŸ‘ŽšŸ¾', - 'šŸ‘ŽšŸ½', - 'šŸ‘ŽšŸ¼', - 'šŸ‘ŽšŸ»', - ], - }, - { - code: 'āœŠ', - keywords: [ - 'body', - 'clenched', - 'fist', - 'hand', - 'punch', - ], - types: [ - 'āœŠšŸæ', - 'āœŠšŸ¾', - 'āœŠšŸ½', - 'āœŠšŸ¼', - 'āœŠšŸ»', - ], - }, - { - code: 'šŸ‘Š', - keywords: [ - 'body', - 'clenched', - 'fist', - 'hand', - 'punch', - ], - types: [ - 'šŸ‘ŠšŸæ', - 'šŸ‘ŠšŸ¾', - 'šŸ‘ŠšŸ½', - 'šŸ‘ŠšŸ¼', - 'šŸ‘ŠšŸ»', - ], - }, - { - code: 'šŸ¤›', - keywords: [ - 'fist', - 'leftwards', - ], - types: [ - 'šŸ¤›šŸæ', - 'šŸ¤›šŸ¾', - 'šŸ¤›šŸ½', - 'šŸ¤›šŸ¼', - 'šŸ¤›šŸ»', - ], - }, - { - code: 'šŸ¤œ', - keywords: [ - 'fist', - 'rightwards', - ], - types: [ - 'šŸ¤œšŸæ', - 'šŸ¤œšŸ¾', - 'šŸ¤œšŸ½', - 'šŸ¤œšŸ¼', - 'šŸ¤œšŸ»', - ], - }, - { - code: 'šŸ¤š', - keywords: [ - 'backhand', - 'raised', - ], - types: [ - 'šŸ¤ššŸæ', - 'šŸ¤ššŸ¾', - 'šŸ¤ššŸ½', - 'šŸ¤ššŸ¼', - 'šŸ¤ššŸ»', - ], - }, - { - code: 'šŸ‘‹', - keywords: [ - 'body', - 'hand', - 'wave', - 'waving', - ], - types: [ - 'šŸ‘‹šŸæ', - 'šŸ‘‹šŸ¾', - 'šŸ‘‹šŸ½', - 'šŸ‘‹šŸ¼', - 'šŸ‘‹šŸ»', - ], - }, - { - code: 'šŸ‘', - keywords: [ - 'body', - 'clap', - 'hand', - ], - types: [ - 'šŸ‘šŸæ', - 'šŸ‘šŸ¾', - 'šŸ‘šŸ½', - 'šŸ‘šŸ¼', - 'šŸ‘šŸ»', - ], - }, - { - code: 'āœ', - keywords: [ - 'body', - 'hand', - 'write', - ], - types: [ - 'āœšŸæ', - 'āœšŸ¾', - 'āœšŸ½', - 'āœšŸ¼', - 'āœšŸ»', - ], - }, - { - code: 'šŸ‘', - keywords: [ - 'body', - 'hand', - 'open', - ], - types: [ - 'šŸ‘šŸæ', - 'šŸ‘šŸ¾', - 'šŸ‘šŸ½', - 'šŸ‘šŸ¼', - 'šŸ‘šŸ»', - ], - }, - { - code: 'šŸ™Œ', - keywords: [ - 'body', - 'celebration', - 'gesture', - 'hand', - 'hooray', - 'raised', - ], - types: [ - 'šŸ™ŒšŸæ', - 'šŸ™ŒšŸ¾', - 'šŸ™ŒšŸ½', - 'šŸ™ŒšŸ¼', - 'šŸ™ŒšŸ»', - ], - }, - { - code: 'šŸ™', - keywords: [ - 'ask', - 'body', - 'bow', - 'folded', - 'gesture', - 'hand', - 'please', - 'pray', - 'thanks', - ], - types: [ - 'šŸ™šŸæ', - 'šŸ™šŸ¾', - 'šŸ™šŸ½', - 'šŸ™šŸ¼', - 'šŸ™šŸ»', - ], - }, - { - code: 'šŸ¤', - keywords: [ - 'agreement', - 'hand', - 'handshake', - 'meeting', - 'shake', - ], - types: [ - 'šŸ¤šŸæ', - 'šŸ¤šŸ¾', - 'šŸ¤šŸ½', - 'šŸ¤šŸ¼', - 'šŸ¤šŸ»', - ], - }, - { - code: 'šŸ’…', - keywords: [ - 'body', - 'care', - 'cosmetics', - 'manicure', - 'nail', - 'polish', - ], - types: [ - 'šŸ’…šŸæ', - 'šŸ’…šŸ¾', - 'šŸ’…šŸ½', - 'šŸ’…šŸ¼', - 'šŸ’…šŸ»', - ], - }, - { - code: 'šŸ‘‚', - keywords: [ - 'body', - 'ear', - ], - types: [ - 'šŸ‘‚šŸæ', - 'šŸ‘‚šŸ¾', - 'šŸ‘‚šŸ½', - 'šŸ‘‚šŸ¼', - 'šŸ‘‚šŸ»', - ], - }, - { - code: 'šŸ‘ƒ', - keywords: [ - 'body', - 'nose', - ], - types: [ - 'šŸ‘ƒšŸæ', - 'šŸ‘ƒšŸ¾', - 'šŸ‘ƒšŸ½', - 'šŸ‘ƒšŸ¼', - 'šŸ‘ƒšŸ»', - ], - }, - { - code: 'šŸ‘£', - keywords: [ - 'body', - 'clothing', - 'footprint', - 'print', - ], - }, - { - code: 'šŸ‘€', - keywords: [ - 'body', - 'eye', - 'face', - ], - }, - { - code: 'šŸ‘', - keywords: [ - 'body', - 'eye', - ], - }, - { - code: 'šŸ‘ā€šŸ—Ø', - keywords: [ - 'bubble', - 'eye', - 'speech', - 'witness', - ], - }, - { - code: 'šŸ‘…', - keywords: [ - 'body', - 'tongue', - ], - }, - { - code: 'šŸ‘„', - keywords: [ - 'body', - 'lips', - 'mouth', - ], - }, - { - code: 'šŸ’‹', - keywords: [ - 'heart', - 'kiss', - 'lips', - 'mark', - 'romance', - ], - }, - { - code: 'šŸ’˜', - keywords: [ - 'arrow', - 'cupid', - 'heart', - 'romance', - ], - }, - { - code: 'ā¤', - keywords: [ - 'heart', - ], - }, - { - code: 'šŸ’“', - keywords: [ - 'beating', - 'heart', - 'heartbeat', - 'pulsating', - ], - }, - { - code: 'šŸ’”', - keywords: [ - 'break', - 'broken', - 'heart', - ], - }, - { - code: 'šŸ’•', - keywords: [ - 'heart', - 'love', - ], - }, - { - code: 'šŸ’–', - keywords: [ - 'excited', - 'heart', - 'sparkle', - ], - }, - { - code: 'šŸ’—', - keywords: [ - 'excited', - 'growing', - 'heart', - 'heartpulse', - 'nervous', - ], - }, - { - code: 'šŸ’™', - keywords: [ - 'blue', - 'heart', - ], - }, - { - code: 'šŸ’š', - keywords: [ - 'green', - 'heart', - ], - }, - { - code: 'šŸ’›', - keywords: [ - 'heart', - 'yellow', - ], - }, - { - code: 'šŸ’œ', - keywords: [ - 'heart', - 'purple', - ], - }, - { - code: 'šŸ–¤', - keywords: [ - 'black', - 'evil', - 'heart', - 'wicked', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'heart', - 'ribbon', - 'valentine', - ], - }, - { - code: 'šŸ’ž', - keywords: [ - 'heart', - 'revolving', - ], - }, - { - code: 'šŸ’Ÿ', - keywords: [ - 'heart', - ], - }, - { - code: 'ā£', - keywords: [ - 'exclamation', - 'heart', - 'mark', - 'punctuation', - ], - }, - { - code: 'šŸ’Œ', - keywords: [ - 'heart', - 'letter', - 'love', - 'mail', - 'romance', - ], - }, - { - code: 'šŸ’¤', - keywords: [ - 'comic', - 'sleep', - 'zzz', - ], - }, - { - code: 'šŸ’¢', - keywords: [ - 'angry', - 'comic', - 'mad', - ], - }, - { - code: 'šŸ’£', - keywords: [ - 'bomb', - 'comic', - ], - }, - { - code: 'šŸ’„', - keywords: [ - 'boom', - 'collision', - 'comic', - ], - }, - { - code: 'šŸ’¦', - keywords: [ - 'comic', - 'splashing', - 'sweat', - ], - }, - { - code: 'šŸ’Ø', - keywords: [ - 'comic', - 'dash', - 'running', - ], - }, - { - code: 'šŸ’«', - keywords: [ - 'comic', - 'dizzy', - 'star', - ], - }, - { - code: 'šŸ’¬', - keywords: [ - 'balloon', - 'bubble', - 'comic', - 'dialog', - 'speech', - ], - }, - { - code: 'šŸ—Ø', - keywords: [ - 'dialog', - 'speech', - ], - }, - { - code: 'šŸ—Æ', - keywords: [ - 'angry', - 'balloon', - 'bubble', - 'mad', - ], - }, - { - code: 'šŸ’­', - keywords: [ - 'balloon', - 'bubble', - 'comic', - 'thought', - ], - }, - { - code: 'šŸ•³', - keywords: [ - 'hole', - ], - }, - { - code: 'šŸ‘“', - keywords: [ - 'clothing', - 'eye', - 'eyeglasses', - 'eyewear', - 'glasses', - ], - }, - { - code: 'šŸ•¶', - keywords: [ - 'dark', - 'eye', - 'eyewear', - 'glasses', - 'sunglasses', - ], - }, - { - code: 'šŸ‘”', - keywords: [ - 'clothing', - 'necktie', - ], - }, - { - code: 'šŸ‘•', - keywords: [ - 'clothing', - 'shirt', - 'tshirt', - ], - }, - { - code: 'šŸ‘–', - keywords: [ - 'clothing', - 'jeans', - 'pants', - 'trousers', - ], - }, - { - code: 'šŸ‘—', - keywords: [ - 'clothing', - 'dress', - ], - }, - { - code: 'šŸ‘˜', - keywords: [ - 'clothing', - 'kimono', - ], - }, - { - code: 'šŸ‘™', - keywords: [ - 'bikini', - 'clothing', - 'swim', - ], - }, - { - code: 'šŸ‘š', - keywords: [ - 'clothing', - 'woman', - ], - }, - { - code: 'šŸ‘›', - keywords: [ - 'clothing', - 'coin', - 'purse', - ], - }, - { - code: 'šŸ‘œ', - keywords: [ - 'bag', - 'clothing', - 'handbag', - ], - }, - { - code: 'šŸ‘', - keywords: [ - 'bag', - 'clothing', - 'pouch', - ], - }, - { - code: 'šŸ›', - keywords: [ - 'bag', - 'hotel', - 'shopping', - ], - }, - { - code: 'šŸŽ’', - keywords: [ - 'activity', - 'bag', - 'satchel', - 'school', - ], - }, - { - code: 'šŸ‘ž', - keywords: [ - 'clothing', - 'man', - 'shoe', - ], - }, - { - code: 'šŸ‘Ÿ', - keywords: [ - 'athletic', - 'clothing', - 'shoe', - 'sneaker', - ], - }, - { - code: 'šŸ‘ ', - keywords: [ - 'clothing', - 'heel', - 'shoe', - 'woman', - ], - }, - { - code: 'šŸ‘”', - keywords: [ - 'clothing', - 'sandal', - 'shoe', - 'woman', - ], - }, - { - code: 'šŸ‘¢', - keywords: [ - 'boot', - 'clothing', - 'shoe', - 'woman', - ], - }, - { - code: 'šŸ‘‘', - keywords: [ - 'clothing', - 'crown', - 'king', - 'queen', - ], - }, - { - code: 'šŸ‘’', - keywords: [ - 'clothing', - 'hat', - 'woman', - ], - }, - { - code: 'šŸŽ©', - keywords: [ - 'activity', - 'clothing', - 'entertainment', - 'hat', - 'top', - 'tophat', - ], - }, - { - code: 'šŸŽ“', - keywords: [ - 'activity', - 'cap', - 'celebration', - 'clothing', - 'graduation', - 'hat', - ], - }, - { - code: 'ā›‘', - keywords: [ - 'aid', - 'cross', - 'face', - 'hat', - 'helmet', - ], - }, - { - code: 'šŸ“æ', - keywords: [ - 'beads', - 'clothing', - 'necklace', - 'prayer', - 'religion', - ], - }, - { - code: 'šŸ’„', - keywords: [ - 'cosmetics', - 'lipstick', - 'makeup', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'diamond', - 'ring', - 'romance', - ], - }, - { - code: 'šŸ’Ž', - keywords: [ - 'diamond', - 'gem', - 'jewel', - 'romance', - ], - }, - ], - }, - { - title: 'Animals & Nature', - data: [ - { - code: 'šŸµ', - keywords: [ - 'face', - 'monkey', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'monkey', - ], - }, - { - code: 'šŸ¦', - keywords: [ - 'gorilla', - ], - }, - { - code: 'šŸ¶', - keywords: [ - 'dog', - 'face', - 'pet', - ], - }, - { - code: 'šŸ•', - keywords: [ - 'dog', - 'pet', - ], - }, - { - code: 'šŸ©', - keywords: [ - 'dog', - 'poodle', - ], - }, - { - code: 'šŸŗ', - keywords: [ - 'face', - 'wolf', - ], - }, - { - code: 'šŸ¦Š', - keywords: [ - 'face', - 'fox', - ], - }, - { - code: 'šŸ±', - keywords: [ - 'cat', - 'face', - 'pet', - ], - }, - { - code: 'šŸˆ', - keywords: [ - 'cat', - 'pet', - ], - }, - { - code: 'šŸ¦', - keywords: [ - 'face', - 'leo', - 'lion', - 'zodiac', - ], - }, - { - code: 'šŸÆ', - keywords: [ - 'face', - 'tiger', - ], - }, - { - code: 'šŸ…', - keywords: [ - 'tiger', - ], - }, - { - code: 'šŸ†', - keywords: [ - 'leopard', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'face', - 'horse', - ], - }, - { - code: 'šŸŽ', - keywords: [ - 'horse', - 'racehorse', - 'racing', - ], - }, - { - code: 'šŸ¦Œ', - keywords: [ - 'deer', - ], - }, - { - code: 'šŸ¦„', - keywords: [ - 'face', - 'unicorn', - ], - }, - { - code: 'šŸ®', - keywords: [ - 'cow', - 'face', - ], - }, - { - code: 'šŸ‚', - keywords: [ - 'bull', - 'ox', - 'taurus', - 'zodiac', - ], - }, - { - code: 'šŸƒ', - keywords: [ - 'buffalo', - 'water', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'cow', - ], - }, - { - code: 'šŸ·', - keywords: [ - 'face', - 'pig', - ], - }, - { - code: 'šŸ–', - keywords: [ - 'pig', - 'sow', - ], - }, - { - code: 'šŸ—', - keywords: [ - 'boar', - 'pig', - ], - }, - { - code: 'šŸ½', - keywords: [ - 'face', - 'nose', - 'pig', - ], - }, - { - code: 'šŸ', - keywords: [ - 'aries', - 'ram', - 'sheep', - 'zodiac', - ], - }, - { - code: 'šŸ‘', - keywords: [ - 'ewe', - 'sheep', - ], - }, - { - code: 'šŸ', - keywords: [ - 'capricorn', - 'goat', - 'zodiac', - ], - }, - { - code: 'šŸŖ', - keywords: [ - 'camel', - 'dromedary', - 'hump', - ], - }, - { - code: 'šŸ«', - keywords: [ - 'bactrian', - 'camel', - 'hump', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'elephant', - ], - }, - { - code: 'šŸ¦', - keywords: [ - 'rhinoceros', - ], - }, - { - code: 'šŸ­', - keywords: [ - 'face', - 'mouse', - ], - }, - { - code: 'šŸ', - keywords: [ - 'mouse', - ], - }, - { - code: 'šŸ€', - keywords: [ - 'rat', - ], - }, - { - code: 'šŸ¹', - keywords: [ - 'face', - 'hamster', - 'pet', - ], - }, - { - code: 'šŸ°', - keywords: [ - 'bunny', - 'face', - 'pet', - 'rabbit', - ], - }, - { - code: 'šŸ‡', - keywords: [ - 'bunny', - 'pet', - 'rabbit', - ], - }, - { - code: 'šŸæ', - keywords: [ - 'chipmunk', - ], - }, - { - code: 'šŸ¦‡', - keywords: [ - 'bat', - 'vampire', - ], - }, - { - code: 'šŸ»', - keywords: [ - 'bear', - 'face', - ], - }, - { - code: 'šŸØ', - keywords: [ - 'bear', - 'koala', - ], - }, - { - code: 'šŸ¼', - keywords: [ - 'face', - 'panda', - ], - }, - { - code: 'šŸ¾', - keywords: [ - 'feet', - 'paw', - 'print', - ], - }, - { - code: 'šŸ¦ƒ', - keywords: [ - 'turkey', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'chicken', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'rooster', - ], - }, - { - code: 'šŸ£', - keywords: [ - 'baby', - 'chick', - 'hatching', - ], - }, - { - code: 'šŸ¤', - keywords: [ - 'baby', - 'chick', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'baby', - 'chick', - ], - }, - { - code: 'šŸ¦', - keywords: [ - 'bird', - ], - }, - { - code: 'šŸ§', - keywords: [ - 'penguin', - ], - }, - { - code: 'šŸ•Š', - keywords: [ - 'bird', - 'dove', - 'fly', - 'peace', - ], - }, - { - code: 'šŸ¦…', - keywords: [ - 'bird', - 'eagle', - ], - }, - { - code: 'šŸ¦†', - keywords: [ - 'bird', - 'duck', - ], - }, - { - code: 'šŸ¦‰', - keywords: [ - 'bird', - 'owl', - 'wise', - ], - }, - { - code: 'šŸø', - keywords: [ - 'face', - 'frog', - ], - }, - { - code: 'šŸŠ', - keywords: [ - 'crocodile', - ], - }, - { - code: 'šŸ¢', - keywords: [ - 'turtle', - ], - }, - { - code: 'šŸ¦Ž', - keywords: [ - 'lizard', - 'reptile', - ], - }, - { - code: 'šŸ', - keywords: [ - 'bearer', - 'ophiuchus', - 'serpent', - 'snake', - 'zodiac', - ], - }, - { - code: 'šŸ²', - keywords: [ - 'dragon', - 'face', - 'fairy tale', - ], - }, - { - code: 'šŸ‰', - keywords: [ - 'dragon', - 'fairy tale', - ], - }, - { - code: 'šŸ³', - keywords: [ - 'face', - 'spouting', - 'whale', - ], - }, - { - code: 'šŸ‹', - keywords: [ - 'whale', - ], - }, - { - code: 'šŸ¬', - keywords: [ - 'dolphin', - 'flipper', - ], - }, - { - code: 'šŸŸ', - keywords: [ - 'fish', - 'pisces', - 'zodiac', - ], - }, - { - code: 'šŸ ', - keywords: [ - 'fish', - 'tropical', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'blowfish', - 'fish', - ], - }, - { - code: 'šŸ¦ˆ', - keywords: [ - 'fish', - 'shark', - ], - }, - { - code: 'šŸ™', - keywords: [ - 'octopus', - ], - }, - { - code: 'šŸš', - keywords: [ - 'shell', - 'spiral', - ], - }, - { - code: 'šŸ¦€', - keywords: [ - 'cancer', - 'crab', - 'zodiac', - ], - }, - { - code: 'šŸ¦', - keywords: [ - 'shellfish', - 'shrimp', - 'small', - ], - }, - { - code: 'šŸ¦‘', - keywords: [ - 'molusc', - 'squid', - ], - }, - { - code: 'šŸ¦‹', - keywords: [ - 'butterfly', - 'insect', - 'pretty', - ], - }, - { - code: 'šŸŒ', - keywords: [ - 'snail', - ], - }, - { - code: 'šŸ›', - keywords: [ - 'bug', - 'insect', - ], - }, - { - code: 'šŸœ', - keywords: [ - 'ant', - 'insect', - ], - }, - { - code: 'šŸ', - keywords: [ - 'bee', - 'honeybee', - 'insect', - ], - }, - { - code: 'šŸž', - keywords: [ - 'beetle', - 'insect', - 'lady beetle', - 'ladybird', - 'ladybug', - ], - }, - { - code: 'šŸ•·', - keywords: [ - 'insect', - 'spider', - ], - }, - { - code: 'šŸ•ø', - keywords: [ - 'spider', - 'web', - ], - }, - { - code: 'šŸ¦‚', - keywords: [ - 'scorpio', - 'scorpion', - 'scorpius', - 'zodiac', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'bouquet', - 'flower', - 'plant', - 'romance', - ], - }, - { - code: 'šŸŒø', - keywords: [ - 'blossom', - 'cherry', - 'flower', - 'plant', - ], - }, - { - code: 'šŸ’®', - keywords: [ - 'flower', - ], - }, - { - code: 'šŸµ', - keywords: [ - 'plant', - 'rosette', - ], - }, - { - code: 'šŸŒ¹', - keywords: [ - 'flower', - 'plant', - 'rose', - ], - }, - { - code: 'šŸ„€', - keywords: [ - 'flower', - 'wilted', - ], - }, - { - code: 'šŸŒŗ', - keywords: [ - 'flower', - 'hibiscus', - 'plant', - ], - }, - { - code: 'šŸŒ»', - keywords: [ - 'flower', - 'plant', - 'sun', - 'sunflower', - ], - }, - { - code: 'šŸŒ¼', - keywords: [ - 'blossom', - 'flower', - 'plant', - ], - }, - { - code: 'šŸŒ·', - keywords: [ - 'flower', - 'plant', - 'tulip', - ], - }, - { - code: 'šŸŒ±', - keywords: [ - 'plant', - 'seedling', - 'young', - ], - }, - { - code: 'šŸŒ²', - keywords: [ - 'evergreen', - 'plant', - 'tree', - ], - }, - { - code: 'šŸŒ³', - keywords: [ - 'deciduous', - 'plant', - 'shedding', - 'tree', - ], - }, - { - code: 'šŸŒ“', - keywords: [ - 'palm', - 'plant', - 'tree', - ], - }, - { - code: 'šŸŒµ', - keywords: [ - 'cactus', - 'plant', - ], - }, - { - code: 'šŸŒ¾', - keywords: [ - 'ear', - 'plant', - 'rice', - ], - }, - { - code: 'šŸŒæ', - keywords: [ - 'herb', - 'leaf', - 'plant', - ], - }, - { - code: 'ā˜˜', - keywords: [ - 'plant', - 'shamrock', - ], - }, - { - code: 'šŸ€', - keywords: [ - '4', - 'clover', - 'four', - 'leaf', - 'plant', - ], - }, - { - code: 'šŸ', - keywords: [ - 'falling', - 'leaf', - 'maple', - 'plant', - ], - }, - { - code: 'šŸ‚', - keywords: [ - 'falling', - 'leaf', - 'plant', - ], - }, - { - code: 'šŸƒ', - keywords: [ - 'blow', - 'flutter', - 'leaf', - 'plant', - 'wind', - ], - }, - { - code: 'šŸ‡', - keywords: [ - 'fruit', - 'grape', - 'plant', - ], - }, - { - code: 'šŸˆ', - keywords: [ - 'fruit', - 'melon', - 'plant', - ], - }, - { - code: 'šŸ‰', - keywords: [ - 'fruit', - 'plant', - 'watermelon', - ], - }, - { - code: 'šŸŠ', - keywords: [ - 'fruit', - 'orange', - 'plant', - 'tangerine', - ], - }, - { - code: 'šŸ‹', - keywords: [ - 'citrus', - 'fruit', - 'lemon', - 'plant', - ], - }, - { - code: 'šŸŒ', - keywords: [ - 'banana', - 'fruit', - 'plant', - ], - }, - { - code: 'šŸ', - keywords: [ - 'fruit', - 'pineapple', - 'plant', - ], - }, - { - code: 'šŸŽ', - keywords: [ - 'apple', - 'fruit', - 'plant', - 'red', - ], - }, - { - code: 'šŸ', - keywords: [ - 'apple', - 'fruit', - 'green', - 'plant', - ], - }, - { - code: 'šŸ', - keywords: [ - 'fruit', - 'pear', - 'plant', - ], - }, - { - code: 'šŸ‘', - keywords: [ - 'fruit', - 'peach', - 'plant', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'cherry', - 'fruit', - 'plant', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'berry', - 'fruit', - 'plant', - 'strawberry', - ], - }, - { - code: 'šŸ…', - keywords: [ - 'plant', - 'tomato', - 'vegetable', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'fruit', - 'kiwi', - ], - }, - { - code: 'šŸ„‘', - keywords: [ - 'avocado', - 'fruit', - ], - }, - { - code: 'šŸ†', - keywords: [ - 'aubergine', - 'eggplant', - 'plant', - 'vegetable', - ], - }, - { - code: 'šŸ„”', - keywords: [ - 'potato', - 'vegetable', - ], - }, - { - code: 'šŸ„•', - keywords: [ - 'carrot', - 'vegetable', - ], - }, - { - code: 'šŸŒ½', - keywords: [ - 'corn', - 'ear', - 'maize', - 'maze', - 'plant', - ], - }, - { - code: 'šŸŒ¶', - keywords: [ - 'hot', - 'pepper', - 'plant', - ], - }, - { - code: 'šŸ„’', - keywords: [ - 'cucumber', - 'pickle', - 'vegetable', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'mushroom', - 'plant', - ], - }, - { - code: 'šŸ„œ', - keywords: [ - 'nut', - 'peanut', - 'vegetable', - ], - }, - { - code: 'šŸŒ°', - keywords: [ - 'chestnut', - 'plant', - ], - }, - { - code: 'šŸž', - keywords: [ - 'bread', - 'loaf', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'bread', - 'crescent roll', - 'croissant', - 'french', - ], - }, - { - code: 'šŸ„–', - keywords: [ - 'baguette', - 'bread', - 'french', - ], - }, - { - code: 'šŸ„ž', - keywords: [ - 'crĆŖpe', - 'hotcake', - 'pancake', - ], - }, - { - code: 'šŸ§€', - keywords: [ - 'cheese', - ], - }, - { - code: 'šŸ–', - keywords: [ - 'bone', - 'meat', - ], - }, - { - code: 'šŸ—', - keywords: [ - 'bone', - 'chicken', - 'leg', - 'poultry', - ], - }, - { - code: 'šŸ„“', - keywords: [ - 'bacon', - 'meat', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'burger', - 'hamburger', - ], - }, - { - code: 'šŸŸ', - keywords: [ - 'french', - 'fries', - ], - }, - { - code: 'šŸ•', - keywords: [ - 'cheese', - 'pizza', - 'slice', - ], - }, - { - code: 'šŸŒ­', - keywords: [ - 'frankfurter', - 'hot dog', - 'hotdog', - 'sausage', - ], - }, - { - code: 'šŸŒ®', - keywords: [ - 'mexican', - 'taco', - ], - }, - { - code: 'šŸŒÆ', - keywords: [ - 'burrito', - 'mexican', - ], - }, - { - code: 'šŸ„™', - keywords: [ - 'falafel', - 'flatbread', - 'gyro', - 'kebab', - 'stuffed', - ], - }, - { - code: 'šŸ„š', - keywords: [ - 'egg', - ], - }, - { - code: 'šŸ³', - keywords: [ - 'cooking', - 'egg', - 'frying', - 'pan', - ], - }, - { - code: 'šŸ„˜', - keywords: [ - 'casserole', - 'paella', - 'pan', - 'shallow', - ], - }, - { - code: 'šŸ²', - keywords: [ - 'pot', - 'stew', - ], - }, - { - code: 'šŸ„—', - keywords: [ - 'green', - 'salad', - ], - }, - { - code: 'šŸæ', - keywords: [ - 'popcorn', - ], - }, - { - code: 'šŸ±', - keywords: [ - 'bento', - 'box', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'cracker', - 'rice', - ], - }, - { - code: 'šŸ™', - keywords: [ - 'ball', - 'japanese', - 'rice', - ], - }, - { - code: 'šŸš', - keywords: [ - 'cooked', - 'rice', - ], - }, - { - code: 'šŸ›', - keywords: [ - 'curry', - 'rice', - ], - }, - { - code: 'šŸœ', - keywords: [ - 'bowl', - 'noodle', - 'ramen', - 'steaming', - ], - }, - { - code: 'šŸ', - keywords: [ - 'pasta', - 'spaghetti', - ], - }, - { - code: 'šŸ ', - keywords: [ - 'potato', - 'roasted', - 'sweet', - ], - }, - { - code: 'šŸ¢', - keywords: [ - 'kebab', - 'oden', - 'seafood', - 'skewer', - 'stick', - ], - }, - { - code: 'šŸ£', - keywords: [ - 'sushi', - ], - }, - { - code: 'šŸ¤', - keywords: [ - 'fried', - 'prawn', - 'shrimp', - 'tempura', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'cake', - 'fish', - 'pastry', - 'swirl', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'dango', - 'dessert', - 'japanese', - 'skewer', - 'stick', - 'sweet', - ], - }, - { - code: 'šŸ¦', - keywords: [ - 'cream', - 'dessert', - 'ice', - 'icecream', - 'soft', - 'sweet', - ], - }, - { - code: 'šŸ§', - keywords: [ - 'dessert', - 'ice', - 'shaved', - 'sweet', - ], - }, - { - code: 'šŸØ', - keywords: [ - 'cream', - 'dessert', - 'ice', - 'sweet', - ], - }, - { - code: 'šŸ©', - keywords: [ - 'dessert', - 'donut', - 'doughnut', - 'sweet', - ], - }, - { - code: 'šŸŖ', - keywords: [ - 'cookie', - 'dessert', - 'sweet', - ], - }, - { - code: 'šŸŽ‚', - keywords: [ - 'birthday', - 'cake', - 'celebration', - 'dessert', - 'pastry', - 'sweet', - ], - }, - { - code: 'šŸ°', - keywords: [ - 'cake', - 'dessert', - 'pastry', - 'shortcake', - 'slice', - 'sweet', - ], - }, - { - code: 'šŸ«', - keywords: [ - 'bar', - 'chocolate', - 'dessert', - 'sweet', - ], - }, - { - code: 'šŸ¬', - keywords: [ - 'candy', - 'dessert', - 'sweet', - ], - }, - { - code: 'šŸ­', - keywords: [ - 'candy', - 'dessert', - 'lollipop', - 'sweet', - ], - }, - { - code: 'šŸ®', - keywords: [ - 'custard', - 'dessert', - 'pudding', - 'sweet', - ], - }, - { - code: 'šŸÆ', - keywords: [ - 'honey', - 'honeypot', - 'pot', - 'sweet', - ], - }, - { - code: 'šŸ¼', - keywords: [ - 'baby', - 'bottle', - 'drink', - 'milk', - ], - }, - { - code: 'šŸ„›', - keywords: [ - 'drink', - 'glass', - 'milk', - ], - }, - { - code: 'ā˜•', - keywords: [ - 'beverage', - 'coffee', - 'drink', - 'hot', - 'steaming', - 'tea', - ], - }, - { - code: 'šŸµ', - keywords: [ - 'beverage', - 'cup', - 'drink', - 'tea', - 'teacup', - ], - }, - { - code: 'šŸ¶', - keywords: [ - 'bar', - 'beverage', - 'bottle', - 'cup', - 'drink', - 'sake', - ], - }, - { - code: 'šŸ¾', - keywords: [ - 'bar', - 'bottle', - 'cork', - 'drink', - 'popping', - ], - }, - { - code: 'šŸ·', - keywords: [ - 'bar', - 'beverage', - 'drink', - 'glass', - 'wine', - ], - }, - { - code: 'šŸø', - keywords: [ - 'bar', - 'cocktail', - 'drink', - 'glass', - ], - }, - { - code: 'šŸ¹', - keywords: [ - 'bar', - 'drink', - 'tropical', - ], - }, - { - code: 'šŸŗ', - keywords: [ - 'bar', - 'beer', - 'drink', - 'mug', - ], - }, - { - code: 'šŸ»', - keywords: [ - 'bar', - 'beer', - 'clink', - 'drink', - 'mug', - ], - }, - { - code: 'šŸ„‚', - keywords: [ - 'celebrate', - 'clink', - 'drink', - 'glass', - ], - }, - { - code: 'šŸ„ƒ', - keywords: [ - 'glass', - 'liquor', - 'shot', - 'tumbler', - 'whisky', - ], - }, - { - code: 'šŸ½', - keywords: [ - 'cooking', - 'fork', - 'knife', - 'plate', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'cooking', - 'fork', - 'knife', - ], - }, - { - code: 'šŸ„„', - keywords: [ - 'spoon', - 'tableware', - ], - }, - { - code: 'šŸ”Ŗ', - keywords: [ - 'cooking', - 'hocho', - 'knife', - 'tool', - 'weapon', - ], - }, - { - code: 'šŸŗ', - keywords: [ - 'amphora', - 'aquarius', - 'cooking', - 'drink', - 'jug', - 'tool', - 'weapon', - 'zodiac', - ], - }, - ], - }, - { - title: 'Travel & Places', - data: [ - { - code: 'šŸŒ', - keywords: [ - 'africa', - 'earth', - 'europe', - 'globe', - 'world', - ], - }, - { - code: 'šŸŒŽ', - keywords: [ - 'americas', - 'earth', - 'globe', - 'world', - ], - }, - { - code: 'šŸŒ', - keywords: [ - 'asia', - 'australia', - 'earth', - 'globe', - 'world', - ], - }, - { - code: 'šŸŒ', - keywords: [ - 'earth', - 'globe', - 'meridians', - 'world', - ], - }, - { - code: 'šŸ—ŗ', - keywords: [ - 'map', - 'world', - ], - }, - { - code: 'šŸ—¾', - keywords: [ - 'japan', - 'map', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'cold', - 'mountain', - 'snow', - ], - }, - { - code: 'ā›°', - keywords: [ - 'mountain', - ], - }, - { - code: 'šŸŒ‹', - keywords: [ - 'eruption', - 'mountain', - 'volcano', - 'weather', - ], - }, - { - code: 'šŸ—»', - keywords: [ - 'fuji', - 'mountain', - ], - }, - { - code: 'šŸ•', - keywords: [ - 'camping', - ], - }, - { - code: 'šŸ–', - keywords: [ - 'beach', - 'umbrella', - ], - }, - { - code: 'šŸœ', - keywords: [ - 'desert', - ], - }, - { - code: 'šŸ', - keywords: [ - 'desert', - 'island', - ], - }, - { - code: 'šŸž', - keywords: [ - 'national park', - 'park', - ], - }, - { - code: 'šŸŸ', - keywords: [ - 'stadium', - ], - }, - { - code: 'šŸ›', - keywords: [ - 'building', - 'classical', - ], - }, - { - code: 'šŸ—', - keywords: [ - 'building', - 'construction', - ], - }, - { - code: 'šŸ˜', - keywords: [ - 'building', - 'house', - ], - }, - { - code: 'šŸ™', - keywords: [ - 'building', - 'city', - ], - }, - { - code: 'šŸš', - keywords: [ - 'building', - 'derelict', - 'house', - ], - }, - { - code: 'šŸ ', - keywords: [ - 'building', - 'home', - 'house', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'building', - 'garden', - 'home', - 'house', - ], - }, - { - code: 'šŸ¢', - keywords: [ - 'building', - ], - }, - { - code: 'šŸ£', - keywords: [ - 'building', - 'japanese', - 'post', - ], - }, - { - code: 'šŸ¤', - keywords: [ - 'building', - 'european', - 'post', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'building', - 'doctor', - 'hospital', - 'medicine', - ], - }, - { - code: 'šŸ¦', - keywords: [ - 'bank', - 'building', - ], - }, - { - code: 'šŸØ', - keywords: [ - 'building', - 'hotel', - ], - }, - { - code: 'šŸ©', - keywords: [ - 'building', - 'hotel', - 'love', - ], - }, - { - code: 'šŸŖ', - keywords: [ - 'building', - 'convenience', - 'store', - ], - }, - { - code: 'šŸ«', - keywords: [ - 'building', - 'school', - ], - }, - { - code: 'šŸ¬', - keywords: [ - 'building', - 'department', - 'store', - ], - }, - { - code: 'šŸ­', - keywords: [ - 'building', - 'factory', - ], - }, - { - code: 'šŸÆ', - keywords: [ - 'building', - 'castle', - 'japanese', - ], - }, - { - code: 'šŸ°', - keywords: [ - 'building', - 'castle', - 'european', - ], - }, - { - code: 'šŸ’’', - keywords: [ - 'activity', - 'chapel', - 'romance', - 'wedding', - ], - }, - { - code: 'šŸ—¼', - keywords: [ - 'tokyo', - 'tower', - ], - }, - { - code: 'šŸ—½', - keywords: [ - 'liberty', - 'statue', - ], - }, - { - code: 'ā›Ŗ', - keywords: [ - 'building', - 'christian', - 'church', - 'cross', - 'religion', - ], - }, - { - code: 'šŸ•Œ', - keywords: [ - 'islam', - 'mosque', - 'muslim', - 'religion', - ], - }, - { - code: 'šŸ•', - keywords: [ - 'jew', - 'jewish', - 'religion', - 'synagogue', - 'temple', - ], - }, - { - code: 'ā›©', - keywords: [ - 'religion', - 'shinto', - 'shrine', - ], - }, - { - code: 'šŸ•‹', - keywords: [ - 'islam', - 'kaaba', - 'muslim', - 'religion', - ], - }, - { - code: 'ā›²', - keywords: [ - 'fountain', - ], - }, - { - code: 'ā›ŗ', - keywords: [ - 'camping', - 'tent', - ], - }, - { - code: 'šŸŒ', - keywords: [ - 'fog', - 'weather', - ], - }, - { - code: 'šŸŒƒ', - keywords: [ - 'night', - 'star', - 'weather', - ], - }, - { - code: 'šŸŒ„', - keywords: [ - 'morning', - 'mountain', - 'sun', - 'sunrise', - 'weather', - ], - }, - { - code: 'šŸŒ…', - keywords: [ - 'morning', - 'sun', - 'sunrise', - 'weather', - ], - }, - { - code: 'šŸŒ†', - keywords: [ - 'building', - 'city', - 'dusk', - 'evening', - 'landscape', - 'sun', - 'sunset', - 'weather', - ], - }, - { - code: 'šŸŒ‡', - keywords: [ - 'building', - 'dusk', - 'sun', - 'sunset', - 'weather', - ], - }, - { - code: 'šŸŒ‰', - keywords: [ - 'bridge', - 'night', - 'weather', - ], - }, - { - code: 'ā™Ø', - keywords: [ - 'hot', - 'hotsprings', - 'springs', - 'steaming', - ], - }, - { - code: 'šŸŒŒ', - keywords: [ - 'milky way', - 'space', - 'weather', - ], - }, - { - code: 'šŸŽ ', - keywords: [ - 'activity', - 'carousel', - 'entertainment', - 'horse', - ], - }, - { - code: 'šŸŽ”', - keywords: [ - 'activity', - 'amusement park', - 'entertainment', - 'ferris', - 'wheel', - ], - }, - { - code: 'šŸŽ¢', - keywords: [ - 'activity', - 'amusement park', - 'coaster', - 'entertainment', - 'roller', - ], - }, - { - code: 'šŸ’ˆ', - keywords: [ - 'barber', - 'haircut', - 'pole', - ], - }, - { - code: 'šŸŽŖ', - keywords: [ - 'activity', - 'circus', - 'entertainment', - 'tent', - ], - }, - { - code: 'šŸŽ­', - keywords: [ - 'activity', - 'art', - 'entertainment', - 'mask', - 'performing', - 'theater', - 'theatre', - ], - }, - { - code: 'šŸ–¼', - keywords: [ - 'art', - 'frame', - 'museum', - 'painting', - 'picture', - ], - }, - { - code: 'šŸŽØ', - keywords: [ - 'activity', - 'art', - 'entertainment', - 'museum', - 'painting', - 'palette', - ], - }, - { - code: 'šŸŽ°', - keywords: [ - 'activity', - 'game', - 'slot', - ], - }, - { - code: 'šŸš‚', - keywords: [ - 'engine', - 'locomotive', - 'railway', - 'steam', - 'train', - 'vehicle', - ], - }, - { - code: 'šŸšƒ', - keywords: [ - 'car', - 'electric', - 'railway', - 'train', - 'tram', - 'trolleybus', - 'vehicle', - ], - }, - { - code: 'šŸš„', - keywords: [ - 'railway', - 'shinkansen', - 'speed', - 'train', - 'vehicle', - ], - }, - { - code: 'šŸš…', - keywords: [ - 'bullet', - 'railway', - 'shinkansen', - 'speed', - 'train', - 'vehicle', - ], - }, - { - code: 'šŸš†', - keywords: [ - 'railway', - 'train', - 'vehicle', - ], - }, - { - code: 'šŸš‡', - keywords: [ - 'metro', - 'subway', - 'vehicle', - ], - }, - { - code: 'šŸšˆ', - keywords: [ - 'railway', - 'vehicle', - ], - }, - { - code: 'šŸš‰', - keywords: [ - 'railway', - 'station', - 'train', - 'vehicle', - ], - }, - { - code: 'šŸšŠ', - keywords: [ - 'tram', - 'trolleybus', - 'vehicle', - ], - }, - { - code: 'šŸš', - keywords: [ - 'monorail', - 'vehicle', - ], - }, - { - code: 'šŸšž', - keywords: [ - 'car', - 'mountain', - 'railway', - 'vehicle', - ], - }, - { - code: 'šŸš‹', - keywords: [ - 'car', - 'tram', - 'trolleybus', - 'vehicle', - ], - }, - { - code: 'šŸšŒ', - keywords: [ - 'bus', - 'vehicle', - ], - }, - { - code: 'šŸš', - keywords: [ - 'bus', - 'oncoming', - 'vehicle', - ], - }, - { - code: 'šŸšŽ', - keywords: [ - 'bus', - 'tram', - 'trolley', - 'trolleybus', - 'vehicle', - ], - }, - { - code: 'šŸš', - keywords: [ - 'bus', - 'busstop', - 'stop', - ], - }, - { - code: 'šŸš', - keywords: [ - 'bus', - 'minibus', - 'vehicle', - ], - }, - { - code: 'šŸš‘', - keywords: [ - 'ambulance', - 'vehicle', - ], - }, - { - code: 'šŸš’', - keywords: [ - 'engine', - 'fire', - 'truck', - 'vehicle', - ], - }, - { - code: 'šŸš“', - keywords: [ - 'car', - 'patrol', - 'police', - 'vehicle', - ], - }, - { - code: 'šŸš”', - keywords: [ - 'car', - 'oncoming', - 'police', - 'vehicle', - ], - }, - { - code: 'šŸš•', - keywords: [ - 'taxi', - 'vehicle', - ], - }, - { - code: 'šŸš–', - keywords: [ - 'oncoming', - 'taxi', - 'vehicle', - ], - }, - { - code: 'šŸš—', - keywords: [ - 'automobile', - 'car', - 'vehicle', - ], - }, - { - code: 'šŸš˜', - keywords: [ - 'automobile', - 'car', - 'oncoming', - 'vehicle', - ], - }, - { - code: 'šŸš™', - keywords: [ - 'recreational', - 'rv', - 'vehicle', - ], - }, - { - code: 'šŸšš', - keywords: [ - 'delivery', - 'truck', - 'vehicle', - ], - }, - { - code: 'šŸš›', - keywords: [ - 'lorry', - 'semi', - 'truck', - 'vehicle', - ], - }, - { - code: 'šŸšœ', - keywords: [ - 'tractor', - 'vehicle', - ], - }, - { - code: 'šŸš²', - keywords: [ - 'bicycle', - 'bike', - 'vehicle', - ], - }, - { - code: 'ā›½', - keywords: [ - 'fuel', - 'fuelpump', - 'gas', - 'pump', - 'station', - ], - }, - { - code: 'šŸ›£', - keywords: [ - 'highway', - 'motorway', - 'road', - ], - }, - { - code: 'šŸ›¤', - keywords: [ - 'railway', - 'train', - ], - }, - { - code: 'šŸšØ', - keywords: [ - 'beacon', - 'car', - 'light', - 'police', - 'revolving', - 'vehicle', - ], - }, - { - code: 'šŸš„', - keywords: [ - 'light', - 'signal', - 'traffic', - ], - }, - { - code: 'šŸš¦', - keywords: [ - 'light', - 'signal', - 'traffic', - ], - }, - { - code: 'šŸš§', - keywords: [ - 'barrier', - 'construction', - ], - }, - { - code: 'šŸ›‘', - keywords: [ - 'octagonal', - 'stop', - ], - }, - { - code: 'šŸ›“', - keywords: [ - 'kick', - 'scooter', - ], - }, - { - code: 'šŸ›µ', - keywords: [ - 'motor', - 'scooter', - ], - }, - { - code: 'āš“', - keywords: [ - 'anchor', - 'ship', - 'tool', - ], - }, - { - code: 'ā›µ', - keywords: [ - 'boat', - 'resort', - 'sailboat', - 'sea', - 'vehicle', - 'yacht', - ], - }, - { - code: 'šŸš£', - keywords: [ - 'boat', - 'rowboat', - 'vehicle', - ], - types: [ - 'šŸš£šŸæ', - 'šŸš£šŸ¾', - 'šŸš£šŸ½', - 'šŸš£šŸ¼', - 'šŸš£šŸ»', - ], - }, - { - code: 'šŸ›¶', - keywords: [ - 'boat', - 'canoe', - ], - }, - { - code: 'šŸš¤', - keywords: [ - 'boat', - 'speedboat', - 'vehicle', - ], - }, - { - code: 'šŸ›³', - keywords: [ - 'passenger', - 'ship', - 'vehicle', - ], - }, - { - code: 'ā›“', - keywords: [ - 'boat', - 'ferry', - ], - }, - { - code: 'šŸ›„', - keywords: [ - 'boat', - 'motorboat', - 'vehicle', - ], - }, - { - code: 'šŸš¢', - keywords: [ - 'ship', - 'vehicle', - ], - }, - { - code: 'āœˆ', - keywords: [ - 'airplane', - 'vehicle', - ], - }, - { - code: 'šŸ›©', - keywords: [ - 'airplane', - 'vehicle', - ], - }, - { - code: 'šŸ›«', - keywords: [ - 'airplane', - 'check-in', - 'departure', - 'departures', - 'vehicle', - ], - }, - { - code: 'šŸ›¬', - keywords: [ - 'airplane', - 'arrivals', - 'arriving', - 'landing', - 'vehicle', - ], - }, - { - code: 'šŸ’ŗ', - keywords: [ - 'chair', - 'seat', - ], - }, - { - code: 'šŸš', - keywords: [ - 'helicopter', - 'vehicle', - ], - }, - { - code: 'šŸšŸ', - keywords: [ - 'railway', - 'suspension', - 'vehicle', - ], - }, - { - code: 'šŸš ', - keywords: [ - 'cable', - 'gondola', - 'mountain', - 'vehicle', - ], - }, - { - code: 'šŸš”', - keywords: [ - 'aerial', - 'cable', - 'car', - 'gondola', - 'ropeway', - 'tramway', - 'vehicle', - ], - }, - { - code: 'šŸš€', - keywords: [ - 'rocket', - 'space', - 'vehicle', - ], - }, - { - code: 'šŸ›°', - keywords: [ - 'satellite', - 'space', - 'vehicle', - ], - }, - { - code: 'šŸ›Ž', - keywords: [ - 'bell', - 'bellhop', - 'hotel', - ], - }, - { - code: 'šŸšŖ', - keywords: [ - 'door', - ], - }, - { - code: 'šŸ›Œ', - keywords: [ - 'hotel', - 'sleep', - ], - }, - { - code: 'šŸ›', - keywords: [ - 'bed', - 'hotel', - 'sleep', - ], - }, - { - code: 'šŸ›‹', - keywords: [ - 'couch', - 'hotel', - 'lamp', - ], - }, - { - code: 'šŸš½', - keywords: [ - 'toilet', - ], - }, - { - code: 'šŸšæ', - keywords: [ - 'shower', - 'water', - ], - }, - { - code: 'šŸ›€', - keywords: [ - 'bath', - 'bathtub', - ], - types: [ - 'šŸ›€šŸæ', - 'šŸ›€šŸ¾', - 'šŸ›€šŸ½', - 'šŸ›€šŸ¼', - 'šŸ›€šŸ»', - ], - }, - { - code: 'šŸ›', - keywords: [ - 'bath', - 'bathtub', - ], - }, - { - code: 'āŒ›', - keywords: [ - 'hourglass', - 'sand', - 'timer', - ], - }, - { - code: 'ā³', - keywords: [ - 'hourglass', - 'sand', - 'timer', - ], - }, - { - code: 'āŒš', - keywords: [ - 'clock', - 'watch', - ], - }, - { - code: 'ā°', - keywords: [ - 'alarm', - 'clock', - ], - }, - { - code: 'ā±', - keywords: [ - 'clock', - 'stopwatch', - ], - }, - { - code: 'ā²', - keywords: [ - 'clock', - 'timer', - ], - }, - { - code: 'šŸ•°', - keywords: [ - 'clock', - ], - }, - { - code: 'šŸ•›', - keywords: [ - '00', - '12', - '12:00', - 'clock', - 'oā€™clock', - 'twelve', - ], - }, - { - code: 'šŸ•§', - keywords: [ - '12', - '12:30', - '30', - 'clock', - 'thirty', - 'twelve', - ], - }, - { - code: 'šŸ•', - keywords: [ - '00', - '1', - '1:00', - 'clock', - 'oā€™clock', - 'one', - ], - }, - { - code: 'šŸ•œ', - keywords: [ - '1', - '1:30', - '30', - 'clock', - 'one', - 'thirty', - ], - }, - { - code: 'šŸ•‘', - keywords: [ - '00', - '2', - '2:00', - 'clock', - 'oā€™clock', - 'two', - ], - }, - { - code: 'šŸ•', - keywords: [ - '2', - '2:30', - '30', - 'clock', - 'thirty', - 'two', - ], - }, - { - code: 'šŸ•’', - keywords: [ - '00', - '3', - '3:00', - 'clock', - 'oā€™clock', - 'three', - ], - }, - { - code: 'šŸ•ž', - keywords: [ - '3', - '3:30', - '30', - 'clock', - 'thirty', - 'three', - ], - }, - { - code: 'šŸ•“', - keywords: [ - '00', - '4', - '4:00', - 'clock', - 'four', - 'oā€™clock', - ], - }, - { - code: 'šŸ•Ÿ', - keywords: [ - '30', - '4', - '4:30', - 'clock', - 'four', - 'thirty', - ], - }, - { - code: 'šŸ•”', - keywords: [ - '00', - '5', - '5:00', - 'clock', - 'five', - 'oā€™clock', - ], - }, - { - code: 'šŸ• ', - keywords: [ - '30', - '5', - '5:30', - 'clock', - 'five', - 'thirty', - ], - }, - { - code: 'šŸ••', - keywords: [ - '00', - '6', - '6:00', - 'clock', - 'oā€™clock', - 'six', - ], - }, - { - code: 'šŸ•”', - keywords: [ - '30', - '6', - '6:30', - 'clock', - 'six', - 'thirty', - ], - }, - { - code: 'šŸ•–', - keywords: [ - '00', - '7', - '7:00', - 'clock', - 'oā€™clock', - 'seven', - ], - }, - { - code: 'šŸ•¢', - keywords: [ - '30', - '7', - '7:30', - 'clock', - 'seven', - 'thirty', - ], - }, - { - code: 'šŸ•—', - keywords: [ - '00', - '8', - '8:00', - 'clock', - 'eight', - 'oā€™clock', - ], - }, - { - code: 'šŸ•£', - keywords: [ - '30', - '8', - '8:30', - 'clock', - 'eight', - 'thirty', - ], - }, - { - code: 'šŸ•˜', - keywords: [ - '00', - '9', - '9:00', - 'clock', - 'nine', - 'oā€™clock', - ], - }, - { - code: 'šŸ•¤', - keywords: [ - '30', - '9', - '9:30', - 'clock', - 'nine', - 'thirty', - ], - }, - { - code: 'šŸ•™', - keywords: [ - '00', - '10', - '10:00', - 'clock', - 'oā€™clock', - 'ten', - ], - }, - { - code: 'šŸ•„', - keywords: [ - '10', - '10:30', - '30', - 'clock', - 'ten', - 'thirty', - ], - }, - { - code: 'šŸ•š', - keywords: [ - '00', - '11', - '11:00', - 'clock', - 'eleven', - 'oā€™clock', - ], - }, - { - code: 'šŸ•¦', - keywords: [ - '11', - '11:30', - '30', - 'clock', - 'eleven', - 'thirty', - ], - }, - { - code: 'šŸŒ‘', - keywords: [ - 'dark', - 'moon', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒ’', - keywords: [ - 'crescent', - 'moon', - 'space', - 'waxing', - 'weather', - ], - }, - { - code: 'šŸŒ“', - keywords: [ - 'moon', - 'quarter', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒ”', - keywords: [ - 'gibbous', - 'moon', - 'space', - 'waxing', - 'weather', - ], - }, - { - code: 'šŸŒ•', - keywords: [ - 'full', - 'moon', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒ–', - keywords: [ - 'gibbous', - 'moon', - 'space', - 'waning', - 'weather', - ], - }, - { - code: 'šŸŒ—', - keywords: [ - 'moon', - 'quarter', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒ˜', - keywords: [ - 'crescent', - 'moon', - 'space', - 'waning', - 'weather', - ], - }, - { - code: 'šŸŒ™', - keywords: [ - 'crescent', - 'moon', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒš', - keywords: [ - 'face', - 'moon', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒ›', - keywords: [ - 'face', - 'moon', - 'quarter', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒœ', - keywords: [ - 'face', - 'moon', - 'quarter', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒ”', - keywords: [ - 'thermometer', - 'weather', - ], - }, - { - code: 'ā˜€', - keywords: [ - 'bright', - 'rays', - 'space', - 'sun', - 'sunny', - 'weather', - ], - }, - { - code: 'šŸŒ', - keywords: [ - 'bright', - 'face', - 'full', - 'moon', - 'space', - 'weather', - ], - }, - { - code: 'šŸŒž', - keywords: [ - 'bright', - 'face', - 'space', - 'sun', - 'weather', - ], - }, - { - code: 'ā­', - keywords: [ - 'star', - ], - }, - { - code: 'šŸŒŸ', - keywords: [ - 'glittery', - 'glow', - 'shining', - 'sparkle', - 'star', - ], - }, - { - code: 'šŸŒ ', - keywords: [ - 'activity', - 'falling', - 'shooting', - 'space', - 'star', - ], - }, - { - code: 'ā˜', - keywords: [ - 'cloud', - 'weather', - ], - }, - { - code: 'ā›…', - keywords: [ - 'cloud', - 'sun', - 'weather', - ], - }, - { - code: 'ā›ˆ', - keywords: [ - 'cloud', - 'rain', - 'thunder', - 'weather', - ], - }, - { - code: 'šŸŒ¤', - keywords: [ - 'cloud', - 'sun', - 'weather', - ], - }, - { - code: 'šŸŒ„', - keywords: [ - 'cloud', - 'sun', - 'weather', - ], - }, - { - code: 'šŸŒ¦', - keywords: [ - 'cloud', - 'rain', - 'sun', - 'weather', - ], - }, - { - code: 'šŸŒ§', - keywords: [ - 'cloud', - 'rain', - 'weather', - ], - }, - { - code: 'šŸŒØ', - keywords: [ - 'cloud', - 'cold', - 'snow', - 'weather', - ], - }, - { - code: 'šŸŒ©', - keywords: [ - 'cloud', - 'lightning', - 'weather', - ], - }, - { - code: 'šŸŒŖ', - keywords: [ - 'cloud', - 'tornado', - 'weather', - 'whirlwind', - ], - }, - { - code: 'šŸŒ«', - keywords: [ - 'cloud', - 'fog', - 'weather', - ], - }, - { - code: 'šŸŒ¬', - keywords: [ - 'blow', - 'cloud', - 'face', - 'weather', - 'wind', - ], - }, - { - code: 'šŸŒ€', - keywords: [ - 'cyclone', - 'dizzy', - 'twister', - 'typhoon', - 'weather', - ], - }, - { - code: 'šŸŒˆ', - keywords: [ - 'rain', - 'rainbow', - 'weather', - ], - }, - { - code: 'šŸŒ‚', - keywords: [ - 'clothing', - 'rain', - 'umbrella', - 'weather', - ], - }, - { - code: 'ā˜‚', - keywords: [ - 'clothing', - 'rain', - 'umbrella', - 'weather', - ], - }, - { - code: 'ā˜”', - keywords: [ - 'clothing', - 'drop', - 'rain', - 'umbrella', - 'weather', - ], - }, - { - code: 'ā›±', - keywords: [ - 'rain', - 'sun', - 'umbrella', - 'weather', - ], - }, - { - code: 'āš”', - keywords: [ - 'danger', - 'electric', - 'electricity', - 'lightning', - 'voltage', - 'zap', - ], - }, - { - code: 'ā„', - keywords: [ - 'cold', - 'snow', - 'snowflake', - 'weather', - ], - }, - { - code: 'ā˜ƒ', - keywords: [ - 'cold', - 'snow', - 'snowman', - 'weather', - ], - }, - { - code: 'ā›„', - keywords: [ - 'cold', - 'snow', - 'snowman', - 'weather', - ], - }, - { - code: 'ā˜„', - keywords: [ - 'comet', - 'space', - ], - }, - { - code: 'šŸ”„', - keywords: [ - 'fire', - 'flame', - 'tool', - ], - }, - { - code: 'šŸ’§', - keywords: [ - 'cold', - 'comic', - 'drop', - 'sweat', - 'weather', - ], - }, - { - code: 'šŸŒŠ', - keywords: [ - 'ocean', - 'water', - 'wave', - 'weather', - ], - }, - ], - }, - { - title: 'Activities', - data: [ - { - code: 'šŸŽƒ', - keywords: [ - 'activity', - 'celebration', - 'entertainment', - 'halloween', - 'jack', - 'lantern', - ], - }, - { - code: 'šŸŽ„', - keywords: [ - 'activity', - 'celebration', - 'christmas', - 'entertainment', - 'tree', - ], - }, - { - code: 'šŸŽ†', - keywords: [ - 'activity', - 'celebration', - 'entertainment', - 'fireworks', - ], - }, - { - code: 'šŸŽ‡', - keywords: [ - 'activity', - 'celebration', - 'entertainment', - 'fireworks', - 'sparkle', - ], - }, - { - code: 'āœØ', - keywords: [ - 'entertainment', - 'sparkle', - 'star', - ], - }, - { - code: 'šŸŽˆ', - keywords: [ - 'activity', - 'balloon', - 'celebration', - 'entertainment', - ], - }, - { - code: 'šŸŽ‰', - keywords: [ - 'activity', - 'celebration', - 'entertainment', - 'party', - 'popper', - 'tada', - ], - }, - { - code: 'šŸŽŠ', - keywords: [ - 'activity', - 'ball', - 'celebration', - 'confetti', - 'entertainment', - ], - }, - { - code: 'šŸŽ‹', - keywords: [ - 'activity', - 'banner', - 'celebration', - 'entertainment', - 'japanese', - 'tree', - ], - }, - { - code: 'šŸŽ', - keywords: [ - 'activity', - 'bamboo', - 'celebration', - 'japanese', - 'pine', - 'plant', - ], - }, - { - code: 'šŸŽŽ', - keywords: [ - 'activity', - 'celebration', - 'doll', - 'entertainment', - 'festival', - 'japanese', - ], - }, - { - code: 'šŸŽ', - keywords: [ - 'activity', - 'carp', - 'celebration', - 'entertainment', - 'flag', - 'streamer', - ], - }, - { - code: 'šŸŽ', - keywords: [ - 'activity', - 'bell', - 'celebration', - 'chime', - 'entertainment', - 'wind', - ], - }, - { - code: 'šŸŽ‘', - keywords: [ - 'activity', - 'celebration', - 'ceremony', - 'entertainment', - 'moon', - ], - }, - { - code: 'šŸŽ€', - keywords: [ - 'celebration', - 'ribbon', - ], - }, - { - code: 'šŸŽ', - keywords: [ - 'box', - 'celebration', - 'entertainment', - 'gift', - 'present', - 'wrapped', - ], - }, - { - code: 'šŸŽ—', - keywords: [ - 'celebration', - 'reminder', - 'ribbon', - ], - }, - { - code: 'šŸŽŸ', - keywords: [ - 'admission', - 'entertainment', - 'ticket', - ], - }, - { - code: 'šŸŽ«', - keywords: [ - 'activity', - 'admission', - 'entertainment', - 'ticket', - ], - }, - { - code: 'šŸŽ–', - keywords: [ - 'celebration', - 'medal', - 'military', - ], - }, - { - code: 'šŸ†', - keywords: [ - 'prize', - 'trophy', - ], - }, - { - code: 'šŸ…', - keywords: [ - 'medal', - ], - }, - { - code: 'šŸ„‡', - keywords: [ - 'first', - 'gold', - 'medal', - ], - }, - { - code: 'šŸ„ˆ', - keywords: [ - 'medal', - 'second', - 'silver', - ], - }, - { - code: 'šŸ„‰', - keywords: [ - 'bronze', - 'medal', - 'third', - ], - }, - { - code: 'āš½', - keywords: [ - 'ball', - 'soccer', - ], - }, - { - code: 'āš¾', - keywords: [ - 'ball', - 'baseball', - ], - }, - { - code: 'šŸ€', - keywords: [ - 'ball', - 'basketball', - 'hoop', - ], - }, - { - code: 'šŸ', - keywords: [ - 'ball', - 'game', - 'volleyball', - ], - }, - { - code: 'šŸˆ', - keywords: [ - 'american', - 'ball', - 'football', - ], - }, - { - code: 'šŸ‰', - keywords: [ - 'ball', - 'football', - 'rugby', - ], - }, - { - code: 'šŸŽ¾', - keywords: [ - 'ball', - 'racquet', - 'tennis', - ], - }, - { - code: 'šŸŽ±', - keywords: [ - '8', - '8 ball', - 'ball', - 'billiard', - 'eight', - 'game', - ], - }, - { - code: 'šŸŽ³', - keywords: [ - 'ball', - 'bowling', - 'game', - ], - }, - { - code: 'šŸ', - keywords: [ - 'ball', - 'bat', - 'cricket', - 'game', - ], - }, - { - code: 'šŸ‘', - keywords: [ - 'ball', - 'field', - 'game', - 'hockey', - 'stick', - ], - }, - { - code: 'šŸ’', - keywords: [ - 'game', - 'hockey', - 'ice', - 'puck', - 'stick', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'ball', - 'bat', - 'game', - 'paddle', - 'table tennis', - ], - }, - { - code: 'šŸø', - keywords: [ - 'badminton', - 'birdie', - 'game', - 'racquet', - 'shuttlecock', - ], - }, - { - code: 'šŸ„Š', - keywords: [ - 'boxing', - 'glove', - ], - }, - { - code: 'šŸ„‹', - keywords: [ - 'judo', - 'karate', - 'martial arts', - 'taekwondo', - 'uniform', - ], - }, - { - code: 'ā›³', - keywords: [ - 'flag', - 'golf', - 'hole', - ], - }, - { - code: 'šŸŒ', - keywords: [ - 'ball', - 'golf', - ], - }, - { - code: 'ā›ø', - keywords: [ - 'ice', - 'skate', - ], - }, - { - code: 'šŸŽ£', - keywords: [ - 'entertainment', - 'fish', - 'pole', - ], - }, - { - code: 'šŸŽ½', - keywords: [ - 'running', - 'sash', - 'shirt', - ], - }, - { - code: 'šŸŽæ', - keywords: [ - 'ski', - 'snow', - ], - }, - { - code: 'ā›·', - keywords: [ - 'ski', - 'snow', - ], - }, - { - code: 'šŸ‚', - keywords: [ - 'ski', - 'snow', - 'snowboard', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'surfer', - 'surfing', - ], - types: [ - 'šŸ„šŸæ', - 'šŸ„šŸ¾', - 'šŸ„šŸ½', - 'šŸ„šŸ¼', - 'šŸ„šŸ»', - ], - }, - { - code: 'šŸ‡', - keywords: [ - 'horse', - 'jockey', - 'racehorse', - 'racing', - ], - }, - { - code: 'šŸŠ', - keywords: [ - 'swim', - 'swimmer', - ], - types: [ - 'šŸŠšŸæ', - 'šŸŠšŸ¾', - 'šŸŠšŸ½', - 'šŸŠšŸ¼', - 'šŸŠšŸ»', - ], - }, - { - code: 'ā›¹', - keywords: [ - 'ball', - ], - types: [ - 'ā›¹šŸæ', - 'ā›¹šŸ¾', - 'ā›¹šŸ½', - 'ā›¹šŸ¼', - 'ā›¹šŸ»', - ], - }, - { - code: 'šŸ‹', - keywords: [ - 'lifter', - 'weight', - ], - types: [ - 'šŸ‹šŸæ', - 'šŸ‹šŸ¾', - 'šŸ‹šŸ½', - 'šŸ‹šŸ¼', - 'šŸ‹šŸ»', - ], - }, - { - code: 'šŸš“', - keywords: [ - 'bicycle', - 'bicyclist', - 'bike', - 'cyclist', - ], - types: [ - 'šŸš“šŸæ', - 'šŸš“šŸ¾', - 'šŸš“šŸ½', - 'šŸš“šŸ¼', - 'šŸš“šŸ»', - ], - }, - { - code: 'šŸšµ', - keywords: [ - 'bicycle', - 'bicyclist', - 'bike', - 'cyclist', - 'mountain', - ], - types: [ - 'šŸšµšŸæ', - 'šŸšµšŸ¾', - 'šŸšµšŸ½', - 'šŸšµšŸ¼', - 'šŸšµšŸ»', - ], - }, - { - code: 'šŸŽ', - keywords: [ - 'car', - 'racing', - ], - }, - { - code: 'šŸ', - keywords: [ - 'motorcycle', - 'racing', - ], - }, - { - code: 'šŸ¤ø', - keywords: [ - 'cartwheel', - 'gymnastics', - ], - types: [ - 'šŸ¤øšŸæ', - 'šŸ¤øšŸ¾', - 'šŸ¤øšŸ½', - 'šŸ¤øšŸ¼', - 'šŸ¤øšŸ»', - ], - }, - { - code: 'šŸ¤¼', - keywords: [ - 'wrestle', - 'wrestler', - ], - types: [ - 'šŸ¤¼šŸæ', - 'šŸ¤¼šŸ¾', - 'šŸ¤¼šŸ½', - 'šŸ¤¼šŸ¼', - 'šŸ¤¼šŸ»', - ], - }, - { - code: 'šŸ¤½', - keywords: [ - 'polo', - 'water', - ], - types: [ - 'šŸ¤½šŸæ', - 'šŸ¤½šŸ¾', - 'šŸ¤½šŸ½', - 'šŸ¤½šŸ¼', - 'šŸ¤½šŸ»', - ], - }, - { - code: 'šŸ¤¾', - keywords: [ - 'ball', - 'handball', - ], - types: [ - 'šŸ¤¾šŸæ', - 'šŸ¤¾šŸ¾', - 'šŸ¤¾šŸ½', - 'šŸ¤¾šŸ¼', - 'šŸ¤¾šŸ»', - ], - }, - { - code: 'šŸ¤ŗ', - keywords: [ - 'fencer', - 'fencing', - 'sword', - ], - }, - { - code: 'šŸ„…', - keywords: [ - 'goal', - 'net', - ], - }, - { - code: 'šŸ¤¹', - keywords: [ - 'balance', - 'juggle', - 'multitask', - 'skill', - ], - types: [ - 'šŸ¤¹šŸæ', - 'šŸ¤¹šŸ¾', - 'šŸ¤¹šŸ½', - 'šŸ¤¹šŸ¼', - 'šŸ¤¹šŸ»', - ], - }, - { - code: 'šŸŽÆ', - keywords: [ - 'activity', - 'bull', - 'bullseye', - 'dart', - 'entertainment', - 'eye', - 'game', - 'hit', - 'target', - ], - }, - { - code: 'šŸŽ®', - keywords: [ - 'controller', - 'entertainment', - 'game', - 'video game', - ], - }, - { - code: 'šŸ•¹', - keywords: [ - 'entertainment', - 'game', - 'joystick', - 'video game', - ], - }, - { - code: 'šŸŽ²', - keywords: [ - 'dice', - 'die', - 'entertainment', - 'game', - ], - }, - { - code: 'ā™ ', - keywords: [ - 'card', - 'game', - 'spade', - 'suit', - ], - }, - { - code: 'ā™„', - keywords: [ - 'card', - 'game', - 'heart', - 'hearts', - 'suit', - ], - }, - { - code: 'ā™¦', - keywords: [ - 'card', - 'diamond', - 'diamonds', - 'game', - 'suit', - ], - }, - { - code: 'ā™£', - keywords: [ - 'card', - 'club', - 'clubs', - 'game', - 'suit', - ], - }, - { - code: 'šŸƒ', - keywords: [ - 'card', - 'entertainment', - 'game', - 'joker', - 'playing', - ], - }, - { - code: 'šŸ€„', - keywords: [ - 'game', - 'mahjong', - 'red', - ], - }, - { - code: 'šŸŽ“', - keywords: [ - 'activity', - 'card', - 'entertainment', - 'flower', - 'game', - 'japanese', - 'playing', - ], - }, - ], - }, - { - title: 'Objects', - data: [ - { - code: 'šŸ”‡', - keywords: [ - 'mute', - 'quiet', - 'silent', - 'speaker', - 'volume', - ], - }, - { - code: 'šŸ”ˆ', - keywords: [ - 'speaker', - 'volume', - ], - }, - { - code: 'šŸ”‰', - keywords: [ - 'low', - 'speaker', - 'volume', - 'wave', - ], - }, - { - code: 'šŸ”Š', - keywords: [ - '3', - 'entertainment', - 'high', - 'loud', - 'speaker', - 'three', - 'volume', - ], - }, - { - code: 'šŸ“¢', - keywords: [ - 'communication', - 'loud', - 'loudspeaker', - 'public address', - ], - }, - { - code: 'šŸ“£', - keywords: [ - 'cheering', - 'communication', - 'megaphone', - ], - }, - { - code: 'šŸ“Æ', - keywords: [ - 'communication', - 'entertainment', - 'horn', - 'post', - 'postal', - ], - }, - { - code: 'šŸ””', - keywords: [ - 'bell', - ], - }, - { - code: 'šŸ”•', - keywords: [ - 'bell', - 'forbidden', - 'mute', - 'no', - 'not', - 'prohibited', - 'quiet', - 'silent', - ], - }, - { - code: 'šŸŽ¼', - keywords: [ - 'activity', - 'entertainment', - 'music', - 'score', - ], - }, - { - code: 'šŸŽµ', - keywords: [ - 'activity', - 'entertainment', - 'music', - 'note', - ], - }, - { - code: 'šŸŽ¶', - keywords: [ - 'activity', - 'entertainment', - 'music', - 'note', - 'notes', - ], - }, - { - code: 'šŸŽ™', - keywords: [ - 'mic', - 'microphone', - 'music', - 'studio', - ], - }, - { - code: 'šŸŽš', - keywords: [ - 'level', - 'music', - 'slider', - ], - }, - { - code: 'šŸŽ›', - keywords: [ - 'control', - 'knobs', - 'music', - ], - }, - { - code: 'šŸŽ¤', - keywords: [ - 'activity', - 'entertainment', - 'karaoke', - 'mic', - 'microphone', - ], - }, - { - code: 'šŸŽ§', - keywords: [ - 'activity', - 'earbud', - 'entertainment', - 'headphone', - ], - }, - { - code: 'šŸ“»', - keywords: [ - 'entertainment', - 'radio', - 'video', - ], - }, - { - code: 'šŸŽ·', - keywords: [ - 'activity', - 'entertainment', - 'instrument', - 'music', - 'sax', - 'saxophone', - ], - }, - { - code: 'šŸŽø', - keywords: [ - 'activity', - 'entertainment', - 'guitar', - 'instrument', - 'music', - ], - }, - { - code: 'šŸŽ¹', - keywords: [ - 'activity', - 'entertainment', - 'instrument', - 'keyboard', - 'music', - 'piano', - ], - }, - { - code: 'šŸŽŗ', - keywords: [ - 'activity', - 'entertainment', - 'instrument', - 'music', - 'trumpet', - ], - }, - { - code: 'šŸŽ»', - keywords: [ - 'activity', - 'entertainment', - 'instrument', - 'music', - 'violin', - ], - }, - { - code: 'šŸ„', - keywords: [ - 'drum', - 'drumsticks', - 'music', - ], - }, - { - code: 'šŸ“±', - keywords: [ - 'cell', - 'communication', - 'mobile', - 'phone', - 'telephone', - ], - }, - { - code: 'šŸ“²', - keywords: [ - 'arrow', - 'call', - 'cell', - 'communication', - 'mobile', - 'phone', - 'receive', - 'telephone', - ], - }, - { - code: 'ā˜Ž', - keywords: [ - 'phone', - 'telephone', - ], - }, - { - code: 'šŸ“ž', - keywords: [ - 'communication', - 'phone', - 'receiver', - 'telephone', - ], - }, - { - code: 'šŸ“Ÿ', - keywords: [ - 'communication', - 'pager', - ], - }, - { - code: 'šŸ“ ', - keywords: [ - 'communication', - 'fax', - ], - }, - { - code: 'šŸ”‹', - keywords: [ - 'battery', - ], - }, - { - code: 'šŸ”Œ', - keywords: [ - 'electric', - 'electricity', - 'plug', - ], - }, - { - code: 'šŸ’»', - keywords: [ - 'computer', - 'pc', - 'personal', - ], - }, - { - code: 'šŸ–„', - keywords: [ - 'computer', - 'desktop', - ], - }, - { - code: 'šŸ–Ø', - keywords: [ - 'computer', - 'printer', - ], - }, - { - code: 'āŒØ', - keywords: [ - 'computer', - 'keyboard', - ], - }, - { - code: 'šŸ–±', - keywords: [ - '3', - 'button', - 'computer', - 'mouse', - 'three', - ], - }, - { - code: 'šŸ–²', - keywords: [ - 'computer', - 'trackball', - ], - }, - { - code: 'šŸ’½', - keywords: [ - 'computer', - 'disk', - 'entertainment', - 'minidisk', - 'optical', - ], - }, - { - code: 'šŸ’¾', - keywords: [ - 'computer', - 'disk', - 'floppy', - ], - }, - { - code: 'šŸ’æ', - keywords: [ - 'blu-ray', - 'cd', - 'computer', - 'disk', - 'dvd', - 'optical', - ], - }, - { - code: 'šŸ“€', - keywords: [ - 'blu-ray', - 'cd', - 'computer', - 'disk', - 'dvd', - 'entertainment', - 'optical', - ], - }, - { - code: 'šŸŽ„', - keywords: [ - 'activity', - 'camera', - 'cinema', - 'entertainment', - 'movie', - ], - }, - { - code: 'šŸŽž', - keywords: [ - 'cinema', - 'entertainment', - 'film', - 'frames', - 'movie', - ], - }, - { - code: 'šŸ“½', - keywords: [ - 'cinema', - 'entertainment', - 'film', - 'movie', - 'projector', - 'video', - ], - }, - { - code: 'šŸŽ¬', - keywords: [ - 'activity', - 'clapper', - 'entertainment', - 'movie', - ], - }, - { - code: 'šŸ“ŗ', - keywords: [ - 'entertainment', - 'television', - 'tv', - 'video', - ], - }, - { - code: 'šŸ“·', - keywords: [ - 'camera', - 'entertainment', - 'video', - ], - }, - { - code: 'šŸ“ø', - keywords: [ - 'camera', - 'flash', - 'video', - ], - }, - { - code: 'šŸ“¹', - keywords: [ - 'camera', - 'entertainment', - 'video', - ], - }, - { - code: 'šŸ“¼', - keywords: [ - 'entertainment', - 'tape', - 'vhs', - 'video', - 'videocassette', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'glass', - 'magnifying', - 'search', - 'tool', - ], - }, - { - code: 'šŸ”Ž', - keywords: [ - 'glass', - 'magnifying', - 'search', - 'tool', - ], - }, - { - code: 'šŸ”¬', - keywords: [ - 'microscope', - 'tool', - ], - }, - { - code: 'šŸ”­', - keywords: [ - 'telescope', - 'tool', - ], - }, - { - code: 'šŸ“”', - keywords: [ - 'antenna', - 'communication', - 'dish', - 'satellite', - ], - }, - { - code: 'šŸ•Æ', - keywords: [ - 'candle', - 'light', - ], - }, - { - code: 'šŸ’”', - keywords: [ - 'bulb', - 'comic', - 'electric', - 'idea', - 'light', - ], - }, - { - code: 'šŸ”¦', - keywords: [ - 'electric', - 'flashlight', - 'light', - 'tool', - 'torch', - ], - }, - { - code: 'šŸ®', - keywords: [ - 'bar', - 'japanese', - 'lantern', - 'light', - 'red', - ], - }, - { - code: 'šŸ“”', - keywords: [ - 'book', - 'cover', - 'decorated', - 'notebook', - ], - }, - { - code: 'šŸ“•', - keywords: [ - 'book', - 'closed', - ], - }, - { - code: 'šŸ“–', - keywords: [ - 'book', - 'open', - ], - }, - { - code: 'šŸ“—', - keywords: [ - 'book', - 'green', - ], - }, - { - code: 'šŸ“˜', - keywords: [ - 'blue', - 'book', - ], - }, - { - code: 'šŸ“™', - keywords: [ - 'book', - 'orange', - ], - }, - { - code: 'šŸ“š', - keywords: [ - 'book', - 'books', - ], - }, - { - code: 'šŸ““', - keywords: [ - 'notebook', - ], - }, - { - code: 'šŸ“’', - keywords: [ - 'ledger', - 'notebook', - ], - }, - { - code: 'šŸ“ƒ', - keywords: [ - 'curl', - 'document', - 'page', - ], - }, - { - code: 'šŸ“œ', - keywords: [ - 'paper', - 'scroll', - ], - }, - { - code: 'šŸ“„', - keywords: [ - 'document', - 'page', - ], - }, - { - code: 'šŸ“°', - keywords: [ - 'communication', - 'news', - 'newspaper', - 'paper', - ], - }, - { - code: 'šŸ—ž', - keywords: [ - 'news', - 'newspaper', - 'paper', - 'rolled', - ], - }, - { - code: 'šŸ“‘', - keywords: [ - 'bookmark', - 'mark', - 'marker', - 'tabs', - ], - }, - { - code: 'šŸ”–', - keywords: [ - 'bookmark', - 'mark', - ], - }, - { - code: 'šŸ·', - keywords: [ - 'label', - ], - }, - { - code: 'šŸ’°', - keywords: [ - 'bag', - 'dollar', - 'money', - 'moneybag', - ], - }, - { - code: 'šŸ’“', - keywords: [ - 'bank', - 'banknote', - 'bill', - 'currency', - 'money', - 'note', - 'yen', - ], - }, - { - code: 'šŸ’µ', - keywords: [ - 'bank', - 'banknote', - 'bill', - 'currency', - 'dollar', - 'money', - 'note', - ], - }, - { - code: 'šŸ’¶', - keywords: [ - 'bank', - 'banknote', - 'bill', - 'currency', - 'euro', - 'money', - 'note', - ], - }, - { - code: 'šŸ’·', - keywords: [ - 'bank', - 'banknote', - 'bill', - 'currency', - 'money', - 'note', - 'pound', - ], - }, - { - code: 'šŸ’ø', - keywords: [ - 'bank', - 'banknote', - 'bill', - 'dollar', - 'fly', - 'money', - 'note', - 'wings', - ], - }, - { - code: 'šŸ’³', - keywords: [ - 'bank', - 'card', - 'credit', - 'money', - ], - }, - { - code: 'šŸ’¹', - keywords: [ - 'bank', - 'chart', - 'currency', - 'graph', - 'growth', - 'market', - 'money', - 'rise', - 'trend', - 'upward', - 'yen', - ], - }, - { - code: 'šŸ’±', - keywords: [ - 'bank', - 'currency', - 'exchange', - 'money', - ], - }, - { - code: 'šŸ’²', - keywords: [ - 'currency', - 'dollar', - 'money', - ], - }, - { - code: 'āœ‰', - keywords: [ - 'e-mail', - 'email', - 'envelope', - ], - }, - { - code: 'šŸ“§', - keywords: [ - 'communication', - 'e-mail', - 'email', - 'letter', - 'mail', - ], - }, - { - code: 'šŸ“Ø', - keywords: [ - 'communication', - 'e-mail', - 'email', - 'envelope', - 'incoming', - 'letter', - 'mail', - 'receive', - ], - }, - { - code: 'šŸ“©', - keywords: [ - 'arrow', - 'communication', - 'down', - 'e-mail', - 'email', - 'envelope', - 'letter', - 'mail', - 'outgoing', - 'sent', - ], - }, - { - code: 'šŸ“¤', - keywords: [ - 'box', - 'communication', - 'letter', - 'mail', - 'outbox', - 'sent', - 'tray', - ], - }, - { - code: 'šŸ“„', - keywords: [ - 'box', - 'communication', - 'inbox', - 'letter', - 'mail', - 'receive', - 'tray', - ], - }, - { - code: 'šŸ“¦', - keywords: [ - 'box', - 'communication', - 'package', - 'parcel', - ], - }, - { - code: 'šŸ“«', - keywords: [ - 'closed', - 'communication', - 'flag', - 'mail', - 'mailbox', - 'postbox', - ], - }, - { - code: 'šŸ“Ŗ', - keywords: [ - 'closed', - 'communication', - 'flag', - 'lowered', - 'mail', - 'mailbox', - 'postbox', - ], - }, - { - code: 'šŸ“¬', - keywords: [ - 'communication', - 'flag', - 'mail', - 'mailbox', - 'open', - 'postbox', - ], - }, - { - code: 'šŸ“­', - keywords: [ - 'communication', - 'flag', - 'lowered', - 'mail', - 'mailbox', - 'open', - 'postbox', - ], - }, - { - code: 'šŸ“®', - keywords: [ - 'communication', - 'mail', - 'mailbox', - 'postbox', - ], - }, - { - code: 'šŸ—³', - keywords: [ - 'ballot', - 'box', - ], - }, - { - code: 'āœ', - keywords: [ - 'pencil', - ], - }, - { - code: 'āœ’', - keywords: [ - 'nib', - 'pen', - ], - }, - { - code: 'šŸ–‹', - keywords: [ - 'communication', - 'fountain', - 'pen', - ], - }, - { - code: 'šŸ–Š', - keywords: [ - 'ballpoint', - 'communication', - 'pen', - ], - }, - { - code: 'šŸ–Œ', - keywords: [ - 'communication', - 'paintbrush', - 'painting', - ], - }, - { - code: 'šŸ–', - keywords: [ - 'communication', - 'crayon', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'communication', - 'memo', - 'pencil', - ], - }, - { - code: 'šŸ’¼', - keywords: [ - 'briefcase', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'file', - 'folder', - ], - }, - { - code: 'šŸ“‚', - keywords: [ - 'file', - 'folder', - 'open', - ], - }, - { - code: 'šŸ—‚', - keywords: [ - 'card', - 'dividers', - 'index', - ], - }, - { - code: 'šŸ“…', - keywords: [ - 'calendar', - 'date', - ], - }, - { - code: 'šŸ“†', - keywords: [ - 'calendar', - ], - }, - { - code: 'šŸ—’', - keywords: [ - 'note', - 'pad', - 'spiral', - ], - }, - { - code: 'šŸ—“', - keywords: [ - 'calendar', - 'pad', - 'spiral', - ], - }, - { - code: 'šŸ“‡', - keywords: [ - 'card', - 'index', - 'rolodex', - ], - }, - { - code: 'šŸ“ˆ', - keywords: [ - 'chart', - 'graph', - 'growth', - 'trend', - 'upward', - ], - }, - { - code: 'šŸ“‰', - keywords: [ - 'chart', - 'down', - 'graph', - 'trend', - ], - }, - { - code: 'šŸ“Š', - keywords: [ - 'bar', - 'chart', - 'graph', - ], - }, - { - code: 'šŸ“‹', - keywords: [ - 'clipboard', - ], - }, - { - code: 'šŸ“Œ', - keywords: [ - 'pin', - 'pushpin', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'pin', - 'pushpin', - ], - }, - { - code: 'šŸ“Ž', - keywords: [ - 'paperclip', - ], - }, - { - code: 'šŸ–‡', - keywords: [ - 'communication', - 'link', - 'paperclip', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'ruler', - 'straight edge', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'ruler', - 'set', - 'triangle', - ], - }, - { - code: 'āœ‚', - keywords: [ - 'scissors', - 'tool', - ], - }, - { - code: 'šŸ—ƒ', - keywords: [ - 'box', - 'card', - 'file', - ], - }, - { - code: 'šŸ—„', - keywords: [ - 'cabinet', - 'file', - ], - }, - { - code: 'šŸ—‘', - keywords: [ - 'wastebasket', - ], - }, - { - code: 'šŸ”’', - keywords: [ - 'closed', - 'lock', - ], - }, - { - code: 'šŸ”“', - keywords: [ - 'lock', - 'open', - 'unlock', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'ink', - 'lock', - 'nib', - 'pen', - 'privacy', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'closed', - 'key', - 'lock', - 'secure', - ], - }, - { - code: 'šŸ”‘', - keywords: [ - 'key', - 'lock', - 'password', - ], - }, - { - code: 'šŸ—', - keywords: [ - 'clue', - 'key', - 'lock', - 'old', - ], - }, - { - code: 'šŸ”Ø', - keywords: [ - 'hammer', - 'tool', - ], - }, - { - code: 'ā›', - keywords: [ - 'mining', - 'pick', - 'tool', - ], - }, - { - code: 'āš’', - keywords: [ - 'hammer', - 'pick', - 'tool', - ], - }, - { - code: 'šŸ› ', - keywords: [ - 'hammer', - 'tool', - 'wrench', - ], - }, - { - code: 'šŸ—”', - keywords: [ - 'dagger', - 'knife', - 'weapon', - ], - }, - { - code: 'āš”', - keywords: [ - 'crossed', - 'swords', - 'weapon', - ], - }, - { - code: 'šŸ”«', - keywords: [ - 'gun', - 'handgun', - 'pistol', - 'revolver', - 'tool', - 'weapon', - ], - }, - { - code: 'šŸ¹', - keywords: [ - 'archer', - 'arrow', - 'bow', - 'sagittarius', - 'tool', - 'weapon', - 'zodiac', - ], - }, - { - code: 'šŸ›”', - keywords: [ - 'shield', - 'weapon', - ], - }, - { - code: 'šŸ”§', - keywords: [ - 'tool', - 'wrench', - ], - }, - { - code: 'šŸ”©', - keywords: [ - 'bolt', - 'nut', - 'tool', - ], - }, - { - code: 'āš™', - keywords: [ - 'gear', - 'tool', - ], - }, - { - code: 'šŸ—œ', - keywords: [ - 'compression', - 'tool', - 'vice', - ], - }, - { - code: 'āš—', - keywords: [ - 'alembic', - 'chemistry', - 'tool', - ], - }, - { - code: 'āš–', - keywords: [ - 'balance', - 'justice', - 'libra', - 'scales', - 'tool', - 'weight', - 'zodiac', - ], - }, - { - code: 'šŸ”—', - keywords: [ - 'link', - ], - }, - { - code: 'ā›“', - keywords: [ - 'chain', - ], - }, - { - code: 'šŸ’‰', - keywords: [ - 'doctor', - 'medicine', - 'needle', - 'shot', - 'sick', - 'syringe', - 'tool', - ], - }, - { - code: 'šŸ’Š', - keywords: [ - 'doctor', - 'medicine', - 'pill', - 'sick', - ], - }, - { - code: 'šŸš¬', - keywords: [ - 'activity', - 'smoking', - ], - }, - { - code: 'āš°', - keywords: [ - 'coffin', - 'death', - ], - }, - { - code: 'āš±', - keywords: [ - 'death', - 'funeral', - 'urn', - ], - }, - { - code: 'šŸ—æ', - keywords: [ - 'face', - 'moyai', - 'statue', - ], - }, - { - code: 'šŸ›¢', - keywords: [ - 'drum', - 'oil', - ], - }, - { - code: 'šŸ”®', - keywords: [ - 'ball', - 'crystal', - 'fairy tale', - 'fantasy', - 'fortune', - 'tool', - ], - }, - { - code: 'šŸ›’', - keywords: [ - 'cart', - 'shopping', - 'trolley', - ], - }, - ], - }, - { - title: 'Symbols', - data: [ - { - code: 'šŸ§', - keywords: [ - 'atm', - 'automated', - 'bank', - 'teller', - ], - }, - { - code: 'šŸš®', - keywords: [ - 'litter', - 'litterbox', - ], - }, - { - code: 'šŸš°', - keywords: [ - 'drink', - 'potable', - 'water', - ], - }, - { - code: 'ā™æ', - keywords: [ - 'access', - 'wheelchair', - ], - }, - { - code: 'šŸš¹', - keywords: [ - 'lavatory', - 'man', - 'restroom', - 'wc', - ], - }, - { - code: 'šŸšŗ', - keywords: [ - 'lavatory', - 'restroom', - 'wc', - 'woman', - ], - }, - { - code: 'šŸš»', - keywords: [ - 'lavatory', - 'restroom', - 'wc', - ], - }, - { - code: 'šŸš¼', - keywords: [ - 'baby', - 'changing', - ], - }, - { - code: 'šŸš¾', - keywords: [ - 'closet', - 'lavatory', - 'restroom', - 'water', - 'wc', - ], - }, - { - code: 'šŸ›‚', - keywords: [ - 'control', - 'passport', - ], - }, - { - code: 'šŸ›ƒ', - keywords: [ - 'customs', - ], - }, - { - code: 'šŸ›„', - keywords: [ - 'baggage', - 'claim', - ], - }, - { - code: 'šŸ›…', - keywords: [ - 'baggage', - 'left luggage', - 'locker', - 'luggage', - ], - }, - { - code: 'āš ', - keywords: [ - 'warning', - ], - }, - { - code: 'šŸšø', - keywords: [ - 'child', - 'crossing', - 'pedestrian', - 'traffic', - ], - }, - { - code: 'ā›”', - keywords: [ - 'entry', - 'forbidden', - 'no', - 'not', - 'prohibited', - 'traffic', - ], - }, - { - code: 'šŸš«', - keywords: [ - 'entry', - 'forbidden', - 'no', - 'not', - 'prohibited', - ], - }, - { - code: 'šŸš³', - keywords: [ - 'bicycle', - 'bike', - 'forbidden', - 'no', - 'not', - 'prohibited', - 'vehicle', - ], - }, - { - code: 'šŸš­', - keywords: [ - 'forbidden', - 'no', - 'not', - 'prohibited', - 'smoking', - ], - }, - { - code: 'šŸšÆ', - keywords: [ - 'forbidden', - 'litter', - 'no', - 'not', - 'prohibited', - ], - }, - { - code: 'šŸš±', - keywords: [ - 'drink', - 'forbidden', - 'no', - 'not', - 'potable', - 'prohibited', - 'water', - ], - }, - { - code: 'šŸš·', - keywords: [ - 'forbidden', - 'no', - 'not', - 'pedestrian', - 'prohibited', - ], - }, - { - code: 'šŸ“µ', - keywords: [ - 'cell', - 'communication', - 'forbidden', - 'mobile', - 'no', - 'not', - 'phone', - 'prohibited', - 'telephone', - ], - }, - { - code: 'šŸ”ž', - keywords: [ - '18', - 'age restriction', - 'eighteen', - 'forbidden', - 'no', - 'not', - 'prohibited', - 'underage', - ], - }, - { - code: 'ā˜¢', - keywords: [ - 'radioactive', - ], - }, - { - code: 'ā˜£', - keywords: [ - 'biohazard', - ], - }, - { - code: 'ā¬†', - keywords: [ - 'arrow', - 'cardinal', - 'direction', - 'north', - ], - }, - { - code: 'ā†—', - keywords: [ - 'arrow', - 'direction', - 'intercardinal', - 'northeast', - ], - }, - { - code: 'āž”', - keywords: [ - 'arrow', - 'cardinal', - 'direction', - 'east', - ], - }, - { - code: 'ā†˜', - keywords: [ - 'arrow', - 'direction', - 'intercardinal', - 'southeast', - ], - }, - { - code: 'ā¬‡', - keywords: [ - 'arrow', - 'cardinal', - 'direction', - 'down', - 'south', - ], - }, - { - code: 'ā†™', - keywords: [ - 'arrow', - 'direction', - 'intercardinal', - 'southwest', - ], - }, - { - code: 'ā¬…', - keywords: [ - 'arrow', - 'cardinal', - 'direction', - 'west', - ], - }, - { - code: 'ā†–', - keywords: [ - 'arrow', - 'direction', - 'intercardinal', - 'northwest', - ], - }, - { - code: 'ā†•', - keywords: [ - 'arrow', - ], - }, - { - code: 'ā†”', - keywords: [ - 'arrow', - ], - }, - { - code: 'ā†©', - keywords: [ - 'arrow', - ], - }, - { - code: 'ā†Ŗ', - keywords: [ - 'arrow', - ], - }, - { - code: 'ā¤“', - keywords: [ - 'arrow', - ], - }, - { - code: 'ā¤µ', - keywords: [ - 'arrow', - 'down', - ], - }, - { - code: 'šŸ”ƒ', - keywords: [ - 'arrow', - 'clockwise', - 'reload', - ], - }, - { - code: 'šŸ”„', - keywords: [ - 'anticlockwise', - 'arrow', - 'counterclockwise', - 'withershins', - ], - }, - { - code: 'šŸ”™', - keywords: [ - 'arrow', - 'back', - ], - }, - { - code: 'šŸ”š', - keywords: [ - 'arrow', - 'end', - ], - }, - { - code: 'šŸ”›', - keywords: [ - 'arrow', - 'mark', - 'on', - ], - }, - { - code: 'šŸ”œ', - keywords: [ - 'arrow', - 'soon', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'arrow', - 'top', - 'up', - ], - }, - { - code: 'šŸ›', - keywords: [ - 'religion', - 'worship', - ], - }, - { - code: 'āš›', - keywords: [ - 'atheist', - 'atom', - ], - }, - { - code: 'šŸ•‰', - keywords: [ - 'hindu', - 'om', - 'religion', - ], - }, - { - code: 'āœ”', - keywords: [ - 'david', - 'jew', - 'jewish', - 'religion', - 'star', - ], - }, - { - code: 'ā˜ø', - keywords: [ - 'buddhist', - 'dharma', - 'religion', - 'wheel', - ], - }, - { - code: 'ā˜Æ', - keywords: [ - 'religion', - 'tao', - 'taoist', - 'yang', - 'yin', - ], - }, - { - code: 'āœ', - keywords: [ - 'christian', - 'cross', - 'religion', - ], - }, - { - code: 'ā˜¦', - keywords: [ - 'christian', - 'cross', - 'religion', - ], - }, - { - code: 'ā˜Ŗ', - keywords: [ - 'islam', - 'muslim', - 'religion', - ], - }, - { - code: 'ā˜®', - keywords: [ - 'peace', - ], - }, - { - code: 'šŸ•Ž', - keywords: [ - 'candelabrum', - 'candlestick', - 'menorah', - 'religion', - ], - }, - { - code: 'šŸ”Æ', - keywords: [ - 'fortune', - 'star', - ], - }, - { - code: 'ā™»', - keywords: [ - 'recycle', - ], - }, - { - code: 'šŸ“›', - keywords: [ - 'badge', - 'name', - ], - }, - { - code: 'āšœ', - keywords: [ - 'fleur-de-lis', - ], - }, - { - code: 'šŸ”°', - keywords: [ - 'beginner', - 'chevron', - 'green', - 'japanese', - 'leaf', - 'tool', - 'yellow', - ], - }, - { - code: 'šŸ”±', - keywords: [ - 'anchor', - 'emblem', - 'ship', - 'tool', - 'trident', - ], - }, - { - code: 'ā­•', - keywords: [ - 'circle', - 'o', - ], - }, - { - code: 'āœ…', - keywords: [ - 'check', - 'mark', - ], - }, - { - code: 'ā˜‘', - keywords: [ - 'ballot', - 'box', - 'check', - ], - }, - { - code: 'āœ”', - keywords: [ - 'check', - 'mark', - ], - }, - { - code: 'āœ–', - keywords: [ - 'cancel', - 'multiplication', - 'multiply', - 'x', - ], - }, - { - code: 'āŒ', - keywords: [ - 'cancel', - 'mark', - 'multiplication', - 'multiply', - 'x', - ], - }, - { - code: 'āŽ', - keywords: [ - 'mark', - 'square', - ], - }, - { - code: 'āž•', - keywords: [ - 'math', - 'plus', - ], - }, - { - code: 'āž–', - keywords: [ - 'math', - 'minus', - ], - }, - { - code: 'āž—', - keywords: [ - 'division', - 'math', - ], - }, - { - code: 'āž°', - keywords: [ - 'curl', - 'loop', - ], - }, - { - code: 'āžæ', - keywords: [ - 'curl', - 'double', - 'loop', - ], - }, - { - code: 'ć€½', - keywords: [ - 'mark', - 'part', - ], - }, - { - code: 'āœ³', - keywords: [ - 'asterisk', - ], - }, - { - code: 'āœ“', - keywords: [ - 'star', - ], - }, - { - code: 'ā‡', - keywords: [ - 'sparkle', - ], - }, - { - code: 'ā€¼', - keywords: [ - 'bangbang', - 'exclamation', - 'mark', - 'punctuation', - ], - }, - { - code: 'ā‰', - keywords: [ - 'exclamation', - 'interrobang', - 'mark', - 'punctuation', - 'question', - ], - }, - { - code: 'ā“', - keywords: [ - 'mark', - 'punctuation', - 'question', - ], - }, - { - code: 'ā”', - keywords: [ - 'mark', - 'outlined', - 'punctuation', - 'question', - ], - }, - { - code: 'ā•', - keywords: [ - 'exclamation', - 'mark', - 'outlined', - 'punctuation', - ], - }, - { - code: 'ā—', - keywords: [ - 'exclamation', - 'mark', - 'punctuation', - ], - }, - { - code: '怰', - keywords: [ - 'dash', - 'punctuation', - 'wavy', - ], - }, - { - code: 'Ā©', - keywords: [ - 'copyright', - ], - }, - { - code: 'Ā®', - keywords: [ - 'registered', - ], - }, - { - code: 'ā„¢', - keywords: [ - 'mark', - 'tm', - 'trademark', - ], - }, - { - code: 'ā™ˆ', - keywords: [ - 'aries', - 'ram', - 'zodiac', - ], - }, - { - code: 'ā™‰', - keywords: [ - 'bull', - 'ox', - 'taurus', - 'zodiac', - ], - }, - { - code: 'ā™Š', - keywords: [ - 'gemini', - 'twins', - 'zodiac', - ], - }, - { - code: 'ā™‹', - keywords: [ - 'cancer', - 'crab', - 'zodiac', - ], - }, - { - code: 'ā™Œ', - keywords: [ - 'leo', - 'lion', - 'zodiac', - ], - }, - { - code: 'ā™', - keywords: [ - 'maiden', - 'virgin', - 'virgo', - 'zodiac', - ], - }, - { - code: 'ā™Ž', - keywords: [ - 'balance', - 'justice', - 'libra', - 'scales', - 'zodiac', - ], - }, - { - code: 'ā™', - keywords: [ - 'scorpio', - 'scorpion', - 'scorpius', - 'zodiac', - ], - }, - { - code: 'ā™', - keywords: [ - 'archer', - 'sagittarius', - 'zodiac', - ], - }, - { - code: 'ā™‘', - keywords: [ - 'capricorn', - 'goat', - 'zodiac', - ], - }, - { - code: 'ā™’', - keywords: [ - 'aquarius', - 'bearer', - 'water', - 'zodiac', - ], - }, - { - code: 'ā™“', - keywords: [ - 'fish', - 'pisces', - 'zodiac', - ], - }, - { - code: 'ā›Ž', - keywords: [ - 'bearer', - 'ophiuchus', - 'serpent', - 'snake', - 'zodiac', - ], - }, - { - code: 'šŸ”€', - keywords: [ - 'arrow', - 'crossed', - ], - }, - { - code: 'šŸ”', - keywords: [ - 'arrow', - 'clockwise', - 'repeat', - ], - }, - { - code: 'šŸ”‚', - keywords: [ - 'arrow', - 'clockwise', - 'once', - ], - }, - { - code: 'ā–¶', - keywords: [ - 'arrow', - 'play', - 'right', - 'triangle', - ], - }, - { - code: 'ā©', - keywords: [ - 'arrow', - 'double', - 'fast', - 'forward', - ], - }, - { - code: 'ā­', - keywords: [ - 'arrow', - 'next scene', - 'next track', - 'triangle', - ], - }, - { - code: 'āÆ', - keywords: [ - 'arrow', - 'pause', - 'play', - 'right', - 'triangle', - ], - }, - { - code: 'ā—€', - keywords: [ - 'arrow', - 'left', - 'reverse', - 'triangle', - ], - }, - { - code: 'āŖ', - keywords: [ - 'arrow', - 'double', - 'rewind', - ], - }, - { - code: 'ā®', - keywords: [ - 'arrow', - 'previous scene', - 'previous track', - 'triangle', - ], - }, - { - code: 'šŸ”¼', - keywords: [ - 'arrow', - 'button', - 'red', - ], - }, - { - code: 'ā«', - keywords: [ - 'arrow', - 'double', - ], - }, - { - code: 'šŸ”½', - keywords: [ - 'arrow', - 'button', - 'down', - 'red', - ], - }, - { - code: 'ā¬', - keywords: [ - 'arrow', - 'double', - 'down', - ], - }, - { - code: 'āø', - keywords: [ - 'bar', - 'double', - 'pause', - 'vertical', - ], - }, - { - code: 'ā¹', - keywords: [ - 'square', - 'stop', - ], - }, - { - code: 'āŗ', - keywords: [ - 'circle', - 'record', - ], - }, - { - code: 'ā', - keywords: [ - 'eject', - ], - }, - { - code: 'šŸŽ¦', - keywords: [ - 'activity', - 'camera', - 'cinema', - 'entertainment', - 'film', - 'movie', - ], - }, - { - code: 'šŸ”…', - keywords: [ - 'brightness', - 'dim', - 'low', - ], - }, - { - code: 'šŸ”†', - keywords: [ - 'bright', - 'brightness', - ], - }, - { - code: 'šŸ“¶', - keywords: [ - 'antenna', - 'bar', - 'cell', - 'communication', - 'mobile', - 'phone', - 'signal', - 'telephone', - ], - }, - { - code: 'šŸ“³', - keywords: [ - 'cell', - 'communication', - 'mobile', - 'mode', - 'phone', - 'telephone', - 'vibration', - ], - }, - { - code: 'šŸ““', - keywords: [ - 'cell', - 'communication', - 'mobile', - 'off', - 'phone', - 'telephone', - ], - }, - { - code: '#ļøāƒ£', - keywords: [ - 'hash', - 'keycap', - 'pound', - ], - }, - { - code: '*ļøāƒ£', - keywords: [ - 'asterisk', - 'keycap', - 'star', - ], - }, - { - code: '0ļøāƒ£', - keywords: [ - '0', - 'keycap', - 'zero', - ], - }, - { - code: '1ļøāƒ£', - keywords: [ - '1', - 'keycap', - 'one', - ], - }, - { - code: '2ļøāƒ£', - keywords: [ - '2', - 'keycap', - 'two', - ], - }, - { - code: '3ļøāƒ£', - keywords: [ - '3', - 'keycap', - 'three', - ], - }, - { - code: '4ļøāƒ£', - keywords: [ - '4', - 'four', - 'keycap', - ], - }, - { - code: '5ļøāƒ£', - keywords: [ - '5', - 'five', - 'keycap', - ], - }, - { - code: '6ļøāƒ£', - keywords: [ - '6', - 'keycap', - 'six', - ], - }, - { - code: '7ļøāƒ£', - keywords: [ - '7', - 'keycap', - 'seven', - ], - }, - { - code: '8ļøāƒ£', - keywords: [ - '8', - 'eight', - 'keycap', - ], - }, - { - code: '9ļøāƒ£', - keywords: [ - '9', - 'keycap', - 'nine', - ], - }, - { - code: 'šŸ”Ÿ', - keywords: [ - '10', - 'keycap', - 'ten', - ], - }, - { - code: 'šŸ’Æ', - keywords: [ - '100', - 'full', - 'hundred', - 'score', - ], - }, - { - code: 'šŸ” ', - keywords: [ - 'input', - 'latin', - 'letters', - 'uppercase', - ], - }, - { - code: 'šŸ””', - keywords: [ - 'abcd', - 'input', - 'latin', - 'letters', - 'lowercase', - ], - }, - { - code: 'šŸ”¢', - keywords: [ - '1234', - 'input', - 'numbers', - ], - }, - { - code: 'šŸ”£', - keywords: [ - 'input', - ], - }, - { - code: 'šŸ”¤', - keywords: [ - 'abc', - 'alphabet', - 'input', - 'latin', - 'letters', - ], - }, - { - code: 'šŸ…°', - keywords: [ - 'a', - 'blood', - ], - }, - { - code: 'šŸ†Ž', - keywords: [ - 'ab', - 'blood', - ], - }, - { - code: 'šŸ…±', - keywords: [ - 'b', - 'blood', - ], - }, - { - code: 'šŸ†‘', - keywords: [ - 'cl', - ], - }, - { - code: 'šŸ†’', - keywords: [ - 'cool', - ], - }, - { - code: 'šŸ†“', - keywords: [ - 'free', - ], - }, - { - code: 'ā„¹', - keywords: [ - 'i', - 'information', - ], - }, - { - code: 'šŸ†”', - keywords: [ - 'id', - 'identity', - ], - }, - { - code: 'ā“‚', - keywords: [ - 'circle', - 'm', - ], - }, - { - code: 'šŸ†•', - keywords: [ - 'new', - ], - }, - { - code: 'šŸ†–', - keywords: [ - 'ng', - ], - }, - { - code: 'šŸ…¾', - keywords: [ - 'blood', - 'o', - ], - }, - { - code: 'šŸ†—', - keywords: [ - 'ok', - ], - }, - { - code: 'šŸ…æ', - keywords: [ - 'parking', - ], - }, - { - code: 'šŸ†˜', - keywords: [ - 'help', - 'sos', - ], - }, - { - code: 'šŸ†™', - keywords: [ - 'mark', - 'up', - ], - }, - { - code: 'šŸ†š', - keywords: [ - 'versus', - 'vs', - ], - }, - { - code: 'šŸˆ', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸˆ‚', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸˆ·', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸˆ¶', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸˆÆ', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸ‰', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸˆ¹', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸˆš', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸˆ²', - keywords: [ - 'japanese', - ], - }, - { - code: 'šŸ‰‘', - keywords: [ - 'chinese', - ], - }, - { - code: 'šŸˆø', - keywords: [ - 'chinese', - ], - }, - { - code: 'šŸˆ“', - keywords: [ - 'chinese', - ], - }, - { - code: 'šŸˆ³', - keywords: [ - 'chinese', - ], - }, - { - code: '抗', - keywords: [ - 'chinese', - 'congratulation', - 'congratulations', - 'ideograph', - ], - }, - { - code: '抙', - keywords: [ - 'chinese', - 'ideograph', - 'secret', - ], - }, - { - code: 'šŸˆŗ', - keywords: [ - 'chinese', - ], - }, - { - code: 'šŸˆµ', - keywords: [ - 'chinese', - ], - }, - { - code: 'ā–Ŗ', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'ā–«', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'ā—»', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'ā—¼', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'ā—½', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'ā—¾', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'ā¬›', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'ā¬œ', - keywords: [ - 'geometric', - 'square', - ], - }, - { - code: 'šŸ”¶', - keywords: [ - 'diamond', - 'geometric', - 'orange', - ], - }, - { - code: 'šŸ”·', - keywords: [ - 'blue', - 'diamond', - 'geometric', - ], - }, - { - code: 'šŸ”ø', - keywords: [ - 'diamond', - 'geometric', - 'orange', - ], - }, - { - code: 'šŸ”¹', - keywords: [ - 'blue', - 'diamond', - 'geometric', - ], - }, - { - code: 'šŸ”ŗ', - keywords: [ - 'geometric', - 'red', - ], - }, - { - code: 'šŸ”»', - keywords: [ - 'down', - 'geometric', - 'red', - ], - }, - { - code: 'šŸ’ ', - keywords: [ - 'comic', - 'diamond', - 'geometric', - 'inside', - ], - }, - { - code: 'šŸ”˜', - keywords: [ - 'button', - 'geometric', - 'radio', - ], - }, - { - code: 'šŸ”²', - keywords: [ - 'button', - 'geometric', - 'square', - ], - }, - { - code: 'šŸ”³', - keywords: [ - 'button', - 'geometric', - 'outlined', - 'square', - ], - }, - { - code: 'āšŖ', - keywords: [ - 'circle', - 'geometric', - ], - }, - { - code: 'āš«', - keywords: [ - 'circle', - 'geometric', - ], - }, - { - code: 'šŸ”“', - keywords: [ - 'circle', - 'geometric', - 'red', - ], - }, - { - code: 'šŸ”µ', - keywords: [ - 'blue', - 'circle', - 'geometric', - ], - }, - ], - }, - { - title: 'Flags', - data: [ - { - code: 'šŸ', - keywords: [ - 'checkered', - 'chequered', - 'flag', - 'racing', - ], - }, - { - code: 'šŸš©', - keywords: [ - 'flag', - 'post', - ], - }, - { - code: 'šŸŽŒ', - keywords: [ - 'activity', - 'celebration', - 'cross', - 'crossed', - 'flag', - 'japanese', - ], - }, - { - code: 'šŸ“', - keywords: [ - 'flag', - 'waving', - ], - }, - { - code: 'šŸ³', - keywords: [ - 'flag', - 'waving', - ], - }, - { - code: 'šŸ‡¦šŸ‡Ø', - keywords: [ - 'ascension', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡¦šŸ‡©', - keywords: [ - 'andorra', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡Ŗ', - keywords: [ - 'emirates', - 'flag', - 'uae', - 'united', - ], - }, - { - code: 'šŸ‡¦šŸ‡«', - keywords: [ - 'afghanistan', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡¬', - keywords: [ - 'antigua', - 'barbuda', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡®', - keywords: [ - 'anguilla', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡±', - keywords: [ - 'albania', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡²', - keywords: [ - 'armenia', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡“', - keywords: [ - 'angola', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡¶', - keywords: [ - 'antarctica', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡·', - keywords: [ - 'argentina', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡ø', - keywords: [ - 'american', - 'flag', - 'samoa', - ], - }, - { - code: 'šŸ‡¦šŸ‡¹', - keywords: [ - 'austria', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡ŗ', - keywords: [ - 'australia', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡¼', - keywords: [ - 'aruba', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡½', - keywords: [ - 'Ć„land', - 'flag', - ], - }, - { - code: 'šŸ‡¦šŸ‡æ', - keywords: [ - 'azerbaijan', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡¦', - keywords: [ - 'bosnia', - 'flag', - 'herzegovina', - ], - }, - { - code: 'šŸ‡§šŸ‡§', - keywords: [ - 'barbados', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡©', - keywords: [ - 'bangladesh', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡Ŗ', - keywords: [ - 'belgium', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡«', - keywords: [ - 'burkina faso', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡¬', - keywords: [ - 'bulgaria', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡­', - keywords: [ - 'bahrain', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡®', - keywords: [ - 'burundi', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡Æ', - keywords: [ - 'benin', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡±', - keywords: [ - 'barthelemy', - 'barthĆ©lemy', - 'flag', - 'saint', - ], - }, - { - code: 'šŸ‡§šŸ‡²', - keywords: [ - 'bermuda', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡³', - keywords: [ - 'brunei', - 'darussalam', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡“', - keywords: [ - 'bolivia', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡¶', - keywords: [ - 'bonaire', - 'caribbean', - 'eustatius', - 'flag', - 'netherlands', - 'saba', - 'sint', - ], - }, - { - code: 'šŸ‡§šŸ‡·', - keywords: [ - 'brazil', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡ø', - keywords: [ - 'bahamas', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡¹', - keywords: [ - 'bhutan', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡»', - keywords: [ - 'bouvet', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡§šŸ‡¼', - keywords: [ - 'botswana', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡¾', - keywords: [ - 'belarus', - 'flag', - ], - }, - { - code: 'šŸ‡§šŸ‡æ', - keywords: [ - 'belize', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡¦', - keywords: [ - 'canada', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡Ø', - keywords: [ - 'cocos', - 'flag', - 'island', - 'keeling', - ], - }, - { - code: 'šŸ‡ØšŸ‡©', - keywords: [ - 'congo', - 'congo-kinshasa', - 'democratic republic of congo', - 'drc', - 'flag', - 'kinshasa', - 'republic', - ], - }, - { - code: 'šŸ‡ØšŸ‡«', - keywords: [ - 'central african republic', - 'flag', - 'republic', - ], - }, - { - code: 'šŸ‡ØšŸ‡¬', - keywords: [ - 'brazzaville', - 'congo', - 'congo republic', - 'congo-brazzaville', - 'flag', - 'republic', - 'republic of the congo', - ], - }, - { - code: 'šŸ‡ØšŸ‡­', - keywords: [ - 'flag', - 'switzerland', - ], - }, - { - code: 'šŸ‡ØšŸ‡®', - keywords: [ - 'cote ivoire', - 'cĆ“te ivoire', - 'flag', - 'ivory coast', - ], - }, - { - code: 'šŸ‡ØšŸ‡°', - keywords: [ - 'cook', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡ØšŸ‡±', - keywords: [ - 'chile', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡²', - keywords: [ - 'cameroon', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡³', - keywords: [ - 'china', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡“', - keywords: [ - 'colombia', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡µ', - keywords: [ - 'clipperton', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡ØšŸ‡·', - keywords: [ - 'costa rica', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡ŗ', - keywords: [ - 'cuba', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡»', - keywords: [ - 'cabo', - 'cape', - 'flag', - 'verde', - ], - }, - { - code: 'šŸ‡ØšŸ‡¼', - keywords: [ - 'antilles', - 'curacao', - 'curaƧao', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡½', - keywords: [ - 'christmas', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡ØšŸ‡¾', - keywords: [ - 'cyprus', - 'flag', - ], - }, - { - code: 'šŸ‡ØšŸ‡æ', - keywords: [ - 'czech republic', - 'flag', - ], - }, - { - code: 'šŸ‡©šŸ‡Ŗ', - keywords: [ - 'flag', - 'germany', - ], - }, - { - code: 'šŸ‡©šŸ‡¬', - keywords: [ - 'diego garcia', - 'flag', - ], - }, - { - code: 'šŸ‡©šŸ‡Æ', - keywords: [ - 'djibouti', - 'flag', - ], - }, - { - code: 'šŸ‡©šŸ‡°', - keywords: [ - 'denmark', - 'flag', - ], - }, - { - code: 'šŸ‡©šŸ‡²', - keywords: [ - 'dominica', - 'flag', - ], - }, - { - code: 'šŸ‡©šŸ‡“', - keywords: [ - 'dominican republic', - 'flag', - ], - }, - { - code: 'šŸ‡©šŸ‡æ', - keywords: [ - 'algeria', - 'flag', - ], - }, - { - code: 'šŸ‡ŖšŸ‡¦', - keywords: [ - 'ceuta', - 'flag', - 'melilla', - ], - }, - { - code: 'šŸ‡ŖšŸ‡Ø', - keywords: [ - 'ecuador', - 'flag', - ], - }, - { - code: 'šŸ‡ŖšŸ‡Ŗ', - keywords: [ - 'estonia', - 'flag', - ], - }, - { - code: 'šŸ‡ŖšŸ‡¬', - keywords: [ - 'egypt', - 'flag', - ], - }, - { - code: 'šŸ‡ŖšŸ‡­', - keywords: [ - 'flag', - 'sahara', - 'west', - 'western sahara', - ], - }, - { - code: 'šŸ‡ŖšŸ‡·', - keywords: [ - 'eritrea', - 'flag', - ], - }, - { - code: 'šŸ‡ŖšŸ‡ø', - keywords: [ - 'flag', - 'spain', - ], - }, - { - code: 'šŸ‡ŖšŸ‡¹', - keywords: [ - 'ethiopia', - 'flag', - ], - }, - { - code: 'šŸ‡ŖšŸ‡ŗ', - keywords: [ - 'european union', - 'flag', - ], - }, - { - code: 'šŸ‡«šŸ‡®', - keywords: [ - 'finland', - 'flag', - ], - }, - { - code: 'šŸ‡«šŸ‡Æ', - keywords: [ - 'fiji', - 'flag', - ], - }, - { - code: 'šŸ‡«šŸ‡°', - keywords: [ - 'falkland', - 'falklands', - 'flag', - 'island', - 'islas', - 'malvinas', - ], - }, - { - code: 'šŸ‡«šŸ‡²', - keywords: [ - 'flag', - 'micronesia', - ], - }, - { - code: 'šŸ‡«šŸ‡“', - keywords: [ - 'faroe', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡«šŸ‡·', - keywords: [ - 'flag', - 'france', - ], - }, - { - code: 'šŸ‡¬šŸ‡¦', - keywords: [ - 'flag', - 'gabon', - ], - }, - { - code: 'šŸ‡¬šŸ‡§', - keywords: [ - 'britain', - 'british', - 'cornwall', - 'england', - 'flag', - 'great britain', - 'ireland', - 'northern ireland', - 'scotland', - 'uk', - 'union jack', - 'united', - 'united kingdom', - 'wales', - ], - }, - { - code: 'šŸ‡¬šŸ‡©', - keywords: [ - 'flag', - 'grenada', - ], - }, - { - code: 'šŸ‡¬šŸ‡Ŗ', - keywords: [ - 'flag', - 'georgia', - ], - }, - { - code: 'šŸ‡¬šŸ‡«', - keywords: [ - 'flag', - 'french', - 'guiana', - ], - }, - { - code: 'šŸ‡¬šŸ‡¬', - keywords: [ - 'flag', - 'guernsey', - ], - }, - { - code: 'šŸ‡¬šŸ‡­', - keywords: [ - 'flag', - 'ghana', - ], - }, - { - code: 'šŸ‡¬šŸ‡®', - keywords: [ - 'flag', - 'gibraltar', - ], - }, - { - code: 'šŸ‡¬šŸ‡±', - keywords: [ - 'flag', - 'greenland', - ], - }, - { - code: 'šŸ‡¬šŸ‡²', - keywords: [ - 'flag', - 'gambia', - ], - }, - { - code: 'šŸ‡¬šŸ‡³', - keywords: [ - 'flag', - 'guinea', - ], - }, - { - code: 'šŸ‡¬šŸ‡µ', - keywords: [ - 'flag', - 'guadeloupe', - ], - }, - { - code: 'šŸ‡¬šŸ‡¶', - keywords: [ - 'equatorial guinea', - 'flag', - 'guinea', - ], - }, - { - code: 'šŸ‡¬šŸ‡·', - keywords: [ - 'flag', - 'greece', - ], - }, - { - code: 'šŸ‡¬šŸ‡ø', - keywords: [ - 'flag', - 'georgia', - 'island', - 'south', - 'south georgia', - 'south sandwich', - ], - }, - { - code: 'šŸ‡¬šŸ‡¹', - keywords: [ - 'flag', - 'guatemala', - ], - }, - { - code: 'šŸ‡¬šŸ‡ŗ', - keywords: [ - 'flag', - 'guam', - ], - }, - { - code: 'šŸ‡¬šŸ‡¼', - keywords: [ - 'bissau', - 'flag', - 'guinea', - ], - }, - { - code: 'šŸ‡¬šŸ‡¾', - keywords: [ - 'flag', - 'guyana', - ], - }, - { - code: 'šŸ‡­šŸ‡°', - keywords: [ - 'china', - 'flag', - 'hong kong', - ], - }, - { - code: 'šŸ‡­šŸ‡²', - keywords: [ - 'flag', - 'heard', - 'island', - 'mcdonald', - ], - }, - { - code: 'šŸ‡­šŸ‡³', - keywords: [ - 'flag', - 'honduras', - ], - }, - { - code: 'šŸ‡­šŸ‡·', - keywords: [ - 'croatia', - 'flag', - ], - }, - { - code: 'šŸ‡­šŸ‡¹', - keywords: [ - 'flag', - 'haiti', - ], - }, - { - code: 'šŸ‡­šŸ‡ŗ', - keywords: [ - 'flag', - 'hungary', - ], - }, - { - code: 'šŸ‡®šŸ‡Ø', - keywords: [ - 'canary', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡®šŸ‡©', - keywords: [ - 'flag', - 'indonesia', - ], - }, - { - code: 'šŸ‡®šŸ‡Ŗ', - keywords: [ - 'flag', - 'ireland', - ], - }, - { - code: 'šŸ‡®šŸ‡±', - keywords: [ - 'flag', - 'israel', - ], - }, - { - code: 'šŸ‡®šŸ‡²', - keywords: [ - 'flag', - 'isle of man', - ], - }, - { - code: 'šŸ‡®šŸ‡³', - keywords: [ - 'flag', - 'india', - ], - }, - { - code: 'šŸ‡®šŸ‡“', - keywords: [ - 'british', - 'chagos', - 'flag', - 'indian ocean', - 'island', - ], - }, - { - code: 'šŸ‡®šŸ‡¶', - keywords: [ - 'flag', - 'iraq', - ], - }, - { - code: 'šŸ‡®šŸ‡·', - keywords: [ - 'flag', - 'iran', - ], - }, - { - code: 'šŸ‡®šŸ‡ø', - keywords: [ - 'flag', - 'iceland', - ], - }, - { - code: 'šŸ‡®šŸ‡¹', - keywords: [ - 'flag', - 'italy', - ], - }, - { - code: 'šŸ‡ÆšŸ‡Ŗ', - keywords: [ - 'flag', - 'jersey', - ], - }, - { - code: 'šŸ‡ÆšŸ‡²', - keywords: [ - 'flag', - 'jamaica', - ], - }, - { - code: 'šŸ‡ÆšŸ‡“', - keywords: [ - 'flag', - 'jordan', - ], - }, - { - code: 'šŸ‡ÆšŸ‡µ', - keywords: [ - 'flag', - 'japan', - ], - }, - { - code: 'šŸ‡°šŸ‡Ŗ', - keywords: [ - 'flag', - 'kenya', - ], - }, - { - code: 'šŸ‡°šŸ‡¬', - keywords: [ - 'flag', - 'kyrgyzstan', - ], - }, - { - code: 'šŸ‡°šŸ‡­', - keywords: [ - 'cambodia', - 'flag', - ], - }, - { - code: 'šŸ‡°šŸ‡®', - keywords: [ - 'flag', - 'kiribati', - ], - }, - { - code: 'šŸ‡°šŸ‡²', - keywords: [ - 'comoros', - 'flag', - ], - }, - { - code: 'šŸ‡°šŸ‡³', - keywords: [ - 'flag', - 'kitts', - 'nevis', - 'saint', - ], - }, - { - code: 'šŸ‡°šŸ‡µ', - keywords: [ - 'flag', - 'korea', - 'north', - 'north korea', - ], - }, - { - code: 'šŸ‡°šŸ‡·', - keywords: [ - 'flag', - 'korea', - 'south', - 'south korea', - ], - }, - { - code: 'šŸ‡°šŸ‡¼', - keywords: [ - 'flag', - 'kuwait', - ], - }, - { - code: 'šŸ‡°šŸ‡¾', - keywords: [ - 'cayman', - 'flag', - 'island', - ], - }, - { - code: 'šŸ‡°šŸ‡æ', - keywords: [ - 'flag', - 'kazakhstan', - ], - }, - { - code: 'šŸ‡±šŸ‡¦', - keywords: [ - 'flag', - 'laos', - ], - }, - { - code: 'šŸ‡±šŸ‡§', - keywords: [ - 'flag', - 'lebanon', - ], - }, - { - code: 'šŸ‡±šŸ‡Ø', - keywords: [ - 'flag', - 'lucia', - 'saint', - ], - }, - { - code: 'šŸ‡±šŸ‡®', - keywords: [ - 'flag', - 'liechtenstein', - ], - }, - { - code: 'šŸ‡±šŸ‡°', - keywords: [ - 'flag', - 'sri lanka', - ], - }, - { - code: 'šŸ‡±šŸ‡·', - keywords: [ - 'flag', - 'liberia', - ], - }, - { - code: 'šŸ‡±šŸ‡ø', - keywords: [ - 'flag', - 'lesotho', - ], - }, - { - code: 'šŸ‡±šŸ‡¹', - keywords: [ - 'flag', - 'lithuania', - ], - }, - { - code: 'šŸ‡±šŸ‡ŗ', - keywords: [ - 'flag', - 'luxembourg', - ], - }, - { - code: 'šŸ‡±šŸ‡»', - keywords: [ - 'flag', - 'latvia', - ], - }, - { - code: 'šŸ‡±šŸ‡¾', - keywords: [ - 'flag', - 'libya', - ], - }, - { - code: 'šŸ‡²šŸ‡¦', - keywords: [ - 'flag', - 'morocco', - ], - }, - { - code: 'šŸ‡²šŸ‡Ø', - keywords: [ - 'flag', - 'monaco', - ], - }, - { - code: 'šŸ‡²šŸ‡©', - keywords: [ - 'flag', - 'moldova', - ], - }, - { - code: 'šŸ‡²šŸ‡Ŗ', - keywords: [ - 'flag', - 'montenegro', - ], - }, - { - code: 'šŸ‡²šŸ‡«', - keywords: [ - 'flag', - 'french', - 'martin', - 'saint', - ], - }, - { - code: 'šŸ‡²šŸ‡¬', - keywords: [ - 'flag', - 'madagascar', - ], - }, - { - code: 'šŸ‡²šŸ‡­', - keywords: [ - 'flag', - 'island', - 'marshall', - ], - }, - { - code: 'šŸ‡²šŸ‡°', - keywords: [ - 'flag', - 'macedonia', - ], - }, - { - code: 'šŸ‡²šŸ‡±', - keywords: [ - 'flag', - 'mali', - ], - }, - { - code: 'šŸ‡²šŸ‡²', - keywords: [ - 'burma', - 'flag', - 'myanmar', - ], - }, - { - code: 'šŸ‡²šŸ‡³', - keywords: [ - 'flag', - 'mongolia', - ], - }, - { - code: 'šŸ‡²šŸ‡“', - keywords: [ - 'china', - 'flag', - 'macao', - 'macau', - ], - }, - { - code: 'šŸ‡²šŸ‡µ', - keywords: [ - 'flag', - 'island', - 'mariana', - 'north', - 'northern mariana', - ], - }, - { - code: 'šŸ‡²šŸ‡¶', - keywords: [ - 'flag', - 'martinique', - ], - }, - { - code: 'šŸ‡²šŸ‡·', - keywords: [ - 'flag', - 'mauritania', - ], - }, - { - code: 'šŸ‡²šŸ‡ø', - keywords: [ - 'flag', - 'montserrat', - ], - }, - { - code: 'šŸ‡²šŸ‡¹', - keywords: [ - 'flag', - 'malta', - ], - }, - { - code: 'šŸ‡²šŸ‡ŗ', - keywords: [ - 'flag', - 'mauritius', - ], - }, - { - code: 'šŸ‡²šŸ‡»', - keywords: [ - 'flag', - 'maldives', - ], - }, - { - code: 'šŸ‡²šŸ‡¼', - keywords: [ - 'flag', - 'malawi', - ], - }, - { - code: 'šŸ‡²šŸ‡½', - keywords: [ - 'flag', - 'mexico', - ], - }, - { - code: 'šŸ‡²šŸ‡¾', - keywords: [ - 'flag', - 'malaysia', - ], - }, - { - code: 'šŸ‡²šŸ‡æ', - keywords: [ - 'flag', - 'mozambique', - ], - }, - { - code: 'šŸ‡³šŸ‡¦', - keywords: [ - 'flag', - 'namibia', - ], - }, - { - code: 'šŸ‡³šŸ‡Ø', - keywords: [ - 'flag', - 'new', - 'new caledonia', - ], - }, - { - code: 'šŸ‡³šŸ‡Ŗ', - keywords: [ - 'flag', - 'niger', - ], - }, - { - code: 'šŸ‡³šŸ‡«', - keywords: [ - 'flag', - 'island', - 'norfolk', - ], - }, - { - code: 'šŸ‡³šŸ‡¬', - keywords: [ - 'flag', - 'nigeria', - ], - }, - { - code: 'šŸ‡³šŸ‡®', - keywords: [ - 'flag', - 'nicaragua', - ], - }, - { - code: 'šŸ‡³šŸ‡±', - keywords: [ - 'flag', - 'netherlands', - ], - }, - { - code: 'šŸ‡³šŸ‡“', - keywords: [ - 'flag', - 'norway', - ], - }, - { - code: 'šŸ‡³šŸ‡µ', - keywords: [ - 'flag', - 'nepal', - ], - }, - { - code: 'šŸ‡³šŸ‡·', - keywords: [ - 'flag', - 'nauru', - ], - }, - { - code: 'šŸ‡³šŸ‡ŗ', - keywords: [ - 'flag', - 'niue', - ], - }, - { - code: 'šŸ‡³šŸ‡æ', - keywords: [ - 'flag', - 'new', - 'new zealand', - ], - }, - { - code: 'šŸ‡“šŸ‡²', - keywords: [ - 'flag', - 'oman', - ], - }, - { - code: 'šŸ‡µšŸ‡¦', - keywords: [ - 'flag', - 'panama', - ], - }, - { - code: 'šŸ‡µšŸ‡Ŗ', - keywords: [ - 'flag', - 'peru', - ], - }, - { - code: 'šŸ‡µšŸ‡«', - keywords: [ - 'flag', - 'french', - 'polynesia', - ], - }, - { - code: 'šŸ‡µšŸ‡¬', - keywords: [ - 'flag', - 'guinea', - 'new', - 'papua new guinea', - ], - }, - { - code: 'šŸ‡µšŸ‡­', - keywords: [ - 'flag', - 'philippines', - ], - }, - { - code: 'šŸ‡µšŸ‡°', - keywords: [ - 'flag', - 'pakistan', - ], - }, - { - code: 'šŸ‡µšŸ‡±', - keywords: [ - 'flag', - 'poland', - ], - }, - { - code: 'šŸ‡µšŸ‡²', - keywords: [ - 'flag', - 'miquelon', - 'pierre', - 'saint', - ], - }, - { - code: 'šŸ‡µšŸ‡³', - keywords: [ - 'flag', - 'island', - 'pitcairn', - ], - }, - { - code: 'šŸ‡µšŸ‡·', - keywords: [ - 'flag', - 'puerto rico', - ], - }, - { - code: 'šŸ‡µšŸ‡ø', - keywords: [ - 'flag', - 'palestine', - ], - }, - { - code: 'šŸ‡µšŸ‡¹', - keywords: [ - 'flag', - 'portugal', - ], - }, - { - code: 'šŸ‡µšŸ‡¼', - keywords: [ - 'flag', - 'palau', - ], - }, - { - code: 'šŸ‡µšŸ‡¾', - keywords: [ - 'flag', - 'paraguay', - ], - }, - { - code: 'šŸ‡¶šŸ‡¦', - keywords: [ - 'flag', - 'qatar', - ], - }, - { - code: 'šŸ‡·šŸ‡Ŗ', - keywords: [ - 'flag', - 'reunion', - 'rĆ©union', - ], - }, - { - code: 'šŸ‡·šŸ‡“', - keywords: [ - 'flag', - 'romania', - ], - }, - { - code: 'šŸ‡·šŸ‡ø', - keywords: [ - 'flag', - 'serbia', - ], - }, - { - code: 'šŸ‡·šŸ‡ŗ', - keywords: [ - 'flag', - 'russia', - ], - }, - { - code: 'šŸ‡·šŸ‡¼', - keywords: [ - 'flag', - 'rwanda', - ], - }, - { - code: 'šŸ‡øšŸ‡¦', - keywords: [ - 'flag', - 'saudi arabia', - ], - }, - { - code: 'šŸ‡øšŸ‡§', - keywords: [ - 'flag', - 'island', - 'solomon', - ], - }, - { - code: 'šŸ‡øšŸ‡Ø', - keywords: [ - 'flag', - 'seychelles', - ], - }, - { - code: 'šŸ‡øšŸ‡©', - keywords: [ - 'flag', - 'sudan', - ], - }, - { - code: 'šŸ‡øšŸ‡Ŗ', - keywords: [ - 'flag', - 'sweden', - ], - }, - { - code: 'šŸ‡øšŸ‡¬', - keywords: [ - 'flag', - 'singapore', - ], - }, - { - code: 'šŸ‡øšŸ‡­', - keywords: [ - 'flag', - 'helena', - 'saint', - ], - }, - { - code: 'šŸ‡øšŸ‡®', - keywords: [ - 'flag', - 'slovenia', - ], - }, - { - code: 'šŸ‡øšŸ‡Æ', - keywords: [ - 'flag', - 'jan mayen', - 'svalbard', - ], - }, - { - code: 'šŸ‡øšŸ‡°', - keywords: [ - 'flag', - 'slovakia', - ], - }, - { - code: 'šŸ‡øšŸ‡±', - keywords: [ - 'flag', - 'sierra leone', - ], - }, - { - code: 'šŸ‡øšŸ‡²', - keywords: [ - 'flag', - 'san marino', - ], - }, - { - code: 'šŸ‡øšŸ‡³', - keywords: [ - 'flag', - 'senegal', - ], - }, - { - code: 'šŸ‡øšŸ‡“', - keywords: [ - 'flag', - 'somalia', - ], - }, - { - code: 'šŸ‡øšŸ‡·', - keywords: [ - 'flag', - 'suriname', - ], - }, - { - code: 'šŸ‡øšŸ‡ø', - keywords: [ - 'flag', - 'south', - 'south sudan', - 'sudan', - ], - }, - { - code: 'šŸ‡øšŸ‡¹', - keywords: [ - 'flag', - 'principe', - 'prĆ­ncipe', - 'sao tome', - 'sĆ£o tomĆ©', - ], - }, - { - code: 'šŸ‡øšŸ‡»', - keywords: [ - 'el salvador', - 'flag', - ], - }, - { - code: 'šŸ‡øšŸ‡½', - keywords: [ - 'flag', - 'maarten', - 'sint', - ], - }, - { - code: 'šŸ‡øšŸ‡¾', - keywords: [ - 'flag', - 'syria', - ], - }, - { - code: 'šŸ‡øšŸ‡æ', - keywords: [ - 'flag', - 'swaziland', - ], - }, - { - code: 'šŸ‡¹šŸ‡¦', - keywords: [ - 'flag', - 'tristan da cunha', - ], - }, - { - code: 'šŸ‡¹šŸ‡Ø', - keywords: [ - 'caicos', - 'flag', - 'island', - 'turks', - ], - }, - { - code: 'šŸ‡¹šŸ‡©', - keywords: [ - 'chad', - 'flag', - ], - }, - { - code: 'šŸ‡¹šŸ‡«', - keywords: [ - 'antarctic', - 'flag', - 'french', - ], - }, - { - code: 'šŸ‡¹šŸ‡¬', - keywords: [ - 'flag', - 'togo', - ], - }, - { - code: 'šŸ‡¹šŸ‡­', - keywords: [ - 'flag', - 'thailand', - ], - }, - { - code: 'šŸ‡¹šŸ‡Æ', - keywords: [ - 'flag', - 'tajikistan', - ], - }, - { - code: 'šŸ‡¹šŸ‡°', - keywords: [ - 'flag', - 'tokelau', - ], - }, - { - code: 'šŸ‡¹šŸ‡±', - keywords: [ - 'east', - 'east timor', - 'flag', - 'timor-leste', - ], - }, - { - code: 'šŸ‡¹šŸ‡²', - keywords: [ - 'flag', - 'turkmenistan', - ], - }, - { - code: 'šŸ‡¹šŸ‡³', - keywords: [ - 'flag', - 'tunisia', - ], - }, - { - code: 'šŸ‡¹šŸ‡“', - keywords: [ - 'flag', - 'tonga', - ], - }, - { - code: 'šŸ‡¹šŸ‡·', - keywords: [ - 'flag', - 'turkey', - ], - }, - { - code: 'šŸ‡¹šŸ‡¹', - keywords: [ - 'flag', - 'tobago', - 'trinidad', - ], - }, - { - code: 'šŸ‡¹šŸ‡»', - keywords: [ - 'flag', - 'tuvalu', - ], - }, - { - code: 'šŸ‡¹šŸ‡¼', - keywords: [ - 'china', - 'flag', - 'taiwan', - ], - }, - { - code: 'šŸ‡¹šŸ‡æ', - keywords: [ - 'flag', - 'tanzania', - ], - }, - { - code: 'šŸ‡ŗšŸ‡¦', - keywords: [ - 'flag', - 'ukraine', - ], - }, - { - code: 'šŸ‡ŗšŸ‡¬', - keywords: [ - 'flag', - 'uganda', - ], - }, - { - code: 'šŸ‡ŗšŸ‡²', - keywords: [ - 'america', - 'flag', - 'island', - 'minor outlying', - 'united', - 'united states', - 'us', - 'usa', - ], - }, - { - code: 'šŸ‡ŗšŸ‡ø', - keywords: [ - 'america', - 'flag', - 'stars and stripes', - 'united', - 'united states', - ], - }, - { - code: 'šŸ‡ŗšŸ‡¾', - keywords: [ - 'flag', - 'uruguay', - ], - }, - { - code: 'šŸ‡ŗšŸ‡æ', - keywords: [ - 'flag', - 'uzbekistan', - ], - }, - { - code: 'šŸ‡»šŸ‡¦', - keywords: [ - 'flag', - 'vatican', - ], - }, - { - code: 'šŸ‡»šŸ‡Ø', - keywords: [ - 'flag', - 'grenadines', - 'saint', - 'vincent', - ], - }, - { - code: 'šŸ‡»šŸ‡Ŗ', - keywords: [ - 'flag', - 'venezuela', - ], - }, - { - code: 'šŸ‡»šŸ‡¬', - keywords: [ - 'british', - 'flag', - 'island', - 'virgin', - ], - }, - { - code: 'šŸ‡»šŸ‡®', - keywords: [ - 'america', - 'american', - 'flag', - 'island', - 'united', - 'united states', - 'us', - 'usa', - 'virgin', - ], - }, - { - code: 'šŸ‡»šŸ‡³', - keywords: [ - 'flag', - 'viet nam', - 'vietnam', - ], - }, - { - code: 'šŸ‡»šŸ‡ŗ', - keywords: [ - 'flag', - 'vanuatu', - ], - }, - { - code: 'šŸ‡¼šŸ‡«', - keywords: [ - 'flag', - 'futuna', - 'wallis', - ], - }, - { - code: 'šŸ‡¼šŸ‡ø', - keywords: [ - 'flag', - 'samoa', - ], - }, - { - code: 'šŸ‡½šŸ‡°', - keywords: [ - 'flag', - 'kosovo', - ], - }, - { - code: 'šŸ‡¾šŸ‡Ŗ', - keywords: [ - 'flag', - 'yemen', - ], - }, - { - code: 'šŸ‡¾šŸ‡¹', - keywords: [ - 'flag', - 'mayotte', - ], - }, - { - code: 'šŸ‡æšŸ‡¦', - keywords: [ - 'flag', - 'south', - 'south africa', - ], - }, - { - code: 'šŸ‡æšŸ‡²', - keywords: [ - 'flag', - 'zambia', - ], - }, - { - code: 'šŸ‡æšŸ‡¼', - keywords: [ - 'flag', - 'zimbabwe', - ], - }, + code: 'Smileys & People', + header: true, + }, + { + code: 'šŸ˜€', + keywords: [ + 'face', + 'grin', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'eye', + 'face', + 'grin', + 'smile', + ], + }, + { + code: 'šŸ˜‚', + keywords: [ + 'face', + 'joy', + 'laugh', + 'tear', + ], + }, + { + code: 'šŸ¤£', + keywords: [ + 'face', + 'floor', + 'laugh', + 'lol', + 'rofl', + 'rolling', + ], + }, + { + code: 'šŸ˜ƒ', + keywords: [ + 'face', + 'mouth', + 'open', + 'smile', + ], + }, + { + code: 'šŸ˜„', + keywords: [ + 'eye', + 'face', + 'mouth', + 'open', + 'smile', + ], + }, + { + code: 'šŸ˜…', + keywords: [ + 'cold', + 'face', + 'open', + 'smile', + 'sweat', + ], + }, + { + code: 'šŸ˜†', + keywords: [ + 'face', + 'laugh', + 'mouth', + 'open', + 'satisfied', + 'smile', + ], + }, + { + code: 'šŸ˜‰', + keywords: [ + 'face', + 'wink', + ], + }, + { + code: 'šŸ˜Š', + keywords: [ + 'blush', + 'eye', + 'face', + 'smile', + ], + }, + { + code: 'šŸ˜‹', + keywords: [ + 'delicious', + 'face', + 'savouring', + 'smile', + 'um', + 'yum', + ], + }, + { + code: 'šŸ˜Ž', + keywords: [ + 'bright', + 'cool', + 'eye', + 'eyewear', + 'face', + 'glasses', + 'smile', + 'sun', + 'sunglasses', + 'weather', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'eye', + 'face', + 'heart', + 'love', + 'smile', + ], + }, + { + code: 'šŸ˜˜', + keywords: [ + 'face', + 'heart', + 'kiss', + ], + }, + { + code: 'šŸ˜—', + keywords: [ + 'face', + 'kiss', + ], + }, + { + code: 'šŸ˜™', + keywords: [ + 'eye', + 'face', + 'kiss', + 'smile', + ], + }, + { + code: 'šŸ˜š', + keywords: [ + 'closed', + 'eye', + 'face', + 'kiss', + ], + }, + { + code: 'ā˜ŗ', + keywords: [ + 'face', + 'outlined', + 'relaxed', + 'smile', + ], + }, + { + code: 'šŸ™‚', + keywords: [ + 'face', + 'smile', + ], + }, + { + code: 'šŸ¤—', + keywords: [ + 'face', + 'hug', + 'hugging', + ], + }, + { + code: 'šŸ¤”', + keywords: [ + 'face', + 'thinking', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'deadpan', + 'face', + 'neutral', + ], + }, + { + code: 'šŸ˜‘', + keywords: [ + 'expressionless', + 'face', + 'inexpressive', + 'unexpressive', + ], + }, + { + code: 'šŸ˜¶', + keywords: [ + 'face', + 'mouth', + 'quiet', + 'silent', + ], + }, + { + code: 'šŸ™„', + keywords: [ + 'eyes', + 'face', + 'rolling', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'face', + 'smirk', + ], + }, + { + code: 'šŸ˜£', + keywords: [ + 'face', + 'persevere', + ], + }, + { + code: 'šŸ˜„', + keywords: [ + 'disappointed', + 'face', + 'relieved', + 'whew', + ], + }, + { + code: 'šŸ˜®', + keywords: [ + 'face', + 'mouth', + 'open', + 'sympathy', + ], + }, + { + code: 'šŸ¤', + keywords: [ + 'face', + 'mouth', + 'zipper', + ], + }, + { + code: 'šŸ˜Æ', + keywords: [ + 'face', + 'hushed', + 'stunned', + 'surprised', + ], + }, + { + code: 'šŸ˜Ŗ', + keywords: [ + 'face', + 'sleep', + ], + }, + { + code: 'šŸ˜«', + keywords: [ + 'face', + 'tired', + ], + }, + { + code: 'šŸ˜“', + keywords: [ + 'face', + 'sleep', + 'zzz', + ], + }, + { + code: 'šŸ˜Œ', + keywords: [ + 'face', + 'relieved', + ], + }, + { + code: 'šŸ¤“', + keywords: [ + 'face', + 'geek', + 'nerd', + ], + }, + { + code: 'šŸ˜›', + keywords: [ + 'face', + 'tongue', + ], + }, + { + code: 'šŸ˜œ', + keywords: [ + 'eye', + 'face', + 'joke', + 'tongue', + 'wink', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'eye', + 'face', + 'horrible', + 'taste', + 'tongue', + ], + }, + { + code: 'šŸ¤¤', + keywords: [ + 'drooling', + 'face', + ], + }, + { + code: 'šŸ˜’', + keywords: [ + 'face', + 'unamused', + 'unhappy', + ], + }, + { + code: 'šŸ˜“', + keywords: [ + 'cold', + 'face', + 'sweat', + ], + }, + { + code: 'šŸ˜”', + keywords: [ + 'dejected', + 'face', + 'pensive', + ], + }, + { + code: 'šŸ˜•', + keywords: [ + 'confused', + 'face', + ], + }, + { + code: 'šŸ™ƒ', + keywords: [ + 'face', + 'upside-down', + ], + }, + { + code: 'šŸ¤‘', + keywords: [ + 'face', + 'money', + 'mouth', + ], + }, + { + code: 'šŸ˜²', + keywords: [ + 'astonished', + 'face', + 'shocked', + 'totally', + ], + }, + { + code: 'ā˜¹', + keywords: [ + 'face', + 'frown', + ], + }, + { + code: 'šŸ™', + keywords: [ + 'face', + 'frown', + ], + }, + { + code: 'šŸ˜–', + keywords: [ + 'confounded', + 'face', + ], + }, + { + code: 'šŸ˜ž', + keywords: [ + 'disappointed', + 'face', + ], + }, + { + code: 'šŸ˜Ÿ', + keywords: [ + 'face', + 'worried', + ], + }, + { + code: 'šŸ˜¤', + keywords: [ + 'face', + 'triumph', + 'won', + ], + }, + { + code: 'šŸ˜¢', + keywords: [ + 'cry', + 'face', + 'sad', + 'tear', + ], + }, + { + code: 'šŸ˜­', + keywords: [ + 'cry', + 'face', + 'sad', + 'sob', + 'tear', + ], + }, + { + code: 'šŸ˜¦', + keywords: [ + 'face', + 'frown', + 'mouth', + 'open', + ], + }, + { + code: 'šŸ˜§', + keywords: [ + 'anguished', + 'face', + ], + }, + { + code: 'šŸ˜Ø', + keywords: [ + 'face', + 'fear', + 'fearful', + 'scared', + ], + }, + { + code: 'šŸ˜©', + keywords: [ + 'face', + 'tired', + 'weary', + ], + }, + { + code: 'šŸ˜¬', + keywords: [ + 'face', + 'grimace', + ], + }, + { + code: 'šŸ˜°', + keywords: [ + 'blue', + 'cold', + 'face', + 'mouth', + 'open', + 'rushed', + 'sweat', + ], + }, + { + code: 'šŸ˜±', + keywords: [ + 'face', + 'fear', + 'fearful', + 'munch', + 'scared', + 'scream', + ], + }, + { + code: 'šŸ˜³', + keywords: [ + 'dazed', + 'face', + 'flushed', + ], + }, + { + code: 'šŸ˜µ', + keywords: [ + 'dizzy', + 'face', + ], + }, + { + code: 'šŸ˜”', + keywords: [ + 'angry', + 'face', + 'mad', + 'pouting', + 'rage', + 'red', + ], + }, + { + code: 'šŸ˜ ', + keywords: [ + 'angry', + 'face', + 'mad', + ], + }, + { + code: 'šŸ˜‡', + keywords: [ + 'angel', + 'face', + 'fairy tale', + 'fantasy', + 'halo', + 'innocent', + 'smile', + ], + }, + { + code: 'šŸ¤ ', + keywords: [ + 'cowboy', + 'cowgirl', + 'face', + 'hat', + ], + }, + { + code: 'šŸ¤”', + keywords: [ + 'clown', + 'face', + ], + }, + { + code: 'šŸ¤„', + keywords: [ + 'face', + 'lie', + 'pinocchio', + ], + }, + { + code: 'šŸ˜·', + keywords: [ + 'cold', + 'doctor', + 'face', + 'mask', + 'medicine', + 'sick', + ], + }, + { + code: 'šŸ¤’', + keywords: [ + 'face', + 'ill', + 'sick', + 'thermometer', + ], + }, + { + code: 'šŸ¤•', + keywords: [ + 'bandage', + 'face', + 'hurt', + 'injury', + ], + }, + { + code: 'šŸ¤¢', + keywords: [ + 'face', + 'nauseated', + 'vomit', + ], + }, + { + code: 'šŸ¤§', + keywords: [ + 'face', + 'gesundheit', + 'sneeze', + ], + }, + { + code: 'šŸ˜ˆ', + keywords: [ + 'face', + 'fairy tale', + 'fantasy', + 'horns', + 'smile', + ], + }, + { + code: 'šŸ‘æ', + keywords: [ + 'demon', + 'devil', + 'face', + 'fairy tale', + 'fantasy', + 'imp', + ], + }, + { + code: 'šŸ‘¹', + keywords: [ + 'creature', + 'face', + 'fairy tale', + 'fantasy', + 'japanese', + 'monster', + 'ogre', + ], + }, + { + code: 'šŸ‘ŗ', + keywords: [ + 'creature', + 'face', + 'fairy tale', + 'fantasy', + 'goblin', + 'japanese', + 'monster', + ], + }, + { + code: 'šŸ’€', + keywords: [ + 'body', + 'death', + 'face', + 'fairy tale', + 'monster', + 'skull', + ], + }, + { + code: 'ā˜ ', + keywords: [ + 'body', + 'crossbones', + 'death', + 'face', + 'monster', + 'skull', + ], + }, + { + code: 'šŸ‘»', + keywords: [ + 'creature', + 'face', + 'fairy tale', + 'fantasy', + 'ghost', + 'monster', + ], + }, + { + code: 'šŸ‘½', + keywords: [ + 'alien', + 'creature', + 'extraterrestrial', + 'face', + 'fairy tale', + 'fantasy', + 'monster', + 'space', + 'ufo', + ], + }, + { + code: 'šŸ‘¾', + keywords: [ + 'alien', + 'creature', + 'extraterrestrial', + 'face', + 'fairy tale', + 'fantasy', + 'monster', + 'space', + 'ufo', + ], + }, + { + code: 'šŸ¤–', + keywords: [ + 'face', + 'monster', + 'robot', + ], + }, + { + code: 'šŸ’©', + keywords: [ + 'comic', + 'dung', + 'face', + 'monster', + 'poo', + 'poop', + ], + }, + { + code: 'šŸ˜ŗ', + keywords: [ + 'cat', + 'face', + 'mouth', + 'open', + 'smile', + ], + }, + { + code: 'šŸ˜ø', + keywords: [ + 'cat', + 'eye', + 'face', + 'grin', + 'smile', + ], + }, + { + code: 'šŸ˜¹', + keywords: [ + 'cat', + 'face', + 'joy', + 'tear', + ], + }, + { + code: 'šŸ˜»', + keywords: [ + 'cat', + 'eye', + 'face', + 'heart', + 'love', + 'smile', + ], + }, + { + code: 'šŸ˜¼', + keywords: [ + 'cat', + 'face', + 'ironic', + 'smile', + 'wry', + ], + }, + { + code: 'šŸ˜½', + keywords: [ + 'cat', + 'eye', + 'face', + 'kiss', + ], + }, + { + code: 'šŸ™€', + keywords: [ + 'cat', + 'face', + 'oh', + 'surprised', + 'weary', + ], + }, + { + code: 'šŸ˜æ', + keywords: [ + 'cat', + 'cry', + 'face', + 'sad', + 'tear', + ], + }, + { + code: 'šŸ˜¾', + keywords: [ + 'cat', + 'face', + 'pouting', + ], + }, + { + code: 'šŸ™ˆ', + keywords: [ + 'evil', + 'face', + 'forbidden', + 'gesture', + 'monkey', + 'no', + 'not', + 'prohibited', + 'see', + ], + }, + { + code: 'šŸ™‰', + keywords: [ + 'evil', + 'face', + 'forbidden', + 'gesture', + 'hear', + 'monkey', + 'no', + 'not', + 'prohibited', + ], + }, + { + code: 'šŸ™Š', + keywords: [ + 'evil', + 'face', + 'forbidden', + 'gesture', + 'monkey', + 'no', + 'not', + 'prohibited', + 'speak', + ], + }, + { + code: 'šŸ‘¦', + keywords: [ + 'boy', + ], + types: [ + 'šŸ‘¦šŸæ', + 'šŸ‘¦šŸ¾', + 'šŸ‘¦šŸ½', + 'šŸ‘¦šŸ¼', + 'šŸ‘¦šŸ»', + ], + }, + { + code: 'šŸ‘§', + keywords: [ + 'girl', + 'maiden', + 'virgin', + 'virgo', + 'zodiac', + ], + types: [ + 'šŸ‘§šŸæ', + 'šŸ‘§šŸ¾', + 'šŸ‘§šŸ½', + 'šŸ‘§šŸ¼', + 'šŸ‘§šŸ»', + ], + }, + { + code: 'šŸ‘Ø', + keywords: [ + 'man', + ], + types: [ + 'šŸ‘ØšŸæ', + 'šŸ‘ØšŸ¾', + 'šŸ‘ØšŸ½', + 'šŸ‘ØšŸ¼', + 'šŸ‘ØšŸ»', + ], + }, + { + code: 'šŸ‘©', + keywords: [ + 'woman', + ], + types: [ + 'šŸ‘©šŸæ', + 'šŸ‘©šŸ¾', + 'šŸ‘©šŸ½', + 'šŸ‘©šŸ¼', + 'šŸ‘©šŸ»', + ], + }, + { + code: 'šŸ‘“', + keywords: [ + 'man', + 'old', + ], + types: [ + 'šŸ‘“šŸæ', + 'šŸ‘“šŸ¾', + 'šŸ‘“šŸ½', + 'šŸ‘“šŸ¼', + 'šŸ‘“šŸ»', + ], + }, + { + code: 'šŸ‘µ', + keywords: [ + 'old', + 'woman', + ], + types: [ + 'šŸ‘µšŸæ', + 'šŸ‘µšŸ¾', + 'šŸ‘µšŸ½', + 'šŸ‘µšŸ¼', + 'šŸ‘µšŸ»', + ], + }, + { + code: 'šŸ‘¶', + keywords: [ + 'baby', + ], + types: [ + 'šŸ‘¶šŸæ', + 'šŸ‘¶šŸ¾', + 'šŸ‘¶šŸ½', + 'šŸ‘¶šŸ¼', + 'šŸ‘¶šŸ»', + ], + }, + { + code: 'šŸ‘¼', + keywords: [ + 'angel', + 'baby', + 'face', + 'fairy tale', + 'fantasy', + ], + types: [ + 'šŸ‘¼šŸæ', + 'šŸ‘¼šŸ¾', + 'šŸ‘¼šŸ½', + 'šŸ‘¼šŸ¼', + 'šŸ‘¼šŸ»', + ], + }, + { + code: 'šŸ‘±', + keywords: [ + 'blond', + ], + types: [ + 'šŸ‘±šŸæ', + 'šŸ‘±šŸ¾', + 'šŸ‘±šŸ½', + 'šŸ‘±šŸ¼', + 'šŸ‘±šŸ»', + ], + }, + { + code: 'šŸ‘®', + keywords: [ + 'cop', + 'officer', + 'police', + ], + types: [ + 'šŸ‘®šŸæ', + 'šŸ‘®šŸ¾', + 'šŸ‘®šŸ½', + 'šŸ‘®šŸ¼', + 'šŸ‘®šŸ»', + ], + }, + { + code: 'šŸ‘²', + keywords: [ + 'gua pi mao', + 'hat', + 'man', + ], + types: [ + 'šŸ‘²šŸæ', + 'šŸ‘²šŸ¾', + 'šŸ‘²šŸ½', + 'šŸ‘²šŸ¼', + 'šŸ‘²šŸ»', + ], + }, + { + code: 'šŸ‘³', + keywords: [ + 'man', + 'turban', + ], + types: [ + 'šŸ‘³šŸæ', + 'šŸ‘³šŸ¾', + 'šŸ‘³šŸ½', + 'šŸ‘³šŸ¼', + 'šŸ‘³šŸ»', + ], + }, + { + code: 'šŸ‘·', + keywords: [ + 'construction', + 'hat', + 'worker', + ], + types: [ + 'šŸ‘·šŸæ', + 'šŸ‘·šŸ¾', + 'šŸ‘·šŸ½', + 'šŸ‘·šŸ¼', + 'šŸ‘·šŸ»', + ], + }, + { + code: 'šŸ‘ø', + keywords: [ + 'fairy tale', + 'fantasy', + 'princess', + ], + types: [ + 'šŸ‘øšŸæ', + 'šŸ‘øšŸ¾', + 'šŸ‘øšŸ½', + 'šŸ‘øšŸ¼', + 'šŸ‘øšŸ»', + ], + }, + { + code: 'šŸ¤“', + keywords: [ + 'prince', + ], + types: [ + 'šŸ¤“šŸæ', + 'šŸ¤“šŸ¾', + 'šŸ¤“šŸ½', + 'šŸ¤“šŸ¼', + 'šŸ¤“šŸ»', + ], + }, + { + code: 'šŸ’‚', + keywords: [ + 'guard', + 'guardsman', + ], + types: [ + 'šŸ’‚šŸæ', + 'šŸ’‚šŸ¾', + 'šŸ’‚šŸ½', + 'šŸ’‚šŸ¼', + 'šŸ’‚šŸ»', + ], + }, + { + code: 'šŸ•µ', + keywords: [ + 'detective', + 'sleuth', + 'spy', + ], + types: [ + 'šŸ•µšŸæ', + 'šŸ•µšŸ¾', + 'šŸ•µšŸ½', + 'šŸ•µšŸ¼', + 'šŸ•µšŸ»', + ], + }, + { + code: 'šŸŽ…', + keywords: [ + 'activity', + 'celebration', + 'christmas', + 'fairy tale', + 'fantasy', + 'father', + 'santa', + ], + types: [ + 'šŸŽ…šŸæ', + 'šŸŽ…šŸ¾', + 'šŸŽ…šŸ½', + 'šŸŽ…šŸ¼', + 'šŸŽ…šŸ»', + ], + }, + { + code: 'šŸ¤¶', + keywords: [ + 'christmas', + 'mother', + 'mrs. claus', + ], + types: [ + 'šŸ¤¶šŸæ', + 'šŸ¤¶šŸ¾', + 'šŸ¤¶šŸ½', + 'šŸ¤¶šŸ¼', + 'šŸ¤¶šŸ»', + ], + }, + { + code: 'šŸ‘°', + keywords: [ + 'bride', + 'veil', + 'wedding', + ], + types: [ + 'šŸ‘°šŸæ', + 'šŸ‘°šŸ¾', + 'šŸ‘°šŸ½', + 'šŸ‘°šŸ¼', + 'šŸ‘°šŸ»', + ], + }, + { + code: 'šŸ¤µ', + keywords: [ + 'groom', + 'man', + 'tuxedo', + ], + types: [ + 'šŸ¤µšŸæ', + 'šŸ¤µšŸ¾', + 'šŸ¤µšŸ½', + 'šŸ¤µšŸ¼', + 'šŸ¤µšŸ»', + ], + }, + { + code: 'šŸ’†', + keywords: [ + 'massage', + 'salon', + ], + types: [ + 'šŸ’†šŸæ', + 'šŸ’†šŸ¾', + 'šŸ’†šŸ½', + 'šŸ’†šŸ¼', + 'šŸ’†šŸ»', + ], + }, + { + code: 'šŸ’‡', + keywords: [ + 'barber', + 'beauty', + 'haircut', + 'parlor', + ], + types: [ + 'šŸ’‡šŸæ', + 'šŸ’‡šŸ¾', + 'šŸ’‡šŸ½', + 'šŸ’‡šŸ¼', + 'šŸ’‡šŸ»', + ], + }, + { + code: 'šŸ™', + keywords: [ + 'frown', + 'gesture', + ], + types: [ + 'šŸ™šŸæ', + 'šŸ™šŸ¾', + 'šŸ™šŸ½', + 'šŸ™šŸ¼', + 'šŸ™šŸ»', + ], + }, + { + code: 'šŸ™Ž', + keywords: [ + 'gesture', + 'pouting', + ], + types: [ + 'šŸ™ŽšŸæ', + 'šŸ™ŽšŸ¾', + 'šŸ™ŽšŸ½', + 'šŸ™ŽšŸ¼', + 'šŸ™ŽšŸ»', + ], + }, + { + code: 'šŸ™…', + keywords: [ + 'forbidden', + 'gesture', + 'hand', + 'no', + 'not', + 'prohibited', + ], + types: [ + 'šŸ™…šŸæ', + 'šŸ™…šŸ¾', + 'šŸ™…šŸ½', + 'šŸ™…šŸ¼', + 'šŸ™…šŸ»', + ], + }, + { + code: 'šŸ™†', + keywords: [ + 'gesture', + 'hand', + 'ok', + ], + types: [ + 'šŸ™†šŸæ', + 'šŸ™†šŸ¾', + 'šŸ™†šŸ½', + 'šŸ™†šŸ¼', + 'šŸ™†šŸ»', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'hand', + 'help', + 'information', + 'sassy', + ], + types: [ + 'šŸ’šŸæ', + 'šŸ’šŸ¾', + 'šŸ’šŸ½', + 'šŸ’šŸ¼', + 'šŸ’šŸ»', + ], + }, + { + code: 'šŸ¤·', + keywords: [ + 'doubt', + 'ignorance', + 'indifference', + 'shrug', + ], + types: [ + 'šŸ¤·šŸæ', + 'šŸ¤·šŸ¾', + 'šŸ¤·šŸ½', + 'šŸ¤·šŸ¼', + 'šŸ¤·šŸ»', + ], + }, + { + code: 'šŸ™‹', + keywords: [ + 'gesture', + 'hand', + 'happy', + 'raised', + ], + types: [ + 'šŸ™‹šŸæ', + 'šŸ™‹šŸ¾', + 'šŸ™‹šŸ½', + 'šŸ™‹šŸ¼', + 'šŸ™‹šŸ»', + ], + }, + { + code: 'šŸ¤¦', + keywords: [ + 'disbelief', + 'exasperation', + 'face', + 'palm', + ], + types: [ + 'šŸ¤¦šŸæ', + 'šŸ¤¦šŸ¾', + 'šŸ¤¦šŸ½', + 'šŸ¤¦šŸ¼', + 'šŸ¤¦šŸ»', + ], + }, + { + code: 'šŸ™‡', + keywords: [ + 'apology', + 'bow', + 'gesture', + 'sorry', + ], + types: [ + 'šŸ™‡šŸæ', + 'šŸ™‡šŸ¾', + 'šŸ™‡šŸ½', + 'šŸ™‡šŸ¼', + 'šŸ™‡šŸ»', + ], + }, + { + code: 'šŸš¶', + keywords: [ + 'hike', + 'pedestrian', + 'walk', + 'walking', + ], + types: [ + 'šŸš¶šŸæ', + 'šŸš¶šŸ¾', + 'šŸš¶šŸ½', + 'šŸš¶šŸ¼', + 'šŸš¶šŸ»', + ], + }, + { + code: 'šŸƒ', + keywords: [ + 'marathon', + 'runner', + 'running', + ], + types: [ + 'šŸƒšŸæ', + 'šŸƒšŸ¾', + 'šŸƒšŸ½', + 'šŸƒšŸ¼', + 'šŸƒšŸ»', + ], + }, + { + code: 'šŸ’ƒ', + keywords: [ + 'dancer', + ], + types: [ + 'šŸ’ƒšŸæ', + 'šŸ’ƒšŸ¾', + 'šŸ’ƒšŸ½', + 'šŸ’ƒšŸ¼', + 'šŸ’ƒšŸ»', + ], + }, + { + code: 'šŸ•ŗ', + keywords: [ + 'dance', + 'man', + ], + types: [ + 'šŸ•ŗšŸæ', + 'šŸ•ŗšŸ¾', + 'šŸ•ŗšŸ½', + 'šŸ•ŗšŸ¼', + 'šŸ•ŗšŸ»', + ], + }, + { + code: 'šŸ¤°', + keywords: [ + 'pregnant', + 'woman', + ], + types: [ + 'šŸ¤°šŸæ', + 'šŸ¤°šŸ¾', + 'šŸ¤°šŸ½', + 'šŸ¤°šŸ¼', + 'šŸ¤°šŸ»', + ], + }, + { + code: 'šŸ‘Æ', + keywords: [ + 'bunny', + 'dancer', + 'ear', + 'girl', + 'woman', + ], + }, + { + code: 'šŸ•“', + keywords: [ + 'business', + 'man', + 'suit', + ], + }, + { + code: 'šŸ—£', + keywords: [ + 'face', + 'head', + 'silhouette', + 'speak', + 'speaking', + ], + }, + { + code: 'šŸ‘¤', + keywords: [ + 'bust', + 'silhouette', + ], + }, + { + code: 'šŸ‘„', + keywords: [ + 'bust', + 'silhouette', + ], + }, + { + code: 'šŸ‘«', + keywords: [ + 'couple', + 'hand', + 'hold', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘¬', + keywords: [ + 'couple', + 'gemini', + 'hand', + 'hold', + 'man', + 'twins', + 'zodiac', + ], + }, + { + code: 'šŸ‘­', + keywords: [ + 'couple', + 'hand', + 'hold', + 'woman', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'couple', + 'kiss', + 'romance', + ], + }, + { + code: 'šŸ‘©ā€ā¤ļøā€šŸ’‹ā€šŸ‘Ø', + keywords: [ + 'kiss', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘Øā€ā¤ļøā€šŸ’‹ā€šŸ‘Ø', + keywords: [ + 'kiss', + 'man', + ], + }, + { + code: 'šŸ‘©ā€ā¤ļøā€šŸ’‹ā€šŸ‘©', + keywords: [ + 'kiss', + 'woman', + ], + }, + { + code: 'šŸ’‘', + keywords: [ + 'couple', + 'heart', + 'love', + 'romance', + ], + }, + { + code: 'šŸ‘©ā€ā¤ļøā€šŸ‘Ø', + keywords: [ + 'couple', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘Øā€ā¤ļøā€šŸ‘Ø', + keywords: [ + 'couple', + 'man', + ], + }, + { + code: 'šŸ‘©ā€ā¤ļøā€šŸ‘©', + keywords: [ + 'couple', + 'woman', + ], + }, + { + code: 'šŸ‘Ŗ', + keywords: [ + 'child', + 'family', + 'father', + 'mother', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘§', + keywords: [ + 'family', + 'girl', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘§ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'girl', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘¦ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘©ā€šŸ‘§ā€šŸ‘§', + keywords: [ + 'family', + 'girl', + 'man', + 'woman', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'man', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘§', + keywords: [ + 'family', + 'girl', + 'man', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘§ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'girl', + 'man', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘¦ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'man', + ], + }, + { + code: 'šŸ‘Øā€šŸ‘Øā€šŸ‘§ā€šŸ‘§', + keywords: [ + 'family', + 'girl', + 'man', + ], + }, + { + code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'woman', + ], + }, + { + code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘§', + keywords: [ + 'family', + 'girl', + 'woman', + ], + }, + { + code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘§ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'girl', + 'woman', + ], + }, + { + code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘¦ā€šŸ‘¦', + keywords: [ + 'boy', + 'family', + 'woman', + ], + }, + { + code: 'šŸ‘©ā€šŸ‘©ā€šŸ‘§ā€šŸ‘§', + keywords: [ + 'family', + 'girl', + 'woman', + ], + }, + { + code: 'šŸ»', + keywords: [ + 'emoji modifier', + 'fitzpatrick', + 'skin', + 'tone', + ], + }, + { + code: 'šŸ¼', + keywords: [ + 'emoji modifier', + 'fitzpatrick', + 'skin', + 'tone', + ], + }, + { + code: 'šŸ½', + keywords: [ + 'emoji modifier', + 'fitzpatrick', + 'skin', + 'tone', + ], + }, + { + code: 'šŸ¾', + keywords: [ + 'emoji modifier', + 'fitzpatrick', + 'skin', + 'tone', + ], + }, + { + code: 'šŸæ', + keywords: [ + 'emoji modifier', + 'fitzpatrick', + 'skin', + 'tone', + ], + }, + { + code: 'šŸ’Ŗ', + keywords: [ + 'biceps', + 'body', + 'comic', + 'flex', + 'muscle', + ], + types: [ + 'šŸ’ŖšŸæ', + 'šŸ’ŖšŸ¾', + 'šŸ’ŖšŸ½', + 'šŸ’ŖšŸ¼', + 'šŸ’ŖšŸ»', + ], + }, + { + code: 'šŸ¤³', + keywords: [ + 'camera', + 'phone', + 'selfie', + ], + types: [ + 'šŸ¤³šŸæ', + 'šŸ¤³šŸ¾', + 'šŸ¤³šŸ½', + 'šŸ¤³šŸ¼', + 'šŸ¤³šŸ»', + ], + }, + { + code: 'šŸ‘ˆ', + keywords: [ + 'backhand', + 'body', + 'finger', + 'hand', + 'index', + 'point', + ], + types: [ + 'šŸ‘ˆšŸæ', + 'šŸ‘ˆšŸ¾', + 'šŸ‘ˆšŸ½', + 'šŸ‘ˆšŸ¼', + 'šŸ‘ˆšŸ»', + ], + }, + { + code: 'šŸ‘‰', + keywords: [ + 'backhand', + 'body', + 'finger', + 'hand', + 'index', + 'point', + ], + types: [ + 'šŸ‘‰šŸæ', + 'šŸ‘‰šŸ¾', + 'šŸ‘‰šŸ½', + 'šŸ‘‰šŸ¼', + 'šŸ‘‰šŸ»', + ], + }, + { + code: 'ā˜', + keywords: [ + 'body', + 'finger', + 'hand', + 'index', + 'point', + 'up', + ], + types: [ + 'ā˜šŸæ', + 'ā˜šŸ¾', + 'ā˜šŸ½', + 'ā˜šŸ¼', + 'ā˜šŸ»', + ], + }, + { + code: 'šŸ‘†', + keywords: [ + 'backhand', + 'body', + 'finger', + 'hand', + 'index', + 'point', + 'up', + ], + types: [ + 'šŸ‘†šŸæ', + 'šŸ‘†šŸ¾', + 'šŸ‘†šŸ½', + 'šŸ‘†šŸ¼', + 'šŸ‘†šŸ»', + ], + }, + { + code: 'šŸ–•', + keywords: [ + 'body', + 'finger', + 'hand', + 'middle finger', + ], + types: [ + 'šŸ–•šŸæ', + 'šŸ–•šŸ¾', + 'šŸ–•šŸ½', + 'šŸ–•šŸ¼', + 'šŸ–•šŸ»', + ], + }, + { + code: 'šŸ‘‡', + keywords: [ + 'backhand', + 'body', + 'down', + 'finger', + 'hand', + 'index', + 'point', + ], + types: [ + 'šŸ‘‡šŸæ', + 'šŸ‘‡šŸ¾', + 'šŸ‘‡šŸ½', + 'šŸ‘‡šŸ¼', + 'šŸ‘‡šŸ»', + ], + }, + { + code: 'āœŒ', + keywords: [ + 'body', + 'hand', + 'v', + 'victory', + ], + types: [ + 'āœŒšŸæ', + 'āœŒšŸ¾', + 'āœŒšŸ½', + 'āœŒšŸ¼', + 'āœŒšŸ»', + ], + }, + { + code: 'šŸ¤ž', + keywords: [ + 'cross', + 'finger', + 'hand', + 'luck', + ], + types: [ + 'šŸ¤žšŸæ', + 'šŸ¤žšŸ¾', + 'šŸ¤žšŸ½', + 'šŸ¤žšŸ¼', + 'šŸ¤žšŸ»', + ], + }, + { + code: 'šŸ––', + keywords: [ + 'body', + 'finger', + 'hand', + 'spock', + 'vulcan', + ], + types: [ + 'šŸ––šŸæ', + 'šŸ––šŸ¾', + 'šŸ––šŸ½', + 'šŸ––šŸ¼', + 'šŸ––šŸ»', + ], + }, + { + code: 'šŸ¤˜', + keywords: [ + 'body', + 'finger', + 'hand', + 'horns', + 'rock-on', + ], + types: [ + 'šŸ¤˜šŸæ', + 'šŸ¤˜šŸ¾', + 'šŸ¤˜šŸ½', + 'šŸ¤˜šŸ¼', + 'šŸ¤˜šŸ»', + ], + }, + { + code: 'šŸ¤™', + keywords: [ + 'call', + 'hand', + ], + types: [ + 'šŸ¤™šŸæ', + 'šŸ¤™šŸ¾', + 'šŸ¤™šŸ½', + 'šŸ¤™šŸ¼', + 'šŸ¤™šŸ»', + ], + }, + { + code: 'šŸ–', + keywords: [ + 'body', + 'finger', + 'hand', + 'splayed', + ], + types: [ + 'šŸ–šŸæ', + 'šŸ–šŸ¾', + 'šŸ–šŸ½', + 'šŸ–šŸ¼', + 'šŸ–šŸ»', + ], + }, + { + code: 'āœ‹', + keywords: [ + 'body', + 'hand', + ], + types: [ + 'āœ‹šŸæ', + 'āœ‹šŸ¾', + 'āœ‹šŸ½', + 'āœ‹šŸ¼', + 'āœ‹šŸ»', + ], + }, + { + code: 'šŸ‘Œ', + keywords: [ + 'body', + 'hand', + 'ok', + ], + types: [ + 'šŸ‘ŒšŸæ', + 'šŸ‘ŒšŸ¾', + 'šŸ‘ŒšŸ½', + 'šŸ‘ŒšŸ¼', + 'šŸ‘ŒšŸ»', + ], + }, + { + code: 'šŸ‘', + keywords: [ + '+1', + 'body', + 'hand', + 'thumb', + 'thumbs up', + 'up', + ], + types: [ + 'šŸ‘šŸæ', + 'šŸ‘šŸ¾', + 'šŸ‘šŸ½', + 'šŸ‘šŸ¼', + 'šŸ‘šŸ»', + ], + }, + { + code: 'šŸ‘Ž', + keywords: [ + '-1', + 'body', + 'down', + 'hand', + 'thumb', + 'thumbs down', + ], + types: [ + 'šŸ‘ŽšŸæ', + 'šŸ‘ŽšŸ¾', + 'šŸ‘ŽšŸ½', + 'šŸ‘ŽšŸ¼', + 'šŸ‘ŽšŸ»', + ], + }, + { + code: 'āœŠ', + keywords: [ + 'body', + 'clenched', + 'fist', + 'hand', + 'punch', + ], + types: [ + 'āœŠšŸæ', + 'āœŠšŸ¾', + 'āœŠšŸ½', + 'āœŠšŸ¼', + 'āœŠšŸ»', + ], + }, + { + code: 'šŸ‘Š', + keywords: [ + 'body', + 'clenched', + 'fist', + 'hand', + 'punch', + ], + types: [ + 'šŸ‘ŠšŸæ', + 'šŸ‘ŠšŸ¾', + 'šŸ‘ŠšŸ½', + 'šŸ‘ŠšŸ¼', + 'šŸ‘ŠšŸ»', + ], + }, + { + code: 'šŸ¤›', + keywords: [ + 'fist', + 'leftwards', + ], + types: [ + 'šŸ¤›šŸæ', + 'šŸ¤›šŸ¾', + 'šŸ¤›šŸ½', + 'šŸ¤›šŸ¼', + 'šŸ¤›šŸ»', + ], + }, + { + code: 'šŸ¤œ', + keywords: [ + 'fist', + 'rightwards', + ], + types: [ + 'šŸ¤œšŸæ', + 'šŸ¤œšŸ¾', + 'šŸ¤œšŸ½', + 'šŸ¤œšŸ¼', + 'šŸ¤œšŸ»', + ], + }, + { + code: 'šŸ¤š', + keywords: [ + 'backhand', + 'raised', + ], + types: [ + 'šŸ¤ššŸæ', + 'šŸ¤ššŸ¾', + 'šŸ¤ššŸ½', + 'šŸ¤ššŸ¼', + 'šŸ¤ššŸ»', + ], + }, + { + code: 'šŸ‘‹', + keywords: [ + 'body', + 'hand', + 'wave', + 'waving', + ], + types: [ + 'šŸ‘‹šŸæ', + 'šŸ‘‹šŸ¾', + 'šŸ‘‹šŸ½', + 'šŸ‘‹šŸ¼', + 'šŸ‘‹šŸ»', + ], + }, + { + code: 'šŸ‘', + keywords: [ + 'body', + 'clap', + 'hand', + ], + types: [ + 'šŸ‘šŸæ', + 'šŸ‘šŸ¾', + 'šŸ‘šŸ½', + 'šŸ‘šŸ¼', + 'šŸ‘šŸ»', + ], + }, + { + code: 'āœ', + keywords: [ + 'body', + 'hand', + 'write', + ], + types: [ + 'āœšŸæ', + 'āœšŸ¾', + 'āœšŸ½', + 'āœšŸ¼', + 'āœšŸ»', + ], + }, + { + code: 'šŸ‘', + keywords: [ + 'body', + 'hand', + 'open', + ], + types: [ + 'šŸ‘šŸæ', + 'šŸ‘šŸ¾', + 'šŸ‘šŸ½', + 'šŸ‘šŸ¼', + 'šŸ‘šŸ»', + ], + }, + { + code: 'šŸ™Œ', + keywords: [ + 'body', + 'celebration', + 'gesture', + 'hand', + 'hooray', + 'raised', + ], + types: [ + 'šŸ™ŒšŸæ', + 'šŸ™ŒšŸ¾', + 'šŸ™ŒšŸ½', + 'šŸ™ŒšŸ¼', + 'šŸ™ŒšŸ»', + ], + }, + { + code: 'šŸ™', + keywords: [ + 'ask', + 'body', + 'bow', + 'folded', + 'gesture', + 'hand', + 'please', + 'pray', + 'thanks', + ], + types: [ + 'šŸ™šŸæ', + 'šŸ™šŸ¾', + 'šŸ™šŸ½', + 'šŸ™šŸ¼', + 'šŸ™šŸ»', + ], + }, + { + code: 'šŸ¤', + keywords: [ + 'agreement', + 'hand', + 'handshake', + 'meeting', + 'shake', + ], + types: [ + 'šŸ¤šŸæ', + 'šŸ¤šŸ¾', + 'šŸ¤šŸ½', + 'šŸ¤šŸ¼', + 'šŸ¤šŸ»', + ], + }, + { + code: 'šŸ’…', + keywords: [ + 'body', + 'care', + 'cosmetics', + 'manicure', + 'nail', + 'polish', + ], + types: [ + 'šŸ’…šŸæ', + 'šŸ’…šŸ¾', + 'šŸ’…šŸ½', + 'šŸ’…šŸ¼', + 'šŸ’…šŸ»', + ], + }, + { + code: 'šŸ‘‚', + keywords: [ + 'body', + 'ear', + ], + types: [ + 'šŸ‘‚šŸæ', + 'šŸ‘‚šŸ¾', + 'šŸ‘‚šŸ½', + 'šŸ‘‚šŸ¼', + 'šŸ‘‚šŸ»', + ], + }, + { + code: 'šŸ‘ƒ', + keywords: [ + 'body', + 'nose', + ], + types: [ + 'šŸ‘ƒšŸæ', + 'šŸ‘ƒšŸ¾', + 'šŸ‘ƒšŸ½', + 'šŸ‘ƒšŸ¼', + 'šŸ‘ƒšŸ»', + ], + }, + { + code: 'šŸ‘£', + keywords: [ + 'body', + 'clothing', + 'footprint', + 'print', + ], + }, + { + code: 'šŸ‘€', + keywords: [ + 'body', + 'eye', + 'face', + ], + }, + { + code: 'šŸ‘', + keywords: [ + 'body', + 'eye', + ], + }, + { + code: 'šŸ‘ā€šŸ—Ø', + keywords: [ + 'bubble', + 'eye', + 'speech', + 'witness', + ], + }, + { + code: 'šŸ‘…', + keywords: [ + 'body', + 'tongue', + ], + }, + { + code: 'šŸ‘„', + keywords: [ + 'body', + 'lips', + 'mouth', + ], + }, + { + code: 'šŸ’‹', + keywords: [ + 'heart', + 'kiss', + 'lips', + 'mark', + 'romance', + ], + }, + { + code: 'šŸ’˜', + keywords: [ + 'arrow', + 'cupid', + 'heart', + 'romance', + ], + }, + { + code: 'ā¤', + keywords: [ + 'heart', + ], + }, + { + code: 'šŸ’“', + keywords: [ + 'beating', + 'heart', + 'heartbeat', + 'pulsating', + ], + }, + { + code: 'šŸ’”', + keywords: [ + 'break', + 'broken', + 'heart', + ], + }, + { + code: 'šŸ’•', + keywords: [ + 'heart', + 'love', + ], + }, + { + code: 'šŸ’–', + keywords: [ + 'excited', + 'heart', + 'sparkle', + ], + }, + { + code: 'šŸ’—', + keywords: [ + 'excited', + 'growing', + 'heart', + 'heartpulse', + 'nervous', + ], + }, + { + code: 'šŸ’™', + keywords: [ + 'blue', + 'heart', + ], + }, + { + code: 'šŸ’š', + keywords: [ + 'green', + 'heart', + ], + }, + { + code: 'šŸ’›', + keywords: [ + 'heart', + 'yellow', + ], + }, + { + code: 'šŸ’œ', + keywords: [ + 'heart', + 'purple', + ], + }, + { + code: 'šŸ–¤', + keywords: [ + 'black', + 'evil', + 'heart', + 'wicked', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'heart', + 'ribbon', + 'valentine', + ], + }, + { + code: 'šŸ’ž', + keywords: [ + 'heart', + 'revolving', + ], + }, + { + code: 'šŸ’Ÿ', + keywords: [ + 'heart', + ], + }, + { + code: 'ā£', + keywords: [ + 'exclamation', + 'heart', + 'mark', + 'punctuation', + ], + }, + { + code: 'šŸ’Œ', + keywords: [ + 'heart', + 'letter', + 'love', + 'mail', + 'romance', + ], + }, + { + code: 'šŸ’¤', + keywords: [ + 'comic', + 'sleep', + 'zzz', + ], + }, + { + code: 'šŸ’¢', + keywords: [ + 'angry', + 'comic', + 'mad', + ], + }, + { + code: 'šŸ’£', + keywords: [ + 'bomb', + 'comic', + ], + }, + { + code: 'šŸ’„', + keywords: [ + 'boom', + 'collision', + 'comic', + ], + }, + { + code: 'šŸ’¦', + keywords: [ + 'comic', + 'splashing', + 'sweat', + ], + }, + { + code: 'šŸ’Ø', + keywords: [ + 'comic', + 'dash', + 'running', + ], + }, + { + code: 'šŸ’«', + keywords: [ + 'comic', + 'dizzy', + 'star', + ], + }, + { + code: 'šŸ’¬', + keywords: [ + 'balloon', + 'bubble', + 'comic', + 'dialog', + 'speech', + ], + }, + { + code: 'šŸ—Ø', + keywords: [ + 'dialog', + 'speech', + ], + }, + { + code: 'šŸ—Æ', + keywords: [ + 'angry', + 'balloon', + 'bubble', + 'mad', + ], + }, + { + code: 'šŸ’­', + keywords: [ + 'balloon', + 'bubble', + 'comic', + 'thought', + ], + }, + { + code: 'šŸ•³', + keywords: [ + 'hole', + ], + }, + { + code: 'šŸ‘“', + keywords: [ + 'clothing', + 'eye', + 'eyeglasses', + 'eyewear', + 'glasses', + ], + }, + { + code: 'šŸ•¶', + keywords: [ + 'dark', + 'eye', + 'eyewear', + 'glasses', + 'sunglasses', + ], + }, + { + code: 'šŸ‘”', + keywords: [ + 'clothing', + 'necktie', + ], + }, + { + code: 'šŸ‘•', + keywords: [ + 'clothing', + 'shirt', + 'tshirt', + ], + }, + { + code: 'šŸ‘–', + keywords: [ + 'clothing', + 'jeans', + 'pants', + 'trousers', + ], + }, + { + code: 'šŸ‘—', + keywords: [ + 'clothing', + 'dress', + ], + }, + { + code: 'šŸ‘˜', + keywords: [ + 'clothing', + 'kimono', + ], + }, + { + code: 'šŸ‘™', + keywords: [ + 'bikini', + 'clothing', + 'swim', + ], + }, + { + code: 'šŸ‘š', + keywords: [ + 'clothing', + 'woman', + ], + }, + { + code: 'šŸ‘›', + keywords: [ + 'clothing', + 'coin', + 'purse', + ], + }, + { + code: 'šŸ‘œ', + keywords: [ + 'bag', + 'clothing', + 'handbag', + ], + }, + { + code: 'šŸ‘', + keywords: [ + 'bag', + 'clothing', + 'pouch', + ], + }, + { + code: 'šŸ›', + keywords: [ + 'bag', + 'hotel', + 'shopping', + ], + }, + { + code: 'šŸŽ’', + keywords: [ + 'activity', + 'bag', + 'satchel', + 'school', + ], + }, + { + code: 'šŸ‘ž', + keywords: [ + 'clothing', + 'man', + 'shoe', + ], + }, + { + code: 'šŸ‘Ÿ', + keywords: [ + 'athletic', + 'clothing', + 'shoe', + 'sneaker', + ], + }, + { + code: 'šŸ‘ ', + keywords: [ + 'clothing', + 'heel', + 'shoe', + 'woman', + ], + }, + { + code: 'šŸ‘”', + keywords: [ + 'clothing', + 'sandal', + 'shoe', + 'woman', + ], + }, + { + code: 'šŸ‘¢', + keywords: [ + 'boot', + 'clothing', + 'shoe', + 'woman', + ], + }, + { + code: 'šŸ‘‘', + keywords: [ + 'clothing', + 'crown', + 'king', + 'queen', + ], + }, + { + code: 'šŸ‘’', + keywords: [ + 'clothing', + 'hat', + 'woman', + ], + }, + { + code: 'šŸŽ©', + keywords: [ + 'activity', + 'clothing', + 'entertainment', + 'hat', + 'top', + 'tophat', + ], + }, + { + code: 'šŸŽ“', + keywords: [ + 'activity', + 'cap', + 'celebration', + 'clothing', + 'graduation', + 'hat', + ], + }, + { + code: 'ā›‘', + keywords: [ + 'aid', + 'cross', + 'face', + 'hat', + 'helmet', + ], + }, + { + code: 'šŸ“æ', + keywords: [ + 'beads', + 'clothing', + 'necklace', + 'prayer', + 'religion', + ], + }, + { + code: 'šŸ’„', + keywords: [ + 'cosmetics', + 'lipstick', + 'makeup', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'diamond', + 'ring', + 'romance', + ], + }, + { + code: 'šŸ’Ž', + keywords: [ + 'diamond', + 'gem', + 'jewel', + 'romance', + ], + }, + { + code: 'Animals & Nature', + header: true, + }, + { + code: 'šŸµ', + keywords: [ + 'face', + 'monkey', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'monkey', + ], + }, + { + code: 'šŸ¦', + keywords: [ + 'gorilla', + ], + }, + { + code: 'šŸ¶', + keywords: [ + 'dog', + 'face', + 'pet', + ], + }, + { + code: 'šŸ•', + keywords: [ + 'dog', + 'pet', + ], + }, + { + code: 'šŸ©', + keywords: [ + 'dog', + 'poodle', + ], + }, + { + code: 'šŸŗ', + keywords: [ + 'face', + 'wolf', + ], + }, + { + code: 'šŸ¦Š', + keywords: [ + 'face', + 'fox', + ], + }, + { + code: 'šŸ±', + keywords: [ + 'cat', + 'face', + 'pet', + ], + }, + { + code: 'šŸˆ', + keywords: [ + 'cat', + 'pet', + ], + }, + { + code: 'šŸ¦', + keywords: [ + 'face', + 'leo', + 'lion', + 'zodiac', + ], + }, + { + code: 'šŸÆ', + keywords: [ + 'face', + 'tiger', + ], + }, + { + code: 'šŸ…', + keywords: [ + 'tiger', + ], + }, + { + code: 'šŸ†', + keywords: [ + 'leopard', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'face', + 'horse', + ], + }, + { + code: 'šŸŽ', + keywords: [ + 'horse', + 'racehorse', + 'racing', + ], + }, + { + code: 'šŸ¦Œ', + keywords: [ + 'deer', + ], + }, + { + code: 'šŸ¦„', + keywords: [ + 'face', + 'unicorn', + ], + }, + { + code: 'šŸ®', + keywords: [ + 'cow', + 'face', + ], + }, + { + code: 'šŸ‚', + keywords: [ + 'bull', + 'ox', + 'taurus', + 'zodiac', + ], + }, + { + code: 'šŸƒ', + keywords: [ + 'buffalo', + 'water', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'cow', + ], + }, + { + code: 'šŸ·', + keywords: [ + 'face', + 'pig', + ], + }, + { + code: 'šŸ–', + keywords: [ + 'pig', + 'sow', + ], + }, + { + code: 'šŸ—', + keywords: [ + 'boar', + 'pig', + ], + }, + { + code: 'šŸ½', + keywords: [ + 'face', + 'nose', + 'pig', + ], + }, + { + code: 'šŸ', + keywords: [ + 'aries', + 'ram', + 'sheep', + 'zodiac', + ], + }, + { + code: 'šŸ‘', + keywords: [ + 'ewe', + 'sheep', + ], + }, + { + code: 'šŸ', + keywords: [ + 'capricorn', + 'goat', + 'zodiac', + ], + }, + { + code: 'šŸŖ', + keywords: [ + 'camel', + 'dromedary', + 'hump', + ], + }, + { + code: 'šŸ«', + keywords: [ + 'bactrian', + 'camel', + 'hump', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'elephant', + ], + }, + { + code: 'šŸ¦', + keywords: [ + 'rhinoceros', + ], + }, + { + code: 'šŸ­', + keywords: [ + 'face', + 'mouse', + ], + }, + { + code: 'šŸ', + keywords: [ + 'mouse', + ], + }, + { + code: 'šŸ€', + keywords: [ + 'rat', + ], + }, + { + code: 'šŸ¹', + keywords: [ + 'face', + 'hamster', + 'pet', + ], + }, + { + code: 'šŸ°', + keywords: [ + 'bunny', + 'face', + 'pet', + 'rabbit', + ], + }, + { + code: 'šŸ‡', + keywords: [ + 'bunny', + 'pet', + 'rabbit', + ], + }, + { + code: 'šŸæ', + keywords: [ + 'chipmunk', + ], + }, + { + code: 'šŸ¦‡', + keywords: [ + 'bat', + 'vampire', + ], + }, + { + code: 'šŸ»', + keywords: [ + 'bear', + 'face', + ], + }, + { + code: 'šŸØ', + keywords: [ + 'bear', + 'koala', + ], + }, + { + code: 'šŸ¼', + keywords: [ + 'face', + 'panda', + ], + }, + { + code: 'šŸ¾', + keywords: [ + 'feet', + 'paw', + 'print', + ], + }, + { + code: 'šŸ¦ƒ', + keywords: [ + 'turkey', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'chicken', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'rooster', + ], + }, + { + code: 'šŸ£', + keywords: [ + 'baby', + 'chick', + 'hatching', + ], + }, + { + code: 'šŸ¤', + keywords: [ + 'baby', + 'chick', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'baby', + 'chick', + ], + }, + { + code: 'šŸ¦', + keywords: [ + 'bird', + ], + }, + { + code: 'šŸ§', + keywords: [ + 'penguin', + ], + }, + { + code: 'šŸ•Š', + keywords: [ + 'bird', + 'dove', + 'fly', + 'peace', + ], + }, + { + code: 'šŸ¦…', + keywords: [ + 'bird', + 'eagle', + ], + }, + { + code: 'šŸ¦†', + keywords: [ + 'bird', + 'duck', + ], + }, + { + code: 'šŸ¦‰', + keywords: [ + 'bird', + 'owl', + 'wise', + ], + }, + { + code: 'šŸø', + keywords: [ + 'face', + 'frog', + ], + }, + { + code: 'šŸŠ', + keywords: [ + 'crocodile', + ], + }, + { + code: 'šŸ¢', + keywords: [ + 'turtle', + ], + }, + { + code: 'šŸ¦Ž', + keywords: [ + 'lizard', + 'reptile', + ], + }, + { + code: 'šŸ', + keywords: [ + 'bearer', + 'ophiuchus', + 'serpent', + 'snake', + 'zodiac', + ], + }, + { + code: 'šŸ²', + keywords: [ + 'dragon', + 'face', + 'fairy tale', + ], + }, + { + code: 'šŸ‰', + keywords: [ + 'dragon', + 'fairy tale', + ], + }, + { + code: 'šŸ³', + keywords: [ + 'face', + 'spouting', + 'whale', + ], + }, + { + code: 'šŸ‹', + keywords: [ + 'whale', + ], + }, + { + code: 'šŸ¬', + keywords: [ + 'dolphin', + 'flipper', + ], + }, + { + code: 'šŸŸ', + keywords: [ + 'fish', + 'pisces', + 'zodiac', + ], + }, + { + code: 'šŸ ', + keywords: [ + 'fish', + 'tropical', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'blowfish', + 'fish', + ], + }, + { + code: 'šŸ¦ˆ', + keywords: [ + 'fish', + 'shark', + ], + }, + { + code: 'šŸ™', + keywords: [ + 'octopus', + ], + }, + { + code: 'šŸš', + keywords: [ + 'shell', + 'spiral', + ], + }, + { + code: 'šŸ¦€', + keywords: [ + 'cancer', + 'crab', + 'zodiac', + ], + }, + { + code: 'šŸ¦', + keywords: [ + 'shellfish', + 'shrimp', + 'small', + ], + }, + { + code: 'šŸ¦‘', + keywords: [ + 'molusc', + 'squid', + ], + }, + { + code: 'šŸ¦‹', + keywords: [ + 'butterfly', + 'insect', + 'pretty', + ], + }, + { + code: 'šŸŒ', + keywords: [ + 'snail', + ], + }, + { + code: 'šŸ›', + keywords: [ + 'bug', + 'insect', + ], + }, + { + code: 'šŸœ', + keywords: [ + 'ant', + 'insect', + ], + }, + { + code: 'šŸ', + keywords: [ + 'bee', + 'honeybee', + 'insect', + ], + }, + { + code: 'šŸž', + keywords: [ + 'beetle', + 'insect', + 'lady beetle', + 'ladybird', + 'ladybug', + ], + }, + { + code: 'šŸ•·', + keywords: [ + 'insect', + 'spider', + ], + }, + { + code: 'šŸ•ø', + keywords: [ + 'spider', + 'web', + ], + }, + { + code: 'šŸ¦‚', + keywords: [ + 'scorpio', + 'scorpion', + 'scorpius', + 'zodiac', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'bouquet', + 'flower', + 'plant', + 'romance', + ], + }, + { + code: 'šŸŒø', + keywords: [ + 'blossom', + 'cherry', + 'flower', + 'plant', + ], + }, + { + code: 'šŸ’®', + keywords: [ + 'flower', + ], + }, + { + code: 'šŸµ', + keywords: [ + 'plant', + 'rosette', + ], + }, + { + code: 'šŸŒ¹', + keywords: [ + 'flower', + 'plant', + 'rose', + ], + }, + { + code: 'šŸ„€', + keywords: [ + 'flower', + 'wilted', + ], + }, + { + code: 'šŸŒŗ', + keywords: [ + 'flower', + 'hibiscus', + 'plant', + ], + }, + { + code: 'šŸŒ»', + keywords: [ + 'flower', + 'plant', + 'sun', + 'sunflower', + ], + }, + { + code: 'šŸŒ¼', + keywords: [ + 'blossom', + 'flower', + 'plant', + ], + }, + { + code: 'šŸŒ·', + keywords: [ + 'flower', + 'plant', + 'tulip', + ], + }, + { + code: 'šŸŒ±', + keywords: [ + 'plant', + 'seedling', + 'young', + ], + }, + { + code: 'šŸŒ²', + keywords: [ + 'evergreen', + 'plant', + 'tree', + ], + }, + { + code: 'šŸŒ³', + keywords: [ + 'deciduous', + 'plant', + 'shedding', + 'tree', + ], + }, + { + code: 'šŸŒ“', + keywords: [ + 'palm', + 'plant', + 'tree', + ], + }, + { + code: 'šŸŒµ', + keywords: [ + 'cactus', + 'plant', + ], + }, + { + code: 'šŸŒ¾', + keywords: [ + 'ear', + 'plant', + 'rice', + ], + }, + { + code: 'šŸŒæ', + keywords: [ + 'herb', + 'leaf', + 'plant', + ], + }, + { + code: 'ā˜˜', + keywords: [ + 'plant', + 'shamrock', + ], + }, + { + code: 'šŸ€', + keywords: [ + '4', + 'clover', + 'four', + 'leaf', + 'plant', + ], + }, + { + code: 'šŸ', + keywords: [ + 'falling', + 'leaf', + 'maple', + 'plant', + ], + }, + { + code: 'šŸ‚', + keywords: [ + 'falling', + 'leaf', + 'plant', + ], + }, + { + code: 'šŸƒ', + keywords: [ + 'blow', + 'flutter', + 'leaf', + 'plant', + 'wind', + ], + }, + { + code: 'šŸ‡', + keywords: [ + 'fruit', + 'grape', + 'plant', + ], + }, + { + code: 'šŸˆ', + keywords: [ + 'fruit', + 'melon', + 'plant', + ], + }, + { + code: 'šŸ‰', + keywords: [ + 'fruit', + 'plant', + 'watermelon', + ], + }, + { + code: 'šŸŠ', + keywords: [ + 'fruit', + 'orange', + 'plant', + 'tangerine', + ], + }, + { + code: 'šŸ‹', + keywords: [ + 'citrus', + 'fruit', + 'lemon', + 'plant', + ], + }, + { + code: 'šŸŒ', + keywords: [ + 'banana', + 'fruit', + 'plant', + ], + }, + { + code: 'šŸ', + keywords: [ + 'fruit', + 'pineapple', + 'plant', + ], + }, + { + code: 'šŸŽ', + keywords: [ + 'apple', + 'fruit', + 'plant', + 'red', + ], + }, + { + code: 'šŸ', + keywords: [ + 'apple', + 'fruit', + 'green', + 'plant', + ], + }, + { + code: 'šŸ', + keywords: [ + 'fruit', + 'pear', + 'plant', + ], + }, + { + code: 'šŸ‘', + keywords: [ + 'fruit', + 'peach', + 'plant', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'cherry', + 'fruit', + 'plant', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'berry', + 'fruit', + 'plant', + 'strawberry', + ], + }, + { + code: 'šŸ…', + keywords: [ + 'plant', + 'tomato', + 'vegetable', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'fruit', + 'kiwi', + ], + }, + { + code: 'šŸ„‘', + keywords: [ + 'avocado', + 'fruit', + ], + }, + { + code: 'šŸ†', + keywords: [ + 'aubergine', + 'eggplant', + 'plant', + 'vegetable', + ], + }, + { + code: 'šŸ„”', + keywords: [ + 'potato', + 'vegetable', + ], + }, + { + code: 'šŸ„•', + keywords: [ + 'carrot', + 'vegetable', + ], + }, + { + code: 'šŸŒ½', + keywords: [ + 'corn', + 'ear', + 'maize', + 'maze', + 'plant', + ], + }, + { + code: 'šŸŒ¶', + keywords: [ + 'hot', + 'pepper', + 'plant', + ], + }, + { + code: 'šŸ„’', + keywords: [ + 'cucumber', + 'pickle', + 'vegetable', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'mushroom', + 'plant', + ], + }, + { + code: 'šŸ„œ', + keywords: [ + 'nut', + 'peanut', + 'vegetable', + ], + }, + { + code: 'šŸŒ°', + keywords: [ + 'chestnut', + 'plant', + ], + }, + { + code: 'šŸž', + keywords: [ + 'bread', + 'loaf', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'bread', + 'crescent roll', + 'croissant', + 'french', + ], + }, + { + code: 'šŸ„–', + keywords: [ + 'baguette', + 'bread', + 'french', + ], + }, + { + code: 'šŸ„ž', + keywords: [ + 'crĆŖpe', + 'hotcake', + 'pancake', + ], + }, + { + code: 'šŸ§€', + keywords: [ + 'cheese', + ], + }, + { + code: 'šŸ–', + keywords: [ + 'bone', + 'meat', + ], + }, + { + code: 'šŸ—', + keywords: [ + 'bone', + 'chicken', + 'leg', + 'poultry', + ], + }, + { + code: 'šŸ„“', + keywords: [ + 'bacon', + 'meat', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'burger', + 'hamburger', + ], + }, + { + code: 'šŸŸ', + keywords: [ + 'french', + 'fries', + ], + }, + { + code: 'šŸ•', + keywords: [ + 'cheese', + 'pizza', + 'slice', + ], + }, + { + code: 'šŸŒ­', + keywords: [ + 'frankfurter', + 'hot dog', + 'hotdog', + 'sausage', + ], + }, + { + code: 'šŸŒ®', + keywords: [ + 'mexican', + 'taco', + ], + }, + { + code: 'šŸŒÆ', + keywords: [ + 'burrito', + 'mexican', + ], + }, + { + code: 'šŸ„™', + keywords: [ + 'falafel', + 'flatbread', + 'gyro', + 'kebab', + 'stuffed', + ], + }, + { + code: 'šŸ„š', + keywords: [ + 'egg', + ], + }, + { + code: 'šŸ³', + keywords: [ + 'cooking', + 'egg', + 'frying', + 'pan', + ], + }, + { + code: 'šŸ„˜', + keywords: [ + 'casserole', + 'paella', + 'pan', + 'shallow', + ], + }, + { + code: 'šŸ²', + keywords: [ + 'pot', + 'stew', + ], + }, + { + code: 'šŸ„—', + keywords: [ + 'green', + 'salad', + ], + }, + { + code: 'šŸæ', + keywords: [ + 'popcorn', + ], + }, + { + code: 'šŸ±', + keywords: [ + 'bento', + 'box', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'cracker', + 'rice', + ], + }, + { + code: 'šŸ™', + keywords: [ + 'ball', + 'japanese', + 'rice', + ], + }, + { + code: 'šŸš', + keywords: [ + 'cooked', + 'rice', + ], + }, + { + code: 'šŸ›', + keywords: [ + 'curry', + 'rice', + ], + }, + { + code: 'šŸœ', + keywords: [ + 'bowl', + 'noodle', + 'ramen', + 'steaming', + ], + }, + { + code: 'šŸ', + keywords: [ + 'pasta', + 'spaghetti', + ], + }, + { + code: 'šŸ ', + keywords: [ + 'potato', + 'roasted', + 'sweet', + ], + }, + { + code: 'šŸ¢', + keywords: [ + 'kebab', + 'oden', + 'seafood', + 'skewer', + 'stick', + ], + }, + { + code: 'šŸ£', + keywords: [ + 'sushi', + ], + }, + { + code: 'šŸ¤', + keywords: [ + 'fried', + 'prawn', + 'shrimp', + 'tempura', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'cake', + 'fish', + 'pastry', + 'swirl', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'dango', + 'dessert', + 'japanese', + 'skewer', + 'stick', + 'sweet', + ], + }, + { + code: 'šŸ¦', + keywords: [ + 'cream', + 'dessert', + 'ice', + 'icecream', + 'soft', + 'sweet', + ], + }, + { + code: 'šŸ§', + keywords: [ + 'dessert', + 'ice', + 'shaved', + 'sweet', + ], + }, + { + code: 'šŸØ', + keywords: [ + 'cream', + 'dessert', + 'ice', + 'sweet', + ], + }, + { + code: 'šŸ©', + keywords: [ + 'dessert', + 'donut', + 'doughnut', + 'sweet', + ], + }, + { + code: 'šŸŖ', + keywords: [ + 'cookie', + 'dessert', + 'sweet', + ], + }, + { + code: 'šŸŽ‚', + keywords: [ + 'birthday', + 'cake', + 'celebration', + 'dessert', + 'pastry', + 'sweet', + ], + }, + { + code: 'šŸ°', + keywords: [ + 'cake', + 'dessert', + 'pastry', + 'shortcake', + 'slice', + 'sweet', + ], + }, + { + code: 'šŸ«', + keywords: [ + 'bar', + 'chocolate', + 'dessert', + 'sweet', + ], + }, + { + code: 'šŸ¬', + keywords: [ + 'candy', + 'dessert', + 'sweet', + ], + }, + { + code: 'šŸ­', + keywords: [ + 'candy', + 'dessert', + 'lollipop', + 'sweet', + ], + }, + { + code: 'šŸ®', + keywords: [ + 'custard', + 'dessert', + 'pudding', + 'sweet', + ], + }, + { + code: 'šŸÆ', + keywords: [ + 'honey', + 'honeypot', + 'pot', + 'sweet', + ], + }, + { + code: 'šŸ¼', + keywords: [ + 'baby', + 'bottle', + 'drink', + 'milk', + ], + }, + { + code: 'šŸ„›', + keywords: [ + 'drink', + 'glass', + 'milk', + ], + }, + { + code: 'ā˜•', + keywords: [ + 'beverage', + 'coffee', + 'drink', + 'hot', + 'steaming', + 'tea', + ], + }, + { + code: 'šŸµ', + keywords: [ + 'beverage', + 'cup', + 'drink', + 'tea', + 'teacup', + ], + }, + { + code: 'šŸ¶', + keywords: [ + 'bar', + 'beverage', + 'bottle', + 'cup', + 'drink', + 'sake', + ], + }, + { + code: 'šŸ¾', + keywords: [ + 'bar', + 'bottle', + 'cork', + 'drink', + 'popping', + ], + }, + { + code: 'šŸ·', + keywords: [ + 'bar', + 'beverage', + 'drink', + 'glass', + 'wine', + ], + }, + { + code: 'šŸø', + keywords: [ + 'bar', + 'cocktail', + 'drink', + 'glass', + ], + }, + { + code: 'šŸ¹', + keywords: [ + 'bar', + 'drink', + 'tropical', + ], + }, + { + code: 'šŸŗ', + keywords: [ + 'bar', + 'beer', + 'drink', + 'mug', + ], + }, + { + code: 'šŸ»', + keywords: [ + 'bar', + 'beer', + 'clink', + 'drink', + 'mug', + ], + }, + { + code: 'šŸ„‚', + keywords: [ + 'celebrate', + 'clink', + 'drink', + 'glass', + ], + }, + { + code: 'šŸ„ƒ', + keywords: [ + 'glass', + 'liquor', + 'shot', + 'tumbler', + 'whisky', + ], + }, + { + code: 'šŸ½', + keywords: [ + 'cooking', + 'fork', + 'knife', + 'plate', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'cooking', + 'fork', + 'knife', + ], + }, + { + code: 'šŸ„„', + keywords: [ + 'spoon', + 'tableware', + ], + }, + { + code: 'šŸ”Ŗ', + keywords: [ + 'cooking', + 'hocho', + 'knife', + 'tool', + 'weapon', + ], + }, + { + code: 'šŸŗ', + keywords: [ + 'amphora', + 'aquarius', + 'cooking', + 'drink', + 'jug', + 'tool', + 'weapon', + 'zodiac', + ], + }, + { + code: 'Travel & Places', + header: true, + }, + { + code: 'šŸŒ', + keywords: [ + 'africa', + 'earth', + 'europe', + 'globe', + 'world', + ], + }, + { + code: 'šŸŒŽ', + keywords: [ + 'americas', + 'earth', + 'globe', + 'world', + ], + }, + { + code: 'šŸŒ', + keywords: [ + 'asia', + 'australia', + 'earth', + 'globe', + 'world', + ], + }, + { + code: 'šŸŒ', + keywords: [ + 'earth', + 'globe', + 'meridians', + 'world', + ], + }, + { + code: 'šŸ—ŗ', + keywords: [ + 'map', + 'world', + ], + }, + { + code: 'šŸ—¾', + keywords: [ + 'japan', + 'map', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'cold', + 'mountain', + 'snow', + ], + }, + { + code: 'ā›°', + keywords: [ + 'mountain', + ], + }, + { + code: 'šŸŒ‹', + keywords: [ + 'eruption', + 'mountain', + 'volcano', + 'weather', + ], + }, + { + code: 'šŸ—»', + keywords: [ + 'fuji', + 'mountain', + ], + }, + { + code: 'šŸ•', + keywords: [ + 'camping', + ], + }, + { + code: 'šŸ–', + keywords: [ + 'beach', + 'umbrella', + ], + }, + { + code: 'šŸœ', + keywords: [ + 'desert', + ], + }, + { + code: 'šŸ', + keywords: [ + 'desert', + 'island', + ], + }, + { + code: 'šŸž', + keywords: [ + 'national park', + 'park', + ], + }, + { + code: 'šŸŸ', + keywords: [ + 'stadium', + ], + }, + { + code: 'šŸ›', + keywords: [ + 'building', + 'classical', + ], + }, + { + code: 'šŸ—', + keywords: [ + 'building', + 'construction', + ], + }, + { + code: 'šŸ˜', + keywords: [ + 'building', + 'house', + ], + }, + { + code: 'šŸ™', + keywords: [ + 'building', + 'city', + ], + }, + { + code: 'šŸš', + keywords: [ + 'building', + 'derelict', + 'house', + ], + }, + { + code: 'šŸ ', + keywords: [ + 'building', + 'home', + 'house', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'building', + 'garden', + 'home', + 'house', + ], + }, + { + code: 'šŸ¢', + keywords: [ + 'building', + ], + }, + { + code: 'šŸ£', + keywords: [ + 'building', + 'japanese', + 'post', + ], + }, + { + code: 'šŸ¤', + keywords: [ + 'building', + 'european', + 'post', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'building', + 'doctor', + 'hospital', + 'medicine', + ], + }, + { + code: 'šŸ¦', + keywords: [ + 'bank', + 'building', + ], + }, + { + code: 'šŸØ', + keywords: [ + 'building', + 'hotel', + ], + }, + { + code: 'šŸ©', + keywords: [ + 'building', + 'hotel', + 'love', + ], + }, + { + code: 'šŸŖ', + keywords: [ + 'building', + 'convenience', + 'store', + ], + }, + { + code: 'šŸ«', + keywords: [ + 'building', + 'school', + ], + }, + { + code: 'šŸ¬', + keywords: [ + 'building', + 'department', + 'store', + ], + }, + { + code: 'šŸ­', + keywords: [ + 'building', + 'factory', + ], + }, + { + code: 'šŸÆ', + keywords: [ + 'building', + 'castle', + 'japanese', + ], + }, + { + code: 'šŸ°', + keywords: [ + 'building', + 'castle', + 'european', + ], + }, + { + code: 'šŸ’’', + keywords: [ + 'activity', + 'chapel', + 'romance', + 'wedding', + ], + }, + { + code: 'šŸ—¼', + keywords: [ + 'tokyo', + 'tower', + ], + }, + { + code: 'šŸ—½', + keywords: [ + 'liberty', + 'statue', + ], + }, + { + code: 'ā›Ŗ', + keywords: [ + 'building', + 'christian', + 'church', + 'cross', + 'religion', + ], + }, + { + code: 'šŸ•Œ', + keywords: [ + 'islam', + 'mosque', + 'muslim', + 'religion', + ], + }, + { + code: 'šŸ•', + keywords: [ + 'jew', + 'jewish', + 'religion', + 'synagogue', + 'temple', + ], + }, + { + code: 'ā›©', + keywords: [ + 'religion', + 'shinto', + 'shrine', + ], + }, + { + code: 'šŸ•‹', + keywords: [ + 'islam', + 'kaaba', + 'muslim', + 'religion', + ], + }, + { + code: 'ā›²', + keywords: [ + 'fountain', + ], + }, + { + code: 'ā›ŗ', + keywords: [ + 'camping', + 'tent', + ], + }, + { + code: 'šŸŒ', + keywords: [ + 'fog', + 'weather', + ], + }, + { + code: 'šŸŒƒ', + keywords: [ + 'night', + 'star', + 'weather', + ], + }, + { + code: 'šŸŒ„', + keywords: [ + 'morning', + 'mountain', + 'sun', + 'sunrise', + 'weather', + ], + }, + { + code: 'šŸŒ…', + keywords: [ + 'morning', + 'sun', + 'sunrise', + 'weather', + ], + }, + { + code: 'šŸŒ†', + keywords: [ + 'building', + 'city', + 'dusk', + 'evening', + 'landscape', + 'sun', + 'sunset', + 'weather', + ], + }, + { + code: 'šŸŒ‡', + keywords: [ + 'building', + 'dusk', + 'sun', + 'sunset', + 'weather', + ], + }, + { + code: 'šŸŒ‰', + keywords: [ + 'bridge', + 'night', + 'weather', + ], + }, + { + code: 'ā™Ø', + keywords: [ + 'hot', + 'hotsprings', + 'springs', + 'steaming', + ], + }, + { + code: 'šŸŒŒ', + keywords: [ + 'milky way', + 'space', + 'weather', + ], + }, + { + code: 'šŸŽ ', + keywords: [ + 'activity', + 'carousel', + 'entertainment', + 'horse', + ], + }, + { + code: 'šŸŽ”', + keywords: [ + 'activity', + 'amusement park', + 'entertainment', + 'ferris', + 'wheel', + ], + }, + { + code: 'šŸŽ¢', + keywords: [ + 'activity', + 'amusement park', + 'coaster', + 'entertainment', + 'roller', + ], + }, + { + code: 'šŸ’ˆ', + keywords: [ + 'barber', + 'haircut', + 'pole', + ], + }, + { + code: 'šŸŽŖ', + keywords: [ + 'activity', + 'circus', + 'entertainment', + 'tent', + ], + }, + { + code: 'šŸŽ­', + keywords: [ + 'activity', + 'art', + 'entertainment', + 'mask', + 'performing', + 'theater', + 'theatre', + ], + }, + { + code: 'šŸ–¼', + keywords: [ + 'art', + 'frame', + 'museum', + 'painting', + 'picture', + ], + }, + { + code: 'šŸŽØ', + keywords: [ + 'activity', + 'art', + 'entertainment', + 'museum', + 'painting', + 'palette', + ], + }, + { + code: 'šŸŽ°', + keywords: [ + 'activity', + 'game', + 'slot', + ], + }, + { + code: 'šŸš‚', + keywords: [ + 'engine', + 'locomotive', + 'railway', + 'steam', + 'train', + 'vehicle', + ], + }, + { + code: 'šŸšƒ', + keywords: [ + 'car', + 'electric', + 'railway', + 'train', + 'tram', + 'trolleybus', + 'vehicle', + ], + }, + { + code: 'šŸš„', + keywords: [ + 'railway', + 'shinkansen', + 'speed', + 'train', + 'vehicle', + ], + }, + { + code: 'šŸš…', + keywords: [ + 'bullet', + 'railway', + 'shinkansen', + 'speed', + 'train', + 'vehicle', + ], + }, + { + code: 'šŸš†', + keywords: [ + 'railway', + 'train', + 'vehicle', + ], + }, + { + code: 'šŸš‡', + keywords: [ + 'metro', + 'subway', + 'vehicle', + ], + }, + { + code: 'šŸšˆ', + keywords: [ + 'railway', + 'vehicle', + ], + }, + { + code: 'šŸš‰', + keywords: [ + 'railway', + 'station', + 'train', + 'vehicle', + ], + }, + { + code: 'šŸšŠ', + keywords: [ + 'tram', + 'trolleybus', + 'vehicle', + ], + }, + { + code: 'šŸš', + keywords: [ + 'monorail', + 'vehicle', + ], + }, + { + code: 'šŸšž', + keywords: [ + 'car', + 'mountain', + 'railway', + 'vehicle', + ], + }, + { + code: 'šŸš‹', + keywords: [ + 'car', + 'tram', + 'trolleybus', + 'vehicle', + ], + }, + { + code: 'šŸšŒ', + keywords: [ + 'bus', + 'vehicle', + ], + }, + { + code: 'šŸš', + keywords: [ + 'bus', + 'oncoming', + 'vehicle', + ], + }, + { + code: 'šŸšŽ', + keywords: [ + 'bus', + 'tram', + 'trolley', + 'trolleybus', + 'vehicle', + ], + }, + { + code: 'šŸš', + keywords: [ + 'bus', + 'busstop', + 'stop', + ], + }, + { + code: 'šŸš', + keywords: [ + 'bus', + 'minibus', + 'vehicle', + ], + }, + { + code: 'šŸš‘', + keywords: [ + 'ambulance', + 'vehicle', + ], + }, + { + code: 'šŸš’', + keywords: [ + 'engine', + 'fire', + 'truck', + 'vehicle', + ], + }, + { + code: 'šŸš“', + keywords: [ + 'car', + 'patrol', + 'police', + 'vehicle', + ], + }, + { + code: 'šŸš”', + keywords: [ + 'car', + 'oncoming', + 'police', + 'vehicle', + ], + }, + { + code: 'šŸš•', + keywords: [ + 'taxi', + 'vehicle', + ], + }, + { + code: 'šŸš–', + keywords: [ + 'oncoming', + 'taxi', + 'vehicle', + ], + }, + { + code: 'šŸš—', + keywords: [ + 'automobile', + 'car', + 'vehicle', + ], + }, + { + code: 'šŸš˜', + keywords: [ + 'automobile', + 'car', + 'oncoming', + 'vehicle', + ], + }, + { + code: 'šŸš™', + keywords: [ + 'recreational', + 'rv', + 'vehicle', + ], + }, + { + code: 'šŸšš', + keywords: [ + 'delivery', + 'truck', + 'vehicle', + ], + }, + { + code: 'šŸš›', + keywords: [ + 'lorry', + 'semi', + 'truck', + 'vehicle', + ], + }, + { + code: 'šŸšœ', + keywords: [ + 'tractor', + 'vehicle', + ], + }, + { + code: 'šŸš²', + keywords: [ + 'bicycle', + 'bike', + 'vehicle', + ], + }, + { + code: 'ā›½', + keywords: [ + 'fuel', + 'fuelpump', + 'gas', + 'pump', + 'station', + ], + }, + { + code: 'šŸ›£', + keywords: [ + 'highway', + 'motorway', + 'road', + ], + }, + { + code: 'šŸ›¤', + keywords: [ + 'railway', + 'train', + ], + }, + { + code: 'šŸšØ', + keywords: [ + 'beacon', + 'car', + 'light', + 'police', + 'revolving', + 'vehicle', + ], + }, + { + code: 'šŸš„', + keywords: [ + 'light', + 'signal', + 'traffic', + ], + }, + { + code: 'šŸš¦', + keywords: [ + 'light', + 'signal', + 'traffic', + ], + }, + { + code: 'šŸš§', + keywords: [ + 'barrier', + 'construction', + ], + }, + { + code: 'šŸ›‘', + keywords: [ + 'octagonal', + 'stop', + ], + }, + { + code: 'šŸ›“', + keywords: [ + 'kick', + 'scooter', + ], + }, + { + code: 'šŸ›µ', + keywords: [ + 'motor', + 'scooter', + ], + }, + { + code: 'āš“', + keywords: [ + 'anchor', + 'ship', + 'tool', + ], + }, + { + code: 'ā›µ', + keywords: [ + 'boat', + 'resort', + 'sailboat', + 'sea', + 'vehicle', + 'yacht', + ], + }, + { + code: 'šŸš£', + keywords: [ + 'boat', + 'rowboat', + 'vehicle', + ], + types: [ + 'šŸš£šŸæ', + 'šŸš£šŸ¾', + 'šŸš£šŸ½', + 'šŸš£šŸ¼', + 'šŸš£šŸ»', + ], + }, + { + code: 'šŸ›¶', + keywords: [ + 'boat', + 'canoe', + ], + }, + { + code: 'šŸš¤', + keywords: [ + 'boat', + 'speedboat', + 'vehicle', + ], + }, + { + code: 'šŸ›³', + keywords: [ + 'passenger', + 'ship', + 'vehicle', + ], + }, + { + code: 'ā›“', + keywords: [ + 'boat', + 'ferry', + ], + }, + { + code: 'šŸ›„', + keywords: [ + 'boat', + 'motorboat', + 'vehicle', + ], + }, + { + code: 'šŸš¢', + keywords: [ + 'ship', + 'vehicle', + ], + }, + { + code: 'āœˆ', + keywords: [ + 'airplane', + 'vehicle', + ], + }, + { + code: 'šŸ›©', + keywords: [ + 'airplane', + 'vehicle', + ], + }, + { + code: 'šŸ›«', + keywords: [ + 'airplane', + 'check-in', + 'departure', + 'departures', + 'vehicle', + ], + }, + { + code: 'šŸ›¬', + keywords: [ + 'airplane', + 'arrivals', + 'arriving', + 'landing', + 'vehicle', + ], + }, + { + code: 'šŸ’ŗ', + keywords: [ + 'chair', + 'seat', + ], + }, + { + code: 'šŸš', + keywords: [ + 'helicopter', + 'vehicle', + ], + }, + { + code: 'šŸšŸ', + keywords: [ + 'railway', + 'suspension', + 'vehicle', + ], + }, + { + code: 'šŸš ', + keywords: [ + 'cable', + 'gondola', + 'mountain', + 'vehicle', + ], + }, + { + code: 'šŸš”', + keywords: [ + 'aerial', + 'cable', + 'car', + 'gondola', + 'ropeway', + 'tramway', + 'vehicle', + ], + }, + { + code: 'šŸš€', + keywords: [ + 'rocket', + 'space', + 'vehicle', + ], + }, + { + code: 'šŸ›°', + keywords: [ + 'satellite', + 'space', + 'vehicle', + ], + }, + { + code: 'šŸ›Ž', + keywords: [ + 'bell', + 'bellhop', + 'hotel', + ], + }, + { + code: 'šŸšŖ', + keywords: [ + 'door', + ], + }, + { + code: 'šŸ›Œ', + keywords: [ + 'hotel', + 'sleep', + ], + }, + { + code: 'šŸ›', + keywords: [ + 'bed', + 'hotel', + 'sleep', + ], + }, + { + code: 'šŸ›‹', + keywords: [ + 'couch', + 'hotel', + 'lamp', + ], + }, + { + code: 'šŸš½', + keywords: [ + 'toilet', + ], + }, + { + code: 'šŸšæ', + keywords: [ + 'shower', + 'water', + ], + }, + { + code: 'šŸ›€', + keywords: [ + 'bath', + 'bathtub', + ], + types: [ + 'šŸ›€šŸæ', + 'šŸ›€šŸ¾', + 'šŸ›€šŸ½', + 'šŸ›€šŸ¼', + 'šŸ›€šŸ»', + ], + }, + { + code: 'šŸ›', + keywords: [ + 'bath', + 'bathtub', + ], + }, + { + code: 'āŒ›', + keywords: [ + 'hourglass', + 'sand', + 'timer', + ], + }, + { + code: 'ā³', + keywords: [ + 'hourglass', + 'sand', + 'timer', + ], + }, + { + code: 'āŒš', + keywords: [ + 'clock', + 'watch', + ], + }, + { + code: 'ā°', + keywords: [ + 'alarm', + 'clock', + ], + }, + { + code: 'ā±', + keywords: [ + 'clock', + 'stopwatch', + ], + }, + { + code: 'ā²', + keywords: [ + 'clock', + 'timer', + ], + }, + { + code: 'šŸ•°', + keywords: [ + 'clock', + ], + }, + { + code: 'šŸ•›', + keywords: [ + '00', + '12', + '12:00', + 'clock', + 'oā€™clock', + 'twelve', + ], + }, + { + code: 'šŸ•§', + keywords: [ + '12', + '12:30', + '30', + 'clock', + 'thirty', + 'twelve', + ], + }, + { + code: 'šŸ•', + keywords: [ + '00', + '1', + '1:00', + 'clock', + 'oā€™clock', + 'one', + ], + }, + { + code: 'šŸ•œ', + keywords: [ + '1', + '1:30', + '30', + 'clock', + 'one', + 'thirty', + ], + }, + { + code: 'šŸ•‘', + keywords: [ + '00', + '2', + '2:00', + 'clock', + 'oā€™clock', + 'two', + ], + }, + { + code: 'šŸ•', + keywords: [ + '2', + '2:30', + '30', + 'clock', + 'thirty', + 'two', + ], + }, + { + code: 'šŸ•’', + keywords: [ + '00', + '3', + '3:00', + 'clock', + 'oā€™clock', + 'three', + ], + }, + { + code: 'šŸ•ž', + keywords: [ + '3', + '3:30', + '30', + 'clock', + 'thirty', + 'three', + ], + }, + { + code: 'šŸ•“', + keywords: [ + '00', + '4', + '4:00', + 'clock', + 'four', + 'oā€™clock', + ], + }, + { + code: 'šŸ•Ÿ', + keywords: [ + '30', + '4', + '4:30', + 'clock', + 'four', + 'thirty', + ], + }, + { + code: 'šŸ•”', + keywords: [ + '00', + '5', + '5:00', + 'clock', + 'five', + 'oā€™clock', + ], + }, + { + code: 'šŸ• ', + keywords: [ + '30', + '5', + '5:30', + 'clock', + 'five', + 'thirty', + ], + }, + { + code: 'šŸ••', + keywords: [ + '00', + '6', + '6:00', + 'clock', + 'oā€™clock', + 'six', + ], + }, + { + code: 'šŸ•”', + keywords: [ + '30', + '6', + '6:30', + 'clock', + 'six', + 'thirty', + ], + }, + { + code: 'šŸ•–', + keywords: [ + '00', + '7', + '7:00', + 'clock', + 'oā€™clock', + 'seven', + ], + }, + { + code: 'šŸ•¢', + keywords: [ + '30', + '7', + '7:30', + 'clock', + 'seven', + 'thirty', + ], + }, + { + code: 'šŸ•—', + keywords: [ + '00', + '8', + '8:00', + 'clock', + 'eight', + 'oā€™clock', + ], + }, + { + code: 'šŸ•£', + keywords: [ + '30', + '8', + '8:30', + 'clock', + 'eight', + 'thirty', + ], + }, + { + code: 'šŸ•˜', + keywords: [ + '00', + '9', + '9:00', + 'clock', + 'nine', + 'oā€™clock', + ], + }, + { + code: 'šŸ•¤', + keywords: [ + '30', + '9', + '9:30', + 'clock', + 'nine', + 'thirty', + ], + }, + { + code: 'šŸ•™', + keywords: [ + '00', + '10', + '10:00', + 'clock', + 'oā€™clock', + 'ten', + ], + }, + { + code: 'šŸ•„', + keywords: [ + '10', + '10:30', + '30', + 'clock', + 'ten', + 'thirty', + ], + }, + { + code: 'šŸ•š', + keywords: [ + '00', + '11', + '11:00', + 'clock', + 'eleven', + 'oā€™clock', + ], + }, + { + code: 'šŸ•¦', + keywords: [ + '11', + '11:30', + '30', + 'clock', + 'eleven', + 'thirty', + ], + }, + { + code: 'šŸŒ‘', + keywords: [ + 'dark', + 'moon', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒ’', + keywords: [ + 'crescent', + 'moon', + 'space', + 'waxing', + 'weather', + ], + }, + { + code: 'šŸŒ“', + keywords: [ + 'moon', + 'quarter', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒ”', + keywords: [ + 'gibbous', + 'moon', + 'space', + 'waxing', + 'weather', + ], + }, + { + code: 'šŸŒ•', + keywords: [ + 'full', + 'moon', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒ–', + keywords: [ + 'gibbous', + 'moon', + 'space', + 'waning', + 'weather', + ], + }, + { + code: 'šŸŒ—', + keywords: [ + 'moon', + 'quarter', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒ˜', + keywords: [ + 'crescent', + 'moon', + 'space', + 'waning', + 'weather', + ], + }, + { + code: 'šŸŒ™', + keywords: [ + 'crescent', + 'moon', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒš', + keywords: [ + 'face', + 'moon', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒ›', + keywords: [ + 'face', + 'moon', + 'quarter', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒœ', + keywords: [ + 'face', + 'moon', + 'quarter', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒ”', + keywords: [ + 'thermometer', + 'weather', + ], + }, + { + code: 'ā˜€', + keywords: [ + 'bright', + 'rays', + 'space', + 'sun', + 'sunny', + 'weather', + ], + }, + { + code: 'šŸŒ', + keywords: [ + 'bright', + 'face', + 'full', + 'moon', + 'space', + 'weather', + ], + }, + { + code: 'šŸŒž', + keywords: [ + 'bright', + 'face', + 'space', + 'sun', + 'weather', + ], + }, + { + code: 'ā­', + keywords: [ + 'star', + ], + }, + { + code: 'šŸŒŸ', + keywords: [ + 'glittery', + 'glow', + 'shining', + 'sparkle', + 'star', + ], + }, + { + code: 'šŸŒ ', + keywords: [ + 'activity', + 'falling', + 'shooting', + 'space', + 'star', + ], + }, + { + code: 'ā˜', + keywords: [ + 'cloud', + 'weather', + ], + }, + { + code: 'ā›…', + keywords: [ + 'cloud', + 'sun', + 'weather', + ], + }, + { + code: 'ā›ˆ', + keywords: [ + 'cloud', + 'rain', + 'thunder', + 'weather', + ], + }, + { + code: 'šŸŒ¤', + keywords: [ + 'cloud', + 'sun', + 'weather', + ], + }, + { + code: 'šŸŒ„', + keywords: [ + 'cloud', + 'sun', + 'weather', + ], + }, + { + code: 'šŸŒ¦', + keywords: [ + 'cloud', + 'rain', + 'sun', + 'weather', + ], + }, + { + code: 'šŸŒ§', + keywords: [ + 'cloud', + 'rain', + 'weather', + ], + }, + { + code: 'šŸŒØ', + keywords: [ + 'cloud', + 'cold', + 'snow', + 'weather', + ], + }, + { + code: 'šŸŒ©', + keywords: [ + 'cloud', + 'lightning', + 'weather', + ], + }, + { + code: 'šŸŒŖ', + keywords: [ + 'cloud', + 'tornado', + 'weather', + 'whirlwind', + ], + }, + { + code: 'šŸŒ«', + keywords: [ + 'cloud', + 'fog', + 'weather', + ], + }, + { + code: 'šŸŒ¬', + keywords: [ + 'blow', + 'cloud', + 'face', + 'weather', + 'wind', + ], + }, + { + code: 'šŸŒ€', + keywords: [ + 'cyclone', + 'dizzy', + 'twister', + 'typhoon', + 'weather', + ], + }, + { + code: 'šŸŒˆ', + keywords: [ + 'rain', + 'rainbow', + 'weather', + ], + }, + { + code: 'šŸŒ‚', + keywords: [ + 'clothing', + 'rain', + 'umbrella', + 'weather', + ], + }, + { + code: 'ā˜‚', + keywords: [ + 'clothing', + 'rain', + 'umbrella', + 'weather', + ], + }, + { + code: 'ā˜”', + keywords: [ + 'clothing', + 'drop', + 'rain', + 'umbrella', + 'weather', + ], + }, + { + code: 'ā›±', + keywords: [ + 'rain', + 'sun', + 'umbrella', + 'weather', + ], + }, + { + code: 'āš”', + keywords: [ + 'danger', + 'electric', + 'electricity', + 'lightning', + 'voltage', + 'zap', + ], + }, + { + code: 'ā„', + keywords: [ + 'cold', + 'snow', + 'snowflake', + 'weather', + ], + }, + { + code: 'ā˜ƒ', + keywords: [ + 'cold', + 'snow', + 'snowman', + 'weather', + ], + }, + { + code: 'ā›„', + keywords: [ + 'cold', + 'snow', + 'snowman', + 'weather', + ], + }, + { + code: 'ā˜„', + keywords: [ + 'comet', + 'space', + ], + }, + { + code: 'šŸ”„', + keywords: [ + 'fire', + 'flame', + 'tool', + ], + }, + { + code: 'šŸ’§', + keywords: [ + 'cold', + 'comic', + 'drop', + 'sweat', + 'weather', + ], + }, + { + code: 'šŸŒŠ', + keywords: [ + 'ocean', + 'water', + 'wave', + 'weather', + ], + }, + { + code: 'Activities', + header: true, + }, + { + code: 'šŸŽƒ', + keywords: [ + 'activity', + 'celebration', + 'entertainment', + 'halloween', + 'jack', + 'lantern', + ], + }, + { + code: 'šŸŽ„', + keywords: [ + 'activity', + 'celebration', + 'christmas', + 'entertainment', + 'tree', + ], + }, + { + code: 'šŸŽ†', + keywords: [ + 'activity', + 'celebration', + 'entertainment', + 'fireworks', + ], + }, + { + code: 'šŸŽ‡', + keywords: [ + 'activity', + 'celebration', + 'entertainment', + 'fireworks', + 'sparkle', + ], + }, + { + code: 'āœØ', + keywords: [ + 'entertainment', + 'sparkle', + 'star', + ], + }, + { + code: 'šŸŽˆ', + keywords: [ + 'activity', + 'balloon', + 'celebration', + 'entertainment', + ], + }, + { + code: 'šŸŽ‰', + keywords: [ + 'activity', + 'celebration', + 'entertainment', + 'party', + 'popper', + 'tada', + ], + }, + { + code: 'šŸŽŠ', + keywords: [ + 'activity', + 'ball', + 'celebration', + 'confetti', + 'entertainment', + ], + }, + { + code: 'šŸŽ‹', + keywords: [ + 'activity', + 'banner', + 'celebration', + 'entertainment', + 'japanese', + 'tree', + ], + }, + { + code: 'šŸŽ', + keywords: [ + 'activity', + 'bamboo', + 'celebration', + 'japanese', + 'pine', + 'plant', + ], + }, + { + code: 'šŸŽŽ', + keywords: [ + 'activity', + 'celebration', + 'doll', + 'entertainment', + 'festival', + 'japanese', + ], + }, + { + code: 'šŸŽ', + keywords: [ + 'activity', + 'carp', + 'celebration', + 'entertainment', + 'flag', + 'streamer', + ], + }, + { + code: 'šŸŽ', + keywords: [ + 'activity', + 'bell', + 'celebration', + 'chime', + 'entertainment', + 'wind', + ], + }, + { + code: 'šŸŽ‘', + keywords: [ + 'activity', + 'celebration', + 'ceremony', + 'entertainment', + 'moon', + ], + }, + { + code: 'šŸŽ€', + keywords: [ + 'celebration', + 'ribbon', + ], + }, + { + code: 'šŸŽ', + keywords: [ + 'box', + 'celebration', + 'entertainment', + 'gift', + 'present', + 'wrapped', + ], + }, + { + code: 'šŸŽ—', + keywords: [ + 'celebration', + 'reminder', + 'ribbon', + ], + }, + { + code: 'šŸŽŸ', + keywords: [ + 'admission', + 'entertainment', + 'ticket', + ], + }, + { + code: 'šŸŽ«', + keywords: [ + 'activity', + 'admission', + 'entertainment', + 'ticket', + ], + }, + { + code: 'šŸŽ–', + keywords: [ + 'celebration', + 'medal', + 'military', + ], + }, + { + code: 'šŸ†', + keywords: [ + 'prize', + 'trophy', + ], + }, + { + code: 'šŸ…', + keywords: [ + 'medal', + ], + }, + { + code: 'šŸ„‡', + keywords: [ + 'first', + 'gold', + 'medal', + ], + }, + { + code: 'šŸ„ˆ', + keywords: [ + 'medal', + 'second', + 'silver', + ], + }, + { + code: 'šŸ„‰', + keywords: [ + 'bronze', + 'medal', + 'third', + ], + }, + { + code: 'āš½', + keywords: [ + 'ball', + 'soccer', + ], + }, + { + code: 'āš¾', + keywords: [ + 'ball', + 'baseball', + ], + }, + { + code: 'šŸ€', + keywords: [ + 'ball', + 'basketball', + 'hoop', + ], + }, + { + code: 'šŸ', + keywords: [ + 'ball', + 'game', + 'volleyball', + ], + }, + { + code: 'šŸˆ', + keywords: [ + 'american', + 'ball', + 'football', + ], + }, + { + code: 'šŸ‰', + keywords: [ + 'ball', + 'football', + 'rugby', + ], + }, + { + code: 'šŸŽ¾', + keywords: [ + 'ball', + 'racquet', + 'tennis', + ], + }, + { + code: 'šŸŽ±', + keywords: [ + '8', + '8 ball', + 'ball', + 'billiard', + 'eight', + 'game', + ], + }, + { + code: 'šŸŽ³', + keywords: [ + 'ball', + 'bowling', + 'game', + ], + }, + { + code: 'šŸ', + keywords: [ + 'ball', + 'bat', + 'cricket', + 'game', + ], + }, + { + code: 'šŸ‘', + keywords: [ + 'ball', + 'field', + 'game', + 'hockey', + 'stick', + ], + }, + { + code: 'šŸ’', + keywords: [ + 'game', + 'hockey', + 'ice', + 'puck', + 'stick', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'ball', + 'bat', + 'game', + 'paddle', + 'table tennis', + ], + }, + { + code: 'šŸø', + keywords: [ + 'badminton', + 'birdie', + 'game', + 'racquet', + 'shuttlecock', + ], + }, + { + code: 'šŸ„Š', + keywords: [ + 'boxing', + 'glove', + ], + }, + { + code: 'šŸ„‹', + keywords: [ + 'judo', + 'karate', + 'martial arts', + 'taekwondo', + 'uniform', + ], + }, + { + code: 'ā›³', + keywords: [ + 'flag', + 'golf', + 'hole', + ], + }, + { + code: 'šŸŒ', + keywords: [ + 'ball', + 'golf', + ], + }, + { + code: 'ā›ø', + keywords: [ + 'ice', + 'skate', + ], + }, + { + code: 'šŸŽ£', + keywords: [ + 'entertainment', + 'fish', + 'pole', + ], + }, + { + code: 'šŸŽ½', + keywords: [ + 'running', + 'sash', + 'shirt', + ], + }, + { + code: 'šŸŽæ', + keywords: [ + 'ski', + 'snow', + ], + }, + { + code: 'ā›·', + keywords: [ + 'ski', + 'snow', + ], + }, + { + code: 'šŸ‚', + keywords: [ + 'ski', + 'snow', + 'snowboard', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'surfer', + 'surfing', + ], + types: [ + 'šŸ„šŸæ', + 'šŸ„šŸ¾', + 'šŸ„šŸ½', + 'šŸ„šŸ¼', + 'šŸ„šŸ»', + ], + }, + { + code: 'šŸ‡', + keywords: [ + 'horse', + 'jockey', + 'racehorse', + 'racing', + ], + }, + { + code: 'šŸŠ', + keywords: [ + 'swim', + 'swimmer', + ], + types: [ + 'šŸŠšŸæ', + 'šŸŠšŸ¾', + 'šŸŠšŸ½', + 'šŸŠšŸ¼', + 'šŸŠšŸ»', + ], + }, + { + code: 'ā›¹', + keywords: [ + 'ball', + ], + types: [ + 'ā›¹šŸæ', + 'ā›¹šŸ¾', + 'ā›¹šŸ½', + 'ā›¹šŸ¼', + 'ā›¹šŸ»', + ], + }, + { + code: 'šŸ‹', + keywords: [ + 'lifter', + 'weight', + ], + types: [ + 'šŸ‹šŸæ', + 'šŸ‹šŸ¾', + 'šŸ‹šŸ½', + 'šŸ‹šŸ¼', + 'šŸ‹šŸ»', + ], + }, + { + code: 'šŸš“', + keywords: [ + 'bicycle', + 'bicyclist', + 'bike', + 'cyclist', + ], + types: [ + 'šŸš“šŸæ', + 'šŸš“šŸ¾', + 'šŸš“šŸ½', + 'šŸš“šŸ¼', + 'šŸš“šŸ»', + ], + }, + { + code: 'šŸšµ', + keywords: [ + 'bicycle', + 'bicyclist', + 'bike', + 'cyclist', + 'mountain', + ], + types: [ + 'šŸšµšŸæ', + 'šŸšµšŸ¾', + 'šŸšµšŸ½', + 'šŸšµšŸ¼', + 'šŸšµšŸ»', + ], + }, + { + code: 'šŸŽ', + keywords: [ + 'car', + 'racing', + ], + }, + { + code: 'šŸ', + keywords: [ + 'motorcycle', + 'racing', + ], + }, + { + code: 'šŸ¤ø', + keywords: [ + 'cartwheel', + 'gymnastics', + ], + types: [ + 'šŸ¤øšŸæ', + 'šŸ¤øšŸ¾', + 'šŸ¤øšŸ½', + 'šŸ¤øšŸ¼', + 'šŸ¤øšŸ»', + ], + }, + { + code: 'šŸ¤¼', + keywords: [ + 'wrestle', + 'wrestler', + ], + types: [ + 'šŸ¤¼šŸæ', + 'šŸ¤¼šŸ¾', + 'šŸ¤¼šŸ½', + 'šŸ¤¼šŸ¼', + 'šŸ¤¼šŸ»', + ], + }, + { + code: 'šŸ¤½', + keywords: [ + 'polo', + 'water', + ], + types: [ + 'šŸ¤½šŸæ', + 'šŸ¤½šŸ¾', + 'šŸ¤½šŸ½', + 'šŸ¤½šŸ¼', + 'šŸ¤½šŸ»', + ], + }, + { + code: 'šŸ¤¾', + keywords: [ + 'ball', + 'handball', + ], + types: [ + 'šŸ¤¾šŸæ', + 'šŸ¤¾šŸ¾', + 'šŸ¤¾šŸ½', + 'šŸ¤¾šŸ¼', + 'šŸ¤¾šŸ»', + ], + }, + { + code: 'šŸ¤ŗ', + keywords: [ + 'fencer', + 'fencing', + 'sword', + ], + }, + { + code: 'šŸ„…', + keywords: [ + 'goal', + 'net', + ], + }, + { + code: 'šŸ¤¹', + keywords: [ + 'balance', + 'juggle', + 'multitask', + 'skill', + ], + types: [ + 'šŸ¤¹šŸæ', + 'šŸ¤¹šŸ¾', + 'šŸ¤¹šŸ½', + 'šŸ¤¹šŸ¼', + 'šŸ¤¹šŸ»', + ], + }, + { + code: 'šŸŽÆ', + keywords: [ + 'activity', + 'bull', + 'bullseye', + 'dart', + 'entertainment', + 'eye', + 'game', + 'hit', + 'target', + ], + }, + { + code: 'šŸŽ®', + keywords: [ + 'controller', + 'entertainment', + 'game', + 'video game', + ], + }, + { + code: 'šŸ•¹', + keywords: [ + 'entertainment', + 'game', + 'joystick', + 'video game', + ], + }, + { + code: 'šŸŽ²', + keywords: [ + 'dice', + 'die', + 'entertainment', + 'game', + ], + }, + { + code: 'ā™ ', + keywords: [ + 'card', + 'game', + 'spade', + 'suit', + ], + }, + { + code: 'ā™„', + keywords: [ + 'card', + 'game', + 'heart', + 'hearts', + 'suit', + ], + }, + { + code: 'ā™¦', + keywords: [ + 'card', + 'diamond', + 'diamonds', + 'game', + 'suit', + ], + }, + { + code: 'ā™£', + keywords: [ + 'card', + 'club', + 'clubs', + 'game', + 'suit', + ], + }, + { + code: 'šŸƒ', + keywords: [ + 'card', + 'entertainment', + 'game', + 'joker', + 'playing', + ], + }, + { + code: 'šŸ€„', + keywords: [ + 'game', + 'mahjong', + 'red', + ], + }, + { + code: 'šŸŽ“', + keywords: [ + 'activity', + 'card', + 'entertainment', + 'flower', + 'game', + 'japanese', + 'playing', + ], + }, + { + code: 'Objects', + header: true, + }, + { + code: 'šŸ”‡', + keywords: [ + 'mute', + 'quiet', + 'silent', + 'speaker', + 'volume', + ], + }, + { + code: 'šŸ”ˆ', + keywords: [ + 'speaker', + 'volume', + ], + }, + { + code: 'šŸ”‰', + keywords: [ + 'low', + 'speaker', + 'volume', + 'wave', + ], + }, + { + code: 'šŸ”Š', + keywords: [ + '3', + 'entertainment', + 'high', + 'loud', + 'speaker', + 'three', + 'volume', + ], + }, + { + code: 'šŸ“¢', + keywords: [ + 'communication', + 'loud', + 'loudspeaker', + 'public address', + ], + }, + { + code: 'šŸ“£', + keywords: [ + 'cheering', + 'communication', + 'megaphone', + ], + }, + { + code: 'šŸ“Æ', + keywords: [ + 'communication', + 'entertainment', + 'horn', + 'post', + 'postal', + ], + }, + { + code: 'šŸ””', + keywords: [ + 'bell', + ], + }, + { + code: 'šŸ”•', + keywords: [ + 'bell', + 'forbidden', + 'mute', + 'no', + 'not', + 'prohibited', + 'quiet', + 'silent', + ], + }, + { + code: 'šŸŽ¼', + keywords: [ + 'activity', + 'entertainment', + 'music', + 'score', + ], + }, + { + code: 'šŸŽµ', + keywords: [ + 'activity', + 'entertainment', + 'music', + 'note', + ], + }, + { + code: 'šŸŽ¶', + keywords: [ + 'activity', + 'entertainment', + 'music', + 'note', + 'notes', + ], + }, + { + code: 'šŸŽ™', + keywords: [ + 'mic', + 'microphone', + 'music', + 'studio', + ], + }, + { + code: 'šŸŽš', + keywords: [ + 'level', + 'music', + 'slider', + ], + }, + { + code: 'šŸŽ›', + keywords: [ + 'control', + 'knobs', + 'music', + ], + }, + { + code: 'šŸŽ¤', + keywords: [ + 'activity', + 'entertainment', + 'karaoke', + 'mic', + 'microphone', + ], + }, + { + code: 'šŸŽ§', + keywords: [ + 'activity', + 'earbud', + 'entertainment', + 'headphone', + ], + }, + { + code: 'šŸ“»', + keywords: [ + 'entertainment', + 'radio', + 'video', + ], + }, + { + code: 'šŸŽ·', + keywords: [ + 'activity', + 'entertainment', + 'instrument', + 'music', + 'sax', + 'saxophone', + ], + }, + { + code: 'šŸŽø', + keywords: [ + 'activity', + 'entertainment', + 'guitar', + 'instrument', + 'music', + ], + }, + { + code: 'šŸŽ¹', + keywords: [ + 'activity', + 'entertainment', + 'instrument', + 'keyboard', + 'music', + 'piano', + ], + }, + { + code: 'šŸŽŗ', + keywords: [ + 'activity', + 'entertainment', + 'instrument', + 'music', + 'trumpet', + ], + }, + { + code: 'šŸŽ»', + keywords: [ + 'activity', + 'entertainment', + 'instrument', + 'music', + 'violin', + ], + }, + { + code: 'šŸ„', + keywords: [ + 'drum', + 'drumsticks', + 'music', + ], + }, + { + code: 'šŸ“±', + keywords: [ + 'cell', + 'communication', + 'mobile', + 'phone', + 'telephone', + ], + }, + { + code: 'šŸ“²', + keywords: [ + 'arrow', + 'call', + 'cell', + 'communication', + 'mobile', + 'phone', + 'receive', + 'telephone', + ], + }, + { + code: 'ā˜Ž', + keywords: [ + 'phone', + 'telephone', + ], + }, + { + code: 'šŸ“ž', + keywords: [ + 'communication', + 'phone', + 'receiver', + 'telephone', + ], + }, + { + code: 'šŸ“Ÿ', + keywords: [ + 'communication', + 'pager', + ], + }, + { + code: 'šŸ“ ', + keywords: [ + 'communication', + 'fax', + ], + }, + { + code: 'šŸ”‹', + keywords: [ + 'battery', + ], + }, + { + code: 'šŸ”Œ', + keywords: [ + 'electric', + 'electricity', + 'plug', + ], + }, + { + code: 'šŸ’»', + keywords: [ + 'computer', + 'pc', + 'personal', + ], + }, + { + code: 'šŸ–„', + keywords: [ + 'computer', + 'desktop', + ], + }, + { + code: 'šŸ–Ø', + keywords: [ + 'computer', + 'printer', + ], + }, + { + code: 'āŒØ', + keywords: [ + 'computer', + 'keyboard', + ], + }, + { + code: 'šŸ–±', + keywords: [ + '3', + 'button', + 'computer', + 'mouse', + 'three', + ], + }, + { + code: 'šŸ–²', + keywords: [ + 'computer', + 'trackball', + ], + }, + { + code: 'šŸ’½', + keywords: [ + 'computer', + 'disk', + 'entertainment', + 'minidisk', + 'optical', + ], + }, + { + code: 'šŸ’¾', + keywords: [ + 'computer', + 'disk', + 'floppy', + ], + }, + { + code: 'šŸ’æ', + keywords: [ + 'blu-ray', + 'cd', + 'computer', + 'disk', + 'dvd', + 'optical', + ], + }, + { + code: 'šŸ“€', + keywords: [ + 'blu-ray', + 'cd', + 'computer', + 'disk', + 'dvd', + 'entertainment', + 'optical', + ], + }, + { + code: 'šŸŽ„', + keywords: [ + 'activity', + 'camera', + 'cinema', + 'entertainment', + 'movie', + ], + }, + { + code: 'šŸŽž', + keywords: [ + 'cinema', + 'entertainment', + 'film', + 'frames', + 'movie', + ], + }, + { + code: 'šŸ“½', + keywords: [ + 'cinema', + 'entertainment', + 'film', + 'movie', + 'projector', + 'video', + ], + }, + { + code: 'šŸŽ¬', + keywords: [ + 'activity', + 'clapper', + 'entertainment', + 'movie', + ], + }, + { + code: 'šŸ“ŗ', + keywords: [ + 'entertainment', + 'television', + 'tv', + 'video', + ], + }, + { + code: 'šŸ“·', + keywords: [ + 'camera', + 'entertainment', + 'video', + ], + }, + { + code: 'šŸ“ø', + keywords: [ + 'camera', + 'flash', + 'video', + ], + }, + { + code: 'šŸ“¹', + keywords: [ + 'camera', + 'entertainment', + 'video', + ], + }, + { + code: 'šŸ“¼', + keywords: [ + 'entertainment', + 'tape', + 'vhs', + 'video', + 'videocassette', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'glass', + 'magnifying', + 'search', + 'tool', + ], + }, + { + code: 'šŸ”Ž', + keywords: [ + 'glass', + 'magnifying', + 'search', + 'tool', + ], + }, + { + code: 'šŸ”¬', + keywords: [ + 'microscope', + 'tool', + ], + }, + { + code: 'šŸ”­', + keywords: [ + 'telescope', + 'tool', + ], + }, + { + code: 'šŸ“”', + keywords: [ + 'antenna', + 'communication', + 'dish', + 'satellite', + ], + }, + { + code: 'šŸ•Æ', + keywords: [ + 'candle', + 'light', + ], + }, + { + code: 'šŸ’”', + keywords: [ + 'bulb', + 'comic', + 'electric', + 'idea', + 'light', + ], + }, + { + code: 'šŸ”¦', + keywords: [ + 'electric', + 'flashlight', + 'light', + 'tool', + 'torch', + ], + }, + { + code: 'šŸ®', + keywords: [ + 'bar', + 'japanese', + 'lantern', + 'light', + 'red', + ], + }, + { + code: 'šŸ“”', + keywords: [ + 'book', + 'cover', + 'decorated', + 'notebook', + ], + }, + { + code: 'šŸ“•', + keywords: [ + 'book', + 'closed', + ], + }, + { + code: 'šŸ“–', + keywords: [ + 'book', + 'open', + ], + }, + { + code: 'šŸ“—', + keywords: [ + 'book', + 'green', + ], + }, + { + code: 'šŸ“˜', + keywords: [ + 'blue', + 'book', + ], + }, + { + code: 'šŸ“™', + keywords: [ + 'book', + 'orange', + ], + }, + { + code: 'šŸ“š', + keywords: [ + 'book', + 'books', + ], + }, + { + code: 'šŸ““', + keywords: [ + 'notebook', + ], + }, + { + code: 'šŸ“’', + keywords: [ + 'ledger', + 'notebook', + ], + }, + { + code: 'šŸ“ƒ', + keywords: [ + 'curl', + 'document', + 'page', + ], + }, + { + code: 'šŸ“œ', + keywords: [ + 'paper', + 'scroll', + ], + }, + { + code: 'šŸ“„', + keywords: [ + 'document', + 'page', + ], + }, + { + code: 'šŸ“°', + keywords: [ + 'communication', + 'news', + 'newspaper', + 'paper', + ], + }, + { + code: 'šŸ—ž', + keywords: [ + 'news', + 'newspaper', + 'paper', + 'rolled', + ], + }, + { + code: 'šŸ“‘', + keywords: [ + 'bookmark', + 'mark', + 'marker', + 'tabs', + ], + }, + { + code: 'šŸ”–', + keywords: [ + 'bookmark', + 'mark', + ], + }, + { + code: 'šŸ·', + keywords: [ + 'label', + ], + }, + { + code: 'šŸ’°', + keywords: [ + 'bag', + 'dollar', + 'money', + 'moneybag', + ], + }, + { + code: 'šŸ’“', + keywords: [ + 'bank', + 'banknote', + 'bill', + 'currency', + 'money', + 'note', + 'yen', + ], + }, + { + code: 'šŸ’µ', + keywords: [ + 'bank', + 'banknote', + 'bill', + 'currency', + 'dollar', + 'money', + 'note', + ], + }, + { + code: 'šŸ’¶', + keywords: [ + 'bank', + 'banknote', + 'bill', + 'currency', + 'euro', + 'money', + 'note', + ], + }, + { + code: 'šŸ’·', + keywords: [ + 'bank', + 'banknote', + 'bill', + 'currency', + 'money', + 'note', + 'pound', + ], + }, + { + code: 'šŸ’ø', + keywords: [ + 'bank', + 'banknote', + 'bill', + 'dollar', + 'fly', + 'money', + 'note', + 'wings', + ], + }, + { + code: 'šŸ’³', + keywords: [ + 'bank', + 'card', + 'credit', + 'money', + ], + }, + { + code: 'šŸ’¹', + keywords: [ + 'bank', + 'chart', + 'currency', + 'graph', + 'growth', + 'market', + 'money', + 'rise', + 'trend', + 'upward', + 'yen', + ], + }, + { + code: 'šŸ’±', + keywords: [ + 'bank', + 'currency', + 'exchange', + 'money', + ], + }, + { + code: 'šŸ’²', + keywords: [ + 'currency', + 'dollar', + 'money', + ], + }, + { + code: 'āœ‰', + keywords: [ + 'e-mail', + 'email', + 'envelope', + ], + }, + { + code: 'šŸ“§', + keywords: [ + 'communication', + 'e-mail', + 'email', + 'letter', + 'mail', + ], + }, + { + code: 'šŸ“Ø', + keywords: [ + 'communication', + 'e-mail', + 'email', + 'envelope', + 'incoming', + 'letter', + 'mail', + 'receive', + ], + }, + { + code: 'šŸ“©', + keywords: [ + 'arrow', + 'communication', + 'down', + 'e-mail', + 'email', + 'envelope', + 'letter', + 'mail', + 'outgoing', + 'sent', + ], + }, + { + code: 'šŸ“¤', + keywords: [ + 'box', + 'communication', + 'letter', + 'mail', + 'outbox', + 'sent', + 'tray', + ], + }, + { + code: 'šŸ“„', + keywords: [ + 'box', + 'communication', + 'inbox', + 'letter', + 'mail', + 'receive', + 'tray', + ], + }, + { + code: 'šŸ“¦', + keywords: [ + 'box', + 'communication', + 'package', + 'parcel', + ], + }, + { + code: 'šŸ“«', + keywords: [ + 'closed', + 'communication', + 'flag', + 'mail', + 'mailbox', + 'postbox', + ], + }, + { + code: 'šŸ“Ŗ', + keywords: [ + 'closed', + 'communication', + 'flag', + 'lowered', + 'mail', + 'mailbox', + 'postbox', + ], + }, + { + code: 'šŸ“¬', + keywords: [ + 'communication', + 'flag', + 'mail', + 'mailbox', + 'open', + 'postbox', + ], + }, + { + code: 'šŸ“­', + keywords: [ + 'communication', + 'flag', + 'lowered', + 'mail', + 'mailbox', + 'open', + 'postbox', + ], + }, + { + code: 'šŸ“®', + keywords: [ + 'communication', + 'mail', + 'mailbox', + 'postbox', + ], + }, + { + code: 'šŸ—³', + keywords: [ + 'ballot', + 'box', + ], + }, + { + code: 'āœ', + keywords: [ + 'pencil', + ], + }, + { + code: 'āœ’', + keywords: [ + 'nib', + 'pen', + ], + }, + { + code: 'šŸ–‹', + keywords: [ + 'communication', + 'fountain', + 'pen', + ], + }, + { + code: 'šŸ–Š', + keywords: [ + 'ballpoint', + 'communication', + 'pen', + ], + }, + { + code: 'šŸ–Œ', + keywords: [ + 'communication', + 'paintbrush', + 'painting', + ], + }, + { + code: 'šŸ–', + keywords: [ + 'communication', + 'crayon', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'communication', + 'memo', + 'pencil', + ], + }, + { + code: 'šŸ’¼', + keywords: [ + 'briefcase', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'file', + 'folder', + ], + }, + { + code: 'šŸ“‚', + keywords: [ + 'file', + 'folder', + 'open', + ], + }, + { + code: 'šŸ—‚', + keywords: [ + 'card', + 'dividers', + 'index', + ], + }, + { + code: 'šŸ“…', + keywords: [ + 'calendar', + 'date', + ], + }, + { + code: 'šŸ“†', + keywords: [ + 'calendar', + ], + }, + { + code: 'šŸ—’', + keywords: [ + 'note', + 'pad', + 'spiral', + ], + }, + { + code: 'šŸ—“', + keywords: [ + 'calendar', + 'pad', + 'spiral', + ], + }, + { + code: 'šŸ“‡', + keywords: [ + 'card', + 'index', + 'rolodex', + ], + }, + { + code: 'šŸ“ˆ', + keywords: [ + 'chart', + 'graph', + 'growth', + 'trend', + 'upward', + ], + }, + { + code: 'šŸ“‰', + keywords: [ + 'chart', + 'down', + 'graph', + 'trend', + ], + }, + { + code: 'šŸ“Š', + keywords: [ + 'bar', + 'chart', + 'graph', + ], + }, + { + code: 'šŸ“‹', + keywords: [ + 'clipboard', + ], + }, + { + code: 'šŸ“Œ', + keywords: [ + 'pin', + 'pushpin', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'pin', + 'pushpin', + ], + }, + { + code: 'šŸ“Ž', + keywords: [ + 'paperclip', + ], + }, + { + code: 'šŸ–‡', + keywords: [ + 'communication', + 'link', + 'paperclip', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'ruler', + 'straight edge', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'ruler', + 'set', + 'triangle', + ], + }, + { + code: 'āœ‚', + keywords: [ + 'scissors', + 'tool', + ], + }, + { + code: 'šŸ—ƒ', + keywords: [ + 'box', + 'card', + 'file', + ], + }, + { + code: 'šŸ—„', + keywords: [ + 'cabinet', + 'file', + ], + }, + { + code: 'šŸ—‘', + keywords: [ + 'wastebasket', + ], + }, + { + code: 'šŸ”’', + keywords: [ + 'closed', + 'lock', + ], + }, + { + code: 'šŸ”“', + keywords: [ + 'lock', + 'open', + 'unlock', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'ink', + 'lock', + 'nib', + 'pen', + 'privacy', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'closed', + 'key', + 'lock', + 'secure', + ], + }, + { + code: 'šŸ”‘', + keywords: [ + 'key', + 'lock', + 'password', + ], + }, + { + code: 'šŸ—', + keywords: [ + 'clue', + 'key', + 'lock', + 'old', + ], + }, + { + code: 'šŸ”Ø', + keywords: [ + 'hammer', + 'tool', + ], + }, + { + code: 'ā›', + keywords: [ + 'mining', + 'pick', + 'tool', + ], + }, + { + code: 'āš’', + keywords: [ + 'hammer', + 'pick', + 'tool', + ], + }, + { + code: 'šŸ› ', + keywords: [ + 'hammer', + 'tool', + 'wrench', + ], + }, + { + code: 'šŸ—”', + keywords: [ + 'dagger', + 'knife', + 'weapon', + ], + }, + { + code: 'āš”', + keywords: [ + 'crossed', + 'swords', + 'weapon', + ], + }, + { + code: 'šŸ”«', + keywords: [ + 'gun', + 'handgun', + 'pistol', + 'revolver', + 'tool', + 'weapon', + ], + }, + { + code: 'šŸ¹', + keywords: [ + 'archer', + 'arrow', + 'bow', + 'sagittarius', + 'tool', + 'weapon', + 'zodiac', + ], + }, + { + code: 'šŸ›”', + keywords: [ + 'shield', + 'weapon', + ], + }, + { + code: 'šŸ”§', + keywords: [ + 'tool', + 'wrench', + ], + }, + { + code: 'šŸ”©', + keywords: [ + 'bolt', + 'nut', + 'tool', + ], + }, + { + code: 'āš™', + keywords: [ + 'gear', + 'tool', + ], + }, + { + code: 'šŸ—œ', + keywords: [ + 'compression', + 'tool', + 'vice', + ], + }, + { + code: 'āš—', + keywords: [ + 'alembic', + 'chemistry', + 'tool', + ], + }, + { + code: 'āš–', + keywords: [ + 'balance', + 'justice', + 'libra', + 'scales', + 'tool', + 'weight', + 'zodiac', + ], + }, + { + code: 'šŸ”—', + keywords: [ + 'link', + ], + }, + { + code: 'ā›“', + keywords: [ + 'chain', + ], + }, + { + code: 'šŸ’‰', + keywords: [ + 'doctor', + 'medicine', + 'needle', + 'shot', + 'sick', + 'syringe', + 'tool', + ], + }, + { + code: 'šŸ’Š', + keywords: [ + 'doctor', + 'medicine', + 'pill', + 'sick', + ], + }, + { + code: 'šŸš¬', + keywords: [ + 'activity', + 'smoking', + ], + }, + { + code: 'āš°', + keywords: [ + 'coffin', + 'death', + ], + }, + { + code: 'āš±', + keywords: [ + 'death', + 'funeral', + 'urn', + ], + }, + { + code: 'šŸ—æ', + keywords: [ + 'face', + 'moyai', + 'statue', + ], + }, + { + code: 'šŸ›¢', + keywords: [ + 'drum', + 'oil', + ], + }, + { + code: 'šŸ”®', + keywords: [ + 'ball', + 'crystal', + 'fairy tale', + 'fantasy', + 'fortune', + 'tool', + ], + }, + { + code: 'šŸ›’', + keywords: [ + 'cart', + 'shopping', + 'trolley', + ], + }, + { + code: 'Symbols', + header: true, + }, + { + code: 'šŸ§', + keywords: [ + 'atm', + 'automated', + 'bank', + 'teller', + ], + }, + { + code: 'šŸš®', + keywords: [ + 'litter', + 'litterbox', + ], + }, + { + code: 'šŸš°', + keywords: [ + 'drink', + 'potable', + 'water', + ], + }, + { + code: 'ā™æ', + keywords: [ + 'access', + 'wheelchair', + ], + }, + { + code: 'šŸš¹', + keywords: [ + 'lavatory', + 'man', + 'restroom', + 'wc', + ], + }, + { + code: 'šŸšŗ', + keywords: [ + 'lavatory', + 'restroom', + 'wc', + 'woman', + ], + }, + { + code: 'šŸš»', + keywords: [ + 'lavatory', + 'restroom', + 'wc', + ], + }, + { + code: 'šŸš¼', + keywords: [ + 'baby', + 'changing', + ], + }, + { + code: 'šŸš¾', + keywords: [ + 'closet', + 'lavatory', + 'restroom', + 'water', + 'wc', + ], + }, + { + code: 'šŸ›‚', + keywords: [ + 'control', + 'passport', + ], + }, + { + code: 'šŸ›ƒ', + keywords: [ + 'customs', + ], + }, + { + code: 'šŸ›„', + keywords: [ + 'baggage', + 'claim', + ], + }, + { + code: 'šŸ›…', + keywords: [ + 'baggage', + 'left luggage', + 'locker', + 'luggage', + ], + }, + { + code: 'āš ', + keywords: [ + 'warning', + ], + }, + { + code: 'šŸšø', + keywords: [ + 'child', + 'crossing', + 'pedestrian', + 'traffic', + ], + }, + { + code: 'ā›”', + keywords: [ + 'entry', + 'forbidden', + 'no', + 'not', + 'prohibited', + 'traffic', + ], + }, + { + code: 'šŸš«', + keywords: [ + 'entry', + 'forbidden', + 'no', + 'not', + 'prohibited', + ], + }, + { + code: 'šŸš³', + keywords: [ + 'bicycle', + 'bike', + 'forbidden', + 'no', + 'not', + 'prohibited', + 'vehicle', + ], + }, + { + code: 'šŸš­', + keywords: [ + 'forbidden', + 'no', + 'not', + 'prohibited', + 'smoking', + ], + }, + { + code: 'šŸšÆ', + keywords: [ + 'forbidden', + 'litter', + 'no', + 'not', + 'prohibited', + ], + }, + { + code: 'šŸš±', + keywords: [ + 'drink', + 'forbidden', + 'no', + 'not', + 'potable', + 'prohibited', + 'water', + ], + }, + { + code: 'šŸš·', + keywords: [ + 'forbidden', + 'no', + 'not', + 'pedestrian', + 'prohibited', + ], + }, + { + code: 'šŸ“µ', + keywords: [ + 'cell', + 'communication', + 'forbidden', + 'mobile', + 'no', + 'not', + 'phone', + 'prohibited', + 'telephone', + ], + }, + { + code: 'šŸ”ž', + keywords: [ + '18', + 'age restriction', + 'eighteen', + 'forbidden', + 'no', + 'not', + 'prohibited', + 'underage', + ], + }, + { + code: 'ā˜¢', + keywords: [ + 'radioactive', + ], + }, + { + code: 'ā˜£', + keywords: [ + 'biohazard', + ], + }, + { + code: 'ā¬†', + keywords: [ + 'arrow', + 'cardinal', + 'direction', + 'north', + ], + }, + { + code: 'ā†—', + keywords: [ + 'arrow', + 'direction', + 'intercardinal', + 'northeast', + ], + }, + { + code: 'āž”', + keywords: [ + 'arrow', + 'cardinal', + 'direction', + 'east', + ], + }, + { + code: 'ā†˜', + keywords: [ + 'arrow', + 'direction', + 'intercardinal', + 'southeast', + ], + }, + { + code: 'ā¬‡', + keywords: [ + 'arrow', + 'cardinal', + 'direction', + 'down', + 'south', + ], + }, + { + code: 'ā†™', + keywords: [ + 'arrow', + 'direction', + 'intercardinal', + 'southwest', + ], + }, + { + code: 'ā¬…', + keywords: [ + 'arrow', + 'cardinal', + 'direction', + 'west', + ], + }, + { + code: 'ā†–', + keywords: [ + 'arrow', + 'direction', + 'intercardinal', + 'northwest', + ], + }, + { + code: 'ā†•', + keywords: [ + 'arrow', + ], + }, + { + code: 'ā†”', + keywords: [ + 'arrow', + ], + }, + { + code: 'ā†©', + keywords: [ + 'arrow', + ], + }, + { + code: 'ā†Ŗ', + keywords: [ + 'arrow', + ], + }, + { + code: 'ā¤“', + keywords: [ + 'arrow', + ], + }, + { + code: 'ā¤µ', + keywords: [ + 'arrow', + 'down', + ], + }, + { + code: 'šŸ”ƒ', + keywords: [ + 'arrow', + 'clockwise', + 'reload', + ], + }, + { + code: 'šŸ”„', + keywords: [ + 'anticlockwise', + 'arrow', + 'counterclockwise', + 'withershins', + ], + }, + { + code: 'šŸ”™', + keywords: [ + 'arrow', + 'back', + ], + }, + { + code: 'šŸ”š', + keywords: [ + 'arrow', + 'end', + ], + }, + { + code: 'šŸ”›', + keywords: [ + 'arrow', + 'mark', + 'on', + ], + }, + { + code: 'šŸ”œ', + keywords: [ + 'arrow', + 'soon', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'arrow', + 'top', + 'up', + ], + }, + { + code: 'šŸ›', + keywords: [ + 'religion', + 'worship', + ], + }, + { + code: 'āš›', + keywords: [ + 'atheist', + 'atom', + ], + }, + { + code: 'šŸ•‰', + keywords: [ + 'hindu', + 'om', + 'religion', + ], + }, + { + code: 'āœ”', + keywords: [ + 'david', + 'jew', + 'jewish', + 'religion', + 'star', + ], + }, + { + code: 'ā˜ø', + keywords: [ + 'buddhist', + 'dharma', + 'religion', + 'wheel', + ], + }, + { + code: 'ā˜Æ', + keywords: [ + 'religion', + 'tao', + 'taoist', + 'yang', + 'yin', + ], + }, + { + code: 'āœ', + keywords: [ + 'christian', + 'cross', + 'religion', + ], + }, + { + code: 'ā˜¦', + keywords: [ + 'christian', + 'cross', + 'religion', + ], + }, + { + code: 'ā˜Ŗ', + keywords: [ + 'islam', + 'muslim', + 'religion', + ], + }, + { + code: 'ā˜®', + keywords: [ + 'peace', + ], + }, + { + code: 'šŸ•Ž', + keywords: [ + 'candelabrum', + 'candlestick', + 'menorah', + 'religion', + ], + }, + { + code: 'šŸ”Æ', + keywords: [ + 'fortune', + 'star', + ], + }, + { + code: 'ā™»', + keywords: [ + 'recycle', + ], + }, + { + code: 'šŸ“›', + keywords: [ + 'badge', + 'name', + ], + }, + { + code: 'āšœ', + keywords: [ + 'fleur-de-lis', + ], + }, + { + code: 'šŸ”°', + keywords: [ + 'beginner', + 'chevron', + 'green', + 'japanese', + 'leaf', + 'tool', + 'yellow', + ], + }, + { + code: 'šŸ”±', + keywords: [ + 'anchor', + 'emblem', + 'ship', + 'tool', + 'trident', + ], + }, + { + code: 'ā­•', + keywords: [ + 'circle', + 'o', + ], + }, + { + code: 'āœ…', + keywords: [ + 'check', + 'mark', + ], + }, + { + code: 'ā˜‘', + keywords: [ + 'ballot', + 'box', + 'check', + ], + }, + { + code: 'āœ”', + keywords: [ + 'check', + 'mark', + ], + }, + { + code: 'āœ–', + keywords: [ + 'cancel', + 'multiplication', + 'multiply', + 'x', + ], + }, + { + code: 'āŒ', + keywords: [ + 'cancel', + 'mark', + 'multiplication', + 'multiply', + 'x', + ], + }, + { + code: 'āŽ', + keywords: [ + 'mark', + 'square', + ], + }, + { + code: 'āž•', + keywords: [ + 'math', + 'plus', + ], + }, + { + code: 'āž–', + keywords: [ + 'math', + 'minus', + ], + }, + { + code: 'āž—', + keywords: [ + 'division', + 'math', + ], + }, + { + code: 'āž°', + keywords: [ + 'curl', + 'loop', + ], + }, + { + code: 'āžæ', + keywords: [ + 'curl', + 'double', + 'loop', + ], + }, + { + code: 'ć€½', + keywords: [ + 'mark', + 'part', + ], + }, + { + code: 'āœ³', + keywords: [ + 'asterisk', + ], + }, + { + code: 'āœ“', + keywords: [ + 'star', + ], + }, + { + code: 'ā‡', + keywords: [ + 'sparkle', + ], + }, + { + code: 'ā€¼', + keywords: [ + 'bangbang', + 'exclamation', + 'mark', + 'punctuation', + ], + }, + { + code: 'ā‰', + keywords: [ + 'exclamation', + 'interrobang', + 'mark', + 'punctuation', + 'question', + ], + }, + { + code: 'ā“', + keywords: [ + 'mark', + 'punctuation', + 'question', + ], + }, + { + code: 'ā”', + keywords: [ + 'mark', + 'outlined', + 'punctuation', + 'question', + ], + }, + { + code: 'ā•', + keywords: [ + 'exclamation', + 'mark', + 'outlined', + 'punctuation', + ], + }, + { + code: 'ā—', + keywords: [ + 'exclamation', + 'mark', + 'punctuation', + ], + }, + { + code: '怰', + keywords: [ + 'dash', + 'punctuation', + 'wavy', + ], + }, + { + code: 'Ā©', + keywords: [ + 'copyright', + ], + }, + { + code: 'Ā®', + keywords: [ + 'registered', + ], + }, + { + code: 'ā„¢', + keywords: [ + 'mark', + 'tm', + 'trademark', + ], + }, + { + code: 'ā™ˆ', + keywords: [ + 'aries', + 'ram', + 'zodiac', + ], + }, + { + code: 'ā™‰', + keywords: [ + 'bull', + 'ox', + 'taurus', + 'zodiac', + ], + }, + { + code: 'ā™Š', + keywords: [ + 'gemini', + 'twins', + 'zodiac', + ], + }, + { + code: 'ā™‹', + keywords: [ + 'cancer', + 'crab', + 'zodiac', + ], + }, + { + code: 'ā™Œ', + keywords: [ + 'leo', + 'lion', + 'zodiac', + ], + }, + { + code: 'ā™', + keywords: [ + 'maiden', + 'virgin', + 'virgo', + 'zodiac', + ], + }, + { + code: 'ā™Ž', + keywords: [ + 'balance', + 'justice', + 'libra', + 'scales', + 'zodiac', + ], + }, + { + code: 'ā™', + keywords: [ + 'scorpio', + 'scorpion', + 'scorpius', + 'zodiac', + ], + }, + { + code: 'ā™', + keywords: [ + 'archer', + 'sagittarius', + 'zodiac', + ], + }, + { + code: 'ā™‘', + keywords: [ + 'capricorn', + 'goat', + 'zodiac', + ], + }, + { + code: 'ā™’', + keywords: [ + 'aquarius', + 'bearer', + 'water', + 'zodiac', + ], + }, + { + code: 'ā™“', + keywords: [ + 'fish', + 'pisces', + 'zodiac', + ], + }, + { + code: 'ā›Ž', + keywords: [ + 'bearer', + 'ophiuchus', + 'serpent', + 'snake', + 'zodiac', + ], + }, + { + code: 'šŸ”€', + keywords: [ + 'arrow', + 'crossed', + ], + }, + { + code: 'šŸ”', + keywords: [ + 'arrow', + 'clockwise', + 'repeat', + ], + }, + { + code: 'šŸ”‚', + keywords: [ + 'arrow', + 'clockwise', + 'once', + ], + }, + { + code: 'ā–¶', + keywords: [ + 'arrow', + 'play', + 'right', + 'triangle', + ], + }, + { + code: 'ā©', + keywords: [ + 'arrow', + 'double', + 'fast', + 'forward', + ], + }, + { + code: 'ā­', + keywords: [ + 'arrow', + 'next scene', + 'next track', + 'triangle', + ], + }, + { + code: 'āÆ', + keywords: [ + 'arrow', + 'pause', + 'play', + 'right', + 'triangle', + ], + }, + { + code: 'ā—€', + keywords: [ + 'arrow', + 'left', + 'reverse', + 'triangle', + ], + }, + { + code: 'āŖ', + keywords: [ + 'arrow', + 'double', + 'rewind', + ], + }, + { + code: 'ā®', + keywords: [ + 'arrow', + 'previous scene', + 'previous track', + 'triangle', + ], + }, + { + code: 'šŸ”¼', + keywords: [ + 'arrow', + 'button', + 'red', + ], + }, + { + code: 'ā«', + keywords: [ + 'arrow', + 'double', + ], + }, + { + code: 'šŸ”½', + keywords: [ + 'arrow', + 'button', + 'down', + 'red', + ], + }, + { + code: 'ā¬', + keywords: [ + 'arrow', + 'double', + 'down', + ], + }, + { + code: 'āø', + keywords: [ + 'bar', + 'double', + 'pause', + 'vertical', + ], + }, + { + code: 'ā¹', + keywords: [ + 'square', + 'stop', + ], + }, + { + code: 'āŗ', + keywords: [ + 'circle', + 'record', + ], + }, + { + code: 'ā', + keywords: [ + 'eject', + ], + }, + { + code: 'šŸŽ¦', + keywords: [ + 'activity', + 'camera', + 'cinema', + 'entertainment', + 'film', + 'movie', + ], + }, + { + code: 'šŸ”…', + keywords: [ + 'brightness', + 'dim', + 'low', + ], + }, + { + code: 'šŸ”†', + keywords: [ + 'bright', + 'brightness', + ], + }, + { + code: 'šŸ“¶', + keywords: [ + 'antenna', + 'bar', + 'cell', + 'communication', + 'mobile', + 'phone', + 'signal', + 'telephone', + ], + }, + { + code: 'šŸ“³', + keywords: [ + 'cell', + 'communication', + 'mobile', + 'mode', + 'phone', + 'telephone', + 'vibration', + ], + }, + { + code: 'šŸ““', + keywords: [ + 'cell', + 'communication', + 'mobile', + 'off', + 'phone', + 'telephone', + ], + }, + { + code: '#ļøāƒ£', + keywords: [ + 'hash', + 'keycap', + 'pound', + ], + }, + { + code: '*ļøāƒ£', + keywords: [ + 'asterisk', + 'keycap', + 'star', + ], + }, + { + code: '0ļøāƒ£', + keywords: [ + '0', + 'keycap', + 'zero', + ], + }, + { + code: '1ļøāƒ£', + keywords: [ + '1', + 'keycap', + 'one', + ], + }, + { + code: '2ļøāƒ£', + keywords: [ + '2', + 'keycap', + 'two', + ], + }, + { + code: '3ļøāƒ£', + keywords: [ + '3', + 'keycap', + 'three', + ], + }, + { + code: '4ļøāƒ£', + keywords: [ + '4', + 'four', + 'keycap', + ], + }, + { + code: '5ļøāƒ£', + keywords: [ + '5', + 'five', + 'keycap', + ], + }, + { + code: '6ļøāƒ£', + keywords: [ + '6', + 'keycap', + 'six', + ], + }, + { + code: '7ļøāƒ£', + keywords: [ + '7', + 'keycap', + 'seven', + ], + }, + { + code: '8ļøāƒ£', + keywords: [ + '8', + 'eight', + 'keycap', + ], + }, + { + code: '9ļøāƒ£', + keywords: [ + '9', + 'keycap', + 'nine', + ], + }, + { + code: 'šŸ”Ÿ', + keywords: [ + '10', + 'keycap', + 'ten', + ], + }, + { + code: 'šŸ’Æ', + keywords: [ + '100', + 'full', + 'hundred', + 'score', + ], + }, + { + code: 'šŸ” ', + keywords: [ + 'input', + 'latin', + 'letters', + 'uppercase', + ], + }, + { + code: 'šŸ””', + keywords: [ + 'abcd', + 'input', + 'latin', + 'letters', + 'lowercase', + ], + }, + { + code: 'šŸ”¢', + keywords: [ + '1234', + 'input', + 'numbers', + ], + }, + { + code: 'šŸ”£', + keywords: [ + 'input', + ], + }, + { + code: 'šŸ”¤', + keywords: [ + 'abc', + 'alphabet', + 'input', + 'latin', + 'letters', + ], + }, + { + code: 'šŸ…°', + keywords: [ + 'a', + 'blood', + ], + }, + { + code: 'šŸ†Ž', + keywords: [ + 'ab', + 'blood', + ], + }, + { + code: 'šŸ…±', + keywords: [ + 'b', + 'blood', + ], + }, + { + code: 'šŸ†‘', + keywords: [ + 'cl', + ], + }, + { + code: 'šŸ†’', + keywords: [ + 'cool', + ], + }, + { + code: 'šŸ†“', + keywords: [ + 'free', + ], + }, + { + code: 'ā„¹', + keywords: [ + 'i', + 'information', + ], + }, + { + code: 'šŸ†”', + keywords: [ + 'id', + 'identity', + ], + }, + { + code: 'ā“‚', + keywords: [ + 'circle', + 'm', + ], + }, + { + code: 'šŸ†•', + keywords: [ + 'new', + ], + }, + { + code: 'šŸ†–', + keywords: [ + 'ng', + ], + }, + { + code: 'šŸ…¾', + keywords: [ + 'blood', + 'o', + ], + }, + { + code: 'šŸ†—', + keywords: [ + 'ok', + ], + }, + { + code: 'šŸ…æ', + keywords: [ + 'parking', + ], + }, + { + code: 'šŸ†˜', + keywords: [ + 'help', + 'sos', + ], + }, + { + code: 'šŸ†™', + keywords: [ + 'mark', + 'up', + ], + }, + { + code: 'šŸ†š', + keywords: [ + 'versus', + 'vs', + ], + }, + { + code: 'šŸˆ', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸˆ‚', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸˆ·', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸˆ¶', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸˆÆ', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸ‰', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸˆ¹', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸˆš', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸˆ²', + keywords: [ + 'japanese', + ], + }, + { + code: 'šŸ‰‘', + keywords: [ + 'chinese', + ], + }, + { + code: 'šŸˆø', + keywords: [ + 'chinese', + ], + }, + { + code: 'šŸˆ“', + keywords: [ + 'chinese', + ], + }, + { + code: 'šŸˆ³', + keywords: [ + 'chinese', + ], + }, + { + code: '抗', + keywords: [ + 'chinese', + 'congratulation', + 'congratulations', + 'ideograph', + ], + }, + { + code: '抙', + keywords: [ + 'chinese', + 'ideograph', + 'secret', + ], + }, + { + code: 'šŸˆŗ', + keywords: [ + 'chinese', + ], + }, + { + code: 'šŸˆµ', + keywords: [ + 'chinese', + ], + }, + { + code: 'ā–Ŗ', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'ā–«', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'ā—»', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'ā—¼', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'ā—½', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'ā—¾', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'ā¬›', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'ā¬œ', + keywords: [ + 'geometric', + 'square', + ], + }, + { + code: 'šŸ”¶', + keywords: [ + 'diamond', + 'geometric', + 'orange', + ], + }, + { + code: 'šŸ”·', + keywords: [ + 'blue', + 'diamond', + 'geometric', + ], + }, + { + code: 'šŸ”ø', + keywords: [ + 'diamond', + 'geometric', + 'orange', + ], + }, + { + code: 'šŸ”¹', + keywords: [ + 'blue', + 'diamond', + 'geometric', + ], + }, + { + code: 'šŸ”ŗ', + keywords: [ + 'geometric', + 'red', + ], + }, + { + code: 'šŸ”»', + keywords: [ + 'down', + 'geometric', + 'red', + ], + }, + { + code: 'šŸ’ ', + keywords: [ + 'comic', + 'diamond', + 'geometric', + 'inside', + ], + }, + { + code: 'šŸ”˜', + keywords: [ + 'button', + 'geometric', + 'radio', + ], + }, + { + code: 'šŸ”²', + keywords: [ + 'button', + 'geometric', + 'square', + ], + }, + { + code: 'šŸ”³', + keywords: [ + 'button', + 'geometric', + 'outlined', + 'square', + ], + }, + { + code: 'āšŖ', + keywords: [ + 'circle', + 'geometric', + ], + }, + { + code: 'āš«', + keywords: [ + 'circle', + 'geometric', + ], + }, + { + code: 'šŸ”“', + keywords: [ + 'circle', + 'geometric', + 'red', + ], + }, + { + code: 'šŸ”µ', + keywords: [ + 'blue', + 'circle', + 'geometric', + ], + }, + { + code: 'Flags', + header: true, + }, + { + code: 'šŸ', + keywords: [ + 'checkered', + 'chequered', + 'flag', + 'racing', + ], + }, + { + code: 'šŸš©', + keywords: [ + 'flag', + 'post', + ], + }, + { + code: 'šŸŽŒ', + keywords: [ + 'activity', + 'celebration', + 'cross', + 'crossed', + 'flag', + 'japanese', + ], + }, + { + code: 'šŸ“', + keywords: [ + 'flag', + 'waving', + ], + }, + { + code: 'šŸ³', + keywords: [ + 'flag', + 'waving', + ], + }, + { + code: 'šŸ‡¦šŸ‡Ø', + keywords: [ + 'ascension', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡¦šŸ‡©', + keywords: [ + 'andorra', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡Ŗ', + keywords: [ + 'emirates', + 'flag', + 'uae', + 'united', + ], + }, + { + code: 'šŸ‡¦šŸ‡«', + keywords: [ + 'afghanistan', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡¬', + keywords: [ + 'antigua', + 'barbuda', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡®', + keywords: [ + 'anguilla', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡±', + keywords: [ + 'albania', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡²', + keywords: [ + 'armenia', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡“', + keywords: [ + 'angola', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡¶', + keywords: [ + 'antarctica', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡·', + keywords: [ + 'argentina', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡ø', + keywords: [ + 'american', + 'flag', + 'samoa', + ], + }, + { + code: 'šŸ‡¦šŸ‡¹', + keywords: [ + 'austria', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡ŗ', + keywords: [ + 'australia', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡¼', + keywords: [ + 'aruba', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡½', + keywords: [ + 'Ć„land', + 'flag', + ], + }, + { + code: 'šŸ‡¦šŸ‡æ', + keywords: [ + 'azerbaijan', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡¦', + keywords: [ + 'bosnia', + 'flag', + 'herzegovina', + ], + }, + { + code: 'šŸ‡§šŸ‡§', + keywords: [ + 'barbados', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡©', + keywords: [ + 'bangladesh', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡Ŗ', + keywords: [ + 'belgium', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡«', + keywords: [ + 'burkina faso', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡¬', + keywords: [ + 'bulgaria', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡­', + keywords: [ + 'bahrain', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡®', + keywords: [ + 'burundi', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡Æ', + keywords: [ + 'benin', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡±', + keywords: [ + 'barthelemy', + 'barthĆ©lemy', + 'flag', + 'saint', + ], + }, + { + code: 'šŸ‡§šŸ‡²', + keywords: [ + 'bermuda', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡³', + keywords: [ + 'brunei', + 'darussalam', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡“', + keywords: [ + 'bolivia', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡¶', + keywords: [ + 'bonaire', + 'caribbean', + 'eustatius', + 'flag', + 'netherlands', + 'saba', + 'sint', + ], + }, + { + code: 'šŸ‡§šŸ‡·', + keywords: [ + 'brazil', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡ø', + keywords: [ + 'bahamas', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡¹', + keywords: [ + 'bhutan', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡»', + keywords: [ + 'bouvet', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡§šŸ‡¼', + keywords: [ + 'botswana', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡¾', + keywords: [ + 'belarus', + 'flag', + ], + }, + { + code: 'šŸ‡§šŸ‡æ', + keywords: [ + 'belize', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡¦', + keywords: [ + 'canada', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡Ø', + keywords: [ + 'cocos', + 'flag', + 'island', + 'keeling', + ], + }, + { + code: 'šŸ‡ØšŸ‡©', + keywords: [ + 'congo', + 'congo-kinshasa', + 'democratic republic of congo', + 'drc', + 'flag', + 'kinshasa', + 'republic', + ], + }, + { + code: 'šŸ‡ØšŸ‡«', + keywords: [ + 'central african republic', + 'flag', + 'republic', + ], + }, + { + code: 'šŸ‡ØšŸ‡¬', + keywords: [ + 'brazzaville', + 'congo', + 'congo republic', + 'congo-brazzaville', + 'flag', + 'republic', + 'republic of the congo', + ], + }, + { + code: 'šŸ‡ØšŸ‡­', + keywords: [ + 'flag', + 'switzerland', + ], + }, + { + code: 'šŸ‡ØšŸ‡®', + keywords: [ + 'cote ivoire', + 'cĆ“te ivoire', + 'flag', + 'ivory coast', + ], + }, + { + code: 'šŸ‡ØšŸ‡°', + keywords: [ + 'cook', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡ØšŸ‡±', + keywords: [ + 'chile', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡²', + keywords: [ + 'cameroon', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡³', + keywords: [ + 'china', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡“', + keywords: [ + 'colombia', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡µ', + keywords: [ + 'clipperton', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡ØšŸ‡·', + keywords: [ + 'costa rica', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡ŗ', + keywords: [ + 'cuba', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡»', + keywords: [ + 'cabo', + 'cape', + 'flag', + 'verde', + ], + }, + { + code: 'šŸ‡ØšŸ‡¼', + keywords: [ + 'antilles', + 'curacao', + 'curaƧao', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡½', + keywords: [ + 'christmas', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡ØšŸ‡¾', + keywords: [ + 'cyprus', + 'flag', + ], + }, + { + code: 'šŸ‡ØšŸ‡æ', + keywords: [ + 'czech republic', + 'flag', + ], + }, + { + code: 'šŸ‡©šŸ‡Ŗ', + keywords: [ + 'flag', + 'germany', + ], + }, + { + code: 'šŸ‡©šŸ‡¬', + keywords: [ + 'diego garcia', + 'flag', + ], + }, + { + code: 'šŸ‡©šŸ‡Æ', + keywords: [ + 'djibouti', + 'flag', + ], + }, + { + code: 'šŸ‡©šŸ‡°', + keywords: [ + 'denmark', + 'flag', + ], + }, + { + code: 'šŸ‡©šŸ‡²', + keywords: [ + 'dominica', + 'flag', + ], + }, + { + code: 'šŸ‡©šŸ‡“', + keywords: [ + 'dominican republic', + 'flag', + ], + }, + { + code: 'šŸ‡©šŸ‡æ', + keywords: [ + 'algeria', + 'flag', + ], + }, + { + code: 'šŸ‡ŖšŸ‡¦', + keywords: [ + 'ceuta', + 'flag', + 'melilla', + ], + }, + { + code: 'šŸ‡ŖšŸ‡Ø', + keywords: [ + 'ecuador', + 'flag', + ], + }, + { + code: 'šŸ‡ŖšŸ‡Ŗ', + keywords: [ + 'estonia', + 'flag', + ], + }, + { + code: 'šŸ‡ŖšŸ‡¬', + keywords: [ + 'egypt', + 'flag', + ], + }, + { + code: 'šŸ‡ŖšŸ‡­', + keywords: [ + 'flag', + 'sahara', + 'west', + 'western sahara', + ], + }, + { + code: 'šŸ‡ŖšŸ‡·', + keywords: [ + 'eritrea', + 'flag', + ], + }, + { + code: 'šŸ‡ŖšŸ‡ø', + keywords: [ + 'flag', + 'spain', + ], + }, + { + code: 'šŸ‡ŖšŸ‡¹', + keywords: [ + 'ethiopia', + 'flag', + ], + }, + { + code: 'šŸ‡ŖšŸ‡ŗ', + keywords: [ + 'european union', + 'flag', + ], + }, + { + code: 'šŸ‡«šŸ‡®', + keywords: [ + 'finland', + 'flag', + ], + }, + { + code: 'šŸ‡«šŸ‡Æ', + keywords: [ + 'fiji', + 'flag', + ], + }, + { + code: 'šŸ‡«šŸ‡°', + keywords: [ + 'falkland', + 'falklands', + 'flag', + 'island', + 'islas', + 'malvinas', + ], + }, + { + code: 'šŸ‡«šŸ‡²', + keywords: [ + 'flag', + 'micronesia', + ], + }, + { + code: 'šŸ‡«šŸ‡“', + keywords: [ + 'faroe', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡«šŸ‡·', + keywords: [ + 'flag', + 'france', + ], + }, + { + code: 'šŸ‡¬šŸ‡¦', + keywords: [ + 'flag', + 'gabon', + ], + }, + { + code: 'šŸ‡¬šŸ‡§', + keywords: [ + 'britain', + 'british', + 'cornwall', + 'england', + 'flag', + 'great britain', + 'ireland', + 'northern ireland', + 'scotland', + 'uk', + 'union jack', + 'united', + 'united kingdom', + 'wales', + ], + }, + { + code: 'šŸ‡¬šŸ‡©', + keywords: [ + 'flag', + 'grenada', + ], + }, + { + code: 'šŸ‡¬šŸ‡Ŗ', + keywords: [ + 'flag', + 'georgia', + ], + }, + { + code: 'šŸ‡¬šŸ‡«', + keywords: [ + 'flag', + 'french', + 'guiana', + ], + }, + { + code: 'šŸ‡¬šŸ‡¬', + keywords: [ + 'flag', + 'guernsey', + ], + }, + { + code: 'šŸ‡¬šŸ‡­', + keywords: [ + 'flag', + 'ghana', + ], + }, + { + code: 'šŸ‡¬šŸ‡®', + keywords: [ + 'flag', + 'gibraltar', + ], + }, + { + code: 'šŸ‡¬šŸ‡±', + keywords: [ + 'flag', + 'greenland', + ], + }, + { + code: 'šŸ‡¬šŸ‡²', + keywords: [ + 'flag', + 'gambia', + ], + }, + { + code: 'šŸ‡¬šŸ‡³', + keywords: [ + 'flag', + 'guinea', + ], + }, + { + code: 'šŸ‡¬šŸ‡µ', + keywords: [ + 'flag', + 'guadeloupe', + ], + }, + { + code: 'šŸ‡¬šŸ‡¶', + keywords: [ + 'equatorial guinea', + 'flag', + 'guinea', + ], + }, + { + code: 'šŸ‡¬šŸ‡·', + keywords: [ + 'flag', + 'greece', + ], + }, + { + code: 'šŸ‡¬šŸ‡ø', + keywords: [ + 'flag', + 'georgia', + 'island', + 'south', + 'south georgia', + 'south sandwich', + ], + }, + { + code: 'šŸ‡¬šŸ‡¹', + keywords: [ + 'flag', + 'guatemala', + ], + }, + { + code: 'šŸ‡¬šŸ‡ŗ', + keywords: [ + 'flag', + 'guam', + ], + }, + { + code: 'šŸ‡¬šŸ‡¼', + keywords: [ + 'bissau', + 'flag', + 'guinea', + ], + }, + { + code: 'šŸ‡¬šŸ‡¾', + keywords: [ + 'flag', + 'guyana', + ], + }, + { + code: 'šŸ‡­šŸ‡°', + keywords: [ + 'china', + 'flag', + 'hong kong', + ], + }, + { + code: 'šŸ‡­šŸ‡²', + keywords: [ + 'flag', + 'heard', + 'island', + 'mcdonald', + ], + }, + { + code: 'šŸ‡­šŸ‡³', + keywords: [ + 'flag', + 'honduras', + ], + }, + { + code: 'šŸ‡­šŸ‡·', + keywords: [ + 'croatia', + 'flag', + ], + }, + { + code: 'šŸ‡­šŸ‡¹', + keywords: [ + 'flag', + 'haiti', + ], + }, + { + code: 'šŸ‡­šŸ‡ŗ', + keywords: [ + 'flag', + 'hungary', + ], + }, + { + code: 'šŸ‡®šŸ‡Ø', + keywords: [ + 'canary', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡®šŸ‡©', + keywords: [ + 'flag', + 'indonesia', + ], + }, + { + code: 'šŸ‡®šŸ‡Ŗ', + keywords: [ + 'flag', + 'ireland', + ], + }, + { + code: 'šŸ‡®šŸ‡±', + keywords: [ + 'flag', + 'israel', + ], + }, + { + code: 'šŸ‡®šŸ‡²', + keywords: [ + 'flag', + 'isle of man', + ], + }, + { + code: 'šŸ‡®šŸ‡³', + keywords: [ + 'flag', + 'india', + ], + }, + { + code: 'šŸ‡®šŸ‡“', + keywords: [ + 'british', + 'chagos', + 'flag', + 'indian ocean', + 'island', + ], + }, + { + code: 'šŸ‡®šŸ‡¶', + keywords: [ + 'flag', + 'iraq', + ], + }, + { + code: 'šŸ‡®šŸ‡·', + keywords: [ + 'flag', + 'iran', + ], + }, + { + code: 'šŸ‡®šŸ‡ø', + keywords: [ + 'flag', + 'iceland', + ], + }, + { + code: 'šŸ‡®šŸ‡¹', + keywords: [ + 'flag', + 'italy', + ], + }, + { + code: 'šŸ‡ÆšŸ‡Ŗ', + keywords: [ + 'flag', + 'jersey', + ], + }, + { + code: 'šŸ‡ÆšŸ‡²', + keywords: [ + 'flag', + 'jamaica', + ], + }, + { + code: 'šŸ‡ÆšŸ‡“', + keywords: [ + 'flag', + 'jordan', + ], + }, + { + code: 'šŸ‡ÆšŸ‡µ', + keywords: [ + 'flag', + 'japan', + ], + }, + { + code: 'šŸ‡°šŸ‡Ŗ', + keywords: [ + 'flag', + 'kenya', + ], + }, + { + code: 'šŸ‡°šŸ‡¬', + keywords: [ + 'flag', + 'kyrgyzstan', + ], + }, + { + code: 'šŸ‡°šŸ‡­', + keywords: [ + 'cambodia', + 'flag', + ], + }, + { + code: 'šŸ‡°šŸ‡®', + keywords: [ + 'flag', + 'kiribati', + ], + }, + { + code: 'šŸ‡°šŸ‡²', + keywords: [ + 'comoros', + 'flag', + ], + }, + { + code: 'šŸ‡°šŸ‡³', + keywords: [ + 'flag', + 'kitts', + 'nevis', + 'saint', + ], + }, + { + code: 'šŸ‡°šŸ‡µ', + keywords: [ + 'flag', + 'korea', + 'north', + 'north korea', + ], + }, + { + code: 'šŸ‡°šŸ‡·', + keywords: [ + 'flag', + 'korea', + 'south', + 'south korea', + ], + }, + { + code: 'šŸ‡°šŸ‡¼', + keywords: [ + 'flag', + 'kuwait', + ], + }, + { + code: 'šŸ‡°šŸ‡¾', + keywords: [ + 'cayman', + 'flag', + 'island', + ], + }, + { + code: 'šŸ‡°šŸ‡æ', + keywords: [ + 'flag', + 'kazakhstan', + ], + }, + { + code: 'šŸ‡±šŸ‡¦', + keywords: [ + 'flag', + 'laos', + ], + }, + { + code: 'šŸ‡±šŸ‡§', + keywords: [ + 'flag', + 'lebanon', + ], + }, + { + code: 'šŸ‡±šŸ‡Ø', + keywords: [ + 'flag', + 'lucia', + 'saint', + ], + }, + { + code: 'šŸ‡±šŸ‡®', + keywords: [ + 'flag', + 'liechtenstein', + ], + }, + { + code: 'šŸ‡±šŸ‡°', + keywords: [ + 'flag', + 'sri lanka', + ], + }, + { + code: 'šŸ‡±šŸ‡·', + keywords: [ + 'flag', + 'liberia', + ], + }, + { + code: 'šŸ‡±šŸ‡ø', + keywords: [ + 'flag', + 'lesotho', + ], + }, + { + code: 'šŸ‡±šŸ‡¹', + keywords: [ + 'flag', + 'lithuania', + ], + }, + { + code: 'šŸ‡±šŸ‡ŗ', + keywords: [ + 'flag', + 'luxembourg', + ], + }, + { + code: 'šŸ‡±šŸ‡»', + keywords: [ + 'flag', + 'latvia', + ], + }, + { + code: 'šŸ‡±šŸ‡¾', + keywords: [ + 'flag', + 'libya', + ], + }, + { + code: 'šŸ‡²šŸ‡¦', + keywords: [ + 'flag', + 'morocco', + ], + }, + { + code: 'šŸ‡²šŸ‡Ø', + keywords: [ + 'flag', + 'monaco', + ], + }, + { + code: 'šŸ‡²šŸ‡©', + keywords: [ + 'flag', + 'moldova', + ], + }, + { + code: 'šŸ‡²šŸ‡Ŗ', + keywords: [ + 'flag', + 'montenegro', + ], + }, + { + code: 'šŸ‡²šŸ‡«', + keywords: [ + 'flag', + 'french', + 'martin', + 'saint', + ], + }, + { + code: 'šŸ‡²šŸ‡¬', + keywords: [ + 'flag', + 'madagascar', + ], + }, + { + code: 'šŸ‡²šŸ‡­', + keywords: [ + 'flag', + 'island', + 'marshall', + ], + }, + { + code: 'šŸ‡²šŸ‡°', + keywords: [ + 'flag', + 'macedonia', + ], + }, + { + code: 'šŸ‡²šŸ‡±', + keywords: [ + 'flag', + 'mali', + ], + }, + { + code: 'šŸ‡²šŸ‡²', + keywords: [ + 'burma', + 'flag', + 'myanmar', + ], + }, + { + code: 'šŸ‡²šŸ‡³', + keywords: [ + 'flag', + 'mongolia', + ], + }, + { + code: 'šŸ‡²šŸ‡“', + keywords: [ + 'china', + 'flag', + 'macao', + 'macau', + ], + }, + { + code: 'šŸ‡²šŸ‡µ', + keywords: [ + 'flag', + 'island', + 'mariana', + 'north', + 'northern mariana', + ], + }, + { + code: 'šŸ‡²šŸ‡¶', + keywords: [ + 'flag', + 'martinique', + ], + }, + { + code: 'šŸ‡²šŸ‡·', + keywords: [ + 'flag', + 'mauritania', + ], + }, + { + code: 'šŸ‡²šŸ‡ø', + keywords: [ + 'flag', + 'montserrat', + ], + }, + { + code: 'šŸ‡²šŸ‡¹', + keywords: [ + 'flag', + 'malta', + ], + }, + { + code: 'šŸ‡²šŸ‡ŗ', + keywords: [ + 'flag', + 'mauritius', + ], + }, + { + code: 'šŸ‡²šŸ‡»', + keywords: [ + 'flag', + 'maldives', + ], + }, + { + code: 'šŸ‡²šŸ‡¼', + keywords: [ + 'flag', + 'malawi', + ], + }, + { + code: 'šŸ‡²šŸ‡½', + keywords: [ + 'flag', + 'mexico', + ], + }, + { + code: 'šŸ‡²šŸ‡¾', + keywords: [ + 'flag', + 'malaysia', + ], + }, + { + code: 'šŸ‡²šŸ‡æ', + keywords: [ + 'flag', + 'mozambique', + ], + }, + { + code: 'šŸ‡³šŸ‡¦', + keywords: [ + 'flag', + 'namibia', + ], + }, + { + code: 'šŸ‡³šŸ‡Ø', + keywords: [ + 'flag', + 'new', + 'new caledonia', + ], + }, + { + code: 'šŸ‡³šŸ‡Ŗ', + keywords: [ + 'flag', + 'niger', + ], + }, + { + code: 'šŸ‡³šŸ‡«', + keywords: [ + 'flag', + 'island', + 'norfolk', + ], + }, + { + code: 'šŸ‡³šŸ‡¬', + keywords: [ + 'flag', + 'nigeria', + ], + }, + { + code: 'šŸ‡³šŸ‡®', + keywords: [ + 'flag', + 'nicaragua', + ], + }, + { + code: 'šŸ‡³šŸ‡±', + keywords: [ + 'flag', + 'netherlands', + ], + }, + { + code: 'šŸ‡³šŸ‡“', + keywords: [ + 'flag', + 'norway', + ], + }, + { + code: 'šŸ‡³šŸ‡µ', + keywords: [ + 'flag', + 'nepal', + ], + }, + { + code: 'šŸ‡³šŸ‡·', + keywords: [ + 'flag', + 'nauru', + ], + }, + { + code: 'šŸ‡³šŸ‡ŗ', + keywords: [ + 'flag', + 'niue', + ], + }, + { + code: 'šŸ‡³šŸ‡æ', + keywords: [ + 'flag', + 'new', + 'new zealand', + ], + }, + { + code: 'šŸ‡“šŸ‡²', + keywords: [ + 'flag', + 'oman', + ], + }, + { + code: 'šŸ‡µšŸ‡¦', + keywords: [ + 'flag', + 'panama', + ], + }, + { + code: 'šŸ‡µšŸ‡Ŗ', + keywords: [ + 'flag', + 'peru', + ], + }, + { + code: 'šŸ‡µšŸ‡«', + keywords: [ + 'flag', + 'french', + 'polynesia', + ], + }, + { + code: 'šŸ‡µšŸ‡¬', + keywords: [ + 'flag', + 'guinea', + 'new', + 'papua new guinea', + ], + }, + { + code: 'šŸ‡µšŸ‡­', + keywords: [ + 'flag', + 'philippines', + ], + }, + { + code: 'šŸ‡µšŸ‡°', + keywords: [ + 'flag', + 'pakistan', + ], + }, + { + code: 'šŸ‡µšŸ‡±', + keywords: [ + 'flag', + 'poland', + ], + }, + { + code: 'šŸ‡µšŸ‡²', + keywords: [ + 'flag', + 'miquelon', + 'pierre', + 'saint', + ], + }, + { + code: 'šŸ‡µšŸ‡³', + keywords: [ + 'flag', + 'island', + 'pitcairn', + ], + }, + { + code: 'šŸ‡µšŸ‡·', + keywords: [ + 'flag', + 'puerto rico', + ], + }, + { + code: 'šŸ‡µšŸ‡ø', + keywords: [ + 'flag', + 'palestine', + ], + }, + { + code: 'šŸ‡µšŸ‡¹', + keywords: [ + 'flag', + 'portugal', + ], + }, + { + code: 'šŸ‡µšŸ‡¼', + keywords: [ + 'flag', + 'palau', + ], + }, + { + code: 'šŸ‡µšŸ‡¾', + keywords: [ + 'flag', + 'paraguay', + ], + }, + { + code: 'šŸ‡¶šŸ‡¦', + keywords: [ + 'flag', + 'qatar', + ], + }, + { + code: 'šŸ‡·šŸ‡Ŗ', + keywords: [ + 'flag', + 'reunion', + 'rĆ©union', + ], + }, + { + code: 'šŸ‡·šŸ‡“', + keywords: [ + 'flag', + 'romania', + ], + }, + { + code: 'šŸ‡·šŸ‡ø', + keywords: [ + 'flag', + 'serbia', + ], + }, + { + code: 'šŸ‡·šŸ‡ŗ', + keywords: [ + 'flag', + 'russia', + ], + }, + { + code: 'šŸ‡·šŸ‡¼', + keywords: [ + 'flag', + 'rwanda', + ], + }, + { + code: 'šŸ‡øšŸ‡¦', + keywords: [ + 'flag', + 'saudi arabia', + ], + }, + { + code: 'šŸ‡øšŸ‡§', + keywords: [ + 'flag', + 'island', + 'solomon', + ], + }, + { + code: 'šŸ‡øšŸ‡Ø', + keywords: [ + 'flag', + 'seychelles', + ], + }, + { + code: 'šŸ‡øšŸ‡©', + keywords: [ + 'flag', + 'sudan', + ], + }, + { + code: 'šŸ‡øšŸ‡Ŗ', + keywords: [ + 'flag', + 'sweden', + ], + }, + { + code: 'šŸ‡øšŸ‡¬', + keywords: [ + 'flag', + 'singapore', + ], + }, + { + code: 'šŸ‡øšŸ‡­', + keywords: [ + 'flag', + 'helena', + 'saint', + ], + }, + { + code: 'šŸ‡øšŸ‡®', + keywords: [ + 'flag', + 'slovenia', + ], + }, + { + code: 'šŸ‡øšŸ‡Æ', + keywords: [ + 'flag', + 'jan mayen', + 'svalbard', + ], + }, + { + code: 'šŸ‡øšŸ‡°', + keywords: [ + 'flag', + 'slovakia', + ], + }, + { + code: 'šŸ‡øšŸ‡±', + keywords: [ + 'flag', + 'sierra leone', + ], + }, + { + code: 'šŸ‡øšŸ‡²', + keywords: [ + 'flag', + 'san marino', + ], + }, + { + code: 'šŸ‡øšŸ‡³', + keywords: [ + 'flag', + 'senegal', + ], + }, + { + code: 'šŸ‡øšŸ‡“', + keywords: [ + 'flag', + 'somalia', + ], + }, + { + code: 'šŸ‡øšŸ‡·', + keywords: [ + 'flag', + 'suriname', + ], + }, + { + code: 'šŸ‡øšŸ‡ø', + keywords: [ + 'flag', + 'south', + 'south sudan', + 'sudan', + ], + }, + { + code: 'šŸ‡øšŸ‡¹', + keywords: [ + 'flag', + 'principe', + 'prĆ­ncipe', + 'sao tome', + 'sĆ£o tomĆ©', + ], + }, + { + code: 'šŸ‡øšŸ‡»', + keywords: [ + 'el salvador', + 'flag', + ], + }, + { + code: 'šŸ‡øšŸ‡½', + keywords: [ + 'flag', + 'maarten', + 'sint', + ], + }, + { + code: 'šŸ‡øšŸ‡¾', + keywords: [ + 'flag', + 'syria', + ], + }, + { + code: 'šŸ‡øšŸ‡æ', + keywords: [ + 'flag', + 'swaziland', + ], + }, + { + code: 'šŸ‡¹šŸ‡¦', + keywords: [ + 'flag', + 'tristan da cunha', + ], + }, + { + code: 'šŸ‡¹šŸ‡Ø', + keywords: [ + 'caicos', + 'flag', + 'island', + 'turks', + ], + }, + { + code: 'šŸ‡¹šŸ‡©', + keywords: [ + 'chad', + 'flag', + ], + }, + { + code: 'šŸ‡¹šŸ‡«', + keywords: [ + 'antarctic', + 'flag', + 'french', + ], + }, + { + code: 'šŸ‡¹šŸ‡¬', + keywords: [ + 'flag', + 'togo', + ], + }, + { + code: 'šŸ‡¹šŸ‡­', + keywords: [ + 'flag', + 'thailand', + ], + }, + { + code: 'šŸ‡¹šŸ‡Æ', + keywords: [ + 'flag', + 'tajikistan', + ], + }, + { + code: 'šŸ‡¹šŸ‡°', + keywords: [ + 'flag', + 'tokelau', + ], + }, + { + code: 'šŸ‡¹šŸ‡±', + keywords: [ + 'east', + 'east timor', + 'flag', + 'timor-leste', + ], + }, + { + code: 'šŸ‡¹šŸ‡²', + keywords: [ + 'flag', + 'turkmenistan', + ], + }, + { + code: 'šŸ‡¹šŸ‡³', + keywords: [ + 'flag', + 'tunisia', + ], + }, + { + code: 'šŸ‡¹šŸ‡“', + keywords: [ + 'flag', + 'tonga', + ], + }, + { + code: 'šŸ‡¹šŸ‡·', + keywords: [ + 'flag', + 'turkey', + ], + }, + { + code: 'šŸ‡¹šŸ‡¹', + keywords: [ + 'flag', + 'tobago', + 'trinidad', + ], + }, + { + code: 'šŸ‡¹šŸ‡»', + keywords: [ + 'flag', + 'tuvalu', + ], + }, + { + code: 'šŸ‡¹šŸ‡¼', + keywords: [ + 'china', + 'flag', + 'taiwan', + ], + }, + { + code: 'šŸ‡¹šŸ‡æ', + keywords: [ + 'flag', + 'tanzania', + ], + }, + { + code: 'šŸ‡ŗšŸ‡¦', + keywords: [ + 'flag', + 'ukraine', + ], + }, + { + code: 'šŸ‡ŗšŸ‡¬', + keywords: [ + 'flag', + 'uganda', + ], + }, + { + code: 'šŸ‡ŗšŸ‡²', + keywords: [ + 'america', + 'flag', + 'island', + 'minor outlying', + 'united', + 'united states', + 'us', + 'usa', + ], + }, + { + code: 'šŸ‡ŗšŸ‡ø', + keywords: [ + 'america', + 'flag', + 'stars and stripes', + 'united', + 'united states', + ], + }, + { + code: 'šŸ‡ŗšŸ‡¾', + keywords: [ + 'flag', + 'uruguay', + ], + }, + { + code: 'šŸ‡ŗšŸ‡æ', + keywords: [ + 'flag', + 'uzbekistan', + ], + }, + { + code: 'šŸ‡»šŸ‡¦', + keywords: [ + 'flag', + 'vatican', + ], + }, + { + code: 'šŸ‡»šŸ‡Ø', + keywords: [ + 'flag', + 'grenadines', + 'saint', + 'vincent', + ], + }, + { + code: 'šŸ‡»šŸ‡Ŗ', + keywords: [ + 'flag', + 'venezuela', + ], + }, + { + code: 'šŸ‡»šŸ‡¬', + keywords: [ + 'british', + 'flag', + 'island', + 'virgin', + ], + }, + { + code: 'šŸ‡»šŸ‡®', + keywords: [ + 'america', + 'american', + 'flag', + 'island', + 'united', + 'united states', + 'us', + 'usa', + 'virgin', + ], + }, + { + code: 'šŸ‡»šŸ‡³', + keywords: [ + 'flag', + 'viet nam', + 'vietnam', + ], + }, + { + code: 'šŸ‡»šŸ‡ŗ', + keywords: [ + 'flag', + 'vanuatu', + ], + }, + { + code: 'šŸ‡¼šŸ‡«', + keywords: [ + 'flag', + 'futuna', + 'wallis', + ], + }, + { + code: 'šŸ‡¼šŸ‡ø', + keywords: [ + 'flag', + 'samoa', + ], + }, + { + code: 'šŸ‡½šŸ‡°', + keywords: [ + 'flag', + 'kosovo', + ], + }, + { + code: 'šŸ‡¾šŸ‡Ŗ', + keywords: [ + 'flag', + 'yemen', + ], + }, + { + code: 'šŸ‡¾šŸ‡¹', + keywords: [ + 'flag', + 'mayotte', + ], + }, + { + code: 'šŸ‡æšŸ‡¦', + keywords: [ + 'flag', + 'south', + 'south africa', + ], + }, + { + code: 'šŸ‡æšŸ‡²', + keywords: [ + 'flag', + 'zambia', + ], + }, + { + code: 'šŸ‡æšŸ‡¼', + keywords: [ + 'flag', + 'zimbabwe', ], }, ]; From c17f51a6c7ea09724d780a52e4e8286b08ca23ac Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 22 Mar 2021 14:12:49 -0600 Subject: [PATCH 015/380] Add basic search --- src/pages/home/report/EmojiPickerMenu.js | 101 ++++++++++++++++++----- 1 file changed, 82 insertions(+), 19 deletions(-) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index a3779cc77f93..8dfc3d28ff40 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -1,12 +1,11 @@ -import React from 'react'; +import React, {Component} from 'react'; import {FlatList, Text} from 'react-native'; import PropTypes from 'prop-types'; import styles from '../../../styles/styles'; import themeColors from '../../../styles/themes/default'; - -import ReportActionContextMenuItem from './ReportActionContextMenuItem'; import emojis from '../../../../assets/emojis'; import EmojiPickerMenuItem from './EmojiPickerMenuItem'; +import TextInputFocusable from '../../../components/TextInputFocusable'; const propTypes = { // Controls the visibility of this component. @@ -18,22 +17,86 @@ const defaultProps = { isVisible: false, }; -const EmojiPickerMenu = props => ( - props.isVisible && ( - ( - - )} - keyExtractor={item => (`emoji_picker_${item.keywords[0]}`)} - numColumns={8} - style={{height: 300}} - /> - ) -); +class EmojiPickerMenu extends Component { + constructor(props) { + super(props); + + this.filterEmojis = this.filterEmojis.bind(this); + const headerIndices = []; + emojis.forEach((emoji, index) => { + if (emoji.header) { + headerIndices.push(index); + } + }); + this.state = { + filteredEmojis: emojis, + headerIndices, + }; + } + + filterEmojis(searchTerm) { + if (searchTerm === '') { + this.setState({filteredEmojis: emojis}); + return; + } + const newFilteredEmojiList = []; + emojis.forEach((emoji) => { + if (!emoji.header) { + emoji.keywords.forEach((keyword) => { + if (keyword.includes(searchTerm)) { + newFilteredEmojiList.push(emoji); + } + }); + } + }); + + this.setState({filteredEmojis: newFilteredEmojiList}); + } + + renderItem({item}, addEmojiToTextBox) { + if (item.header) { + return ( + + {item.code} + + ); + } + + return ( + + ); + } + + render() { + return ( + this.props.isVisible && ( + <> + this.setIsFocused(true)} + onBlur={() => this.setIsFocused(false)} + defaultValue="" + /> + this.renderItem(item, this.props.addEmojiToTextBox)} + keyExtractor={item => (`emoji_picker_${item.code}`)} + numColumns={8} + style={{height: 300}} + extraData={this.state.filteredEmojis} + stickyHeaderIndecies={this.state.headerIndices} + /> + + )); + } +} EmojiPickerMenu.propTypes = propTypes; EmojiPickerMenu.defaultProps = defaultProps; From 429764662b5282f098a13ce60c1ddf2f8377a387 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 22 Mar 2021 17:14:52 -0600 Subject: [PATCH 016/380] Add blank items to make the headers the only thing on their row --- assets/emojis.js | 237 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 237 insertions(+) diff --git a/assets/emojis.js b/assets/emojis.js index c162e7e491be..26d72f5763c5 100644 --- a/assets/emojis.js +++ b/assets/emojis.js @@ -29,6 +29,27 @@ const emojis = [ code: 'Smileys & People', header: true, }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, { code: 'šŸ˜€', keywords: [ @@ -2860,10 +2881,40 @@ const emojis = [ 'romance', ], }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, { code: 'Animals & Nature', header: true, }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, { code: 'šŸµ', keywords: [ @@ -4404,10 +4455,43 @@ const emojis = [ 'zodiac', ], }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, { code: 'Travel & Places', header: true, }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, { code: 'šŸŒ', keywords: [ @@ -6232,10 +6316,52 @@ const emojis = [ 'weather', ], }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, { code: 'Activities', header: true, }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, { code: 'šŸŽƒ', keywords: [ @@ -6974,10 +7100,43 @@ const emojis = [ 'playing', ], }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, { code: 'Objects', header: true, }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, { code: 'šŸ”‡', keywords: [ @@ -8385,10 +8544,49 @@ const emojis = [ 'trolley', ], }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, { code: 'Symbols', header: true, }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, { code: 'šŸ§', keywords: [ @@ -9983,10 +10181,49 @@ const emojis = [ 'geometric', ], }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, { code: 'Flags', header: true, }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, { code: 'šŸ', keywords: [ From 0d4862d15b4bde09f76cf27e939b75536ce2342a Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 22 Mar 2021 17:16:06 -0600 Subject: [PATCH 017/380] Update indicies to be static and add code to account for blank items --- src/pages/home/report/EmojiPickerMenu.js | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index 8dfc3d28ff40..09f1c58aec9f 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -22,15 +22,9 @@ class EmojiPickerMenu extends Component { super(props); this.filterEmojis = this.filterEmojis.bind(this); - const headerIndices = []; - emojis.forEach((emoji, index) => { - if (emoji.header) { - headerIndices.push(index); - } - }); this.state = { filteredEmojis: emojis, - headerIndices, + headerIndices: [0, 35, 61, 89, 100, 122, 149], }; } @@ -41,7 +35,7 @@ class EmojiPickerMenu extends Component { } const newFilteredEmojiList = []; emojis.forEach((emoji) => { - if (!emoji.header) { + if (!emoji.header && emoji.code !== 'BLANK') { emoji.keywords.forEach((keyword) => { if (keyword.includes(searchTerm)) { newFilteredEmojiList.push(emoji); @@ -54,9 +48,12 @@ class EmojiPickerMenu extends Component { } renderItem({item}, addEmojiToTextBox) { + if (item.code === 'BLANK') { + return; + } if (item.header) { return ( - + {item.code} ); @@ -80,9 +77,8 @@ class EmojiPickerMenu extends Component { placeholderTextColor={themeColors.textSupporting} onChangeText={this.filterEmojis} style={[styles.textInputCompose, styles.flex4]} - onFocus={() => this.setIsFocused(true)} - onBlur={() => this.setIsFocused(false)} defaultValue="" + ref={el => this.searchInput = el} /> )); From 885f5701e8ccaae14ed817c10c45249a25f15ba5 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 22 Mar 2021 18:30:47 -0600 Subject: [PATCH 018/380] Differentiate between pre-label blanks and post-label inline blanks --- assets/emojis.js | 98 ++++++++++++++++++++++++------------------------ 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/assets/emojis.js b/assets/emojis.js index 26d72f5763c5..b3555d38f0ab 100644 --- a/assets/emojis.js +++ b/assets/emojis.js @@ -30,25 +30,25 @@ const emojis = [ header: true, }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { code: 'šŸ˜€', @@ -2895,25 +2895,25 @@ const emojis = [ header: true, }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { code: 'šŸµ', @@ -4472,25 +4472,25 @@ const emojis = [ header: true, }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { code: 'šŸŒ', @@ -6342,25 +6342,25 @@ const emojis = [ header: true, }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { code: 'šŸŽƒ', @@ -7117,25 +7117,25 @@ const emojis = [ header: true, }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { code: 'šŸ”‡', @@ -8567,25 +8567,25 @@ const emojis = [ header: true, }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { code: 'šŸ§', @@ -10204,25 +10204,25 @@ const emojis = [ header: true, }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { - code: 'BLANK', + code: 'HEADER_BAR', }, { code: 'šŸ', From 0f8454fac554699f3e831d88d246f6a70e3ff73b Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 22 Mar 2021 18:35:54 -0600 Subject: [PATCH 019/380] Pad headers --- src/components/PopoverWithMeasuredContent.js | 4 ++-- src/pages/home/report/EmojiPickerMenu.js | 21 +++++++++++------ src/styles/styles.js | 24 ++++++++++++++++++++ 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/src/components/PopoverWithMeasuredContent.js b/src/components/PopoverWithMeasuredContent.js index 03c0ec0553e7..aed3fea94af5 100644 --- a/src/components/PopoverWithMeasuredContent.js +++ b/src/components/PopoverWithMeasuredContent.js @@ -85,7 +85,7 @@ class PopoverWithMeasuredContent extends Component { let horizontalConstraint; switch (this.props.anchorOrigin.horizontal) { case CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL.RIGHT: - horizontalConstraint = {left: this.props.anchorPosition.horizontal - this.popoverWidth}; + horizontalConstraint = {left: this.props.anchorPosition.horizontal - 300}; break; case CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL.CENTER: horizontalConstraint = { @@ -100,7 +100,7 @@ class PopoverWithMeasuredContent extends Component { let verticalConstraint; switch (this.props.anchorOrigin.vertical) { case CONST.MODAL.ANCHOR_ORIGIN_VERTICAL.BOTTOM: - verticalConstraint = {top: this.props.anchorPosition.vertical - this.popoverHeight}; + verticalConstraint = {top: this.props.anchorPosition.vertical - 300}; break; case CONST.MODAL.ANCHOR_ORIGIN_VERTICAL.CENTER: verticalConstraint = { diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index 09f1c58aec9f..ac177faf8a22 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -1,6 +1,7 @@ import React, {Component} from 'react'; -import {FlatList, Text} from 'react-native'; +import {View, FlatList, Text} from 'react-native'; import PropTypes from 'prop-types'; +import _ from 'underscore'; import styles from '../../../styles/styles'; import themeColors from '../../../styles/themes/default'; import emojis from '../../../../assets/emojis'; @@ -21,7 +22,7 @@ class EmojiPickerMenu extends Component { constructor(props) { super(props); - this.filterEmojis = this.filterEmojis.bind(this); + this.filterEmojis = _.debounce(this.filterEmojis.bind(this), 500, false); this.state = { filteredEmojis: emojis, headerIndices: [0, 35, 61, 89, 100, 122, 149], @@ -35,7 +36,7 @@ class EmojiPickerMenu extends Component { } const newFilteredEmojiList = []; emojis.forEach((emoji) => { - if (!emoji.header && emoji.code !== 'BLANK') { + if (!emoji.header && emoji.code !== 'BLANK' && emoji.code !== 'HEADER_BAR') { emoji.keywords.forEach((keyword) => { if (keyword.includes(searchTerm)) { newFilteredEmojiList.push(emoji); @@ -51,9 +52,15 @@ class EmojiPickerMenu extends Component { if (item.code === 'BLANK') { return; } + + if (item.code === 'HEADER_BAR') { + return ( + + ); + } if (item.header) { return ( - + {item.code} ); @@ -70,13 +77,13 @@ class EmojiPickerMenu extends Component { render() { return ( this.props.isVisible && ( - <> + this.searchInput = el} /> @@ -89,7 +96,7 @@ class EmojiPickerMenu extends Component { extraData={this.state.filteredEmojis} stickyHeaderIndices={this.state.headerIndices} /> - + )); } } diff --git a/src/styles/styles.js b/src/styles/styles.js index 00eab13925ab..ee39ddf0f005 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -739,6 +739,30 @@ const styles = { justifyContent: 'center', }, + textInputEmojiSearch: addOutlineWidth({ + backgroundColor: themeColors.componentBG, + borderColor: themeColors.border, + color: themeColors.text, + fontFamily: fontFamily.GTA, + fontSize: variables.fontSizeNormal, + borderWidth: 0, + borderRadius: 0, + height: 'auto', + + // On Android, multiline TextInput with height: 'auto' will show extra padding unless they are configured with + // paddingVertical: 0, alignSelf: 'center', and textAlignVertical: 'center' + + paddingHorizontal: 8, + marginVertical: 5, + paddingVertical: 0, + textAlignVertical: 'center', + }, 0), + + emojiHeaderStyle: { + backgroundColor: themeColors.hoverComponentBG, + fontWeight: 'bold', + }, + chatItemEmojiButton: { alignSelf: 'flex-end', borderRadius: 6, From f6b1ef689ab5d7616fa47f4749a28e8bad344205 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Tue, 23 Mar 2021 19:46:58 +0800 Subject: [PATCH 020/380] dry up and reduce the number of components --- ...PasswordFormWide.js => SetPasswordForm.js} | 45 ++------ .../SetPasswordForm/SetPasswordFormNarrow.js | 106 ------------------ .../setpassword/SetPasswordForm/index.js | 20 ---- .../SetPasswordForm/index.native.js | 3 - src/pages/setpassword/SetPasswordPage.js | 54 ++++++--- 5 files changed, 53 insertions(+), 175 deletions(-) rename src/pages/setpassword/{SetPasswordForm/SetPasswordFormWide.js => SetPasswordForm.js} (57%) delete mode 100644 src/pages/setpassword/SetPasswordForm/SetPasswordFormNarrow.js delete mode 100644 src/pages/setpassword/SetPasswordForm/index.js delete mode 100644 src/pages/setpassword/SetPasswordForm/index.native.js diff --git a/src/pages/setpassword/SetPasswordForm/SetPasswordFormWide.js b/src/pages/setpassword/SetPasswordForm.js similarity index 57% rename from src/pages/setpassword/SetPasswordForm/SetPasswordFormWide.js rename to src/pages/setpassword/SetPasswordForm.js index 0ea1518228b1..3a548f5ba528 100644 --- a/src/pages/setpassword/SetPasswordForm/SetPasswordFormWide.js +++ b/src/pages/setpassword/SetPasswordForm.js @@ -1,20 +1,15 @@ -import React from 'react'; -import { - Text, TextInput, View, -} from 'react-native'; -import {withOnyx} from 'react-native-onyx'; +import {Text, TextInput, View} from 'react-native'; import _ from 'underscore'; +import React from 'react'; import lodashGet from 'lodash.get'; -import styles from '../../../styles/styles'; -import ButtonWithLoader from '../../../components/ButtonWithLoader'; -import {setPassword} from '../../../libs/actions/Session'; -import ONYXKEYS from '../../../ONYXKEYS'; -import SetPasswordPageProps from '../SetPasswordPageProps'; +import styles from '../../styles/styles'; +import ButtonWithLoader from '../../components/ButtonWithLoader'; +import {setPassword} from '../../libs/actions/Session'; +import SetPasswordPageProps from './SetPasswordPageProps'; -class SetPasswordFormWide extends React.Component { +class SetPasswordForm extends React.Component { constructor(props) { super(props); - this.submitForm = this.submitForm.bind(this); this.state = { @@ -42,7 +37,7 @@ class SetPasswordFormWide extends React.Component { render() { return ( - + <> Enter a password: )} - - - - - With Expensify.cash, chat and payments are the same thing. - - - Money talks. And now that chat and payments are in one place, it's also easy. - {' '} - Your payments get to you as fast as you can get your point across. - - - - + ); } } -SetPasswordFormWide.propTypes = SetPasswordPageProps.propTypes; -SetPasswordFormWide.defaultProps = SetPasswordPageProps.defaultProps; +SetPasswordForm.propTypes = SetPasswordPageProps.propTypes; +SetPasswordForm.defaultProps = SetPasswordPageProps.defaultProps; -export default withOnyx({ - credentials: {key: ONYXKEYS.CREDENTIALS}, - account: {key: ONYXKEYS.ACCOUNT}, -})(SetPasswordFormWide); +export default SetPasswordForm; diff --git a/src/pages/setpassword/SetPasswordForm/SetPasswordFormNarrow.js b/src/pages/setpassword/SetPasswordForm/SetPasswordFormNarrow.js deleted file mode 100644 index 3091c3fe787b..000000000000 --- a/src/pages/setpassword/SetPasswordForm/SetPasswordFormNarrow.js +++ /dev/null @@ -1,106 +0,0 @@ -import React from 'react'; -import { - Image, - Text, TextInput, View, -} from 'react-native'; -import {withOnyx} from 'react-native-onyx'; -import _ from 'underscore'; -import lodashGet from 'lodash.get'; -import styles from '../../../styles/styles'; -import ButtonWithLoader from '../../../components/ButtonWithLoader'; -import {setPassword} from '../../../libs/actions/Session'; -import ONYXKEYS from '../../../ONYXKEYS'; -import SetPasswordPageProps from '../SetPasswordPageProps'; -import welcomeScreenshot from '../../../../assets/images/welcome-screenshot.png'; - -class SetPasswordFormNarrow extends React.Component { - constructor(props) { - super(props); - - this.submitForm = this.submitForm.bind(this); - - this.state = { - password: '', - formError: null, - }; - } - - /** - * Validate the form and then submit it - */ - submitForm() { - if (!this.state.password.trim()) { - this.setState({ - formError: 'Password cannot be blank', - }); - return; - } - - this.setState({ - formError: null, - }); - setPassword(this.state.password, lodashGet(this.props.route, 'params.validateCode', '')); - } - - render() { - return ( - - - Enter a password: - this.setState({password: text})} - onSubmitEditing={this.submitForm} - autoFocus - /> - - - {this.state.formError && ( - - {this.state.formError} - - )} - {!_.isEmpty(this.props.account.error) && ( - - {this.props.account.error} - - )} - - - - - - - - With Expensify.cash, chat and payments are the same thing. - - - Money talks. And now that chat and payments are in one place, it's also easy. - {' '} - Your payments get to you as fast as you can get your point across. - - - - ); - } -} - -SetPasswordFormNarrow.propTypes = SetPasswordPageProps.propTypes; -SetPasswordFormNarrow.defaultProps = SetPasswordPageProps.defaultProps; - -export default withOnyx({ - credentials: {key: ONYXKEYS.CREDENTIALS}, - account: {key: ONYXKEYS.ACCOUNT}, -})(SetPasswordFormNarrow); diff --git a/src/pages/setpassword/SetPasswordForm/index.js b/src/pages/setpassword/SetPasswordForm/index.js deleted file mode 100644 index 67360253a197..000000000000 --- a/src/pages/setpassword/SetPasswordForm/index.js +++ /dev/null @@ -1,20 +0,0 @@ -/* eslint-disable react/jsx-props-no-spreading */ -import React from 'react'; -import withWindowDimensions, {windowDimensionsPropTypes} from '../../../components/withWindowDimensions'; -import SetPasswordFormNarrow from './SetPasswordFormNarrow'; -import SetPasswordFormWide from './SetPasswordFormWide'; - -const propTypes = { - ...windowDimensionsPropTypes, -}; - -const SetPasswordForm = props => ( - !props.isSmallScreenWidth - ? - : -); - -SetPasswordForm.propTypes = propTypes; -SetPasswordForm.displayName = 'SetPasswordForm'; - -export default withWindowDimensions(SetPasswordForm); diff --git a/src/pages/setpassword/SetPasswordForm/index.native.js b/src/pages/setpassword/SetPasswordForm/index.native.js deleted file mode 100644 index 06a3d1aa9937..000000000000 --- a/src/pages/setpassword/SetPasswordForm/index.native.js +++ /dev/null @@ -1,3 +0,0 @@ -import SetPasswordFormNarrow from './SetPasswordFormNarrow'; - -export default SetPasswordFormNarrow; diff --git a/src/pages/setpassword/SetPasswordPage.js b/src/pages/setpassword/SetPasswordPage.js index 4f3d831d6dfb..63011349a6ce 100644 --- a/src/pages/setpassword/SetPasswordPage.js +++ b/src/pages/setpassword/SetPasswordPage.js @@ -1,22 +1,50 @@ import React from 'react'; -import {SafeAreaView} from 'react-native'; +import {SafeAreaView, Text, View, Image} from 'react-native'; import styles from '../../styles/styles'; import SignInPageLayout from '../signin/SignInPageLayout'; -import SetPasswordForm from './SetPasswordForm'; import SetPasswordPageProps from './SetPasswordPageProps'; +import welcomeScreenshot from '../../../assets/images/welcome-screenshot.png'; +import withWindowDimensions from '../../components/withWindowDimensions'; +import SetPasswordForm from './SetPasswordForm'; -const SetPasswordPage = props => ( - - - - - -); +const SetPasswordPage = (props) => { + const welcomeText = ( + + + With Expensify.cash, chat and payments are the same thing. + + + Money talks. And now that chat and payments are in one place, it's also easy. + {' '} + Your payments get to you as fast as you can get your point across. + + + ); + return ( + + + + + {props.isSmallScreenWidth && ( + + + + )} + {welcomeText} + + + + ); +}; SetPasswordPage.propTypes = SetPasswordPageProps.propTypes; SetPasswordPage.defaultProps = SetPasswordPageProps.defaultProps; -export default SetPasswordPage; +export default withWindowDimensions(SetPasswordPage); From 12b3938b6330aa27129855d6dfc581e9af0aa14d Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Tue, 23 Mar 2021 20:00:48 +0800 Subject: [PATCH 021/380] fix styles --- ios/ExpensifyCash.xcodeproj/project.pbxproj | 82 ++++++++++----------- ios/Podfile.lock | 2 +- src/pages/setpassword/SetPasswordPage.js | 6 +- 3 files changed, 45 insertions(+), 45 deletions(-) diff --git a/ios/ExpensifyCash.xcodeproj/project.pbxproj b/ios/ExpensifyCash.xcodeproj/project.pbxproj index 1cce13f3aa8e..c5a01d9565c0 100644 --- a/ios/ExpensifyCash.xcodeproj/project.pbxproj +++ b/ios/ExpensifyCash.xcodeproj/project.pbxproj @@ -13,17 +13,17 @@ 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 184256DF4A33056F828927C6 /* libPods-ExpensifyCash-ExpensifyCashTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 85425D131983D5EC5A012EF7 /* libPods-ExpensifyCash-ExpensifyCashTests.a */; }; 1E76D5212522316A005A268F /* GTAmericaExp-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = A5AAD008CBD84A6CAEB9AC97 /* GTAmericaExp-Bold.otf */; }; 1E76D5222522316A005A268F /* GTAmericaExp-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = 67D5C3A6A7FA417C8A853FC1 /* GTAmericaExp-Light.otf */; }; 1E76D5232522316A005A268F /* GTAmericaExp-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = AE65058949E14DA5A2D5435D /* GTAmericaExp-Medium.otf */; }; 1E76D5242522316A005A268F /* GTAmericaExp-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 8C7003903C1E4957824899BB /* GTAmericaExp-Regular.otf */; }; 1E76D5252522316A005A268F /* GTAmericaExp-Thin.otf in Resources */ = {isa = PBXBuildFile; fileRef = A292718541C841859D97DF2F /* GTAmericaExp-Thin.otf */; }; + 376CCF91B872607D190AF0F6 /* libPods-ExpensifyCash.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A679AD694BE9556E6B55BEA /* libPods-ExpensifyCash.a */; }; 425866037F4C482AAB46CB8B /* GTAmericaExp-BdIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = A8D6F2F722FD4E66A38EBBB6 /* GTAmericaExp-BdIt.otf */; }; 6856B78873B64C44A92E51DB /* GTAmericaExp-MdIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = DB5A1365442D4419AF6F08E5 /* GTAmericaExp-MdIt.otf */; }; 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; 8821A238A081483FA947BC4E /* GTAmericaExp-RgIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 918D7FEFF96242E6B5F5E14D /* GTAmericaExp-RgIt.otf */; }; - 8C86654500DCC843A74147B5 /* libPods-ExpensifyCash-ExpensifyCashTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ED2AB27DDDFCCE3CD100EA0C /* libPods-ExpensifyCash-ExpensifyCashTests.a */; }; - BB6CECBDA023256B6B955321 /* libPods-ExpensifyCash.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F2C8BDCC1FF0B64AE2DFC9B /* libPods-ExpensifyCash.a */; }; E9DF872D2525201700607FDC /* AirshipConfig.plist in Resources */ = {isa = PBXBuildFile; fileRef = E9DF872C2525201700607FDC /* AirshipConfig.plist */; }; /* End PBXBuildFile section */ @@ -49,25 +49,25 @@ 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = ExpensifyCash/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = ExpensifyCash/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = ExpensifyCash/main.m; sourceTree = ""; }; + 4A679AD694BE9556E6B55BEA /* libPods-ExpensifyCash.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ExpensifyCash.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 67D5C3A6A7FA417C8A853FC1 /* GTAmericaExp-Light.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Light.otf"; path = "../assets/fonts/GTAmericaExp-Light.otf"; sourceTree = ""; }; - 6F2C8BDCC1FF0B64AE2DFC9B /* libPods-ExpensifyCash.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ExpensifyCash.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 6B13CEF63D86C7980FA4F455 /* Pods-ExpensifyCash.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash.debug.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash/Pods-ExpensifyCash.debug.xcconfig"; sourceTree = ""; }; 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = ExpensifyCash/LaunchScreen.storyboard; sourceTree = ""; }; 8437A5A38F2047E0BCCD7C2F /* GTAmericaExpMono-Rg.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExpMono-Rg.otf"; path = "../assets/fonts/GTAmericaExpMono-Rg.otf"; sourceTree = ""; }; + 85425D131983D5EC5A012EF7 /* libPods-ExpensifyCash-ExpensifyCashTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ExpensifyCash-ExpensifyCashTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 8C7003903C1E4957824899BB /* GTAmericaExp-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Regular.otf"; path = "../assets/fonts/GTAmericaExp-Regular.otf"; sourceTree = ""; }; + 8CA0D27D73F4C48E98CCA0E9 /* Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash-ExpensifyCashTests/Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig"; sourceTree = ""; }; 918D7FEFF96242E6B5F5E14D /* GTAmericaExp-RgIt.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-RgIt.otf"; path = "../assets/fonts/GTAmericaExp-RgIt.otf"; sourceTree = ""; }; - A13EE2CFAF952F935D201D2F /* Pods-ExpensifyCash.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash.release.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash/Pods-ExpensifyCash.release.xcconfig"; sourceTree = ""; }; A292718541C841859D97DF2F /* GTAmericaExp-Thin.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Thin.otf"; path = "../assets/fonts/GTAmericaExp-Thin.otf"; sourceTree = ""; }; A5AAD008CBD84A6CAEB9AC97 /* GTAmericaExp-Bold.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Bold.otf"; path = "../assets/fonts/GTAmericaExp-Bold.otf"; sourceTree = ""; }; A8D6F2F722FD4E66A38EBBB6 /* GTAmericaExp-BdIt.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-BdIt.otf"; path = "../assets/fonts/GTAmericaExp-BdIt.otf"; sourceTree = ""; }; + A90FC01D757217791C4E9131 /* Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash-ExpensifyCashTests/Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig"; sourceTree = ""; }; AE65058949E14DA5A2D5435D /* GTAmericaExp-Medium.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Medium.otf"; path = "../assets/fonts/GTAmericaExp-Medium.otf"; sourceTree = ""; }; - AF728B3FCBC8C2731C4DA7B4 /* Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash-ExpensifyCashTests/Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig"; sourceTree = ""; }; DB5A1365442D4419AF6F08E5 /* GTAmericaExp-MdIt.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-MdIt.otf"; path = "../assets/fonts/GTAmericaExp-MdIt.otf"; sourceTree = ""; }; - E7967C67752432EA2031954F /* Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash-ExpensifyCashTests/Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig"; sourceTree = ""; }; E9DF872C2525201700607FDC /* AirshipConfig.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = AirshipConfig.plist; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; - ED2AB27DDDFCCE3CD100EA0C /* libPods-ExpensifyCash-ExpensifyCashTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ExpensifyCash-ExpensifyCashTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - F4BC0E78FF1E9BD8B2D38C66 /* Pods-ExpensifyCash.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash.debug.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash/Pods-ExpensifyCash.debug.xcconfig"; sourceTree = ""; }; + EDBB0DF39D0F431E9A26F613 /* Pods-ExpensifyCash.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash.release.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash/Pods-ExpensifyCash.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -75,7 +75,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 8C86654500DCC843A74147B5 /* libPods-ExpensifyCash-ExpensifyCashTests.a in Frameworks */, + 184256DF4A33056F828927C6 /* libPods-ExpensifyCash-ExpensifyCashTests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -83,7 +83,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BB6CECBDA023256B6B955321 /* libPods-ExpensifyCash.a in Frameworks */, + 376CCF91B872607D190AF0F6 /* libPods-ExpensifyCash.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -128,8 +128,8 @@ children = ( ED297162215061F000B7C4FE /* JavaScriptCore.framework */, ED2971642150620600B7C4FE /* JavaScriptCore.framework */, - 6F2C8BDCC1FF0B64AE2DFC9B /* libPods-ExpensifyCash.a */, - ED2AB27DDDFCCE3CD100EA0C /* libPods-ExpensifyCash-ExpensifyCashTests.a */, + 4A679AD694BE9556E6B55BEA /* libPods-ExpensifyCash.a */, + 85425D131983D5EC5A012EF7 /* libPods-ExpensifyCash-ExpensifyCashTests.a */, ); name = Frameworks; sourceTree = ""; @@ -185,10 +185,10 @@ EC29677F0A49C2946A495A33 /* Pods */ = { isa = PBXGroup; children = ( - F4BC0E78FF1E9BD8B2D38C66 /* Pods-ExpensifyCash.debug.xcconfig */, - A13EE2CFAF952F935D201D2F /* Pods-ExpensifyCash.release.xcconfig */, - AF728B3FCBC8C2731C4DA7B4 /* Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig */, - E7967C67752432EA2031954F /* Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig */, + 6B13CEF63D86C7980FA4F455 /* Pods-ExpensifyCash.debug.xcconfig */, + EDBB0DF39D0F431E9A26F613 /* Pods-ExpensifyCash.release.xcconfig */, + A90FC01D757217791C4E9131 /* Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig */, + 8CA0D27D73F4C48E98CCA0E9 /* Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -200,11 +200,11 @@ isa = PBXNativeTarget; buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "ExpensifyCashTests" */; buildPhases = ( - AEFD4743761AD0E2373D0494 /* [CP] Check Pods Manifest.lock */, + 31F29FE5E41ACA3441D1941B /* [CP] Check Pods Manifest.lock */, 00E356EA1AD99517003FC87E /* Sources */, 00E356EB1AD99517003FC87E /* Frameworks */, 00E356EC1AD99517003FC87E /* Resources */, - F2B8013B9E9ECAB2B509E702 /* [CP] Copy Pods Resources */, + C5DF5C3874F91B17AFCBCB52 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -220,15 +220,15 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ExpensifyCash" */; buildPhases = ( - 6A9F4436BADC311F14A4349F /* [CP] Check Pods Manifest.lock */, + 209CB27AD34BA50C3E1F4868 /* [CP] Check Pods Manifest.lock */, FD10A7F022414F080027D42C /* Start Packager */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - C9071365B664DE0D85DC5195 /* [CP] Copy Pods Resources */, - CF6259710B5A341870372EA2 /* [CP-User] [RNFB] Core Configuration */, - ED5B8E90A3384FC6A128FB95 /* [CP-User] [RNFB] Crashlytics Configuration */, + 3BD1D02836B845CFF3D9E447 /* [CP] Copy Pods Resources */, + B079B9CCBE57FB68AFC8F3B4 /* [CP-User] [RNFB] Core Configuration */, + F5D4F18823CA58548DB9253C /* [CP-User] [RNFB] Crashlytics Configuration */, ); buildRules = ( ); @@ -323,7 +323,7 @@ shellPath = /bin/sh; shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; }; - 6A9F4436BADC311F14A4349F /* [CP] Check Pods Manifest.lock */ = { + 209CB27AD34BA50C3E1F4868 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -345,7 +345,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - AEFD4743761AD0E2373D0494 /* [CP] Check Pods Manifest.lock */ = { + 31F29FE5E41ACA3441D1941B /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -367,7 +367,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - C9071365B664DE0D85DC5195 /* [CP] Copy Pods Resources */ = { + 3BD1D02836B845CFF3D9E447 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -495,7 +495,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ExpensifyCash/Pods-ExpensifyCash-resources.sh\"\n"; showEnvVarsInLog = 0; }; - CF6259710B5A341870372EA2 /* [CP-User] [RNFB] Core Configuration */ = { + B079B9CCBE57FB68AFC8F3B4 /* [CP-User] [RNFB] Core Configuration */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -505,17 +505,7 @@ shellPath = /bin/sh; shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\nset -e\n\n_MAX_LOOKUPS=2;\n_SEARCH_RESULT=''\n_RN_ROOT_EXISTS=''\n_CURRENT_LOOKUPS=1\n_JSON_ROOT=\"'react-native'\"\n_JSON_FILE_NAME='firebase.json'\n_JSON_OUTPUT_BASE64='e30=' # { }\n_CURRENT_SEARCH_DIR=${PROJECT_DIR}\n_PLIST_BUDDY=/usr/libexec/PlistBuddy\n_TARGET_PLIST=\"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\n_DSYM_PLIST=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n# plist arrays\n_PLIST_ENTRY_KEYS=()\n_PLIST_ENTRY_TYPES=()\n_PLIST_ENTRY_VALUES=()\n\nfunction setPlistValue {\n echo \"info: setting plist entry '$1' of type '$2' in file '$4'\"\n ${_PLIST_BUDDY} -c \"Add :$1 $2 '$3'\" $4 || echo \"info: '$1' already exists\"\n}\n\nfunction getFirebaseJsonKeyValue () {\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n ruby -e \"require 'rubygems';require 'json'; output=JSON.parse('$1'); puts output[$_JSON_ROOT]['$2']\"\n else\n echo \"\"\n fi;\n}\n\nfunction jsonBoolToYesNo () {\n if [[ $1 == \"false\" ]]; then\n echo \"NO\"\n elif [[ $1 == \"true\" ]]; then\n echo \"YES\"\n else echo \"NO\"\n fi\n}\n\necho \"info: -> RNFB build script started\"\necho \"info: 1) Locating ${_JSON_FILE_NAME} file:\"\n\nif [[ -z ${_CURRENT_SEARCH_DIR} ]]; then\n _CURRENT_SEARCH_DIR=$(pwd)\nfi;\n\nwhile true; do\n _CURRENT_SEARCH_DIR=$(dirname \"$_CURRENT_SEARCH_DIR\")\n if [[ \"$_CURRENT_SEARCH_DIR\" == \"/\" ]] || [[ ${_CURRENT_LOOKUPS} -gt ${_MAX_LOOKUPS} ]]; then break; fi;\n echo \"info: ($_CURRENT_LOOKUPS of $_MAX_LOOKUPS) Searching in '$_CURRENT_SEARCH_DIR' for a ${_JSON_FILE_NAME} file.\"\n _SEARCH_RESULT=$(find \"$_CURRENT_SEARCH_DIR\" -maxdepth 2 -name ${_JSON_FILE_NAME} -print | head -n 1)\n if [[ ${_SEARCH_RESULT} ]]; then\n echo \"info: ${_JSON_FILE_NAME} found at $_SEARCH_RESULT\"\n break;\n fi;\n _CURRENT_LOOKUPS=$((_CURRENT_LOOKUPS+1))\ndone\n\nif [[ ${_SEARCH_RESULT} ]]; then\n _JSON_OUTPUT_RAW=$(cat \"${_SEARCH_RESULT}\")\n _RN_ROOT_EXISTS=$(ruby -e \"require 'rubygems';require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]\" || echo '')\n\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n _JSON_OUTPUT_BASE64=$(python -c 'import json,sys,base64;print(base64.b64encode(json.dumps(json.loads(open('\"'${_SEARCH_RESULT}'\"').read())['${_JSON_ROOT}'])))' || echo \"e30=\")\n fi\n\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n\n # config.messaging_auto_init_enabled\n _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"messaging_auto_init_enabled\")\n if [[ $_MESSAGING_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseMessagingAutoInitEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_MESSAGING_AUTO_INIT\")\")\n fi\n\n # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful\n _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"crashlytics_disable_auto_disabler\")\n if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == \"true\" ]]; then\n echo \"Disabled Crashlytics auto disabler.\" # do nothing\n else\n _PLIST_ENTRY_KEYS+=(\"FirebaseCrashlyticsCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"NO\")\n fi\n\n # config.admob_delay_app_measurement_init\n _ADMOB_DELAY_APP_MEASUREMENT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"admob_delay_app_measurement_init\")\n if [[ $_ADMOB_DELAY_APP_MEASUREMENT == \"true\" ]]; then\n _PLIST_ENTRY_KEYS+=(\"GADDelayAppMeasurementInit\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"YES\")\n fi\n\n # config.admob_ios_app_id\n _ADMOB_IOS_APP_ID=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"admob_ios_app_id\")\n if [[ $_ADMOB_IOS_APP_ID ]]; then\n _PLIST_ENTRY_KEYS+=(\"GADApplicationIdentifier\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_ADMOB_IOS_APP_ID\")\n fi\nelse\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n echo \"warning: A firebase.json file was not found, whilst this file is optional it is recommended to include it to configure firebase services in React Native Firebase.\"\nfi;\n\necho \"info: 2) Injecting Info.plist entries: \"\n\n# Log out the keys we're adding\nfor i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n echo \" -> $i) ${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\"\ndone\n\nfor plist in \"${_TARGET_PLIST}\" \"${_DSYM_PLIST}\" ; do\n if [[ -f \"${plist}\" ]]; then\n\n # paths with spaces break the call to setPlistValue. temporarily modify\n # the shell internal field separator variable (IFS), which normally\n # includes spaces, to consist only of line breaks\n oldifs=$IFS\n IFS=\"\n\"\n\n for i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n setPlistValue \"${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\" \"${plist}\"\n done\n\n # restore the original internal field separator value\n IFS=$oldifs\n else\n echo \"warning: A Info.plist build output file was not found (${plist})\"\n fi\ndone\n\necho \"info: <- RNFB build script finished\"\n"; }; - ED5B8E90A3384FC6A128FB95 /* [CP-User] [RNFB] Crashlytics Configuration */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - name = "[CP-User] [RNFB] Crashlytics Configuration"; - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\nset -e\n\nif [[ ${PODS_ROOT} ]]; then\n echo \"info: Exec FirebaseCrashlytics Run from Pods\"\n \"${PODS_ROOT}/FirebaseCrashlytics/run\"\nelse\n echo \"info: Exec FirebaseCrashlytics Run from framework\"\n \"${PROJECT_DIR}/FirebaseCrashlytics.framework/run\"\nfi\n"; - }; - F2B8013B9E9ECAB2B509E702 /* [CP] Copy Pods Resources */ = { + C5DF5C3874F91B17AFCBCB52 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -643,6 +633,16 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ExpensifyCash-ExpensifyCashTests/Pods-ExpensifyCash-ExpensifyCashTests-resources.sh\"\n"; showEnvVarsInLog = 0; }; + F5D4F18823CA58548DB9253C /* [CP-User] [RNFB] Crashlytics Configuration */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + name = "[CP-User] [RNFB] Crashlytics Configuration"; + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\nset -e\n\nif [[ ${PODS_ROOT} ]]; then\n echo \"info: Exec FirebaseCrashlytics Run from Pods\"\n \"${PODS_ROOT}/FirebaseCrashlytics/run\"\nelse\n echo \"info: Exec FirebaseCrashlytics Run from framework\"\n \"${PROJECT_DIR}/FirebaseCrashlytics.framework/run\"\nfi\n"; + }; FD10A7F022414F080027D42C /* Start Packager */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -695,7 +695,7 @@ /* Begin XCBuildConfiguration section */ 00E356F61AD99517003FC87E /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AF728B3FCBC8C2731C4DA7B4 /* Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig */; + baseConfigurationReference = A90FC01D757217791C4E9131 /* Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -719,7 +719,7 @@ }; 00E356F71AD99517003FC87E /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E7967C67752432EA2031954F /* Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig */; + baseConfigurationReference = 8CA0D27D73F4C48E98CCA0E9 /* Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -741,7 +741,7 @@ }; 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F4BC0E78FF1E9BD8B2D38C66 /* Pods-ExpensifyCash.debug.xcconfig */; + baseConfigurationReference = 6B13CEF63D86C7980FA4F455 /* Pods-ExpensifyCash.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; @@ -773,7 +773,7 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A13EE2CFAF952F935D201D2F /* Pods-ExpensifyCash.release.xcconfig */; + baseConfigurationReference = EDBB0DF39D0F431E9A26F613 /* Pods-ExpensifyCash.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 352903821326..f156ce086c14 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -696,4 +696,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 41b806c7f131f87b716be1f1f9377532d6c9e43a -COCOAPODS: 1.10.0 +COCOAPODS: 1.10.1 diff --git a/src/pages/setpassword/SetPasswordPage.js b/src/pages/setpassword/SetPasswordPage.js index 63011349a6ce..b055d4393806 100644 --- a/src/pages/setpassword/SetPasswordPage.js +++ b/src/pages/setpassword/SetPasswordPage.js @@ -9,8 +9,8 @@ import SetPasswordForm from './SetPasswordForm'; const SetPasswordPage = (props) => { const welcomeText = ( - - + + With Expensify.cash, chat and payments are the same thing. @@ -37,8 +37,8 @@ const SetPasswordPage = (props) => { /> )} - {welcomeText} + {welcomeText} ); From fc2808e09593af6aaa445fd37cea1a081f56bbb6 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Tue, 23 Mar 2021 20:01:40 +0800 Subject: [PATCH 022/380] fix jsx style --- src/pages/setpassword/SetPasswordPage.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pages/setpassword/SetPasswordPage.js b/src/pages/setpassword/SetPasswordPage.js index b055d4393806..5a42f52f8e29 100644 --- a/src/pages/setpassword/SetPasswordPage.js +++ b/src/pages/setpassword/SetPasswordPage.js @@ -1,5 +1,7 @@ import React from 'react'; -import {SafeAreaView, Text, View, Image} from 'react-native'; +import { + SafeAreaView, Text, View, Image, +} from 'react-native'; import styles from '../../styles/styles'; import SignInPageLayout from '../signin/SignInPageLayout'; import SetPasswordPageProps from './SetPasswordPageProps'; From d16fb6f18db32abc4c846531b562749f3e813796 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 23 Mar 2021 10:38:17 -0600 Subject: [PATCH 023/380] Remove header bar distinction --- assets/emojis.js | 98 ++++++++++++------------ src/pages/home/report/EmojiPickerMenu.js | 7 +- 2 files changed, 50 insertions(+), 55 deletions(-) diff --git a/assets/emojis.js b/assets/emojis.js index b3555d38f0ab..26d72f5763c5 100644 --- a/assets/emojis.js +++ b/assets/emojis.js @@ -30,25 +30,25 @@ const emojis = [ header: true, }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { code: 'šŸ˜€', @@ -2895,25 +2895,25 @@ const emojis = [ header: true, }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { code: 'šŸµ', @@ -4472,25 +4472,25 @@ const emojis = [ header: true, }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { code: 'šŸŒ', @@ -6342,25 +6342,25 @@ const emojis = [ header: true, }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { code: 'šŸŽƒ', @@ -7117,25 +7117,25 @@ const emojis = [ header: true, }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { code: 'šŸ”‡', @@ -8567,25 +8567,25 @@ const emojis = [ header: true, }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { code: 'šŸ§', @@ -10204,25 +10204,25 @@ const emojis = [ header: true, }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { - code: 'HEADER_BAR', + code: 'BLANK', }, { code: 'šŸ', diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index ac177faf8a22..9e24473c0a47 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -36,7 +36,7 @@ class EmojiPickerMenu extends Component { } const newFilteredEmojiList = []; emojis.forEach((emoji) => { - if (!emoji.header && emoji.code !== 'BLANK' && emoji.code !== 'HEADER_BAR') { + if (!emoji.header && emoji.code !== 'BLANK') { emoji.keywords.forEach((keyword) => { if (keyword.includes(searchTerm)) { newFilteredEmojiList.push(emoji); @@ -53,11 +53,6 @@ class EmojiPickerMenu extends Component { return; } - if (item.code === 'HEADER_BAR') { - return ( - - ); - } if (item.header) { return ( From f33c9a313f6763b9df3493c90d39951b7f3b8d08 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 23 Mar 2021 10:38:52 -0600 Subject: [PATCH 024/380] Update styles to have a 100% header width --- src/styles/styles.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/styles/styles.js b/src/styles/styles.js index ee39ddf0f005..5da05898974f 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -761,6 +761,7 @@ const styles = { emojiHeaderStyle: { backgroundColor: themeColors.hoverComponentBG, fontWeight: 'bold', + width: '100%', }, chatItemEmojiButton: { From fb9fc8df2c6934d3bea84cb8adf7a31ac285f5a7 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 23 Mar 2021 10:39:27 -0600 Subject: [PATCH 025/380] Add toLowerCase to make sure that we find search terms properly --- src/pages/home/report/EmojiPickerMenu.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index 9e24473c0a47..ef5c34c79d13 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -30,7 +30,8 @@ class EmojiPickerMenu extends Component { } filterEmojis(searchTerm) { - if (searchTerm === '') { + const normalizedSearchTerm = searchTerm.toLowerCase(); + if (normalizedSearchTerm === '') { this.setState({filteredEmojis: emojis}); return; } @@ -38,7 +39,7 @@ class EmojiPickerMenu extends Component { emojis.forEach((emoji) => { if (!emoji.header && emoji.code !== 'BLANK') { emoji.keywords.forEach((keyword) => { - if (keyword.includes(searchTerm)) { + if (keyword.includes(normalizedSearchTerm)) { newFilteredEmojiList.push(emoji); } }); From 857274f8dee5530444f6a835cba3141e77c1e647 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 23 Mar 2021 13:05:14 -0600 Subject: [PATCH 026/380] Remove garbage emojis --- assets/emojis.js | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/assets/emojis.js b/assets/emojis.js index 26d72f5763c5..9d6c3f0b9654 100644 --- a/assets/emojis.js +++ b/assets/emojis.js @@ -211,15 +211,6 @@ const emojis = [ 'kiss', ], }, - { - code: 'ā˜ŗ', - keywords: [ - 'face', - 'outlined', - 'relaxed', - 'smile', - ], - }, { code: 'šŸ™‚', keywords: [ @@ -451,13 +442,6 @@ const emojis = [ 'totally', ], }, - { - code: 'ā˜¹', - keywords: [ - 'face', - 'frown', - ], - }, { code: 'šŸ™', keywords: [ @@ -2890,6 +2874,12 @@ const emojis = [ { code: 'BLANK', }, + { + code: 'BLANK', + }, + { + code: 'BLANK', + }, { code: 'Animals & Nature', header: true, From 170f5f3e3bde331c30c1245e15e9c7f6ae688383 Mon Sep 17 00:00:00 2001 From: Rajat Parashar Date: Wed, 24 Mar 2021 02:25:43 +0530 Subject: [PATCH 027/380] fix: keyboard appears on split bill page --- src/components/withNavigationContext.js | 68 ++++++++++++++++++++ src/pages/home/report/ReportActionCompose.js | 7 +- 2 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 src/components/withNavigationContext.js diff --git a/src/components/withNavigationContext.js b/src/components/withNavigationContext.js new file mode 100644 index 000000000000..554bfd175cd1 --- /dev/null +++ b/src/components/withNavigationContext.js @@ -0,0 +1,68 @@ +import React, {Component} from 'react'; +import PropTypes from 'prop-types'; +import {NavigationContext} from '@react-navigation/native'; +import getComponentDisplayName from '../libs/getComponentDisplayName'; + +const navigationContextPropTypes = { + // Whether this screen is focused + isScreenFocused: PropTypes.number.isRequired, +}; + +export default function (WrappedComponent) { + class withNavigationContext extends Component { + constructor(props) { + super(props); + this.state = { + isScreenFocused: false, + }; + } + + componentDidMount() { + this.unsubscribeFocus = this.context.addListener('focus', () => this.setState({ + isScreenFocused: true, + })); + this.unsubscribeBlur = this.context.addListener('blur', () => this.setState({ + isScreenFocused: false, + })); + } + + componentDidUpdate() { + const valueToReturn = this.context.isFocused(); + if (this.state.isScreenFocused !== valueToReturn) { + // If the value has changed since the last render, we need to update it. + // This could happen if we missed an update from the event listeners during re-render. + // React will process this update immediately, so the old subscription value won't be committed. + // It is still nice to avoid returning a mismatched value though, so let's override the return value. + // This is the same logic as in https://github.com/facebook/react/tree/master/packages/use-subscription + + // eslint-disable-next-line react/no-did-update-set-state + this.setState({ + isScreenFocused: valueToReturn, + }); + } + } + + componentWillUnmount() { + this.unsubscribeFocus(); + this.unsubscribeBlur(); + } + + render() { + return ( + + ); + } + } + + withNavigationContext.contextType = NavigationContext; + withNavigationContext.displayName = `withNavigationContext(${getComponentDisplayName(WrappedComponent)})`; + return withNavigationContext; +} + +export { + navigationContextPropTypes, +}; diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index 7bc8c8761c02..445465932c00 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -19,6 +19,7 @@ import compose from '../../../libs/compose'; import CreateMenu from '../../../components/CreateMenu'; import CONST from '../../../CONST'; import Navigation from '../../../libs/Navigation/Navigation'; +import withNavigationContext, {navigationContextPropTypes} from '../../../components/withNavigationContext'; const propTypes = { // A method to call when the form is submitted @@ -44,6 +45,7 @@ const propTypes = { }).isRequired, ...windowDimensionsPropTypes, + ...navigationContextPropTypes, }; const defaultProps = { @@ -78,8 +80,8 @@ class ReportActionCompose extends React.Component { this.comment = this.props.comment; } - // When any modal goes from visible to hidden, bring focus to the compose field - if (prevProps.modal.isVisible && !this.props.modal.isVisible) { + // When any modal goes from visible to hidden, bring focus to the compose field only when the screen is focused. + if (this.props.isScreenFocused && prevProps.modal.isVisible && !this.props.modal.isVisible) { this.setIsFocused(true); } } @@ -319,4 +321,5 @@ export default compose( }, }), withWindowDimensions, + withNavigationContext, )(ReportActionCompose); From 6e40e390d991af411688de54d5187c2d47e8e2ec Mon Sep 17 00:00:00 2001 From: Rajat Parashar Date: Wed, 24 Mar 2021 03:06:49 +0530 Subject: [PATCH 028/380] typo fixed --- src/components/withNavigationContext.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/withNavigationContext.js b/src/components/withNavigationContext.js index 554bfd175cd1..e0587f2eab64 100644 --- a/src/components/withNavigationContext.js +++ b/src/components/withNavigationContext.js @@ -5,7 +5,7 @@ import getComponentDisplayName from '../libs/getComponentDisplayName'; const navigationContextPropTypes = { // Whether this screen is focused - isScreenFocused: PropTypes.number.isRequired, + isScreenFocused: PropTypes.bool.isRequired, }; export default function (WrappedComponent) { From 08daae64dea57b2810eb521a0ae4c015cae19b3b Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 23 Mar 2021 17:16:09 -0600 Subject: [PATCH 029/380] Remove testing changes --- src/components/PopoverWithMeasuredContent.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/PopoverWithMeasuredContent.js b/src/components/PopoverWithMeasuredContent.js index aed3fea94af5..03c0ec0553e7 100644 --- a/src/components/PopoverWithMeasuredContent.js +++ b/src/components/PopoverWithMeasuredContent.js @@ -85,7 +85,7 @@ class PopoverWithMeasuredContent extends Component { let horizontalConstraint; switch (this.props.anchorOrigin.horizontal) { case CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL.RIGHT: - horizontalConstraint = {left: this.props.anchorPosition.horizontal - 300}; + horizontalConstraint = {left: this.props.anchorPosition.horizontal - this.popoverWidth}; break; case CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL.CENTER: horizontalConstraint = { @@ -100,7 +100,7 @@ class PopoverWithMeasuredContent extends Component { let verticalConstraint; switch (this.props.anchorOrigin.vertical) { case CONST.MODAL.ANCHOR_ORIGIN_VERTICAL.BOTTOM: - verticalConstraint = {top: this.props.anchorPosition.vertical - 300}; + verticalConstraint = {top: this.props.anchorPosition.vertical - this.popoverHeight}; break; case CONST.MODAL.ANCHOR_ORIGIN_VERTICAL.CENTER: verticalConstraint = { From cde5d7a9369ddd44a4db37b6964c6146b1de34c9 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 23 Mar 2021 17:17:42 -0600 Subject: [PATCH 030/380] Update styles --- src/pages/home/report/EmojiPickerMenu.js | 11 +++++++++-- src/pages/home/report/EmojiPickerMenuItem.js | 4 ++-- src/styles/styles.js | 9 ++++++--- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index ef5c34c79d13..7146b599a877 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -73,16 +73,22 @@ class EmojiPickerMenu extends Component { render() { return ( this.props.isVisible && ( - + this.searchInput = el} /> + this.renderItem(item, this.props.addEmojiToTextBox)} @@ -91,6 +97,7 @@ class EmojiPickerMenu extends Component { style={{height: 300}} extraData={this.state.filteredEmojis} stickyHeaderIndices={this.state.headerIndices} + contentContainerStyle={{flexGrow: 1, justifyContent: 'space-between'}} /> )); diff --git a/src/pages/home/report/EmojiPickerMenuItem.js b/src/pages/home/report/EmojiPickerMenuItem.js index e1032a839ace..9c8904b96606 100644 --- a/src/pages/home/report/EmojiPickerMenuItem.js +++ b/src/pages/home/report/EmojiPickerMenuItem.js @@ -12,8 +12,8 @@ const propTypes = { }; const EmojiPickerMenuItem = props => ( - props.onPress(props.emoji)} style={styles.emojiText}> - {props.emoji} + props.onPress(props.emoji)}> + {props.emoji} ); diff --git a/src/styles/styles.js b/src/styles/styles.js index 5da05898974f..4a102ad23921 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -744,7 +744,7 @@ const styles = { borderColor: themeColors.border, color: themeColors.text, fontFamily: fontFamily.GTA, - fontSize: variables.fontSizeNormal, + fontSize: variables.fontSizeLarge, borderWidth: 0, borderRadius: 0, height: 'auto', @@ -752,7 +752,7 @@ const styles = { // On Android, multiline TextInput with height: 'auto' will show extra padding unless they are configured with // paddingVertical: 0, alignSelf: 'center', and textAlignVertical: 'center' - paddingHorizontal: 8, + paddingHorizontal: 10, marginVertical: 5, paddingVertical: 0, textAlignVertical: 'center', @@ -760,8 +760,11 @@ const styles = { emojiHeaderStyle: { backgroundColor: themeColors.hoverComponentBG, - fontWeight: 'bold', width: '100%', + paddingVertical: 5, + paddingLeft: 5, + fontFamily: fontFamily.GTA_BOLD, + fontWeight: fontWeightBold, }, chatItemEmojiButton: { From 9905e4fc7dc42b31d8abe08fe6ea857186981771 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 23 Mar 2021 17:22:31 -0600 Subject: [PATCH 031/380] Style --- src/pages/home/report/EmojiPickerMenu.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index 7146b599a877..979b9cf48450 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -85,7 +85,7 @@ class EmojiPickerMenu extends Component { /> @@ -97,7 +97,7 @@ class EmojiPickerMenu extends Component { style={{height: 300}} extraData={this.state.filteredEmojis} stickyHeaderIndices={this.state.headerIndices} - contentContainerStyle={{flexGrow: 1, justifyContent: 'space-between'}} + contentContainerStyle={{flexGrow: 1}} /> )); From 1c7d547808ce8f6c67e4f78fa6d8831129595204 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 23 Mar 2021 18:09:54 -0600 Subject: [PATCH 032/380] Focus on open --- src/pages/home/report/EmojiPickerMenu.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index 979b9cf48450..d32944a37240 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -29,6 +29,12 @@ class EmojiPickerMenu extends Component { }; } + componentDidUpdate() { + if (this.props.isVisible) { + this.searchInput.focus(); + } + } + filterEmojis(searchTerm) { const normalizedSearchTerm = searchTerm.toLowerCase(); if (normalizedSearchTerm === '') { From de2ab0373575150052cf3bf5074dd98c9f5a02c5 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Wed, 24 Mar 2021 09:07:02 +0800 Subject: [PATCH 033/380] remove accidentally committed files --- ios/ExpensifyCash.xcodeproj/project.pbxproj | 950 -------------------- ios/Podfile.lock | 699 -------------- 2 files changed, 1649 deletions(-) delete mode 100644 ios/ExpensifyCash.xcodeproj/project.pbxproj delete mode 100644 ios/Podfile.lock diff --git a/ios/ExpensifyCash.xcodeproj/project.pbxproj b/ios/ExpensifyCash.xcodeproj/project.pbxproj deleted file mode 100644 index c5a01d9565c0..000000000000 --- a/ios/ExpensifyCash.xcodeproj/project.pbxproj +++ /dev/null @@ -1,950 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 00E356F31AD99517003FC87E /* ExpensifyCashTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* ExpensifyCashTests.m */; }; - 0F5BE0CE252686330097D869 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 0F5BE0CD252686320097D869 /* GoogleService-Info.plist */; }; - 12DD1878FCB9487C9F031C86 /* GTAmericaExpMono-Rg.otf in Resources */ = {isa = PBXBuildFile; fileRef = 8437A5A38F2047E0BCCD7C2F /* GTAmericaExpMono-Rg.otf */; }; - 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 184256DF4A33056F828927C6 /* libPods-ExpensifyCash-ExpensifyCashTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 85425D131983D5EC5A012EF7 /* libPods-ExpensifyCash-ExpensifyCashTests.a */; }; - 1E76D5212522316A005A268F /* GTAmericaExp-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = A5AAD008CBD84A6CAEB9AC97 /* GTAmericaExp-Bold.otf */; }; - 1E76D5222522316A005A268F /* GTAmericaExp-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = 67D5C3A6A7FA417C8A853FC1 /* GTAmericaExp-Light.otf */; }; - 1E76D5232522316A005A268F /* GTAmericaExp-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = AE65058949E14DA5A2D5435D /* GTAmericaExp-Medium.otf */; }; - 1E76D5242522316A005A268F /* GTAmericaExp-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 8C7003903C1E4957824899BB /* GTAmericaExp-Regular.otf */; }; - 1E76D5252522316A005A268F /* GTAmericaExp-Thin.otf in Resources */ = {isa = PBXBuildFile; fileRef = A292718541C841859D97DF2F /* GTAmericaExp-Thin.otf */; }; - 376CCF91B872607D190AF0F6 /* libPods-ExpensifyCash.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A679AD694BE9556E6B55BEA /* libPods-ExpensifyCash.a */; }; - 425866037F4C482AAB46CB8B /* GTAmericaExp-BdIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = A8D6F2F722FD4E66A38EBBB6 /* GTAmericaExp-BdIt.otf */; }; - 6856B78873B64C44A92E51DB /* GTAmericaExp-MdIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = DB5A1365442D4419AF6F08E5 /* GTAmericaExp-MdIt.otf */; }; - 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; - 8821A238A081483FA947BC4E /* GTAmericaExp-RgIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 918D7FEFF96242E6B5F5E14D /* GTAmericaExp-RgIt.otf */; }; - E9DF872D2525201700607FDC /* AirshipConfig.plist in Resources */ = {isa = PBXBuildFile; fileRef = E9DF872C2525201700607FDC /* AirshipConfig.plist */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 13B07F861A680F5B00A75B9A; - remoteInfo = ExpensifyCash; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; - 00E356EE1AD99517003FC87E /* ExpensifyCashTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ExpensifyCashTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 00E356F21AD99517003FC87E /* ExpensifyCashTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ExpensifyCashTests.m; sourceTree = ""; }; - 0F5BE0CD252686320097D869 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - 13B07F961A680F5B00A75B9A /* Expensify.cash.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Expensify.cash.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = ExpensifyCash/AppDelegate.h; sourceTree = ""; }; - 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = ExpensifyCash/AppDelegate.m; sourceTree = ""; }; - 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = ExpensifyCash/Images.xcassets; sourceTree = ""; }; - 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = ExpensifyCash/Info.plist; sourceTree = ""; }; - 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = ExpensifyCash/main.m; sourceTree = ""; }; - 4A679AD694BE9556E6B55BEA /* libPods-ExpensifyCash.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ExpensifyCash.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 67D5C3A6A7FA417C8A853FC1 /* GTAmericaExp-Light.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Light.otf"; path = "../assets/fonts/GTAmericaExp-Light.otf"; sourceTree = ""; }; - 6B13CEF63D86C7980FA4F455 /* Pods-ExpensifyCash.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash.debug.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash/Pods-ExpensifyCash.debug.xcconfig"; sourceTree = ""; }; - 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = ExpensifyCash/LaunchScreen.storyboard; sourceTree = ""; }; - 8437A5A38F2047E0BCCD7C2F /* GTAmericaExpMono-Rg.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExpMono-Rg.otf"; path = "../assets/fonts/GTAmericaExpMono-Rg.otf"; sourceTree = ""; }; - 85425D131983D5EC5A012EF7 /* libPods-ExpensifyCash-ExpensifyCashTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ExpensifyCash-ExpensifyCashTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 8C7003903C1E4957824899BB /* GTAmericaExp-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Regular.otf"; path = "../assets/fonts/GTAmericaExp-Regular.otf"; sourceTree = ""; }; - 8CA0D27D73F4C48E98CCA0E9 /* Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash-ExpensifyCashTests/Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig"; sourceTree = ""; }; - 918D7FEFF96242E6B5F5E14D /* GTAmericaExp-RgIt.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-RgIt.otf"; path = "../assets/fonts/GTAmericaExp-RgIt.otf"; sourceTree = ""; }; - A292718541C841859D97DF2F /* GTAmericaExp-Thin.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Thin.otf"; path = "../assets/fonts/GTAmericaExp-Thin.otf"; sourceTree = ""; }; - A5AAD008CBD84A6CAEB9AC97 /* GTAmericaExp-Bold.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Bold.otf"; path = "../assets/fonts/GTAmericaExp-Bold.otf"; sourceTree = ""; }; - A8D6F2F722FD4E66A38EBBB6 /* GTAmericaExp-BdIt.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-BdIt.otf"; path = "../assets/fonts/GTAmericaExp-BdIt.otf"; sourceTree = ""; }; - A90FC01D757217791C4E9131 /* Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash-ExpensifyCashTests/Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig"; sourceTree = ""; }; - AE65058949E14DA5A2D5435D /* GTAmericaExp-Medium.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Medium.otf"; path = "../assets/fonts/GTAmericaExp-Medium.otf"; sourceTree = ""; }; - DB5A1365442D4419AF6F08E5 /* GTAmericaExp-MdIt.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-MdIt.otf"; path = "../assets/fonts/GTAmericaExp-MdIt.otf"; sourceTree = ""; }; - E9DF872C2525201700607FDC /* AirshipConfig.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = AirshipConfig.plist; sourceTree = ""; }; - ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; - ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; - EDBB0DF39D0F431E9A26F613 /* Pods-ExpensifyCash.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash.release.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash/Pods-ExpensifyCash.release.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 00E356EB1AD99517003FC87E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 184256DF4A33056F828927C6 /* libPods-ExpensifyCash-ExpensifyCashTests.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 376CCF91B872607D190AF0F6 /* libPods-ExpensifyCash.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 00E356EF1AD99517003FC87E /* ExpensifyCashTests */ = { - isa = PBXGroup; - children = ( - 00E356F21AD99517003FC87E /* ExpensifyCashTests.m */, - 00E356F01AD99517003FC87E /* Supporting Files */, - ); - path = ExpensifyCashTests; - sourceTree = ""; - }; - 00E356F01AD99517003FC87E /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 00E356F11AD99517003FC87E /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 13B07FAE1A68108700A75B9A /* ExpensifyCash */ = { - isa = PBXGroup; - children = ( - 0F5BE0CD252686320097D869 /* GoogleService-Info.plist */, - E9DF872C2525201700607FDC /* AirshipConfig.plist */, - 008F07F21AC5B25A0029DE68 /* main.jsbundle */, - 13B07FAF1A68108700A75B9A /* AppDelegate.h */, - 13B07FB01A68108700A75B9A /* AppDelegate.m */, - 13B07FB51A68108700A75B9A /* Images.xcassets */, - 13B07FB61A68108700A75B9A /* Info.plist */, - 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, - 13B07FB71A68108700A75B9A /* main.m */, - ); - name = ExpensifyCash; - sourceTree = ""; - }; - 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { - isa = PBXGroup; - children = ( - ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - ED2971642150620600B7C4FE /* JavaScriptCore.framework */, - 4A679AD694BE9556E6B55BEA /* libPods-ExpensifyCash.a */, - 85425D131983D5EC5A012EF7 /* libPods-ExpensifyCash-ExpensifyCashTests.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 832341AE1AAA6A7D00B99B32 /* Libraries */ = { - isa = PBXGroup; - children = ( - ); - name = Libraries; - sourceTree = ""; - }; - 83CBB9F61A601CBA00E9B192 = { - isa = PBXGroup; - children = ( - 13B07FAE1A68108700A75B9A /* ExpensifyCash */, - 832341AE1AAA6A7D00B99B32 /* Libraries */, - 00E356EF1AD99517003FC87E /* ExpensifyCashTests */, - 83CBBA001A601CBA00E9B192 /* Products */, - 2D16E6871FA4F8E400B85C8A /* Frameworks */, - EC29677F0A49C2946A495A33 /* Pods */, - A9EA265D209D4558995C9BD4 /* Resources */, - ); - indentWidth = 2; - sourceTree = ""; - tabWidth = 2; - usesTabs = 0; - }; - 83CBBA001A601CBA00E9B192 /* Products */ = { - isa = PBXGroup; - children = ( - 13B07F961A680F5B00A75B9A /* Expensify.cash.app */, - 00E356EE1AD99517003FC87E /* ExpensifyCashTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - A9EA265D209D4558995C9BD4 /* Resources */ = { - isa = PBXGroup; - children = ( - A5AAD008CBD84A6CAEB9AC97 /* GTAmericaExp-Bold.otf */, - 67D5C3A6A7FA417C8A853FC1 /* GTAmericaExp-Light.otf */, - AE65058949E14DA5A2D5435D /* GTAmericaExp-Medium.otf */, - 8C7003903C1E4957824899BB /* GTAmericaExp-Regular.otf */, - A292718541C841859D97DF2F /* GTAmericaExp-Thin.otf */, - 8437A5A38F2047E0BCCD7C2F /* GTAmericaExpMono-Rg.otf */, - A8D6F2F722FD4E66A38EBBB6 /* GTAmericaExp-BdIt.otf */, - DB5A1365442D4419AF6F08E5 /* GTAmericaExp-MdIt.otf */, - 918D7FEFF96242E6B5F5E14D /* GTAmericaExp-RgIt.otf */, - ); - name = Resources; - sourceTree = ""; - }; - EC29677F0A49C2946A495A33 /* Pods */ = { - isa = PBXGroup; - children = ( - 6B13CEF63D86C7980FA4F455 /* Pods-ExpensifyCash.debug.xcconfig */, - EDBB0DF39D0F431E9A26F613 /* Pods-ExpensifyCash.release.xcconfig */, - A90FC01D757217791C4E9131 /* Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig */, - 8CA0D27D73F4C48E98CCA0E9 /* Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 00E356ED1AD99517003FC87E /* ExpensifyCashTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "ExpensifyCashTests" */; - buildPhases = ( - 31F29FE5E41ACA3441D1941B /* [CP] Check Pods Manifest.lock */, - 00E356EA1AD99517003FC87E /* Sources */, - 00E356EB1AD99517003FC87E /* Frameworks */, - 00E356EC1AD99517003FC87E /* Resources */, - C5DF5C3874F91B17AFCBCB52 /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - 00E356F51AD99517003FC87E /* PBXTargetDependency */, - ); - name = ExpensifyCashTests; - productName = ExpensifyCashTests; - productReference = 00E356EE1AD99517003FC87E /* ExpensifyCashTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 13B07F861A680F5B00A75B9A /* ExpensifyCash */ = { - isa = PBXNativeTarget; - buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ExpensifyCash" */; - buildPhases = ( - 209CB27AD34BA50C3E1F4868 /* [CP] Check Pods Manifest.lock */, - FD10A7F022414F080027D42C /* Start Packager */, - 13B07F871A680F5B00A75B9A /* Sources */, - 13B07F8C1A680F5B00A75B9A /* Frameworks */, - 13B07F8E1A680F5B00A75B9A /* Resources */, - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - 3BD1D02836B845CFF3D9E447 /* [CP] Copy Pods Resources */, - B079B9CCBE57FB68AFC8F3B4 /* [CP-User] [RNFB] Core Configuration */, - F5D4F18823CA58548DB9253C /* [CP-User] [RNFB] Crashlytics Configuration */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ExpensifyCash; - productName = ExpensifyCash; - productReference = 13B07F961A680F5B00A75B9A /* Expensify.cash.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 83CBB9F71A601CBA00E9B192 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1130; - TargetAttributes = { - 00E356ED1AD99517003FC87E = { - CreatedOnToolsVersion = 6.2; - ProvisioningStyle = Automatic; - TestTargetID = 13B07F861A680F5B00A75B9A; - }; - 13B07F861A680F5B00A75B9A = { - DevelopmentTeam = 368M544MTT; - LastSwiftMigration = 1120; - ProvisioningStyle = Manual; - }; - }; - }; - buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "ExpensifyCash" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 83CBB9F61A601CBA00E9B192; - productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 13B07F861A680F5B00A75B9A /* ExpensifyCash */, - 00E356ED1AD99517003FC87E /* ExpensifyCashTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 00E356EC1AD99517003FC87E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F8E1A680F5B00A75B9A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, - 0F5BE0CE252686330097D869 /* GoogleService-Info.plist in Resources */, - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, - E9DF872D2525201700607FDC /* AirshipConfig.plist in Resources */, - 12DD1878FCB9487C9F031C86 /* GTAmericaExpMono-Rg.otf in Resources */, - 1E76D5212522316A005A268F /* GTAmericaExp-Bold.otf in Resources */, - 1E76D5222522316A005A268F /* GTAmericaExp-Light.otf in Resources */, - 1E76D5232522316A005A268F /* GTAmericaExp-Medium.otf in Resources */, - 1E76D5242522316A005A268F /* GTAmericaExp-Regular.otf in Resources */, - 1E76D5252522316A005A268F /* GTAmericaExp-Thin.otf in Resources */, - 425866037F4C482AAB46CB8B /* GTAmericaExp-BdIt.otf in Resources */, - 6856B78873B64C44A92E51DB /* GTAmericaExp-MdIt.otf in Resources */, - 8821A238A081483FA947BC4E /* GTAmericaExp-RgIt.otf in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Bundle React Native code and images"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; - }; - 209CB27AD34BA50C3E1F4868 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-ExpensifyCash-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 31F29FE5E41ACA3441D1941B /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-ExpensifyCash-ExpensifyCashTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 3BD1D02836B845CFF3D9E447 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-ExpensifyCash/Pods-ExpensifyCash-resources.sh", - "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAAutomationActions.plist", - "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageBannerContentView.xib", - "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageBannerView.xib", - "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageButtonView.xib", - "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageFullScreenViewController.xib", - "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageHTMLViewController.xib", - "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageModalViewController.xib", - "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageResizableViewController.xib", - "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAAutomation.xcdatamodeld", - "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAFrequencyLimits.xcdatamodeld", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UADefaultActions.plist", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UADefaultActionsTvOS.plist", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UANativeBridge", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UANotificationCategories.plist", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ar.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/cs.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/da.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/de.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/en.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/es-419.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/es.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/fi.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/fr.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/hi.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/hu.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/id.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/it.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/iw.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ja.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ko.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ms.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/nl.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/no.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/pl.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/pt-PT.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/pt.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ro.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ru.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/sk.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/sv.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/th.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/tr.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UAEvents.xcdatamodeld", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UARemoteData.xcdatamodeld", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/vi.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/zh-Hans.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/zh-Hant.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipExtendedActions/Resources/UAExtendedActions.plist", - "${PODS_ROOT}/Airship/Airship/AirshipExtendedActions/Resources/UARateAppPromptView.xib", - "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UADefaultMessageCenterListViewController.xib", - "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UADefaultMessageCenterMessageViewController.xib", - "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UAMessageCenterActions.plist", - "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UAMessageCenterListCell.xib", - "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UAMessageCenterPlaceholderIcon.png", - "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UAInbox.xcdatamodeld", - "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAAutomationActions.plist", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageBannerContentView.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageBannerView.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageButtonView.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageFullScreenViewController.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageHTMLViewController.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageModalViewController.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageResizableViewController.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAAutomation.momd", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAFrequencyLimits.momd", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UADefaultActions.plist", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UADefaultActionsTvOS.plist", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UANativeBridge", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UANotificationCategories.plist", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ar.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/cs.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/da.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/de.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/en.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/es-419.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/es.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/fi.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/fr.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/hi.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/hu.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/id.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/it.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/iw.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ja.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ko.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ms.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nl.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/no.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/pl.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/pt-PT.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/pt.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ro.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ru.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/sk.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/sv.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/th.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/tr.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAEvents.momd", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UARemoteData.momd", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/vi.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/zh-Hans.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/zh-Hant.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAExtendedActions.plist", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UARateAppPromptView.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UADefaultMessageCenterListViewController.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UADefaultMessageCenterMessageViewController.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAMessageCenterActions.plist", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAMessageCenterListCell.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAMessageCenterPlaceholderIcon.png", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInbox.momd", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ExpensifyCash/Pods-ExpensifyCash-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - B079B9CCBE57FB68AFC8F3B4 /* [CP-User] [RNFB] Core Configuration */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - name = "[CP-User] [RNFB] Core Configuration"; - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\nset -e\n\n_MAX_LOOKUPS=2;\n_SEARCH_RESULT=''\n_RN_ROOT_EXISTS=''\n_CURRENT_LOOKUPS=1\n_JSON_ROOT=\"'react-native'\"\n_JSON_FILE_NAME='firebase.json'\n_JSON_OUTPUT_BASE64='e30=' # { }\n_CURRENT_SEARCH_DIR=${PROJECT_DIR}\n_PLIST_BUDDY=/usr/libexec/PlistBuddy\n_TARGET_PLIST=\"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\n_DSYM_PLIST=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n# plist arrays\n_PLIST_ENTRY_KEYS=()\n_PLIST_ENTRY_TYPES=()\n_PLIST_ENTRY_VALUES=()\n\nfunction setPlistValue {\n echo \"info: setting plist entry '$1' of type '$2' in file '$4'\"\n ${_PLIST_BUDDY} -c \"Add :$1 $2 '$3'\" $4 || echo \"info: '$1' already exists\"\n}\n\nfunction getFirebaseJsonKeyValue () {\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n ruby -e \"require 'rubygems';require 'json'; output=JSON.parse('$1'); puts output[$_JSON_ROOT]['$2']\"\n else\n echo \"\"\n fi;\n}\n\nfunction jsonBoolToYesNo () {\n if [[ $1 == \"false\" ]]; then\n echo \"NO\"\n elif [[ $1 == \"true\" ]]; then\n echo \"YES\"\n else echo \"NO\"\n fi\n}\n\necho \"info: -> RNFB build script started\"\necho \"info: 1) Locating ${_JSON_FILE_NAME} file:\"\n\nif [[ -z ${_CURRENT_SEARCH_DIR} ]]; then\n _CURRENT_SEARCH_DIR=$(pwd)\nfi;\n\nwhile true; do\n _CURRENT_SEARCH_DIR=$(dirname \"$_CURRENT_SEARCH_DIR\")\n if [[ \"$_CURRENT_SEARCH_DIR\" == \"/\" ]] || [[ ${_CURRENT_LOOKUPS} -gt ${_MAX_LOOKUPS} ]]; then break; fi;\n echo \"info: ($_CURRENT_LOOKUPS of $_MAX_LOOKUPS) Searching in '$_CURRENT_SEARCH_DIR' for a ${_JSON_FILE_NAME} file.\"\n _SEARCH_RESULT=$(find \"$_CURRENT_SEARCH_DIR\" -maxdepth 2 -name ${_JSON_FILE_NAME} -print | head -n 1)\n if [[ ${_SEARCH_RESULT} ]]; then\n echo \"info: ${_JSON_FILE_NAME} found at $_SEARCH_RESULT\"\n break;\n fi;\n _CURRENT_LOOKUPS=$((_CURRENT_LOOKUPS+1))\ndone\n\nif [[ ${_SEARCH_RESULT} ]]; then\n _JSON_OUTPUT_RAW=$(cat \"${_SEARCH_RESULT}\")\n _RN_ROOT_EXISTS=$(ruby -e \"require 'rubygems';require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]\" || echo '')\n\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n _JSON_OUTPUT_BASE64=$(python -c 'import json,sys,base64;print(base64.b64encode(json.dumps(json.loads(open('\"'${_SEARCH_RESULT}'\"').read())['${_JSON_ROOT}'])))' || echo \"e30=\")\n fi\n\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n\n # config.messaging_auto_init_enabled\n _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"messaging_auto_init_enabled\")\n if [[ $_MESSAGING_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseMessagingAutoInitEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_MESSAGING_AUTO_INIT\")\")\n fi\n\n # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful\n _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"crashlytics_disable_auto_disabler\")\n if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == \"true\" ]]; then\n echo \"Disabled Crashlytics auto disabler.\" # do nothing\n else\n _PLIST_ENTRY_KEYS+=(\"FirebaseCrashlyticsCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"NO\")\n fi\n\n # config.admob_delay_app_measurement_init\n _ADMOB_DELAY_APP_MEASUREMENT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"admob_delay_app_measurement_init\")\n if [[ $_ADMOB_DELAY_APP_MEASUREMENT == \"true\" ]]; then\n _PLIST_ENTRY_KEYS+=(\"GADDelayAppMeasurementInit\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"YES\")\n fi\n\n # config.admob_ios_app_id\n _ADMOB_IOS_APP_ID=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"admob_ios_app_id\")\n if [[ $_ADMOB_IOS_APP_ID ]]; then\n _PLIST_ENTRY_KEYS+=(\"GADApplicationIdentifier\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_ADMOB_IOS_APP_ID\")\n fi\nelse\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n echo \"warning: A firebase.json file was not found, whilst this file is optional it is recommended to include it to configure firebase services in React Native Firebase.\"\nfi;\n\necho \"info: 2) Injecting Info.plist entries: \"\n\n# Log out the keys we're adding\nfor i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n echo \" -> $i) ${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\"\ndone\n\nfor plist in \"${_TARGET_PLIST}\" \"${_DSYM_PLIST}\" ; do\n if [[ -f \"${plist}\" ]]; then\n\n # paths with spaces break the call to setPlistValue. temporarily modify\n # the shell internal field separator variable (IFS), which normally\n # includes spaces, to consist only of line breaks\n oldifs=$IFS\n IFS=\"\n\"\n\n for i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n setPlistValue \"${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\" \"${plist}\"\n done\n\n # restore the original internal field separator value\n IFS=$oldifs\n else\n echo \"warning: A Info.plist build output file was not found (${plist})\"\n fi\ndone\n\necho \"info: <- RNFB build script finished\"\n"; - }; - C5DF5C3874F91B17AFCBCB52 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-ExpensifyCash-ExpensifyCashTests/Pods-ExpensifyCash-ExpensifyCashTests-resources.sh", - "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAAutomationActions.plist", - "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageBannerContentView.xib", - "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageBannerView.xib", - "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageButtonView.xib", - "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageFullScreenViewController.xib", - "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageHTMLViewController.xib", - "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageModalViewController.xib", - "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageResizableViewController.xib", - "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAAutomation.xcdatamodeld", - "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAFrequencyLimits.xcdatamodeld", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UADefaultActions.plist", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UADefaultActionsTvOS.plist", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UANativeBridge", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UANotificationCategories.plist", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ar.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/cs.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/da.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/de.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/en.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/es-419.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/es.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/fi.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/fr.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/hi.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/hu.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/id.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/it.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/iw.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ja.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ko.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ms.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/nl.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/no.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/pl.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/pt-PT.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/pt.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ro.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ru.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/sk.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/sv.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/th.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/tr.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UAEvents.xcdatamodeld", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UARemoteData.xcdatamodeld", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/vi.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/zh-Hans.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/zh-Hant.lproj", - "${PODS_ROOT}/Airship/Airship/AirshipExtendedActions/Resources/UAExtendedActions.plist", - "${PODS_ROOT}/Airship/Airship/AirshipExtendedActions/Resources/UARateAppPromptView.xib", - "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UADefaultMessageCenterListViewController.xib", - "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UADefaultMessageCenterMessageViewController.xib", - "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UAMessageCenterActions.plist", - "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UAMessageCenterListCell.xib", - "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UAMessageCenterPlaceholderIcon.png", - "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UAInbox.xcdatamodeld", - "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAAutomationActions.plist", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageBannerContentView.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageBannerView.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageButtonView.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageFullScreenViewController.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageHTMLViewController.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageModalViewController.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageResizableViewController.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAAutomation.momd", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAFrequencyLimits.momd", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UADefaultActions.plist", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UADefaultActionsTvOS.plist", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UANativeBridge", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UANotificationCategories.plist", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ar.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/cs.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/da.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/de.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/en.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/es-419.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/es.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/fi.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/fr.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/hi.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/hu.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/id.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/it.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/iw.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ja.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ko.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ms.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nl.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/no.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/pl.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/pt-PT.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/pt.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ro.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ru.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/sk.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/sv.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/th.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/tr.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAEvents.momd", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UARemoteData.momd", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/vi.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/zh-Hans.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/zh-Hant.lproj", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAExtendedActions.plist", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UARateAppPromptView.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UADefaultMessageCenterListViewController.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UADefaultMessageCenterMessageViewController.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAMessageCenterActions.plist", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAMessageCenterListCell.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAMessageCenterPlaceholderIcon.png", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInbox.momd", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ExpensifyCash-ExpensifyCashTests/Pods-ExpensifyCash-ExpensifyCashTests-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - F5D4F18823CA58548DB9253C /* [CP-User] [RNFB] Crashlytics Configuration */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - name = "[CP-User] [RNFB] Crashlytics Configuration"; - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\nset -e\n\nif [[ ${PODS_ROOT} ]]; then\n echo \"info: Exec FirebaseCrashlytics Run from Pods\"\n \"${PODS_ROOT}/FirebaseCrashlytics/run\"\nelse\n echo \"info: Exec FirebaseCrashlytics Run from framework\"\n \"${PROJECT_DIR}/FirebaseCrashlytics.framework/run\"\nfi\n"; - }; - FD10A7F022414F080027D42C /* Start Packager */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "Start Packager"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 00E356EA1AD99517003FC87E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 00E356F31AD99517003FC87E /* ExpensifyCashTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F871A680F5B00A75B9A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, - 13B07FC11A68108700A75B9A /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 13B07F861A680F5B00A75B9A /* ExpensifyCash */; - targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 00E356F61AD99517003FC87E /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A90FC01D757217791C4E9131 /* Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = ExpensifyCashTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - "$(inherited)", - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ExpensifyCash.app/ExpensifyCash"; - }; - name = Debug; - }; - 00E356F71AD99517003FC87E /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8CA0D27D73F4C48E98CCA0E9 /* Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - DEVELOPMENT_TEAM = 368M544MTT; - INFOPLIST_FILE = ExpensifyCashTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - "$(inherited)", - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ExpensifyCash.app/ExpensifyCash"; - }; - name = Release; - }; - 13B07F941A680F5B00A75B9A /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 6B13CEF63D86C7980FA4F455 /* Pods-ExpensifyCash.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = ExpensifyCash/Chat.entitlements; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; - DEVELOPMENT_TEAM = 368M544MTT; - ENABLE_BITCODE = NO; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; - INFOPLIST_FILE = ExpensifyCash/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.0.0; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat; - PRODUCT_NAME = Expensify.cash; - PROVISIONING_PROFILE_SPECIFIER = chat_expensify_appstore; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 13B07F951A680F5B00A75B9A /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = EDBB0DF39D0F431E9A26F613 /* Pods-ExpensifyCash.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = ExpensifyCash/Chat.entitlements; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; - DEVELOPMENT_TEAM = 368M544MTT; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; - INFOPLIST_FILE = ExpensifyCash/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.0.0; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat; - PRODUCT_NAME = Expensify.cash; - PROVISIONING_PROFILE_SPECIFIER = chat_expensify_appstore; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; - 83CBBA201A601CBA00E9B192 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; - LIBRARY_SEARCH_PATHS = ( - "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", - "\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"", - "\"$(inherited)\"", - ); - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 83CBBA211A601CBA00E9B192 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; - LIBRARY_SEARCH_PATHS = ( - "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", - "\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"", - "\"$(inherited)\"", - ); - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "ExpensifyCashTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 00E356F61AD99517003FC87E /* Debug */, - 00E356F71AD99517003FC87E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ExpensifyCash" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 13B07F941A680F5B00A75B9A /* Debug */, - 13B07F951A680F5B00A75B9A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "ExpensifyCash" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 83CBBA201A601CBA00E9B192 /* Debug */, - 83CBBA211A601CBA00E9B192 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; -} diff --git a/ios/Podfile.lock b/ios/Podfile.lock deleted file mode 100644 index f156ce086c14..000000000000 --- a/ios/Podfile.lock +++ /dev/null @@ -1,699 +0,0 @@ -PODS: - - Airship (14.2.0): - - Airship/Automation (= 14.2.0) - - Airship/Core (= 14.2.0) - - Airship/ExtendedActions (= 14.2.0) - - Airship/MessageCenter (= 14.2.0) - - Airship/Automation (14.2.0): - - Airship/Core - - Airship/Core (14.2.0) - - Airship/ExtendedActions (14.2.0): - - Airship/Core - - Airship/MessageCenter (14.2.0): - - Airship/Core - - boost-for-react-native (1.63.0) - - CocoaAsyncSocket (7.6.5) - - CocoaLibEvent (1.0.0) - - DoubleConversion (1.1.6) - - FBLazyVector (0.63.3) - - FBReactNativeSpec (0.63.3): - - Folly (= 2020.01.13.00) - - RCTRequired (= 0.63.3) - - RCTTypeSafety (= 0.63.3) - - React-Core (= 0.63.3) - - React-jsi (= 0.63.3) - - ReactCommon/turbomodule/core (= 0.63.3) - - Firebase/Analytics (6.34.0): - - Firebase/Core - - Firebase/Core (6.34.0): - - Firebase/CoreOnly - - FirebaseAnalytics (= 6.9.0) - - Firebase/CoreOnly (6.34.0): - - FirebaseCore (= 6.10.4) - - Firebase/Crashlytics (6.34.0): - - Firebase/CoreOnly - - FirebaseCrashlytics (~> 4.6.2) - - FirebaseAnalytics (6.9.0): - - FirebaseCore (~> 6.10) - - FirebaseInstallations (~> 1.7) - - GoogleAppMeasurement (= 6.9.0) - - GoogleUtilities/AppDelegateSwizzler (~> 6.7) - - GoogleUtilities/MethodSwizzler (~> 6.7) - - GoogleUtilities/Network (~> 6.7) - - "GoogleUtilities/NSData+zlib (~> 6.7)" - - nanopb (~> 1.30906.0) - - FirebaseCore (6.10.4): - - FirebaseCoreDiagnostics (~> 1.6) - - GoogleUtilities/Environment (~> 6.7) - - GoogleUtilities/Logger (~> 6.7) - - FirebaseCoreDiagnostics (1.7.0): - - GoogleDataTransport (~> 7.4) - - GoogleUtilities/Environment (~> 6.7) - - GoogleUtilities/Logger (~> 6.7) - - nanopb (~> 1.30906.0) - - FirebaseCrashlytics (4.6.2): - - FirebaseCore (~> 6.10) - - FirebaseInstallations (~> 1.6) - - GoogleDataTransport (~> 7.2) - - nanopb (~> 1.30906.0) - - PromisesObjC (~> 1.2) - - FirebaseInstallations (1.7.0): - - FirebaseCore (~> 6.10) - - GoogleUtilities/Environment (~> 6.7) - - GoogleUtilities/UserDefaults (~> 6.7) - - PromisesObjC (~> 1.2) - - Flipper (0.54.0): - - Flipper-Folly (~> 2.2) - - Flipper-RSocket (~> 1.1) - - Flipper-DoubleConversion (1.1.7) - - Flipper-Folly (2.3.0): - - boost-for-react-native - - CocoaLibEvent (~> 1.0) - - Flipper-DoubleConversion - - Flipper-Glog - - OpenSSL-Universal (= 1.0.2.20) - - Flipper-Glog (0.3.6) - - Flipper-PeerTalk (0.0.4) - - Flipper-RSocket (1.1.0): - - Flipper-Folly (~> 2.2) - - FlipperKit (0.54.0): - - FlipperKit/Core (= 0.54.0) - - FlipperKit/Core (0.54.0): - - Flipper (~> 0.54.0) - - FlipperKit/CppBridge - - FlipperKit/FBCxxFollyDynamicConvert - - FlipperKit/FBDefines - - FlipperKit/FKPortForwarding - - FlipperKit/CppBridge (0.54.0): - - Flipper (~> 0.54.0) - - FlipperKit/FBCxxFollyDynamicConvert (0.54.0): - - Flipper-Folly (~> 2.2) - - FlipperKit/FBDefines (0.54.0) - - FlipperKit/FKPortForwarding (0.54.0): - - CocoaAsyncSocket (~> 7.6) - - Flipper-PeerTalk (~> 0.0.4) - - FlipperKit/FlipperKitHighlightOverlay (0.54.0) - - FlipperKit/FlipperKitLayoutPlugin (0.54.0): - - FlipperKit/Core - - FlipperKit/FlipperKitHighlightOverlay - - FlipperKit/FlipperKitLayoutTextSearchable - - YogaKit (~> 1.18) - - FlipperKit/FlipperKitLayoutTextSearchable (0.54.0) - - FlipperKit/FlipperKitNetworkPlugin (0.54.0): - - FlipperKit/Core - - FlipperKit/FlipperKitReactPlugin (0.54.0): - - FlipperKit/Core - - FlipperKit/FlipperKitUserDefaultsPlugin (0.54.0): - - FlipperKit/Core - - FlipperKit/SKIOSNetworkPlugin (0.54.0): - - FlipperKit/Core - - FlipperKit/FlipperKitNetworkPlugin - - Folly (2020.01.13.00): - - boost-for-react-native - - DoubleConversion - - Folly/Default (= 2020.01.13.00) - - glog - - Folly/Default (2020.01.13.00): - - boost-for-react-native - - DoubleConversion - - glog - - glog (0.3.5) - - GoogleAppMeasurement (6.9.0): - - GoogleUtilities/AppDelegateSwizzler (~> 6.7) - - GoogleUtilities/MethodSwizzler (~> 6.7) - - GoogleUtilities/Network (~> 6.7) - - "GoogleUtilities/NSData+zlib (~> 6.7)" - - nanopb (~> 1.30906.0) - - GoogleDataTransport (7.5.1): - - nanopb (~> 1.30906.0) - - GoogleUtilities/AppDelegateSwizzler (6.7.2): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Environment (6.7.2): - - PromisesObjC (~> 1.2) - - GoogleUtilities/Logger (6.7.2): - - GoogleUtilities/Environment - - GoogleUtilities/MethodSwizzler (6.7.2): - - GoogleUtilities/Logger - - GoogleUtilities/Network (6.7.2): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (6.7.2)" - - GoogleUtilities/Reachability (6.7.2): - - GoogleUtilities/Logger - - GoogleUtilities/UserDefaults (6.7.2): - - GoogleUtilities/Logger - - nanopb (1.30906.0): - - nanopb/decode (= 1.30906.0) - - nanopb/encode (= 1.30906.0) - - nanopb/decode (1.30906.0) - - nanopb/encode (1.30906.0) - - OpenSSL-Universal (1.0.2.20): - - OpenSSL-Universal/Static (= 1.0.2.20) - - OpenSSL-Universal/Static (1.0.2.20) - - PromisesObjC (1.2.11) - - RCTRequired (0.63.3) - - RCTTypeSafety (0.63.3): - - FBLazyVector (= 0.63.3) - - Folly (= 2020.01.13.00) - - RCTRequired (= 0.63.3) - - React-Core (= 0.63.3) - - React (0.63.3): - - React-Core (= 0.63.3) - - React-Core/DevSupport (= 0.63.3) - - React-Core/RCTWebSocket (= 0.63.3) - - React-RCTActionSheet (= 0.63.3) - - React-RCTAnimation (= 0.63.3) - - React-RCTBlob (= 0.63.3) - - React-RCTImage (= 0.63.3) - - React-RCTLinking (= 0.63.3) - - React-RCTNetwork (= 0.63.3) - - React-RCTSettings (= 0.63.3) - - React-RCTText (= 0.63.3) - - React-RCTVibration (= 0.63.3) - - React-callinvoker (0.63.3) - - React-Core (0.63.3): - - Folly (= 2020.01.13.00) - - glog - - React-Core/Default (= 0.63.3) - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) - - Yoga - - React-Core/CoreModulesHeaders (0.63.3): - - Folly (= 2020.01.13.00) - - glog - - React-Core/Default - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) - - Yoga - - React-Core/Default (0.63.3): - - Folly (= 2020.01.13.00) - - glog - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) - - Yoga - - React-Core/DevSupport (0.63.3): - - Folly (= 2020.01.13.00) - - glog - - React-Core/Default (= 0.63.3) - - React-Core/RCTWebSocket (= 0.63.3) - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) - - React-jsinspector (= 0.63.3) - - Yoga - - React-Core/RCTActionSheetHeaders (0.63.3): - - Folly (= 2020.01.13.00) - - glog - - React-Core/Default - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) - - Yoga - - React-Core/RCTAnimationHeaders (0.63.3): - - Folly (= 2020.01.13.00) - - glog - - React-Core/Default - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) - - Yoga - - React-Core/RCTBlobHeaders (0.63.3): - - Folly (= 2020.01.13.00) - - glog - - React-Core/Default - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) - - Yoga - - React-Core/RCTImageHeaders (0.63.3): - - Folly (= 2020.01.13.00) - - glog - - React-Core/Default - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) - - Yoga - - React-Core/RCTLinkingHeaders (0.63.3): - - Folly (= 2020.01.13.00) - - glog - - React-Core/Default - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) - - Yoga - - React-Core/RCTNetworkHeaders (0.63.3): - - Folly (= 2020.01.13.00) - - glog - - React-Core/Default - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) - - Yoga - - React-Core/RCTSettingsHeaders (0.63.3): - - Folly (= 2020.01.13.00) - - glog - - React-Core/Default - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) - - Yoga - - React-Core/RCTTextHeaders (0.63.3): - - Folly (= 2020.01.13.00) - - glog - - React-Core/Default - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) - - Yoga - - React-Core/RCTVibrationHeaders (0.63.3): - - Folly (= 2020.01.13.00) - - glog - - React-Core/Default - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) - - Yoga - - React-Core/RCTWebSocket (0.63.3): - - Folly (= 2020.01.13.00) - - glog - - React-Core/Default (= 0.63.3) - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) - - Yoga - - React-CoreModules (0.63.3): - - FBReactNativeSpec (= 0.63.3) - - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.3) - - React-Core/CoreModulesHeaders (= 0.63.3) - - React-jsi (= 0.63.3) - - React-RCTImage (= 0.63.3) - - ReactCommon/turbomodule/core (= 0.63.3) - - React-cxxreact (0.63.3): - - boost-for-react-native (= 1.63.0) - - DoubleConversion - - Folly (= 2020.01.13.00) - - glog - - React-callinvoker (= 0.63.3) - - React-jsinspector (= 0.63.3) - - React-jsi (0.63.3): - - boost-for-react-native (= 1.63.0) - - DoubleConversion - - Folly (= 2020.01.13.00) - - glog - - React-jsi/Default (= 0.63.3) - - React-jsi/Default (0.63.3): - - boost-for-react-native (= 1.63.0) - - DoubleConversion - - Folly (= 2020.01.13.00) - - glog - - React-jsiexecutor (0.63.3): - - DoubleConversion - - Folly (= 2020.01.13.00) - - glog - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsinspector (0.63.3) - - react-native-config (1.4.1): - - react-native-config/App (= 1.4.1) - - react-native-config/App (1.4.1): - - React-Core - - react-native-document-picker (4.0.0): - - React-Core - - react-native-image-picker (2.3.4): - - React-Core - - react-native-netinfo (5.9.10): - - React-Core - - react-native-pdf (6.2.2): - - React-Core - - react-native-progress-bar-android (1.0.4): - - React - - react-native-progress-view (1.2.3): - - React - - react-native-safe-area-context (3.1.8): - - React-Core - - React-RCTActionSheet (0.63.3): - - React-Core/RCTActionSheetHeaders (= 0.63.3) - - React-RCTAnimation (0.63.3): - - FBReactNativeSpec (= 0.63.3) - - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.3) - - React-Core/RCTAnimationHeaders (= 0.63.3) - - React-jsi (= 0.63.3) - - ReactCommon/turbomodule/core (= 0.63.3) - - React-RCTBlob (0.63.3): - - FBReactNativeSpec (= 0.63.3) - - Folly (= 2020.01.13.00) - - React-Core/RCTBlobHeaders (= 0.63.3) - - React-Core/RCTWebSocket (= 0.63.3) - - React-jsi (= 0.63.3) - - React-RCTNetwork (= 0.63.3) - - ReactCommon/turbomodule/core (= 0.63.3) - - React-RCTImage (0.63.3): - - FBReactNativeSpec (= 0.63.3) - - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.3) - - React-Core/RCTImageHeaders (= 0.63.3) - - React-jsi (= 0.63.3) - - React-RCTNetwork (= 0.63.3) - - ReactCommon/turbomodule/core (= 0.63.3) - - React-RCTLinking (0.63.3): - - FBReactNativeSpec (= 0.63.3) - - React-Core/RCTLinkingHeaders (= 0.63.3) - - React-jsi (= 0.63.3) - - ReactCommon/turbomodule/core (= 0.63.3) - - React-RCTNetwork (0.63.3): - - FBReactNativeSpec (= 0.63.3) - - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.3) - - React-Core/RCTNetworkHeaders (= 0.63.3) - - React-jsi (= 0.63.3) - - ReactCommon/turbomodule/core (= 0.63.3) - - React-RCTSettings (0.63.3): - - FBReactNativeSpec (= 0.63.3) - - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.3) - - React-Core/RCTSettingsHeaders (= 0.63.3) - - React-jsi (= 0.63.3) - - ReactCommon/turbomodule/core (= 0.63.3) - - React-RCTText (0.63.3): - - React-Core/RCTTextHeaders (= 0.63.3) - - React-RCTVibration (0.63.3): - - FBReactNativeSpec (= 0.63.3) - - Folly (= 2020.01.13.00) - - React-Core/RCTVibrationHeaders (= 0.63.3) - - React-jsi (= 0.63.3) - - ReactCommon/turbomodule/core (= 0.63.3) - - ReactCommon/turbomodule/core (0.63.3): - - DoubleConversion - - Folly (= 2020.01.13.00) - - glog - - React-callinvoker (= 0.63.3) - - React-Core (= 0.63.3) - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - rn-fetch-blob (0.12.0): - - React-Core - - RNCAsyncStorage (1.12.1): - - React-Core - - RNCMaskedView (0.1.10): - - React - - RNCPicker (1.9.11): - - React-Core - - RNFBAnalytics (7.6.8): - - Firebase/Analytics (~> 6.34.0) - - React-Core - - RNFBApp - - RNFBApp (8.4.6): - - Firebase/CoreOnly (~> 6.34.0) - - React-Core - - RNFBCrashlytics (8.4.10): - - Firebase/Crashlytics (~> 6.34.0) - - React-Core - - RNFBApp - - RNGestureHandler (1.9.0): - - React-Core - - RNReanimated (1.13.2): - - React-Core - - RNScreens (2.17.1): - - React-Core - - RNSVG (12.1.0): - - React - - urbanairship-react-native (10.0.0): - - Airship (= 14.2.0) - - React-Core - - Yoga (1.14.0) - - YogaKit (1.18.1): - - Yoga (~> 1.14) - -DEPENDENCIES: - - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - - FBReactNativeSpec (from `../node_modules/react-native/Libraries/FBReactNativeSpec`) - - Flipper (~> 0.54.0) - - Flipper-DoubleConversion (= 1.1.7) - - Flipper-Folly (~> 2.2) - - Flipper-Glog (= 0.3.6) - - Flipper-PeerTalk (~> 0.0.4) - - Flipper-RSocket (~> 1.1) - - FlipperKit (~> 0.54.0) - - FlipperKit/Core (~> 0.54.0) - - FlipperKit/CppBridge (~> 0.54.0) - - FlipperKit/FBCxxFollyDynamicConvert (~> 0.54.0) - - FlipperKit/FBDefines (~> 0.54.0) - - FlipperKit/FKPortForwarding (~> 0.54.0) - - FlipperKit/FlipperKitHighlightOverlay (~> 0.54.0) - - FlipperKit/FlipperKitLayoutPlugin (~> 0.54.0) - - FlipperKit/FlipperKitLayoutTextSearchable (~> 0.54.0) - - FlipperKit/FlipperKitNetworkPlugin (~> 0.54.0) - - FlipperKit/FlipperKitReactPlugin (~> 0.54.0) - - FlipperKit/FlipperKitUserDefaultsPlugin (~> 0.54.0) - - FlipperKit/SKIOSNetworkPlugin (~> 0.54.0) - - Folly (from `../node_modules/react-native/third-party-podspecs/Folly.podspec`) - - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) - - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) - - React (from `../node_modules/react-native/`) - - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) - - React-Core (from `../node_modules/react-native/`) - - React-Core/DevSupport (from `../node_modules/react-native/`) - - React-Core/RCTWebSocket (from `../node_modules/react-native/`) - - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) - - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) - - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) - - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) - - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) - - react-native-config (from `../node_modules/react-native-config`) - - react-native-document-picker (from `../node_modules/react-native-document-picker`) - - react-native-image-picker (from `../node_modules/react-native-image-picker`) - - "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)" - - react-native-pdf (from `../node_modules/react-native-pdf`) - - "react-native-progress-bar-android (from `../node_modules/@react-native-community/progress-bar-android`)" - - "react-native-progress-view (from `../node_modules/@react-native-community/progress-view`)" - - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) - - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) - - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) - - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) - - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) - - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) - - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) - - React-RCTText (from `../node_modules/react-native/Libraries/Text`) - - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) - - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - - rn-fetch-blob (from `../node_modules/rn-fetch-blob`) - - "RNCAsyncStorage (from `../node_modules/@react-native-community/async-storage`)" - - "RNCMaskedView (from `../node_modules/@react-native-community/masked-view`)" - - "RNCPicker (from `../node_modules/@react-native-picker/picker`)" - - "RNFBAnalytics (from `../node_modules/@react-native-firebase/analytics`)" - - "RNFBApp (from `../node_modules/@react-native-firebase/app`)" - - "RNFBCrashlytics (from `../node_modules/@react-native-firebase/crashlytics`)" - - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - - RNReanimated (from `../node_modules/react-native-reanimated`) - - RNScreens (from `../node_modules/react-native-screens`) - - RNSVG (from `../node_modules/react-native-svg`) - - urbanairship-react-native (from `../node_modules/urbanairship-react-native`) - - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) - -SPEC REPOS: - trunk: - - Airship - - boost-for-react-native - - CocoaAsyncSocket - - CocoaLibEvent - - Firebase - - FirebaseAnalytics - - FirebaseCore - - FirebaseCoreDiagnostics - - FirebaseCrashlytics - - FirebaseInstallations - - Flipper - - Flipper-DoubleConversion - - Flipper-Folly - - Flipper-Glog - - Flipper-PeerTalk - - Flipper-RSocket - - FlipperKit - - GoogleAppMeasurement - - GoogleDataTransport - - GoogleUtilities - - nanopb - - OpenSSL-Universal - - PromisesObjC - - YogaKit - -EXTERNAL SOURCES: - DoubleConversion: - :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" - FBLazyVector: - :path: "../node_modules/react-native/Libraries/FBLazyVector" - FBReactNativeSpec: - :path: "../node_modules/react-native/Libraries/FBReactNativeSpec" - Folly: - :podspec: "../node_modules/react-native/third-party-podspecs/Folly.podspec" - glog: - :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" - RCTRequired: - :path: "../node_modules/react-native/Libraries/RCTRequired" - RCTTypeSafety: - :path: "../node_modules/react-native/Libraries/TypeSafety" - React: - :path: "../node_modules/react-native/" - React-callinvoker: - :path: "../node_modules/react-native/ReactCommon/callinvoker" - React-Core: - :path: "../node_modules/react-native/" - React-CoreModules: - :path: "../node_modules/react-native/React/CoreModules" - React-cxxreact: - :path: "../node_modules/react-native/ReactCommon/cxxreact" - React-jsi: - :path: "../node_modules/react-native/ReactCommon/jsi" - React-jsiexecutor: - :path: "../node_modules/react-native/ReactCommon/jsiexecutor" - React-jsinspector: - :path: "../node_modules/react-native/ReactCommon/jsinspector" - react-native-config: - :path: "../node_modules/react-native-config" - react-native-document-picker: - :path: "../node_modules/react-native-document-picker" - react-native-image-picker: - :path: "../node_modules/react-native-image-picker" - react-native-netinfo: - :path: "../node_modules/@react-native-community/netinfo" - react-native-pdf: - :path: "../node_modules/react-native-pdf" - react-native-progress-bar-android: - :path: "../node_modules/@react-native-community/progress-bar-android" - react-native-progress-view: - :path: "../node_modules/@react-native-community/progress-view" - react-native-safe-area-context: - :path: "../node_modules/react-native-safe-area-context" - React-RCTActionSheet: - :path: "../node_modules/react-native/Libraries/ActionSheetIOS" - React-RCTAnimation: - :path: "../node_modules/react-native/Libraries/NativeAnimation" - React-RCTBlob: - :path: "../node_modules/react-native/Libraries/Blob" - React-RCTImage: - :path: "../node_modules/react-native/Libraries/Image" - React-RCTLinking: - :path: "../node_modules/react-native/Libraries/LinkingIOS" - React-RCTNetwork: - :path: "../node_modules/react-native/Libraries/Network" - React-RCTSettings: - :path: "../node_modules/react-native/Libraries/Settings" - React-RCTText: - :path: "../node_modules/react-native/Libraries/Text" - React-RCTVibration: - :path: "../node_modules/react-native/Libraries/Vibration" - ReactCommon: - :path: "../node_modules/react-native/ReactCommon" - rn-fetch-blob: - :path: "../node_modules/rn-fetch-blob" - RNCAsyncStorage: - :path: "../node_modules/@react-native-community/async-storage" - RNCMaskedView: - :path: "../node_modules/@react-native-community/masked-view" - RNCPicker: - :path: "../node_modules/@react-native-picker/picker" - RNFBAnalytics: - :path: "../node_modules/@react-native-firebase/analytics" - RNFBApp: - :path: "../node_modules/@react-native-firebase/app" - RNFBCrashlytics: - :path: "../node_modules/@react-native-firebase/crashlytics" - RNGestureHandler: - :path: "../node_modules/react-native-gesture-handler" - RNReanimated: - :path: "../node_modules/react-native-reanimated" - RNScreens: - :path: "../node_modules/react-native-screens" - RNSVG: - :path: "../node_modules/react-native-svg" - urbanairship-react-native: - :path: "../node_modules/urbanairship-react-native" - Yoga: - :path: "../node_modules/react-native/ReactCommon/yoga" - -SPEC CHECKSUMS: - Airship: 02ad73780f9eed21870e36b0aaab327acda6a102 - boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c - CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 - CocoaLibEvent: 2fab71b8bd46dd33ddb959f7928ec5909f838e3f - DoubleConversion: cde416483dac037923206447da6e1454df403714 - FBLazyVector: 878b59e31113e289e275165efbe4b54fa614d43d - FBReactNativeSpec: 7da9338acfb98d4ef9e5536805a0704572d33c2f - Firebase: c23a36d9e4cdf7877dfcba8dd0c58add66358999 - FirebaseAnalytics: 3bb096873ee0d7fa4b6c70f5e9166b6da413cc7f - FirebaseCore: d3a978a3cfa3240bf7e4ba7d137fdf5b22b628ec - FirebaseCoreDiagnostics: 770ac5958e1372ce67959ae4b4f31d8e127c3ac1 - FirebaseCrashlytics: 1a747c9cc084a24dc6d9511c991db1cd078154eb - FirebaseInstallations: 466c7b4d1f58fe16707693091da253726a731ed2 - Flipper: be611d4b742d8c87fbae2ca5f44603a02539e365 - Flipper-DoubleConversion: 38631e41ef4f9b12861c67d17cb5518d06badc41 - Flipper-Folly: e4493b013c02d9347d5e0cb4d128680239f6c78a - Flipper-Glog: 1dfd6abf1e922806c52ceb8701a3599a79a200a6 - Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9 - Flipper-RSocket: 64e7431a55835eb953b0bf984ef3b90ae9fdddd7 - FlipperKit: ab353d41aea8aae2ea6daaf813e67496642f3d7d - Folly: b73c3869541e86821df3c387eb0af5f65addfab4 - glog: 40a13f7840415b9a77023fbcae0f1e6f43192af3 - GoogleAppMeasurement: a6a3a066369828db64eda428cb2856dc1cdc7c4e - GoogleDataTransport: f56af7caa4ed338dc8e138a5d7c5973e66440833 - GoogleUtilities: 7f2f5a07f888cdb145101d6042bc4422f57e70b3 - nanopb: 59317e09cf1f1a0af72f12af412d54edf52603fc - OpenSSL-Universal: ff34003318d5e1163e9529b08470708e389ffcdd - PromisesObjC: 8c196f5a328c2cba3e74624585467a557dcb482f - RCTRequired: 48884c74035a0b5b76dbb7a998bd93bcfc5f2047 - RCTTypeSafety: edf4b618033c2f1c5b7bc3d90d8e085ed95ba2ab - React: f36e90f3ceb976546e97df3403e37d226f79d0e3 - React-callinvoker: 18874f621eb96625df7a24a7dc8d6e07391affcd - React-Core: ac3d816b8e3493970153f4aaf0cff18af0bb95e6 - React-CoreModules: 4016d3a4e518bcfc4f5a51252b5a05692ca6f0e1 - React-cxxreact: ffc9129013b87cb36cf3f30a86695a3c397b0f99 - React-jsi: df07aa95b39c5be3e41199921509bfa929ed2b9d - React-jsiexecutor: b56c03e61c0dd5f5801255f2160a815f4a53d451 - React-jsinspector: 8e68ffbfe23880d3ee9bafa8be2777f60b25cbe2 - react-native-config: d8b45133fd13d4f23bd2064b72f6e2c08b2763ed - react-native-document-picker: b3e78a8f7fef98b5cb069f20fc35797d55e68e28 - react-native-image-picker: 32d1ad2c0024ca36161ae0d5c2117e2d6c441f11 - react-native-netinfo: 52cf0ee8342548a485e28f4b09e56b477567244d - react-native-pdf: 4b5a9e4465a6a3b399e91dc4838eb44ddf716d1f - react-native-progress-bar-android: ce95a69f11ac580799021633071368d08aaf9ad8 - react-native-progress-view: 5816e8a6be812c2b122c6225a2a3db82d9008640 - react-native-safe-area-context: 01158a92c300895d79dee447e980672dc3fb85a6 - React-RCTActionSheet: 53ea72699698b0b47a6421cb1c8b4ab215a774aa - React-RCTAnimation: 1befece0b5183c22ae01b966f5583f42e69a83c2 - React-RCTBlob: 0b284339cbe4b15705a05e2313a51c6d8b51fa40 - React-RCTImage: d1756599ebd4dc2cb19d1682fe67c6b976658387 - React-RCTLinking: 9af0a51c6d6a4dd1674daadafffc6d03033a6d18 - React-RCTNetwork: 332c83929cc5eae0b3bbca4add1d668e1fc18bda - React-RCTSettings: d6953772cfd55f2c68ad72b7ef29efc7ec49f773 - React-RCTText: 65a6de06a7389098ce24340d1d3556015c38f746 - React-RCTVibration: 8e9fb25724a0805107fc1acc9075e26f814df454 - ReactCommon: 4167844018c9ed375cc01a843e9ee564399e53c3 - rn-fetch-blob: f065bb7ab7fb48dd002629f8bdcb0336602d3cba - RNCAsyncStorage: cb9a623793918c6699586281f0b51cbc38f046f9 - RNCMaskedView: f5c7d14d6847b7b44853f7acb6284c1da30a3459 - RNCPicker: 6780c753e9e674065db90d9c965920516402579d - RNFBAnalytics: 2dc4dd9e2445faffca041b10447a23a71dcdabf8 - RNFBApp: 7eacc7da7ab19f96c05e434017d44a9f09410da8 - RNFBCrashlytics: 4870c14cf8833053b6b5648911abefe1923854d2 - RNGestureHandler: 9b7e605a741412e20e13c512738a31bd1611759b - RNReanimated: e03f7425cb7a38dcf1b644d680d1bfc91c3337ad - RNScreens: b6c9607e6fe47c1b6e2f1910d2acd46dd7ecea3a - RNSVG: ce9d996113475209013317e48b05c21ee988d42e - urbanairship-react-native: dfb6dc22b2f41ccaadd636b73d51b448cd1b2bbc - Yoga: 7d13633d129fd179e01b8953d38d47be90db185a - YogaKit: f782866e155069a2cca2517aafea43200b01fd5a - -PODFILE CHECKSUM: 41b806c7f131f87b716be1f1f9377532d6c9e43a - -COCOAPODS: 1.10.1 From 09678efa009d7e3ec144430b4a3b8cb19a1c362c Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Wed, 24 Mar 2021 09:10:59 +0800 Subject: [PATCH 034/380] Revert "remove accidentally committed files" This reverts commit de2ab0373575150052cf3bf5074dd98c9f5a02c5. --- ios/ExpensifyCash.xcodeproj/project.pbxproj | 950 ++++++++++++++++++++ ios/Podfile.lock | 699 ++++++++++++++ 2 files changed, 1649 insertions(+) create mode 100644 ios/ExpensifyCash.xcodeproj/project.pbxproj create mode 100644 ios/Podfile.lock diff --git a/ios/ExpensifyCash.xcodeproj/project.pbxproj b/ios/ExpensifyCash.xcodeproj/project.pbxproj new file mode 100644 index 000000000000..c5a01d9565c0 --- /dev/null +++ b/ios/ExpensifyCash.xcodeproj/project.pbxproj @@ -0,0 +1,950 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 00E356F31AD99517003FC87E /* ExpensifyCashTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* ExpensifyCashTests.m */; }; + 0F5BE0CE252686330097D869 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 0F5BE0CD252686320097D869 /* GoogleService-Info.plist */; }; + 12DD1878FCB9487C9F031C86 /* GTAmericaExpMono-Rg.otf in Resources */ = {isa = PBXBuildFile; fileRef = 8437A5A38F2047E0BCCD7C2F /* GTAmericaExpMono-Rg.otf */; }; + 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 184256DF4A33056F828927C6 /* libPods-ExpensifyCash-ExpensifyCashTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 85425D131983D5EC5A012EF7 /* libPods-ExpensifyCash-ExpensifyCashTests.a */; }; + 1E76D5212522316A005A268F /* GTAmericaExp-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = A5AAD008CBD84A6CAEB9AC97 /* GTAmericaExp-Bold.otf */; }; + 1E76D5222522316A005A268F /* GTAmericaExp-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = 67D5C3A6A7FA417C8A853FC1 /* GTAmericaExp-Light.otf */; }; + 1E76D5232522316A005A268F /* GTAmericaExp-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = AE65058949E14DA5A2D5435D /* GTAmericaExp-Medium.otf */; }; + 1E76D5242522316A005A268F /* GTAmericaExp-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 8C7003903C1E4957824899BB /* GTAmericaExp-Regular.otf */; }; + 1E76D5252522316A005A268F /* GTAmericaExp-Thin.otf in Resources */ = {isa = PBXBuildFile; fileRef = A292718541C841859D97DF2F /* GTAmericaExp-Thin.otf */; }; + 376CCF91B872607D190AF0F6 /* libPods-ExpensifyCash.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A679AD694BE9556E6B55BEA /* libPods-ExpensifyCash.a */; }; + 425866037F4C482AAB46CB8B /* GTAmericaExp-BdIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = A8D6F2F722FD4E66A38EBBB6 /* GTAmericaExp-BdIt.otf */; }; + 6856B78873B64C44A92E51DB /* GTAmericaExp-MdIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = DB5A1365442D4419AF6F08E5 /* GTAmericaExp-MdIt.otf */; }; + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; + 8821A238A081483FA947BC4E /* GTAmericaExp-RgIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 918D7FEFF96242E6B5F5E14D /* GTAmericaExp-RgIt.otf */; }; + E9DF872D2525201700607FDC /* AirshipConfig.plist in Resources */ = {isa = PBXBuildFile; fileRef = E9DF872C2525201700607FDC /* AirshipConfig.plist */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 13B07F861A680F5B00A75B9A; + remoteInfo = ExpensifyCash; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; + 00E356EE1AD99517003FC87E /* ExpensifyCashTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ExpensifyCashTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 00E356F21AD99517003FC87E /* ExpensifyCashTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ExpensifyCashTests.m; sourceTree = ""; }; + 0F5BE0CD252686320097D869 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 13B07F961A680F5B00A75B9A /* Expensify.cash.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Expensify.cash.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = ExpensifyCash/AppDelegate.h; sourceTree = ""; }; + 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = ExpensifyCash/AppDelegate.m; sourceTree = ""; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = ExpensifyCash/Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = ExpensifyCash/Info.plist; sourceTree = ""; }; + 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = ExpensifyCash/main.m; sourceTree = ""; }; + 4A679AD694BE9556E6B55BEA /* libPods-ExpensifyCash.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ExpensifyCash.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 67D5C3A6A7FA417C8A853FC1 /* GTAmericaExp-Light.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Light.otf"; path = "../assets/fonts/GTAmericaExp-Light.otf"; sourceTree = ""; }; + 6B13CEF63D86C7980FA4F455 /* Pods-ExpensifyCash.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash.debug.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash/Pods-ExpensifyCash.debug.xcconfig"; sourceTree = ""; }; + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = ExpensifyCash/LaunchScreen.storyboard; sourceTree = ""; }; + 8437A5A38F2047E0BCCD7C2F /* GTAmericaExpMono-Rg.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExpMono-Rg.otf"; path = "../assets/fonts/GTAmericaExpMono-Rg.otf"; sourceTree = ""; }; + 85425D131983D5EC5A012EF7 /* libPods-ExpensifyCash-ExpensifyCashTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ExpensifyCash-ExpensifyCashTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 8C7003903C1E4957824899BB /* GTAmericaExp-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Regular.otf"; path = "../assets/fonts/GTAmericaExp-Regular.otf"; sourceTree = ""; }; + 8CA0D27D73F4C48E98CCA0E9 /* Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash-ExpensifyCashTests/Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig"; sourceTree = ""; }; + 918D7FEFF96242E6B5F5E14D /* GTAmericaExp-RgIt.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-RgIt.otf"; path = "../assets/fonts/GTAmericaExp-RgIt.otf"; sourceTree = ""; }; + A292718541C841859D97DF2F /* GTAmericaExp-Thin.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Thin.otf"; path = "../assets/fonts/GTAmericaExp-Thin.otf"; sourceTree = ""; }; + A5AAD008CBD84A6CAEB9AC97 /* GTAmericaExp-Bold.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Bold.otf"; path = "../assets/fonts/GTAmericaExp-Bold.otf"; sourceTree = ""; }; + A8D6F2F722FD4E66A38EBBB6 /* GTAmericaExp-BdIt.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-BdIt.otf"; path = "../assets/fonts/GTAmericaExp-BdIt.otf"; sourceTree = ""; }; + A90FC01D757217791C4E9131 /* Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash-ExpensifyCashTests/Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig"; sourceTree = ""; }; + AE65058949E14DA5A2D5435D /* GTAmericaExp-Medium.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Medium.otf"; path = "../assets/fonts/GTAmericaExp-Medium.otf"; sourceTree = ""; }; + DB5A1365442D4419AF6F08E5 /* GTAmericaExp-MdIt.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-MdIt.otf"; path = "../assets/fonts/GTAmericaExp-MdIt.otf"; sourceTree = ""; }; + E9DF872C2525201700607FDC /* AirshipConfig.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = AirshipConfig.plist; sourceTree = ""; }; + ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; + ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; + EDBB0DF39D0F431E9A26F613 /* Pods-ExpensifyCash.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash.release.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash/Pods-ExpensifyCash.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 00E356EB1AD99517003FC87E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 184256DF4A33056F828927C6 /* libPods-ExpensifyCash-ExpensifyCashTests.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 376CCF91B872607D190AF0F6 /* libPods-ExpensifyCash.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 00E356EF1AD99517003FC87E /* ExpensifyCashTests */ = { + isa = PBXGroup; + children = ( + 00E356F21AD99517003FC87E /* ExpensifyCashTests.m */, + 00E356F01AD99517003FC87E /* Supporting Files */, + ); + path = ExpensifyCashTests; + sourceTree = ""; + }; + 00E356F01AD99517003FC87E /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 00E356F11AD99517003FC87E /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 13B07FAE1A68108700A75B9A /* ExpensifyCash */ = { + isa = PBXGroup; + children = ( + 0F5BE0CD252686320097D869 /* GoogleService-Info.plist */, + E9DF872C2525201700607FDC /* AirshipConfig.plist */, + 008F07F21AC5B25A0029DE68 /* main.jsbundle */, + 13B07FAF1A68108700A75B9A /* AppDelegate.h */, + 13B07FB01A68108700A75B9A /* AppDelegate.m */, + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 13B07FB61A68108700A75B9A /* Info.plist */, + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, + 13B07FB71A68108700A75B9A /* main.m */, + ); + name = ExpensifyCash; + sourceTree = ""; + }; + 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { + isa = PBXGroup; + children = ( + ED297162215061F000B7C4FE /* JavaScriptCore.framework */, + ED2971642150620600B7C4FE /* JavaScriptCore.framework */, + 4A679AD694BE9556E6B55BEA /* libPods-ExpensifyCash.a */, + 85425D131983D5EC5A012EF7 /* libPods-ExpensifyCash-ExpensifyCashTests.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 832341AE1AAA6A7D00B99B32 /* Libraries */ = { + isa = PBXGroup; + children = ( + ); + name = Libraries; + sourceTree = ""; + }; + 83CBB9F61A601CBA00E9B192 = { + isa = PBXGroup; + children = ( + 13B07FAE1A68108700A75B9A /* ExpensifyCash */, + 832341AE1AAA6A7D00B99B32 /* Libraries */, + 00E356EF1AD99517003FC87E /* ExpensifyCashTests */, + 83CBBA001A601CBA00E9B192 /* Products */, + 2D16E6871FA4F8E400B85C8A /* Frameworks */, + EC29677F0A49C2946A495A33 /* Pods */, + A9EA265D209D4558995C9BD4 /* Resources */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + usesTabs = 0; + }; + 83CBBA001A601CBA00E9B192 /* Products */ = { + isa = PBXGroup; + children = ( + 13B07F961A680F5B00A75B9A /* Expensify.cash.app */, + 00E356EE1AD99517003FC87E /* ExpensifyCashTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + A9EA265D209D4558995C9BD4 /* Resources */ = { + isa = PBXGroup; + children = ( + A5AAD008CBD84A6CAEB9AC97 /* GTAmericaExp-Bold.otf */, + 67D5C3A6A7FA417C8A853FC1 /* GTAmericaExp-Light.otf */, + AE65058949E14DA5A2D5435D /* GTAmericaExp-Medium.otf */, + 8C7003903C1E4957824899BB /* GTAmericaExp-Regular.otf */, + A292718541C841859D97DF2F /* GTAmericaExp-Thin.otf */, + 8437A5A38F2047E0BCCD7C2F /* GTAmericaExpMono-Rg.otf */, + A8D6F2F722FD4E66A38EBBB6 /* GTAmericaExp-BdIt.otf */, + DB5A1365442D4419AF6F08E5 /* GTAmericaExp-MdIt.otf */, + 918D7FEFF96242E6B5F5E14D /* GTAmericaExp-RgIt.otf */, + ); + name = Resources; + sourceTree = ""; + }; + EC29677F0A49C2946A495A33 /* Pods */ = { + isa = PBXGroup; + children = ( + 6B13CEF63D86C7980FA4F455 /* Pods-ExpensifyCash.debug.xcconfig */, + EDBB0DF39D0F431E9A26F613 /* Pods-ExpensifyCash.release.xcconfig */, + A90FC01D757217791C4E9131 /* Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig */, + 8CA0D27D73F4C48E98CCA0E9 /* Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 00E356ED1AD99517003FC87E /* ExpensifyCashTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "ExpensifyCashTests" */; + buildPhases = ( + 31F29FE5E41ACA3441D1941B /* [CP] Check Pods Manifest.lock */, + 00E356EA1AD99517003FC87E /* Sources */, + 00E356EB1AD99517003FC87E /* Frameworks */, + 00E356EC1AD99517003FC87E /* Resources */, + C5DF5C3874F91B17AFCBCB52 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + 00E356F51AD99517003FC87E /* PBXTargetDependency */, + ); + name = ExpensifyCashTests; + productName = ExpensifyCashTests; + productReference = 00E356EE1AD99517003FC87E /* ExpensifyCashTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 13B07F861A680F5B00A75B9A /* ExpensifyCash */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ExpensifyCash" */; + buildPhases = ( + 209CB27AD34BA50C3E1F4868 /* [CP] Check Pods Manifest.lock */, + FD10A7F022414F080027D42C /* Start Packager */, + 13B07F871A680F5B00A75B9A /* Sources */, + 13B07F8C1A680F5B00A75B9A /* Frameworks */, + 13B07F8E1A680F5B00A75B9A /* Resources */, + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + 3BD1D02836B845CFF3D9E447 /* [CP] Copy Pods Resources */, + B079B9CCBE57FB68AFC8F3B4 /* [CP-User] [RNFB] Core Configuration */, + F5D4F18823CA58548DB9253C /* [CP-User] [RNFB] Crashlytics Configuration */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ExpensifyCash; + productName = ExpensifyCash; + productReference = 13B07F961A680F5B00A75B9A /* Expensify.cash.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 83CBB9F71A601CBA00E9B192 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1130; + TargetAttributes = { + 00E356ED1AD99517003FC87E = { + CreatedOnToolsVersion = 6.2; + ProvisioningStyle = Automatic; + TestTargetID = 13B07F861A680F5B00A75B9A; + }; + 13B07F861A680F5B00A75B9A = { + DevelopmentTeam = 368M544MTT; + LastSwiftMigration = 1120; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "ExpensifyCash" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 83CBB9F61A601CBA00E9B192; + productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 13B07F861A680F5B00A75B9A /* ExpensifyCash */, + 00E356ED1AD99517003FC87E /* ExpensifyCashTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 00E356EC1AD99517003FC87E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8E1A680F5B00A75B9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, + 0F5BE0CE252686330097D869 /* GoogleService-Info.plist in Resources */, + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + E9DF872D2525201700607FDC /* AirshipConfig.plist in Resources */, + 12DD1878FCB9487C9F031C86 /* GTAmericaExpMono-Rg.otf in Resources */, + 1E76D5212522316A005A268F /* GTAmericaExp-Bold.otf in Resources */, + 1E76D5222522316A005A268F /* GTAmericaExp-Light.otf in Resources */, + 1E76D5232522316A005A268F /* GTAmericaExp-Medium.otf in Resources */, + 1E76D5242522316A005A268F /* GTAmericaExp-Regular.otf in Resources */, + 1E76D5252522316A005A268F /* GTAmericaExp-Thin.otf in Resources */, + 425866037F4C482AAB46CB8B /* GTAmericaExp-BdIt.otf in Resources */, + 6856B78873B64C44A92E51DB /* GTAmericaExp-MdIt.otf in Resources */, + 8821A238A081483FA947BC4E /* GTAmericaExp-RgIt.otf in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Bundle React Native code and images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; + }; + 209CB27AD34BA50C3E1F4868 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-ExpensifyCash-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 31F29FE5E41ACA3441D1941B /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-ExpensifyCash-ExpensifyCashTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 3BD1D02836B845CFF3D9E447 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-ExpensifyCash/Pods-ExpensifyCash-resources.sh", + "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAAutomationActions.plist", + "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageBannerContentView.xib", + "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageBannerView.xib", + "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageButtonView.xib", + "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageFullScreenViewController.xib", + "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageHTMLViewController.xib", + "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageModalViewController.xib", + "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageResizableViewController.xib", + "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAAutomation.xcdatamodeld", + "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAFrequencyLimits.xcdatamodeld", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UADefaultActions.plist", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UADefaultActionsTvOS.plist", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UANativeBridge", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UANotificationCategories.plist", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ar.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/cs.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/da.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/de.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/en.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/es-419.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/es.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/fi.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/fr.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/hi.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/hu.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/id.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/it.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/iw.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ja.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ko.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ms.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/nl.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/no.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/pl.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/pt-PT.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/pt.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ro.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ru.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/sk.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/sv.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/th.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/tr.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UAEvents.xcdatamodeld", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UARemoteData.xcdatamodeld", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/vi.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/zh-Hans.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/zh-Hant.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipExtendedActions/Resources/UAExtendedActions.plist", + "${PODS_ROOT}/Airship/Airship/AirshipExtendedActions/Resources/UARateAppPromptView.xib", + "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UADefaultMessageCenterListViewController.xib", + "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UADefaultMessageCenterMessageViewController.xib", + "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UAMessageCenterActions.plist", + "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UAMessageCenterListCell.xib", + "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UAMessageCenterPlaceholderIcon.png", + "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UAInbox.xcdatamodeld", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAAutomationActions.plist", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageBannerContentView.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageBannerView.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageButtonView.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageFullScreenViewController.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageHTMLViewController.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageModalViewController.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageResizableViewController.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAAutomation.momd", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAFrequencyLimits.momd", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UADefaultActions.plist", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UADefaultActionsTvOS.plist", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UANativeBridge", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UANotificationCategories.plist", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ar.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/cs.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/da.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/de.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/en.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/es-419.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/es.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/fi.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/fr.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/hi.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/hu.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/id.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/it.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/iw.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ja.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ko.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ms.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nl.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/no.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/pl.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/pt-PT.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/pt.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ro.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ru.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/sk.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/sv.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/th.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/tr.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAEvents.momd", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UARemoteData.momd", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/vi.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/zh-Hans.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/zh-Hant.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAExtendedActions.plist", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UARateAppPromptView.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UADefaultMessageCenterListViewController.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UADefaultMessageCenterMessageViewController.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAMessageCenterActions.plist", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAMessageCenterListCell.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAMessageCenterPlaceholderIcon.png", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInbox.momd", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ExpensifyCash/Pods-ExpensifyCash-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + B079B9CCBE57FB68AFC8F3B4 /* [CP-User] [RNFB] Core Configuration */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + name = "[CP-User] [RNFB] Core Configuration"; + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\nset -e\n\n_MAX_LOOKUPS=2;\n_SEARCH_RESULT=''\n_RN_ROOT_EXISTS=''\n_CURRENT_LOOKUPS=1\n_JSON_ROOT=\"'react-native'\"\n_JSON_FILE_NAME='firebase.json'\n_JSON_OUTPUT_BASE64='e30=' # { }\n_CURRENT_SEARCH_DIR=${PROJECT_DIR}\n_PLIST_BUDDY=/usr/libexec/PlistBuddy\n_TARGET_PLIST=\"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\n_DSYM_PLIST=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n# plist arrays\n_PLIST_ENTRY_KEYS=()\n_PLIST_ENTRY_TYPES=()\n_PLIST_ENTRY_VALUES=()\n\nfunction setPlistValue {\n echo \"info: setting plist entry '$1' of type '$2' in file '$4'\"\n ${_PLIST_BUDDY} -c \"Add :$1 $2 '$3'\" $4 || echo \"info: '$1' already exists\"\n}\n\nfunction getFirebaseJsonKeyValue () {\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n ruby -e \"require 'rubygems';require 'json'; output=JSON.parse('$1'); puts output[$_JSON_ROOT]['$2']\"\n else\n echo \"\"\n fi;\n}\n\nfunction jsonBoolToYesNo () {\n if [[ $1 == \"false\" ]]; then\n echo \"NO\"\n elif [[ $1 == \"true\" ]]; then\n echo \"YES\"\n else echo \"NO\"\n fi\n}\n\necho \"info: -> RNFB build script started\"\necho \"info: 1) Locating ${_JSON_FILE_NAME} file:\"\n\nif [[ -z ${_CURRENT_SEARCH_DIR} ]]; then\n _CURRENT_SEARCH_DIR=$(pwd)\nfi;\n\nwhile true; do\n _CURRENT_SEARCH_DIR=$(dirname \"$_CURRENT_SEARCH_DIR\")\n if [[ \"$_CURRENT_SEARCH_DIR\" == \"/\" ]] || [[ ${_CURRENT_LOOKUPS} -gt ${_MAX_LOOKUPS} ]]; then break; fi;\n echo \"info: ($_CURRENT_LOOKUPS of $_MAX_LOOKUPS) Searching in '$_CURRENT_SEARCH_DIR' for a ${_JSON_FILE_NAME} file.\"\n _SEARCH_RESULT=$(find \"$_CURRENT_SEARCH_DIR\" -maxdepth 2 -name ${_JSON_FILE_NAME} -print | head -n 1)\n if [[ ${_SEARCH_RESULT} ]]; then\n echo \"info: ${_JSON_FILE_NAME} found at $_SEARCH_RESULT\"\n break;\n fi;\n _CURRENT_LOOKUPS=$((_CURRENT_LOOKUPS+1))\ndone\n\nif [[ ${_SEARCH_RESULT} ]]; then\n _JSON_OUTPUT_RAW=$(cat \"${_SEARCH_RESULT}\")\n _RN_ROOT_EXISTS=$(ruby -e \"require 'rubygems';require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]\" || echo '')\n\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n _JSON_OUTPUT_BASE64=$(python -c 'import json,sys,base64;print(base64.b64encode(json.dumps(json.loads(open('\"'${_SEARCH_RESULT}'\"').read())['${_JSON_ROOT}'])))' || echo \"e30=\")\n fi\n\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n\n # config.messaging_auto_init_enabled\n _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"messaging_auto_init_enabled\")\n if [[ $_MESSAGING_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseMessagingAutoInitEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_MESSAGING_AUTO_INIT\")\")\n fi\n\n # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful\n _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"crashlytics_disable_auto_disabler\")\n if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == \"true\" ]]; then\n echo \"Disabled Crashlytics auto disabler.\" # do nothing\n else\n _PLIST_ENTRY_KEYS+=(\"FirebaseCrashlyticsCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"NO\")\n fi\n\n # config.admob_delay_app_measurement_init\n _ADMOB_DELAY_APP_MEASUREMENT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"admob_delay_app_measurement_init\")\n if [[ $_ADMOB_DELAY_APP_MEASUREMENT == \"true\" ]]; then\n _PLIST_ENTRY_KEYS+=(\"GADDelayAppMeasurementInit\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"YES\")\n fi\n\n # config.admob_ios_app_id\n _ADMOB_IOS_APP_ID=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"admob_ios_app_id\")\n if [[ $_ADMOB_IOS_APP_ID ]]; then\n _PLIST_ENTRY_KEYS+=(\"GADApplicationIdentifier\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_ADMOB_IOS_APP_ID\")\n fi\nelse\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n echo \"warning: A firebase.json file was not found, whilst this file is optional it is recommended to include it to configure firebase services in React Native Firebase.\"\nfi;\n\necho \"info: 2) Injecting Info.plist entries: \"\n\n# Log out the keys we're adding\nfor i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n echo \" -> $i) ${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\"\ndone\n\nfor plist in \"${_TARGET_PLIST}\" \"${_DSYM_PLIST}\" ; do\n if [[ -f \"${plist}\" ]]; then\n\n # paths with spaces break the call to setPlistValue. temporarily modify\n # the shell internal field separator variable (IFS), which normally\n # includes spaces, to consist only of line breaks\n oldifs=$IFS\n IFS=\"\n\"\n\n for i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n setPlistValue \"${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\" \"${plist}\"\n done\n\n # restore the original internal field separator value\n IFS=$oldifs\n else\n echo \"warning: A Info.plist build output file was not found (${plist})\"\n fi\ndone\n\necho \"info: <- RNFB build script finished\"\n"; + }; + C5DF5C3874F91B17AFCBCB52 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-ExpensifyCash-ExpensifyCashTests/Pods-ExpensifyCash-ExpensifyCashTests-resources.sh", + "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAAutomationActions.plist", + "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageBannerContentView.xib", + "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageBannerView.xib", + "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageButtonView.xib", + "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageFullScreenViewController.xib", + "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageHTMLViewController.xib", + "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageModalViewController.xib", + "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAInAppMessageResizableViewController.xib", + "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAAutomation.xcdatamodeld", + "${PODS_ROOT}/Airship/Airship/AirshipAutomation/Resources/UAFrequencyLimits.xcdatamodeld", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UADefaultActions.plist", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UADefaultActionsTvOS.plist", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UANativeBridge", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UANotificationCategories.plist", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ar.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/cs.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/da.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/de.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/en.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/es-419.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/es.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/fi.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/fr.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/hi.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/hu.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/id.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/it.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/iw.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ja.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ko.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ms.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/nl.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/no.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/pl.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/pt-PT.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/pt.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ro.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/ru.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/sk.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/sv.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/th.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/tr.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UAEvents.xcdatamodeld", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/UARemoteData.xcdatamodeld", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/vi.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/zh-Hans.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipCore/Resources/zh-Hant.lproj", + "${PODS_ROOT}/Airship/Airship/AirshipExtendedActions/Resources/UAExtendedActions.plist", + "${PODS_ROOT}/Airship/Airship/AirshipExtendedActions/Resources/UARateAppPromptView.xib", + "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UADefaultMessageCenterListViewController.xib", + "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UADefaultMessageCenterMessageViewController.xib", + "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UAMessageCenterActions.plist", + "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UAMessageCenterListCell.xib", + "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UAMessageCenterPlaceholderIcon.png", + "${PODS_ROOT}/Airship/Airship/AirshipMessageCenter/Resources/UAInbox.xcdatamodeld", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAAutomationActions.plist", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageBannerContentView.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageBannerView.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageButtonView.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageFullScreenViewController.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageHTMLViewController.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageModalViewController.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInAppMessageResizableViewController.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAAutomation.momd", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAFrequencyLimits.momd", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UADefaultActions.plist", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UADefaultActionsTvOS.plist", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UANativeBridge", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UANotificationCategories.plist", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ar.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/cs.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/da.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/de.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/en.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/es-419.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/es.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/fi.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/fr.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/hi.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/hu.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/id.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/it.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/iw.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ja.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ko.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ms.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nl.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/no.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/pl.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/pt-PT.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/pt.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ro.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ru.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/sk.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/sv.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/th.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/tr.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAEvents.momd", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UARemoteData.momd", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/vi.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/zh-Hans.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/zh-Hant.lproj", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAExtendedActions.plist", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UARateAppPromptView.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UADefaultMessageCenterListViewController.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UADefaultMessageCenterMessageViewController.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAMessageCenterActions.plist", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAMessageCenterListCell.nib", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAMessageCenterPlaceholderIcon.png", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UAInbox.momd", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ExpensifyCash-ExpensifyCashTests/Pods-ExpensifyCash-ExpensifyCashTests-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + F5D4F18823CA58548DB9253C /* [CP-User] [RNFB] Crashlytics Configuration */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + name = "[CP-User] [RNFB] Crashlytics Configuration"; + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\nset -e\n\nif [[ ${PODS_ROOT} ]]; then\n echo \"info: Exec FirebaseCrashlytics Run from Pods\"\n \"${PODS_ROOT}/FirebaseCrashlytics/run\"\nelse\n echo \"info: Exec FirebaseCrashlytics Run from framework\"\n \"${PROJECT_DIR}/FirebaseCrashlytics.framework/run\"\nfi\n"; + }; + FD10A7F022414F080027D42C /* Start Packager */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Start Packager"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 00E356EA1AD99517003FC87E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 00E356F31AD99517003FC87E /* ExpensifyCashTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F871A680F5B00A75B9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, + 13B07FC11A68108700A75B9A /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 13B07F861A680F5B00A75B9A /* ExpensifyCash */; + targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 00E356F61AD99517003FC87E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A90FC01D757217791C4E9131 /* Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = ExpensifyCashTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + "$(inherited)", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ExpensifyCash.app/ExpensifyCash"; + }; + name = Debug; + }; + 00E356F71AD99517003FC87E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8CA0D27D73F4C48E98CCA0E9 /* Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEVELOPMENT_TEAM = 368M544MTT; + INFOPLIST_FILE = ExpensifyCashTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + "$(inherited)", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ExpensifyCash.app/ExpensifyCash"; + }; + name = Release; + }; + 13B07F941A680F5B00A75B9A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6B13CEF63D86C7980FA4F455 /* Pods-ExpensifyCash.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = ExpensifyCash/Chat.entitlements; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 3; + DEVELOPMENT_TEAM = 368M544MTT; + ENABLE_BITCODE = NO; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; + INFOPLIST_FILE = ExpensifyCash/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 1.0.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat; + PRODUCT_NAME = Expensify.cash; + PROVISIONING_PROFILE_SPECIFIER = chat_expensify_appstore; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 13B07F951A680F5B00A75B9A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EDBB0DF39D0F431E9A26F613 /* Pods-ExpensifyCash.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = ExpensifyCash/Chat.entitlements; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 3; + DEVELOPMENT_TEAM = 368M544MTT; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; + INFOPLIST_FILE = ExpensifyCash/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 1.0.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat; + PRODUCT_NAME = Expensify.cash; + PROVISIONING_PROFILE_SPECIFIER = chat_expensify_appstore; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + 83CBBA201A601CBA00E9B192 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; + LIBRARY_SEARCH_PATHS = ( + "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", + "\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"", + "\"$(inherited)\"", + ); + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 83CBBA211A601CBA00E9B192 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; + LIBRARY_SEARCH_PATHS = ( + "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", + "\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"", + "\"$(inherited)\"", + ); + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "ExpensifyCashTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 00E356F61AD99517003FC87E /* Debug */, + 00E356F71AD99517003FC87E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ExpensifyCash" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13B07F941A680F5B00A75B9A /* Debug */, + 13B07F951A680F5B00A75B9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "ExpensifyCash" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83CBBA201A601CBA00E9B192 /* Debug */, + 83CBBA211A601CBA00E9B192 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; +} diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 000000000000..f156ce086c14 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,699 @@ +PODS: + - Airship (14.2.0): + - Airship/Automation (= 14.2.0) + - Airship/Core (= 14.2.0) + - Airship/ExtendedActions (= 14.2.0) + - Airship/MessageCenter (= 14.2.0) + - Airship/Automation (14.2.0): + - Airship/Core + - Airship/Core (14.2.0) + - Airship/ExtendedActions (14.2.0): + - Airship/Core + - Airship/MessageCenter (14.2.0): + - Airship/Core + - boost-for-react-native (1.63.0) + - CocoaAsyncSocket (7.6.5) + - CocoaLibEvent (1.0.0) + - DoubleConversion (1.1.6) + - FBLazyVector (0.63.3) + - FBReactNativeSpec (0.63.3): + - Folly (= 2020.01.13.00) + - RCTRequired (= 0.63.3) + - RCTTypeSafety (= 0.63.3) + - React-Core (= 0.63.3) + - React-jsi (= 0.63.3) + - ReactCommon/turbomodule/core (= 0.63.3) + - Firebase/Analytics (6.34.0): + - Firebase/Core + - Firebase/Core (6.34.0): + - Firebase/CoreOnly + - FirebaseAnalytics (= 6.9.0) + - Firebase/CoreOnly (6.34.0): + - FirebaseCore (= 6.10.4) + - Firebase/Crashlytics (6.34.0): + - Firebase/CoreOnly + - FirebaseCrashlytics (~> 4.6.2) + - FirebaseAnalytics (6.9.0): + - FirebaseCore (~> 6.10) + - FirebaseInstallations (~> 1.7) + - GoogleAppMeasurement (= 6.9.0) + - GoogleUtilities/AppDelegateSwizzler (~> 6.7) + - GoogleUtilities/MethodSwizzler (~> 6.7) + - GoogleUtilities/Network (~> 6.7) + - "GoogleUtilities/NSData+zlib (~> 6.7)" + - nanopb (~> 1.30906.0) + - FirebaseCore (6.10.4): + - FirebaseCoreDiagnostics (~> 1.6) + - GoogleUtilities/Environment (~> 6.7) + - GoogleUtilities/Logger (~> 6.7) + - FirebaseCoreDiagnostics (1.7.0): + - GoogleDataTransport (~> 7.4) + - GoogleUtilities/Environment (~> 6.7) + - GoogleUtilities/Logger (~> 6.7) + - nanopb (~> 1.30906.0) + - FirebaseCrashlytics (4.6.2): + - FirebaseCore (~> 6.10) + - FirebaseInstallations (~> 1.6) + - GoogleDataTransport (~> 7.2) + - nanopb (~> 1.30906.0) + - PromisesObjC (~> 1.2) + - FirebaseInstallations (1.7.0): + - FirebaseCore (~> 6.10) + - GoogleUtilities/Environment (~> 6.7) + - GoogleUtilities/UserDefaults (~> 6.7) + - PromisesObjC (~> 1.2) + - Flipper (0.54.0): + - Flipper-Folly (~> 2.2) + - Flipper-RSocket (~> 1.1) + - Flipper-DoubleConversion (1.1.7) + - Flipper-Folly (2.3.0): + - boost-for-react-native + - CocoaLibEvent (~> 1.0) + - Flipper-DoubleConversion + - Flipper-Glog + - OpenSSL-Universal (= 1.0.2.20) + - Flipper-Glog (0.3.6) + - Flipper-PeerTalk (0.0.4) + - Flipper-RSocket (1.1.0): + - Flipper-Folly (~> 2.2) + - FlipperKit (0.54.0): + - FlipperKit/Core (= 0.54.0) + - FlipperKit/Core (0.54.0): + - Flipper (~> 0.54.0) + - FlipperKit/CppBridge + - FlipperKit/FBCxxFollyDynamicConvert + - FlipperKit/FBDefines + - FlipperKit/FKPortForwarding + - FlipperKit/CppBridge (0.54.0): + - Flipper (~> 0.54.0) + - FlipperKit/FBCxxFollyDynamicConvert (0.54.0): + - Flipper-Folly (~> 2.2) + - FlipperKit/FBDefines (0.54.0) + - FlipperKit/FKPortForwarding (0.54.0): + - CocoaAsyncSocket (~> 7.6) + - Flipper-PeerTalk (~> 0.0.4) + - FlipperKit/FlipperKitHighlightOverlay (0.54.0) + - FlipperKit/FlipperKitLayoutPlugin (0.54.0): + - FlipperKit/Core + - FlipperKit/FlipperKitHighlightOverlay + - FlipperKit/FlipperKitLayoutTextSearchable + - YogaKit (~> 1.18) + - FlipperKit/FlipperKitLayoutTextSearchable (0.54.0) + - FlipperKit/FlipperKitNetworkPlugin (0.54.0): + - FlipperKit/Core + - FlipperKit/FlipperKitReactPlugin (0.54.0): + - FlipperKit/Core + - FlipperKit/FlipperKitUserDefaultsPlugin (0.54.0): + - FlipperKit/Core + - FlipperKit/SKIOSNetworkPlugin (0.54.0): + - FlipperKit/Core + - FlipperKit/FlipperKitNetworkPlugin + - Folly (2020.01.13.00): + - boost-for-react-native + - DoubleConversion + - Folly/Default (= 2020.01.13.00) + - glog + - Folly/Default (2020.01.13.00): + - boost-for-react-native + - DoubleConversion + - glog + - glog (0.3.5) + - GoogleAppMeasurement (6.9.0): + - GoogleUtilities/AppDelegateSwizzler (~> 6.7) + - GoogleUtilities/MethodSwizzler (~> 6.7) + - GoogleUtilities/Network (~> 6.7) + - "GoogleUtilities/NSData+zlib (~> 6.7)" + - nanopb (~> 1.30906.0) + - GoogleDataTransport (7.5.1): + - nanopb (~> 1.30906.0) + - GoogleUtilities/AppDelegateSwizzler (6.7.2): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Environment (6.7.2): + - PromisesObjC (~> 1.2) + - GoogleUtilities/Logger (6.7.2): + - GoogleUtilities/Environment + - GoogleUtilities/MethodSwizzler (6.7.2): + - GoogleUtilities/Logger + - GoogleUtilities/Network (6.7.2): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (6.7.2)" + - GoogleUtilities/Reachability (6.7.2): + - GoogleUtilities/Logger + - GoogleUtilities/UserDefaults (6.7.2): + - GoogleUtilities/Logger + - nanopb (1.30906.0): + - nanopb/decode (= 1.30906.0) + - nanopb/encode (= 1.30906.0) + - nanopb/decode (1.30906.0) + - nanopb/encode (1.30906.0) + - OpenSSL-Universal (1.0.2.20): + - OpenSSL-Universal/Static (= 1.0.2.20) + - OpenSSL-Universal/Static (1.0.2.20) + - PromisesObjC (1.2.11) + - RCTRequired (0.63.3) + - RCTTypeSafety (0.63.3): + - FBLazyVector (= 0.63.3) + - Folly (= 2020.01.13.00) + - RCTRequired (= 0.63.3) + - React-Core (= 0.63.3) + - React (0.63.3): + - React-Core (= 0.63.3) + - React-Core/DevSupport (= 0.63.3) + - React-Core/RCTWebSocket (= 0.63.3) + - React-RCTActionSheet (= 0.63.3) + - React-RCTAnimation (= 0.63.3) + - React-RCTBlob (= 0.63.3) + - React-RCTImage (= 0.63.3) + - React-RCTLinking (= 0.63.3) + - React-RCTNetwork (= 0.63.3) + - React-RCTSettings (= 0.63.3) + - React-RCTText (= 0.63.3) + - React-RCTVibration (= 0.63.3) + - React-callinvoker (0.63.3) + - React-Core (0.63.3): + - Folly (= 2020.01.13.00) + - glog + - React-Core/Default (= 0.63.3) + - React-cxxreact (= 0.63.3) + - React-jsi (= 0.63.3) + - React-jsiexecutor (= 0.63.3) + - Yoga + - React-Core/CoreModulesHeaders (0.63.3): + - Folly (= 2020.01.13.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.63.3) + - React-jsi (= 0.63.3) + - React-jsiexecutor (= 0.63.3) + - Yoga + - React-Core/Default (0.63.3): + - Folly (= 2020.01.13.00) + - glog + - React-cxxreact (= 0.63.3) + - React-jsi (= 0.63.3) + - React-jsiexecutor (= 0.63.3) + - Yoga + - React-Core/DevSupport (0.63.3): + - Folly (= 2020.01.13.00) + - glog + - React-Core/Default (= 0.63.3) + - React-Core/RCTWebSocket (= 0.63.3) + - React-cxxreact (= 0.63.3) + - React-jsi (= 0.63.3) + - React-jsiexecutor (= 0.63.3) + - React-jsinspector (= 0.63.3) + - Yoga + - React-Core/RCTActionSheetHeaders (0.63.3): + - Folly (= 2020.01.13.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.63.3) + - React-jsi (= 0.63.3) + - React-jsiexecutor (= 0.63.3) + - Yoga + - React-Core/RCTAnimationHeaders (0.63.3): + - Folly (= 2020.01.13.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.63.3) + - React-jsi (= 0.63.3) + - React-jsiexecutor (= 0.63.3) + - Yoga + - React-Core/RCTBlobHeaders (0.63.3): + - Folly (= 2020.01.13.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.63.3) + - React-jsi (= 0.63.3) + - React-jsiexecutor (= 0.63.3) + - Yoga + - React-Core/RCTImageHeaders (0.63.3): + - Folly (= 2020.01.13.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.63.3) + - React-jsi (= 0.63.3) + - React-jsiexecutor (= 0.63.3) + - Yoga + - React-Core/RCTLinkingHeaders (0.63.3): + - Folly (= 2020.01.13.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.63.3) + - React-jsi (= 0.63.3) + - React-jsiexecutor (= 0.63.3) + - Yoga + - React-Core/RCTNetworkHeaders (0.63.3): + - Folly (= 2020.01.13.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.63.3) + - React-jsi (= 0.63.3) + - React-jsiexecutor (= 0.63.3) + - Yoga + - React-Core/RCTSettingsHeaders (0.63.3): + - Folly (= 2020.01.13.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.63.3) + - React-jsi (= 0.63.3) + - React-jsiexecutor (= 0.63.3) + - Yoga + - React-Core/RCTTextHeaders (0.63.3): + - Folly (= 2020.01.13.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.63.3) + - React-jsi (= 0.63.3) + - React-jsiexecutor (= 0.63.3) + - Yoga + - React-Core/RCTVibrationHeaders (0.63.3): + - Folly (= 2020.01.13.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.63.3) + - React-jsi (= 0.63.3) + - React-jsiexecutor (= 0.63.3) + - Yoga + - React-Core/RCTWebSocket (0.63.3): + - Folly (= 2020.01.13.00) + - glog + - React-Core/Default (= 0.63.3) + - React-cxxreact (= 0.63.3) + - React-jsi (= 0.63.3) + - React-jsiexecutor (= 0.63.3) + - Yoga + - React-CoreModules (0.63.3): + - FBReactNativeSpec (= 0.63.3) + - Folly (= 2020.01.13.00) + - RCTTypeSafety (= 0.63.3) + - React-Core/CoreModulesHeaders (= 0.63.3) + - React-jsi (= 0.63.3) + - React-RCTImage (= 0.63.3) + - ReactCommon/turbomodule/core (= 0.63.3) + - React-cxxreact (0.63.3): + - boost-for-react-native (= 1.63.0) + - DoubleConversion + - Folly (= 2020.01.13.00) + - glog + - React-callinvoker (= 0.63.3) + - React-jsinspector (= 0.63.3) + - React-jsi (0.63.3): + - boost-for-react-native (= 1.63.0) + - DoubleConversion + - Folly (= 2020.01.13.00) + - glog + - React-jsi/Default (= 0.63.3) + - React-jsi/Default (0.63.3): + - boost-for-react-native (= 1.63.0) + - DoubleConversion + - Folly (= 2020.01.13.00) + - glog + - React-jsiexecutor (0.63.3): + - DoubleConversion + - Folly (= 2020.01.13.00) + - glog + - React-cxxreact (= 0.63.3) + - React-jsi (= 0.63.3) + - React-jsinspector (0.63.3) + - react-native-config (1.4.1): + - react-native-config/App (= 1.4.1) + - react-native-config/App (1.4.1): + - React-Core + - react-native-document-picker (4.0.0): + - React-Core + - react-native-image-picker (2.3.4): + - React-Core + - react-native-netinfo (5.9.10): + - React-Core + - react-native-pdf (6.2.2): + - React-Core + - react-native-progress-bar-android (1.0.4): + - React + - react-native-progress-view (1.2.3): + - React + - react-native-safe-area-context (3.1.8): + - React-Core + - React-RCTActionSheet (0.63.3): + - React-Core/RCTActionSheetHeaders (= 0.63.3) + - React-RCTAnimation (0.63.3): + - FBReactNativeSpec (= 0.63.3) + - Folly (= 2020.01.13.00) + - RCTTypeSafety (= 0.63.3) + - React-Core/RCTAnimationHeaders (= 0.63.3) + - React-jsi (= 0.63.3) + - ReactCommon/turbomodule/core (= 0.63.3) + - React-RCTBlob (0.63.3): + - FBReactNativeSpec (= 0.63.3) + - Folly (= 2020.01.13.00) + - React-Core/RCTBlobHeaders (= 0.63.3) + - React-Core/RCTWebSocket (= 0.63.3) + - React-jsi (= 0.63.3) + - React-RCTNetwork (= 0.63.3) + - ReactCommon/turbomodule/core (= 0.63.3) + - React-RCTImage (0.63.3): + - FBReactNativeSpec (= 0.63.3) + - Folly (= 2020.01.13.00) + - RCTTypeSafety (= 0.63.3) + - React-Core/RCTImageHeaders (= 0.63.3) + - React-jsi (= 0.63.3) + - React-RCTNetwork (= 0.63.3) + - ReactCommon/turbomodule/core (= 0.63.3) + - React-RCTLinking (0.63.3): + - FBReactNativeSpec (= 0.63.3) + - React-Core/RCTLinkingHeaders (= 0.63.3) + - React-jsi (= 0.63.3) + - ReactCommon/turbomodule/core (= 0.63.3) + - React-RCTNetwork (0.63.3): + - FBReactNativeSpec (= 0.63.3) + - Folly (= 2020.01.13.00) + - RCTTypeSafety (= 0.63.3) + - React-Core/RCTNetworkHeaders (= 0.63.3) + - React-jsi (= 0.63.3) + - ReactCommon/turbomodule/core (= 0.63.3) + - React-RCTSettings (0.63.3): + - FBReactNativeSpec (= 0.63.3) + - Folly (= 2020.01.13.00) + - RCTTypeSafety (= 0.63.3) + - React-Core/RCTSettingsHeaders (= 0.63.3) + - React-jsi (= 0.63.3) + - ReactCommon/turbomodule/core (= 0.63.3) + - React-RCTText (0.63.3): + - React-Core/RCTTextHeaders (= 0.63.3) + - React-RCTVibration (0.63.3): + - FBReactNativeSpec (= 0.63.3) + - Folly (= 2020.01.13.00) + - React-Core/RCTVibrationHeaders (= 0.63.3) + - React-jsi (= 0.63.3) + - ReactCommon/turbomodule/core (= 0.63.3) + - ReactCommon/turbomodule/core (0.63.3): + - DoubleConversion + - Folly (= 2020.01.13.00) + - glog + - React-callinvoker (= 0.63.3) + - React-Core (= 0.63.3) + - React-cxxreact (= 0.63.3) + - React-jsi (= 0.63.3) + - rn-fetch-blob (0.12.0): + - React-Core + - RNCAsyncStorage (1.12.1): + - React-Core + - RNCMaskedView (0.1.10): + - React + - RNCPicker (1.9.11): + - React-Core + - RNFBAnalytics (7.6.8): + - Firebase/Analytics (~> 6.34.0) + - React-Core + - RNFBApp + - RNFBApp (8.4.6): + - Firebase/CoreOnly (~> 6.34.0) + - React-Core + - RNFBCrashlytics (8.4.10): + - Firebase/Crashlytics (~> 6.34.0) + - React-Core + - RNFBApp + - RNGestureHandler (1.9.0): + - React-Core + - RNReanimated (1.13.2): + - React-Core + - RNScreens (2.17.1): + - React-Core + - RNSVG (12.1.0): + - React + - urbanairship-react-native (10.0.0): + - Airship (= 14.2.0) + - React-Core + - Yoga (1.14.0) + - YogaKit (1.18.1): + - Yoga (~> 1.14) + +DEPENDENCIES: + - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) + - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) + - FBReactNativeSpec (from `../node_modules/react-native/Libraries/FBReactNativeSpec`) + - Flipper (~> 0.54.0) + - Flipper-DoubleConversion (= 1.1.7) + - Flipper-Folly (~> 2.2) + - Flipper-Glog (= 0.3.6) + - Flipper-PeerTalk (~> 0.0.4) + - Flipper-RSocket (~> 1.1) + - FlipperKit (~> 0.54.0) + - FlipperKit/Core (~> 0.54.0) + - FlipperKit/CppBridge (~> 0.54.0) + - FlipperKit/FBCxxFollyDynamicConvert (~> 0.54.0) + - FlipperKit/FBDefines (~> 0.54.0) + - FlipperKit/FKPortForwarding (~> 0.54.0) + - FlipperKit/FlipperKitHighlightOverlay (~> 0.54.0) + - FlipperKit/FlipperKitLayoutPlugin (~> 0.54.0) + - FlipperKit/FlipperKitLayoutTextSearchable (~> 0.54.0) + - FlipperKit/FlipperKitNetworkPlugin (~> 0.54.0) + - FlipperKit/FlipperKitReactPlugin (~> 0.54.0) + - FlipperKit/FlipperKitUserDefaultsPlugin (~> 0.54.0) + - FlipperKit/SKIOSNetworkPlugin (~> 0.54.0) + - Folly (from `../node_modules/react-native/third-party-podspecs/Folly.podspec`) + - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) + - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) + - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) + - React (from `../node_modules/react-native/`) + - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) + - React-Core (from `../node_modules/react-native/`) + - React-Core/DevSupport (from `../node_modules/react-native/`) + - React-Core/RCTWebSocket (from `../node_modules/react-native/`) + - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) + - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) + - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) + - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) + - react-native-config (from `../node_modules/react-native-config`) + - react-native-document-picker (from `../node_modules/react-native-document-picker`) + - react-native-image-picker (from `../node_modules/react-native-image-picker`) + - "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)" + - react-native-pdf (from `../node_modules/react-native-pdf`) + - "react-native-progress-bar-android (from `../node_modules/@react-native-community/progress-bar-android`)" + - "react-native-progress-view (from `../node_modules/@react-native-community/progress-view`)" + - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) + - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) + - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) + - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) + - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) + - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) + - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) + - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) + - React-RCTText (from `../node_modules/react-native/Libraries/Text`) + - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) + - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - rn-fetch-blob (from `../node_modules/rn-fetch-blob`) + - "RNCAsyncStorage (from `../node_modules/@react-native-community/async-storage`)" + - "RNCMaskedView (from `../node_modules/@react-native-community/masked-view`)" + - "RNCPicker (from `../node_modules/@react-native-picker/picker`)" + - "RNFBAnalytics (from `../node_modules/@react-native-firebase/analytics`)" + - "RNFBApp (from `../node_modules/@react-native-firebase/app`)" + - "RNFBCrashlytics (from `../node_modules/@react-native-firebase/crashlytics`)" + - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) + - RNReanimated (from `../node_modules/react-native-reanimated`) + - RNScreens (from `../node_modules/react-native-screens`) + - RNSVG (from `../node_modules/react-native-svg`) + - urbanairship-react-native (from `../node_modules/urbanairship-react-native`) + - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) + +SPEC REPOS: + trunk: + - Airship + - boost-for-react-native + - CocoaAsyncSocket + - CocoaLibEvent + - Firebase + - FirebaseAnalytics + - FirebaseCore + - FirebaseCoreDiagnostics + - FirebaseCrashlytics + - FirebaseInstallations + - Flipper + - Flipper-DoubleConversion + - Flipper-Folly + - Flipper-Glog + - Flipper-PeerTalk + - Flipper-RSocket + - FlipperKit + - GoogleAppMeasurement + - GoogleDataTransport + - GoogleUtilities + - nanopb + - OpenSSL-Universal + - PromisesObjC + - YogaKit + +EXTERNAL SOURCES: + DoubleConversion: + :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + FBLazyVector: + :path: "../node_modules/react-native/Libraries/FBLazyVector" + FBReactNativeSpec: + :path: "../node_modules/react-native/Libraries/FBReactNativeSpec" + Folly: + :podspec: "../node_modules/react-native/third-party-podspecs/Folly.podspec" + glog: + :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" + RCTRequired: + :path: "../node_modules/react-native/Libraries/RCTRequired" + RCTTypeSafety: + :path: "../node_modules/react-native/Libraries/TypeSafety" + React: + :path: "../node_modules/react-native/" + React-callinvoker: + :path: "../node_modules/react-native/ReactCommon/callinvoker" + React-Core: + :path: "../node_modules/react-native/" + React-CoreModules: + :path: "../node_modules/react-native/React/CoreModules" + React-cxxreact: + :path: "../node_modules/react-native/ReactCommon/cxxreact" + React-jsi: + :path: "../node_modules/react-native/ReactCommon/jsi" + React-jsiexecutor: + :path: "../node_modules/react-native/ReactCommon/jsiexecutor" + React-jsinspector: + :path: "../node_modules/react-native/ReactCommon/jsinspector" + react-native-config: + :path: "../node_modules/react-native-config" + react-native-document-picker: + :path: "../node_modules/react-native-document-picker" + react-native-image-picker: + :path: "../node_modules/react-native-image-picker" + react-native-netinfo: + :path: "../node_modules/@react-native-community/netinfo" + react-native-pdf: + :path: "../node_modules/react-native-pdf" + react-native-progress-bar-android: + :path: "../node_modules/@react-native-community/progress-bar-android" + react-native-progress-view: + :path: "../node_modules/@react-native-community/progress-view" + react-native-safe-area-context: + :path: "../node_modules/react-native-safe-area-context" + React-RCTActionSheet: + :path: "../node_modules/react-native/Libraries/ActionSheetIOS" + React-RCTAnimation: + :path: "../node_modules/react-native/Libraries/NativeAnimation" + React-RCTBlob: + :path: "../node_modules/react-native/Libraries/Blob" + React-RCTImage: + :path: "../node_modules/react-native/Libraries/Image" + React-RCTLinking: + :path: "../node_modules/react-native/Libraries/LinkingIOS" + React-RCTNetwork: + :path: "../node_modules/react-native/Libraries/Network" + React-RCTSettings: + :path: "../node_modules/react-native/Libraries/Settings" + React-RCTText: + :path: "../node_modules/react-native/Libraries/Text" + React-RCTVibration: + :path: "../node_modules/react-native/Libraries/Vibration" + ReactCommon: + :path: "../node_modules/react-native/ReactCommon" + rn-fetch-blob: + :path: "../node_modules/rn-fetch-blob" + RNCAsyncStorage: + :path: "../node_modules/@react-native-community/async-storage" + RNCMaskedView: + :path: "../node_modules/@react-native-community/masked-view" + RNCPicker: + :path: "../node_modules/@react-native-picker/picker" + RNFBAnalytics: + :path: "../node_modules/@react-native-firebase/analytics" + RNFBApp: + :path: "../node_modules/@react-native-firebase/app" + RNFBCrashlytics: + :path: "../node_modules/@react-native-firebase/crashlytics" + RNGestureHandler: + :path: "../node_modules/react-native-gesture-handler" + RNReanimated: + :path: "../node_modules/react-native-reanimated" + RNScreens: + :path: "../node_modules/react-native-screens" + RNSVG: + :path: "../node_modules/react-native-svg" + urbanairship-react-native: + :path: "../node_modules/urbanairship-react-native" + Yoga: + :path: "../node_modules/react-native/ReactCommon/yoga" + +SPEC CHECKSUMS: + Airship: 02ad73780f9eed21870e36b0aaab327acda6a102 + boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c + CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 + CocoaLibEvent: 2fab71b8bd46dd33ddb959f7928ec5909f838e3f + DoubleConversion: cde416483dac037923206447da6e1454df403714 + FBLazyVector: 878b59e31113e289e275165efbe4b54fa614d43d + FBReactNativeSpec: 7da9338acfb98d4ef9e5536805a0704572d33c2f + Firebase: c23a36d9e4cdf7877dfcba8dd0c58add66358999 + FirebaseAnalytics: 3bb096873ee0d7fa4b6c70f5e9166b6da413cc7f + FirebaseCore: d3a978a3cfa3240bf7e4ba7d137fdf5b22b628ec + FirebaseCoreDiagnostics: 770ac5958e1372ce67959ae4b4f31d8e127c3ac1 + FirebaseCrashlytics: 1a747c9cc084a24dc6d9511c991db1cd078154eb + FirebaseInstallations: 466c7b4d1f58fe16707693091da253726a731ed2 + Flipper: be611d4b742d8c87fbae2ca5f44603a02539e365 + Flipper-DoubleConversion: 38631e41ef4f9b12861c67d17cb5518d06badc41 + Flipper-Folly: e4493b013c02d9347d5e0cb4d128680239f6c78a + Flipper-Glog: 1dfd6abf1e922806c52ceb8701a3599a79a200a6 + Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9 + Flipper-RSocket: 64e7431a55835eb953b0bf984ef3b90ae9fdddd7 + FlipperKit: ab353d41aea8aae2ea6daaf813e67496642f3d7d + Folly: b73c3869541e86821df3c387eb0af5f65addfab4 + glog: 40a13f7840415b9a77023fbcae0f1e6f43192af3 + GoogleAppMeasurement: a6a3a066369828db64eda428cb2856dc1cdc7c4e + GoogleDataTransport: f56af7caa4ed338dc8e138a5d7c5973e66440833 + GoogleUtilities: 7f2f5a07f888cdb145101d6042bc4422f57e70b3 + nanopb: 59317e09cf1f1a0af72f12af412d54edf52603fc + OpenSSL-Universal: ff34003318d5e1163e9529b08470708e389ffcdd + PromisesObjC: 8c196f5a328c2cba3e74624585467a557dcb482f + RCTRequired: 48884c74035a0b5b76dbb7a998bd93bcfc5f2047 + RCTTypeSafety: edf4b618033c2f1c5b7bc3d90d8e085ed95ba2ab + React: f36e90f3ceb976546e97df3403e37d226f79d0e3 + React-callinvoker: 18874f621eb96625df7a24a7dc8d6e07391affcd + React-Core: ac3d816b8e3493970153f4aaf0cff18af0bb95e6 + React-CoreModules: 4016d3a4e518bcfc4f5a51252b5a05692ca6f0e1 + React-cxxreact: ffc9129013b87cb36cf3f30a86695a3c397b0f99 + React-jsi: df07aa95b39c5be3e41199921509bfa929ed2b9d + React-jsiexecutor: b56c03e61c0dd5f5801255f2160a815f4a53d451 + React-jsinspector: 8e68ffbfe23880d3ee9bafa8be2777f60b25cbe2 + react-native-config: d8b45133fd13d4f23bd2064b72f6e2c08b2763ed + react-native-document-picker: b3e78a8f7fef98b5cb069f20fc35797d55e68e28 + react-native-image-picker: 32d1ad2c0024ca36161ae0d5c2117e2d6c441f11 + react-native-netinfo: 52cf0ee8342548a485e28f4b09e56b477567244d + react-native-pdf: 4b5a9e4465a6a3b399e91dc4838eb44ddf716d1f + react-native-progress-bar-android: ce95a69f11ac580799021633071368d08aaf9ad8 + react-native-progress-view: 5816e8a6be812c2b122c6225a2a3db82d9008640 + react-native-safe-area-context: 01158a92c300895d79dee447e980672dc3fb85a6 + React-RCTActionSheet: 53ea72699698b0b47a6421cb1c8b4ab215a774aa + React-RCTAnimation: 1befece0b5183c22ae01b966f5583f42e69a83c2 + React-RCTBlob: 0b284339cbe4b15705a05e2313a51c6d8b51fa40 + React-RCTImage: d1756599ebd4dc2cb19d1682fe67c6b976658387 + React-RCTLinking: 9af0a51c6d6a4dd1674daadafffc6d03033a6d18 + React-RCTNetwork: 332c83929cc5eae0b3bbca4add1d668e1fc18bda + React-RCTSettings: d6953772cfd55f2c68ad72b7ef29efc7ec49f773 + React-RCTText: 65a6de06a7389098ce24340d1d3556015c38f746 + React-RCTVibration: 8e9fb25724a0805107fc1acc9075e26f814df454 + ReactCommon: 4167844018c9ed375cc01a843e9ee564399e53c3 + rn-fetch-blob: f065bb7ab7fb48dd002629f8bdcb0336602d3cba + RNCAsyncStorage: cb9a623793918c6699586281f0b51cbc38f046f9 + RNCMaskedView: f5c7d14d6847b7b44853f7acb6284c1da30a3459 + RNCPicker: 6780c753e9e674065db90d9c965920516402579d + RNFBAnalytics: 2dc4dd9e2445faffca041b10447a23a71dcdabf8 + RNFBApp: 7eacc7da7ab19f96c05e434017d44a9f09410da8 + RNFBCrashlytics: 4870c14cf8833053b6b5648911abefe1923854d2 + RNGestureHandler: 9b7e605a741412e20e13c512738a31bd1611759b + RNReanimated: e03f7425cb7a38dcf1b644d680d1bfc91c3337ad + RNScreens: b6c9607e6fe47c1b6e2f1910d2acd46dd7ecea3a + RNSVG: ce9d996113475209013317e48b05c21ee988d42e + urbanairship-react-native: dfb6dc22b2f41ccaadd636b73d51b448cd1b2bbc + Yoga: 7d13633d129fd179e01b8953d38d47be90db185a + YogaKit: f782866e155069a2cca2517aafea43200b01fd5a + +PODFILE CHECKSUM: 41b806c7f131f87b716be1f1f9377532d6c9e43a + +COCOAPODS: 1.10.1 From 451bb16639afb1d19ca76119ba56c0daa84879dd Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Wed, 24 Mar 2021 09:13:30 +0800 Subject: [PATCH 035/380] revert to master versions --- ios/ExpensifyCash.xcodeproj/project.pbxproj | 82 ++++++++++----------- ios/Podfile.lock | 2 +- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/ios/ExpensifyCash.xcodeproj/project.pbxproj b/ios/ExpensifyCash.xcodeproj/project.pbxproj index c5a01d9565c0..1cce13f3aa8e 100644 --- a/ios/ExpensifyCash.xcodeproj/project.pbxproj +++ b/ios/ExpensifyCash.xcodeproj/project.pbxproj @@ -13,17 +13,17 @@ 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 184256DF4A33056F828927C6 /* libPods-ExpensifyCash-ExpensifyCashTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 85425D131983D5EC5A012EF7 /* libPods-ExpensifyCash-ExpensifyCashTests.a */; }; 1E76D5212522316A005A268F /* GTAmericaExp-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = A5AAD008CBD84A6CAEB9AC97 /* GTAmericaExp-Bold.otf */; }; 1E76D5222522316A005A268F /* GTAmericaExp-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = 67D5C3A6A7FA417C8A853FC1 /* GTAmericaExp-Light.otf */; }; 1E76D5232522316A005A268F /* GTAmericaExp-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = AE65058949E14DA5A2D5435D /* GTAmericaExp-Medium.otf */; }; 1E76D5242522316A005A268F /* GTAmericaExp-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 8C7003903C1E4957824899BB /* GTAmericaExp-Regular.otf */; }; 1E76D5252522316A005A268F /* GTAmericaExp-Thin.otf in Resources */ = {isa = PBXBuildFile; fileRef = A292718541C841859D97DF2F /* GTAmericaExp-Thin.otf */; }; - 376CCF91B872607D190AF0F6 /* libPods-ExpensifyCash.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A679AD694BE9556E6B55BEA /* libPods-ExpensifyCash.a */; }; 425866037F4C482AAB46CB8B /* GTAmericaExp-BdIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = A8D6F2F722FD4E66A38EBBB6 /* GTAmericaExp-BdIt.otf */; }; 6856B78873B64C44A92E51DB /* GTAmericaExp-MdIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = DB5A1365442D4419AF6F08E5 /* GTAmericaExp-MdIt.otf */; }; 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; 8821A238A081483FA947BC4E /* GTAmericaExp-RgIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 918D7FEFF96242E6B5F5E14D /* GTAmericaExp-RgIt.otf */; }; + 8C86654500DCC843A74147B5 /* libPods-ExpensifyCash-ExpensifyCashTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ED2AB27DDDFCCE3CD100EA0C /* libPods-ExpensifyCash-ExpensifyCashTests.a */; }; + BB6CECBDA023256B6B955321 /* libPods-ExpensifyCash.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F2C8BDCC1FF0B64AE2DFC9B /* libPods-ExpensifyCash.a */; }; E9DF872D2525201700607FDC /* AirshipConfig.plist in Resources */ = {isa = PBXBuildFile; fileRef = E9DF872C2525201700607FDC /* AirshipConfig.plist */; }; /* End PBXBuildFile section */ @@ -49,25 +49,25 @@ 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = ExpensifyCash/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = ExpensifyCash/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = ExpensifyCash/main.m; sourceTree = ""; }; - 4A679AD694BE9556E6B55BEA /* libPods-ExpensifyCash.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ExpensifyCash.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 67D5C3A6A7FA417C8A853FC1 /* GTAmericaExp-Light.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Light.otf"; path = "../assets/fonts/GTAmericaExp-Light.otf"; sourceTree = ""; }; - 6B13CEF63D86C7980FA4F455 /* Pods-ExpensifyCash.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash.debug.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash/Pods-ExpensifyCash.debug.xcconfig"; sourceTree = ""; }; + 6F2C8BDCC1FF0B64AE2DFC9B /* libPods-ExpensifyCash.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ExpensifyCash.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = ExpensifyCash/LaunchScreen.storyboard; sourceTree = ""; }; 8437A5A38F2047E0BCCD7C2F /* GTAmericaExpMono-Rg.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExpMono-Rg.otf"; path = "../assets/fonts/GTAmericaExpMono-Rg.otf"; sourceTree = ""; }; - 85425D131983D5EC5A012EF7 /* libPods-ExpensifyCash-ExpensifyCashTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ExpensifyCash-ExpensifyCashTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 8C7003903C1E4957824899BB /* GTAmericaExp-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Regular.otf"; path = "../assets/fonts/GTAmericaExp-Regular.otf"; sourceTree = ""; }; - 8CA0D27D73F4C48E98CCA0E9 /* Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash-ExpensifyCashTests/Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig"; sourceTree = ""; }; 918D7FEFF96242E6B5F5E14D /* GTAmericaExp-RgIt.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-RgIt.otf"; path = "../assets/fonts/GTAmericaExp-RgIt.otf"; sourceTree = ""; }; + A13EE2CFAF952F935D201D2F /* Pods-ExpensifyCash.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash.release.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash/Pods-ExpensifyCash.release.xcconfig"; sourceTree = ""; }; A292718541C841859D97DF2F /* GTAmericaExp-Thin.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Thin.otf"; path = "../assets/fonts/GTAmericaExp-Thin.otf"; sourceTree = ""; }; A5AAD008CBD84A6CAEB9AC97 /* GTAmericaExp-Bold.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Bold.otf"; path = "../assets/fonts/GTAmericaExp-Bold.otf"; sourceTree = ""; }; A8D6F2F722FD4E66A38EBBB6 /* GTAmericaExp-BdIt.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-BdIt.otf"; path = "../assets/fonts/GTAmericaExp-BdIt.otf"; sourceTree = ""; }; - A90FC01D757217791C4E9131 /* Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash-ExpensifyCashTests/Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig"; sourceTree = ""; }; AE65058949E14DA5A2D5435D /* GTAmericaExp-Medium.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Medium.otf"; path = "../assets/fonts/GTAmericaExp-Medium.otf"; sourceTree = ""; }; + AF728B3FCBC8C2731C4DA7B4 /* Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash-ExpensifyCashTests/Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig"; sourceTree = ""; }; DB5A1365442D4419AF6F08E5 /* GTAmericaExp-MdIt.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-MdIt.otf"; path = "../assets/fonts/GTAmericaExp-MdIt.otf"; sourceTree = ""; }; + E7967C67752432EA2031954F /* Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash-ExpensifyCashTests/Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig"; sourceTree = ""; }; E9DF872C2525201700607FDC /* AirshipConfig.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = AirshipConfig.plist; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; - EDBB0DF39D0F431E9A26F613 /* Pods-ExpensifyCash.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash.release.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash/Pods-ExpensifyCash.release.xcconfig"; sourceTree = ""; }; + ED2AB27DDDFCCE3CD100EA0C /* libPods-ExpensifyCash-ExpensifyCashTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ExpensifyCash-ExpensifyCashTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + F4BC0E78FF1E9BD8B2D38C66 /* Pods-ExpensifyCash.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpensifyCash.debug.xcconfig"; path = "Target Support Files/Pods-ExpensifyCash/Pods-ExpensifyCash.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -75,7 +75,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 184256DF4A33056F828927C6 /* libPods-ExpensifyCash-ExpensifyCashTests.a in Frameworks */, + 8C86654500DCC843A74147B5 /* libPods-ExpensifyCash-ExpensifyCashTests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -83,7 +83,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 376CCF91B872607D190AF0F6 /* libPods-ExpensifyCash.a in Frameworks */, + BB6CECBDA023256B6B955321 /* libPods-ExpensifyCash.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -128,8 +128,8 @@ children = ( ED297162215061F000B7C4FE /* JavaScriptCore.framework */, ED2971642150620600B7C4FE /* JavaScriptCore.framework */, - 4A679AD694BE9556E6B55BEA /* libPods-ExpensifyCash.a */, - 85425D131983D5EC5A012EF7 /* libPods-ExpensifyCash-ExpensifyCashTests.a */, + 6F2C8BDCC1FF0B64AE2DFC9B /* libPods-ExpensifyCash.a */, + ED2AB27DDDFCCE3CD100EA0C /* libPods-ExpensifyCash-ExpensifyCashTests.a */, ); name = Frameworks; sourceTree = ""; @@ -185,10 +185,10 @@ EC29677F0A49C2946A495A33 /* Pods */ = { isa = PBXGroup; children = ( - 6B13CEF63D86C7980FA4F455 /* Pods-ExpensifyCash.debug.xcconfig */, - EDBB0DF39D0F431E9A26F613 /* Pods-ExpensifyCash.release.xcconfig */, - A90FC01D757217791C4E9131 /* Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig */, - 8CA0D27D73F4C48E98CCA0E9 /* Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig */, + F4BC0E78FF1E9BD8B2D38C66 /* Pods-ExpensifyCash.debug.xcconfig */, + A13EE2CFAF952F935D201D2F /* Pods-ExpensifyCash.release.xcconfig */, + AF728B3FCBC8C2731C4DA7B4 /* Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig */, + E7967C67752432EA2031954F /* Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -200,11 +200,11 @@ isa = PBXNativeTarget; buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "ExpensifyCashTests" */; buildPhases = ( - 31F29FE5E41ACA3441D1941B /* [CP] Check Pods Manifest.lock */, + AEFD4743761AD0E2373D0494 /* [CP] Check Pods Manifest.lock */, 00E356EA1AD99517003FC87E /* Sources */, 00E356EB1AD99517003FC87E /* Frameworks */, 00E356EC1AD99517003FC87E /* Resources */, - C5DF5C3874F91B17AFCBCB52 /* [CP] Copy Pods Resources */, + F2B8013B9E9ECAB2B509E702 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -220,15 +220,15 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ExpensifyCash" */; buildPhases = ( - 209CB27AD34BA50C3E1F4868 /* [CP] Check Pods Manifest.lock */, + 6A9F4436BADC311F14A4349F /* [CP] Check Pods Manifest.lock */, FD10A7F022414F080027D42C /* Start Packager */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - 3BD1D02836B845CFF3D9E447 /* [CP] Copy Pods Resources */, - B079B9CCBE57FB68AFC8F3B4 /* [CP-User] [RNFB] Core Configuration */, - F5D4F18823CA58548DB9253C /* [CP-User] [RNFB] Crashlytics Configuration */, + C9071365B664DE0D85DC5195 /* [CP] Copy Pods Resources */, + CF6259710B5A341870372EA2 /* [CP-User] [RNFB] Core Configuration */, + ED5B8E90A3384FC6A128FB95 /* [CP-User] [RNFB] Crashlytics Configuration */, ); buildRules = ( ); @@ -323,7 +323,7 @@ shellPath = /bin/sh; shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; }; - 209CB27AD34BA50C3E1F4868 /* [CP] Check Pods Manifest.lock */ = { + 6A9F4436BADC311F14A4349F /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -345,7 +345,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 31F29FE5E41ACA3441D1941B /* [CP] Check Pods Manifest.lock */ = { + AEFD4743761AD0E2373D0494 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -367,7 +367,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 3BD1D02836B845CFF3D9E447 /* [CP] Copy Pods Resources */ = { + C9071365B664DE0D85DC5195 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -495,7 +495,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ExpensifyCash/Pods-ExpensifyCash-resources.sh\"\n"; showEnvVarsInLog = 0; }; - B079B9CCBE57FB68AFC8F3B4 /* [CP-User] [RNFB] Core Configuration */ = { + CF6259710B5A341870372EA2 /* [CP-User] [RNFB] Core Configuration */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -505,7 +505,17 @@ shellPath = /bin/sh; shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\nset -e\n\n_MAX_LOOKUPS=2;\n_SEARCH_RESULT=''\n_RN_ROOT_EXISTS=''\n_CURRENT_LOOKUPS=1\n_JSON_ROOT=\"'react-native'\"\n_JSON_FILE_NAME='firebase.json'\n_JSON_OUTPUT_BASE64='e30=' # { }\n_CURRENT_SEARCH_DIR=${PROJECT_DIR}\n_PLIST_BUDDY=/usr/libexec/PlistBuddy\n_TARGET_PLIST=\"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\n_DSYM_PLIST=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n# plist arrays\n_PLIST_ENTRY_KEYS=()\n_PLIST_ENTRY_TYPES=()\n_PLIST_ENTRY_VALUES=()\n\nfunction setPlistValue {\n echo \"info: setting plist entry '$1' of type '$2' in file '$4'\"\n ${_PLIST_BUDDY} -c \"Add :$1 $2 '$3'\" $4 || echo \"info: '$1' already exists\"\n}\n\nfunction getFirebaseJsonKeyValue () {\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n ruby -e \"require 'rubygems';require 'json'; output=JSON.parse('$1'); puts output[$_JSON_ROOT]['$2']\"\n else\n echo \"\"\n fi;\n}\n\nfunction jsonBoolToYesNo () {\n if [[ $1 == \"false\" ]]; then\n echo \"NO\"\n elif [[ $1 == \"true\" ]]; then\n echo \"YES\"\n else echo \"NO\"\n fi\n}\n\necho \"info: -> RNFB build script started\"\necho \"info: 1) Locating ${_JSON_FILE_NAME} file:\"\n\nif [[ -z ${_CURRENT_SEARCH_DIR} ]]; then\n _CURRENT_SEARCH_DIR=$(pwd)\nfi;\n\nwhile true; do\n _CURRENT_SEARCH_DIR=$(dirname \"$_CURRENT_SEARCH_DIR\")\n if [[ \"$_CURRENT_SEARCH_DIR\" == \"/\" ]] || [[ ${_CURRENT_LOOKUPS} -gt ${_MAX_LOOKUPS} ]]; then break; fi;\n echo \"info: ($_CURRENT_LOOKUPS of $_MAX_LOOKUPS) Searching in '$_CURRENT_SEARCH_DIR' for a ${_JSON_FILE_NAME} file.\"\n _SEARCH_RESULT=$(find \"$_CURRENT_SEARCH_DIR\" -maxdepth 2 -name ${_JSON_FILE_NAME} -print | head -n 1)\n if [[ ${_SEARCH_RESULT} ]]; then\n echo \"info: ${_JSON_FILE_NAME} found at $_SEARCH_RESULT\"\n break;\n fi;\n _CURRENT_LOOKUPS=$((_CURRENT_LOOKUPS+1))\ndone\n\nif [[ ${_SEARCH_RESULT} ]]; then\n _JSON_OUTPUT_RAW=$(cat \"${_SEARCH_RESULT}\")\n _RN_ROOT_EXISTS=$(ruby -e \"require 'rubygems';require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]\" || echo '')\n\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n _JSON_OUTPUT_BASE64=$(python -c 'import json,sys,base64;print(base64.b64encode(json.dumps(json.loads(open('\"'${_SEARCH_RESULT}'\"').read())['${_JSON_ROOT}'])))' || echo \"e30=\")\n fi\n\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n\n # config.messaging_auto_init_enabled\n _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"messaging_auto_init_enabled\")\n if [[ $_MESSAGING_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseMessagingAutoInitEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_MESSAGING_AUTO_INIT\")\")\n fi\n\n # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful\n _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"crashlytics_disable_auto_disabler\")\n if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == \"true\" ]]; then\n echo \"Disabled Crashlytics auto disabler.\" # do nothing\n else\n _PLIST_ENTRY_KEYS+=(\"FirebaseCrashlyticsCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"NO\")\n fi\n\n # config.admob_delay_app_measurement_init\n _ADMOB_DELAY_APP_MEASUREMENT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"admob_delay_app_measurement_init\")\n if [[ $_ADMOB_DELAY_APP_MEASUREMENT == \"true\" ]]; then\n _PLIST_ENTRY_KEYS+=(\"GADDelayAppMeasurementInit\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"YES\")\n fi\n\n # config.admob_ios_app_id\n _ADMOB_IOS_APP_ID=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"admob_ios_app_id\")\n if [[ $_ADMOB_IOS_APP_ID ]]; then\n _PLIST_ENTRY_KEYS+=(\"GADApplicationIdentifier\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_ADMOB_IOS_APP_ID\")\n fi\nelse\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n echo \"warning: A firebase.json file was not found, whilst this file is optional it is recommended to include it to configure firebase services in React Native Firebase.\"\nfi;\n\necho \"info: 2) Injecting Info.plist entries: \"\n\n# Log out the keys we're adding\nfor i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n echo \" -> $i) ${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\"\ndone\n\nfor plist in \"${_TARGET_PLIST}\" \"${_DSYM_PLIST}\" ; do\n if [[ -f \"${plist}\" ]]; then\n\n # paths with spaces break the call to setPlistValue. temporarily modify\n # the shell internal field separator variable (IFS), which normally\n # includes spaces, to consist only of line breaks\n oldifs=$IFS\n IFS=\"\n\"\n\n for i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n setPlistValue \"${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\" \"${plist}\"\n done\n\n # restore the original internal field separator value\n IFS=$oldifs\n else\n echo \"warning: A Info.plist build output file was not found (${plist})\"\n fi\ndone\n\necho \"info: <- RNFB build script finished\"\n"; }; - C5DF5C3874F91B17AFCBCB52 /* [CP] Copy Pods Resources */ = { + ED5B8E90A3384FC6A128FB95 /* [CP-User] [RNFB] Crashlytics Configuration */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + name = "[CP-User] [RNFB] Crashlytics Configuration"; + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\nset -e\n\nif [[ ${PODS_ROOT} ]]; then\n echo \"info: Exec FirebaseCrashlytics Run from Pods\"\n \"${PODS_ROOT}/FirebaseCrashlytics/run\"\nelse\n echo \"info: Exec FirebaseCrashlytics Run from framework\"\n \"${PROJECT_DIR}/FirebaseCrashlytics.framework/run\"\nfi\n"; + }; + F2B8013B9E9ECAB2B509E702 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -633,16 +643,6 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ExpensifyCash-ExpensifyCashTests/Pods-ExpensifyCash-ExpensifyCashTests-resources.sh\"\n"; showEnvVarsInLog = 0; }; - F5D4F18823CA58548DB9253C /* [CP-User] [RNFB] Crashlytics Configuration */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - name = "[CP-User] [RNFB] Crashlytics Configuration"; - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\nset -e\n\nif [[ ${PODS_ROOT} ]]; then\n echo \"info: Exec FirebaseCrashlytics Run from Pods\"\n \"${PODS_ROOT}/FirebaseCrashlytics/run\"\nelse\n echo \"info: Exec FirebaseCrashlytics Run from framework\"\n \"${PROJECT_DIR}/FirebaseCrashlytics.framework/run\"\nfi\n"; - }; FD10A7F022414F080027D42C /* Start Packager */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -695,7 +695,7 @@ /* Begin XCBuildConfiguration section */ 00E356F61AD99517003FC87E /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A90FC01D757217791C4E9131 /* Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig */; + baseConfigurationReference = AF728B3FCBC8C2731C4DA7B4 /* Pods-ExpensifyCash-ExpensifyCashTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -719,7 +719,7 @@ }; 00E356F71AD99517003FC87E /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8CA0D27D73F4C48E98CCA0E9 /* Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig */; + baseConfigurationReference = E7967C67752432EA2031954F /* Pods-ExpensifyCash-ExpensifyCashTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -741,7 +741,7 @@ }; 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6B13CEF63D86C7980FA4F455 /* Pods-ExpensifyCash.debug.xcconfig */; + baseConfigurationReference = F4BC0E78FF1E9BD8B2D38C66 /* Pods-ExpensifyCash.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; @@ -773,7 +773,7 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = EDBB0DF39D0F431E9A26F613 /* Pods-ExpensifyCash.release.xcconfig */; + baseConfigurationReference = A13EE2CFAF952F935D201D2F /* Pods-ExpensifyCash.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; diff --git a/ios/Podfile.lock b/ios/Podfile.lock index f156ce086c14..352903821326 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -696,4 +696,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 41b806c7f131f87b716be1f1f9377532d6c9e43a -COCOAPODS: 1.10.1 +COCOAPODS: 1.10.0 From 205c9b3f4e545aa04490873d8174d2e58a8cc9e0 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 23 Mar 2021 20:10:33 -0600 Subject: [PATCH 036/380] Space emojis evenly --- src/pages/home/report/EmojiPickerMenu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index d32944a37240..ca245e15f732 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -103,7 +103,7 @@ class EmojiPickerMenu extends Component { style={{height: 300}} extraData={this.state.filteredEmojis} stickyHeaderIndices={this.state.headerIndices} - contentContainerStyle={{flexGrow: 1}} + columnWrapperStyle={{justifyContent: 'space-between'}} /> )); From 47cf1986341e5248c63f46d345ecffc7802ab729 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Wed, 24 Mar 2021 18:29:31 +0800 Subject: [PATCH 037/380] refactor based on PR comments --- src/components/WelcomeText.js | 26 ++++++++ src/pages/setpassword/SetPasswordForm.js | 27 ++++++-- src/pages/setpassword/SetPasswordPage.js | 65 ++++++++++++++----- src/pages/setpassword/SetPasswordPageProps.js | 38 ----------- src/pages/signin/LoginForm/LoginFormNarrow.js | 12 +--- src/pages/signin/LoginForm/LoginFormWide.js | 15 +---- 6 files changed, 99 insertions(+), 84 deletions(-) create mode 100644 src/components/WelcomeText.js delete mode 100644 src/pages/setpassword/SetPasswordPageProps.js diff --git a/src/components/WelcomeText.js b/src/components/WelcomeText.js new file mode 100644 index 000000000000..191018d406fd --- /dev/null +++ b/src/components/WelcomeText.js @@ -0,0 +1,26 @@ +import React from 'react'; +import {Text, View} from 'react-native'; +import PropTypes from 'prop-types'; +import styles from '../styles/styles'; +import withWindowDimensions from './withWindowDimensions'; + +const propTypes = { + isSmallScreenWidth: PropTypes.bool.isRequired +}; + +const WelcomeText = props => ( + + + With Expensify.cash, chat and payments are the same thing. + + + Money talks. And now that chat and payments are in one place, it's also easy. + {' '} + Your payments get to you as fast as you can get your point across. + + +); + +WelcomeText.propTypes = propTypes; + +export default withWindowDimensions(WelcomeText); diff --git a/src/pages/setpassword/SetPasswordForm.js b/src/pages/setpassword/SetPasswordForm.js index 3a548f5ba528..502b64cddb4b 100644 --- a/src/pages/setpassword/SetPasswordForm.js +++ b/src/pages/setpassword/SetPasswordForm.js @@ -1,11 +1,28 @@ import {Text, TextInput, View} from 'react-native'; import _ from 'underscore'; import React from 'react'; -import lodashGet from 'lodash.get'; +import PropTypes from 'prop-types'; import styles from '../../styles/styles'; import ButtonWithLoader from '../../components/ButtonWithLoader'; import {setPassword} from '../../libs/actions/Session'; -import SetPasswordPageProps from './SetPasswordPageProps'; + +const propTypes = { + // The details about the account that the user is signing in with + account: PropTypes.shape({ + // An error message to display to the user + error: PropTypes.string, + + // Whether or not a sign on form is loading (being submitted) + loading: PropTypes.bool, + }), + + // The user's validate code (passed in through the URL) + validateCode: PropTypes.string.isRequired, +}; + +const defaultProps = { + account: {}, +}; class SetPasswordForm extends React.Component { constructor(props) { @@ -32,7 +49,7 @@ class SetPasswordForm extends React.Component { this.setState({ formError: null, }); - setPassword(this.state.password, lodashGet(this.props.route, 'params.validateCode', '')); + setPassword(this.state.password, this.props.validateCode); } render() { @@ -71,7 +88,7 @@ class SetPasswordForm extends React.Component { } } -SetPasswordForm.propTypes = SetPasswordPageProps.propTypes; -SetPasswordForm.defaultProps = SetPasswordPageProps.defaultProps; +SetPasswordForm.propTypes = propTypes; +SetPasswordForm.defaultProps = defaultProps; export default SetPasswordForm; diff --git a/src/pages/setpassword/SetPasswordPage.js b/src/pages/setpassword/SetPasswordPage.js index 5a42f52f8e29..a0af8018a1de 100644 --- a/src/pages/setpassword/SetPasswordPage.js +++ b/src/pages/setpassword/SetPasswordPage.js @@ -1,34 +1,63 @@ import React from 'react'; import { - SafeAreaView, Text, View, Image, + Image, SafeAreaView, Text, View, } from 'react-native'; +import PropTypes from 'prop-types'; +import lodashGet from 'lodash.get'; import styles from '../../styles/styles'; import SignInPageLayout from '../signin/SignInPageLayout'; -import SetPasswordPageProps from './SetPasswordPageProps'; import welcomeScreenshot from '../../../assets/images/welcome-screenshot.png'; import withWindowDimensions from '../../components/withWindowDimensions'; import SetPasswordForm from './SetPasswordForm'; +import WelcomeText from '../../components/WelcomeText'; + +const propTypes = { + /* Onyx Props */ + + // The details about the account that the user is signing in with + account: PropTypes.shape({ + // An error message to display to the user + error: PropTypes.string, + + // Whether or not a sign on form is loading (being submitted) + loading: PropTypes.bool, + }), + + // The credentials of the logged in person + credentials: PropTypes.shape({ + // The email the user logged in with + login: PropTypes.string, + + // The password used to log in the user + password: PropTypes.string, + }), + + // Is this displaying on a device with a narrower screen width? + isSmallScreenWidth: PropTypes.bool.isRequired, + + route: PropTypes.shape({ + params: PropTypes.shape({ + validateCode: PropTypes.string, + }), + }), +}; +const defaultProps = { + account: {}, + credentials: {}, + route: { + params: {}, + }, +}; const SetPasswordPage = (props) => { - const welcomeText = ( - - - With Expensify.cash, chat and payments are the same thing. - - - Money talks. And now that chat and payments are in one place, it's also easy. - {' '} - Your payments get to you as fast as you can get your point across. - - - ); return ( {props.isSmallScreenWidth && ( @@ -40,13 +69,13 @@ const SetPasswordPage = (props) => { )} - {welcomeText} + ); }; -SetPasswordPage.propTypes = SetPasswordPageProps.propTypes; -SetPasswordPage.defaultProps = SetPasswordPageProps.defaultProps; +SetPasswordPage.propTypes = propTypes; +SetPasswordPage.defaultProps = defaultProps; export default withWindowDimensions(SetPasswordPage); diff --git a/src/pages/setpassword/SetPasswordPageProps.js b/src/pages/setpassword/SetPasswordPageProps.js deleted file mode 100644 index 5e07ad0a9569..000000000000 --- a/src/pages/setpassword/SetPasswordPageProps.js +++ /dev/null @@ -1,38 +0,0 @@ -import PropTypes from 'prop-types'; - -export default { - propTypes: { - /* Onyx Props */ - - // The details about the account that the user is signing in with - account: PropTypes.shape({ - // An error message to display to the user - error: PropTypes.string, - - // Whether or not a sign on form is loading (being submitted) - loading: PropTypes.bool, - }), - - // The credentials of the logged in person - credentials: PropTypes.shape({ - // The email the user logged in with - login: PropTypes.string, - - // The password used to log in the user - password: PropTypes.string, - }), - - route: PropTypes.shape({ - params: PropTypes.shape({ - validateCode: PropTypes.string, - }), - }), - }, - defaultProps: { - account: {}, - credentials: {}, - route: { - params: {}, - }, - }, -}; diff --git a/src/pages/signin/LoginForm/LoginFormNarrow.js b/src/pages/signin/LoginForm/LoginFormNarrow.js index 08ecb0aee47d..b0c6522ac4df 100644 --- a/src/pages/signin/LoginForm/LoginFormNarrow.js +++ b/src/pages/signin/LoginForm/LoginFormNarrow.js @@ -11,6 +11,7 @@ import ButtonWithLoader from '../../../components/ButtonWithLoader'; import {fetchAccountDetails} from '../../../libs/actions/Session'; import welcomeScreenshot from '../../../../assets/images/welcome-screenshot.png'; import ONYXKEYS from '../../../ONYXKEYS'; +import WelcomeText from '../../../components/WelcomeText'; const propTypes = { /* Onyx Props */ @@ -103,16 +104,7 @@ class LoginFormNarrow extends React.Component { /> - - - With Expensify.cash, chat and payments are the same thing. - - - Money talks. And now that chat and payments are in one place, it's also easy. - {' '} - Your payments get to you as fast as you can get your point across. - - + ); } diff --git a/src/pages/signin/LoginForm/LoginFormWide.js b/src/pages/signin/LoginForm/LoginFormWide.js index 070c77c5c1b9..90620568e6ea 100644 --- a/src/pages/signin/LoginForm/LoginFormWide.js +++ b/src/pages/signin/LoginForm/LoginFormWide.js @@ -7,6 +7,7 @@ import {fetchAccountDetails} from '../../../libs/actions/Session'; import styles from '../../../styles/styles'; import ButtonWithLoader from '../../../components/ButtonWithLoader'; import ONYXKEYS from '../../../ONYXKEYS'; +import WelcomeText from '../../../components/WelcomeText'; const propTypes = { /* Onyx Props */ @@ -92,19 +93,7 @@ class LoginFormWide extends React.Component { )} - - - - - With Expensify.cash, chat and payments are the same thing. - - - Money talks. And now that chat and payments are in one place, it's also easy. - {' '} - Your payments get to you as fast as you can get your point across. - - - + ); } From 61a0a2fb7f73fff016aaf312a7053525f8925767 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Wed, 24 Mar 2021 18:31:15 +0800 Subject: [PATCH 038/380] Update WelcomeText.js --- src/components/WelcomeText.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/WelcomeText.js b/src/components/WelcomeText.js index 191018d406fd..c8af5ac26bd7 100644 --- a/src/components/WelcomeText.js +++ b/src/components/WelcomeText.js @@ -5,7 +5,7 @@ import styles from '../styles/styles'; import withWindowDimensions from './withWindowDimensions'; const propTypes = { - isSmallScreenWidth: PropTypes.bool.isRequired + isSmallScreenWidth: PropTypes.bool.isRequired, }; const WelcomeText = props => ( From 436cfd1a5bc3b0698f8eea7626ee03d0bf706722 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Wed, 24 Mar 2021 18:31:57 +0800 Subject: [PATCH 039/380] remove unused eslint-disable --- src/pages/setpassword/SetPasswordPage.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/setpassword/SetPasswordPage.js b/src/pages/setpassword/SetPasswordPage.js index a0af8018a1de..09d514ffcb90 100644 --- a/src/pages/setpassword/SetPasswordPage.js +++ b/src/pages/setpassword/SetPasswordPage.js @@ -55,7 +55,6 @@ const SetPasswordPage = (props) => { From 42ca8e8bfe2cc896e81739802250e8b758ef1d29 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Wed, 24 Mar 2021 18:35:35 +0800 Subject: [PATCH 040/380] revert SetPasswordPage.js --- .../Navigation/AppNavigator/PublicScreens.js | 2 +- src/pages/SetPasswordPage.js | 135 ++++++++++++++++++ src/pages/setpassword/SetPasswordPage.js | 80 ----------- 3 files changed, 136 insertions(+), 81 deletions(-) create mode 100644 src/pages/SetPasswordPage.js delete mode 100644 src/pages/setpassword/SetPasswordPage.js diff --git a/src/libs/Navigation/AppNavigator/PublicScreens.js b/src/libs/Navigation/AppNavigator/PublicScreens.js index 896dc599e90c..141695a74ff5 100644 --- a/src/libs/Navigation/AppNavigator/PublicScreens.js +++ b/src/libs/Navigation/AppNavigator/PublicScreens.js @@ -1,7 +1,7 @@ import React from 'react'; import {createStackNavigator} from '@react-navigation/stack'; import SignInPage from '../../../pages/signin/SignInPage'; -import SetPasswordPage from '../../../pages/setpassword/SetPasswordPage'; +import SetPasswordPage from '../../../pages/SetPasswordPage'; const RootStack = createStackNavigator(); const defaultScreenOptions = { diff --git a/src/pages/SetPasswordPage.js b/src/pages/SetPasswordPage.js new file mode 100644 index 000000000000..ca6925dc88a6 --- /dev/null +++ b/src/pages/SetPasswordPage.js @@ -0,0 +1,135 @@ +import React, {Component} from 'react'; +import { + SafeAreaView, + Text, + TextInput, + View, +} from 'react-native'; +import PropTypes from 'prop-types'; +import {withOnyx} from 'react-native-onyx'; +import _ from 'underscore'; +import lodashGet from 'lodash.get'; +import styles from '../styles/styles'; +import ExpensifyCashLogo from '../../assets/images/expensify-cash.svg'; +import {setPassword} from '../libs/actions/Session'; +import ONYXKEYS from '../ONYXKEYS'; +import variables from '../styles/variables'; +import ButtonWithLoader from '../components/ButtonWithLoader'; + +const propTypes = { + /* Onyx Props */ + + // The details about the account that the user is signing in with + account: PropTypes.shape({ + // An error message to display to the user + error: PropTypes.string, + + // Whether or not a sign on form is loading (being submitted) + loading: PropTypes.bool, + }), + + // The credentials of the logged in person + credentials: PropTypes.shape({ + // The email the user logged in with + login: PropTypes.string, + + // The password used to log in the user + password: PropTypes.string, + }), + + route: PropTypes.shape({ + params: PropTypes.shape({ + validateCode: PropTypes.string, + }), + }), +}; + +const defaultProps = { + account: {}, + credentials: {}, + route: { + params: {}, + }, +}; + +class SetPasswordPage extends Component { + constructor(props) { + super(props); + + this.submitForm = this.submitForm.bind(this); + + this.state = { + password: '', + formError: null, + }; + } + + /** + * Validate the form and then submit it + */ + submitForm() { + if (!this.state.password.trim()) { + this.setState({ + formError: 'Password cannot be blank', + }); + return; + } + + this.setState({ + formError: null, + }); + setPassword(this.state.password, lodashGet(this.props.route, 'params.validateCode', '')); + } + + render() { + return ( + <> + + + + + + + Enter a password + this.setState({password: text})} + onSubmitEditing={this.submitForm} + /> + + + {this.state.formError && ( + + {this.state.formError} + + )} + {!_.isEmpty(this.props.account.error) && ( + + {this.props.account.error} + + )} + + + + ); + } +} + +SetPasswordPage.propTypes = propTypes; +SetPasswordPage.defaultProps = defaultProps; + +export default withOnyx({ + credentials: {key: ONYXKEYS.CREDENTIALS}, + account: {key: ONYXKEYS.ACCOUNT}, +})(SetPasswordPage); diff --git a/src/pages/setpassword/SetPasswordPage.js b/src/pages/setpassword/SetPasswordPage.js deleted file mode 100644 index 09d514ffcb90..000000000000 --- a/src/pages/setpassword/SetPasswordPage.js +++ /dev/null @@ -1,80 +0,0 @@ -import React from 'react'; -import { - Image, SafeAreaView, Text, View, -} from 'react-native'; -import PropTypes from 'prop-types'; -import lodashGet from 'lodash.get'; -import styles from '../../styles/styles'; -import SignInPageLayout from '../signin/SignInPageLayout'; -import welcomeScreenshot from '../../../assets/images/welcome-screenshot.png'; -import withWindowDimensions from '../../components/withWindowDimensions'; -import SetPasswordForm from './SetPasswordForm'; -import WelcomeText from '../../components/WelcomeText'; - -const propTypes = { - /* Onyx Props */ - - // The details about the account that the user is signing in with - account: PropTypes.shape({ - // An error message to display to the user - error: PropTypes.string, - - // Whether or not a sign on form is loading (being submitted) - loading: PropTypes.bool, - }), - - // The credentials of the logged in person - credentials: PropTypes.shape({ - // The email the user logged in with - login: PropTypes.string, - - // The password used to log in the user - password: PropTypes.string, - }), - - // Is this displaying on a device with a narrower screen width? - isSmallScreenWidth: PropTypes.bool.isRequired, - - route: PropTypes.shape({ - params: PropTypes.shape({ - validateCode: PropTypes.string, - }), - }), -}; -const defaultProps = { - account: {}, - credentials: {}, - route: { - params: {}, - }, -}; - -const SetPasswordPage = (props) => { - return ( - - - - - {props.isSmallScreenWidth && ( - - - - )} - - - - - ); -}; - -SetPasswordPage.propTypes = propTypes; -SetPasswordPage.defaultProps = defaultProps; - -export default withWindowDimensions(SetPasswordPage); From 6d56db57cbd416b153c6c261653584e8dda82295 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Wed, 24 Mar 2021 18:36:11 +0800 Subject: [PATCH 041/380] move SetPasswordPage.js to new folder --- src/libs/Navigation/AppNavigator/PublicScreens.js | 2 +- src/pages/{ => setpassword}/SetPasswordPage.js | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) rename src/pages/{ => setpassword}/SetPasswordPage.js (92%) diff --git a/src/libs/Navigation/AppNavigator/PublicScreens.js b/src/libs/Navigation/AppNavigator/PublicScreens.js index 141695a74ff5..896dc599e90c 100644 --- a/src/libs/Navigation/AppNavigator/PublicScreens.js +++ b/src/libs/Navigation/AppNavigator/PublicScreens.js @@ -1,7 +1,7 @@ import React from 'react'; import {createStackNavigator} from '@react-navigation/stack'; import SignInPage from '../../../pages/signin/SignInPage'; -import SetPasswordPage from '../../../pages/SetPasswordPage'; +import SetPasswordPage from '../../../pages/setpassword/SetPasswordPage'; const RootStack = createStackNavigator(); const defaultScreenOptions = { diff --git a/src/pages/SetPasswordPage.js b/src/pages/setpassword/SetPasswordPage.js similarity index 92% rename from src/pages/SetPasswordPage.js rename to src/pages/setpassword/SetPasswordPage.js index ca6925dc88a6..f8f93e88e214 100644 --- a/src/pages/SetPasswordPage.js +++ b/src/pages/setpassword/SetPasswordPage.js @@ -9,12 +9,12 @@ import PropTypes from 'prop-types'; import {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; import lodashGet from 'lodash.get'; -import styles from '../styles/styles'; -import ExpensifyCashLogo from '../../assets/images/expensify-cash.svg'; -import {setPassword} from '../libs/actions/Session'; -import ONYXKEYS from '../ONYXKEYS'; -import variables from '../styles/variables'; -import ButtonWithLoader from '../components/ButtonWithLoader'; +import styles from '../../styles/styles'; +import ExpensifyCashLogo from '../../../assets/images/expensify-cash.svg'; +import {setPassword} from '../../libs/actions/Session'; +import ONYXKEYS from '../../ONYXKEYS'; +import variables from '../../styles/variables'; +import ButtonWithLoader from '../../components/ButtonWithLoader'; const propTypes = { /* Onyx Props */ From f9e1fe6ac728905e24c793cd05640456ae040834 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Wed, 24 Mar 2021 18:37:42 +0800 Subject: [PATCH 042/380] modify SetPasswordPage.js with new refactor --- src/pages/setpassword/SetPasswordPage.js | 127 +++++++---------------- 1 file changed, 40 insertions(+), 87 deletions(-) diff --git a/src/pages/setpassword/SetPasswordPage.js b/src/pages/setpassword/SetPasswordPage.js index f8f93e88e214..5a0628f53709 100644 --- a/src/pages/setpassword/SetPasswordPage.js +++ b/src/pages/setpassword/SetPasswordPage.js @@ -1,20 +1,17 @@ -import React, {Component} from 'react'; +import React from 'react'; import { - SafeAreaView, - Text, - TextInput, - View, + Image, SafeAreaView, View, } from 'react-native'; import PropTypes from 'prop-types'; -import {withOnyx} from 'react-native-onyx'; -import _ from 'underscore'; import lodashGet from 'lodash.get'; import styles from '../../styles/styles'; -import ExpensifyCashLogo from '../../../assets/images/expensify-cash.svg'; -import {setPassword} from '../../libs/actions/Session'; +import SignInPageLayout from '../signin/SignInPageLayout'; +import welcomeScreenshot from '../../../assets/images/welcome-screenshot.png'; +import withWindowDimensions from '../../components/withWindowDimensions'; +import SetPasswordForm from './SetPasswordForm'; +import WelcomeText from '../../components/WelcomeText'; +import {withOnyx} from 'react-native-onyx'; import ONYXKEYS from '../../ONYXKEYS'; -import variables from '../../styles/variables'; -import ButtonWithLoader from '../../components/ButtonWithLoader'; const propTypes = { /* Onyx Props */ @@ -37,13 +34,15 @@ const propTypes = { password: PropTypes.string, }), + // Is this displaying on a device with a narrower screen width? + isSmallScreenWidth: PropTypes.bool.isRequired, + route: PropTypes.shape({ params: PropTypes.shape({ validateCode: PropTypes.string, }), }), }; - const defaultProps = { account: {}, credentials: {}, @@ -52,84 +51,38 @@ const defaultProps = { }, }; -class SetPasswordPage extends Component { - constructor(props) { - super(props); - - this.submitForm = this.submitForm.bind(this); - - this.state = { - password: '', - formError: null, - }; - } - - /** - * Validate the form and then submit it - */ - submitForm() { - if (!this.state.password.trim()) { - this.setState({ - formError: 'Password cannot be blank', - }); - return; - } - - this.setState({ - formError: null, - }); - setPassword(this.state.password, lodashGet(this.props.route, 'params.validateCode', '')); - } - - render() { - return ( - <> - - - - - - - Enter a password - this.setState({password: text})} - onSubmitEditing={this.submitForm} +const SetPasswordPage = (props) => { + return ( + + + + + {props.isSmallScreenWidth && ( + + - - {this.state.formError && ( - - {this.state.formError} - - )} - {!_.isEmpty(this.props.account.error) && ( - - {this.props.account.error} - - )} - - - - ); - } -} + )} + + + + + ); +}; SetPasswordPage.propTypes = propTypes; SetPasswordPage.defaultProps = defaultProps; -export default withOnyx({ - credentials: {key: ONYXKEYS.CREDENTIALS}, - account: {key: ONYXKEYS.ACCOUNT}, -})(SetPasswordPage); + +export default withWindowDimensions( + withOnyx({ + credentials: {key: ONYXKEYS.CREDENTIALS}, + account: {key: ONYXKEYS.ACCOUNT}, + }), +)(SetPasswordPage); From 9491840a2aeba7df76f9902da908a36c1f20e893 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Wed, 24 Mar 2021 18:46:27 +0800 Subject: [PATCH 043/380] fix exporting component --- src/pages/setpassword/SetPasswordPage.js | 59 +++++++++++------------- 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/src/pages/setpassword/SetPasswordPage.js b/src/pages/setpassword/SetPasswordPage.js index 5a0628f53709..72d6a7bf1a37 100644 --- a/src/pages/setpassword/SetPasswordPage.js +++ b/src/pages/setpassword/SetPasswordPage.js @@ -4,13 +4,13 @@ import { } from 'react-native'; import PropTypes from 'prop-types'; import lodashGet from 'lodash.get'; +import {withOnyx} from 'react-native-onyx'; import styles from '../../styles/styles'; import SignInPageLayout from '../signin/SignInPageLayout'; import welcomeScreenshot from '../../../assets/images/welcome-screenshot.png'; import withWindowDimensions from '../../components/withWindowDimensions'; import SetPasswordForm from './SetPasswordForm'; import WelcomeText from '../../components/WelcomeText'; -import {withOnyx} from 'react-native-onyx'; import ONYXKEYS from '../../ONYXKEYS'; const propTypes = { @@ -51,38 +51,33 @@ const defaultProps = { }, }; -const SetPasswordPage = (props) => { - return ( - - - - - {props.isSmallScreenWidth && ( - - - - )} - - - - - ); -}; +const SetPasswordPage = props => ( + + + + + {props.isSmallScreenWidth && ( + + + + )} + + + + +); SetPasswordPage.propTypes = propTypes; SetPasswordPage.defaultProps = defaultProps; - -export default withWindowDimensions( - withOnyx({ - credentials: {key: ONYXKEYS.CREDENTIALS}, - account: {key: ONYXKEYS.ACCOUNT}, - }), -)(SetPasswordPage); +export default withOnyx({ + credentials: {key: ONYXKEYS.CREDENTIALS}, + account: {key: ONYXKEYS.ACCOUNT}, +})(withWindowDimensions((SetPasswordPage))); From 9a362da3ae827738d8c69d6886c8443dc86dc80f Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Wed, 24 Mar 2021 18:48:23 +0800 Subject: [PATCH 044/380] remove unused onyx --- src/pages/setpassword/SetPasswordForm.js | 14 ----------- src/pages/setpassword/SetPasswordPage.js | 30 +----------------------- 2 files changed, 1 insertion(+), 43 deletions(-) diff --git a/src/pages/setpassword/SetPasswordForm.js b/src/pages/setpassword/SetPasswordForm.js index 502b64cddb4b..3aaff0156d7d 100644 --- a/src/pages/setpassword/SetPasswordForm.js +++ b/src/pages/setpassword/SetPasswordForm.js @@ -7,23 +7,10 @@ import ButtonWithLoader from '../../components/ButtonWithLoader'; import {setPassword} from '../../libs/actions/Session'; const propTypes = { - // The details about the account that the user is signing in with - account: PropTypes.shape({ - // An error message to display to the user - error: PropTypes.string, - - // Whether or not a sign on form is loading (being submitted) - loading: PropTypes.bool, - }), - // The user's validate code (passed in through the URL) validateCode: PropTypes.string.isRequired, }; -const defaultProps = { - account: {}, -}; - class SetPasswordForm extends React.Component { constructor(props) { super(props); @@ -89,6 +76,5 @@ class SetPasswordForm extends React.Component { } SetPasswordForm.propTypes = propTypes; -SetPasswordForm.defaultProps = defaultProps; export default SetPasswordForm; diff --git a/src/pages/setpassword/SetPasswordPage.js b/src/pages/setpassword/SetPasswordPage.js index 72d6a7bf1a37..807510e32ad9 100644 --- a/src/pages/setpassword/SetPasswordPage.js +++ b/src/pages/setpassword/SetPasswordPage.js @@ -4,36 +4,14 @@ import { } from 'react-native'; import PropTypes from 'prop-types'; import lodashGet from 'lodash.get'; -import {withOnyx} from 'react-native-onyx'; import styles from '../../styles/styles'; import SignInPageLayout from '../signin/SignInPageLayout'; import welcomeScreenshot from '../../../assets/images/welcome-screenshot.png'; import withWindowDimensions from '../../components/withWindowDimensions'; import SetPasswordForm from './SetPasswordForm'; import WelcomeText from '../../components/WelcomeText'; -import ONYXKEYS from '../../ONYXKEYS'; const propTypes = { - /* Onyx Props */ - - // The details about the account that the user is signing in with - account: PropTypes.shape({ - // An error message to display to the user - error: PropTypes.string, - - // Whether or not a sign on form is loading (being submitted) - loading: PropTypes.bool, - }), - - // The credentials of the logged in person - credentials: PropTypes.shape({ - // The email the user logged in with - login: PropTypes.string, - - // The password used to log in the user - password: PropTypes.string, - }), - // Is this displaying on a device with a narrower screen width? isSmallScreenWidth: PropTypes.bool.isRequired, @@ -44,8 +22,6 @@ const propTypes = { }), }; const defaultProps = { - account: {}, - credentials: {}, route: { params: {}, }, @@ -57,7 +33,6 @@ const SetPasswordPage = props => ( {props.isSmallScreenWidth && ( @@ -77,7 +52,4 @@ const SetPasswordPage = props => ( SetPasswordPage.propTypes = propTypes; SetPasswordPage.defaultProps = defaultProps; -export default withOnyx({ - credentials: {key: ONYXKEYS.CREDENTIALS}, - account: {key: ONYXKEYS.ACCOUNT}, -})(withWindowDimensions((SetPasswordPage))); +export default withWindowDimensions((SetPasswordPage)); From 8db75ccc0e697e8fba1842758a18522686db7eae Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Wed, 24 Mar 2021 18:49:33 +0800 Subject: [PATCH 045/380] put with onyx back --- src/pages/setpassword/SetPasswordForm.js | 14 +++++++++++ src/pages/setpassword/SetPasswordPage.js | 30 +++++++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/pages/setpassword/SetPasswordForm.js b/src/pages/setpassword/SetPasswordForm.js index 3aaff0156d7d..502b64cddb4b 100644 --- a/src/pages/setpassword/SetPasswordForm.js +++ b/src/pages/setpassword/SetPasswordForm.js @@ -7,10 +7,23 @@ import ButtonWithLoader from '../../components/ButtonWithLoader'; import {setPassword} from '../../libs/actions/Session'; const propTypes = { + // The details about the account that the user is signing in with + account: PropTypes.shape({ + // An error message to display to the user + error: PropTypes.string, + + // Whether or not a sign on form is loading (being submitted) + loading: PropTypes.bool, + }), + // The user's validate code (passed in through the URL) validateCode: PropTypes.string.isRequired, }; +const defaultProps = { + account: {}, +}; + class SetPasswordForm extends React.Component { constructor(props) { super(props); @@ -76,5 +89,6 @@ class SetPasswordForm extends React.Component { } SetPasswordForm.propTypes = propTypes; +SetPasswordForm.defaultProps = defaultProps; export default SetPasswordForm; diff --git a/src/pages/setpassword/SetPasswordPage.js b/src/pages/setpassword/SetPasswordPage.js index 807510e32ad9..72d6a7bf1a37 100644 --- a/src/pages/setpassword/SetPasswordPage.js +++ b/src/pages/setpassword/SetPasswordPage.js @@ -4,14 +4,36 @@ import { } from 'react-native'; import PropTypes from 'prop-types'; import lodashGet from 'lodash.get'; +import {withOnyx} from 'react-native-onyx'; import styles from '../../styles/styles'; import SignInPageLayout from '../signin/SignInPageLayout'; import welcomeScreenshot from '../../../assets/images/welcome-screenshot.png'; import withWindowDimensions from '../../components/withWindowDimensions'; import SetPasswordForm from './SetPasswordForm'; import WelcomeText from '../../components/WelcomeText'; +import ONYXKEYS from '../../ONYXKEYS'; const propTypes = { + /* Onyx Props */ + + // The details about the account that the user is signing in with + account: PropTypes.shape({ + // An error message to display to the user + error: PropTypes.string, + + // Whether or not a sign on form is loading (being submitted) + loading: PropTypes.bool, + }), + + // The credentials of the logged in person + credentials: PropTypes.shape({ + // The email the user logged in with + login: PropTypes.string, + + // The password used to log in the user + password: PropTypes.string, + }), + // Is this displaying on a device with a narrower screen width? isSmallScreenWidth: PropTypes.bool.isRequired, @@ -22,6 +44,8 @@ const propTypes = { }), }; const defaultProps = { + account: {}, + credentials: {}, route: { params: {}, }, @@ -33,6 +57,7 @@ const SetPasswordPage = props => ( {props.isSmallScreenWidth && ( @@ -52,4 +77,7 @@ const SetPasswordPage = props => ( SetPasswordPage.propTypes = propTypes; SetPasswordPage.defaultProps = defaultProps; -export default withWindowDimensions((SetPasswordPage)); +export default withOnyx({ + credentials: {key: ONYXKEYS.CREDENTIALS}, + account: {key: ONYXKEYS.ACCOUNT}, +})(withWindowDimensions((SetPasswordPage))); From 33b210ffe67785a60ee0ed0ffa2208b4d88d0a03 Mon Sep 17 00:00:00 2001 From: Shawn Borton Date: Wed, 24 Mar 2021 21:52:57 +0100 Subject: [PATCH 046/380] Emoji styles --- assets/images/emoji.svg | 17 +++++-- src/pages/home/report/EmojiPickerMenu.js | 31 +++++------- src/pages/home/report/EmojiPickerMenuItem.js | 2 +- src/pages/home/report/ReportActionCompose.js | 2 +- src/styles/styles.js | 50 ++++++++------------ src/styles/utilities/spacing.js | 8 ++++ 6 files changed, 55 insertions(+), 55 deletions(-) diff --git a/assets/images/emoji.svg b/assets/images/emoji.svg index d31167580d81..f414143bace3 100644 --- a/assets/images/emoji.svg +++ b/assets/images/emoji.svg @@ -1,6 +1,13 @@ - - - - - + + + + + diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index ca245e15f732..69cd9384685d 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -79,31 +79,26 @@ class EmojiPickerMenu extends Component { render() { return ( this.props.isVisible && ( - - this.searchInput = el} - /> - + + + this.searchInput = el} + /> + this.renderItem(item, this.props.addEmojiToTextBox)} keyExtractor={item => (`emoji_picker_${item.code}`)} numColumns={8} - style={{height: 300}} + style={{height: 300, paddingHorizontal: 16, paddingBottom: 16}} extraData={this.state.filteredEmojis} stickyHeaderIndices={this.state.headerIndices} - columnWrapperStyle={{justifyContent: 'space-between'}} /> )); diff --git a/src/pages/home/report/EmojiPickerMenuItem.js b/src/pages/home/report/EmojiPickerMenuItem.js index 9c8904b96606..97f2c1f3fe2c 100644 --- a/src/pages/home/report/EmojiPickerMenuItem.js +++ b/src/pages/home/report/EmojiPickerMenuItem.js @@ -12,7 +12,7 @@ const propTypes = { }; const EmojiPickerMenuItem = props => ( - props.onPress(props.emoji)}> + props.onPress(props.emoji)} style={styles.emojiTextWrapper}> {props.emoji} ); diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index ebb47f233f99..f1acb2f98e11 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -323,7 +323,7 @@ class ReportActionCompose extends React.Component { onPress={this.showEmojiPicker} underlayColor={themeColors.componentBG} > - + Date: Wed, 24 Mar 2021 16:09:27 -0600 Subject: [PATCH 047/380] Remove color swatches from emojis --- assets/emojis.js | 54 ------------------------ src/pages/home/report/EmojiPickerMenu.js | 2 +- 2 files changed, 1 insertion(+), 55 deletions(-) diff --git a/assets/emojis.js b/assets/emojis.js index 9d6c3f0b9654..7172f3a9c56e 100644 --- a/assets/emojis.js +++ b/assets/emojis.js @@ -1750,51 +1750,6 @@ const emojis = [ 'woman', ], }, - { - code: 'šŸ»', - keywords: [ - 'emoji modifier', - 'fitzpatrick', - 'skin', - 'tone', - ], - }, - { - code: 'šŸ¼', - keywords: [ - 'emoji modifier', - 'fitzpatrick', - 'skin', - 'tone', - ], - }, - { - code: 'šŸ½', - keywords: [ - 'emoji modifier', - 'fitzpatrick', - 'skin', - 'tone', - ], - }, - { - code: 'šŸ¾', - keywords: [ - 'emoji modifier', - 'fitzpatrick', - 'skin', - 'tone', - ], - }, - { - code: 'šŸæ', - keywords: [ - 'emoji modifier', - 'fitzpatrick', - 'skin', - 'tone', - ], - }, { code: 'šŸ’Ŗ', keywords: [ @@ -2871,15 +2826,6 @@ const emojis = [ { code: 'BLANK', }, - { - code: 'BLANK', - }, - { - code: 'BLANK', - }, - { - code: 'BLANK', - }, { code: 'Animals & Nature', header: true, diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index 69cd9384685d..21b947d8c408 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -25,7 +25,7 @@ class EmojiPickerMenu extends Component { this.filterEmojis = _.debounce(this.filterEmojis.bind(this), 500, false); this.state = { filteredEmojis: emojis, - headerIndices: [0, 35, 61, 89, 100, 122, 149], + headerIndices: [0, 34, 60, 88, 99, 121, 148], }; } From 6b6c43f5472e73861d42548a8e00e995adae46fe Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Thu, 25 Mar 2021 15:59:43 +0800 Subject: [PATCH 048/380] Refactor everything into a single component --- .../Navigation/AppNavigator/PublicScreens.js | 2 +- src/pages/SetPasswordPage.js | 141 ++++++++++++++++++ src/pages/setpassword/SetPasswordForm.js | 94 ------------ src/pages/setpassword/SetPasswordPage.js | 83 ----------- 4 files changed, 142 insertions(+), 178 deletions(-) create mode 100644 src/pages/SetPasswordPage.js delete mode 100644 src/pages/setpassword/SetPasswordForm.js delete mode 100644 src/pages/setpassword/SetPasswordPage.js diff --git a/src/libs/Navigation/AppNavigator/PublicScreens.js b/src/libs/Navigation/AppNavigator/PublicScreens.js index 896dc599e90c..141695a74ff5 100644 --- a/src/libs/Navigation/AppNavigator/PublicScreens.js +++ b/src/libs/Navigation/AppNavigator/PublicScreens.js @@ -1,7 +1,7 @@ import React from 'react'; import {createStackNavigator} from '@react-navigation/stack'; import SignInPage from '../../../pages/signin/SignInPage'; -import SetPasswordPage from '../../../pages/setpassword/SetPasswordPage'; +import SetPasswordPage from '../../../pages/SetPasswordPage'; const RootStack = createStackNavigator(); const defaultScreenOptions = { diff --git a/src/pages/SetPasswordPage.js b/src/pages/SetPasswordPage.js new file mode 100644 index 000000000000..bc4986f445d1 --- /dev/null +++ b/src/pages/SetPasswordPage.js @@ -0,0 +1,141 @@ +import React from 'react'; +import { + Image, SafeAreaView, Text, TextInput, View, +} from 'react-native'; +import PropTypes from 'prop-types'; +import lodashGet from 'lodash.get'; +import {withOnyx} from 'react-native-onyx'; +import _ from 'underscore'; +import styles from '../styles/styles'; +import SignInPageLayout from './signin/SignInPageLayout'; +import welcomeScreenshot from '../../assets/images/welcome-screenshot.png'; +import withWindowDimensions from '../components/withWindowDimensions'; +import WelcomeText from '../components/WelcomeText'; +import ONYXKEYS from '../ONYXKEYS'; +import {setPassword} from '../libs/actions/Session'; +import ButtonWithLoader from '../components/ButtonWithLoader'; + +const propTypes = { + /* Onyx Props */ + + // The details about the account that the user is signing in with + account: PropTypes.shape({ + // An error message to display to the user + error: PropTypes.string, + + // Whether or not a sign on form is loading (being submitted) + loading: PropTypes.bool, + }), + + // The credentials of the logged in person + credentials: PropTypes.shape({ + // The email the user logged in with + login: PropTypes.string, + + // The password used to log in the user + password: PropTypes.string, + }), + + // Is this displaying on a device with a narrower screen width? + isSmallScreenWidth: PropTypes.bool.isRequired, + + route: PropTypes.shape({ + params: PropTypes.shape({ + validateCode: PropTypes.string, + }), + }), +}; +const defaultProps = { + account: {}, + credentials: {}, + route: { + params: {}, + }, +}; + +class SetPasswordPage extends React.Component { + + constructor(props) { + super(props); + this.submitForm = this.submitForm.bind(this); + + this.state = { + password: '', + formError: null, + }; + } + + /** + * Validate the form and then submit it + */ + submitForm() { + if (!this.state.password.trim()) { + this.setState({ + formError: 'Password cannot be blank', + }); + return; + } + + this.setState({ + formError: null, + }); + setPassword(this.state.password, lodashGet(this.props.route, 'params.validateCode', '')); + } + + render() { + return ( + + + + + Enter a password: + this.setState({password: text})} + onSubmitEditing={this.submitForm} + autoFocus + /> + + + {this.state.formError && ( + + {this.state.formError} + + )} + {!_.isEmpty(this.props.account.error) && ( + + {this.props.account.error} + + )} + {this.props.isSmallScreenWidth && ( + + + + )} + + + + + ); + } +} + +SetPasswordPage.propTypes = propTypes; +SetPasswordPage.defaultProps = defaultProps; + +export default withOnyx({ + credentials: {key: ONYXKEYS.CREDENTIALS}, + account: {key: ONYXKEYS.ACCOUNT}, +})(withWindowDimensions((SetPasswordPage))); diff --git a/src/pages/setpassword/SetPasswordForm.js b/src/pages/setpassword/SetPasswordForm.js deleted file mode 100644 index 502b64cddb4b..000000000000 --- a/src/pages/setpassword/SetPasswordForm.js +++ /dev/null @@ -1,94 +0,0 @@ -import {Text, TextInput, View} from 'react-native'; -import _ from 'underscore'; -import React from 'react'; -import PropTypes from 'prop-types'; -import styles from '../../styles/styles'; -import ButtonWithLoader from '../../components/ButtonWithLoader'; -import {setPassword} from '../../libs/actions/Session'; - -const propTypes = { - // The details about the account that the user is signing in with - account: PropTypes.shape({ - // An error message to display to the user - error: PropTypes.string, - - // Whether or not a sign on form is loading (being submitted) - loading: PropTypes.bool, - }), - - // The user's validate code (passed in through the URL) - validateCode: PropTypes.string.isRequired, -}; - -const defaultProps = { - account: {}, -}; - -class SetPasswordForm extends React.Component { - constructor(props) { - super(props); - this.submitForm = this.submitForm.bind(this); - - this.state = { - password: '', - formError: null, - }; - } - - /** - * Validate the form and then submit it - */ - submitForm() { - if (!this.state.password.trim()) { - this.setState({ - formError: 'Password cannot be blank', - }); - return; - } - - this.setState({ - formError: null, - }); - setPassword(this.state.password, this.props.validateCode); - } - - render() { - return ( - <> - - Enter a password: - this.setState({password: text})} - onSubmitEditing={this.submitForm} - autoFocus - /> - - - {this.state.formError && ( - - {this.state.formError} - - )} - {!_.isEmpty(this.props.account.error) && ( - - {this.props.account.error} - - )} - - ); - } -} - -SetPasswordForm.propTypes = propTypes; -SetPasswordForm.defaultProps = defaultProps; - -export default SetPasswordForm; diff --git a/src/pages/setpassword/SetPasswordPage.js b/src/pages/setpassword/SetPasswordPage.js deleted file mode 100644 index 72d6a7bf1a37..000000000000 --- a/src/pages/setpassword/SetPasswordPage.js +++ /dev/null @@ -1,83 +0,0 @@ -import React from 'react'; -import { - Image, SafeAreaView, View, -} from 'react-native'; -import PropTypes from 'prop-types'; -import lodashGet from 'lodash.get'; -import {withOnyx} from 'react-native-onyx'; -import styles from '../../styles/styles'; -import SignInPageLayout from '../signin/SignInPageLayout'; -import welcomeScreenshot from '../../../assets/images/welcome-screenshot.png'; -import withWindowDimensions from '../../components/withWindowDimensions'; -import SetPasswordForm from './SetPasswordForm'; -import WelcomeText from '../../components/WelcomeText'; -import ONYXKEYS from '../../ONYXKEYS'; - -const propTypes = { - /* Onyx Props */ - - // The details about the account that the user is signing in with - account: PropTypes.shape({ - // An error message to display to the user - error: PropTypes.string, - - // Whether or not a sign on form is loading (being submitted) - loading: PropTypes.bool, - }), - - // The credentials of the logged in person - credentials: PropTypes.shape({ - // The email the user logged in with - login: PropTypes.string, - - // The password used to log in the user - password: PropTypes.string, - }), - - // Is this displaying on a device with a narrower screen width? - isSmallScreenWidth: PropTypes.bool.isRequired, - - route: PropTypes.shape({ - params: PropTypes.shape({ - validateCode: PropTypes.string, - }), - }), -}; -const defaultProps = { - account: {}, - credentials: {}, - route: { - params: {}, - }, -}; - -const SetPasswordPage = props => ( - - - - - {props.isSmallScreenWidth && ( - - - - )} - - - - -); - -SetPasswordPage.propTypes = propTypes; -SetPasswordPage.defaultProps = defaultProps; - -export default withOnyx({ - credentials: {key: ONYXKEYS.CREDENTIALS}, - account: {key: ONYXKEYS.ACCOUNT}, -})(withWindowDimensions((SetPasswordPage))); From ea5b9734bf43795715e9a40b4c7bc3ae3f1cb119 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Thu, 25 Mar 2021 16:04:46 +0800 Subject: [PATCH 049/380] Eslint fix --- src/pages/SetPasswordPage.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/SetPasswordPage.js b/src/pages/SetPasswordPage.js index bc4986f445d1..12195ef893a9 100644 --- a/src/pages/SetPasswordPage.js +++ b/src/pages/SetPasswordPage.js @@ -54,7 +54,6 @@ const defaultProps = { }; class SetPasswordPage extends React.Component { - constructor(props) { super(props); this.submitForm = this.submitForm.bind(this); From 461aef6f41008857cd05ef692d01bd00d0d77566 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Thu, 25 Mar 2021 16:06:21 +0800 Subject: [PATCH 050/380] Fix import --- src/pages/SetPasswordPage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/SetPasswordPage.js b/src/pages/SetPasswordPage.js index 12195ef893a9..d7c8998f6157 100644 --- a/src/pages/SetPasswordPage.js +++ b/src/pages/SetPasswordPage.js @@ -3,7 +3,7 @@ import { Image, SafeAreaView, Text, TextInput, View, } from 'react-native'; import PropTypes from 'prop-types'; -import lodashGet from 'lodash.get'; +import lodashGet from 'lodash/get'; import {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; import styles from '../styles/styles'; From 7b1b7ff03993edaa03f71312cad23df31e203257 Mon Sep 17 00:00:00 2001 From: Shawn Borton Date: Thu, 25 Mar 2021 10:10:52 +0100 Subject: [PATCH 051/380] More style clean up --- src/pages/home/report/EmojiPickerMenu.js | 6 +++--- src/pages/home/report/EmojiPickerMenuItem.js | 2 +- src/styles/styles.js | 14 +++++++++++--- src/styles/utilities/spacing.js | 4 ++++ 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index 69cd9384685d..6621eefc94f3 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -79,8 +79,8 @@ class EmojiPickerMenu extends Component { render() { return ( this.props.isVisible && ( - - + + this.renderItem(item, this.props.addEmojiToTextBox)} keyExtractor={item => (`emoji_picker_${item.code}`)} numColumns={8} - style={{height: 300, paddingHorizontal: 16, paddingBottom: 16}} + style={[styles.emojiPickerList]} extraData={this.state.filteredEmojis} stickyHeaderIndices={this.state.headerIndices} /> diff --git a/src/pages/home/report/EmojiPickerMenuItem.js b/src/pages/home/report/EmojiPickerMenuItem.js index 97f2c1f3fe2c..32e8ccfdc4d7 100644 --- a/src/pages/home/report/EmojiPickerMenuItem.js +++ b/src/pages/home/report/EmojiPickerMenuItem.js @@ -12,7 +12,7 @@ const propTypes = { }; const EmojiPickerMenuItem = props => ( - props.onPress(props.emoji)} style={styles.emojiTextWrapper}> + props.onPress(props.emoji)} style={styles.emojiItem}> {props.emoji} ); diff --git a/src/styles/styles.js b/src/styles/styles.js index 430120ff9455..d733a1771357 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -776,8 +776,15 @@ const styles = { justifyContent: 'center', }, - emojiPickerBox: { + emojiPickerContainer: { backgroundColor: themeColors.componentBG, + minWidth: 360, + }, + + emojiPickerList: { + height: 300, + width: '100%', + paddingHorizontal: 16, }, emojiHeaderStyle: { @@ -800,8 +807,9 @@ const styles = { paddingLeft: 8, }, - emojiTextWrapper: { - width: '12.5%' + emojiItem: { + width: '12.5%', + textAlign: 'center', }, chatItemEmojiButton: { diff --git a/src/styles/utilities/spacing.js b/src/styles/utilities/spacing.js index 5a82b3e8bd6d..d8efd3486477 100644 --- a/src/styles/utilities/spacing.js +++ b/src/styles/utilities/spacing.js @@ -189,6 +189,10 @@ export default { paddingTop: 16, }, + pb1: { + paddingBottom: 4, + }, + pb2: { paddingBottom: 8, }, From 719e49572e077688dc1ed398cf634376a770e22e Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Thu, 25 Mar 2021 10:35:19 -0600 Subject: [PATCH 052/380] Fix sticky headers on search --- src/pages/home/report/EmojiPickerMenu.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index 4e4bbad9c485..8b460b9da10d 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -38,7 +38,7 @@ class EmojiPickerMenu extends Component { filterEmojis(searchTerm) { const normalizedSearchTerm = searchTerm.toLowerCase(); if (normalizedSearchTerm === '') { - this.setState({filteredEmojis: emojis}); + this.setState({filteredEmojis: emojis, headerIndices: [0, 34, 60, 88, 99, 121, 148]}); return; } const newFilteredEmojiList = []; @@ -52,7 +52,7 @@ class EmojiPickerMenu extends Component { } }); - this.setState({filteredEmojis: newFilteredEmojiList}); + this.setState({filteredEmojis: newFilteredEmojiList, headerIndices: []}); } renderItem({item}, addEmojiToTextBox) { From e11297d7a71187c3508714ff8e06c3102fe3b885 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Thu, 25 Mar 2021 10:38:31 -0600 Subject: [PATCH 053/380] Use textInput or comment to add emoji to textInput --- src/pages/home/report/ReportActionCompose.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index 33eb91f68cde..af92dc57eae9 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -206,7 +206,7 @@ class ReportActionCompose extends React.Component { addEmojiToTextBox(emoji) { this.hideEmojiPicker(); - this.textInput.value += emoji; + this.textInput.value = (this.textInput.value || this.comment) + emoji; this.setIsFocused(true); this.updateComment(this.textInput.value); } From c4f64e56e764c799c736b19bf87e571cda5bda71 Mon Sep 17 00:00:00 2001 From: Rajat Parashar Date: Fri, 26 Mar 2021 02:52:31 +0530 Subject: [PATCH 054/380] refactor --- src/components/withNavigationContext.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/withNavigationContext.js b/src/components/withNavigationContext.js index e0587f2eab64..37d372732638 100644 --- a/src/components/withNavigationContext.js +++ b/src/components/withNavigationContext.js @@ -27,8 +27,8 @@ export default function (WrappedComponent) { } componentDidUpdate() { - const valueToReturn = this.context.isFocused(); - if (this.state.isScreenFocused !== valueToReturn) { + const isCurrentlyFocused = this.context.isFocused(); + if (this.state.isScreenFocused !== isCurrentlyFocused) { // If the value has changed since the last render, we need to update it. // This could happen if we missed an update from the event listeners during re-render. // React will process this update immediately, so the old subscription value won't be committed. @@ -37,7 +37,7 @@ export default function (WrappedComponent) { // eslint-disable-next-line react/no-did-update-set-state this.setState({ - isScreenFocused: valueToReturn, + isScreenFocused: isCurrentlyFocused, }); } } From a51f40a71ad1e98654a812bc7ddafe9a1f3257e1 Mon Sep 17 00:00:00 2001 From: Rory Abraham Date: Thu, 25 Mar 2021 15:44:43 -0700 Subject: [PATCH 055/380] Rename master to main in E.cash --- .github/ISSUE_TEMPLATE.md | 2 +- .github/workflows/README.md | 4 ++-- .github/workflows/automerge.yml | 10 ++++---- .github/workflows/cla.yml | 4 ++-- .github/workflows/deploy.yml | 4 ++-- .github/workflows/deployBlocker.yml | 4 ++-- .github/workflows/finishReleaseCycle.yml | 14 +++++------ .github/workflows/lockDeploys.yml | 18 +++++++------- .github/workflows/preDeploy.yml | 24 +++++++++---------- README.md | 4 ++-- .../PushNotification/index.native.js | 2 +- 11 files changed, 45 insertions(+), 45 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 05de05fd112d..bc7b8facf340 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,4 +1,4 @@ -If you havenā€™t already, check out our [contributing guidelines](https://github.com/Expensify/ReactNativeChat/blob/master/CONTRIBUTING.md) for onboarding and email contributors@expensify.com to request to join our Slack channel! +If you havenā€™t already, check out our [contributing guidelines](https://github.com/Expensify/ReactNativeChat/blob/main/CONTRIBUTING.md) for onboarding and email contributors@expensify.com to request to join our Slack channel! ___ ## Expected Result: diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 50a31f93e08f..923b49caffc4 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -42,7 +42,7 @@ The GitHub workflows require a large list of secrets to deploy, notify and test All these _workflows_ are comprised of atomic _actions_. Most of the time, we can use pre-made and independently maintained actions to create powerful workflows that meet our needs. However, when we want to do something very specific or have a more complex or robust action in mind, we can create our own _actions_. -All our actions are stored in the neighboring directory [`.github/actions`](https://github.com/Expensify/Expensify.cash/tree/master/.github/actions). Each action is a module comprised of three parts: +All our actions are stored in the neighboring directory [`.github/actions`](https://github.com/Expensify/Expensify.cash/tree/main/.github/actions). Each action is a module comprised of three parts: 1) An [action metadata file](https://docs.github.com/en/free-pro-team@latest/actions/creating-actions/creating-a-javascript-action#creating-an-action-metadata-file) called `action.yml`. This describes the action, gives it a name, and defines its inputs and outputs. 2) A Node.js script, whose name matches the module. This is where you can implement the custom logic for your action. @@ -67,7 +67,7 @@ In order to bundle actions with their dependencies into a single Node.js executa - Use the absolute path of the action in GitHub, including the repo name, path, and branch ref, like so: ```yaml - name: Generate Version - uses: Expensify/Expensify.cash/.github/actions/bumpVersion@master + uses: Expensify/Expensify.cash/.github/actions/bumpVersion@main ``` Do not try to use a relative path. - Confusingly, paths in action metadata files (`action.yml`) _must_ use relative paths. diff --git a/.github/workflows/automerge.yml b/.github/workflows/automerge.yml index 098b00e26223..8af7066901e1 100644 --- a/.github/workflows/automerge.yml +++ b/.github/workflows/automerge.yml @@ -16,12 +16,12 @@ jobs: steps: - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f with: - ref: master + ref: main token: ${{ secrets.GITHUB_TOKEN }} - name: Check if pull request is mergeable id: isPullRequestMergeable - uses: Expensify/Expensify.cash/.github/actions/isPullRequestMergeable@master + uses: Expensify/Expensify.cash/.github/actions/isPullRequestMergeable@main with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} @@ -51,10 +51,10 @@ jobs: GITHUB_TOKEN: ${{ github.token }} SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} - master: + main: runs-on: ubuntu-latest needs: getPullRequestMergeability - if: github.event.pull_request.base.ref == 'master' && github.actor == 'OSBotify' && github.event.label.name == 'automerge' + if: github.event.pull_request.base.ref == 'main' && github.actor == 'OSBotify' && github.event.label.name == 'automerge' steps: - name: Export Files Changed id: changed @@ -107,7 +107,7 @@ jobs: uses: hmarr/auto-approve-action@7782c7e2bdf62b4d79bdcded8332808fd2f179cd with: github-token: ${{ secrets.GITHUB_TOKEN }} - if: github.event.pull_request.head.ref == 'master' + if: github.event.pull_request.head.ref == 'main' - name: Check for an auto merge # Version: 0.12.0 diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index cb861fa802d6..4473ae3f1124 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -32,8 +32,8 @@ jobs: PERSONAL_ACCESS_TOKEN : ${{ secrets.CLA_BOTIFY_TOKEN }} with: path-to-signatures: '${{ github.repository }}/cla.json' - path-to-document: 'https://github.com/${{ github.repository }}/blob/master/CLA.md' - branch: 'master' + path-to-document: 'https://github.com/${{ github.repository }}/blob/main/CLA.md' + branch: 'main' remote-organization-name: 'Expensify' remote-repository-name: 'CLA' lock-pullrequest-aftermerge: false diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index aac552bdd88b..10b7b424ff69 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -40,14 +40,14 @@ jobs: - name: Get Release Pull Request List id: getReleasePRList - uses: Expensify/Expensify.cash/.github/actions/getReleasePullRequestList@master + uses: Expensify/Expensify.cash/.github/actions/getReleasePullRequestList@main with: TAG: ${{ env.PRODUCTION_VERSION }} GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }} - name: Generate Release Body id: getReleaseBody - uses: Expensify/Expensify.cash/.github/actions/getReleaseBody@master + uses: Expensify/Expensify.cash/.github/actions/getReleaseBody@main with: PR_LIST: ${{ steps.getReleasePRList.outputs.PR_LIST }} diff --git a/.github/workflows/deployBlocker.yml b/.github/workflows/deployBlocker.yml index ff09218e0bba..458768f8a34d 100644 --- a/.github/workflows/deployBlocker.yml +++ b/.github/workflows/deployBlocker.yml @@ -15,14 +15,14 @@ jobs: steps: - name: Update StagingDeployCash with issue - uses: Expensify/Expensify.cash/.github/actions/createOrUpdateStagingDeploy@master + uses: Expensify/Expensify.cash/.github/actions/createOrUpdateStagingDeploy@main if: ${{ github.event_name == 'issues' }} with: GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }} NEW_DEPLOY_BLOCKERS: ${{ github.event.issue.html_url }} - name: Update StagingDeployCash with issue - uses: Expensify/Expensify.cash/.github/actions/createOrUpdateStagingDeploy@master + uses: Expensify/Expensify.cash/.github/actions/createOrUpdateStagingDeploy@main if: ${{ github.event_name == 'pull_request' }} with: GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }} diff --git a/.github/workflows/finishReleaseCycle.yml b/.github/workflows/finishReleaseCycle.yml index afa5496bb2d5..76a86844d49c 100644 --- a/.github/workflows/finishReleaseCycle.yml +++ b/.github/workflows/finishReleaseCycle.yml @@ -65,7 +65,7 @@ jobs: # Version: 2.3.4 - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f with: - ref: master + ref: main fetch-depth: 0 token: ${{ secrets.OS_BOTIFY_TOKEN }} @@ -75,14 +75,14 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Create a new branch off master + - name: Create a new branch off main run: | git checkout -b version-bump-${{ github.sha }} git push --set-upstream origin version-bump-${{ github.sha }} - name: Generate a new version id: bumpVersion - uses: Expensify/Expensify.cash/.github/actions/bumpVersion@master + uses: Expensify/Expensify.cash/.github/actions/bumpVersion@main with: GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }} @@ -96,14 +96,14 @@ jobs: ./ios/ExpensifyCashTests/Info.plist git commit -m "Update version to ${{ steps.bumpVersion.outputs.NEW_VERSION }}" - - name: Create Pull Request (master) + - name: Create Pull Request (main) uses: peter-evans/create-pull-request@09b9ac155b0d5ad7d8d157ed32158c1b73689109 with: token: ${{ secrets.OS_BOTIFY_TOKEN }} author: OSBotify - base: master + base: main branch: version-bump-${{ github.sha }} - title: Update version to ${{ steps.bumpVersion.outputs.NEW_VERSION }} on master + title: Update version to ${{ steps.bumpVersion.outputs.NEW_VERSION }} on main body: Update version to ${{ steps.bumpVersion.outputs.NEW_VERSION }} labels: automerge @@ -115,7 +115,7 @@ jobs: run: git push --tags - name: Create new StagingDeployCash - uses: Expensify/Expensify.cash/.github/actions/createOrUpdateStagingDeploy@master + uses: Expensify/Expensify.cash/.github/actions/createOrUpdateStagingDeploy@main with: GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }} NPM_VERSION: ${{ steps.bumpVersion.outputs.NEW_VERSION }} diff --git a/.github/workflows/lockDeploys.yml b/.github/workflows/lockDeploys.yml index b4c9a84ad75f..79417b63b6e3 100644 --- a/.github/workflows/lockDeploys.yml +++ b/.github/workflows/lockDeploys.yml @@ -12,7 +12,7 @@ jobs: # Version: 2.3.4 - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f with: - ref: master + ref: main fetch-depth: 0 token: ${{ secrets.OS_BOTIFY_TOKEN }} @@ -27,11 +27,11 @@ jobs: - name: Wait for any automerge jobs to start run: sleep 60 - - name: Wait for any automerge-master jobs to finish + - name: Wait for any automerge-main jobs to finish uses: tomchv/wait-my-workflow@2da0b8a92211e6d7c9964602b99a7052080a1d61 with: token: ${{ secrets.GITHUB_TOKEN }} - checkName: master + checkName: main intervalSeconds: 10 timeoutSeconds: 150 @@ -44,13 +44,13 @@ jobs: - name: Create a new branch run: | git config user.name OSBotify - git pull origin master + git pull origin main git checkout -b version-patch-${{ github.sha }} git push --set-upstream origin version-patch-${{ github.sha }} - name: Generate version id: bumpVersion - uses: Expensify/Expensify.cash/.github/actions/bumpVersion@master + uses: Expensify/Expensify.cash/.github/actions/bumpVersion@main with: SEMVER_LEVEL: PATCH GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }} @@ -65,14 +65,14 @@ jobs: ./ios/ExpensifyCashTests/Info.plist git commit -m "Update version to ${{ steps.bumpVersion.outputs.NEW_VERSION }}" - - name: Create Pull Request (master) + - name: Create Pull Request (main) uses: peter-evans/create-pull-request@09b9ac155b0d5ad7d8d157ed32158c1b73689109 with: token: ${{ secrets.OS_BOTIFY_TOKEN }} author: OSBotify - base: master + base: main branch: version-patch-${{ github.sha }} - title: Update version to ${{ steps.bumpVersion.outputs.NEW_VERSION }} on master + title: Update version to ${{ steps.bumpVersion.outputs.NEW_VERSION }} on main body: Update version to ${{ steps.bumpVersion.outputs.NEW_VERSION }} labels: automerge @@ -84,7 +84,7 @@ jobs: run: git push --tags - name: Update StagingDeployCash - uses: Expensify/Expensify.cash/.github/actions/createOrUpdateStagingDeploy@master + uses: Expensify/Expensify.cash/.github/actions/createOrUpdateStagingDeploy@main with: GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }} NPM_VERSION: ${{ steps.bumpVersion.outputs.NEW_VERSION }} diff --git a/.github/workflows/preDeploy.yml b/.github/workflows/preDeploy.yml index a61096adc7b7..36aabeab7f57 100644 --- a/.github/workflows/preDeploy.yml +++ b/.github/workflows/preDeploy.yml @@ -1,8 +1,8 @@ -name: Process new code merged to master +name: Process new code merged to main on: push: - branches: [master] + branches: [main] jobs: chooseDeployActions: @@ -27,7 +27,7 @@ jobs: - name: Check if StagingDeployCash is locked id: isStagingDeployLocked - uses: Expensify/Expensify.cash/.github/actions/isStagingDeployLocked@master + uses: Expensify/Expensify.cash/.github/actions/isStagingDeployLocked@main with: GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }} @@ -72,7 +72,7 @@ jobs: - name: Set up git run: | git fetch - git checkout master + git checkout main git config user.name OSBotify - name: Create new branch @@ -82,7 +82,7 @@ jobs: - name: Generate version id: bumpVersion - uses: Expensify/Expensify.cash/.github/actions/bumpVersion@master + uses: Expensify/Expensify.cash/.github/actions/bumpVersion@main with: GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }} @@ -96,14 +96,14 @@ jobs: ./ios/ExpensifyCashTests/Info.plist git commit -m "Update version to ${{ steps.bumpVersion.outputs.NEW_VERSION }}" - - name: Create Pull Request (master) + - name: Create Pull Request (main) uses: peter-evans/create-pull-request@09b9ac155b0d5ad7d8d157ed32158c1b73689109 with: token: ${{ secrets.OS_BOTIFY_TOKEN }} author: OSBotify - base: master + base: main branch: version-bump-${{ github.sha }} - title: Update version to ${{ steps.bumpVersion.outputs.NEW_VERSION }} on master + title: Update version to ${{ steps.bumpVersion.outputs.NEW_VERSION }} on main body: Update version to ${{ steps.bumpVersion.outputs.NEW_VERSION }} labels: automerge @@ -116,7 +116,7 @@ jobs: run: git push --tags - name: Update StagingDeployCash - uses: Expensify/Expensify.cash/.github/actions/createOrUpdateStagingDeploy@master + uses: Expensify/Expensify.cash/.github/actions/createOrUpdateStagingDeploy@main with: GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }} NPM_VERSION: ${{ steps.bumpVersion.outputs.NEW_VERSION }} @@ -154,8 +154,8 @@ jobs: fetch-depth: 0 token: ${{ secrets.OS_BOTIFY_TOKEN }} - - name: Checkout master branch - run: git checkout master + - name: Checkout main branch + run: git checkout main - name: Set Staging Version run: echo "STAGING_VERSION=$(npm run print-version --silent)" >> $GITHUB_ENV @@ -164,7 +164,7 @@ jobs: # Version: 2.4.3 uses: repo-sync/pull-request@33777245b1aace1a58c87a29c90321aa7a74bd7d with: - source_branch: master + source_branch: main destination_branch: staging pr_label: automerge github_token: ${{ secrets.OS_BOTIFY_TOKEN }} diff --git a/README.md b/README.md index 93ae6d694015..620a81f2d7d2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
- Expensify.cash Icon + Expensify.cash Icon

@@ -238,7 +238,7 @@ This application is built with the following principles. # Deploying ## Continuous deployment / GitHub workflows -Every PR merged into `master` will kick off the **Create a new version** GitHub workflow defined in `.github/workflows/version.yml`. +Every PR merged into `main` will kick off the **Create a new version** GitHub workflow defined in `.github/workflows/version.yml`. It will look at the current version and increment it by one build version (using [`react-native-version`](https://www.npmjs.com/package/react-native-version)), create a PR with that new version, and tag the version. The PR will be merged automatically by the GitHub workflow **automerge** to keep the version always up to date. diff --git a/src/libs/Notification/PushNotification/index.native.js b/src/libs/Notification/PushNotification/index.native.js index d649726474b6..bdb2565a2ff2 100644 --- a/src/libs/Notification/PushNotification/index.native.js +++ b/src/libs/Notification/PushNotification/index.native.js @@ -105,7 +105,7 @@ function deregister() { /** * Bind a callback to a push notification of a given type. - * See https://github.com/Expensify/Web-Expensify/blob/master/lib/MobilePushNotifications.php for the various + * See https://github.com/Expensify/Web-Expensify/blob/main/lib/MobilePushNotifications.php for the various * types of push notifications sent, along with the data that they provide. * * Note: This implementation allows for only one callback to be bound to an Event/Type pair. For example, From 8dc41d2701ff2a41b74b99fdc37c91c89b4b1953 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Fri, 26 Mar 2021 14:02:46 +0800 Subject: [PATCH 056/380] Use compose --- src/pages/SetPasswordPage.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/pages/SetPasswordPage.js b/src/pages/SetPasswordPage.js index d7c8998f6157..69b82e5cafd3 100644 --- a/src/pages/SetPasswordPage.js +++ b/src/pages/SetPasswordPage.js @@ -14,6 +14,7 @@ import WelcomeText from '../components/WelcomeText'; import ONYXKEYS from '../ONYXKEYS'; import {setPassword} from '../libs/actions/Session'; import ButtonWithLoader from '../components/ButtonWithLoader'; +import compose from '../libs/compose'; const propTypes = { /* Onyx Props */ @@ -134,7 +135,10 @@ class SetPasswordPage extends React.Component { SetPasswordPage.propTypes = propTypes; SetPasswordPage.defaultProps = defaultProps; -export default withOnyx({ - credentials: {key: ONYXKEYS.CREDENTIALS}, - account: {key: ONYXKEYS.ACCOUNT}, -})(withWindowDimensions((SetPasswordPage))); +export default compose( + withOnyx({ + credentials: {key: ONYXKEYS.CREDENTIALS}, + account: {key: ONYXKEYS.ACCOUNT}, + }), + withWindowDimensions, +)(SetPasswordPage); From 5bef9a17127930bd0911511468129657f488ca7d Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Fri, 26 Mar 2021 14:03:29 +0800 Subject: [PATCH 057/380] Add displayName --- src/components/WelcomeText.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/WelcomeText.js b/src/components/WelcomeText.js index c8af5ac26bd7..74a020ccf517 100644 --- a/src/components/WelcomeText.js +++ b/src/components/WelcomeText.js @@ -22,5 +22,6 @@ const WelcomeText = props => ( ); WelcomeText.propTypes = propTypes; +WelcomeText.displayName = 'WelcomeText'; export default withWindowDimensions(WelcomeText); From f534f061c9b0dfe6f5d437d58bbbc362159b0aef Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Fri, 26 Mar 2021 14:04:38 +0800 Subject: [PATCH 058/380] Use ...windowDimensionsPropTypes --- src/components/WelcomeText.js | 5 ++--- src/pages/SetPasswordPage.js | 6 ++---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/components/WelcomeText.js b/src/components/WelcomeText.js index 74a020ccf517..e41550d86c16 100644 --- a/src/components/WelcomeText.js +++ b/src/components/WelcomeText.js @@ -1,11 +1,10 @@ import React from 'react'; import {Text, View} from 'react-native'; -import PropTypes from 'prop-types'; import styles from '../styles/styles'; -import withWindowDimensions from './withWindowDimensions'; +import withWindowDimensions, {windowDimensionsPropTypes} from './withWindowDimensions'; const propTypes = { - isSmallScreenWidth: PropTypes.bool.isRequired, + ...windowDimensionsPropTypes, }; const WelcomeText = props => ( diff --git a/src/pages/SetPasswordPage.js b/src/pages/SetPasswordPage.js index 69b82e5cafd3..b82d3780d936 100644 --- a/src/pages/SetPasswordPage.js +++ b/src/pages/SetPasswordPage.js @@ -9,7 +9,7 @@ import _ from 'underscore'; import styles from '../styles/styles'; import SignInPageLayout from './signin/SignInPageLayout'; import welcomeScreenshot from '../../assets/images/welcome-screenshot.png'; -import withWindowDimensions from '../components/withWindowDimensions'; +import withWindowDimensions, {windowDimensionsPropTypes} from '../components/withWindowDimensions'; import WelcomeText from '../components/WelcomeText'; import ONYXKEYS from '../ONYXKEYS'; import {setPassword} from '../libs/actions/Session'; @@ -37,14 +37,12 @@ const propTypes = { password: PropTypes.string, }), - // Is this displaying on a device with a narrower screen width? - isSmallScreenWidth: PropTypes.bool.isRequired, - route: PropTypes.shape({ params: PropTypes.shape({ validateCode: PropTypes.string, }), }), + ...windowDimensionsPropTypes, }; const defaultProps = { account: {}, From ade55fb86f924f291d5dd9375e44cad1eb9639f3 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Fri, 26 Mar 2021 14:07:01 +0800 Subject: [PATCH 059/380] Revert stuff changed by --fix --- src/pages/SetPasswordPage.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/pages/SetPasswordPage.js b/src/pages/SetPasswordPage.js index b82d3780d936..4d09d5dd8a46 100644 --- a/src/pages/SetPasswordPage.js +++ b/src/pages/SetPasswordPage.js @@ -1,6 +1,10 @@ -import React from 'react'; +import React, {Component} from 'react'; import { - Image, SafeAreaView, Text, TextInput, View, + Image, + SafeAreaView, + Text, + TextInput, + View, } from 'react-native'; import PropTypes from 'prop-types'; import lodashGet from 'lodash/get'; @@ -52,7 +56,7 @@ const defaultProps = { }, }; -class SetPasswordPage extends React.Component { +class SetPasswordPage extends Component { constructor(props) { super(props); this.submitForm = this.submitForm.bind(this); From c7382e12cb28ede3d4a8c3ddaec6912c0af28a2c Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Fri, 26 Mar 2021 14:07:57 +0800 Subject: [PATCH 060/380] Revert stuff changed by --fix --- src/pages/SetPasswordPage.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/SetPasswordPage.js b/src/pages/SetPasswordPage.js index 4d09d5dd8a46..af12df76737f 100644 --- a/src/pages/SetPasswordPage.js +++ b/src/pages/SetPasswordPage.js @@ -59,6 +59,7 @@ const defaultProps = { class SetPasswordPage extends Component { constructor(props) { super(props); + this.submitForm = this.submitForm.bind(this); this.state = { From 61a16f201b8cac6a25a3a0f98a14016bb58314eb Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Fri, 26 Mar 2021 10:53:50 -0600 Subject: [PATCH 061/380] Remove unused import --- src/pages/home/report/EmojiPickerMenuItem.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/home/report/EmojiPickerMenuItem.js b/src/pages/home/report/EmojiPickerMenuItem.js index 32e8ccfdc4d7..3cfb1e2528b4 100644 --- a/src/pages/home/report/EmojiPickerMenuItem.js +++ b/src/pages/home/report/EmojiPickerMenuItem.js @@ -1,4 +1,3 @@ -import React, {memo} from 'react'; import PropTypes from 'prop-types'; import {TouchableOpacity, Text} from 'react-native'; import styles from '../../../styles/styles'; From be1c434143d4f8708c1280fb02c6321a4b768702 Mon Sep 17 00:00:00 2001 From: Barun Pandey Date: Sat, 27 Mar 2021 06:22:48 +0545 Subject: [PATCH 062/380] Add amount to OptionRow and configure PropTypes --- src/components/OptionsList.js | 12 ++++- src/components/OptionsSelector.js | 50 +++++++++++++------ src/pages/home/sidebar/OptionRow.js | 20 +++++++- .../OptionRowTitle/OptionRowTitleProps.js | 2 +- src/pages/home/sidebar/optionPropTypes.js | 2 +- 5 files changed, 67 insertions(+), 19 deletions(-) diff --git a/src/components/OptionsList.js b/src/components/OptionsList.js index 62b19b6f786b..69e43196f11f 100644 --- a/src/components/OptionsList.js +++ b/src/components/OptionsList.js @@ -67,6 +67,12 @@ const propTypes = { // Toggle between compact and default view of the option optionMode: PropTypes.oneOf(['compact', 'default']), + + // amount if iouTransaction row is to be shown + amount: PropTypes.string, + + // currency for iouTransaction + currency: PropTypes.string, }; const defaultProps = { @@ -85,6 +91,8 @@ const defaultProps = { innerRef: null, showTitleTooltip: false, optionMode: undefined, + amount: '', + currency: 'USD', }; class OptionsList extends Component { @@ -154,12 +162,14 @@ class OptionsList extends Component { showTitleTooltip={this.props.showTitleTooltip} hoverStyle={this.props.optionHoveredStyle} optionIsFocused={!this.props.disableFocusOptions - && this.props.focusedIndex === (index + section.indexOffset)} + && this.props.focusedIndex === (index + section.indexOffset)} onSelectRow={this.props.onSelectRow} isSelected={Boolean(_.find(this.props.selectedOptions, option => option.login === item.login))} showSelectedState={this.props.canSelectMultipleOptions} hideAdditionalOptionStates={this.props.hideAdditionalOptionStates} forceTextUnreadStyle={this.props.forceTextUnreadStyle} + amount={this.props.amount} + currency={this.props.currency} /> ); } diff --git a/src/components/OptionsSelector.js b/src/components/OptionsSelector.js index 8e976eab31c7..b9f30e514fbb 100644 --- a/src/components/OptionsSelector.js +++ b/src/components/OptionsSelector.js @@ -12,6 +12,15 @@ const propTypes = { // Callback to fire when a row is tapped onSelectRow: PropTypes.func, + // amount if iouTransaction row is to be shown + amount: PropTypes.string, + + // currency for iouTransaction + currency: PropTypes.string, + + // if we should show search or not? + showSearch: PropTypes.bool, + // Sections for the section list sections: PropTypes.arrayOf(PropTypes.shape({ // Title of the section @@ -28,10 +37,10 @@ const propTypes = { })).isRequired, // Value in the search input field - value: PropTypes.string.isRequired, + value: PropTypes.string, // Callback fired when text changes - onChangeText: PropTypes.func.isRequired, + onChangeText: PropTypes.func, // Optional placeholder text for the selector placeholderText: PropTypes.string, @@ -72,6 +81,11 @@ const defaultProps = { hideAdditionalOptionStates: false, forceTextUnreadStyle: false, showTitleTooltip: false, + amount: '', + currency: 'USD', + showSearch: true, + onChangeText: () => {}, + value: '', }; class OptionsSelector extends Component { @@ -87,7 +101,9 @@ class OptionsSelector extends Component { } componentDidMount() { - this.textInput.focus(); + if (this.props.showSearch) { + this.textInput.focus(); + } } /** @@ -170,18 +186,20 @@ class OptionsSelector extends Component { render() { return ( - - this.textInput = el} - style={[styles.textInput]} - value={this.props.value} - onChangeText={this.props.onChangeText} - onKeyPress={this.handleKeyPress} - placeholder={this.props.placeholderText} - placeholderTextColor={themeColors.placeholderText} - /> - + { this.props.showSearch ? ( + + this.textInput = el} + style={[styles.textInput]} + value={this.props.value} + onChangeText={this.props.onChangeText} + onKeyPress={this.handleKeyPress} + placeholder={this.props.placeholderText} + placeholderTextColor={themeColors.placeholderText} + /> + + ) : null} this.list = el} optionHoveredStyle={styles.hoveredComponentBG} @@ -196,6 +214,8 @@ class OptionsSelector extends Component { hideAdditionalOptionStates={this.props.hideAdditionalOptionStates} forceTextUnreadStyle={this.props.forceTextUnreadStyle} showTitleTooltip={this.props.showTitleTooltip} + amount={this.props.amount} + currency={this.props.currency} /> ); diff --git a/src/pages/home/sidebar/OptionRow.js b/src/pages/home/sidebar/OptionRow.js index f9dfcc8f4727..6896c505cf2e 100644 --- a/src/pages/home/sidebar/OptionRow.js +++ b/src/pages/home/sidebar/OptionRow.js @@ -28,7 +28,13 @@ const propTypes = { optionIsFocused: PropTypes.bool.isRequired, // A function that is called when an option is selected. Selected option is passed as a param - onSelectRow: PropTypes.func.isRequired, + onSelectRow: PropTypes.func, + + // amount if iouTransaction row is to be shown + amount: PropTypes.string, + + // currency for iouTransaction + currency: PropTypes.string, // A flag to indicate whether to show additional optional states, such as pin and draft icons hideAdditionalOptionStates: PropTypes.bool, @@ -57,6 +63,9 @@ const defaultProps = { forceTextUnreadStyle: false, showTitleTooltip: false, mode: 'default', + onSelectRow: null, + amount: '', + currency: 'USD', }; const OptionRow = ({ @@ -70,6 +79,8 @@ const OptionRow = ({ forceTextUnreadStyle, showTitleTooltip, mode, + amount, + currency, }) => { const textStyle = optionIsFocused ? styles.sidebarLinkActiveText @@ -155,6 +166,13 @@ const OptionRow = ({ ) : null} + {amount ? ( + + + {`${currency}${amount}`} + + + ) : null} {showSelectedState && ( {isSelected && ( diff --git a/src/pages/home/sidebar/OptionRowTitle/OptionRowTitleProps.js b/src/pages/home/sidebar/OptionRowTitle/OptionRowTitleProps.js index 3bc7e93d15a2..ea1877c9cb8d 100644 --- a/src/pages/home/sidebar/OptionRowTitle/OptionRowTitleProps.js +++ b/src/pages/home/sidebar/OptionRowTitle/OptionRowTitleProps.js @@ -18,7 +18,7 @@ const propTypes = { text: PropTypes.string.isRequired, // List of particiapants of the report - participantsList: PropTypes.arrayOf(participantPropTypes).isRequired, + participantsList: PropTypes.arrayOf(participantPropTypes), // Text to show for tooltip tooltipText: PropTypes.string, diff --git a/src/pages/home/sidebar/optionPropTypes.js b/src/pages/home/sidebar/optionPropTypes.js index ec2881f790b5..fe39be125ab0 100644 --- a/src/pages/home/sidebar/optionPropTypes.js +++ b/src/pages/home/sidebar/optionPropTypes.js @@ -19,7 +19,7 @@ const optionPropTypes = PropTypes.shape({ alternateText: PropTypes.string.isRequired, // List of participants of the report - participantsList: PropTypes.arrayOf(participantPropTypes).isRequired, + participantsList: PropTypes.arrayOf(participantPropTypes), // The array URLs of the person's avatar icon: PropTypes.arrayOf(PropTypes.string), From d9c03583b78bf00745aee73c1aee3c9feac92c66 Mon Sep 17 00:00:00 2001 From: Barun Pandey Date: Sat, 27 Mar 2021 06:23:38 +0545 Subject: [PATCH 063/380] Add API.js calls and actions for IOU --- src/libs/API.js | 31 ++++++++++++++ src/libs/OptionsListUtils.js | 17 ++++++++ src/libs/actions/IOU.js | 82 +++++++++++++++++++++++++++++++++++- src/libs/actions/Report.js | 4 +- 4 files changed, 131 insertions(+), 3 deletions(-) diff --git a/src/libs/API.js b/src/libs/API.js index e6156fca7b7d..c9694f40268c 100644 --- a/src/libs/API.js +++ b/src/libs/API.js @@ -631,6 +631,35 @@ function GetIOUReport(parameters) { return Network.post(commandName, parameters); } +/** + * @param {Object} parameters + * @param {String} parameters.comment + * @param {Array} parameters.debtorEmail + * @param {String} parameters.currency + * @param {Number} parameters.amount + * @returns {Promise} + */ +function CreateIOUTransaction(parameters) { + const commandName = 'CreateIOUTransaction'; + requireParameters(['comment', 'debtorEmail', 'currency', 'amount'], parameters, commandName); + return Network.post(commandName, parameters); +} + +/** + * @param {Object} parameters + * @param {String} parameters.splits + * @param {String} parameters.currency + * @param {String} parameters.reportID + * @param {Number} parameters.amount + * @param {String} parameters.comment + * @returns {Promise} + */ +function CreateIOUSplit(parameters) { + const commandName = 'CreateIOUSplit'; + requireParameters(['splits', 'currency', 'amount', 'reportID'], parameters, commandName); + return Network.post(commandName, parameters); +} + export { getAuthToken, Authenticate, @@ -661,4 +690,6 @@ export { User_SecondaryLogin_Send, User_UploadAvatar, reauthenticate, + CreateIOUTransaction, + CreateIOUSplit, }; diff --git a/src/libs/OptionsListUtils.js b/src/libs/OptionsListUtils.js index 143203a45ba2..b030a7bb2131 100644 --- a/src/libs/OptionsListUtils.js +++ b/src/libs/OptionsListUtils.js @@ -347,6 +347,22 @@ function getNewChatOptions( }); } +/** + * Build the options for the New Chat view + * + * @param {Object} participant + * @returns {Array} + */ +function getDisplayOptionFromParticipant( + participant, +) { + return { + text: participant.displayName, + alternateText: participant.login, + icons: [participant.avatar], + }; +} + /** * Build the options for the New Group view * @@ -429,4 +445,5 @@ export { getSidebarOptions, getHeaderMessage, getPersonalDetailsForLogins, + getDisplayOptionFromParticipant, }; diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index 9226c90479ff..b3210b696185 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -1,5 +1,7 @@ import Onyx from 'react-native-onyx'; import ONYXKEYS from '../../ONYXKEYS'; +import * as API from '../API'; +import {getSimplifiedIOUReport} from './Report'; /** * Retrieve the users preferred currency @@ -13,7 +15,83 @@ function getPreferredCurrency() { }, 1600); } -// Re-enable the prefer-default-export lint when additional functions are added +/** + * Creates IOUTransaction for IOURequest + */ +function createIOUTransaction({ + comment, amount, currency, debtorEmail, +}) { + Onyx.merge(ONYXKEYS.IOU, {loading: true}); + let iouReportID = ''; + API.CreateIOUTransaction({ + comment, + amount, + currency, + debtorEmail, + }).then((data) => { + iouReportID = data.reportID; + return iouReportID; + }).then(reportID => API.Get({ + returnValueList: 'reportStuff', + reportIDList: reportID, + shouldLoadOptionalKeys: true, + includePinnedReports: true, + })).then((response) => { + if (response.jsonCode !== 200) { + throw new Error(response.message); + } + + const iouReportData = response.reports[iouReportID]; + if (!iouReportData) { + throw new Error(`No iouReportData found for reportID ${iouReportID}`); + } + + Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_IOUS}${iouReportID}`, + getSimplifiedIOUReport(iouReportData)); + + Onyx.merge(ONYXKEYS.IOU, {loading: false}); + }) + .catch((error) => { + console.debug(`[Report] Failed to populate IOU Collection: ${error.message}`); + }); +} + +/** + * Creates IOUSplit Transaction + * @param {Object} parameters + * @param {Array} parameters.participants + * @param {Array} parameters.splits + * @param {String} parameters.comment + * @param {String} parameters.amount + * @param {String} parameters.currency + */ +function createIOUSplit({ + participants, + comment, + amount, + currency, + splits, +}) { + API.CreateChatReport({ + emailList: participants.join(','), + }) + .then(data => data.reportID) + .then(reportID => API.CreateIOUSplit({ + splits: JSON.stringify(splits), + currency, + amount, + comment, + reportID, + })).then((res) => { + console.debug('Response from CreateIOUSplit', res); + }) + .catch((error) => { + console.debug(`Error: ${error.message}`); + }); +} + export { - getPreferredCurrency, // eslint-disable-line import/prefer-default-export + getPreferredCurrency, + createIOUTransaction, + createIOUSplit, }; diff --git a/src/libs/actions/Report.js b/src/libs/actions/Report.js index c5d4c4586512..75aaf91b9cf7 100644 --- a/src/libs/actions/Report.js +++ b/src/libs/actions/Report.js @@ -583,11 +583,12 @@ function fetchOrCreateChatReport(participants) { if (participants.length < 2) { throw new Error('fetchOrCreateChatReport() must have at least two participants'); } - + console.debug('this is working?', participants.join(',')); API.CreateChatReport({ emailList: participants.join(','), }) .then((data) => { + console.debug('debug::::: data', data.reportID); if (data.jsonCode !== 200) { throw new Error(data.message); } @@ -908,4 +909,5 @@ export { broadcastUserIsTyping, togglePinnedState, updateCurrentlyViewedReportID, + getSimplifiedIOUReport, }; From 15f9b08595a975a779d84d298b7ae32830aa2e68 Mon Sep 17 00:00:00 2001 From: Barun Pandey Date: Sat, 27 Mar 2021 06:47:04 +0545 Subject: [PATCH 064/380] Add Confirmation views based on hasMultipleParticipants and clean up OptionRow logic --- src/components/OptionsList.js | 12 +- src/components/OptionsSelector.js | 10 - src/libs/API.js | 4 +- src/libs/OptionsListUtils.js | 37 ++- src/libs/actions/IOU.js | 56 +++-- src/libs/actions/Report.js | 3 +- src/pages/home/sidebar/OptionRow.js | 18 +- src/pages/home/sidebar/optionPropTypes.js | 3 + src/pages/iou/IOUModal.js | 84 ++++++- src/pages/iou/steps/IOUConfirmPage.js | 47 ---- .../steps/IOUConfirmPage/IOUConfirmRequest.js | 150 +++++++++++++ .../steps/IOUConfirmPage/IOUConfirmSplit.js | 211 ++++++++++++++++++ src/pages/iou/steps/IOUConfirmPage/index.js | 86 +++++++ 13 files changed, 599 insertions(+), 122 deletions(-) delete mode 100644 src/pages/iou/steps/IOUConfirmPage.js create mode 100644 src/pages/iou/steps/IOUConfirmPage/IOUConfirmRequest.js create mode 100644 src/pages/iou/steps/IOUConfirmPage/IOUConfirmSplit.js create mode 100644 src/pages/iou/steps/IOUConfirmPage/index.js diff --git a/src/components/OptionsList.js b/src/components/OptionsList.js index 69e43196f11f..62b19b6f786b 100644 --- a/src/components/OptionsList.js +++ b/src/components/OptionsList.js @@ -67,12 +67,6 @@ const propTypes = { // Toggle between compact and default view of the option optionMode: PropTypes.oneOf(['compact', 'default']), - - // amount if iouTransaction row is to be shown - amount: PropTypes.string, - - // currency for iouTransaction - currency: PropTypes.string, }; const defaultProps = { @@ -91,8 +85,6 @@ const defaultProps = { innerRef: null, showTitleTooltip: false, optionMode: undefined, - amount: '', - currency: 'USD', }; class OptionsList extends Component { @@ -162,14 +154,12 @@ class OptionsList extends Component { showTitleTooltip={this.props.showTitleTooltip} hoverStyle={this.props.optionHoveredStyle} optionIsFocused={!this.props.disableFocusOptions - && this.props.focusedIndex === (index + section.indexOffset)} + && this.props.focusedIndex === (index + section.indexOffset)} onSelectRow={this.props.onSelectRow} isSelected={Boolean(_.find(this.props.selectedOptions, option => option.login === item.login))} showSelectedState={this.props.canSelectMultipleOptions} hideAdditionalOptionStates={this.props.hideAdditionalOptionStates} forceTextUnreadStyle={this.props.forceTextUnreadStyle} - amount={this.props.amount} - currency={this.props.currency} /> ); } diff --git a/src/components/OptionsSelector.js b/src/components/OptionsSelector.js index b9f30e514fbb..5bb54afefa10 100644 --- a/src/components/OptionsSelector.js +++ b/src/components/OptionsSelector.js @@ -12,12 +12,6 @@ const propTypes = { // Callback to fire when a row is tapped onSelectRow: PropTypes.func, - // amount if iouTransaction row is to be shown - amount: PropTypes.string, - - // currency for iouTransaction - currency: PropTypes.string, - // if we should show search or not? showSearch: PropTypes.bool, @@ -81,8 +75,6 @@ const defaultProps = { hideAdditionalOptionStates: false, forceTextUnreadStyle: false, showTitleTooltip: false, - amount: '', - currency: 'USD', showSearch: true, onChangeText: () => {}, value: '', @@ -214,8 +206,6 @@ class OptionsSelector extends Component { hideAdditionalOptionStates={this.props.hideAdditionalOptionStates} forceTextUnreadStyle={this.props.forceTextUnreadStyle} showTitleTooltip={this.props.showTitleTooltip} - amount={this.props.amount} - currency={this.props.currency} /> ); diff --git a/src/libs/API.js b/src/libs/API.js index c9694f40268c..3903e64a8ef8 100644 --- a/src/libs/API.js +++ b/src/libs/API.js @@ -636,7 +636,7 @@ function GetIOUReport(parameters) { * @param {String} parameters.comment * @param {Array} parameters.debtorEmail * @param {String} parameters.currency - * @param {Number} parameters.amount + * @param {String} parameters.amount * @returns {Promise} */ function CreateIOUTransaction(parameters) { @@ -650,7 +650,7 @@ function CreateIOUTransaction(parameters) { * @param {String} parameters.splits * @param {String} parameters.currency * @param {String} parameters.reportID - * @param {Number} parameters.amount + * @param {String} parameters.amount * @param {String} parameters.comment * @returns {Promise} */ diff --git a/src/libs/OptionsListUtils.js b/src/libs/OptionsListUtils.js index b030a7bb2131..e5efff289d18 100644 --- a/src/libs/OptionsListUtils.js +++ b/src/libs/OptionsListUtils.js @@ -350,17 +350,35 @@ function getNewChatOptions( /** * Build the options for the New Chat view * - * @param {Object} participant + * @param {Object} myPersonalDetail + * @param {String} amountText * @returns {Array} */ -function getDisplayOptionFromParticipant( - participant, +function getDisplayOptionFromMyPersonalDetail( + myPersonalDetail, + amountText, ) { - return { - text: participant.displayName, - alternateText: participant.login, - icons: [participant.avatar], - }; + return [{ + text: myPersonalDetail.displayName, + alternateText: myPersonalDetail.login, + icons: [myPersonalDetail.avatar], + descriptiveText: amountText, + }]; +} + +/** + * Build the options for the New Chat view + * + * @param {Array} participants + * @param {String} amountText + * @returns {Array} + */ +function getDisplayOptionsFromParticipants( + participants, amountText, +) { + return participants.map(participant => ({ + ...participant, descriptiveText: amountText, + })); } /** @@ -445,5 +463,6 @@ export { getSidebarOptions, getHeaderMessage, getPersonalDetailsForLogins, - getDisplayOptionFromParticipant, + getDisplayOptionFromMyPersonalDetail, + getDisplayOptionsFromParticipants, }; diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index b3210b696185..f107b4220c25 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -16,7 +16,12 @@ function getPreferredCurrency() { } /** - * Creates IOUTransaction for IOURequest + * Creates IOUSplit Transaction + * @param {Object} parameters + * @param {String} parameters.amount + * @param {String} parameters.comment + * @param {String} parameters.currency + * @param {String} parameters.debtorEmail */ function createIOUTransaction({ comment, amount, currency, debtorEmail, @@ -28,29 +33,32 @@ function createIOUTransaction({ amount, currency, debtorEmail, - }).then((data) => { - iouReportID = data.reportID; - return iouReportID; - }).then(reportID => API.Get({ - returnValueList: 'reportStuff', - reportIDList: reportID, - shouldLoadOptionalKeys: true, - includePinnedReports: true, - })).then((response) => { - if (response.jsonCode !== 200) { - throw new Error(response.message); - } + }) + .then((data) => { + iouReportID = data.reportID; + return iouReportID; + }) + .then(reportID => API.Get({ + returnValueList: 'reportStuff', + reportIDList: reportID, + shouldLoadOptionalKeys: true, + includePinnedReports: true, + })) + .then((response) => { + if (response.jsonCode !== 200) { + throw new Error(response.message); + } - const iouReportData = response.reports[iouReportID]; - if (!iouReportData) { - throw new Error(`No iouReportData found for reportID ${iouReportID}`); - } + const iouReportData = response.reports[iouReportID]; + if (!iouReportData) { + throw new Error(`No iouReportData found for reportID ${iouReportID}`); + } - Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_IOUS}${iouReportID}`, - getSimplifiedIOUReport(iouReportData)); + Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_IOUS}${iouReportID}`, + getSimplifiedIOUReport(iouReportData)); - Onyx.merge(ONYXKEYS.IOU, {loading: false}); - }) + Onyx.merge(ONYXKEYS.IOU, {loading: false}); + }) .catch((error) => { console.debug(`[Report] Failed to populate IOU Collection: ${error.message}`); }); @@ -72,6 +80,7 @@ function createIOUSplit({ currency, splits, }) { + Onyx.merge(ONYXKEYS.IOU, {loading: true}); API.CreateChatReport({ emailList: participants.join(','), }) @@ -82,11 +91,14 @@ function createIOUSplit({ amount, comment, reportID, - })).then((res) => { + })) + .then((res) => { console.debug('Response from CreateIOUSplit', res); + Onyx.merge(ONYXKEYS.IOU, {loading: false}); // placeholder }) .catch((error) => { console.debug(`Error: ${error.message}`); + Onyx.merge(ONYXKEYS.IOU, {loading: false}); }); } diff --git a/src/libs/actions/Report.js b/src/libs/actions/Report.js index 75aaf91b9cf7..6cc8b3b3de28 100644 --- a/src/libs/actions/Report.js +++ b/src/libs/actions/Report.js @@ -583,12 +583,11 @@ function fetchOrCreateChatReport(participants) { if (participants.length < 2) { throw new Error('fetchOrCreateChatReport() must have at least two participants'); } - console.debug('this is working?', participants.join(',')); + API.CreateChatReport({ emailList: participants.join(','), }) .then((data) => { - console.debug('debug::::: data', data.reportID); if (data.jsonCode !== 200) { throw new Error(data.message); } diff --git a/src/pages/home/sidebar/OptionRow.js b/src/pages/home/sidebar/OptionRow.js index 6896c505cf2e..568ec4575831 100644 --- a/src/pages/home/sidebar/OptionRow.js +++ b/src/pages/home/sidebar/OptionRow.js @@ -30,12 +30,6 @@ const propTypes = { // A function that is called when an option is selected. Selected option is passed as a param onSelectRow: PropTypes.func, - // amount if iouTransaction row is to be shown - amount: PropTypes.string, - - // currency for iouTransaction - currency: PropTypes.string, - // A flag to indicate whether to show additional optional states, such as pin and draft icons hideAdditionalOptionStates: PropTypes.bool, @@ -64,8 +58,6 @@ const defaultProps = { showTitleTooltip: false, mode: 'default', onSelectRow: null, - amount: '', - currency: 'USD', }; const OptionRow = ({ @@ -79,8 +71,6 @@ const OptionRow = ({ forceTextUnreadStyle, showTitleTooltip, mode, - amount, - currency, }) => { const textStyle = optionIsFocused ? styles.sidebarLinkActiveText @@ -166,10 +156,10 @@ const OptionRow = ({ ) : null} - {amount ? ( + {option.descriptiveText ? ( - {`${currency}${amount}`} + {option.descriptiveText} ) : null} @@ -228,6 +218,10 @@ export default memo(OptionRow, (prevProps, nextProps) => { return false; } + if (prevProps.option.descriptiveText !== nextProps.option.descriptiveText) { + return false; + } + if (prevProps.option.hasDraftComment !== nextProps.option.hasDraftComment) { return false; } diff --git a/src/pages/home/sidebar/optionPropTypes.js b/src/pages/home/sidebar/optionPropTypes.js index fe39be125ab0..b2c9ee97aa73 100644 --- a/src/pages/home/sidebar/optionPropTypes.js +++ b/src/pages/home/sidebar/optionPropTypes.js @@ -24,6 +24,9 @@ const optionPropTypes = PropTypes.shape({ // The array URLs of the person's avatar icon: PropTypes.arrayOf(PropTypes.string), + // Descriptive text to be displayed besides selection element + descriptiveText: PropTypes.string, + // The type of option we have e.g. user or report type: PropTypes.string, diff --git a/src/pages/iou/IOUModal.js b/src/pages/iou/IOUModal.js index 593addfda470..c9631f44509b 100644 --- a/src/pages/iou/IOUModal.js +++ b/src/pages/iou/IOUModal.js @@ -1,15 +1,18 @@ import React, {Component} from 'react'; import {View, TouchableOpacity} from 'react-native'; import PropTypes from 'prop-types'; +import {withOnyx} from 'react-native-onyx'; +import _ from 'lodash'; import IOUAmountPage from './steps/IOUAmountPage'; import IOUParticipantsPage from './steps/IOUParticipantsPage'; import IOUConfirmPage from './steps/IOUConfirmPage'; import Header from '../../components/Header'; import styles from '../../styles/styles'; import Icon from '../../components/Icon'; -import {getPreferredCurrency} from '../../libs/actions/IOU'; +import {createIOUSplit, createIOUTransaction, getPreferredCurrency} from '../../libs/actions/IOU'; import {Close, BackArrow} from '../../components/Icon/Expensicons'; import Navigation from '../../libs/Navigation/Navigation'; +import ONYXKEYS from '../../ONYXKEYS'; /** * IOU modal for requesting money and splitting bills. @@ -17,6 +20,17 @@ import Navigation from '../../libs/Navigation/Navigation'; const propTypes = { // Is this new IOU for a single request or group bill split? hasMultipleParticipants: PropTypes.bool, + + /* Onyx Props */ + iousReport: PropTypes.objectOf(PropTypes.shape({ + currency: PropTypes.string, + managerEmail: PropTypes.string, + ownerEmail: PropTypes.string, + reportID: PropTypes.number, + transactions: PropTypes.arrayOf(PropTypes.shape({ + transactionID: PropTypes.string, + })), + })).isRequired, }; const defaultProps = { @@ -41,14 +55,17 @@ class IOUModal extends Component { this.navigateToNextStep = this.navigateToNextStep.bind(this); this.updateAmount = this.updateAmount.bind(this); this.currencySelected = this.currencySelected.bind(this); - + this.createTransaction = this.createTransaction.bind(this); + this.updateComment = this.updateComment.bind(this); this.addParticipants = this.addParticipants.bind(this); + this.state = { currentStepIndex: 0, participants: [], amount: '', selectedCurrency: 'USD', isAmountPageNextButtonDisabled: true, + comment: '', }; } @@ -56,6 +73,14 @@ class IOUModal extends Component { getPreferredCurrency(); } + componentDidUpdate(prevProps) { + // Dismiss modal when previous iousReport changes from the new iousReport + // This should occur the data changes from within the modal activity + if (!_.isEqual(prevProps.iousReport, this.props.iousReport)) { + return Navigation.dismissModal(); + } + } + /** * Retrieve title for current step, based upon current step and type of IOU * @@ -63,13 +88,14 @@ class IOUModal extends Component { */ getTitleForStep() { - if (this.state.currentStepIndex === 1) { + const currentStepIndex = this.state.currentStepIndex; + if (currentStepIndex === 1 || currentStepIndex === 2) { return `${this.props.hasMultipleParticipants ? 'Split' : 'Request'} $${this.state.amount}`; } - if (steps[this.state.currentStepIndex] === Steps.IOUAmount) { + if (steps[currentStepIndex] === Steps.IOUAmount) { return this.props.hasMultipleParticipants ? 'Split Bill' : 'Request Money'; } - return steps[this.state.currentStepIndex] || ''; + return steps[currentStepIndex] || ''; } /** @@ -102,6 +128,17 @@ class IOUModal extends Component { }); } + /** + * Update comment whenever user enters any new text + * + * @param {String} comment + */ + updateComment(comment) { + this.setState({ + comment, + }); + } + /** * Update amount with number or Backspace pressed. * Validate new amount with decimal number regex up to 6 digits and 2 decimal digit @@ -138,6 +175,28 @@ class IOUModal extends Component { this.setState({selectedCurrency}); } + closeModal() { + Navigation.dismissModal(); + } + + createTransaction({debtorEmail, splits, participants}) { + if (debtorEmail) { + return createIOUTransaction({ + comment: this.state.comment, + amount: this.state.amount, + currency: this.state.selectedCurrency, + debtorEmail, + }); + } + return createIOUSplit({ + comment: this.state.comment, + amount: this.state.amount, + currency: this.state.selectedCurrency, + splits, + participants, + }); + } + render() { const currentStep = steps[this.state.currentStepIndex]; return ( @@ -192,9 +251,13 @@ class IOUModal extends Component { )} {currentStep === Steps.IOUConfirm && ( console.debug('create IOU report')} + onConfirm={this.createTransaction} + hasMultipleParticipants={this.props.hasMultipleParticipants} participants={this.state.participants} iouAmount={this.state.amount} + comment={this.state.comment} + selectedCurrency={this.state.selectedCurrency} + onUpdateComment={this.updateComment} /> )} @@ -206,4 +269,11 @@ IOUModal.propTypes = propTypes; IOUModal.defaultProps = defaultProps; IOUModal.displayName = 'IOUModal'; -export default IOUModal; +export default withOnyx({ + iousReport: { + key: ONYXKEYS.COLLECTION.REPORT_IOUS, + }, + reportID: { + key: ONYXKEYS.CURRENTLY_VIEWED_REPORTID, + }, +})(IOUModal); diff --git a/src/pages/iou/steps/IOUConfirmPage.js b/src/pages/iou/steps/IOUConfirmPage.js deleted file mode 100644 index 9f34f863b5cf..000000000000 --- a/src/pages/iou/steps/IOUConfirmPage.js +++ /dev/null @@ -1,47 +0,0 @@ -import React from 'react'; -import {View} from 'react-native'; -import PropTypes from 'prop-types'; -import {withOnyx} from 'react-native-onyx'; -import ONYXKEYS from '../../../ONYXKEYS'; -import styles from '../../../styles/styles'; -import ButtonWithLoader from '../../../components/ButtonWithLoader'; - -const propTypes = { - // Callback to inform parent modal of success - onConfirm: PropTypes.func.isRequired, - - // IOU amount - iouAmount: PropTypes.number.isRequired, - - /* Onyx Props */ - - // Holds data related to IOU view state, rather than the underlying IOU data. - iou: PropTypes.shape({ - - // Whether or not the IOU step is loading (creating the IOU Report) - loading: PropTypes.bool, - }), -}; - -const defaultProps = { - iou: {}, -}; - -const IOUConfirmPage = props => ( - - - -); - -IOUConfirmPage.displayName = 'IOUConfirmPage'; -IOUConfirmPage.propTypes = propTypes; -IOUConfirmPage.defaultProps = defaultProps; - -export default withOnyx({ - iou: {key: ONYXKEYS.IOU}, -})(IOUConfirmPage); diff --git a/src/pages/iou/steps/IOUConfirmPage/IOUConfirmRequest.js b/src/pages/iou/steps/IOUConfirmPage/IOUConfirmRequest.js new file mode 100644 index 000000000000..be04343396e8 --- /dev/null +++ b/src/pages/iou/steps/IOUConfirmPage/IOUConfirmRequest.js @@ -0,0 +1,150 @@ +import React, {Component} from 'react'; +import {View, TextInput} from 'react-native'; +import PropTypes from 'prop-types'; +import {withOnyx} from 'react-native-onyx'; +import ONYXKEYS from '../../../../ONYXKEYS'; +import styles from '../../../../styles/styles'; +import Text from '../../../../components/Text'; +import ButtonWithLoader from '../../../../components/ButtonWithLoader'; +import themeColors from '../../../../styles/themes/default'; +import OptionsSelector from '../../../../components/OptionsSelector'; +import {getDisplayOptionsFromParticipants} from '../../../../libs/OptionsListUtils'; + +const propTypes = { + // Callback to inform parent modal of success + onConfirm: PropTypes.func.isRequired, + + // IOU amount + iouAmount: PropTypes.string.isRequired, + + // callback to update comment from IOUModal + onUpdateComment: PropTypes.func, + + // Selected currency from the user + // remove eslint disable after currency symbol is available + // eslint-disable-next-line react/no-unused-prop-types + selectedCurrency: PropTypes.string.isRequired, + + // comment value from IOUModal + comment: PropTypes.string, + + // Selected participants from IOUMOdal with login + participants: PropTypes.arrayOf(PropTypes.shape({ + login: PropTypes.string.isRequired, + alternateText: PropTypes.string, + hasDraftComment: PropTypes.bool, + icons: PropTypes.arrayOf(PropTypes.string), + searchText: PropTypes.string, + text: PropTypes.string, + keyForList: PropTypes.string, + isPinned: PropTypes.bool, + isUnread: PropTypes.bool, + reportID: PropTypes.number, + participantsList: PropTypes.arrayOf(PropTypes.object), + })).isRequired, + + /* Onyx Props */ + + // The personal details of the person who is logged in + myPersonalDetails: PropTypes.shape({ + + // Display name of the current user from their personal details + displayName: PropTypes.string, + + // Avatar URL of the current user from their personal details + avatar: PropTypes.string, + }).isRequired, + + // Holds data related to IOU view state, rather than the underlying IOU data. + iou: PropTypes.shape({ + + // Whether or not the IOU step is loading (creating the IOU Report) + loading: PropTypes.bool, + }), +}; + +const defaultProps = { + iou: {}, + onUpdateComment: null, + comment: '', +}; + + +class IOUConfirmRequestPage extends Component { + /** + * Returns the sections needed for the OptionsSelector + * + * @param {Boolean} maxParticipantsReached + * @returns {Array} + */ + getSections() { + const sections = []; + + // $ should be replaced by currency symbol once available + const formattedParticipants = getDisplayOptionsFromParticipants(this.props.participants, + `$${this.props.iouAmount}`); + + sections.push({ + title: 'TO', + data: formattedParticipants, + shouldShow: true, + indexOffset: 0, + }); + return sections; + } + + render() { + const sections = this.getSections(); + return ( + + + + + WHAT'S IT FOR? + + + + + + + this.props.onConfirm({ + debtorEmail: this.props.participants[0].login, + })} + /> + + + ); + } +} + +IOUConfirmRequestPage.displayName = 'IOUConfirmRequestPage'; +IOUConfirmRequestPage.propTypes = propTypes; +IOUConfirmRequestPage.defaultProps = defaultProps; + +export default withOnyx({ + iou: {key: ONYXKEYS.IOU}, + personalDetails: { + key: ONYXKEYS.PERSONAL_DETAILS, + }, + myPersonalDetails: { + key: ONYXKEYS.MY_PERSONAL_DETAILS, + }, + user: { + key: ONYXKEYS.USER, + }, +})(IOUConfirmRequestPage); diff --git a/src/pages/iou/steps/IOUConfirmPage/IOUConfirmSplit.js b/src/pages/iou/steps/IOUConfirmPage/IOUConfirmSplit.js new file mode 100644 index 000000000000..92f6e58435c3 --- /dev/null +++ b/src/pages/iou/steps/IOUConfirmPage/IOUConfirmSplit.js @@ -0,0 +1,211 @@ +import React, {Component} from 'react'; +import {View} from 'react-native'; +import PropTypes from 'prop-types'; +import {withOnyx} from 'react-native-onyx'; +import {TextInput} from 'react-native-gesture-handler'; +import ONYXKEYS from '../../../../ONYXKEYS'; +import styles from '../../../../styles/styles'; +import Text from '../../../../components/Text'; +import themeColors from '../../../../styles/themes/default'; +import { + getDisplayOptionFromMyPersonalDetail, + getDisplayOptionsFromParticipants, +} from '../../../../libs/OptionsListUtils'; +import ButtonWithLoader from '../../../../components/ButtonWithLoader'; +import OptionsSelector from '../../../../components/OptionsSelector'; + +const propTypes = { + // Callback to inform parent modal of success + onConfirm: PropTypes.func.isRequired, + + // callback to update comment from IOUModal + onUpdateComment: PropTypes.func, + + // comment value from IOUModal + comment: PropTypes.string, + + // IOU amount + iouAmount: PropTypes.string.isRequired, + + // Selected currency from the user + // remove eslint disable after currency symbol is available + // eslint-disable-next-line react/no-unused-prop-types + selectedCurrency: PropTypes.string.isRequired, + + // Selected participants from IOUMOdal with login + participants: PropTypes.arrayOf(PropTypes.shape({ + login: PropTypes.string.isRequired, + alternateText: PropTypes.string, + hasDraftComment: PropTypes.bool, + icons: PropTypes.arrayOf(PropTypes.string), + searchText: PropTypes.string, + text: PropTypes.string, + keyForList: PropTypes.string, + isPinned: PropTypes.bool, + isUnread: PropTypes.bool, + reportID: PropTypes.number, + participantsList: PropTypes.arrayOf(PropTypes.object), + })).isRequired, + + /* Onyx Props */ + + // The personal details of the person who is logged in + myPersonalDetails: PropTypes.shape({ + + // Display name of the current user from their personal details + displayName: PropTypes.string, + + // Avatar URL of the current user from their personal details + avatar: PropTypes.string, + + // Primary login of the user + login: PropTypes.string, + }).isRequired, + + // Holds data related to IOU view state, rather than the underlying IOU data. + iou: PropTypes.shape({ + + // Whether or not the IOU step is loading (creating the IOU Report) + loading: PropTypes.bool, + }), +}; + +const defaultProps = { + iou: {}, + onUpdateComment: null, + comment: '', +}; + +class IOUConfirmSplitPage extends Component { + /** + * Returns the sections needed for the OptionsSelector + * + * @param {Boolean} maxParticipantsReached + * @returns {Array} + */ + getSections() { + const sections = []; + + // $ should be replaced by currency symbol once available + const individualAmountText = `$${this.calculateAmount(2)}`; + const formattedMyPersonalDetails = getDisplayOptionFromMyPersonalDetail(this.props.myPersonalDetails, + individualAmountText); + const formattedParticipants = getDisplayOptionsFromParticipants(this.props.participants, + individualAmountText); + + sections.push({ + title: 'WHO PAID?', + data: formattedMyPersonalDetails, + shouldShow: true, + indexOffset: 0, + }); + sections.push({ + title: 'WHO WAS THERE?', + data: formattedParticipants, + shouldShow: true, + indexOffset: 0, + }); + + return sections; + } + + /** + * Gets splits for the transaction + * + * @returns {Array} + */ + getSplits() { + const amountPerPerson = parseFloat(this.calculateAmount()); + const splits = this.props.participants.map(participant => ({ + email: participant.login, + amount: amountPerPerson, + })); + splits.push({email: this.props.myPersonalDetails.login, amount: amountPerPerson}); + return splits; + } + + /** + * Gets participants list for a report + * + * @returns {Array} + */ + getParticipants() { + const participants = this.props.participants.map(participant => participant.login); + participants.push(this.props.myPersonalDetails.login); + return participants; + } + + /** + * Returns selected options with all participant logins + * @returns {Array} + */ + getAllOptionsAsSelected() { + return [...this.props.participants, + getDisplayOptionFromMyPersonalDetail(this.props.myPersonalDetails)]; + } + + /** + * Calculates amount for individual + * @param {Number} precision + * @returns {Number} + */ + calculateAmount(precision) { + const calculatedAmount = (this.props.iouAmount / (this.props.participants.length + 1)); + return precision ? calculatedAmount.toFixed(precision) : calculatedAmount; + } + + render() { + const sections = this.getSections(); + return ( + + + + + WHAT'S IT FOR? + + + + + + + this.props.onConfirm({ + splits: this.getSplits(), + participants: this.getParticipants(), + })} + /> + + + ); + } +} + +IOUConfirmSplitPage.displayName = 'IOUConfirmSplitPage'; +IOUConfirmSplitPage.propTypes = propTypes; +IOUConfirmSplitPage.defaultProps = defaultProps; + +export default withOnyx({ + iou: {key: ONYXKEYS.IOU}, + personalDetails: { + key: ONYXKEYS.PERSONAL_DETAILS, + }, + myPersonalDetails: { + key: ONYXKEYS.MY_PERSONAL_DETAILS, + }, +})(IOUConfirmSplitPage); diff --git a/src/pages/iou/steps/IOUConfirmPage/index.js b/src/pages/iou/steps/IOUConfirmPage/index.js new file mode 100644 index 000000000000..0905720f5ae1 --- /dev/null +++ b/src/pages/iou/steps/IOUConfirmPage/index.js @@ -0,0 +1,86 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import {withOnyx} from 'react-native-onyx'; +import ONYXKEYS from '../../../../ONYXKEYS'; +import IOUConfirmRequest from './IOUConfirmRequest'; +import IOUConfirmSplit from './IOUConfirmSplit'; + +const propTypes = { + // Callback to inform parent modal of success + onConfirm: PropTypes.func.isRequired, + + // Selected currency from the user + selectedCurrency: PropTypes.string.isRequired, + + // Should we request a single or multiple participant selection from user + hasMultipleParticipants: PropTypes.bool.isRequired, + + // IOU amount + iouAmount: PropTypes.string.isRequired, + + // optional comment + comment: PropTypes.string, + + // callback to update comment + onUpdateComment: PropTypes.func, + + // Selected participants from IOUMOdal with login + participants: PropTypes.arrayOf(PropTypes.shape({ + login: PropTypes.string.isRequired, + alternateText: PropTypes.string, + hasDraftComment: PropTypes.bool, + icons: PropTypes.arrayOf(PropTypes.string), + searchText: PropTypes.string, + text: PropTypes.string, + keyForList: PropTypes.string, + isPinned: PropTypes.bool, + isUnread: PropTypes.bool, + reportID: PropTypes.number, + })).isRequired, + + /* Onyx Props */ + + // Holds data related to IOU view state, rather than the underlying IOU data. + iou: PropTypes.shape({ + + // Whether or not the IOU step is loading (creating the IOU Report) + loading: PropTypes.bool, + }), +}; + +const defaultProps = { + iou: {}, + comment: '', + onUpdateComment: null, +}; + +const IOUConfirmPage = props => (props.hasMultipleParticipants + ? ( + + ) + : ( + + ) +); + +IOUConfirmPage.displayName = 'IOUConfirmPage'; +IOUConfirmPage.propTypes = propTypes; +IOUConfirmPage.defaultProps = defaultProps; + +export default withOnyx({ + iou: {key: ONYXKEYS.IOU}, +})(IOUConfirmPage); From f56e00a6cb1f2a963ea9f190ea3149acf9baed41 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 29 Mar 2021 09:59:57 -0600 Subject: [PATCH 065/380] re-add react --- src/pages/home/report/EmojiPickerMenuItem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/home/report/EmojiPickerMenuItem.js b/src/pages/home/report/EmojiPickerMenuItem.js index 3cfb1e2528b4..db54152dc83f 100644 --- a/src/pages/home/report/EmojiPickerMenuItem.js +++ b/src/pages/home/report/EmojiPickerMenuItem.js @@ -1,3 +1,4 @@ +import React from 'react'; import PropTypes from 'prop-types'; import {TouchableOpacity, Text} from 'react-native'; import styles from '../../../styles/styles'; From 09c9a65ee9968722dfb8cd7774e11af9004d83b7 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 29 Mar 2021 10:00:09 -0600 Subject: [PATCH 066/380] Remove bottom padding on small screens --- src/styles/getModalStyles.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styles/getModalStyles.js b/src/styles/getModalStyles.js index f3ab417db1a4..aedf111f7754 100644 --- a/src/styles/getModalStyles.js +++ b/src/styles/getModalStyles.js @@ -100,7 +100,7 @@ export default (type, windowDimensions, popoverAnchorPosition = {}) => { borderTopLeftRadius: 20, borderTopRightRadius: 20, paddingTop: 12, - paddingBottom: 12, + paddingBottom: 0, justifyContent: 'center', overflow: 'hidden', }; From e58e84782d45a876fce3c0c0d1f11e372566eb40 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 29 Mar 2021 12:26:32 -0600 Subject: [PATCH 067/380] Make emoji picker button and emojis in picker hoverable --- src/pages/home/report/EmojiPickerMenuItem.js | 13 ++++++++++--- src/pages/home/report/ReportActionCompose.js | 18 +++++++++++++----- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/pages/home/report/EmojiPickerMenuItem.js b/src/pages/home/report/EmojiPickerMenuItem.js index db54152dc83f..8646ed77830c 100644 --- a/src/pages/home/report/EmojiPickerMenuItem.js +++ b/src/pages/home/report/EmojiPickerMenuItem.js @@ -1,7 +1,8 @@ import React from 'react'; import PropTypes from 'prop-types'; -import {TouchableOpacity, Text} from 'react-native'; +import {Pressable, Text} from 'react-native'; import styles from '../../../styles/styles'; +import themeColors from '../../../styles/themes/default'; const propTypes = { // The unicode that is used to display the emoji @@ -12,9 +13,15 @@ const propTypes = { }; const EmojiPickerMenuItem = props => ( - props.onPress(props.emoji)} style={styles.emojiItem}> + props.onPress(props.emoji)} + style={({hovered}) => ([ + styles.emojiItem, + hovered && {backgroundColor: themeColors.buttonHoveredBG}, + ])} + > {props.emoji} - + ); EmojiPickerMenuItem.propTypes = propTypes; diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index af92dc57eae9..22b967e847e4 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import {View, TouchableOpacity} from 'react-native'; +import {View, TouchableOpacity, Pressable} from 'react-native'; import _ from 'underscore'; import lodashGet from 'lodash/get'; import {withOnyx} from 'react-native-onyx'; @@ -361,13 +361,21 @@ class ReportActionCompose extends React.Component { addEmojiToTextBox={this.addEmojiToTextBox} /> - ([ + styles.chatItemEmojiButton, + hovered && {backgroundColor: themeColors.buttonHoveredBG}, + ])} onPress={this.showEmojiPicker} underlayColor={themeColors.componentBG} > - - + {({hovered}) => ( + + )} + Date: Tue, 30 Mar 2021 20:50:13 +0545 Subject: [PATCH 068/380] Manage split edge case and convert $ into cent --- src/libs/actions/IOU.js | 37 ++++++++++++-- src/libs/actions/Report.js | 1 + src/pages/iou/IOUModal.js | 50 +++++++++++++------ .../steps/IOUConfirmPage/IOUConfirmSplit.js | 44 +++++++++++----- 4 files changed, 100 insertions(+), 32 deletions(-) diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index f107b4220c25..78a581c4caca 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -1,4 +1,5 @@ import Onyx from 'react-native-onyx'; +import _ from 'underscore'; import ONYXKEYS from '../../ONYXKEYS'; import * as API from '../API'; import {getSimplifiedIOUReport} from './Report'; @@ -24,7 +25,7 @@ function getPreferredCurrency() { * @param {String} parameters.debtorEmail */ function createIOUTransaction({ - comment, amount, currency, debtorEmail, + comment, amount, currency, debtorEmail, setIsTransactionComplete, }) { Onyx.merge(ONYXKEYS.IOU, {loading: true}); let iouReportID = ''; @@ -56,7 +57,7 @@ function createIOUTransaction({ Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_IOUS}${iouReportID}`, getSimplifiedIOUReport(iouReportData)); - + setIsTransactionComplete(true); Onyx.merge(ONYXKEYS.IOU, {loading: false}); }) .catch((error) => { @@ -79,7 +80,9 @@ function createIOUSplit({ amount, currency, splits, + setIsTransactionComplete, }) { + let reportIDs = []; Onyx.merge(ONYXKEYS.IOU, {loading: true}); API.CreateChatReport({ emailList: participants.join(','), @@ -92,9 +95,33 @@ function createIOUSplit({ comment, reportID, })) - .then((res) => { - console.debug('Response from CreateIOUSplit', res); - Onyx.merge(ONYXKEYS.IOU, {loading: false}); // placeholder + .then((data) => { + console.debug(data); + Onyx.merge(ONYXKEYS.IOU, {loading: false}); + reportIDs = data.reportIDList; + return reportIDs; + }) + .then(reportIDList => API.Get({ + returnValueList: 'reportStuff', + reportIDList, + shouldLoadOptionalKeys: true, + includePinnedReports: true, + })) + .then(({reports}) => _.map(reports, getSimplifiedIOUReport)) + .then((iouReportObjects) => { + const reportIOUData = {}; + _.each(iouReportObjects, (iouReportObject) => { + if (!iouReportObject) { + return; + } + const iouReportKey = `${ONYXKEYS.COLLECTION.REPORT_IOUS}${iouReportObject.reportID}`; + reportIOUData[iouReportKey] = iouReportObject; + }); + return Onyx.mergeCollection(ONYXKEYS.COLLECTION.REPORT_IOUS, {...reportIOUData}); + }) + .then(() => { + setIsTransactionComplete(true); + Onyx.merge(ONYXKEYS.IOU, {loading: false}); }) .catch((error) => { console.debug(`Error: ${error.message}`); diff --git a/src/libs/actions/Report.js b/src/libs/actions/Report.js index 6cc8b3b3de28..0e6785fa6a03 100644 --- a/src/libs/actions/Report.js +++ b/src/libs/actions/Report.js @@ -909,4 +909,5 @@ export { togglePinnedState, updateCurrentlyViewedReportID, getSimplifiedIOUReport, + getSimplifiedReportObject, }; diff --git a/src/pages/iou/IOUModal.js b/src/pages/iou/IOUModal.js index c9631f44509b..eece50d0c700 100644 --- a/src/pages/iou/IOUModal.js +++ b/src/pages/iou/IOUModal.js @@ -2,7 +2,6 @@ import React, {Component} from 'react'; import {View, TouchableOpacity} from 'react-native'; import PropTypes from 'prop-types'; import {withOnyx} from 'react-native-onyx'; -import _ from 'lodash'; import IOUAmountPage from './steps/IOUAmountPage'; import IOUParticipantsPage from './steps/IOUParticipantsPage'; import IOUConfirmPage from './steps/IOUConfirmPage'; @@ -58,6 +57,7 @@ class IOUModal extends Component { this.createTransaction = this.createTransaction.bind(this); this.updateComment = this.updateComment.bind(this); this.addParticipants = this.addParticipants.bind(this); + this.setIsTransactionComplete = this.setIsTransactionComplete.bind(this); this.state = { currentStepIndex: 0, @@ -66,6 +66,7 @@ class IOUModal extends Component { selectedCurrency: 'USD', isAmountPageNextButtonDisabled: true, comment: '', + isTransactionComplete: false, }; } @@ -74,11 +75,21 @@ class IOUModal extends Component { } componentDidUpdate(prevProps) { - // Dismiss modal when previous iousReport changes from the new iousReport - // This should occur the data changes from within the modal activity - if (!_.isEqual(prevProps.iousReport, this.props.iousReport)) { + // Dismiss modal when the length of transactions for any iousReport changes + if (!prevProps.iousReport) { return; } + + if (this.state.isTransactionComplete === true) { return Navigation.dismissModal(); } + + // Object.keys(this.props.iousReport) + // .forEach((reportKey) => { + // const prevTransactions = lodashGet({...prevProps.iousReport[reportKey]}, 'transactions', null); + // const currentTransactions = lodashGet({...this.props.iousReport[reportKey]}, 'transactions', null); + // if (prevTransactions.length !== currentTransactions.length) { + // return Navigation.dismissModal(); + // } + // }); } /** @@ -98,6 +109,18 @@ class IOUModal extends Component { return steps[currentStepIndex] || ''; } + setIsTransactionComplete(isTransactionComplete) { + this.setState({ + isTransactionComplete, + }); + } + + addParticipants(participants) { + this.setState({ + participants, + }); + } + /** * Navigate to the next IOU step if possible */ @@ -122,12 +145,6 @@ class IOUModal extends Component { })); } - addParticipants(participants) { - this.setState({ - participants, - }); - } - /** * Update comment whenever user enters any new text * @@ -183,17 +200,23 @@ class IOUModal extends Component { if (debtorEmail) { return createIOUTransaction({ comment: this.state.comment, - amount: this.state.amount, + + // should send in cents to API + amount: this.state.amount * 100, currency: this.state.selectedCurrency, debtorEmail, + setIsTransactionComplete: this.setIsTransactionComplete, }); } return createIOUSplit({ comment: this.state.comment, - amount: this.state.amount, + + // should send in cents to API + amount: this.state.amount * 100, currency: this.state.selectedCurrency, splits, participants, + setIsTransactionComplete: this.setIsTransactionComplete, }); } @@ -273,7 +296,4 @@ export default withOnyx({ iousReport: { key: ONYXKEYS.COLLECTION.REPORT_IOUS, }, - reportID: { - key: ONYXKEYS.CURRENTLY_VIEWED_REPORTID, - }, })(IOUModal); diff --git a/src/pages/iou/steps/IOUConfirmPage/IOUConfirmSplit.js b/src/pages/iou/steps/IOUConfirmPage/IOUConfirmSplit.js index 92f6e58435c3..c71d5f519136 100644 --- a/src/pages/iou/steps/IOUConfirmPage/IOUConfirmSplit.js +++ b/src/pages/iou/steps/IOUConfirmPage/IOUConfirmSplit.js @@ -86,12 +86,12 @@ class IOUConfirmSplitPage extends Component { getSections() { const sections = []; - // $ should be replaced by currency symbol once available - const individualAmountText = `$${this.calculateAmount(2)}`; const formattedMyPersonalDetails = getDisplayOptionFromMyPersonalDetail(this.props.myPersonalDetails, - individualAmountText); + + // convert from cent to bigger form + `$${this.calculateAmount(true) / 100}`); const formattedParticipants = getDisplayOptionsFromParticipants(this.props.participants, - individualAmountText); + `$${this.calculateAmount() / 100}`); sections.push({ title: 'WHO PAID?', @@ -115,12 +115,19 @@ class IOUConfirmSplitPage extends Component { * @returns {Array} */ getSplits() { - const amountPerPerson = parseFloat(this.calculateAmount()); const splits = this.props.participants.map(participant => ({ email: participant.login, - amount: amountPerPerson, + + // we should send in cents to API + amount: this.calculateAmount(), })); - splits.push({email: this.props.myPersonalDetails.login, amount: amountPerPerson}); + + splits.push({ + email: this.props.myPersonalDetails.login, + + // the user is default and we should send in cents to API + amount: this.calculateAmount(true), + }); return splits; } @@ -144,14 +151,27 @@ class IOUConfirmSplitPage extends Component { getDisplayOptionFromMyPersonalDetail(this.props.myPersonalDetails)]; } + /** - * Calculates amount for individual - * @param {Number} precision + * Calculates the amount per user + * @param {Boolean} isDefaultUser * @returns {Number} */ - calculateAmount(precision) { - const calculatedAmount = (this.props.iouAmount / (this.props.participants.length + 1)); - return precision ? calculatedAmount.toFixed(precision) : calculatedAmount; + calculateAmount(isDefaultUser = false) { + // convert to cents before working with iouAmount to avoid + // javascript subtraction with decimal problem + const iouAmount = Math.round(parseFloat(this.props.iouAmount * 100)); + const totalParticipants = this.props.participants.length + 1; + + const amountPerPerson = Math.round(iouAmount / totalParticipants); + + const sumAmount = amountPerPerson * totalParticipants; + + const difference = iouAmount - sumAmount; + + if (!isDefaultUser) { return amountPerPerson; } + + return iouAmount !== sumAmount ? (amountPerPerson + difference) : amountPerPerson; } render() { From d02b119a440918cbb7110320667164521b8444d4 Mon Sep 17 00:00:00 2001 From: Barun Pandey Date: Tue, 30 Mar 2021 22:06:37 +0545 Subject: [PATCH 069/380] Remove extra lines --- src/pages/iou/steps/IOUConfirmPage/IOUConfirmRequest.js | 1 - src/pages/iou/steps/IOUConfirmPage/IOUConfirmSplit.js | 1 - 2 files changed, 2 deletions(-) diff --git a/src/pages/iou/steps/IOUConfirmPage/IOUConfirmRequest.js b/src/pages/iou/steps/IOUConfirmPage/IOUConfirmRequest.js index be04343396e8..a80dd556d5e0 100644 --- a/src/pages/iou/steps/IOUConfirmPage/IOUConfirmRequest.js +++ b/src/pages/iou/steps/IOUConfirmPage/IOUConfirmRequest.js @@ -69,7 +69,6 @@ const defaultProps = { comment: '', }; - class IOUConfirmRequestPage extends Component { /** * Returns the sections needed for the OptionsSelector diff --git a/src/pages/iou/steps/IOUConfirmPage/IOUConfirmSplit.js b/src/pages/iou/steps/IOUConfirmPage/IOUConfirmSplit.js index c71d5f519136..c769fe55679c 100644 --- a/src/pages/iou/steps/IOUConfirmPage/IOUConfirmSplit.js +++ b/src/pages/iou/steps/IOUConfirmPage/IOUConfirmSplit.js @@ -151,7 +151,6 @@ class IOUConfirmSplitPage extends Component { getDisplayOptionFromMyPersonalDetail(this.props.myPersonalDetails)]; } - /** * Calculates the amount per user * @param {Boolean} isDefaultUser From 20f971ff4bcd7acd9d81a6a16383860699b07598 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 30 Mar 2021 11:25:00 -0600 Subject: [PATCH 070/380] Alphabetize expensicons --- src/components/Icon/Expensicons.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/components/Icon/Expensicons.js b/src/components/Icon/Expensicons.js index dad2022792d9..81efd62dd4f5 100644 --- a/src/components/Icon/Expensicons.js +++ b/src/components/Icon/Expensicons.js @@ -26,30 +26,30 @@ import ArrowRight from '../../../assets/images/arrow-right.svg'; import Emoji from '../../../assets/images/emoji.svg'; export { + ArrowRight, BackArrow, DownArrow, ChatBubble, + Checkmark, Clipboard, Close, + Download, + Emoji, + Gear, LinkCopy, + Lock, MagnifyingGlass, Mail, + MoneyCircle, Paperclip, Pencil, Pin, PinCircle, Plus, + Profile, + Receipt, Send, Trashcan, Users, - Checkmark, - Receipt, - MoneyCircle, - Download, - Profile, - Gear, Wallet, - Lock, - ArrowRight, - Emoji, }; From 7eab869773482cbf006cb5cf47f32ab26e2b32d5 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 30 Mar 2021 11:28:07 -0600 Subject: [PATCH 071/380] Comments for props and state vars --- src/pages/home/report/EmojiPickerMenu.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index 8b460b9da10d..7d9093230bfc 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -11,6 +11,8 @@ import TextInputFocusable from '../../../components/TextInputFocusable'; const propTypes = { // Controls the visibility of this component. isVisible: PropTypes.bool, + + // Function to add the selected emoji to the main compose text input addEmojiToTextBox: PropTypes.func.isRequired, }; @@ -25,6 +27,10 @@ class EmojiPickerMenu extends Component { this.filterEmojis = _.debounce(this.filterEmojis.bind(this), 500, false); this.state = { filteredEmojis: emojis, + + // This is the indices of each category of emojis + // The positions are static, and are calculated as index/numColumns (8 in our case) + // This is because each row of 8 emojis counts as one index headerIndices: [0, 34, 60, 88, 99, 121, 148], }; } From 5906af7dcd90de919e7ddeeacbc0fdad4a644d61 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 30 Mar 2021 11:37:09 -0600 Subject: [PATCH 072/380] Use underscore each instead of forEach --- src/pages/home/report/EmojiPickerMenu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index 7d9093230bfc..d49f662fc100 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -48,7 +48,7 @@ class EmojiPickerMenu extends Component { return; } const newFilteredEmojiList = []; - emojis.forEach((emoji) => { + _.each(emojis, (emoji) => { if (!emoji.header && emoji.code !== 'BLANK') { emoji.keywords.forEach((keyword) => { if (keyword.includes(normalizedSearchTerm)) { From b199f892bbcd6e767501c741dd86efc9c2c4b954 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 30 Mar 2021 11:40:56 -0600 Subject: [PATCH 073/380] Remove brackets around single styles --- src/pages/home/report/EmojiPickerMenu.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index d49f662fc100..07f213a00fc7 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -85,14 +85,14 @@ class EmojiPickerMenu extends Component { render() { return ( this.props.isVisible && ( - + this.searchInput = el} /> @@ -102,7 +102,7 @@ class EmojiPickerMenu extends Component { renderItem={item => this.renderItem(item, this.props.addEmojiToTextBox)} keyExtractor={item => (`emoji_picker_${item.code}`)} numColumns={8} - style={[styles.emojiPickerList]} + style={styles.emojiPickerList} extraData={this.state.filteredEmojis} stickyHeaderIndices={this.state.headerIndices} /> From 9ed44c83697df25adca75c30a95c49faf512fe8f Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 30 Mar 2021 11:42:55 -0600 Subject: [PATCH 074/380] Null initialize ref --- src/pages/home/report/EmojiPickerMenu.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index 07f213a00fc7..5e0d5876f3e8 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -24,6 +24,9 @@ class EmojiPickerMenu extends Component { constructor(props) { super(props); + // Ref for the emoji search input + this.searchInput = null; + this.filterEmojis = _.debounce(this.filterEmojis.bind(this), 500, false); this.state = { filteredEmojis: emojis, From 803db874356a958b452835250d6244333148c34c Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 30 Mar 2021 12:10:49 -0600 Subject: [PATCH 075/380] Bind renderItem instead of using an arrow function to increase performance --- src/pages/home/report/EmojiPickerMenu.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index 5e0d5876f3e8..480d93e9b924 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -28,6 +28,8 @@ class EmojiPickerMenu extends Component { this.searchInput = null; this.filterEmojis = _.debounce(this.filterEmojis.bind(this), 500, false); + this.renderItem = this.renderItem.bind(this); + this.state = { filteredEmojis: emojis, @@ -64,7 +66,7 @@ class EmojiPickerMenu extends Component { this.setState({filteredEmojis: newFilteredEmojiList, headerIndices: []}); } - renderItem({item}, addEmojiToTextBox) { + renderItem({item}) { if (item.code === 'BLANK') { return; } @@ -79,7 +81,7 @@ class EmojiPickerMenu extends Component { return ( ); @@ -102,7 +104,7 @@ class EmojiPickerMenu extends Component { this.renderItem(item, this.props.addEmojiToTextBox)} + renderItem={this.renderItem} keyExtractor={item => (`emoji_picker_${item.code}`)} numColumns={8} style={styles.emojiPickerList} From 48399a8dbc886346cd707982f168e0a486e7be02 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 30 Mar 2021 13:12:52 -0600 Subject: [PATCH 076/380] undefined instead of null --- src/pages/home/report/EmojiPickerMenu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index 480d93e9b924..e953c5380724 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -25,7 +25,7 @@ class EmojiPickerMenu extends Component { super(props); // Ref for the emoji search input - this.searchInput = null; + this.searchInput = undefined; this.filterEmojis = _.debounce(this.filterEmojis.bind(this), 500, false); this.renderItem = this.renderItem.bind(this); From 074af23f93426ae0ba6f1c1afe373968ab7476b7 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 30 Mar 2021 13:20:14 -0600 Subject: [PATCH 077/380] Rename vars to specify they are related to the emoji picker --- src/pages/home/report/ReportActionCompose.js | 41 +++++++------------- 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index 22b967e847e4..ac6af24dac0e 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -58,7 +58,7 @@ class ReportActionCompose extends React.Component { super(props); // The horizontal and vertical position (relative to the screen) where the popover will display. - this.popoverAnchorPosition = { + this.emojiPopoverAnchorPosition = { horizontal: 0, vertical: 0, }; @@ -78,7 +78,7 @@ class ReportActionCompose extends React.Component { isFocused: false, textInputShouldClear: false, isCommentEmpty: props.comment.length === 0, - isPickerVisible: false, + isEmojiPickerVisible: false, isMenuVisible: false, }; } @@ -174,18 +174,6 @@ class ReportActionCompose extends React.Component { } } - /** - * Save the location of a native press event. - * - * @param {Object} nativeEvent - */ - capturePressLocation(nativeEvent) { - this.popoverAnchorPosition = { - horizontal: nativeEvent.pageX, - vertical: nativeEvent.pageY, - }; - } - /** * Show the ReportActionContextMenu modal popover. * @@ -193,15 +181,18 @@ class ReportActionCompose extends React.Component { */ showEmojiPicker(event) { const nativeEvent = event.nativeEvent || {}; - this.capturePressLocation(nativeEvent); - this.setState({isPickerVisible: true}); + this.emojiPopoverAnchorPosition = { + horizontal: nativeEvent.pageX, + vertical: nativeEvent.pageY, + }; + this.setState({isEmojiPickerVisible: true}); } /** * Hide the ReportActionContextMenu modal popover. */ hideEmojiPicker() { - this.setState({isPickerVisible: false}); + this.setState({isEmojiPickerVisible: false}); } addEmojiToTextBox(emoji) { @@ -339,16 +330,14 @@ class ReportActionCompose extends React.Component { )} ( From 47826b945f884034a5abf4e9aea26b425e125fef Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 30 Mar 2021 13:22:52 -0600 Subject: [PATCH 078/380] Remove useless style --- src/styles/getModalStyles.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/styles/getModalStyles.js b/src/styles/getModalStyles.js index aedf111f7754..94d41ea3b2ee 100644 --- a/src/styles/getModalStyles.js +++ b/src/styles/getModalStyles.js @@ -100,7 +100,6 @@ export default (type, windowDimensions, popoverAnchorPosition = {}) => { borderTopLeftRadius: 20, borderTopRightRadius: 20, paddingTop: 12, - paddingBottom: 0, justifyContent: 'center', overflow: 'hidden', }; From 39b69c199c84f89bfb3e7c4a719aecba0df392cf Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 30 Mar 2021 13:33:13 -0600 Subject: [PATCH 079/380] Remove unnecessary styles --- src/styles/styles.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/styles/styles.js b/src/styles/styles.js index d733a1771357..0ac6ee9a3180 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -816,10 +816,6 @@ const styles = { alignSelf: 'flex-end', borderRadius: 6, height: 32, - paddingTop: 6, - paddingRight: 6, - paddingBottom: 6, - paddingLeft: 6, margin: 3, justifyContent: 'center', }, From 35cacd0c3fd752e876732571713beb59be29b68e Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 30 Mar 2021 13:49:55 -0600 Subject: [PATCH 080/380] Remove unnecessary isVisible prop --- src/components/Modal/BaseModal.js | 3 ++ src/pages/home/report/EmojiPickerMenu.js | 55 ++++++++------------ src/pages/home/report/ReportActionCompose.js | 5 +- 3 files changed, 28 insertions(+), 35 deletions(-) diff --git a/src/components/Modal/BaseModal.js b/src/components/Modal/BaseModal.js index 51884d6fdd6b..4be9332b1649 100644 --- a/src/components/Modal/BaseModal.js +++ b/src/components/Modal/BaseModal.js @@ -89,6 +89,9 @@ class BaseModal extends PureComponent { animationOut={animationOut} useNativeDriver={this.props.useNativeDriver} statusBarTranslucent + hideModalContentWhileAnimating={this.props.hideModalContentWhileAnimating} + animationInTiming={this.props.animationInTiming} + animationOutTiming={this.props.animationOutTiming} > {(insets) => { diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index e953c5380724..4237e1ce1323 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -9,17 +9,10 @@ import EmojiPickerMenuItem from './EmojiPickerMenuItem'; import TextInputFocusable from '../../../components/TextInputFocusable'; const propTypes = { - // Controls the visibility of this component. - isVisible: PropTypes.bool, - // Function to add the selected emoji to the main compose text input addEmojiToTextBox: PropTypes.func.isRequired, }; -const defaultProps = { - isVisible: false, -}; - class EmojiPickerMenu extends Component { constructor(props) { super(props); @@ -41,9 +34,7 @@ class EmojiPickerMenu extends Component { } componentDidUpdate() { - if (this.props.isVisible) { - this.searchInput.focus(); - } + this.searchInput.focus(); } filterEmojis(searchTerm) { @@ -89,34 +80,32 @@ class EmojiPickerMenu extends Component { render() { return ( - this.props.isVisible && ( - - - this.searchInput = el} - /> - - (`emoji_picker_${item.code}`)} - numColumns={8} - style={styles.emojiPickerList} - extraData={this.state.filteredEmojis} - stickyHeaderIndices={this.state.headerIndices} + + + this.searchInput = el} /> - )); + (`emoji_picker_${item.code}`)} + numColumns={8} + style={styles.emojiPickerList} + extraData={this.state.filteredEmojis} + stickyHeaderIndices={this.state.headerIndices} + /> + + ); } } EmojiPickerMenu.propTypes = propTypes; -EmojiPickerMenu.defaultProps = defaultProps; export default EmojiPickerMenu; diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index ac6af24dac0e..5e10932e221e 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -334,19 +334,20 @@ class ReportActionCompose extends React.Component { onClose={this.hideEmojiPicker} anchorPosition={this.emojiPopoverAnchorPosition} animationIn="fadeIn" + hideModalContentWhileAnimating + animationInTiming={1} + animationOutTiming={1} anchorOrigin={{ horizontal: CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL.RIGHT, vertical: CONST.MODAL.ANCHOR_ORIGIN_VERTICAL.BOTTOM, }} measureContent={() => ( )} > From fb2c2706f980dbbbe9dad3205b99204980a4c311 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 30 Mar 2021 13:56:35 -0600 Subject: [PATCH 081/380] Refactor PopoverWithMeasuredContent to just measure its children rather than a separate prop --- src/components/PopoverWithMeasuredContent.js | 6 +----- src/pages/home/report/ReportActionCompose.js | 5 ----- src/pages/home/report/ReportActionItem.js | 7 ------- 3 files changed, 1 insertion(+), 17 deletions(-) diff --git a/src/components/PopoverWithMeasuredContent.js b/src/components/PopoverWithMeasuredContent.js index 03c0ec0553e7..7ef851912507 100644 --- a/src/components/PopoverWithMeasuredContent.js +++ b/src/components/PopoverWithMeasuredContent.js @@ -25,10 +25,6 @@ const propTypes = { horizontal: PropTypes.oneOf(_.values(CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL)), vertical: PropTypes.oneOf(_.values(CONST.MODAL.ANCHOR_ORIGIN_VERTICAL)), }), - - // A function with content to measure. This component will use this.props.children by default, - // but in the case the children are not displayed, the measurement will not work. - measureContent: PropTypes.func.isRequired, }; const defaultProps = { @@ -137,7 +133,7 @@ class PopoverWithMeasuredContent extends Component { but we can't measure its dimensions without first rendering it. */ - {this.props.measureContent()} + {this.props.children} ); } diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index 5e10932e221e..8d9339bdabb9 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -341,11 +341,6 @@ class ReportActionCompose extends React.Component { horizontal: CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL.RIGHT, vertical: CONST.MODAL.ANCHOR_ORIGIN_VERTICAL.BOTTOM, }} - measureContent={() => ( - - )} > ( - - )} > Date: Tue, 30 Mar 2021 15:25:47 -0600 Subject: [PATCH 082/380] Return early and use find to make sure we only put each emoji in once --- src/pages/home/report/EmojiPickerMenu.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index 4237e1ce1323..8a8ade2d8a17 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -45,12 +45,12 @@ class EmojiPickerMenu extends Component { } const newFilteredEmojiList = []; _.each(emojis, (emoji) => { - if (!emoji.header && emoji.code !== 'BLANK') { - emoji.keywords.forEach((keyword) => { - if (keyword.includes(normalizedSearchTerm)) { - newFilteredEmojiList.push(emoji); - } - }); + if (emoji.header || emoji.code === 'BLANK') { + return; + } + + if (_.find(emoji.keywords, keyword => keyword.includes(normalizedSearchTerm))) { + newFilteredEmojiList.push(emoji); } }); From 8aa155558c8dce0371be744fc5b94eca2bb77160 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 30 Mar 2021 15:29:54 -0600 Subject: [PATCH 083/380] add method docs --- src/pages/home/report/EmojiPickerMenu.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index 8a8ade2d8a17..6f3f33b81b63 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -37,6 +37,11 @@ class EmojiPickerMenu extends Component { this.searchInput.focus(); } + /** + * Filter the entire list of emojis to only emojis that have the search term in their keywords + * + * @param {String} searchTerm + */ filterEmojis(searchTerm) { const normalizedSearchTerm = searchTerm.toLowerCase(); if (normalizedSearchTerm === '') { @@ -57,6 +62,14 @@ class EmojiPickerMenu extends Component { this.setState({filteredEmojis: newFilteredEmojiList, headerIndices: []}); } + /** + * Given an emoji item object, render a component based on its type. + * Items with the code "BLANK" return nothing and are used to fill rows up to 8 + * so that the sticky headers function properly + * + * @param {Object} item + * @returns {*} + */ renderItem({item}) { if (item.code === 'BLANK') { return; From 17a74b3b5900b4bca852c47627fb371914817631 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 30 Mar 2021 15:43:17 -0600 Subject: [PATCH 084/380] rename onPress function prop --- src/pages/home/report/EmojiPickerMenu.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index 6f3f33b81b63..d54368e857ea 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -10,7 +10,7 @@ import TextInputFocusable from '../../../components/TextInputFocusable'; const propTypes = { // Function to add the selected emoji to the main compose text input - addEmojiToTextBox: PropTypes.func.isRequired, + onEmojiSelected: PropTypes.func.isRequired, }; class EmojiPickerMenu extends Component { @@ -85,7 +85,7 @@ class EmojiPickerMenu extends Component { return ( ); From 0d51fbcb30f473eb712a4cfd8a64237db1f425c3 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 30 Mar 2021 15:51:34 -0600 Subject: [PATCH 085/380] Update props --- src/pages/home/report/ReportActionCompose.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index 8d9339bdabb9..572fd513e1b8 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -343,7 +343,7 @@ class ReportActionCompose extends React.Component { }} > {({hovered}) => ( Date: Tue, 30 Mar 2021 16:01:04 -0600 Subject: [PATCH 086/380] Add hover style to styles instead of inline --- src/components/MenuItem.js | 3 +-- src/pages/home/report/EmojiPickerMenuItem.js | 3 +-- src/pages/home/report/ReportActionCompose.js | 2 +- src/styles/styles.js | 4 ++++ 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/components/MenuItem.js b/src/components/MenuItem.js index a4a68e1e3c51..df60c37f211a 100644 --- a/src/components/MenuItem.js +++ b/src/components/MenuItem.js @@ -5,7 +5,6 @@ import { import PropTypes from 'prop-types'; import styles from '../styles/styles'; -import themeColors from '../styles/themes/default'; import Icon from './Icon'; import {ArrowRight} from './Icon/Expensicons'; @@ -37,7 +36,7 @@ const MenuItem = ({ onPress={onPress} style={({hovered}) => ([ styles.createMenuItem, - hovered && {backgroundColor: themeColors.buttonHoveredBG}, + hovered && styles.hoveredButton, ])} > diff --git a/src/pages/home/report/EmojiPickerMenuItem.js b/src/pages/home/report/EmojiPickerMenuItem.js index 8646ed77830c..311884e76de8 100644 --- a/src/pages/home/report/EmojiPickerMenuItem.js +++ b/src/pages/home/report/EmojiPickerMenuItem.js @@ -2,7 +2,6 @@ import React from 'react'; import PropTypes from 'prop-types'; import {Pressable, Text} from 'react-native'; import styles from '../../../styles/styles'; -import themeColors from '../../../styles/themes/default'; const propTypes = { // The unicode that is used to display the emoji @@ -17,7 +16,7 @@ const EmojiPickerMenuItem = props => ( onPress={() => props.onPress(props.emoji)} style={({hovered}) => ([ styles.emojiItem, - hovered && {backgroundColor: themeColors.buttonHoveredBG}, + hovered && styles.hoveredButton, ])} > {props.emoji} diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index 572fd513e1b8..ec9b0d23bed8 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -349,7 +349,7 @@ class ReportActionCompose extends React.Component { ([ styles.chatItemEmojiButton, - hovered && {backgroundColor: themeColors.buttonHoveredBG}, + hovered && styles.hoveredButton, ])} onPress={this.showEmojiPicker} > diff --git a/src/styles/styles.js b/src/styles/styles.js index 0ac6ee9a3180..56d1bd1299fc 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -820,6 +820,10 @@ const styles = { justifyContent: 'center', }, + hoveredButton: { + backgroundColor: themeColors.buttonHoveredBG, + }, + chatItemAttachButton: { alignItems: 'center', alignSelf: 'flex-end', From 382a8787f2aad7bcb5ba72ac01f10a2e25b10add Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 30 Mar 2021 16:34:10 -0600 Subject: [PATCH 087/380] Change from 'blank' to 'SPACER' and make it a constant --- assets/emojis.js | 158 ++++++++++++----------- src/CONST.js | 1 + src/pages/home/report/EmojiPickerMenu.js | 9 +- 3 files changed, 86 insertions(+), 82 deletions(-) diff --git a/assets/emojis.js b/assets/emojis.js index 7172f3a9c56e..82c3f4b7d073 100644 --- a/assets/emojis.js +++ b/assets/emojis.js @@ -1,3 +1,5 @@ +import CONST from '../src/CONST'; + /* * This list is generated from the code here https://github.com/amurani/unicode-emoji-list * Each code is then converted to hex by replacing the "U+" with "0x" @@ -30,25 +32,25 @@ const emojis = [ header: true, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { code: 'šŸ˜€', @@ -2821,35 +2823,35 @@ const emojis = [ ], }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { code: 'Animals & Nature', header: true, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { code: 'šŸµ', @@ -4392,41 +4394,41 @@ const emojis = [ ], }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { code: 'Travel & Places', header: true, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { code: 'šŸŒ', @@ -6253,50 +6255,50 @@ const emojis = [ ], }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { code: 'Activities', header: true, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { code: 'šŸŽƒ', @@ -7037,41 +7039,41 @@ const emojis = [ ], }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { code: 'Objects', header: true, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { code: 'šŸ”‡', @@ -8481,47 +8483,47 @@ const emojis = [ ], }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { code: 'Symbols', header: true, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { code: 'šŸ§', @@ -10118,47 +10120,47 @@ const emojis = [ ], }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { code: 'Flags', header: true, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { - code: 'BLANK', + code: CONST.EMOJI_SPACER, }, { code: 'šŸ', diff --git a/src/CONST.js b/src/CONST.js index 2888611097d3..0a691b060424 100644 --- a/src/CONST.js +++ b/src/CONST.js @@ -98,6 +98,7 @@ const CONST = { // at least 8 characters, 1 capital letter, 1 lowercase number, 1 number PASSWORD_COMPLEXITY_REGEX_STRING: '^(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z]).{8,}$', + EMOJI_SPACER: 'SPACER', }; export default CONST; diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index d54368e857ea..95d213ffa69f 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -2,6 +2,7 @@ import React, {Component} from 'react'; import {View, FlatList, Text} from 'react-native'; import PropTypes from 'prop-types'; import _ from 'underscore'; +import CONST from '../../../CONST'; import styles from '../../../styles/styles'; import themeColors from '../../../styles/themes/default'; import emojis from '../../../../assets/emojis'; @@ -50,7 +51,7 @@ class EmojiPickerMenu extends Component { } const newFilteredEmojiList = []; _.each(emojis, (emoji) => { - if (emoji.header || emoji.code === 'BLANK') { + if (emoji.header || emoji.code === CONST.EMOJI_SPACER) { return; } @@ -64,15 +65,15 @@ class EmojiPickerMenu extends Component { /** * Given an emoji item object, render a component based on its type. - * Items with the code "BLANK" return nothing and are used to fill rows up to 8 + * Items with the code "SPACER" return nothing and are used to fill rows up to 8 * so that the sticky headers function properly * * @param {Object} item * @returns {*} */ renderItem({item}) { - if (item.code === 'BLANK') { - return; + if (item.code === CONST.EMOJI_SPACER) { + return null; } if (item.header) { From 8b9c0b1ae521213cdb88ff6f23d1dfde71f151e0 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 30 Mar 2021 16:37:52 -0600 Subject: [PATCH 088/380] Make the numColumns a constant in the constructor with comments about the implications of changing it --- src/pages/home/report/EmojiPickerMenu.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index 95d213ffa69f..dab6fa622943 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -21,6 +21,13 @@ class EmojiPickerMenu extends Component { // Ref for the emoji search input this.searchInput = undefined; + // This is the number of columns in each row of the picker. + // Because of how flatList implements these rows, each row is an index rather than each element + // For this reason to make headers work, we need to have the header be the only rendered element in its row + // If this number is changed, emojis.js will need to be updated to have the proper number of spacer elements + // around each header + this.numColumns = 8; + this.filterEmojis = _.debounce(this.filterEmojis.bind(this), 500, false); this.renderItem = this.renderItem.bind(this); @@ -110,7 +117,7 @@ class EmojiPickerMenu extends Component { data={this.state.filteredEmojis} renderItem={this.renderItem} keyExtractor={item => (`emoji_picker_${item.code}`)} - numColumns={8} + numColumns={this.numColumns} style={styles.emojiPickerList} extraData={this.state.filteredEmojis} stickyHeaderIndices={this.state.headerIndices} From 9f64d4c89f26d6a10383e6f4035d5246408d1883 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 30 Mar 2021 16:57:08 -0600 Subject: [PATCH 089/380] DRY and add more comments/warnings --- assets/emojis.js | 2 ++ src/pages/home/report/EmojiPickerMenu.js | 18 +++++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/assets/emojis.js b/assets/emojis.js index 82c3f4b7d073..937d8ac2a822 100644 --- a/assets/emojis.js +++ b/assets/emojis.js @@ -26,6 +26,8 @@ import CONST from '../src/CONST'; * } */ + +// BEFORE YOU EDIT THIS, PLEASE SEE WARNINGS IN EmojiPickerMenu.js const emojis = [ { code: 'Smileys & People', diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index dab6fa622943..7d32fcc72fcc 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -25,19 +25,21 @@ class EmojiPickerMenu extends Component { // Because of how flatList implements these rows, each row is an index rather than each element // For this reason to make headers work, we need to have the header be the only rendered element in its row // If this number is changed, emojis.js will need to be updated to have the proper number of spacer elements - // around each header + // around each header. this.numColumns = 8; + // This is the indices of each category of emojis + // The positions are static, and are calculated as index/numColumns (8 in our case) + // This is because each row of 8 emojis counts as one index + // If this emojis are ever added to emojis.js this will need to be updated or things will break + this.unfilteredHeaderIndices = [0, 34, 60, 88, 99, 121, 148]; + this.filterEmojis = _.debounce(this.filterEmojis.bind(this), 500, false); this.renderItem = this.renderItem.bind(this); this.state = { filteredEmojis: emojis, - - // This is the indices of each category of emojis - // The positions are static, and are calculated as index/numColumns (8 in our case) - // This is because each row of 8 emojis counts as one index - headerIndices: [0, 34, 60, 88, 99, 121, 148], + headerIndices: this.unfilteredHeaderIndices, }; } @@ -53,7 +55,8 @@ class EmojiPickerMenu extends Component { filterEmojis(searchTerm) { const normalizedSearchTerm = searchTerm.toLowerCase(); if (normalizedSearchTerm === '') { - this.setState({filteredEmojis: emojis, headerIndices: [0, 34, 60, 88, 99, 121, 148]}); + // There are no headers when searching, so we need to re-make them sticky when there is no search term + this.setState({filteredEmojis: emojis, headerIndices: this.unfilteredHeaderIndices}); return; } const newFilteredEmojiList = []; @@ -67,6 +70,7 @@ class EmojiPickerMenu extends Component { } }); + // Remove sticky header indices since there are no headers while searching and we don't want to make emojis sticky this.setState({filteredEmojis: newFilteredEmojiList, headerIndices: []}); } From 184785e8a00f19d7fd5060f2e95849017d68804e Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 30 Mar 2021 16:59:29 -0600 Subject: [PATCH 090/380] Use nativeEvent directly since it will always exist --- src/pages/home/report/ReportActionCompose.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index ec9b0d23bed8..4bef6c436e3d 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -180,10 +180,9 @@ class ReportActionCompose extends React.Component { * @param {Object} [event] - A press event. */ showEmojiPicker(event) { - const nativeEvent = event.nativeEvent || {}; this.emojiPopoverAnchorPosition = { - horizontal: nativeEvent.pageX, - vertical: nativeEvent.pageY, + horizontal: event.nativeEvent.pageX, + vertical: event.nativeEvent.pageY, }; this.setState({isEmojiPickerVisible: true}); } From 0055378fb43c4a67f417640bcf7f989aca2f4b24 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Tue, 30 Mar 2021 17:01:19 -0600 Subject: [PATCH 091/380] move emojiPopoverAnchorPosition into state --- src/pages/home/report/ReportActionCompose.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index 4bef6c436e3d..e5e1dbcce4e4 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -57,11 +57,6 @@ class ReportActionCompose extends React.Component { constructor(props) { super(props); - // The horizontal and vertical position (relative to the screen) where the popover will display. - this.emojiPopoverAnchorPosition = { - horizontal: 0, - vertical: 0, - }; this.updateComment = this.updateComment.bind(this); this.debouncedSaveReportComment = _.debounce(this.debouncedSaveReportComment.bind(this), 1000, false); this.debouncedBroadcastUserIsTyping = _.debounce(this.debouncedBroadcastUserIsTyping.bind(this), 100, true); @@ -80,6 +75,12 @@ class ReportActionCompose extends React.Component { isCommentEmpty: props.comment.length === 0, isEmojiPickerVisible: false, isMenuVisible: false, + + // The horizontal and vertical position (relative to the screen) where the emoji popover will display. + emojiPopoverAnchorPosition: { + horizontal: 0, + vertical: 0, + }, }; } @@ -180,7 +181,7 @@ class ReportActionCompose extends React.Component { * @param {Object} [event] - A press event. */ showEmojiPicker(event) { - this.emojiPopoverAnchorPosition = { + this.state.emojiPopoverAnchorPosition = { horizontal: event.nativeEvent.pageX, vertical: event.nativeEvent.pageY, }; @@ -331,7 +332,7 @@ class ReportActionCompose extends React.Component { Date: Tue, 30 Mar 2021 17:16:22 -0600 Subject: [PATCH 092/380] Add isVisible prop to make sure we only focus when the modal is visible --- src/pages/home/report/EmojiPickerMenu.js | 11 ++++++++--- src/pages/home/report/ReportActionCompose.js | 1 + 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index 7d32fcc72fcc..0dbebafd49ae 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -10,6 +10,9 @@ import EmojiPickerMenuItem from './EmojiPickerMenuItem'; import TextInputFocusable from '../../../components/TextInputFocusable'; const propTypes = { + // Is the picker currently visible? + isVisible: PropTypes.bool.isRequired, + // Function to add the selected emoji to the main compose text input onEmojiSelected: PropTypes.func.isRequired, }; @@ -43,8 +46,10 @@ class EmojiPickerMenu extends Component { }; } - componentDidUpdate() { - this.searchInput.focus(); + componentDidMount() { + if (this.props.isVisible) { + this.searchInput.focus(); + } } /** @@ -70,7 +75,7 @@ class EmojiPickerMenu extends Component { } }); - // Remove sticky header indices since there are no headers while searching and we don't want to make emojis sticky + // Remove sticky header indices. There are no headers while searching and we don't want to make emojis sticky this.setState({filteredEmojis: newFilteredEmojiList, headerIndices: []}); } diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index e5e1dbcce4e4..70f23156ac00 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -343,6 +343,7 @@ class ReportActionCompose extends React.Component { }} > From a658b53936f340fbdb52d5ad1394c0e7fb0dc98d Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Wed, 31 Mar 2021 13:16:33 +0800 Subject: [PATCH 093/380] Revert back into multiple components to fix layout on wide native devices. --- .../Navigation/AppNavigator/PublicScreens.js | 2 +- src/pages/SetPasswordPage.js | 147 ------------------ src/pages/setpassword/SetPasswordForm.js | 83 ++++++++++ .../setpassword/SetPasswordPageNarrow.js | 41 +++++ src/pages/setpassword/SetPasswordPageWide.js | 32 ++++ src/pages/setpassword/index.js | 23 +++ src/pages/setpassword/index.native.js | 3 + .../setpassword/setPasswordPagePropTypes.js | 38 +++++ 8 files changed, 221 insertions(+), 148 deletions(-) delete mode 100644 src/pages/SetPasswordPage.js create mode 100644 src/pages/setpassword/SetPasswordForm.js create mode 100644 src/pages/setpassword/SetPasswordPageNarrow.js create mode 100644 src/pages/setpassword/SetPasswordPageWide.js create mode 100644 src/pages/setpassword/index.js create mode 100644 src/pages/setpassword/index.native.js create mode 100644 src/pages/setpassword/setPasswordPagePropTypes.js diff --git a/src/libs/Navigation/AppNavigator/PublicScreens.js b/src/libs/Navigation/AppNavigator/PublicScreens.js index 141695a74ff5..f3982f8f3f7f 100644 --- a/src/libs/Navigation/AppNavigator/PublicScreens.js +++ b/src/libs/Navigation/AppNavigator/PublicScreens.js @@ -1,7 +1,7 @@ import React from 'react'; import {createStackNavigator} from '@react-navigation/stack'; import SignInPage from '../../../pages/signin/SignInPage'; -import SetPasswordPage from '../../../pages/SetPasswordPage'; +import SetPasswordPage from '../../../pages/setpassword'; const RootStack = createStackNavigator(); const defaultScreenOptions = { diff --git a/src/pages/SetPasswordPage.js b/src/pages/SetPasswordPage.js deleted file mode 100644 index af12df76737f..000000000000 --- a/src/pages/SetPasswordPage.js +++ /dev/null @@ -1,147 +0,0 @@ -import React, {Component} from 'react'; -import { - Image, - SafeAreaView, - Text, - TextInput, - View, -} from 'react-native'; -import PropTypes from 'prop-types'; -import lodashGet from 'lodash/get'; -import {withOnyx} from 'react-native-onyx'; -import _ from 'underscore'; -import styles from '../styles/styles'; -import SignInPageLayout from './signin/SignInPageLayout'; -import welcomeScreenshot from '../../assets/images/welcome-screenshot.png'; -import withWindowDimensions, {windowDimensionsPropTypes} from '../components/withWindowDimensions'; -import WelcomeText from '../components/WelcomeText'; -import ONYXKEYS from '../ONYXKEYS'; -import {setPassword} from '../libs/actions/Session'; -import ButtonWithLoader from '../components/ButtonWithLoader'; -import compose from '../libs/compose'; - -const propTypes = { - /* Onyx Props */ - - // The details about the account that the user is signing in with - account: PropTypes.shape({ - // An error message to display to the user - error: PropTypes.string, - - // Whether or not a sign on form is loading (being submitted) - loading: PropTypes.bool, - }), - - // The credentials of the logged in person - credentials: PropTypes.shape({ - // The email the user logged in with - login: PropTypes.string, - - // The password used to log in the user - password: PropTypes.string, - }), - - route: PropTypes.shape({ - params: PropTypes.shape({ - validateCode: PropTypes.string, - }), - }), - ...windowDimensionsPropTypes, -}; -const defaultProps = { - account: {}, - credentials: {}, - route: { - params: {}, - }, -}; - -class SetPasswordPage extends Component { - constructor(props) { - super(props); - - this.submitForm = this.submitForm.bind(this); - - this.state = { - password: '', - formError: null, - }; - } - - /** - * Validate the form and then submit it - */ - submitForm() { - if (!this.state.password.trim()) { - this.setState({ - formError: 'Password cannot be blank', - }); - return; - } - - this.setState({ - formError: null, - }); - setPassword(this.state.password, lodashGet(this.props.route, 'params.validateCode', '')); - } - - render() { - return ( - - - - - Enter a password: - this.setState({password: text})} - onSubmitEditing={this.submitForm} - autoFocus - /> - - - {this.state.formError && ( - - {this.state.formError} - - )} - {!_.isEmpty(this.props.account.error) && ( - - {this.props.account.error} - - )} - {this.props.isSmallScreenWidth && ( - - - - )} - - - - - ); - } -} - -SetPasswordPage.propTypes = propTypes; -SetPasswordPage.defaultProps = defaultProps; - -export default compose( - withOnyx({ - credentials: {key: ONYXKEYS.CREDENTIALS}, - account: {key: ONYXKEYS.ACCOUNT}, - }), - withWindowDimensions, -)(SetPasswordPage); diff --git a/src/pages/setpassword/SetPasswordForm.js b/src/pages/setpassword/SetPasswordForm.js new file mode 100644 index 000000000000..7e52004d9c44 --- /dev/null +++ b/src/pages/setpassword/SetPasswordForm.js @@ -0,0 +1,83 @@ +import React, {Component} from 'react'; +import lodashGet from 'lodash/get'; +import {Text, TextInput, View} from 'react-native'; +import _ from 'underscore'; +import {withOnyx} from 'react-native-onyx'; +import styles from '../../styles/styles'; +import ButtonWithLoader from '../../components/ButtonWithLoader'; +import {setPassword} from '../../libs/actions/Session'; +import setPasswordPagePropTypes from './setPasswordPagePropTypes'; +import ONYXKEYS from '../../ONYXKEYS'; + +class SetPasswordForm extends Component { + constructor(props) { + super(props); + + this.submitForm = this.submitForm.bind(this); + + this.state = { + password: '', + formError: null, + }; + } + + /** + * Validate the form and then submit it + */ + submitForm() { + if (!this.state.password.trim()) { + this.setState({ + formError: 'Password cannot be blank', + }); + return; + } + + this.setState({ + formError: null, + }); + setPassword(this.state.password, lodashGet(this.props.route, 'params.validateCode', '')); + } + + render() { + return ( + <> + + Enter a password: + this.setState({password: text})} + onSubmitEditing={this.submitForm} + autoFocus + /> + + + {this.state.formError && ( + + {this.state.formError} + + )} + {!_.isEmpty(this.props.account.error) && ( + + {this.props.account.error} + + )} + + ); + } +} + +SetPasswordForm.propTypes = setPasswordPagePropTypes.propTypes; +SetPasswordForm.defaultProps = setPasswordPagePropTypes.defaultProps; + +export default withOnyx({ + credentials: {key: ONYXKEYS.CREDENTIALS}, + account: {key: ONYXKEYS.ACCOUNT}, +})(SetPasswordForm); diff --git a/src/pages/setpassword/SetPasswordPageNarrow.js b/src/pages/setpassword/SetPasswordPageNarrow.js new file mode 100644 index 000000000000..8e43a805147b --- /dev/null +++ b/src/pages/setpassword/SetPasswordPageNarrow.js @@ -0,0 +1,41 @@ +import React from 'react'; +import { + SafeAreaView, + View, + Image, +} from 'react-native'; +import withOnyx from 'react-native-onyx/lib/withOnyx'; +import styles from '../../styles/styles'; +import SignInPageLayout from '../signin/SignInPageLayout'; +import WelcomeText from '../../components/WelcomeText'; +import ONYXKEYS from '../../ONYXKEYS'; +import SetPasswordForm from './SetPasswordForm'; +import welcomeScreenshot from '../../../assets/images/welcome-screenshot-wide.png'; +import setPasswordPagePropTypes from './setPasswordPagePropTypes'; + +const SetPasswordPageNarrow = props => ( + + + + {/* eslint-disable-next-line react/jsx-props-no-spreading */} + + + + + + + + +); + +SetPasswordPageNarrow.propTypes = setPasswordPagePropTypes.propTypes; +SetPasswordPageNarrow.defaultProps = setPasswordPagePropTypes.defaultProps; + +export default withOnyx({ + credentials: {key: ONYXKEYS.CREDENTIALS}, + account: {key: ONYXKEYS.ACCOUNT}, +})(SetPasswordPageNarrow); diff --git a/src/pages/setpassword/SetPasswordPageWide.js b/src/pages/setpassword/SetPasswordPageWide.js new file mode 100644 index 000000000000..e0dd5d8c1149 --- /dev/null +++ b/src/pages/setpassword/SetPasswordPageWide.js @@ -0,0 +1,32 @@ +import React from 'react'; +import { + SafeAreaView, + View, +} from 'react-native'; +import {withOnyx} from 'react-native-onyx'; +import styles from '../../styles/styles'; +import SignInPageLayout from '../signin/SignInPageLayout'; +import WelcomeText from '../../components/WelcomeText'; +import ONYXKEYS from '../../ONYXKEYS'; +import setPasswordPagePropTypes from './setPasswordPagePropTypes'; +import SetPasswordForm from './SetPasswordForm'; + +const SetPasswordPageWide = props => ( + + + + {/* eslint-disable-next-line react/jsx-props-no-spreading */} + + + + + +); + +SetPasswordPageWide.propTypes = setPasswordPagePropTypes.propTypes; +SetPasswordPageWide.defaultProps = setPasswordPagePropTypes.defaultProps; + +export default withOnyx({ + credentials: {key: ONYXKEYS.CREDENTIALS}, + account: {key: ONYXKEYS.ACCOUNT}, +})(SetPasswordPageWide); diff --git a/src/pages/setpassword/index.js b/src/pages/setpassword/index.js new file mode 100644 index 000000000000..2e39913f60f8 --- /dev/null +++ b/src/pages/setpassword/index.js @@ -0,0 +1,23 @@ +import React from 'react'; +import SetPasswordPageWide from './SetPasswordPageWide'; +import SetPasswordPageNarrow from './SetPasswordPageNarrow'; +import withWindowDimensions, {windowDimensionsPropTypes} from '../../components/withWindowDimensions'; +import setPasswordPagePropTypes from './setPasswordPagePropTypes'; + +const propTypes = { + ...windowDimensionsPropTypes, + ...setPasswordPagePropTypes.propTypes, +}; + +const SetPasswordPage = props => ( + !props.isSmallScreenWidth + // eslint-disable-next-line react/jsx-props-no-spreading + ? + // eslint-disable-next-line react/jsx-props-no-spreading + : +); + +SetPasswordPage.propTypes = propTypes; +SetPasswordPage.defaultProps = setPasswordPagePropTypes.defaultProps; + +export default withWindowDimensions(SetPasswordPage); diff --git a/src/pages/setpassword/index.native.js b/src/pages/setpassword/index.native.js new file mode 100644 index 000000000000..099b24104f3c --- /dev/null +++ b/src/pages/setpassword/index.native.js @@ -0,0 +1,3 @@ +import SetPasswordPageNarrow from './SetPasswordPageNarrow'; + +export default SetPasswordPageNarrow; diff --git a/src/pages/setpassword/setPasswordPagePropTypes.js b/src/pages/setpassword/setPasswordPagePropTypes.js new file mode 100644 index 000000000000..9ea2e080fc31 --- /dev/null +++ b/src/pages/setpassword/setPasswordPagePropTypes.js @@ -0,0 +1,38 @@ +import PropTypes from 'prop-types'; + +export default { + propTypes: PropTypes.shape({ + /* Onyx Props */ + + // The details about the account that the user is signing in with + account: PropTypes.shape({ + // An error message to display to the user + error: PropTypes.string, + + // Whether or not a sign on form is loading (being submitted) + loading: PropTypes.bool, + }), + + // The credentials of the logged in person + credentials: PropTypes.shape({ + // The email the user logged in with + login: PropTypes.string, + + // The password used to log in the user + password: PropTypes.string, + }), + + route: PropTypes.shape({ + params: PropTypes.shape({ + validateCode: PropTypes.string, + }), + }), + }), + defaultProps: { + account: {}, + credentials: {}, + route: { + params: {}, + }, + }, +}; From cc0ebcd460dbf708a5f11e33263fa28493f1ca33 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Wed, 31 Mar 2021 13:20:27 +0800 Subject: [PATCH 094/380] Fix ESLint --- src/pages/setpassword/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/setpassword/index.js b/src/pages/setpassword/index.js index 2e39913f60f8..4016ae4fa1c8 100644 --- a/src/pages/setpassword/index.js +++ b/src/pages/setpassword/index.js @@ -6,6 +6,7 @@ import setPasswordPagePropTypes from './setPasswordPagePropTypes'; const propTypes = { ...windowDimensionsPropTypes, + // eslint-disable-next-line react/forbid-foreign-prop-types ...setPasswordPagePropTypes.propTypes, }; From f2a9c4da6d67d9256ce982cbd5ead12f26bd6ee8 Mon Sep 17 00:00:00 2001 From: Barun Pandey Date: Wed, 31 Mar 2021 23:10:54 +0545 Subject: [PATCH 095/380] Refactor code, revert changes in OptionsSelector --- src/components/OptionsSelector.js | 40 +++++++------------ .../steps/IOUConfirmPage/IOUConfirmRequest.js | 18 +++++---- .../steps/IOUConfirmPage/IOUConfirmSplit.js | 18 +++++---- src/styles/utilities/spacing.js | 4 ++ 4 files changed, 39 insertions(+), 41 deletions(-) diff --git a/src/components/OptionsSelector.js b/src/components/OptionsSelector.js index 5bb54afefa10..8e976eab31c7 100644 --- a/src/components/OptionsSelector.js +++ b/src/components/OptionsSelector.js @@ -12,9 +12,6 @@ const propTypes = { // Callback to fire when a row is tapped onSelectRow: PropTypes.func, - // if we should show search or not? - showSearch: PropTypes.bool, - // Sections for the section list sections: PropTypes.arrayOf(PropTypes.shape({ // Title of the section @@ -31,10 +28,10 @@ const propTypes = { })).isRequired, // Value in the search input field - value: PropTypes.string, + value: PropTypes.string.isRequired, // Callback fired when text changes - onChangeText: PropTypes.func, + onChangeText: PropTypes.func.isRequired, // Optional placeholder text for the selector placeholderText: PropTypes.string, @@ -75,9 +72,6 @@ const defaultProps = { hideAdditionalOptionStates: false, forceTextUnreadStyle: false, showTitleTooltip: false, - showSearch: true, - onChangeText: () => {}, - value: '', }; class OptionsSelector extends Component { @@ -93,9 +87,7 @@ class OptionsSelector extends Component { } componentDidMount() { - if (this.props.showSearch) { - this.textInput.focus(); - } + this.textInput.focus(); } /** @@ -178,20 +170,18 @@ class OptionsSelector extends Component { render() { return ( - { this.props.showSearch ? ( - - this.textInput = el} - style={[styles.textInput]} - value={this.props.value} - onChangeText={this.props.onChangeText} - onKeyPress={this.handleKeyPress} - placeholder={this.props.placeholderText} - placeholderTextColor={themeColors.placeholderText} - /> - - ) : null} + + this.textInput = el} + style={[styles.textInput]} + value={this.props.value} + onChangeText={this.props.onChangeText} + onKeyPress={this.handleKeyPress} + placeholder={this.props.placeholderText} + placeholderTextColor={themeColors.placeholderText} + /> + this.list = el} optionHoveredStyle={styles.hoveredComponentBG} diff --git a/src/pages/iou/steps/IOUConfirmPage/IOUConfirmRequest.js b/src/pages/iou/steps/IOUConfirmPage/IOUConfirmRequest.js index a80dd556d5e0..a57c06aafeb6 100644 --- a/src/pages/iou/steps/IOUConfirmPage/IOUConfirmRequest.js +++ b/src/pages/iou/steps/IOUConfirmPage/IOUConfirmRequest.js @@ -7,8 +7,8 @@ import styles from '../../../../styles/styles'; import Text from '../../../../components/Text'; import ButtonWithLoader from '../../../../components/ButtonWithLoader'; import themeColors from '../../../../styles/themes/default'; -import OptionsSelector from '../../../../components/OptionsSelector'; import {getDisplayOptionsFromParticipants} from '../../../../libs/OptionsListUtils'; +import OptionsList from '../../../../components/OptionsList'; const propTypes = { // Callback to inform parent modal of success @@ -97,17 +97,19 @@ class IOUConfirmRequestPage extends Component { return ( - - - WHAT'S IT FOR? - - + + + WHAT'S IT FOR? + + + - + - - - WHAT'S IT FOR? - - + + + WHAT'S IT FOR? + + + - + Date: Thu, 1 Apr 2021 00:08:29 +0545 Subject: [PATCH 096/380] Remove temporary solution of using state to dismiss modal --- src/libs/actions/IOU.js | 7 +------ src/pages/iou/IOUModal.js | 31 ++++++++++--------------------- 2 files changed, 11 insertions(+), 27 deletions(-) diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index 78a581c4caca..1a79e7e55548 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -25,7 +25,7 @@ function getPreferredCurrency() { * @param {String} parameters.debtorEmail */ function createIOUTransaction({ - comment, amount, currency, debtorEmail, setIsTransactionComplete, + comment, amount, currency, debtorEmail, }) { Onyx.merge(ONYXKEYS.IOU, {loading: true}); let iouReportID = ''; @@ -57,7 +57,6 @@ function createIOUTransaction({ Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_IOUS}${iouReportID}`, getSimplifiedIOUReport(iouReportData)); - setIsTransactionComplete(true); Onyx.merge(ONYXKEYS.IOU, {loading: false}); }) .catch((error) => { @@ -80,7 +79,6 @@ function createIOUSplit({ amount, currency, splits, - setIsTransactionComplete, }) { let reportIDs = []; Onyx.merge(ONYXKEYS.IOU, {loading: true}); @@ -96,8 +94,6 @@ function createIOUSplit({ reportID, })) .then((data) => { - console.debug(data); - Onyx.merge(ONYXKEYS.IOU, {loading: false}); reportIDs = data.reportIDList; return reportIDs; }) @@ -120,7 +116,6 @@ function createIOUSplit({ return Onyx.mergeCollection(ONYXKEYS.COLLECTION.REPORT_IOUS, {...reportIOUData}); }) .then(() => { - setIsTransactionComplete(true); Onyx.merge(ONYXKEYS.IOU, {loading: false}); }) .catch((error) => { diff --git a/src/pages/iou/IOUModal.js b/src/pages/iou/IOUModal.js index eece50d0c700..cf17e5d94b72 100644 --- a/src/pages/iou/IOUModal.js +++ b/src/pages/iou/IOUModal.js @@ -57,7 +57,6 @@ class IOUModal extends Component { this.createTransaction = this.createTransaction.bind(this); this.updateComment = this.updateComment.bind(this); this.addParticipants = this.addParticipants.bind(this); - this.setIsTransactionComplete = this.setIsTransactionComplete.bind(this); this.state = { currentStepIndex: 0, @@ -66,7 +65,6 @@ class IOUModal extends Component { selectedCurrency: 'USD', isAmountPageNextButtonDisabled: true, comment: '', - isTransactionComplete: false, }; } @@ -75,21 +73,19 @@ class IOUModal extends Component { } componentDidUpdate(prevProps) { - // Dismiss modal when the length of transactions for any iousReport changes + // Handles edge case when there are no previous user IOU report if (!prevProps.iousReport) { return; } - if (this.state.isTransactionComplete === true) { - return Navigation.dismissModal(); - } + // Dismiss modal when the length of transactions for any iousReport changes + Object.keys(this.props.iousReport) + .forEach((reportKey) => { + const prevTransactions = [...prevProps.iousReport[reportKey].transactions]; + const currentTransactions = [...this.props.iousReport[reportKey].transactions]; - // Object.keys(this.props.iousReport) - // .forEach((reportKey) => { - // const prevTransactions = lodashGet({...prevProps.iousReport[reportKey]}, 'transactions', null); - // const currentTransactions = lodashGet({...this.props.iousReport[reportKey]}, 'transactions', null); - // if (prevTransactions.length !== currentTransactions.length) { - // return Navigation.dismissModal(); - // } - // }); + if (prevTransactions.length !== currentTransactions.length) { + return Navigation.dismissModal(); + } + }); } /** @@ -109,12 +105,6 @@ class IOUModal extends Component { return steps[currentStepIndex] || ''; } - setIsTransactionComplete(isTransactionComplete) { - this.setState({ - isTransactionComplete, - }); - } - addParticipants(participants) { this.setState({ participants, @@ -216,7 +206,6 @@ class IOUModal extends Component { currency: this.state.selectedCurrency, splits, participants, - setIsTransactionComplete: this.setIsTransactionComplete, }); } From 26e85035ec40dcf46163625817ea8e2ef7bc9150 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Wed, 31 Mar 2021 12:39:05 -0600 Subject: [PATCH 097/380] Let parent modal decide when the menu is visible --- src/pages/home/report/ReportActionItem.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index 97d7399a41fb..0843c6cbd72e 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -133,7 +133,7 @@ class ReportActionItem extends Component { animationIn="fadeIn" > From 7907a97c55cddcb3e5ab9b49f67394eb56d70bc8 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Wed, 31 Mar 2021 15:10:02 -0600 Subject: [PATCH 098/380] Update to have static width and height, use a normal popover --- src/pages/home/report/ReportActionCompose.js | 13 ++++++------- src/styles/styles.js | 3 ++- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index 70f23156ac00..218f7bf7a1f1 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -19,7 +19,7 @@ import compose from '../../../libs/compose'; import CreateMenu from '../../../components/CreateMenu'; import CONST from '../../../CONST'; import Navigation from '../../../libs/Navigation/Navigation'; -import PopoverWithMeasuredContent from '../../../components/PopoverWithMeasuredContent'; +import Popover from '../../../components/Popover'; import EmojiPickerMenu from './EmojiPickerMenu'; const propTypes = { @@ -329,24 +329,23 @@ class ReportActionCompose extends React.Component { )} - - + ([ styles.chatItemEmojiButton, diff --git a/src/styles/styles.js b/src/styles/styles.js index 56d1bd1299fc..b6151be99df6 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -778,7 +778,8 @@ const styles = { emojiPickerContainer: { backgroundColor: themeColors.componentBG, - minWidth: 360, + width: 360, + height: 360, }, emojiPickerList: { From 26fa00db8dbb3388f478e84a2ba6ddb14a873143 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Wed, 31 Mar 2021 15:42:24 -0600 Subject: [PATCH 099/380] Fix styles --- src/pages/home/report/ReportActionCompose.js | 4 ++-- src/styles/styles.js | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index 218f7bf7a1f1..c5d757a9ff04 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -337,8 +337,8 @@ class ReportActionCompose extends React.Component { animationInTiming={1} animationOutTiming={1} anchorPosition={{ - top: this.state.emojiPopoverAnchorPosition.vertical - (360), - left: this.state.emojiPopoverAnchorPosition.horizontal - (360), + top: this.state.emojiPopoverAnchorPosition.vertical - 360, + left: this.state.emojiPopoverAnchorPosition.horizontal - 360, }} > Date: Wed, 31 Mar 2021 16:08:25 -0600 Subject: [PATCH 100/380] Reduce debounce --- src/pages/home/report/EmojiPickerMenu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index 0dbebafd49ae..7a7c16e71182 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -37,7 +37,7 @@ class EmojiPickerMenu extends Component { // If this emojis are ever added to emojis.js this will need to be updated or things will break this.unfilteredHeaderIndices = [0, 34, 60, 88, 99, 121, 148]; - this.filterEmojis = _.debounce(this.filterEmojis.bind(this), 500, false); + this.filterEmojis = _.debounce(this.filterEmojis.bind(this), 300, false); this.renderItem = this.renderItem.bind(this); this.state = { From e6a36040daad311c4c34c038557a748117f8f297 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Thu, 1 Apr 2021 09:37:41 +0800 Subject: [PATCH 101/380] Revert "Fix ESLint" This reverts commit cc0ebcd460dbf708a5f11e33263fa28493f1ca33. --- src/pages/setpassword/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/setpassword/index.js b/src/pages/setpassword/index.js index 4016ae4fa1c8..2e39913f60f8 100644 --- a/src/pages/setpassword/index.js +++ b/src/pages/setpassword/index.js @@ -6,7 +6,6 @@ import setPasswordPagePropTypes from './setPasswordPagePropTypes'; const propTypes = { ...windowDimensionsPropTypes, - // eslint-disable-next-line react/forbid-foreign-prop-types ...setPasswordPagePropTypes.propTypes, }; From 951f4fb93d52384790f9c059e72bcaec292bc8ca Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Thu, 1 Apr 2021 09:37:45 +0800 Subject: [PATCH 102/380] Revert "Revert back into multiple components to fix layout on wide native devices." This reverts commit a658b53936f340fbdb52d5ad1394c0e7fb0dc98d. --- .../Navigation/AppNavigator/PublicScreens.js | 2 +- src/pages/SetPasswordPage.js | 147 ++++++++++++++++++ src/pages/setpassword/SetPasswordForm.js | 83 ---------- .../setpassword/SetPasswordPageNarrow.js | 41 ----- src/pages/setpassword/SetPasswordPageWide.js | 32 ---- src/pages/setpassword/index.js | 23 --- src/pages/setpassword/index.native.js | 3 - .../setpassword/setPasswordPagePropTypes.js | 38 ----- 8 files changed, 148 insertions(+), 221 deletions(-) create mode 100644 src/pages/SetPasswordPage.js delete mode 100644 src/pages/setpassword/SetPasswordForm.js delete mode 100644 src/pages/setpassword/SetPasswordPageNarrow.js delete mode 100644 src/pages/setpassword/SetPasswordPageWide.js delete mode 100644 src/pages/setpassword/index.js delete mode 100644 src/pages/setpassword/index.native.js delete mode 100644 src/pages/setpassword/setPasswordPagePropTypes.js diff --git a/src/libs/Navigation/AppNavigator/PublicScreens.js b/src/libs/Navigation/AppNavigator/PublicScreens.js index f3982f8f3f7f..141695a74ff5 100644 --- a/src/libs/Navigation/AppNavigator/PublicScreens.js +++ b/src/libs/Navigation/AppNavigator/PublicScreens.js @@ -1,7 +1,7 @@ import React from 'react'; import {createStackNavigator} from '@react-navigation/stack'; import SignInPage from '../../../pages/signin/SignInPage'; -import SetPasswordPage from '../../../pages/setpassword'; +import SetPasswordPage from '../../../pages/SetPasswordPage'; const RootStack = createStackNavigator(); const defaultScreenOptions = { diff --git a/src/pages/SetPasswordPage.js b/src/pages/SetPasswordPage.js new file mode 100644 index 000000000000..af12df76737f --- /dev/null +++ b/src/pages/SetPasswordPage.js @@ -0,0 +1,147 @@ +import React, {Component} from 'react'; +import { + Image, + SafeAreaView, + Text, + TextInput, + View, +} from 'react-native'; +import PropTypes from 'prop-types'; +import lodashGet from 'lodash/get'; +import {withOnyx} from 'react-native-onyx'; +import _ from 'underscore'; +import styles from '../styles/styles'; +import SignInPageLayout from './signin/SignInPageLayout'; +import welcomeScreenshot from '../../assets/images/welcome-screenshot.png'; +import withWindowDimensions, {windowDimensionsPropTypes} from '../components/withWindowDimensions'; +import WelcomeText from '../components/WelcomeText'; +import ONYXKEYS from '../ONYXKEYS'; +import {setPassword} from '../libs/actions/Session'; +import ButtonWithLoader from '../components/ButtonWithLoader'; +import compose from '../libs/compose'; + +const propTypes = { + /* Onyx Props */ + + // The details about the account that the user is signing in with + account: PropTypes.shape({ + // An error message to display to the user + error: PropTypes.string, + + // Whether or not a sign on form is loading (being submitted) + loading: PropTypes.bool, + }), + + // The credentials of the logged in person + credentials: PropTypes.shape({ + // The email the user logged in with + login: PropTypes.string, + + // The password used to log in the user + password: PropTypes.string, + }), + + route: PropTypes.shape({ + params: PropTypes.shape({ + validateCode: PropTypes.string, + }), + }), + ...windowDimensionsPropTypes, +}; +const defaultProps = { + account: {}, + credentials: {}, + route: { + params: {}, + }, +}; + +class SetPasswordPage extends Component { + constructor(props) { + super(props); + + this.submitForm = this.submitForm.bind(this); + + this.state = { + password: '', + formError: null, + }; + } + + /** + * Validate the form and then submit it + */ + submitForm() { + if (!this.state.password.trim()) { + this.setState({ + formError: 'Password cannot be blank', + }); + return; + } + + this.setState({ + formError: null, + }); + setPassword(this.state.password, lodashGet(this.props.route, 'params.validateCode', '')); + } + + render() { + return ( + + + + + Enter a password: + this.setState({password: text})} + onSubmitEditing={this.submitForm} + autoFocus + /> + + + {this.state.formError && ( + + {this.state.formError} + + )} + {!_.isEmpty(this.props.account.error) && ( + + {this.props.account.error} + + )} + {this.props.isSmallScreenWidth && ( + + + + )} + + + + + ); + } +} + +SetPasswordPage.propTypes = propTypes; +SetPasswordPage.defaultProps = defaultProps; + +export default compose( + withOnyx({ + credentials: {key: ONYXKEYS.CREDENTIALS}, + account: {key: ONYXKEYS.ACCOUNT}, + }), + withWindowDimensions, +)(SetPasswordPage); diff --git a/src/pages/setpassword/SetPasswordForm.js b/src/pages/setpassword/SetPasswordForm.js deleted file mode 100644 index 7e52004d9c44..000000000000 --- a/src/pages/setpassword/SetPasswordForm.js +++ /dev/null @@ -1,83 +0,0 @@ -import React, {Component} from 'react'; -import lodashGet from 'lodash/get'; -import {Text, TextInput, View} from 'react-native'; -import _ from 'underscore'; -import {withOnyx} from 'react-native-onyx'; -import styles from '../../styles/styles'; -import ButtonWithLoader from '../../components/ButtonWithLoader'; -import {setPassword} from '../../libs/actions/Session'; -import setPasswordPagePropTypes from './setPasswordPagePropTypes'; -import ONYXKEYS from '../../ONYXKEYS'; - -class SetPasswordForm extends Component { - constructor(props) { - super(props); - - this.submitForm = this.submitForm.bind(this); - - this.state = { - password: '', - formError: null, - }; - } - - /** - * Validate the form and then submit it - */ - submitForm() { - if (!this.state.password.trim()) { - this.setState({ - formError: 'Password cannot be blank', - }); - return; - } - - this.setState({ - formError: null, - }); - setPassword(this.state.password, lodashGet(this.props.route, 'params.validateCode', '')); - } - - render() { - return ( - <> - - Enter a password: - this.setState({password: text})} - onSubmitEditing={this.submitForm} - autoFocus - /> - - - {this.state.formError && ( - - {this.state.formError} - - )} - {!_.isEmpty(this.props.account.error) && ( - - {this.props.account.error} - - )} - - ); - } -} - -SetPasswordForm.propTypes = setPasswordPagePropTypes.propTypes; -SetPasswordForm.defaultProps = setPasswordPagePropTypes.defaultProps; - -export default withOnyx({ - credentials: {key: ONYXKEYS.CREDENTIALS}, - account: {key: ONYXKEYS.ACCOUNT}, -})(SetPasswordForm); diff --git a/src/pages/setpassword/SetPasswordPageNarrow.js b/src/pages/setpassword/SetPasswordPageNarrow.js deleted file mode 100644 index 8e43a805147b..000000000000 --- a/src/pages/setpassword/SetPasswordPageNarrow.js +++ /dev/null @@ -1,41 +0,0 @@ -import React from 'react'; -import { - SafeAreaView, - View, - Image, -} from 'react-native'; -import withOnyx from 'react-native-onyx/lib/withOnyx'; -import styles from '../../styles/styles'; -import SignInPageLayout from '../signin/SignInPageLayout'; -import WelcomeText from '../../components/WelcomeText'; -import ONYXKEYS from '../../ONYXKEYS'; -import SetPasswordForm from './SetPasswordForm'; -import welcomeScreenshot from '../../../assets/images/welcome-screenshot-wide.png'; -import setPasswordPagePropTypes from './setPasswordPagePropTypes'; - -const SetPasswordPageNarrow = props => ( - - - - {/* eslint-disable-next-line react/jsx-props-no-spreading */} - - - - - - - - -); - -SetPasswordPageNarrow.propTypes = setPasswordPagePropTypes.propTypes; -SetPasswordPageNarrow.defaultProps = setPasswordPagePropTypes.defaultProps; - -export default withOnyx({ - credentials: {key: ONYXKEYS.CREDENTIALS}, - account: {key: ONYXKEYS.ACCOUNT}, -})(SetPasswordPageNarrow); diff --git a/src/pages/setpassword/SetPasswordPageWide.js b/src/pages/setpassword/SetPasswordPageWide.js deleted file mode 100644 index e0dd5d8c1149..000000000000 --- a/src/pages/setpassword/SetPasswordPageWide.js +++ /dev/null @@ -1,32 +0,0 @@ -import React from 'react'; -import { - SafeAreaView, - View, -} from 'react-native'; -import {withOnyx} from 'react-native-onyx'; -import styles from '../../styles/styles'; -import SignInPageLayout from '../signin/SignInPageLayout'; -import WelcomeText from '../../components/WelcomeText'; -import ONYXKEYS from '../../ONYXKEYS'; -import setPasswordPagePropTypes from './setPasswordPagePropTypes'; -import SetPasswordForm from './SetPasswordForm'; - -const SetPasswordPageWide = props => ( - - - - {/* eslint-disable-next-line react/jsx-props-no-spreading */} - - - - - -); - -SetPasswordPageWide.propTypes = setPasswordPagePropTypes.propTypes; -SetPasswordPageWide.defaultProps = setPasswordPagePropTypes.defaultProps; - -export default withOnyx({ - credentials: {key: ONYXKEYS.CREDENTIALS}, - account: {key: ONYXKEYS.ACCOUNT}, -})(SetPasswordPageWide); diff --git a/src/pages/setpassword/index.js b/src/pages/setpassword/index.js deleted file mode 100644 index 2e39913f60f8..000000000000 --- a/src/pages/setpassword/index.js +++ /dev/null @@ -1,23 +0,0 @@ -import React from 'react'; -import SetPasswordPageWide from './SetPasswordPageWide'; -import SetPasswordPageNarrow from './SetPasswordPageNarrow'; -import withWindowDimensions, {windowDimensionsPropTypes} from '../../components/withWindowDimensions'; -import setPasswordPagePropTypes from './setPasswordPagePropTypes'; - -const propTypes = { - ...windowDimensionsPropTypes, - ...setPasswordPagePropTypes.propTypes, -}; - -const SetPasswordPage = props => ( - !props.isSmallScreenWidth - // eslint-disable-next-line react/jsx-props-no-spreading - ? - // eslint-disable-next-line react/jsx-props-no-spreading - : -); - -SetPasswordPage.propTypes = propTypes; -SetPasswordPage.defaultProps = setPasswordPagePropTypes.defaultProps; - -export default withWindowDimensions(SetPasswordPage); diff --git a/src/pages/setpassword/index.native.js b/src/pages/setpassword/index.native.js deleted file mode 100644 index 099b24104f3c..000000000000 --- a/src/pages/setpassword/index.native.js +++ /dev/null @@ -1,3 +0,0 @@ -import SetPasswordPageNarrow from './SetPasswordPageNarrow'; - -export default SetPasswordPageNarrow; diff --git a/src/pages/setpassword/setPasswordPagePropTypes.js b/src/pages/setpassword/setPasswordPagePropTypes.js deleted file mode 100644 index 9ea2e080fc31..000000000000 --- a/src/pages/setpassword/setPasswordPagePropTypes.js +++ /dev/null @@ -1,38 +0,0 @@ -import PropTypes from 'prop-types'; - -export default { - propTypes: PropTypes.shape({ - /* Onyx Props */ - - // The details about the account that the user is signing in with - account: PropTypes.shape({ - // An error message to display to the user - error: PropTypes.string, - - // Whether or not a sign on form is loading (being submitted) - loading: PropTypes.bool, - }), - - // The credentials of the logged in person - credentials: PropTypes.shape({ - // The email the user logged in with - login: PropTypes.string, - - // The password used to log in the user - password: PropTypes.string, - }), - - route: PropTypes.shape({ - params: PropTypes.shape({ - validateCode: PropTypes.string, - }), - }), - }), - defaultProps: { - account: {}, - credentials: {}, - route: { - params: {}, - }, - }, -}; From 5b48bd07050a8b2e6cda34a53b3db9b174b74661 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Thu, 1 Apr 2021 09:58:53 +0800 Subject: [PATCH 103/380] Refactored back into single components, change SigninPageLayout so it can be used with components that don't have wide/narrow counterparts. --- src/pages/SetPasswordPage.js | 63 ++++++++----------- src/pages/signin/LoginForm/LoginFormNarrow.js | 14 +---- src/pages/signin/PasswordForm.js | 4 +- src/pages/signin/ResendValidationForm.js | 4 +- src/pages/signin/SignInPage.js | 21 +++++-- .../SignInPageLayoutNarrow.js | 17 ++++- .../SignInPageLayout/SignInPageLayoutWide.js | 2 +- src/pages/signin/SignInPageLayout/index.js | 9 +-- 8 files changed, 69 insertions(+), 65 deletions(-) diff --git a/src/pages/SetPasswordPage.js b/src/pages/SetPasswordPage.js index af12df76737f..48261cff6dac 100644 --- a/src/pages/SetPasswordPage.js +++ b/src/pages/SetPasswordPage.js @@ -89,45 +89,34 @@ class SetPasswordPage extends Component { return ( - - - Enter a password: - this.setState({password: text})} - onSubmitEditing={this.submitForm} - autoFocus - /> - - + Enter a password: + this.setState({password: text})} + onSubmitEditing={this.submitForm} + autoFocus /> - {this.state.formError && ( - - {this.state.formError} - - )} - {!_.isEmpty(this.props.account.error) && ( - - {this.props.account.error} - - )} - {this.props.isSmallScreenWidth && ( - - - - )} + + {this.state.formError && ( + + {this.state.formError} + + )} + {!_.isEmpty(this.props.account.error) && ( + + {this.props.account.error} + + )} diff --git a/src/pages/signin/LoginForm/LoginFormNarrow.js b/src/pages/signin/LoginForm/LoginFormNarrow.js index 821dbc0367bb..dd90c85e7fb1 100644 --- a/src/pages/signin/LoginForm/LoginFormNarrow.js +++ b/src/pages/signin/LoginForm/LoginFormNarrow.js @@ -61,7 +61,7 @@ class LoginFormNarrow extends React.Component { render() { return ( - + <> Enter your phone or email: )} - - - - - - - + ); } } diff --git a/src/pages/signin/PasswordForm.js b/src/pages/signin/PasswordForm.js index 8c9b95b9f284..8f2bb3e86d62 100644 --- a/src/pages/signin/PasswordForm.js +++ b/src/pages/signin/PasswordForm.js @@ -64,7 +64,7 @@ class PasswordForm extends React.Component { render() { return ( - + <> Password )} - + ); } } diff --git a/src/pages/signin/ResendValidationForm.js b/src/pages/signin/ResendValidationForm.js index 19ea6c5e41a9..f2763669f518 100644 --- a/src/pages/signin/ResendValidationForm.js +++ b/src/pages/signin/ResendValidationForm.js @@ -57,7 +57,7 @@ class ResendValidationForm extends React.Component { render() { return ( - + <> Please validate your account by clicking on the link we just sent you. @@ -77,7 +77,7 @@ class ResendValidationForm extends React.Component { {this.state.formSuccess} )} - + ); } } diff --git a/src/pages/signin/SignInPage.js b/src/pages/signin/SignInPage.js index bcc0b34157d1..292f59383661 100644 --- a/src/pages/signin/SignInPage.js +++ b/src/pages/signin/SignInPage.js @@ -13,6 +13,8 @@ import LoginForm from './LoginForm'; import PasswordForm from './PasswordForm'; import ResendValidationForm from './ResendValidationForm'; import TermsAndLicenses from './TermsAndLicenses'; +import withWindowDimensions, {windowDimensionsPropTypes} from '../../components/withWindowDimensions'; +import compose from '../../libs/compose'; const propTypes = { /* Onyx Props */ @@ -38,6 +40,8 @@ const propTypes = { // Error to display when there is a session error returned authToken: PropTypes.string, }), + + ...windowDimensionsPropTypes, }; const defaultProps = { @@ -94,7 +98,9 @@ class SignInPage extends Component { )} - + {/* Because the Terms and Licenses need to be placed in different parts of the DOM + to display correctly between wide/narrow screens */} + {!this.props.isSmallScreenWidth && } @@ -105,8 +111,11 @@ class SignInPage extends Component { SignInPage.propTypes = propTypes; SignInPage.defaultProps = defaultProps; -export default withOnyx({ - account: {key: ONYXKEYS.ACCOUNT}, - credentials: {key: ONYXKEYS.CREDENTIALS}, - session: {key: ONYXKEYS.SESSION}, -})(SignInPage); +export default compose( + withOnyx({ + account: {key: ONYXKEYS.ACCOUNT}, + credentials: {key: ONYXKEYS.CREDENTIALS}, + session: {key: ONYXKEYS.SESSION}, + }), + withWindowDimensions, +)(SignInPage); diff --git a/src/pages/signin/SignInPageLayout/SignInPageLayoutNarrow.js b/src/pages/signin/SignInPageLayout/SignInPageLayoutNarrow.js index e3e70ea20b57..725b3d8f4422 100644 --- a/src/pages/signin/SignInPageLayout/SignInPageLayoutNarrow.js +++ b/src/pages/signin/SignInPageLayout/SignInPageLayoutNarrow.js @@ -1,11 +1,15 @@ import React from 'react'; import { + Image, ScrollView, Text, View, } from 'react-native'; import PropTypes from 'prop-types'; import styles from '../../../styles/styles'; import variables from '../../../styles/variables'; import ExpensifyCashLogo from '../../../../assets/images/expensify-cash.svg'; +import welcomeScreenshot from '../../../../assets/images/welcome-screenshot.png'; +import WelcomeText from '../../../components/WelcomeText'; +import TermsAndLicenses from '../TermsAndLicenses'; const propTypes = { // The children to show inside the layout @@ -26,7 +30,18 @@ const SignInPageLayoutNarrow = ({children}) => ( - {children} + + {children} + + + + + + diff --git a/src/pages/signin/SignInPageLayout/SignInPageLayoutWide.js b/src/pages/signin/SignInPageLayout/SignInPageLayoutWide.js index d2bfce6cdb44..0bc4df2f90c4 100644 --- a/src/pages/signin/SignInPageLayout/SignInPageLayoutWide.js +++ b/src/pages/signin/SignInPageLayout/SignInPageLayoutWide.js @@ -7,6 +7,7 @@ import styles from '../../../styles/styles'; import ExpensifyCashLogo from '../../../../assets/images/expensify-cash.svg'; import welcomeScreenshot from '../../../../assets/images/welcome-screenshot-wide.png'; import variables from '../../../styles/variables'; +import TermsAndLicenses from '../TermsAndLicenses'; const propTypes = { // The children to show inside the layout @@ -35,7 +36,6 @@ const SignInPageLayoutWide = ({children}) => ( Expensify.cash - {children} diff --git a/src/pages/signin/SignInPageLayout/index.js b/src/pages/signin/SignInPageLayout/index.js index 41313d9484cf..73b7cadc7d7b 100644 --- a/src/pages/signin/SignInPageLayout/index.js +++ b/src/pages/signin/SignInPageLayout/index.js @@ -2,6 +2,7 @@ import React from 'react'; import SignInPageLayoutNarrow from './SignInPageLayoutNarrow'; import SignInPageLayoutWide from './SignInPageLayoutWide'; import withWindowDimensions, {windowDimensionsPropTypes} from '../../../components/withWindowDimensions'; +import TermsAndLicenses from '../TermsAndLicenses'; const propTypes = { ...windowDimensionsPropTypes, @@ -9,10 +10,10 @@ const propTypes = { const SignInPageLayout = props => ( !props.isSmallScreenWidth - // eslint-disable-next-line react/jsx-props-no-spreading - ? - // eslint-disable-next-line react/jsx-props-no-spreading - : + // eslint-disable-next-line react/jsx-props-no-spreading + ? + // eslint-disable-next-line react/jsx-props-no-spreading + : ); SignInPageLayout.propTypes = propTypes; From 19684a4b8c8edd783e41c761c920457a63753528 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Thu, 1 Apr 2021 10:00:46 +0800 Subject: [PATCH 104/380] Fix indent --- src/pages/signin/SignInPageLayout/index.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pages/signin/SignInPageLayout/index.js b/src/pages/signin/SignInPageLayout/index.js index 73b7cadc7d7b..7ad437090127 100644 --- a/src/pages/signin/SignInPageLayout/index.js +++ b/src/pages/signin/SignInPageLayout/index.js @@ -10,10 +10,10 @@ const propTypes = { const SignInPageLayout = props => ( !props.isSmallScreenWidth - // eslint-disable-next-line react/jsx-props-no-spreading - ? - // eslint-disable-next-line react/jsx-props-no-spreading - : + // eslint-disable-next-line react/jsx-props-no-spreading + ? + // eslint-disable-next-line react/jsx-props-no-spreading + : ); SignInPageLayout.propTypes = propTypes; From c265e20572256318df98b3bed217d8e7909d01f1 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Thu, 1 Apr 2021 10:04:12 +0800 Subject: [PATCH 105/380] Remove duplicate text --- src/pages/SetPasswordPage.js | 1 - src/pages/signin/SignInPageLayout/index.js | 1 - 2 files changed, 2 deletions(-) diff --git a/src/pages/SetPasswordPage.js b/src/pages/SetPasswordPage.js index 48261cff6dac..906cb86ee0b7 100644 --- a/src/pages/SetPasswordPage.js +++ b/src/pages/SetPasswordPage.js @@ -117,7 +117,6 @@ class SetPasswordPage extends Component { {this.props.account.error} )} - ); diff --git a/src/pages/signin/SignInPageLayout/index.js b/src/pages/signin/SignInPageLayout/index.js index 7ad437090127..41313d9484cf 100644 --- a/src/pages/signin/SignInPageLayout/index.js +++ b/src/pages/signin/SignInPageLayout/index.js @@ -2,7 +2,6 @@ import React from 'react'; import SignInPageLayoutNarrow from './SignInPageLayoutNarrow'; import SignInPageLayoutWide from './SignInPageLayoutWide'; import withWindowDimensions, {windowDimensionsPropTypes} from '../../../components/withWindowDimensions'; -import TermsAndLicenses from '../TermsAndLicenses'; const propTypes = { ...windowDimensionsPropTypes, From 772c92aed69b76eb2803944bdcad7e91333e66a1 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Thu, 1 Apr 2021 11:23:17 +0800 Subject: [PATCH 106/380] Refactor SigninPageLayout to be used with single component forms (without Wide/Narrow counterparts) --- src/components/WelcomeText.js | 26 ------ src/pages/SetPasswordPage.js | 91 +++++++++---------- src/pages/signin/LoginForm/LoginFormNarrow.js | 2 - src/pages/signin/LoginForm/LoginFormWide.js | 12 ++- .../SignInPageLayoutNarrow.js | 12 ++- .../SignInPageLayout/SignInPageLayoutWide.js | 1 - 6 files changed, 65 insertions(+), 79 deletions(-) delete mode 100644 src/components/WelcomeText.js diff --git a/src/components/WelcomeText.js b/src/components/WelcomeText.js deleted file mode 100644 index e41550d86c16..000000000000 --- a/src/components/WelcomeText.js +++ /dev/null @@ -1,26 +0,0 @@ -import React from 'react'; -import {Text, View} from 'react-native'; -import styles from '../styles/styles'; -import withWindowDimensions, {windowDimensionsPropTypes} from './withWindowDimensions'; - -const propTypes = { - ...windowDimensionsPropTypes, -}; - -const WelcomeText = props => ( - - - With Expensify.cash, chat and payments are the same thing. - - - Money talks. And now that chat and payments are in one place, it's also easy. - {' '} - Your payments get to you as fast as you can get your point across. - - -); - -WelcomeText.propTypes = propTypes; -WelcomeText.displayName = 'WelcomeText'; - -export default withWindowDimensions(WelcomeText); diff --git a/src/pages/SetPasswordPage.js b/src/pages/SetPasswordPage.js index 906cb86ee0b7..3f15d1f17a03 100644 --- a/src/pages/SetPasswordPage.js +++ b/src/pages/SetPasswordPage.js @@ -1,24 +1,20 @@ import React, {Component} from 'react'; import { - Image, SafeAreaView, Text, TextInput, View, } from 'react-native'; import PropTypes from 'prop-types'; -import lodashGet from 'lodash/get'; import {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; +import lodashGet from 'lodash/get'; import styles from '../styles/styles'; -import SignInPageLayout from './signin/SignInPageLayout'; -import welcomeScreenshot from '../../assets/images/welcome-screenshot.png'; -import withWindowDimensions, {windowDimensionsPropTypes} from '../components/withWindowDimensions'; -import WelcomeText from '../components/WelcomeText'; -import ONYXKEYS from '../ONYXKEYS'; +import ExpensifyCashLogo from '../../assets/images/expensify-cash.svg'; import {setPassword} from '../libs/actions/Session'; +import ONYXKEYS from '../ONYXKEYS'; +import variables from '../styles/variables'; import ButtonWithLoader from '../components/ButtonWithLoader'; -import compose from '../libs/compose'; const propTypes = { /* Onyx Props */ @@ -46,7 +42,6 @@ const propTypes = { validateCode: PropTypes.string, }), }), - ...windowDimensionsPropTypes, }; const defaultProps = { account: {}, @@ -87,38 +82,45 @@ class SetPasswordPage extends Component { render() { return ( - - - - Enter a password: - this.setState({password: text})} - onSubmitEditing={this.submitForm} - autoFocus + <> + + + + + + + Enter a password + this.setState({password: text})} + onSubmitEditing={this.submitForm} + /> + + + {this.state.formError && ( + + {this.state.formError} + + )} + {!_.isEmpty(this.props.account.error) && ( + + {this.props.account.error} + + )} - - {this.state.formError && ( - - {this.state.formError} - - )} - {!_.isEmpty(this.props.account.error) && ( - - {this.props.account.error} - - )} - - + + ); } } @@ -126,10 +128,7 @@ class SetPasswordPage extends Component { SetPasswordPage.propTypes = propTypes; SetPasswordPage.defaultProps = defaultProps; -export default compose( - withOnyx({ - credentials: {key: ONYXKEYS.CREDENTIALS}, - account: {key: ONYXKEYS.ACCOUNT}, - }), - withWindowDimensions, -)(SetPasswordPage); +export default withOnyx({ + credentials: {key: ONYXKEYS.CREDENTIALS}, + account: {key: ONYXKEYS.ACCOUNT}, +})(SetPasswordPage); diff --git a/src/pages/signin/LoginForm/LoginFormNarrow.js b/src/pages/signin/LoginForm/LoginFormNarrow.js index dd90c85e7fb1..81277f4e2250 100644 --- a/src/pages/signin/LoginForm/LoginFormNarrow.js +++ b/src/pages/signin/LoginForm/LoginFormNarrow.js @@ -9,9 +9,7 @@ import styles from '../../../styles/styles'; import themeColors from '../../../styles/themes/default'; import ButtonWithLoader from '../../../components/ButtonWithLoader'; import {fetchAccountDetails} from '../../../libs/actions/Session'; -import welcomeScreenshot from '../../../../assets/images/welcome-screenshot.png'; import ONYXKEYS from '../../../ONYXKEYS'; -import WelcomeText from '../../../components/WelcomeText'; const propTypes = { /* Onyx Props */ diff --git a/src/pages/signin/LoginForm/LoginFormWide.js b/src/pages/signin/LoginForm/LoginFormWide.js index 90620568e6ea..80ccf556a869 100644 --- a/src/pages/signin/LoginForm/LoginFormWide.js +++ b/src/pages/signin/LoginForm/LoginFormWide.js @@ -7,7 +7,6 @@ import {fetchAccountDetails} from '../../../libs/actions/Session'; import styles from '../../../styles/styles'; import ButtonWithLoader from '../../../components/ButtonWithLoader'; import ONYXKEYS from '../../../ONYXKEYS'; -import WelcomeText from '../../../components/WelcomeText'; const propTypes = { /* Onyx Props */ @@ -93,7 +92,16 @@ class LoginFormWide extends React.Component { )} - + + + With Expensify.cash, chat and payments are the same thing. + + + Money talks. And now that chat and payments are in one place, it's also easy. + {' '} + Your payments get to you as fast as you can get your point across. + + ); } diff --git a/src/pages/signin/SignInPageLayout/SignInPageLayoutNarrow.js b/src/pages/signin/SignInPageLayout/SignInPageLayoutNarrow.js index 725b3d8f4422..55397edbdff7 100644 --- a/src/pages/signin/SignInPageLayout/SignInPageLayoutNarrow.js +++ b/src/pages/signin/SignInPageLayout/SignInPageLayoutNarrow.js @@ -8,7 +8,6 @@ import styles from '../../../styles/styles'; import variables from '../../../styles/variables'; import ExpensifyCashLogo from '../../../../assets/images/expensify-cash.svg'; import welcomeScreenshot from '../../../../assets/images/welcome-screenshot.png'; -import WelcomeText from '../../../components/WelcomeText'; import TermsAndLicenses from '../TermsAndLicenses'; const propTypes = { @@ -39,7 +38,16 @@ const SignInPageLayoutNarrow = ({children}) => ( source={welcomeScreenshot} /> - + + + With Expensify.cash, chat and payments are the same thing. + + + Money talks. And now that chat and payments are in one place, it's also easy. + {' '} + Your payments get to you as fast as you can get your point across. + + diff --git a/src/pages/signin/SignInPageLayout/SignInPageLayoutWide.js b/src/pages/signin/SignInPageLayout/SignInPageLayoutWide.js index 0bc4df2f90c4..76195c23cb6d 100644 --- a/src/pages/signin/SignInPageLayout/SignInPageLayoutWide.js +++ b/src/pages/signin/SignInPageLayout/SignInPageLayoutWide.js @@ -7,7 +7,6 @@ import styles from '../../../styles/styles'; import ExpensifyCashLogo from '../../../../assets/images/expensify-cash.svg'; import welcomeScreenshot from '../../../../assets/images/welcome-screenshot-wide.png'; import variables from '../../../styles/variables'; -import TermsAndLicenses from '../TermsAndLicenses'; const propTypes = { // The children to show inside the layout From 4a33ff887e15b40727b8d5d070eaa3e4435cbec3 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Thu, 1 Apr 2021 11:29:40 +0800 Subject: [PATCH 107/380] Revert changes unrelated to PR --- src/pages/signin/LoginForm/LoginFormWide.js | 21 +-- src/styles/styles.js | 143 ++++++++++++++++---- 2 files changed, 125 insertions(+), 39 deletions(-) diff --git a/src/pages/signin/LoginForm/LoginFormWide.js b/src/pages/signin/LoginForm/LoginFormWide.js index 80ccf556a869..070c77c5c1b9 100644 --- a/src/pages/signin/LoginForm/LoginFormWide.js +++ b/src/pages/signin/LoginForm/LoginFormWide.js @@ -92,15 +92,18 @@ class LoginFormWide extends React.Component { )} - - - With Expensify.cash, chat and payments are the same thing. - - - Money talks. And now that chat and payments are in one place, it's also easy. - {' '} - Your payments get to you as fast as you can get your point across. - + + + + + With Expensify.cash, chat and payments are the same thing. + + + Money talks. And now that chat and payments are in one place, it's also easy. + {' '} + Your payments get to you as fast as you can get your point across. + + ); diff --git a/src/styles/styles.js b/src/styles/styles.js index 13e1a3c3c402..4962d9edeaa3 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -225,34 +225,26 @@ const styles = { }, }, - pill: { + badge: { + backgroundColor: themeColors.badgeDefaultBG, borderRadius: 14, - backgroundColor: themeColors.pillBG, - height: variables.componentSizeSmall, + height: variables.iconSizeNormal, flexDirection: 'row', - paddingTop: 6, - paddingBottom: 6, - paddingLeft: 7, - paddingRight: 7, + paddingHorizontal: 7, alignItems: 'center', }, - pillText: { - color: themeColors.text, - weight: '400', + badgeSuccess: { + backgroundColor: themeColors.badgeSuccessBG, + }, + + badgeText: { + color: themeColors.textReversed, fontSize: variables.fontSizeSmall, lineHeight: 16, - marginRight: 4, - userSelect: 'none', - maxWidth: 144, ...whiteSpace.noWrap, }, - pillCancelIcon: { - width: 12, - height: 12, - }, - headerText: { color: themeColors.heading, fontFamily: fontFamily.GTA_BOLD, @@ -349,7 +341,6 @@ const styles = { backgroundColor: themeColors.sidebar, padding: 20, minHeight: '100%', - flex: 1, }, signInPageLogo: { @@ -536,14 +527,20 @@ const styles = { sidebarLinkInner: { alignItems: 'center', flexDirection: 'row', + paddingLeft: 20, + paddingRight: 20, }, sidebarInnerRow: { height: 64, paddingTop: 12, - paddingRight: 20, paddingBottom: 12, - paddingLeft: 20, + }, + + sidebarInnerRowSmall: { + height: 52, + paddingTop: 12, + paddingBottom: 12, }, sidebarLinkText: { @@ -586,6 +583,13 @@ const styles = { ...whiteSpace.noWrap, }, + optionDisplayNameCompact: { + minWidth: 'auto', + flexBasis: 'auto', + flexGrow: 0, + flexShrink: 0, + }, + optionDisplayNameTooltipWrapper: { position: 'relative', }, @@ -605,6 +609,12 @@ const styles = { lineHeight: 16, }, + optionAlternateTextCompact: { + flexShrink: 1, + flexGrow: 1, + flexBasis: 'auto', + }, + // App Content Wrapper styles appContentWrapper: { backgroundColor: themeColors.appBG, @@ -838,12 +848,29 @@ const styles = { borderRadius: 24, }, + singleAvatarSmall: { + height: 18, + width: 18, + backgroundColor: themeColors.icon, + borderRadius: 18, + }, + secondAvatar: { + position: 'absolute', + right: -18, + bottom: -18, + borderWidth: 3, + borderRadius: 30, + borderColor: 'transparent', + }, + + secondAvatarSmall: { position: 'absolute', right: -13, - bottom: -14, + bottom: -13, + borderWidth: 3, + borderRadius: 18, borderColor: 'transparent', - borderWidth: 2, }, avatarNormal: { @@ -853,11 +880,11 @@ const styles = { borderRadius: variables.componentSizeNormal, }, - avatarText: { + avatarSmall: { + height: variables.avatarSizeSmall, + width: variables.avatarSizeSmall, backgroundColor: themeColors.icon, - borderRadius: 24, - height: 24, - width: 24, + borderRadius: variables.avatarSizeSmall, }, avatarInnerText: { @@ -868,6 +895,14 @@ const styles = { textAlign: 'center', }, + avatarInnerTextSmall: { + color: themeColors.textReversed, + fontSize: variables.fontSizeExtraSmall, + lineHeight: 18, + marginLeft: -2, + textAlign: 'center', + }, + avatarSpace: { top: 3, left: 3, @@ -875,16 +910,24 @@ const styles = { avatar: { backgroundColor: themeColors.sidebar, + borderColor: themeColors.sidebar, }, focusedAvatar: { - backgroundColor: themeColors.border, + backgroundColor: themeColors.pillBG, + borderColor: themeColors.pillBG, }, emptyAvatar: { marginRight: variables.componentSizeNormal - 24, - height: 40, - width: 40, + height: variables.avatarSizeNormal, + width: variables.avatarSizeNormal, + }, + + emptyAvatarSmall: { + marginRight: variables.componentSizeNormal - 28, + height: variables.avatarSizeSmall, + width: variables.avatarSizeSmall, }, modalViewContainer: { @@ -906,6 +949,13 @@ const styles = { width: '100%', }, + imageViewContainer: { + width: '100%', + height: '100%', + alignItems: 'center', + justifyContent: 'center', + }, + imageModalPDF: { flex: 1, backgroundColor: themeColors.modalBackground, @@ -1113,6 +1163,7 @@ const styles = { navigationScreenCardStyle: { backgroundColor: themeColors.appBG, + height: '100%', }, invisible: { @@ -1186,6 +1237,10 @@ const styles = { fontWeight: fontWeightBold, fontSize: variables.iouAmountTextSize, }, 0), + + noScrollbars: { + scrollbarWidth: 'none', + }, }; const baseCodeTagStyles = { @@ -1323,6 +1378,32 @@ function getNavigationModalCardStyle(isSmallScreenWidth) { }; } +/** + * @param {Boolean} isZoomed + * @param {Boolean} isDragging + * @return {Object} + */ +function getZoomCursorStyle(isZoomed, isDragging) { + if (!isZoomed) { + return {cursor: 'zoom-in'}; + } + + return { + cursor: isDragging ? 'grabbing' : 'zoom-out', + }; +} + +/** + * @param {Boolean} isZoomed + * @return {Object} + */ +function getZoomSizingStyle(isZoomed) { + return { + height: isZoomed ? '250%' : '100%', + width: isZoomed ? '250%' : '100%', + }; +} + export default styles; export { getSafeAreaPadding, @@ -1331,4 +1412,6 @@ export { getNavigationDrawerStyle, getNavigationDrawerType, getNavigationModalCardStyle, + getZoomCursorStyle, + getZoomSizingStyle, }; From 02888dc7218e5c474e1d25d7bdac1d62c919abe6 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Thu, 1 Apr 2021 11:30:22 +0800 Subject: [PATCH 108/380] Revert changes unrelated to PR --- src/pages/SetPasswordPage.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/SetPasswordPage.js b/src/pages/SetPasswordPage.js index 3f15d1f17a03..79679dca6141 100644 --- a/src/pages/SetPasswordPage.js +++ b/src/pages/SetPasswordPage.js @@ -43,6 +43,7 @@ const propTypes = { }), }), }; + const defaultProps = { account: {}, credentials: {}, From 7770bd3a1ddde871628670938c236ea1a10973c3 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Thu, 1 Apr 2021 14:25:59 +0800 Subject: [PATCH 109/380] Refactor SignInPageLayout --- src/pages/signin/LoginForm/LoginFormNarrow.js | 4 +- src/pages/signin/LoginForm/LoginFormWide.js | 13 ---- src/pages/signin/SignInPage.js | 10 ++- .../SignInPageLayoutNarrow.js | 61 +++++++++++++------ .../SignInPageLayout/SignInPageLayoutWide.js | 32 +++++++++- 5 files changed, 79 insertions(+), 41 deletions(-) diff --git a/src/pages/signin/LoginForm/LoginFormNarrow.js b/src/pages/signin/LoginForm/LoginFormNarrow.js index 81277f4e2250..58df13f81dd4 100644 --- a/src/pages/signin/LoginForm/LoginFormNarrow.js +++ b/src/pages/signin/LoginForm/LoginFormNarrow.js @@ -1,6 +1,8 @@ import React from 'react'; import { - Image, Text, TextInput, View, + Text, + TextInput, + View, } from 'react-native'; import {withOnyx} from 'react-native-onyx'; import PropTypes from 'prop-types'; diff --git a/src/pages/signin/LoginForm/LoginFormWide.js b/src/pages/signin/LoginForm/LoginFormWide.js index 070c77c5c1b9..58dc6d2fc69a 100644 --- a/src/pages/signin/LoginForm/LoginFormWide.js +++ b/src/pages/signin/LoginForm/LoginFormWide.js @@ -92,19 +92,6 @@ class LoginFormWide extends React.Component { )} - - - - - With Expensify.cash, chat and payments are the same thing. - - - Money talks. And now that chat and payments are in one place, it's also easy. - {' '} - Your payments get to you as fast as you can get your point across. - - - ); } diff --git a/src/pages/signin/SignInPage.js b/src/pages/signin/SignInPage.js index 292f59383661..a3d74274898c 100644 --- a/src/pages/signin/SignInPage.js +++ b/src/pages/signin/SignInPage.js @@ -12,7 +12,6 @@ import SignInPageLayout from './SignInPageLayout'; import LoginForm from './LoginForm'; import PasswordForm from './PasswordForm'; import ResendValidationForm from './ResendValidationForm'; -import TermsAndLicenses from './TermsAndLicenses'; import withWindowDimensions, {windowDimensionsPropTypes} from '../../components/withWindowDimensions'; import compose from '../../libs/compose'; @@ -80,7 +79,10 @@ class SignInPage extends Component { return ( <> - + {showLoginForm && } {showPasswordForm && } @@ -97,10 +99,6 @@ class SignInPage extends Component { )} )} - - {/* Because the Terms and Licenses need to be placed in different parts of the DOM - to display correctly between wide/narrow screens */} - {!this.props.isSmallScreenWidth && } diff --git a/src/pages/signin/SignInPageLayout/SignInPageLayoutNarrow.js b/src/pages/signin/SignInPageLayout/SignInPageLayoutNarrow.js index 55397edbdff7..dac6b6e3f72d 100644 --- a/src/pages/signin/SignInPageLayout/SignInPageLayoutNarrow.js +++ b/src/pages/signin/SignInPageLayout/SignInPageLayoutNarrow.js @@ -9,13 +9,26 @@ import variables from '../../../styles/variables'; import ExpensifyCashLogo from '../../../../assets/images/expensify-cash.svg'; import welcomeScreenshot from '../../../../assets/images/welcome-screenshot.png'; import TermsAndLicenses from '../TermsAndLicenses'; +import {windowDimensionsPropTypes} from '../../../components/withWindowDimensions'; const propTypes = { + + ...windowDimensionsPropTypes, + // The children to show inside the layout children: PropTypes.node.isRequired, + + // Whether we should show the welcome elements + showWelcomeText: PropTypes.Boolean, + showWelcomeScreenshot: PropTypes.Boolean, +}; + +const defaultProps = { + showWelcomeText: true, + showWelcomeScreenshot: true, }; -const SignInPageLayoutNarrow = ({children}) => ( +const SignInPageLayoutNarrow = props => ( @@ -30,24 +43,33 @@ const SignInPageLayoutNarrow = ({children}) => ( - {children} - - - - - - With Expensify.cash, chat and payments are the same thing. - - - Money talks. And now that chat and payments are in one place, it's also easy. - {' '} - Your payments get to you as fast as you can get your point across. - - + {props.children} + + {props.showWelcomeScreenshot + && ( + + + + )} + + {props.showWelcomeText + && ( + + + With Expensify.cash, chat and payments are the same thing. + + + Money talks. And now that chat and payments are in one place, it's also easy. + {' '} + Your payments get to you as fast as you can get your point across. + + + )} + @@ -56,6 +78,7 @@ const SignInPageLayoutNarrow = ({children}) => ( ); SignInPageLayoutNarrow.propTypes = propTypes; +SignInPageLayoutNarrow.defaultProps = defaultProps; SignInPageLayoutNarrow.displayName = 'SignInPageLayoutNarrow'; diff --git a/src/pages/signin/SignInPageLayout/SignInPageLayoutWide.js b/src/pages/signin/SignInPageLayout/SignInPageLayoutWide.js index 76195c23cb6d..b58ec78b6245 100644 --- a/src/pages/signin/SignInPageLayout/SignInPageLayoutWide.js +++ b/src/pages/signin/SignInPageLayout/SignInPageLayoutWide.js @@ -7,13 +7,22 @@ import styles from '../../../styles/styles'; import ExpensifyCashLogo from '../../../../assets/images/expensify-cash.svg'; import welcomeScreenshot from '../../../../assets/images/welcome-screenshot-wide.png'; import variables from '../../../styles/variables'; +import TermsAndLicenses from '../TermsAndLicenses'; const propTypes = { // The children to show inside the layout children: PropTypes.node.isRequired, + + // Whether we should show the welcome elements + // (the welcome screenshot always displays on wide views) + showWelcomeText: PropTypes.Boolean, +}; + +const defaultProps = { + showWelcomeText: true, }; -const SignInPageLayoutWide = ({children}) => ( +const SignInPageLayoutWide = props => ( @@ -35,13 +44,32 @@ const SignInPageLayoutWide = ({children}) => ( Expensify.cash - {children} + + {props.children} + + {props.showWelcomeText + && ( + + + + With Expensify.cash, chat and payments are the same thing. + + + Money talks. And now that chat and payments are in one place, it's also easy. + {' '} + Your payments get to you as fast as you can get your point across. + + + + )} + ); SignInPageLayoutWide.propTypes = propTypes; +SignInPageLayoutWide.defaultProps = defaultProps; SignInPageLayoutWide.displayName = 'SignInPageLayoutWide'; From 4e25b8feae75825bddbce112d6565757d1fdb63d Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Thu, 1 Apr 2021 11:40:52 -0600 Subject: [PATCH 110/380] Remove auto-focus --- src/pages/home/report/EmojiPickerMenu.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index afa119591fa7..5bd24f53844d 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -46,14 +46,6 @@ class EmojiPickerMenu extends Component { }; } - componentDidMount() { - if (this.props.isVisible) { - this.searchInput.onkeypress = (e) => { - debugger; - }; - } - } - /** * Filter the entire list of emojis to only emojis that have the search term in their keywords * From 388d42477d5144ed82b3ff6c24c07c83a6a6552e Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Thu, 1 Apr 2021 11:41:10 -0600 Subject: [PATCH 111/380] Remove unused prop --- src/pages/home/report/ReportActionCompose.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index c5d757a9ff04..af79f033f915 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -332,7 +332,6 @@ class ReportActionCompose extends React.Component { Date: Thu, 1 Apr 2021 11:49:52 -0600 Subject: [PATCH 112/380] Remove unused prop --- src/pages/home/report/EmojiPickerMenu.js | 3 --- src/pages/home/report/ReportActionCompose.js | 1 - 2 files changed, 4 deletions(-) diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu.js index 5bd24f53844d..2e99d4104fb8 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu.js @@ -10,9 +10,6 @@ import EmojiPickerMenuItem from './EmojiPickerMenuItem'; import TextInputFocusable from '../../../components/TextInputFocusable'; const propTypes = { - // Is the picker currently visible? - isVisible: PropTypes.bool.isRequired, - // Function to add the selected emoji to the main compose text input onEmojiSelected: PropTypes.func.isRequired, }; diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index af79f033f915..4b4948189cd0 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -341,7 +341,6 @@ class ReportActionCompose extends React.Component { }} > From cdc67f2a00c729a65fe4a40aa8109931685a47c8 Mon Sep 17 00:00:00 2001 From: tugbadogan Date: Thu, 1 Apr 2021 20:58:29 +0100 Subject: [PATCH 113/380] Refactor IOUAmountPage --- src/components/TextInputAutoGrow.js | 66 ++++++++++++++++ src/components/TextInputFocusable/index.js | 20 ++++- src/pages/iou/IOUModal.js | 39 ++-------- src/pages/iou/steps/IOUAmountPage.js | 91 +++++++++++++--------- 4 files changed, 143 insertions(+), 73 deletions(-) create mode 100644 src/components/TextInputAutoGrow.js diff --git a/src/components/TextInputAutoGrow.js b/src/components/TextInputAutoGrow.js new file mode 100644 index 000000000000..03d5691dd173 --- /dev/null +++ b/src/components/TextInputAutoGrow.js @@ -0,0 +1,66 @@ +import React from 'react'; +import {View, Text} from 'react-native'; +import PropTypes from 'prop-types'; +import _ from 'underscore'; +import styles from '../styles/styles'; +import TextInputFocusable from './TextInputFocusable'; + +const propTypes = { + + // The value of the comment box + value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + + // A ref to forward to the text input + forwardedRef: PropTypes.func.isRequired, + + // General styles to apply to the text input + // eslint-disable-next-line react/forbid-prop-types + style: PropTypes.any, + + // Styles to apply to the text input + // eslint-disable-next-line react/forbid-prop-types + textStyle: PropTypes.any.isRequired, +}; + +const defaultProps = { + value: undefined, + style: null, +}; + +class TextInputAutoGrow extends React.Component { + constructor(props) { + super(props); + + this.state = { + textInputWidth: 0, + }; + } + + render() { + const propsWithoutStyles = _.omit(this.props, ['style', 'textStyle']); + return ( + + + this.setState({textInputWidth: e.nativeEvent.layout.width})} + > + {this.props.value} + + + ); + } +} + +TextInputAutoGrow.propTypes = propTypes; +TextInputAutoGrow.defaultProps = defaultProps; + +export default React.forwardRef((props, ref) => ( + /* eslint-disable-next-line react/jsx-props-no-spreading */ + +)); diff --git a/src/components/TextInputFocusable/index.js b/src/components/TextInputFocusable/index.js index bef213b31d27..998ab162c2c7 100644 --- a/src/components/TextInputFocusable/index.js +++ b/src/components/TextInputFocusable/index.js @@ -8,7 +8,10 @@ const propTypes = { maxLines: PropTypes.number, // The default value of the comment box - defaultValue: PropTypes.string.isRequired, + defaultValue: PropTypes.string, + + // The value of the comment box + value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), // Callback method to handle pasting a file onPasteFile: PropTypes.func, @@ -40,6 +43,8 @@ const propTypes = { }; const defaultProps = { + defaultValue: undefined, + value: undefined, maxLines: -1, onPasteFile: () => {}, shouldClear: false, @@ -71,8 +76,12 @@ class TextInputFocusable extends React.Component { this.state = { numberOfLines: 1, selection: { - start: this.props.defaultValue.length, - end: this.props.defaultValue.length, + start: this.props.defaultValue + ? `${this.props.defaultValue}`.length + : `${this.props.value}`.length, + end: this.props.defaultValue + ? `${this.props.defaultValue}`.length + : `${this.props.value}`.length, }, }; } @@ -206,6 +215,9 @@ class TextInputFocusable extends React.Component { const propStyles = StyleSheet.flatten(this.props.style); propStyles.outline = 'none'; const propsWithoutStyles = _.omit(this.props, 'style'); + const propsWithoutValueOrDefaultValue = this.props.defaultValue + ? _.omit(propsWithoutStyles, 'value') + : _.omit(propsWithoutStyles, 'defaultValue'); return ( this.textInput = el} @@ -216,7 +228,7 @@ class TextInputFocusable extends React.Component { numberOfLines={this.state.numberOfLines} style={propStyles} /* eslint-disable-next-line react/jsx-props-no-spreading */ - {...propsWithoutStyles} + {...propsWithoutValueOrDefaultValue} disabled={this.props.isDisabled} /> ); diff --git a/src/pages/iou/IOUModal.js b/src/pages/iou/IOUModal.js index 593addfda470..6fcd86700d4e 100644 --- a/src/pages/iou/IOUModal.js +++ b/src/pages/iou/IOUModal.js @@ -39,16 +39,14 @@ class IOUModal extends Component { this.navigateToPreviousStep = this.navigateToPreviousStep.bind(this); this.navigateToNextStep = this.navigateToNextStep.bind(this); - this.updateAmount = this.updateAmount.bind(this); this.currencySelected = this.currencySelected.bind(this); - this.addParticipants = this.addParticipants.bind(this); + this.state = { currentStepIndex: 0, participants: [], amount: '', selectedCurrency: 'USD', - isAmountPageNextButtonDisabled: true, }; } @@ -102,33 +100,6 @@ class IOUModal extends Component { }); } - /** - * Update amount with number or Backspace pressed. - * Validate new amount with decimal number regex up to 6 digits and 2 decimal digit - * - * @param {String} buttonPressed - */ - updateAmount(buttonPressed) { - // Backspace button is pressed - if (buttonPressed === '<' || buttonPressed === 'Backspace') { - if (this.state.amount.length > 0) { - this.setState(prevState => ({ - amount: prevState.amount.substring(0, prevState.amount.length - 1), - isAmountPageNextButtonDisabled: prevState.amount.length === 1, - })); - } - } else { - const decimalNumberRegex = new RegExp(/^\d{1,6}(\.\d{0,2})?$/, 'i'); - const amount = this.state.amount + buttonPressed; - if (decimalNumberRegex.test(amount)) { - this.setState({ - amount, - isAmountPageNextButtonDisabled: false, - }); - } - } - } - /** * Update the currency state * @@ -174,12 +145,12 @@ class IOUModal extends Component { {currentStep === Steps.IOUAmount && ( { + this.setState({amount}); + this.navigateToNextStep(); + }} currencySelected={this.currencySelected} - amount={this.state.amount} selectedCurrency={this.state.selectedCurrency} - isNextButtonDisabled={this.state.isAmountPageNextButtonDisabled} /> )} {currentStep === Steps.IOUParticipants && ( diff --git a/src/pages/iou/steps/IOUAmountPage.js b/src/pages/iou/steps/IOUAmountPage.js index 4d0c2e99d67e..e6dc9ebe436f 100644 --- a/src/pages/iou/steps/IOUAmountPage.js +++ b/src/pages/iou/steps/IOUAmountPage.js @@ -12,15 +12,12 @@ import styles from '../../../styles/styles'; import themeColors from '../../../styles/themes/default'; import BigNumberPad from '../../../components/BigNumberPad'; import withWindowDimensions, {windowDimensionsPropTypes} from '../../../components/withWindowDimensions'; -import TextInputFocusable from '../../../components/TextInputFocusable'; +import TextInputAutoGrow from '../../../components/TextInputAutoGrow'; const propTypes = { // Callback to inform parent modal of success onStepComplete: PropTypes.func.isRequired, - // Callback to inform parent modal with key pressed - numberPressed: PropTypes.func.isRequired, - // Currency selection will be implemented later // eslint-disable-next-line react/no-unused-prop-types currencySelected: PropTypes.func.isRequired, @@ -28,12 +25,6 @@ const propTypes = { // User's currency preference selectedCurrency: PropTypes.string.isRequired, - // Amount value entered by user - amount: PropTypes.string.isRequired, - - // To disable/enable Next button based on amount validity - isNextButtonDisabled: PropTypes.bool.isRequired, - /* Window Dimensions Props */ ...windowDimensionsPropTypes, @@ -54,8 +45,10 @@ class IOUAmountPage extends React.Component { constructor(props) { super(props); + this.onlyAllowNumericValues = this.onlyAllowNumericValues.bind(this); this.state = { - textInputWidth: 0, + amount: '', + isNextButtonEnabled: false, }; } @@ -65,6 +58,45 @@ class IOUAmountPage extends React.Component { } } + /** + * Update amount with number or Backspace pressed. + * Validate new amount with decimal number regex up to 6 digits and 2 decimal digit to enable Next button + * + * @param {String} key + * @param {String} event + */ + onlyAllowNumericValues(key, event) { + // Prevent reusing synthetic event object, so we can call preventDefault() later. + if (event) { + event.persist(); + } + + // Backspace button is pressed + if (key === '<' || key === 'Backspace') { + if (this.state.amount.length > 0) { + this.setState(prevState => ({ + amount: prevState.amount.substring(0, prevState.amount.length - 1), + isNextButtonEnabled: prevState.amount.length !== 1, + })); + } + return; + } + this.setState((prevState) => { + const newValue = `${prevState.amount}${key}`; + const decimalNumberRegex = new RegExp(/^\d{1,6}(\.\d{0,2})?$/, 'i'); + if (!decimalNumberRegex.test(newValue)) { + if (event) { + event.preventDefault(); + } + return prevState; + } + return { + amount: newValue, + isNextButtonEnabled: true, + }; + }); + } + render() { return ( @@ -81,38 +113,27 @@ class IOUAmountPage extends React.Component { {this.props.selectedCurrency} {this.props.isSmallScreenWidth - ? {this.props.amount} + ? {this.state.amount} : ( - - { - this.props.numberPressed(event.key); - event.preventDefault(); - }} - ref={el => this.textInput = el} - defaultValue={this.props.amount} - textAlign="left" - /> - this.setState({textInputWidth: e.nativeEvent.layout.width})} - > - {this.props.amount} - - + this.onlyAllowNumericValues(event.key, event)} + ref={el => this.textInput = el} + value={this.state.amount} + textAlign="left" + /> )} {this.props.isSmallScreenWidth - ? + ? : } this.props.onStepComplete(this.state.amount)} + disabled={!this.state.isNextButtonEnabled} > Next From 37deb3ee675948045c0a616633add038f795c656 Mon Sep 17 00:00:00 2001 From: tugbadogan Date: Thu, 1 Apr 2021 21:21:25 +0100 Subject: [PATCH 114/380] Move style object to styles --- src/components/TextInputAutoGrow.js | 5 +++-- src/styles/styles.js | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/components/TextInputAutoGrow.js b/src/components/TextInputAutoGrow.js index 03d5691dd173..994f2c219f04 100644 --- a/src/components/TextInputAutoGrow.js +++ b/src/components/TextInputAutoGrow.js @@ -38,16 +38,17 @@ class TextInputAutoGrow extends React.Component { render() { const propsWithoutStyles = _.omit(this.props, ['style', 'textStyle']); + const widthStyle = {width: Math.max(5, this.state.textInputWidth)}; return ( this.setState({textInputWidth: e.nativeEvent.layout.width})} > {this.props.value} diff --git a/src/styles/styles.js b/src/styles/styles.js index 9ef88778a851..c1aea688b9d7 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -1239,6 +1239,14 @@ const styles = { fontSize: variables.iouAmountTextSize, }, 0), + autoGrowTextInputHiddenText: { + position: 'absolute', + opacity: 0, + + // Using a very large value here makes sure it's out of screen + left: 100000, + }, + noScrollbars: { scrollbarWidth: 'none', }, From f0b0bf7e9f298dcbd781750dfa00867463cd8078 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Fri, 2 Apr 2021 10:52:17 +0800 Subject: [PATCH 115/380] Refactor LoginForm into a single component --- .../LoginFormNarrow.js => LoginForm.js} | 19 ++-- src/pages/signin/LoginForm/LoginFormWide.js | 105 ------------------ src/pages/signin/LoginForm/index.js | 19 ---- src/pages/signin/LoginForm/index.native.js | 3 - src/pages/signin/SignInPageLayout/index.js | 4 +- 5 files changed, 12 insertions(+), 138 deletions(-) rename src/pages/signin/{LoginForm/LoginFormNarrow.js => LoginForm.js} (86%) delete mode 100644 src/pages/signin/LoginForm/LoginFormWide.js delete mode 100644 src/pages/signin/LoginForm/index.js delete mode 100644 src/pages/signin/LoginForm/index.native.js diff --git a/src/pages/signin/LoginForm/LoginFormNarrow.js b/src/pages/signin/LoginForm.js similarity index 86% rename from src/pages/signin/LoginForm/LoginFormNarrow.js rename to src/pages/signin/LoginForm.js index 58df13f81dd4..c73d814a8fa4 100644 --- a/src/pages/signin/LoginForm/LoginFormNarrow.js +++ b/src/pages/signin/LoginForm.js @@ -7,11 +7,11 @@ import { import {withOnyx} from 'react-native-onyx'; import PropTypes from 'prop-types'; import _ from 'underscore'; -import styles from '../../../styles/styles'; -import themeColors from '../../../styles/themes/default'; -import ButtonWithLoader from '../../../components/ButtonWithLoader'; -import {fetchAccountDetails} from '../../../libs/actions/Session'; -import ONYXKEYS from '../../../ONYXKEYS'; +import styles from '../../styles/styles'; +import themeColors from '../../styles/themes/default'; +import ButtonWithLoader from '../../components/ButtonWithLoader'; +import {fetchAccountDetails} from '../../libs/actions/Session'; +import ONYXKEYS from '../../ONYXKEYS'; const propTypes = { /* Onyx Props */ @@ -30,7 +30,7 @@ const defaultProps = { account: {}, }; -class LoginFormNarrow extends React.Component { +class LoginForm extends React.Component { constructor(props) { super(props); @@ -74,6 +74,7 @@ class LoginFormNarrow extends React.Component { autoCapitalize="none" placeholder="Phone or Email" placeholderTextColor={themeColors.placeholderText} + autofocus /> @@ -100,9 +101,9 @@ class LoginFormNarrow extends React.Component { } } -LoginFormNarrow.propTypes = propTypes; -LoginFormNarrow.defaultProps = defaultProps; +LoginForm.propTypes = propTypes; +LoginForm.defaultProps = defaultProps; export default withOnyx({ account: {key: ONYXKEYS.ACCOUNT}, -})(LoginFormNarrow); +})(LoginForm); diff --git a/src/pages/signin/LoginForm/LoginFormWide.js b/src/pages/signin/LoginForm/LoginFormWide.js deleted file mode 100644 index 58dc6d2fc69a..000000000000 --- a/src/pages/signin/LoginForm/LoginFormWide.js +++ /dev/null @@ -1,105 +0,0 @@ -import React from 'react'; -import {Text, TextInput, View} from 'react-native'; -import {withOnyx} from 'react-native-onyx'; -import PropTypes from 'prop-types'; -import _ from 'underscore'; -import {fetchAccountDetails} from '../../../libs/actions/Session'; -import styles from '../../../styles/styles'; -import ButtonWithLoader from '../../../components/ButtonWithLoader'; -import ONYXKEYS from '../../../ONYXKEYS'; - -const propTypes = { - /* Onyx Props */ - - // The details about the account that the user is signing in with - account: PropTypes.shape({ - // An error message to display to the user - error: PropTypes.string, - - // Whether or not a sign on form is loading (being submitted) - loading: PropTypes.bool, - }), -}; - -const defaultProps = { - account: {}, -}; - -class LoginFormWide extends React.Component { - constructor(props) { - super(props); - - this.validateAndSubmitForm = this.validateAndSubmitForm.bind(this); - - this.state = { - formError: false, - login: '', - }; - } - - /** - * Check that all the form fields are valid, then trigger the submit callback - */ - validateAndSubmitForm() { - if (!this.state.login.trim()) { - this.setState({formError: 'Please enter an email or phone number'}); - return; - } - - this.setState({ - formError: null, - }); - - // Check if this login has an account associated with it or not - fetchAccountDetails(this.state.login); - } - - render() { - return ( - <> - - - Enter your phone or email: - this.setState({login: text})} - onSubmitEditing={this.validateAndSubmitForm} - autoCapitalize="none" - placeholder="Phone or Email" - autoFocus - /> - - - - - - {this.state.formError && ( - - {this.state.formError} - - )} - - {!_.isEmpty(this.props.account.error) && ( - - {this.props.account.error} - - )} - - - ); - } -} - -LoginFormWide.propTypes = propTypes; -LoginFormWide.defaultProps = defaultProps; - -export default withOnyx({ - account: {key: ONYXKEYS.ACCOUNT}, -})(LoginFormWide); diff --git a/src/pages/signin/LoginForm/index.js b/src/pages/signin/LoginForm/index.js deleted file mode 100644 index fc94e27e486e..000000000000 --- a/src/pages/signin/LoginForm/index.js +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react'; -import LoginFormNarrow from './LoginFormNarrow'; -import LoginFormWide from './LoginFormWide'; -import withWindowDimensions, {windowDimensionsPropTypes} from '../../../components/withWindowDimensions'; - -const propTypes = { - ...windowDimensionsPropTypes, -}; - -const LoginForm = ({isSmallScreenWidth}) => ( - !isSmallScreenWidth - ? - : -); - -LoginForm.propTypes = propTypes; -LoginForm.displayName = 'LoginForm'; - -export default withWindowDimensions(LoginForm); diff --git a/src/pages/signin/LoginForm/index.native.js b/src/pages/signin/LoginForm/index.native.js deleted file mode 100644 index e0f7e358f4fd..000000000000 --- a/src/pages/signin/LoginForm/index.native.js +++ /dev/null @@ -1,3 +0,0 @@ -import LoginFormNarrow from './LoginFormNarrow'; - -export default LoginFormNarrow; diff --git a/src/pages/signin/SignInPageLayout/index.js b/src/pages/signin/SignInPageLayout/index.js index 41313d9484cf..8c5018b21334 100644 --- a/src/pages/signin/SignInPageLayout/index.js +++ b/src/pages/signin/SignInPageLayout/index.js @@ -10,9 +10,9 @@ const propTypes = { const SignInPageLayout = props => ( !props.isSmallScreenWidth // eslint-disable-next-line react/jsx-props-no-spreading - ? + ? {props.children} // eslint-disable-next-line react/jsx-props-no-spreading - : + : {props.children} ); SignInPageLayout.propTypes = propTypes; From e1dcc446f5a68598dbdd058c4ced04d401a74670 Mon Sep 17 00:00:00 2001 From: barun1997 Date: Fri, 2 Apr 2021 10:53:43 +0545 Subject: [PATCH 116/380] Add edge cases to handle ComponentDidUpdate in IOUModal --- src/pages/iou/IOUModal.js | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/src/pages/iou/IOUModal.js b/src/pages/iou/IOUModal.js index cf17e5d94b72..32d1020bda27 100644 --- a/src/pages/iou/IOUModal.js +++ b/src/pages/iou/IOUModal.js @@ -1,5 +1,6 @@ import React, {Component} from 'react'; import {View, TouchableOpacity} from 'react-native'; +import _ from 'underscore'; import PropTypes from 'prop-types'; import {withOnyx} from 'react-native-onyx'; import IOUAmountPage from './steps/IOUAmountPage'; @@ -73,19 +74,10 @@ class IOUModal extends Component { } componentDidUpdate(prevProps) { - // Handles edge case when there are no previous user IOU report - if (!prevProps.iousReport) { return; } - - // Dismiss modal when the length of transactions for any iousReport changes - Object.keys(this.props.iousReport) - .forEach((reportKey) => { - const prevTransactions = [...prevProps.iousReport[reportKey].transactions]; - const currentTransactions = [...this.props.iousReport[reportKey].transactions]; - - if (prevTransactions.length !== currentTransactions.length) { - return Navigation.dismissModal(); - } - }); + // if the prevProps isn't equivalent to new prop, dismiss the modal + if (!_.isEqual(prevProps.iousReport, this.props.iousReport)) { + return Navigation.dismissModal(); + } } /** From aa5ef6aae5ad469f33fcab6929a906f150646a84 Mon Sep 17 00:00:00 2001 From: tugbadogan Date: Fri, 2 Apr 2021 13:40:22 +0100 Subject: [PATCH 117/380] Addressing comments --- src/components/TextInputAutoGrow.js | 52 +++++++++++++++------- src/components/TextInputFocusable/index.js | 2 +- src/pages/iou/steps/IOUAmountPage.js | 29 +++++------- src/styles/styles.js | 37 +++++++++++---- 4 files changed, 76 insertions(+), 44 deletions(-) diff --git a/src/components/TextInputAutoGrow.js b/src/components/TextInputAutoGrow.js index 994f2c219f04..ca2200d47f26 100644 --- a/src/components/TextInputAutoGrow.js +++ b/src/components/TextInputAutoGrow.js @@ -2,29 +2,32 @@ import React from 'react'; import {View, Text} from 'react-native'; import PropTypes from 'prop-types'; import _ from 'underscore'; -import styles from '../styles/styles'; +import {getAutoGrowTextInputStyle, getHiddenElementOutsideOfWindow} from '../styles/styles'; +import withWindowDimensions, {windowDimensionsPropTypes} from './withWindowDimensions'; import TextInputFocusable from './TextInputFocusable'; const propTypes = { // The value of the comment box - value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + value: PropTypes.string.isRequired, // A ref to forward to the text input forwardedRef: PropTypes.func.isRequired, // General styles to apply to the text input // eslint-disable-next-line react/forbid-prop-types - style: PropTypes.any, + inputStyle: PropTypes.object, // Styles to apply to the text input // eslint-disable-next-line react/forbid-prop-types - textStyle: PropTypes.any.isRequired, + textStyle: PropTypes.object.isRequired, + + /* Window Dimensions Props */ + ...windowDimensionsPropTypes, }; const defaultProps = { - value: undefined, - style: null, + inputStyle: {}, }; class TextInputAutoGrow extends React.Component { @@ -36,23 +39,38 @@ class TextInputAutoGrow extends React.Component { }; } + /** + * Text input component doesn't support auto grow by default. We're using a hidden text input to achieve that. + * This text view is used to calculate width of the input value given textStyle in this component. + * This text component is intentionally positioned out of the screen. + * + * @returns {Text} + */ + getHiddenTextView() { + return ( + this.setState({textInputWidth: e.nativeEvent.layout.width})} + > + {this.props.value} + + ); + } + render() { - const propsWithoutStyles = _.omit(this.props, ['style', 'textStyle']); - const widthStyle = {width: Math.max(5, this.state.textInputWidth)}; + const propsWithoutStyles = _.omit( + this.props, + ['inputStyle', 'textStyle', Object.keys(windowDimensionsPropTypes)], + ); return ( - this.setState({textInputWidth: e.nativeEvent.layout.width})} - > - {this.props.value} - + {this.getHiddenTextView()} ); } @@ -61,7 +79,9 @@ class TextInputAutoGrow extends React.Component { TextInputAutoGrow.propTypes = propTypes; TextInputAutoGrow.defaultProps = defaultProps; +const TextInputAutoGrowWithWindowDimensions = withWindowDimensions(TextInputAutoGrow); + export default React.forwardRef((props, ref) => ( /* eslint-disable-next-line react/jsx-props-no-spreading */ - + )); diff --git a/src/components/TextInputFocusable/index.js b/src/components/TextInputFocusable/index.js index 998ab162c2c7..f10d98c3d138 100644 --- a/src/components/TextInputFocusable/index.js +++ b/src/components/TextInputFocusable/index.js @@ -11,7 +11,7 @@ const propTypes = { defaultValue: PropTypes.string, // The value of the comment box - value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + value: PropTypes.string, // Callback method to handle pasting a file onPasteFile: PropTypes.func, diff --git a/src/pages/iou/steps/IOUAmountPage.js b/src/pages/iou/steps/IOUAmountPage.js index e6dc9ebe436f..02c41b88a0be 100644 --- a/src/pages/iou/steps/IOUAmountPage.js +++ b/src/pages/iou/steps/IOUAmountPage.js @@ -45,10 +45,9 @@ class IOUAmountPage extends React.Component { constructor(props) { super(props); - this.onlyAllowNumericValues = this.onlyAllowNumericValues.bind(this); + this.updateAmountIfValidInput = this.updateAmountIfValidInput.bind(this); this.state = { amount: '', - isNextButtonEnabled: false, }; } @@ -63,36 +62,28 @@ class IOUAmountPage extends React.Component { * Validate new amount with decimal number regex up to 6 digits and 2 decimal digit to enable Next button * * @param {String} key - * @param {String} event */ - onlyAllowNumericValues(key, event) { - // Prevent reusing synthetic event object, so we can call preventDefault() later. - if (event) { - event.persist(); - } - + updateAmountIfValidInput(key) { // Backspace button is pressed if (key === '<' || key === 'Backspace') { if (this.state.amount.length > 0) { this.setState(prevState => ({ amount: prevState.amount.substring(0, prevState.amount.length - 1), - isNextButtonEnabled: prevState.amount.length !== 1, })); } return; } + this.setState((prevState) => { const newValue = `${prevState.amount}${key}`; + + // Regex to validate decimal number with up to 6 digits and 2 decimal numbers const decimalNumberRegex = new RegExp(/^\d{1,6}(\.\d{0,2})?$/, 'i'); if (!decimalNumberRegex.test(newValue)) { - if (event) { - event.preventDefault(); - } return prevState; } return { amount: newValue, - isNextButtonEnabled: true, }; }); } @@ -116,9 +107,9 @@ class IOUAmountPage extends React.Component { ? {this.state.amount} : ( this.onlyAllowNumericValues(event.key, event)} + onKeyPress={event => this.updateAmountIfValidInput(event.key)} ref={el => this.textInput = el} value={this.state.amount} textAlign="left" @@ -127,13 +118,13 @@ class IOUAmountPage extends React.Component { {this.props.isSmallScreenWidth - ? + ? : } this.props.onStepComplete(this.state.amount)} - disabled={!this.state.isNextButtonEnabled} + disabled={this.state.amount.length === 0} > Next diff --git a/src/styles/styles.js b/src/styles/styles.js index c1aea688b9d7..40f87db3f461 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -1239,14 +1239,6 @@ const styles = { fontSize: variables.iouAmountTextSize, }, 0), - autoGrowTextInputHiddenText: { - position: 'absolute', - opacity: 0, - - // Using a very large value here makes sure it's out of screen - left: 100000, - }, - noScrollbars: { scrollbarWidth: 'none', }, @@ -1413,6 +1405,33 @@ function getZoomSizingStyle(isZoomed) { }; } +/** + * Returns auto grow text input style + * + * @param {Number} width + * @return {Object} + */ +function getAutoGrowTextInputStyle(width) { + return { + minWidth: 5, + width, + }; +} + +/** + * Positions an element to outside of the window and hides it + * + * @param {Number} windowWidth + * @returns {Object} + */ +function getHiddenElementOutsideOfWindow(windowWidth) { + return { + position: 'absolute', + opacity: 0, + left: windowWidth, + }; +} + export default styles; export { getSafeAreaPadding, @@ -1423,4 +1442,6 @@ export { getNavigationModalCardStyle, getZoomCursorStyle, getZoomSizingStyle, + getAutoGrowTextInputStyle, + getHiddenElementOutsideOfWindow, }; From 359eb3e9e59cdc3bfa46ef8100e00220bf2d836b Mon Sep 17 00:00:00 2001 From: tugbadogan Date: Fri, 2 Apr 2021 17:29:16 +0100 Subject: [PATCH 118/380] Use event.preventDefault in TextInputAutoGrow onKeyPress This change makes input entry smoother by preventing TextInput to update its own value --- src/pages/iou/steps/IOUAmountPage.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/pages/iou/steps/IOUAmountPage.js b/src/pages/iou/steps/IOUAmountPage.js index 02c41b88a0be..6301d4b6c25c 100644 --- a/src/pages/iou/steps/IOUAmountPage.js +++ b/src/pages/iou/steps/IOUAmountPage.js @@ -109,7 +109,10 @@ class IOUAmountPage extends React.Component { this.updateAmountIfValidInput(event.key)} + onKeyPress={(event) => { + this.updateAmountIfValidInput(event.key); + event.preventDefault(); + }} ref={el => this.textInput = el} value={this.state.amount} textAlign="left" From bed13f15da738a6f85fee53f961e1198767d9d79 Mon Sep 17 00:00:00 2001 From: Rory Abraham Date: Fri, 2 Apr 2021 12:00:40 -0700 Subject: [PATCH 119/380] Make generic DisplayNames component --- .../DisplayNames/DisplayNamesPropTypes.js | 27 ++++++ .../DisplayNames}/index.js | 85 ++++++++++--------- src/components/DisplayNames/index.native.js | 20 +++++ src/pages/home/HeaderView.js | 19 +++-- src/pages/home/sidebar/OptionRow.js | 16 ++-- .../OptionRowTitle/OptionRowTitleProps.js | 37 -------- .../sidebar/OptionRowTitle/index.native.js | 20 ----- 7 files changed, 111 insertions(+), 113 deletions(-) create mode 100644 src/components/DisplayNames/DisplayNamesPropTypes.js rename src/{pages/home/sidebar/OptionRowTitle => components/DisplayNames}/index.js (60%) create mode 100644 src/components/DisplayNames/index.native.js delete mode 100644 src/pages/home/sidebar/OptionRowTitle/OptionRowTitleProps.js delete mode 100644 src/pages/home/sidebar/OptionRowTitle/index.native.js diff --git a/src/components/DisplayNames/DisplayNamesPropTypes.js b/src/components/DisplayNames/DisplayNamesPropTypes.js new file mode 100644 index 000000000000..bf1a95851e61 --- /dev/null +++ b/src/components/DisplayNames/DisplayNamesPropTypes.js @@ -0,0 +1,27 @@ +import PropTypes from 'prop-types'; + +const propTypes = { + // The full title of the DisplayNames component (not split up) + fullTitle: PropTypes.string, + + // Array of objects that map display names to their corresponding tooltip + displayNameToTooltipMap: PropTypes.object, + + // Number of lines before wrapping + numberOfLines: PropTypes.number, + + // Is tooltip needed? + // When true, triggers complex title rendering + tooltipEnabled: PropTypes.bool, + + // Arbitrary styles of the displayName text + textStyle: PropTypes.arrayOf(PropTypes.any), +}; + +const defaultProps = { + numberOfLines: 1, + tooltipEnabled: false, + titleStyles: [], +}; + +export {propTypes, defaultProps}; diff --git a/src/pages/home/sidebar/OptionRowTitle/index.js b/src/components/DisplayNames/index.js similarity index 60% rename from src/pages/home/sidebar/OptionRowTitle/index.js rename to src/components/DisplayNames/index.js index 9f887f2a65d2..aa246e815004 100644 --- a/src/pages/home/sidebar/OptionRowTitle/index.js +++ b/src/components/DisplayNames/index.js @@ -1,15 +1,12 @@ import _ from 'underscore'; import React, {Fragment, PureComponent} from 'react'; -import { - Text, - View, -} from 'react-native'; -import {propTypes, defaultProps} from './OptionRowTitleProps'; -import styles from '../../../../styles/styles'; -import Tooltip from '../../../../components/Tooltip'; -import hasEllipsis from '../../../../libs/hasEllipsis'; +import {Text, View} from 'react-native'; +import {propTypes, defaultProps} from './DisplayNamesPropTypes'; +import styles from '../../styles/styles'; +import Tooltip from '../Tooltip'; +import hasEllipsis from '../../libs/hasEllipsis'; -class OptionRowTitle extends PureComponent { +class DisplayNames extends PureComponent { constructor(props) { super(props); this.containerRef = null; @@ -31,7 +28,6 @@ class OptionRowTitle extends PureComponent { * Set the container layout for post calculations * * @param {*} {nativeEvent} - * @memberof OptionRowTitle */ setContainerLayout({nativeEvent}) { this.containerLayout = nativeEvent.layout; @@ -44,11 +40,10 @@ class OptionRowTitle extends PureComponent { * So we shift it by calculating it as follows: * 1. We get the container layout and take the Child inline text node. * 2. Now we get the tooltip original position. - * 3. If inline node's right edge is overflowing the containe's right edge, we set the tooltip to the center + * 3. If inline node's right edge is overflowing the container's right edge, we set the tooltip to the center * of the distance between the left edge of the inline node and right edge of the container. * @param {Number} index Used to get the Ref to the node at the current index. * @returns {Number} Distance to shift the tooltip horizontally - * @memberof OptionRowTitle */ getTooltipShiftX(index) { // Only shift when containerLayout or Refs to text node is available . @@ -70,54 +65,62 @@ class OptionRowTitle extends PureComponent { render() { - const { - option, style, tooltipEnabled, numberOfLines, - } = this.props; - - if (!tooltipEnabled) { - return {option.text}; + if (!this.props.tooltipEnabled) { + // No need for any complex text-splitting, just return a simple text component + return ( + + {this.props.fullTitle} + + ); } + + const displayNames = _.keys(this.props.displayNameToTooltipMap); + const lastDisplayName = _.last(displayNames); + return ( - // Tokenization of string only support 1 numberofLines on Web + // Tokenization of string only support 1 numberOfLines on Web this.containerRef = el} > - {_.map(option.participantsList, (participant, index) => ( - + {_.mapObject(this.props.displayNameToTooltipMap, (displayName, tooltipText) => ( + this.getTooltipShiftX(index)} + shiftHorizontal={() => this.getTooltipShiftX(tooltipText)} > {/* // We need to get the refs to all the names which will be used to correct the horizontal position of the tooltip */} - this.childRefs[index] = el}> - {participant.displayName} + this.childRefs[tooltipText] = el}> + {displayName} - {index < option.participantsList.length - 1 && } + {displayName !== lastDisplayName && } ))} - {option.participantsList.length > 1 && this.state.isEllipsisActive - && ( - - - {/* There is some Gap for real ellipsis so we are adding 4 `.` to cover */} - .... - - - )} + {displayNames.length > 1 && this.state.isEllipsisActive + && ( + + + {/* There is some Gap for real ellipsis so we are adding 4 `.` to cover */} + .... + + + )} ); } } -OptionRowTitle.propTypes = propTypes; -OptionRowTitle.defaultProps = defaultProps; -OptionRowTitle.displayName = 'OptionRowTitle'; +DisplayNames.propTypes = propTypes; +DisplayNames.defaultProps = defaultProps; +DisplayNames.displayName = 'DisplayNames'; -export default OptionRowTitle; +export default DisplayNames; diff --git a/src/components/DisplayNames/index.native.js b/src/components/DisplayNames/index.native.js new file mode 100644 index 000000000000..340809b5d6f3 --- /dev/null +++ b/src/components/DisplayNames/index.native.js @@ -0,0 +1,20 @@ +import React from 'react'; +import {Text} from 'react-native'; +import {propTypes, defaultProps} from './DisplayNamesPropTypes'; + +// As we don't have to show tooltips of the Native platform so we simply render the full display names list. +const DisplayNames = ({ + fullTitle, + numberOfLines, + textStyle, +}) => ( + + {fullTitle} + +); + +DisplayNames.propTypes = propTypes; +DisplayNames.defaultProps = defaultProps; +DisplayNames.displayName = 'DisplayNames'; + +export default DisplayNames; diff --git a/src/pages/home/HeaderView.js b/src/pages/home/HeaderView.js index 40e07a82daef..1acf4424c025 100644 --- a/src/pages/home/HeaderView.js +++ b/src/pages/home/HeaderView.js @@ -1,3 +1,4 @@ +import _ from 'underscore'; import React from 'react'; import {View, Pressable} from 'react-native'; import PropTypes from 'prop-types'; @@ -15,7 +16,7 @@ import MultipleAvatars from '../../components/MultipleAvatars'; import Navigation from '../../libs/Navigation/Navigation'; import ROUTES from '../../ROUTES'; import {getReportParticipantsTitle} from '../../libs/reportUtils'; -import OptionRowTitle from './sidebar/OptionRowTitle'; +import DisplayNames from '../../components/DisplayNames'; import {getPersonalDetailsForLogins} from '../../libs/OptionsListUtils'; import {participantPropTypes} from './sidebar/optionPropTypes'; import VideoChatButtonAndMenu from '../../components/VideoChatButtonAndMenu'; @@ -53,11 +54,10 @@ const defaultProps = { const HeaderView = (props) => { const participants = lodashGet(props.report, 'participants', []); - const reportOption = { - text: lodashGet(props.report, 'reportName', ''), - tooltipText: getReportParticipantsTitle(participants), - participantsList: getPersonalDetailsForLogins(participants, props.personalDetails), - }; + const displayNameToLoginMap = _.map( + getPersonalDetailsForLogins(participants, props.personalDetails), + personalDetailsForLogin => ({[personalDetailsForLogin.displayName]: personalDetailsForLogin.login}), + ); return ( @@ -92,11 +92,12 @@ const HeaderView = (props) => { secondAvatarStyle={[styles.secondAvatarHovered]} /> - diff --git a/src/pages/home/sidebar/OptionRow.js b/src/pages/home/sidebar/OptionRow.js index 860b23a45090..3b08eae4f2a2 100644 --- a/src/pages/home/sidebar/OptionRow.js +++ b/src/pages/home/sidebar/OptionRow.js @@ -14,7 +14,7 @@ import {Pencil, PinCircle, Checkmark} from '../../../components/Icon/Expensicons import MultipleAvatars from '../../../components/MultipleAvatars'; import themeColors from '../../../styles/themes/default'; import Hoverable from '../../../components/Hoverable'; -import OptionRowTitle from './OptionRowTitle'; +import DisplayNames from '../../../components/DisplayNames'; import IOUBadge from '../../../components/IOUBadge'; import colors from '../../../styles/colors'; @@ -109,6 +109,11 @@ const OptionRow = ({ ? hoverStyle.backgroundColor : backgroundColor; const focusedBackgroundColor = styles.sidebarLinkActive.backgroundColor; + const displayNameToLoginMap = _.map( + option.participantsList, + participant => ({[participant.displayName]: participant.login}), + ); + return ( {hovered => ( @@ -152,14 +157,13 @@ const OptionRow = ({ ) } - - {option.alternateText ? ( ( - - {option.text} - -); - -OptionRowTitle.propTypes = propTypes; -OptionRowTitle.defaultProps = defaultProps; -OptionRowTitle.displayName = 'OptionRowTitle'; - -export default OptionRowTitle; From 6beb739f06ce37b1c9b1e43f86a9d06b40945002 Mon Sep 17 00:00:00 2001 From: Rory Abraham Date: Fri, 2 Apr 2021 12:47:42 -0700 Subject: [PATCH 120/380] Use array instead of object and fix prop types --- .../DisplayNames/DisplayNamesPropTypes.js | 7 +++++-- src/components/DisplayNames/index.js | 18 +++++++++--------- src/components/DisplayNames/index.native.js | 4 ++-- src/pages/home/HeaderView.js | 8 ++++---- src/pages/home/report/ReportActionItem.js | 2 +- src/pages/home/sidebar/OptionRow.js | 8 ++++---- 6 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/components/DisplayNames/DisplayNamesPropTypes.js b/src/components/DisplayNames/DisplayNamesPropTypes.js index bf1a95851e61..9be34fbd0f9f 100644 --- a/src/components/DisplayNames/DisplayNamesPropTypes.js +++ b/src/components/DisplayNames/DisplayNamesPropTypes.js @@ -5,7 +5,10 @@ const propTypes = { fullTitle: PropTypes.string, // Array of objects that map display names to their corresponding tooltip - displayNameToTooltipMap: PropTypes.object, + displayNamesToTooltips: PropTypes.arrayOf(PropTypes.shape({ + displayName: PropTypes.string, + tooltip: PropTypes.string, + })), // Number of lines before wrapping numberOfLines: PropTypes.number, @@ -15,7 +18,7 @@ const propTypes = { tooltipEnabled: PropTypes.bool, // Arbitrary styles of the displayName text - textStyle: PropTypes.arrayOf(PropTypes.any), + textStyles: PropTypes.arrayOf(PropTypes.any), }; const defaultProps = { diff --git a/src/components/DisplayNames/index.js b/src/components/DisplayNames/index.js index aa246e815004..811095958596 100644 --- a/src/components/DisplayNames/index.js +++ b/src/components/DisplayNames/index.js @@ -69,7 +69,7 @@ class DisplayNames extends PureComponent { // No need for any complex text-splitting, just return a simple text component return ( {this.props.fullTitle} @@ -77,29 +77,29 @@ class DisplayNames extends PureComponent { ); } - const displayNames = _.keys(this.props.displayNameToTooltipMap); + const displayNames = _.flatten(_.map(this.props.displayNamesToTooltips, mapEntry => _.keys(mapEntry))); const lastDisplayName = _.last(displayNames); return ( // Tokenization of string only support 1 numberOfLines on Web this.containerRef = el} > - {_.mapObject(this.props.displayNameToTooltipMap, (displayName, tooltipText) => ( - + {_.map(this.props.displayNamesToTooltips, ({displayName, tooltip}, index) => ( + this.getTooltipShiftX(tooltipText)} + shiftHorizontal={() => this.getTooltipShiftX(tooltip)} > {/* // We need to get the refs to all the names which will be used to correct the horizontal position of the tooltip */} - this.childRefs[tooltipText] = el}> + this.childRefs[index] = el}> {displayName} diff --git a/src/components/DisplayNames/index.native.js b/src/components/DisplayNames/index.native.js index 340809b5d6f3..81c0f9dfc50b 100644 --- a/src/components/DisplayNames/index.native.js +++ b/src/components/DisplayNames/index.native.js @@ -6,9 +6,9 @@ import {propTypes, defaultProps} from './DisplayNamesPropTypes'; const DisplayNames = ({ fullTitle, numberOfLines, - textStyle, + textStyles, }) => ( - + {fullTitle} ); diff --git a/src/pages/home/HeaderView.js b/src/pages/home/HeaderView.js index 1acf4424c025..6de0ec80d7bc 100644 --- a/src/pages/home/HeaderView.js +++ b/src/pages/home/HeaderView.js @@ -54,9 +54,9 @@ const defaultProps = { const HeaderView = (props) => { const participants = lodashGet(props.report, 'participants', []); - const displayNameToLoginMap = _.map( + const displayNamesToTooltips = _.map( getPersonalDetailsForLogins(participants, props.personalDetails), - personalDetailsForLogin => ({[personalDetailsForLogin.displayName]: personalDetailsForLogin.login}), + ({displayName, login}) => ({displayName, tooltip: login}), ); return ( @@ -94,10 +94,10 @@ const HeaderView = (props) => { diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index c40efa8d516d..2db7c2878399 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -135,7 +135,7 @@ class ReportActionItem extends Component { )} > diff --git a/src/pages/home/sidebar/OptionRow.js b/src/pages/home/sidebar/OptionRow.js index 3b08eae4f2a2..585163280890 100644 --- a/src/pages/home/sidebar/OptionRow.js +++ b/src/pages/home/sidebar/OptionRow.js @@ -109,9 +109,9 @@ const OptionRow = ({ ? hoverStyle.backgroundColor : backgroundColor; const focusedBackgroundColor = styles.sidebarLinkActive.backgroundColor; - const displayNameToLoginMap = _.map( + const displayNamesToTooltips = _.map( option.participantsList, - participant => ({[participant.displayName]: participant.login}), + ({displayName, login}) => ({displayName, tooltip: login}), ); return ( @@ -159,10 +159,10 @@ const OptionRow = ({ {option.alternateText ? ( Date: Fri, 2 Apr 2021 12:53:33 -0700 Subject: [PATCH 121/380] fix indexing issue --- src/components/DisplayNames/index.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/components/DisplayNames/index.js b/src/components/DisplayNames/index.js index 811095958596..f55b37df45bf 100644 --- a/src/components/DisplayNames/index.js +++ b/src/components/DisplayNames/index.js @@ -77,9 +77,6 @@ class DisplayNames extends PureComponent { ); } - const displayNames = _.flatten(_.map(this.props.displayNamesToTooltips, mapEntry => _.keys(mapEntry))); - const lastDisplayName = _.last(displayNames); - return ( // Tokenization of string only support 1 numberOfLines on Web @@ -95,7 +92,7 @@ class DisplayNames extends PureComponent { key={index} text={tooltip} containerStyle={styles.dInline} - shiftHorizontal={() => this.getTooltipShiftX(tooltip)} + shiftHorizontal={() => this.getTooltipShiftX(index)} > {/* // We need to get the refs to all the names which will be used to correct the horizontal position of the tooltip */} @@ -103,10 +100,10 @@ class DisplayNames extends PureComponent { {displayName} - {displayName !== lastDisplayName && } + {index < this.props.displayNamesToTooltips.length - 1 && } ))} - {displayNames.length > 1 && this.state.isEllipsisActive + {this.props.displayNamesToTooltips.length > 1 && this.state.isEllipsisActive && ( From 3f99483bfc602eec7953ed7a4081a30887e4ab15 Mon Sep 17 00:00:00 2001 From: Rory Abraham Date: Fri, 2 Apr 2021 12:57:53 -0700 Subject: [PATCH 122/380] Rename and generalize styles --- src/components/DisplayNames/index.js | 4 ++-- src/styles/styles.js | 6 +----- src/styles/utilities/positioning.js | 3 +++ 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/components/DisplayNames/index.js b/src/components/DisplayNames/index.js index f55b37df45bf..e5034d4634f2 100644 --- a/src/components/DisplayNames/index.js +++ b/src/components/DisplayNames/index.js @@ -81,7 +81,7 @@ class DisplayNames extends PureComponent { // Tokenization of string only support 1 numberOfLines on Web this.containerRef = el} @@ -105,7 +105,7 @@ class DisplayNames extends PureComponent { ))} {this.props.displayNamesToTooltips.length > 1 && this.state.isEllipsisActive && ( - + {/* There is some Gap for real ellipsis so we are adding 4 `.` to cover */} .... diff --git a/src/styles/styles.js b/src/styles/styles.js index 22b13cd5e8db..09e724713c9d 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -599,11 +599,7 @@ const styles = { flexShrink: 0, }, - optionDisplayNameTooltipWrapper: { - position: 'relative', - }, - - optionDisplayNameTooltipEllipsis: { + displayNameTooltipEllipsis: { position: 'absolute', opacity: 0, right: 0, diff --git a/src/styles/utilities/positioning.js b/src/styles/utilities/positioning.js index 9514b8f55091..f73954241960 100644 --- a/src/styles/utilities/positioning.js +++ b/src/styles/utilities/positioning.js @@ -3,6 +3,9 @@ * Everything is a multiple of 4 to coincide with the spacing utilities. */ export default { + pRelative: { + position: 'relative', + }, tn4: { top: -16, }, From 942fe1643c7218200cd3cd473d0363ce8790b68d Mon Sep 17 00:00:00 2001 From: Rory Abraham Date: Fri, 2 Apr 2021 13:08:12 -0700 Subject: [PATCH 123/380] Import and export positioning from global style object --- src/styles/styles.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/styles/styles.js b/src/styles/styles.js index 09e724713c9d..b9b06f3bfbd7 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -13,6 +13,7 @@ import overflow from './utilities/overflow'; import whiteSpace from './utilities/whiteSpace'; import wordBreak from './utilities/wordBreak'; import textInputAlignSelf from './utilities/textInputAlignSelf'; +import positioning from './utilities/positioning'; const styles = { // Add all of our utility and helper styles @@ -21,6 +22,7 @@ const styles = { ...flex, ...display, ...overflow, + ...positioning, ...wordBreak, ...whiteSpace, From 23a5f08b65e3e9de89f22990b75a12d10925463a Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Fri, 2 Apr 2021 17:11:21 -0600 Subject: [PATCH 124/380] Use this.comment as source of truth to prevent weird bugs --- src/pages/home/report/ReportActionCompose.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index 4b4948189cd0..af78714bdc87 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -197,7 +197,7 @@ class ReportActionCompose extends React.Component { addEmojiToTextBox(emoji) { this.hideEmojiPicker(); - this.textInput.value = (this.textInput.value || this.comment) + emoji; + this.textInput.value = this.comment + emoji; this.setIsFocused(true); this.updateComment(this.textInput.value); } From 7a0fc9a8bd34af874a72fa96536a182c4f54a7d1 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Fri, 2 Apr 2021 17:27:04 -0600 Subject: [PATCH 125/380] Blur main compose box before showing picker to prevent having to double tap on emojis --- src/pages/home/report/ReportActionCompose.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index af78714bdc87..8ee8f1848784 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -181,6 +181,7 @@ class ReportActionCompose extends React.Component { * @param {Object} [event] - A press event. */ showEmojiPicker(event) { + this.textInput.blur(); this.state.emojiPopoverAnchorPosition = { horizontal: event.nativeEvent.pageX, vertical: event.nativeEvent.pageY, From 596e70c2bce62f8723110e6b0b998c016d35f4b9 Mon Sep 17 00:00:00 2001 From: Rory Abraham Date: Fri, 2 Apr 2021 21:07:33 -0700 Subject: [PATCH 126/380] Simplify diff --- src/components/DisplayNames/index.js | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/components/DisplayNames/index.js b/src/components/DisplayNames/index.js index e5034d4634f2..8651fea3ea76 100644 --- a/src/components/DisplayNames/index.js +++ b/src/components/DisplayNames/index.js @@ -1,6 +1,9 @@ import _ from 'underscore'; import React, {Fragment, PureComponent} from 'react'; -import {Text, View} from 'react-native'; +import { + Text, + View, +} from 'react-native'; import {propTypes, defaultProps} from './DisplayNamesPropTypes'; import styles from '../../styles/styles'; import Tooltip from '../Tooltip'; @@ -104,14 +107,14 @@ class DisplayNames extends PureComponent { ))} {this.props.displayNamesToTooltips.length > 1 && this.state.isEllipsisActive - && ( - - - {/* There is some Gap for real ellipsis so we are adding 4 `.` to cover */} - .... - - - )} + && ( + + + {/* There is some Gap for real ellipsis so we are adding 4 `.` to cover */} + .... + + + )} ); } From 9b22314de6d2d4270678e7f50e42320f6a72039a Mon Sep 17 00:00:00 2001 From: Rory Abraham Date: Fri, 2 Apr 2021 21:10:54 -0700 Subject: [PATCH 127/380] Fix import style --- src/components/DisplayNames/index.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/components/DisplayNames/index.js b/src/components/DisplayNames/index.js index 8651fea3ea76..6e55ee571416 100644 --- a/src/components/DisplayNames/index.js +++ b/src/components/DisplayNames/index.js @@ -1,9 +1,6 @@ import _ from 'underscore'; import React, {Fragment, PureComponent} from 'react'; -import { - Text, - View, -} from 'react-native'; +import {Text, View} from 'react-native'; import {propTypes, defaultProps} from './DisplayNamesPropTypes'; import styles from '../../styles/styles'; import Tooltip from '../Tooltip'; From f0d196b30880f142377037a623b599b55791a424 Mon Sep 17 00:00:00 2001 From: Rory Abraham Date: Fri, 2 Apr 2021 21:16:58 -0700 Subject: [PATCH 128/380] Rename hasEllipsis to hasContentWiderThanScrollWidth --- src/components/DisplayNames/index.js | 4 ++-- src/libs/hasContentWiderThanScrollWidth.js | 11 +++++++++++ src/libs/hasEllipsis/index.js | 11 ----------- src/libs/hasEllipsis/index.native.js | 1 - 4 files changed, 13 insertions(+), 14 deletions(-) create mode 100644 src/libs/hasContentWiderThanScrollWidth.js delete mode 100644 src/libs/hasEllipsis/index.js delete mode 100644 src/libs/hasEllipsis/index.native.js diff --git a/src/components/DisplayNames/index.js b/src/components/DisplayNames/index.js index 6e55ee571416..28e0c305ead9 100644 --- a/src/components/DisplayNames/index.js +++ b/src/components/DisplayNames/index.js @@ -4,7 +4,7 @@ import {Text, View} from 'react-native'; import {propTypes, defaultProps} from './DisplayNamesPropTypes'; import styles from '../../styles/styles'; import Tooltip from '../Tooltip'; -import hasEllipsis from '../../libs/hasEllipsis'; +import hasContentWiderThanScrollWidth from '../../libs/hasContentWiderThanScrollWidth'; class DisplayNames extends PureComponent { constructor(props) { @@ -20,7 +20,7 @@ class DisplayNames extends PureComponent { componentDidMount() { this.setState({ - isEllipsisActive: this.containerRef && hasEllipsis(this.containerRef), + isEllipsisActive: this.containerRef && hasContentWiderThanScrollWidth(this.containerRef), }); } diff --git a/src/libs/hasContentWiderThanScrollWidth.js b/src/libs/hasContentWiderThanScrollWidth.js new file mode 100644 index 000000000000..81df3455937c --- /dev/null +++ b/src/libs/hasContentWiderThanScrollWidth.js @@ -0,0 +1,11 @@ +/** + * Does an element have content wider than it's scroll width? + * + * @param {HTMLElement} el Element to check + * @returns {Boolean} + */ +function hasContentWiderThanScrollWidth(el) { + return el.offsetWidth && el.scrollWidth && el.offsetWidth < el.scrollWidth; +} + +export default hasContentWiderThanScrollWidth; diff --git a/src/libs/hasEllipsis/index.js b/src/libs/hasEllipsis/index.js deleted file mode 100644 index d18af237be35..000000000000 --- a/src/libs/hasEllipsis/index.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Does an elment have ellipsis - * - * @param {HTMLElement} el Element to check - * @returns {Boolean} - */ -function hasEllipsis(el) { - return el.offsetWidth < el.scrollWidth; -} - -export default hasEllipsis; diff --git a/src/libs/hasEllipsis/index.native.js b/src/libs/hasEllipsis/index.native.js deleted file mode 100644 index 2d1ec238274a..000000000000 --- a/src/libs/hasEllipsis/index.native.js +++ /dev/null @@ -1 +0,0 @@ -export default () => {}; From 9d74c30c135f7ae07c8740090f0961c7aa7b8d82 Mon Sep 17 00:00:00 2001 From: npsedhain Date: Sat, 3 Apr 2021 21:17:41 +0545 Subject: [PATCH 129/380] Display create menu within the chat area and add bottom up transition. --- src/CONST.js | 3 ++ src/components/CreateMenu.js | 33 ++++++++++++- src/components/Modal/ModalPropTypes.js | 4 +- src/components/Popover/PopoverPropTypes.js | 2 + src/components/Popover/index.js | 4 +- src/pages/home/report/ReportActionCompose.js | 2 + src/pages/home/sidebar/SidebarScreen.js | 1 + src/pages/settings/ProfilePage.js | 1 + src/styles/getModalStyles.js | 50 +++++++++++++++++++- src/styles/styles.js | 12 ++++- 10 files changed, 106 insertions(+), 6 deletions(-) diff --git a/src/CONST.js b/src/CONST.js index ce39818a791d..ff8919fea25c 100644 --- a/src/CONST.js +++ b/src/CONST.js @@ -39,6 +39,9 @@ const CONST = { CENTERED: 'centered', BOTTOM_DOCKED: 'bottom_docked', POPOVER: 'popover', + POPOVER_LEFT_DOCKED: 'popover_left_docked', + POPOVER_RIGHT_DOCKED: 'popover_right_docked', + POPOVER_CENTER_BOTTOM: 'popover_center_bottom', RIGHT_DOCKED: 'right_docked', }, ANCHOR_ORIGIN_VERTICAL: { diff --git a/src/components/CreateMenu.js b/src/components/CreateMenu.js index 0ce157eaf3a0..5c7366c04dfa 100644 --- a/src/components/CreateMenu.js +++ b/src/components/CreateMenu.js @@ -5,6 +5,8 @@ import Popover from './Popover'; import styles from '../styles/styles'; import withWindowDimensions, {windowDimensionsPropTypes} from './withWindowDimensions'; import MenuItem from './MenuItem'; +import CONST from '../CONST'; +import {propTypes as ModalPropTypes} from './Modal/ModalPropTypes'; const propTypes = { // Callback to fire on request to modal close @@ -16,6 +18,9 @@ const propTypes = { // Callback to fire when a CreateMenu item is selected onItemSelected: PropTypes.func.isRequired, + // Gives the type of the modal + popOverType: ModalPropTypes.type, + // Menu items to be rendered on the list menuItems: PropTypes.arrayOf( PropTypes.shape({ @@ -27,6 +32,11 @@ const propTypes = { ...windowDimensionsPropTypes, }; + +const defaultProps = { + popOverType: CONST.MODAL.MODAL_TYPE.POPOVER_LEFT_DOCKED, +}; + class CreateMenu extends PureComponent { constructor(props) { super(props); @@ -43,6 +53,24 @@ class CreateMenu extends PureComponent { this.onModalHide = callback; } + /** + * Get the anchor position using the type of the modal into account + * @param {String} type + * @returns {Object} + */ + getAnchorPosition(type) { + switch (type) { + case CONST.MODAL.MODAL_TYPE.POPOVER_LEFT_DOCKED: + return styles.createMenuPositionSidebar; + case CONST.MODAL.MODAL_TYPE.POPOVER_CENTER_BOTTOM: + return styles.createMenuPositionReportCompose; + case CONST.MODAL.MODAL_TYPE.POPOVER_RIGHT_DOCKED: + return styles.createMenuPositionProfile; + default: + return styles.createMenuPositionSidebar; + } + } + /** * After the modal hides, reset the onModalHide to an empty function */ @@ -51,6 +79,7 @@ class CreateMenu extends PureComponent { } render() { + console.debug(this.props.popOverType, this.getAnchorPosition()); return ( {this.props.menuItems.map(({ @@ -84,5 +114,6 @@ class CreateMenu extends PureComponent { } CreateMenu.propTypes = propTypes; +CreateMenu.defaultProps = defaultProps; CreateMenu.displayName = 'CreateMenu'; export default withWindowDimensions(CreateMenu); diff --git a/src/components/Modal/ModalPropTypes.js b/src/components/Modal/ModalPropTypes.js index 54d509921552..e5e52f051e5f 100644 --- a/src/components/Modal/ModalPropTypes.js +++ b/src/components/Modal/ModalPropTypes.js @@ -23,7 +23,9 @@ const propTypes = { CONST.MODAL.MODAL_TYPE.CONFIRM, CONST.MODAL.MODAL_TYPE.CENTERED, CONST.MODAL.MODAL_TYPE.BOTTOM_DOCKED, - CONST.MODAL.MODAL_TYPE.POPOVER, + CONST.MODAL.MODAL_TYPE.POPOVER_CENTER_BOTTOM, + CONST.MODAL.MODAL_TYPE.POPOVER_LEFT_DOCKED, + CONST.MODAL.MODAL_TYPE.POPOVER_RIGHT_DOCKED, CONST.MODAL.MODAL_TYPE.RIGHT_DOCKED, ]), diff --git a/src/components/Popover/PopoverPropTypes.js b/src/components/Popover/PopoverPropTypes.js index 2570964b7999..b4973b9d28f2 100644 --- a/src/components/Popover/PopoverPropTypes.js +++ b/src/components/Popover/PopoverPropTypes.js @@ -12,6 +12,8 @@ const propTypes = { bottom: PropTypes.number, left: PropTypes.number, }).isRequired, + + popOverType: modalPropTypes.type, }; const defaultProps = { diff --git a/src/components/Popover/index.js b/src/components/Popover/index.js index 31d819346de3..709a845b56bb 100644 --- a/src/components/Popover/index.js +++ b/src/components/Popover/index.js @@ -6,11 +6,11 @@ import withWindowDimensions from '../withWindowDimensions'; /* * This is a convenience wrapper around the Modal component for a responsive Popover. - * On small screen widths, it uses BottomDocked modal type, and a Popover on wide screen widths. + * On small screen widths, it uses BottomDocked modal type, and a Popover type on wide screen widths. */ const Popover = props => ( this.setMenuVisibility(false)} onItemSelected={() => this.setMenuVisibility(false)} + popOverType={CONST.MODAL.MODAL_TYPE.POPOVER_CENTER_BOTTOM} menuItems={[ { icon: Paperclip, diff --git a/src/pages/home/sidebar/SidebarScreen.js b/src/pages/home/sidebar/SidebarScreen.js index 358159fbe22f..abbec8badd17 100644 --- a/src/pages/home/sidebar/SidebarScreen.js +++ b/src/pages/home/sidebar/SidebarScreen.js @@ -88,6 +88,7 @@ class SidebarScreen extends Component { this.setState({isEditPhotoMenuVisible: false})} onItemSelected={() => this.setState({isEditPhotoMenuVisible: false})} menuItems={this.createMenuItems(openPicker)} + popOverType={CONST.MODAL.MODAL_TYPE.POPOVER_RIGHT_DOCKED} /> )} diff --git a/src/styles/getModalStyles.js b/src/styles/getModalStyles.js index f3ab417db1a4..4232a2e3fd2d 100644 --- a/src/styles/getModalStyles.js +++ b/src/styles/getModalStyles.js @@ -110,7 +110,7 @@ export default (type, windowDimensions, popoverAnchorPosition = {}) => { animationIn = 'slideInUp'; animationOut = 'slideOutDown'; break; - case CONST.MODAL.MODAL_TYPE.POPOVER: + case CONST.MODAL.MODAL_TYPE.POPOVER_LEFT_DOCKED: modalStyle = { ...modalStyle, ...popoverAnchorPosition, @@ -134,6 +134,54 @@ export default (type, windowDimensions, popoverAnchorPosition = {}) => { animationIn = 'fadeInLeft'; animationOut = 'fadeOutLeft'; break; + case CONST.MODAL.MODAL_TYPE.POPOVER_RIGHT_DOCKED: + modalStyle = { + ...modalStyle, + ...popoverAnchorPosition, + ...{ + position: 'absolute', + alignItems: 'center', + justifyContent: 'flex-end', + }, + }; + modalContainerStyle = { + borderRadius: 12, + borderWidth: 1, + borderColor: themeColors.border, + justifyContent: 'center', + overflow: 'hidden', + boxShadow: '0px 0px 10px 0px rgba(0, 0, 0, 0.025)', + }; + + hideBackdrop = true; + swipeDirection = undefined; + animationIn = 'fadeInRight'; + animationOut = 'fadeOutRight'; + break; + case CONST.MODAL.MODAL_TYPE.POPOVER_CENTER_BOTTOM: + modalStyle = { + ...modalStyle, + ...popoverAnchorPosition, + ...{ + position: 'absolute', + alignItems: 'center', + justifyContent: 'flex-end', + }, + }; + modalContainerStyle = { + borderRadius: 12, + borderWidth: 1, + borderColor: themeColors.border, + justifyContent: 'center', + overflow: 'hidden', + boxShadow: '0px 0px 10px 0px rgba(0, 0, 0, 0.025)', + }; + + hideBackdrop = true; + swipeDirection = undefined; + animationIn = 'fadeInUp'; + animationOut = 'fadeOutDown'; + break; case CONST.MODAL.MODAL_TYPE.RIGHT_DOCKED: modalStyle = { ...modalStyle, diff --git a/src/styles/styles.js b/src/styles/styles.js index 22b13cd5e8db..7a90eff60b57 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -490,11 +490,21 @@ const styles = { textDecorationLine: 'none', }, - createMenuPosition: { + createMenuPositionSidebar: { left: 18, bottom: 100, }, + createMenuPositionProfile: { + right: 18, + top: 100, + }, + + createMenuPositionReportCompose: { + left: 18 + variables.sideBarWidth, + bottom: 100, + }, + createMenuContainer: { width: variables.sideBarWidth - 40, paddingVertical: 12, From 16398f244ea541cd8e5070863ef4f525406cb412 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Mon, 5 Apr 2021 08:07:13 +0800 Subject: [PATCH 130/380] Rename props, remove unused HOC/props, rename style --- src/pages/signin/LoginForm/LoginFormWide.js | 2 +- src/pages/signin/SignInPage.js | 21 +++++++------------ .../SignInPageLayoutNarrow.js | 17 +++++++-------- .../SignInPageLayout/SignInPageLayoutWide.js | 10 ++++----- src/styles/styles.js | 2 +- 5 files changed, 21 insertions(+), 31 deletions(-) diff --git a/src/pages/signin/LoginForm/LoginFormWide.js b/src/pages/signin/LoginForm/LoginFormWide.js index 58dc6d2fc69a..ad1f206eeeb5 100644 --- a/src/pages/signin/LoginForm/LoginFormWide.js +++ b/src/pages/signin/LoginForm/LoginFormWide.js @@ -57,7 +57,7 @@ class LoginFormWide extends React.Component { render() { return ( <> - + Enter your phone or email: {showLoginForm && } @@ -109,11 +105,8 @@ class SignInPage extends Component { SignInPage.propTypes = propTypes; SignInPage.defaultProps = defaultProps; -export default compose( - withOnyx({ - account: {key: ONYXKEYS.ACCOUNT}, - credentials: {key: ONYXKEYS.CREDENTIALS}, - session: {key: ONYXKEYS.SESSION}, - }), - withWindowDimensions, -)(SignInPage); +export default withOnyx({ + account: {key: ONYXKEYS.ACCOUNT}, + credentials: {key: ONYXKEYS.CREDENTIALS}, + session: {key: ONYXKEYS.SESSION}, +})(SignInPage); diff --git a/src/pages/signin/SignInPageLayout/SignInPageLayoutNarrow.js b/src/pages/signin/SignInPageLayout/SignInPageLayoutNarrow.js index bccd8926e8ad..d9bc4c8351ae 100644 --- a/src/pages/signin/SignInPageLayout/SignInPageLayoutNarrow.js +++ b/src/pages/signin/SignInPageLayout/SignInPageLayoutNarrow.js @@ -9,24 +9,21 @@ import variables from '../../../styles/variables'; import ExpensifyCashLogo from '../../../../assets/images/expensify-cash.svg'; import welcomeScreenshot from '../../../../assets/images/welcome-screenshot.png'; import TermsAndLicenses from '../TermsAndLicenses'; -import {windowDimensionsPropTypes} from '../../../components/withWindowDimensions'; import WelcomeText from '../../../components/WelcomeText'; const propTypes = { - ...windowDimensionsPropTypes, - // The children to show inside the layout children: PropTypes.node.isRequired, // Whether we should show the welcome elements - showWelcomeText: PropTypes.Boolean, - showWelcomeScreenshot: PropTypes.Boolean, + shouldShowWelcomeText: PropTypes.Boolean, + shouldShowWelcomeScreenshot: PropTypes.Boolean, }; const defaultProps = { - showWelcomeText: true, - showWelcomeScreenshot: true, + shouldShowWelcomeText: true, + shouldShowWelcomeScreenshot: true, }; const SignInPageLayoutNarrow = props => ( @@ -43,10 +40,10 @@ const SignInPageLayoutNarrow = props => ( - + {props.children} - {props.showWelcomeScreenshot + {props.shouldShowWelcomeScreenshot && ( ( )} - {props.showWelcomeText && } + {props.shouldShowWelcomeText && } diff --git a/src/pages/signin/SignInPageLayout/SignInPageLayoutWide.js b/src/pages/signin/SignInPageLayout/SignInPageLayoutWide.js index 31e2e4c74c26..ebc2cda5c9df 100644 --- a/src/pages/signin/SignInPageLayout/SignInPageLayoutWide.js +++ b/src/pages/signin/SignInPageLayout/SignInPageLayoutWide.js @@ -14,13 +14,13 @@ const propTypes = { // The children to show inside the layout children: PropTypes.node.isRequired, - // Whether we should show the welcome elements + // Whether we should show the welcome text // (the welcome screenshot always displays on wide views) - showWelcomeText: PropTypes.Boolean, + shouldShowWelcomeText: PropTypes.Boolean, }; const defaultProps = { - showWelcomeText: true, + shouldShowWelcomeText: true, }; const SignInPageLayoutWide = props => ( @@ -45,10 +45,10 @@ const SignInPageLayoutWide = props => ( Expensify.cash - + {props.children} - {props.showWelcomeText + {props.shouldShowWelcomeText && ( diff --git a/src/styles/styles.js b/src/styles/styles.js index 22b13cd5e8db..94b625b48bed 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -396,7 +396,7 @@ const styles = { width: '100%', }, - loginFormContainer: { + signInPageFormContainer: { maxWidth: 295, width: '100%', }, From 636437e7fe5e8d7b9efcd2eac6555d6027aa67bb Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Mon, 5 Apr 2021 08:09:28 +0800 Subject: [PATCH 131/380] remove unused wrapper --- src/pages/signin/LoginForm/LoginFormWide.js | 64 ++++++++++----------- 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/src/pages/signin/LoginForm/LoginFormWide.js b/src/pages/signin/LoginForm/LoginFormWide.js index ad1f206eeeb5..13ab39458af4 100644 --- a/src/pages/signin/LoginForm/LoginFormWide.js +++ b/src/pages/signin/LoginForm/LoginFormWide.js @@ -57,41 +57,39 @@ class LoginFormWide extends React.Component { render() { return ( <> - - - Enter your phone or email: - this.setState({login: text})} - onSubmitEditing={this.validateAndSubmitForm} - autoCapitalize="none" - placeholder="Phone or Email" - autoFocus - /> - - - - + + Enter your phone or email: + this.setState({login: text})} + onSubmitEditing={this.validateAndSubmitForm} + autoCapitalize="none" + placeholder="Phone or Email" + autoFocus + /> + + + + - {this.state.formError && ( - - {this.state.formError} - - )} + {this.state.formError && ( + + {this.state.formError} + + )} - {!_.isEmpty(this.props.account.error) && ( - - {this.props.account.error} - - )} - + {!_.isEmpty(this.props.account.error) && ( + + {this.props.account.error} + + )} ); } From a66fd15b8fd63cfc8dd5e9938fca7b2018ae76d4 Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Mon, 5 Apr 2021 20:38:15 +0300 Subject: [PATCH 132/380] refactor: Simplify and enhance CreateMenu Sometimes the selected item need to be used to trigger an action before the popup closes. Calling `props.onItemSelected` with the pressed item serves for that purpose while existing workflows are unaffected --- src/components/CreateMenu.js | 43 +++++++++++++----------------------- 1 file changed, 15 insertions(+), 28 deletions(-) diff --git a/src/components/CreateMenu.js b/src/components/CreateMenu.js index 0ce157eaf3a0..3683956b9929 100644 --- a/src/components/CreateMenu.js +++ b/src/components/CreateMenu.js @@ -21,7 +21,7 @@ const propTypes = { PropTypes.shape({ icon: PropTypes.func.isRequired, text: PropTypes.string.isRequired, - onSelected: PropTypes.func.isRequired, + onSelected: PropTypes.func, }), ).isRequired, @@ -30,24 +30,18 @@ const propTypes = { class CreateMenu extends PureComponent { constructor(props) { super(props); - this.onModalHide = () => {}; - this.setOnModalHide = this.setOnModalHide.bind(this); - this.resetOnModalHide = this.resetOnModalHide.bind(this); + this.triggerSelectedItem = this.triggerSelectedItem.bind(this); } /** - * Sets a new function to execute when the modal hides - * @param {Function} callback The function to be called on modal hide + * Trigger the selected item `onSelected` callback when the modal closes */ - setOnModalHide(callback) { - this.onModalHide = callback; - } + triggerSelectedItem() { + if (this.selectedItem && this.selectedItem.onSelected) { + this.selectedItem.onSelected(); + } - /** - * After the modal hides, reset the onModalHide to an empty function - */ - resetOnModalHide() { - this.onModalHide = () => {}; + this.selectedItem = null; } render() { @@ -55,25 +49,18 @@ class CreateMenu extends PureComponent { { - this.onModalHide(); - this.resetOnModalHide(); - }} + onModalHide={this.triggerSelectedItem} anchorPosition={styles.createMenuPosition} > - {this.props.menuItems.map(({ - icon, - text, - onSelected = () => {}, - }) => ( + {this.props.menuItems.map(item => ( { - this.props.onItemSelected(); - this.setOnModalHide(onSelected); + this.props.onItemSelected(item); + this.selectedItem = item; }} /> ))} From 9960db7a3e19763a6dfd2dd7b5a658c29924bd18 Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Mon, 5 Apr 2021 20:42:08 +0300 Subject: [PATCH 133/380] fix: ReportActionCompose mWeb attachment picker does not appear Safari, mobile Safari and mobile Chrome, do not show the attachment picker because the button that is pressed disappears right away because it's inside the CreateMenu popup Keeping the button that will be triggered when `openPicker` is called mounted By not closing the CreateMenu ahead of time --- src/pages/home/report/ReportActionCompose.js | 35 ++++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index 85eb443286c1..9f15b1db0b96 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -1,3 +1,4 @@ +/* eslint-disable no-use-before-define */ import React from 'react'; import PropTypes from 'prop-types'; import {View, TouchableOpacity} from 'react-native'; @@ -217,20 +218,18 @@ class ReportActionCompose extends React.Component { this.setMenuVisibility(false)} - onItemSelected={() => this.setMenuVisibility(false)} - menuItems={[ - { - icon: Paperclip, - text: 'Upload Photo', - onSelected: () => { - setTimeout(() => { - openPicker({ - onPicked: file => displayFileInModal({file}), - }); - }, 10); - }, - }, - ]} + onItemSelected={(item) => { + if (item.text === CREATE_MENU_ITEMS.ATTACHMENT.text) { + setTimeout(() => { + openPicker({ + onPicked: file => displayFileInModal({file}), + }); + + this.setMenuVisibility(false); + }, 10); + } + }} + menuItems={Object.values(CREATE_MENU_ITEMS)} /** * Temporarily hiding IOU Modal options while Modal is incomplete. Will @@ -300,6 +299,14 @@ class ReportActionCompose extends React.Component { } } +const CREATE_MENU_ITEMS = { + ATTACHMENT: { + icon: Paperclip, + text: 'Upload Photo', + onSelected: () => {}, + }, +}; + ReportActionCompose.propTypes = propTypes; ReportActionCompose.defaultProps = defaultProps; From 7795d84749dd9dab29676df04c3fc69a7deb9c3d Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Mon, 5 Apr 2021 21:11:03 +0300 Subject: [PATCH 134/380] fix: AttachmentPicker web uploading the same file does not work Related to #1159 --- src/components/AttachmentPicker/index.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/components/AttachmentPicker/index.js b/src/components/AttachmentPicker/index.js index 3f2b648f57ef..bd6db436db4f 100644 --- a/src/components/AttachmentPicker/index.js +++ b/src/components/AttachmentPicker/index.js @@ -35,11 +35,18 @@ class AttachmentPicker extends React.Component { this.fileInput = el} onChange={(e) => { const file = e.target.files[0]; - file.uri = URL.createObjectURL(file); - this.onPicked(file); + + if (file) { + file.uri = URL.createObjectURL(file); + this.onPicked(file); + } + + // Cleanup after selecting a file to start from a fresh state + this.fileInput.value = null; }} /> {this.props.children({ From f8dd28af6876445b25bcb8ea462b6048d65b6e50 Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Mon, 5 Apr 2021 11:53:21 -0700 Subject: [PATCH 135/380] validate login when using v/accountID/validateCode url in e.cash --- src/ROUTES.js | 4 +- src/libs/API.js | 78 +++++++++++-------- .../Navigation/AppNavigator/PublicScreens.js | 6 ++ src/libs/Navigation/linkingConfig.js | 3 +- src/libs/actions/Session.js | 1 + src/libs/actions/User.js | 39 ++++++++++ src/pages/signin/SignInPage.js | 18 +++++ 7 files changed, 115 insertions(+), 34 deletions(-) diff --git a/src/ROUTES.js b/src/ROUTES.js index 0fe51bf894f1..bdd1f496d63a 100644 --- a/src/ROUTES.js +++ b/src/ROUTES.js @@ -17,8 +17,10 @@ export default { IOU_BILL: 'iou/split', SEARCH: 'search', SIGNIN: 'signin', - SET_PASSWORD_WITH_VALIDATE_CODE: 'setpassword/:validateCode', + SET_PASSWORD_WITH_CODE: 'setpassword/:validateCode', DETAILS: 'details', DETAILS_WITH_LOGIN: 'details/:login', getDetailsRoute: login => `details/${login}`, + VALIDATE_LOGIN: 'v', + VALIDATE_LOGIN_WITH_CODE: 'v/:accountID/:validateCode', }; diff --git a/src/libs/API.js b/src/libs/API.js index 36a1786b4d89..488fe92db9b8 100644 --- a/src/libs/API.js +++ b/src/libs/API.js @@ -34,6 +34,7 @@ function isAuthTokenRequired(command) { 'SetPassword', 'User_SignUp', 'ResendValidateCode', + 'ValidateEmail', ], command); } @@ -399,6 +400,17 @@ function GetAccountStatus(parameters) { return Network.post(commandName, parameters); } +/** + * @param {Object} parameters + * @param {String} parameters.debtorEmail + * @returns {Promise} + */ +function GetIOUReport(parameters) { + const commandName = 'GetIOUReport'; + requireParameters(['debtorEmail'], parameters, commandName); + return Network.post(commandName, parameters); +} + /** * @returns {Promise} */ @@ -424,6 +436,22 @@ function Log(parameters) { return Network.post(commandName, {...parameters, forceNetworkRequest: true}); } +/** + * @param {Object} parameters + * @param {String[]} data + * @returns {Promise} + */ +function Mobile_GetConstants(parameters) { + const commandName = 'Mobile_GetConstants'; + requireParameters(['data'], parameters, commandName); + + // For some reason, the Mobile_GetConstants endpoint requires a JSON string, so we need to stringify the data param + const finalParameters = parameters; + finalParameters.data = JSON.stringify(parameters.data); + + return Network.post(commandName, finalParameters); +} + /** * @param {Object} parameters * @param {String} parameters.name @@ -538,6 +566,18 @@ function ResendValidateCode(parameters) { return Network.post(commandName, parameters); } +/** + * @param {Object} parameters + * @param {String} parameters.name + * @param {String} parameters.value + * @returns {Promise} + */ +function SetNameValuePair(parameters) { + const commandName = 'SetNameValuePair'; + requireParameters(['name', 'value'], parameters, commandName); + return Network.post(commandName, parameters); +} + /** * @param {Object} parameters * @param {String} parameters.password @@ -593,40 +633,13 @@ function User_UploadAvatar(parameters) { /** * @param {Object} parameters - * @param {String} parameters.name - * @param {String} parameters.value - * @returns {Promise} - */ -function SetNameValuePair(parameters) { - const commandName = 'SetNameValuePair'; - requireParameters(['name', 'value'], parameters, commandName); - return Network.post(commandName, parameters); -} - -/** - * @param {Object} parameters - * @param {String[]} data - * @returns {Promise} - */ -function Mobile_GetConstants(parameters) { - const commandName = 'Mobile_GetConstants'; - requireParameters(['data'], parameters, commandName); - - // For some reason, the Mobile_GetConstants endpoint requires a JSON string, so we need to stringify the data param - const finalParameters = parameters; - finalParameters.data = JSON.stringify(parameters.data); - - return Network.post(commandName, finalParameters); -} - -/** - * @param {Object} parameters - * @param {String} parameters.debtorEmail + * @param {Number} parameters.accountID + * @param {String} parameters.validateCode * @returns {Promise} */ -function GetIOUReport(parameters) { - const commandName = 'GetIOUReport'; - requireParameters(['debtorEmail'], parameters, commandName); +function ValidateEmail(parameters) { + const commandName = 'ValidateEmail'; + requireParameters(['accountID', 'validateCode'], parameters, commandName); return Network.post(commandName, parameters); } @@ -660,4 +673,5 @@ export { User_SecondaryLogin_Send, User_UploadAvatar, reauthenticate, + ValidateEmail, }; diff --git a/src/libs/Navigation/AppNavigator/PublicScreens.js b/src/libs/Navigation/AppNavigator/PublicScreens.js index 141695a74ff5..47b32fd359ab 100644 --- a/src/libs/Navigation/AppNavigator/PublicScreens.js +++ b/src/libs/Navigation/AppNavigator/PublicScreens.js @@ -19,6 +19,12 @@ export default () => ( options={defaultScreenOptions} component={SignInPage} /> + {/* If we have a validation code but we're unauthenticated, route to the signin page */} + sessionAuthToken = val ? val.authToken : '', +}); /** * Changes a password for a given account @@ -103,6 +110,37 @@ function setSecondaryLogin(login, password) { }); } +/** + * Validates a login given an accountID and validation code + * + * @param {Number} accountID + * @param {String} validateCode + * @returns {Promise} + * + */ +function validateLogin(accountID, validateCode) { + Onyx.merge(ONYXKEYS.ACCOUNT, {error: '', loading: true}); + + return API.ValidateEmail({ + accountID, + validateCode, + }).then((response) => { + if (response.jsonCode === 200) { + const {authToken, email} = response; + if (!sessionAuthToken) { + createTemporaryLogin(authToken, email); + } + } else { + const error = lodashGet(response, 'message', 'Unable to validate login.'); + Onyx.merge(ONYXKEYS.ACCOUNT, {error}); + } + return response; + }).finally((response) => { + Onyx.merge(ONYXKEYS.ACCOUNT, {loading: false}); + return response; + }); +} + export { changePassword, getBetas, @@ -110,4 +148,5 @@ export { resendValidateCode, setExpensifyNewsStatus, setSecondaryLogin, + validateLogin, }; diff --git a/src/pages/signin/SignInPage.js b/src/pages/signin/SignInPage.js index bcc0b34157d1..8be8eeca46a7 100644 --- a/src/pages/signin/SignInPage.js +++ b/src/pages/signin/SignInPage.js @@ -5,6 +5,7 @@ import { import PropTypes from 'prop-types'; import {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; +import lodashGet from 'lodash/get'; import ONYXKEYS from '../../ONYXKEYS'; import styles from '../../styles/styles'; import updateUnread from '../../libs/UnreadIndicatorUpdater/updateUnread/index'; @@ -13,6 +14,7 @@ import LoginForm from './LoginForm'; import PasswordForm from './PasswordForm'; import ResendValidationForm from './ResendValidationForm'; import TermsAndLicenses from './TermsAndLicenses'; +import {validateLogin} from '../../libs/actions/User'; const propTypes = { /* Onyx Props */ @@ -38,16 +40,32 @@ const propTypes = { // Error to display when there is a session error returned authToken: PropTypes.string, }), + + route: PropTypes.shape({ + params: PropTypes.shape({ + validateCode: PropTypes.string, + }), + }), }; const defaultProps = { account: {}, session: {}, credentials: {}, + route: { + params: {}, + }, }; class SignInPage extends Component { componentDidMount() { + // If we've redirected to the signin page with a validation code, validate the login + if (_.isMatch(this.props.route, {name: 'ValidateLogin'})) { + const accountID = Number(lodashGet(this.props.route, 'params.accountID', 0)); + const validateCode = lodashGet(this.props.route, 'params.validateCode', ''); + validateLogin(accountID, validateCode); + } + // Always reset the unread counter to zero on this page updateUnread(0); } From 211b24c6ef1490dc9247ea1657f4eaa0f43dbe60 Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Mon, 5 Apr 2021 12:11:53 -0700 Subject: [PATCH 136/380] update logins if we do have an a session authtoken --- src/libs/actions/User.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libs/actions/User.js b/src/libs/actions/User.js index d45c41368d2e..5df848e4577b 100644 --- a/src/libs/actions/User.js +++ b/src/libs/actions/User.js @@ -129,6 +129,8 @@ function validateLogin(accountID, validateCode) { const {authToken, email} = response; if (!sessionAuthToken) { createTemporaryLogin(authToken, email); + } else { + fetch(); } } else { const error = lodashGet(response, 'message', 'Unable to validate login.'); From 012a486aba8c4e1dbd1914fc2eed366e73a72fe7 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 5 Apr 2021 13:24:16 -0600 Subject: [PATCH 137/380] Remove refactor of PopoverWithMeasuredContent since I'm not touching it anymore --- src/components/PopoverWithMeasuredContent.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/PopoverWithMeasuredContent.js b/src/components/PopoverWithMeasuredContent.js index 7ef851912507..293be0b8f4c0 100644 --- a/src/components/PopoverWithMeasuredContent.js +++ b/src/components/PopoverWithMeasuredContent.js @@ -25,6 +25,10 @@ const propTypes = { horizontal: PropTypes.oneOf(_.values(CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL)), vertical: PropTypes.oneOf(_.values(CONST.MODAL.ANCHOR_ORIGIN_VERTICAL)), }), + + // A function with content to measure. This component will use this.props.children by default, + // but in the case the children are not displayed, the measurement will not work. + measureContent: PropTypes.func.isRequired, }; const defaultProps = { @@ -122,7 +126,7 @@ class PopoverWithMeasuredContent extends Component { {...this.props} anchorPosition={this.calculateAdjustedAnchorPosition()} > - {this.props.children} + {this.props.measureContent()} ) : ( From 2341ea7a762385e6d75aae30d2d47f999b05c2ee Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Mon, 5 Apr 2021 13:39:08 -0700 Subject: [PATCH 138/380] re-add erroneously removed jsdoc --- src/libs/API.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libs/API.js b/src/libs/API.js index 037ff2ef6505..1f62887c0916 100644 --- a/src/libs/API.js +++ b/src/libs/API.js @@ -580,6 +580,7 @@ function SetNameValuePair(parameters) { } /** + * @param {Object} parameters * @param {Number} parameters.email * @returns {Promise} */ From 9c4855d674164261ab77b5be1fe20e1616e97abf Mon Sep 17 00:00:00 2001 From: Joe Gambino Date: Mon, 5 Apr 2021 16:43:24 -0700 Subject: [PATCH 139/380] Get swipe functionality working with ImageZoom and ReactNativeModal --- src/components/AttachmentModal.js | 1 + src/components/ImageView/index.native.js | 21 +++++++++++++++++++++ src/styles/getModalStyles.js | 2 +- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/components/AttachmentModal.js b/src/components/AttachmentModal.js index 14b2de88e10b..58950deef3dd 100644 --- a/src/components/AttachmentModal.js +++ b/src/components/AttachmentModal.js @@ -102,6 +102,7 @@ class AttachmentModal extends PureComponent { isVisible={this.state.isModalOpen} backgroundColor={themeColors.componentBG} onModalHide={this.props.onModalHide} + propagateSwipe={true} > { + console.log(e); + if (e.nativeEvent.touches.length === 2 || this.scaleValue !== 1) { + console.log(`joetest true. scale: ${this.scaleValue}`); + return true; + } else { + console.log(`joetest false. scale: ${this.scaleValue}`); + return false; + } + }} + onMove={({scale}) => { + console.log(`joetest moving. scale: ${scale}`); + this.scaleValue = scale; + }} > { // The default swipe direction is swipeDown and by // setting this to undefined we effectively disable the // ability to swipe our modal - swipeDirection = undefined; + swipeDirection = ['down']; animationIn = isSmallScreenWidth ? 'slideInRight' : 'fadeIn'; animationOut = isSmallScreenWidth ? 'slideOutRight' : 'fadeOut'; shouldAddTopSafeAreaPadding = true; From 9d86b70807bae3c2881b894de8f1d44d7cb9067b Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Mon, 5 Apr 2021 18:28:34 -0700 Subject: [PATCH 140/380] validate login when routed to AuthScreens.js --- src/libs/Navigation/AppNavigator/AuthScreens.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.js b/src/libs/Navigation/AppNavigator/AuthScreens.js index 948bac85a5e2..0c156b6480ac 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.js +++ b/src/libs/Navigation/AppNavigator/AuthScreens.js @@ -44,11 +44,13 @@ const RootStack = createCustomModalStackNavigator(); const propTypes = { network: PropTypes.shape({isOffline: PropTypes.bool}), + currentURL: PropTypes.string, ...windowDimensionsPropTypes, }; const defaultProps = { network: {isOffline: true}, + currentURL: '', }; class AuthScreens extends React.Component { @@ -68,6 +70,13 @@ class AuthScreens extends React.Component { authEndpoint: `${CONFIG.EXPENSIFY.URL_API_ROOT}api?command=Push_Authenticate`, }).then(subscribeToReportCommentEvents); + // If we have a validation code in our URL ensure we validate the associated login + if (this.props.currentURL.includes(`/${ROUTES.VALIDATE_LOGIN}/`)) { + // Split the /v/accountID/validateCode URL string into distinct components "", "v", "accountID", "validateCode" + const urlArray = this.props.currentURL.split('/'); + User.validateLogin(Number(urlArray[2]), urlArray[3]); + } + // Fetch some data we need on initialization NameValuePair.get(CONST.NVP.PRIORITY_MODE, ONYXKEYS.NVP_PRIORITY_MODE, 'default'); PersonalDetails.fetch(); @@ -191,5 +200,8 @@ export default compose( network: { key: ONYXKEYS.NETWORK, }, + currentURL: { + key: ONYXKEYS.CURRENT_URL, + }, }), )(AuthScreens); From d472650d7d5e7d6b0f4086df12bb04f15173638a Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Mon, 5 Apr 2021 18:35:58 -0700 Subject: [PATCH 141/380] line length --- src/libs/Navigation/AppNavigator/AuthScreens.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.js b/src/libs/Navigation/AppNavigator/AuthScreens.js index 0c156b6480ac..f79e089e90a4 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.js +++ b/src/libs/Navigation/AppNavigator/AuthScreens.js @@ -72,7 +72,8 @@ class AuthScreens extends React.Component { // If we have a validation code in our URL ensure we validate the associated login if (this.props.currentURL.includes(`/${ROUTES.VALIDATE_LOGIN}/`)) { - // Split the /v/accountID/validateCode URL string into distinct components "", "v", "accountID", "validateCode" + // Split the /v/accountID/validateCode URL string into distinct components + // "", "v", "accountID", "validateCode" const urlArray = this.props.currentURL.split('/'); User.validateLogin(Number(urlArray[2]), urlArray[3]); } From 12ec88fa8b6e1b3bb8d8730fe64c1e4cbc916327 Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Mon, 5 Apr 2021 19:15:30 -0700 Subject: [PATCH 142/380] redirect to settings page if user is already authenticated when clicking on their validation link --- src/libs/actions/User.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/libs/actions/User.js b/src/libs/actions/User.js index 5df848e4577b..cee87a4f39d1 100644 --- a/src/libs/actions/User.js +++ b/src/libs/actions/User.js @@ -5,6 +5,8 @@ import ONYXKEYS from '../../ONYXKEYS'; import * as API from '../API'; import CONST from '../../CONST'; import {createTemporaryLogin} from './Session'; +import Navigation from '../Navigation/Navigation'; +import ROUTES from '../../ROUTES'; let sessionAuthToken = ''; Onyx.connect({ @@ -131,6 +133,7 @@ function validateLogin(accountID, validateCode) { createTemporaryLogin(authToken, email); } else { fetch(); + Navigation.navigate(ROUTES.SETTINGS_PROFILE); } } else { const error = lodashGet(response, 'message', 'Unable to validate login.'); From 3ede3ce533d634cc3ad2095a7e45dbecd2e5afc0 Mon Sep 17 00:00:00 2001 From: Tim Golen Date: Tue, 6 Apr 2021 10:00:51 -0600 Subject: [PATCH 143/380] Add method docs --- src/pages/settings/ProfilePage.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/pages/settings/ProfilePage.js b/src/pages/settings/ProfilePage.js index 08dba76485b3..4bcb59f8a838 100644 --- a/src/pages/settings/ProfilePage.js +++ b/src/pages/settings/ProfilePage.js @@ -111,6 +111,9 @@ class ProfilePage extends Component { })); } + /** + * Update the personal details on the server and in Onyx using an the personal details action + */ updatePersonalDetails() { const { firstName, @@ -132,6 +135,12 @@ class ProfilePage extends Component { }); } + /** + * Returns all the + * @param {Function} openPicker method that can be called to open a picker when a menu item + * is selected + * @returns {Object} + */ createMenuItems(openPicker) { const menuItems = [ { From 54a0047bb1ab2a3b3a4251f7a9d731d0e77082d1 Mon Sep 17 00:00:00 2001 From: Tim Golen Date: Tue, 6 Apr 2021 10:01:25 -0600 Subject: [PATCH 144/380] Rename checkbox callback prop --- src/components/Checkbox.js | 2 +- src/pages/settings/ProfilePage.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Checkbox.js b/src/components/Checkbox.js index 674240f3f2e6..fa5571bb3192 100644 --- a/src/components/Checkbox.js +++ b/src/components/Checkbox.js @@ -10,7 +10,7 @@ const propTypes = { isChecked: PropTypes.bool.isRequired, // A function that is called when the box/label is clicked on - onCheckboxClick: PropTypes.func.isRequired, + onClick: PropTypes.func.isRequired, // Text that appears next to check box label: PropTypes.string, diff --git a/src/pages/settings/ProfilePage.js b/src/pages/settings/ProfilePage.js index 4bcb59f8a838..1f1ea97ee25e 100644 --- a/src/pages/settings/ProfilePage.js +++ b/src/pages/settings/ProfilePage.js @@ -306,7 +306,7 @@ class ProfilePage extends Component { From 037dc18e4b59454b2bd4b30816479a430d237a1f Mon Sep 17 00:00:00 2001 From: Tim Golen Date: Tue, 6 Apr 2021 10:12:15 -0600 Subject: [PATCH 145/380] Finish renaming the callback prop --- src/components/Checkbox.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/Checkbox.js b/src/components/Checkbox.js index fa5571bb3192..54ca9b8d31c8 100644 --- a/src/components/Checkbox.js +++ b/src/components/Checkbox.js @@ -22,17 +22,17 @@ const defaultProps = { const Checkbox = ({ isChecked, - onCheckboxClick, + onClick, label, }) => ( - onCheckboxClick(!isChecked)}> + onClick(!isChecked)}> {label && ( - onCheckboxClick(!isChecked)}> + onClick(!isChecked)}> {label} From b88ba8b130801dac9e41b3f87b887cd95705995e Mon Sep 17 00:00:00 2001 From: Tim Golen Date: Tue, 6 Apr 2021 10:17:16 -0600 Subject: [PATCH 146/380] Fix proptype warnings --- src/pages/home/report/ReportActionContextMenu.js | 3 ++- src/pages/home/report/ReportActionPropTypes.js | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/pages/home/report/ReportActionContextMenu.js b/src/pages/home/report/ReportActionContextMenu.js index e667ba5c65f9..ea7063ec885b 100644 --- a/src/pages/home/report/ReportActionContextMenu.js +++ b/src/pages/home/report/ReportActionContextMenu.js @@ -76,7 +76,7 @@ const propTypes = { reportID: PropTypes.number.isRequired, // The report action this context menu is attached to. - reportAction: PropTypes.shape(ReportActionPropTypes).isRequired, + reportAction: PropTypes.shape(ReportActionPropTypes), // If true, this component will be a small, row-oriented menu that displays icons but not text. // If false, this component will be a larger, column-oriented menu that displays icons alongside text in each row. @@ -87,6 +87,7 @@ const propTypes = { }; const defaultProps = { + reportAction: {}, isMini: false, isVisible: false, }; diff --git a/src/pages/home/report/ReportActionPropTypes.js b/src/pages/home/report/ReportActionPropTypes.js index 84f216010caf..5e1efab8b3d7 100644 --- a/src/pages/home/report/ReportActionPropTypes.js +++ b/src/pages/home/report/ReportActionPropTypes.js @@ -4,17 +4,17 @@ import ReportActionFragmentPropTypes from './ReportActionFragmentPropTypes'; export default { // Name of the action e.g. ADDCOMMENT - actionName: PropTypes.string.isRequired, + actionName: PropTypes.string, // Person who created the action - person: PropTypes.arrayOf(ReportActionFragmentPropTypes).isRequired, + person: PropTypes.arrayOf(ReportActionFragmentPropTypes), // ID of the report action - sequenceNumber: PropTypes.number.isRequired, + sequenceNumber: PropTypes.number, // Unix timestamp - timestamp: PropTypes.number.isRequired, + timestamp: PropTypes.number, // report action message - message: PropTypes.arrayOf(ReportActionFragmentPropTypes).isRequired, + message: PropTypes.arrayOf(ReportActionFragmentPropTypes), }; From 1c86bf7de8cfda3d211fe58de43ab812cc71ddb1 Mon Sep 17 00:00:00 2001 From: Tim Golen Date: Tue, 6 Apr 2021 10:27:32 -0600 Subject: [PATCH 147/380] Refactor picker into its own component --- src/components/Picker/index.android.js | 35 +++++++++++++++++++ src/components/Picker/index.ios.js | 33 ++++++++++++++++++ src/components/Picker/index.js | 33 ++++++++++++++++++ src/components/Picker/pickerPropTypes.js | 43 ++++++++++++++++++++++++ src/pages/settings/PreferencesPage.js | 12 +++---- src/pages/settings/ProfilePage.js | 25 +++++--------- 6 files changed, 156 insertions(+), 25 deletions(-) create mode 100644 src/components/Picker/index.android.js create mode 100644 src/components/Picker/index.ios.js create mode 100644 src/components/Picker/index.js create mode 100644 src/components/Picker/pickerPropTypes.js diff --git a/src/components/Picker/index.android.js b/src/components/Picker/index.android.js new file mode 100644 index 000000000000..3fa3a775f35f --- /dev/null +++ b/src/components/Picker/index.android.js @@ -0,0 +1,35 @@ +import React from 'react'; +import RNPickerSelect from 'react-native-picker-select'; + +import * as pickerPropTypes from './pickerPropTypes'; +import styles from '../../styles/styles'; + +const Picker = ({ + onChange, + items, + useDisabledStyles, + placeholder, + value, + icon, +}) => ( + +); + +Picker.propTypes = pickerPropTypes.propTypes; +Picker.defaultProps = pickerPropTypes.defaultProps; +Picker.displayName = 'Picker'; + +export default Picker; diff --git a/src/components/Picker/index.ios.js b/src/components/Picker/index.ios.js new file mode 100644 index 000000000000..b014caf2db2a --- /dev/null +++ b/src/components/Picker/index.ios.js @@ -0,0 +1,33 @@ +import React from 'react'; +import RNPickerSelect from 'react-native-picker-select'; + +import styles from '../../styles/styles'; +import * as pickerPropTypes from './pickerPropTypes'; + +const Picker = ({ + onChange, + items, + useDisabledStyles, + placeholder, + value, + icon, +}) => ( + +); + +Picker.propTypes = pickerPropTypes.propTypes; +Picker.defaultProps = pickerPropTypes.defaultProps; +Picker.displayName = 'Picker'; + +export default Picker; diff --git a/src/components/Picker/index.js b/src/components/Picker/index.js new file mode 100644 index 000000000000..28b7deaada3f --- /dev/null +++ b/src/components/Picker/index.js @@ -0,0 +1,33 @@ +import React from 'react'; +import RNPickerSelect from 'react-native-picker-select'; + +import styles from '../../styles/styles'; +import * as pickerPropTypes from './pickerPropTypes'; + +const Picker = ({ + onChange, + items, + useDisabledStyles, + placeholder, + value, + icon, +}) => ( + +); + +Picker.propTypes = pickerPropTypes.propTypes; +Picker.defaultProps = pickerPropTypes.defaultProps; +Picker.displayName = 'Picker'; + +export default Picker; diff --git a/src/components/Picker/pickerPropTypes.js b/src/components/Picker/pickerPropTypes.js new file mode 100644 index 000000000000..c4347eaa5548 --- /dev/null +++ b/src/components/Picker/pickerPropTypes.js @@ -0,0 +1,43 @@ +import PropTypes from 'prop-types'; + +const propTypes = { + // A callback method that is called when the value changes and it received the selected value as an argument + onChange: PropTypes.func.isRequired, + + // Whether or not to show the disabled styles + useDisabledStyles: PropTypes.bool, + + // The items to display in the list of selections + items: PropTypes.arrayOf(PropTypes.shape({ + // The value of the item that is being selected + value: PropTypes.string.isRequired, + + // The text to display for the item + label: PropTypes.string.isRequired, + })).isRequired, + + // Something to show as the placeholder before something is selected + placeholder: PropTypes.shape({ + // The value of the placeholder item, usually an empty string + value: PropTypes.string, + + // The text to be displayed as the placeholder + label: PropTypes.string, + }), + + // The value that needs to be selected + value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), + + // An icon to display with the picker + icon: PropTypes.func.isRequired, +}; +const defaultProps = { + useDisabledStyles: false, + placeholder: {}, + value: null, +}; + +export { + propTypes, + defaultProps, +}; diff --git a/src/pages/settings/PreferencesPage.js b/src/pages/settings/PreferencesPage.js index 2837ecc02942..8c1a4d2d23c9 100644 --- a/src/pages/settings/PreferencesPage.js +++ b/src/pages/settings/PreferencesPage.js @@ -17,6 +17,7 @@ import {DownArrow} from '../../components/Icon/Expensicons'; import {setExpensifyNewsStatus} from '../../libs/actions/User'; import ScreenWrapper from '../../components/ScreenWrapper'; import Switch from '../../components/Switch'; +import Picker from '../../components/Picker'; const propTypes = { // The chat priority mode @@ -76,18 +77,13 @@ const PreferencesPage = ({priorityMode, user}) => ( Priority Mode - {/* empty object in placeholder below to prevent default */} - {/* placeholder from appearing as a selection option. */} - NameValuePair.set(CONST.NVP.PRIORITY_MODE, mode, ONYXKEYS.NVP_PRIORITY_MODE) } items={Object.values(priorityModes)} - style={styles.picker} - useNativeAndroidPickerStyle={false} - placeholder={{}} value={priorityMode} - Icon={() => } + icon={() => } /> diff --git a/src/pages/settings/ProfilePage.js b/src/pages/settings/ProfilePage.js index 1f1ea97ee25e..61f79bb92e2f 100644 --- a/src/pages/settings/ProfilePage.js +++ b/src/pages/settings/ProfilePage.js @@ -25,6 +25,7 @@ import Checkbox from '../../components/Checkbox'; import themeColors from '../../styles/themes/default'; import AttachmentPicker from '../../components/AttachmentPicker'; import CreateMenu from '../../components/CreateMenu'; +import Picker from '../../components/Picker'; const propTypes = { /* Onyx Props */ @@ -248,17 +249,15 @@ class ProfilePage extends Component { Preferred Pronouns - this.setState({pronouns, selfSelectedPronouns: ''})} + this.setState({pronouns, selfSelectedPronouns: ''})} items={this.pronounDropdownValues} - style={styles.picker} - useNativeAndroidPickerStyle={false} placeholder={{ value: '', label: 'Select your pronouns', }} value={this.state.pronouns} - Icon={() => } + icon={() => } /> {this.state.pronouns === CONST.PRONOUNS.SELF_SELECT && ( @@ -286,20 +285,12 @@ class ProfilePage extends Component { Timezone - this.setState({selectedTimezone})} + this.setState({selectedTimezone})} items={timezones} - style={this.state.isAutomaticTimezone ? { - ...styles.picker, - inputIOS: [styles.picker.inputIOS, styles.textInput, styles.disabledTextInput], - inputAndroid: [ - styles.picker.inputAndroid, styles.textInput, styles.disabledTextInput, - ], - inputWeb: [styles.picker.inputWeb, styles.textInput, styles.disabledTextInput], - } : styles.picker} - useNativeAndroidPickerStyle={false} + useDisabledStyles={this.state.isAutomaticTimezone} value={this.state.selectedTimezone} - Icon={() => } + icon={() => } disabled={this.state.isAutomaticTimezone} /> From f4ac8d0645da21fb7344e067a902823c303199f5 Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Tue, 6 Apr 2021 19:49:53 +0300 Subject: [PATCH 148/380] refactor: ReportActionCompose hide the menu when any item is selected --- src/pages/home/report/ReportActionCompose.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index 2b2fc01e850d..517ddd983d6b 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -234,9 +234,9 @@ class ReportActionCompose extends React.Component { openPicker({ onPicked: file => displayFileInModal({file}), }); - - this.setMenuVisibility(false); } + + this.setMenuVisibility(false); }} menuItems={Object.values(CREATE_MENU_ITEMS)} From f32bec4cbb5038bc5b65b8e7b7f8fb833d333fc3 Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Tue, 6 Apr 2021 19:58:11 +0300 Subject: [PATCH 149/380] refactor: ReportActionCompose restore menuItems original usage --- src/pages/home/report/ReportActionCompose.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index 517ddd983d6b..2a1758872b39 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -230,7 +230,7 @@ class ReportActionCompose extends React.Component { isVisible={this.state.isMenuVisible} onClose={() => this.setMenuVisibility(false)} onItemSelected={(item) => { - if (item.text === CREATE_MENU_ITEMS.ATTACHMENT.text) { + if (item.text === 'Upload Photo') { openPicker({ onPicked: file => displayFileInModal({file}), }); @@ -238,7 +238,13 @@ class ReportActionCompose extends React.Component { this.setMenuVisibility(false); }} - menuItems={Object.values(CREATE_MENU_ITEMS)} + menuItems={[ + { + icon: Paperclip, + text: 'Upload Photo', + onSelected: () => {}, + }, + ]} /** * Temporarily hiding IOU Modal options while Modal is incomplete. Will @@ -308,14 +314,6 @@ class ReportActionCompose extends React.Component { } } -const CREATE_MENU_ITEMS = { - ATTACHMENT: { - icon: Paperclip, - text: 'Upload Photo', - onSelected: () => {}, - }, -}; - ReportActionCompose.propTypes = propTypes; ReportActionCompose.defaultProps = defaultProps; From e4bdc92754623f48253879a36792074b94946c52 Mon Sep 17 00:00:00 2001 From: Tim Golen Date: Tue, 6 Apr 2021 11:09:20 -0600 Subject: [PATCH 150/380] DRY render logic --- src/components/Checkbox.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/components/Checkbox.js b/src/components/Checkbox.js index 54ca9b8d31c8..65433cb242af 100644 --- a/src/components/Checkbox.js +++ b/src/components/Checkbox.js @@ -27,17 +27,16 @@ const Checkbox = ({ }) => ( onClick(!isChecked)}> - - - - - {label && ( - onClick(!isChecked)}> + {label ? ( {label} - - )} + ) : ( + + + + )} + ); From d571a8772a7c03d7389bcd1dfeb57d4663c6ac46 Mon Sep 17 00:00:00 2001 From: Tim Golen Date: Tue, 6 Apr 2021 11:09:31 -0600 Subject: [PATCH 151/380] Remove unused component --- src/pages/settings/PreferencesPage.js | 1 - src/pages/settings/ProfilePage.js | 1 - 2 files changed, 2 deletions(-) diff --git a/src/pages/settings/PreferencesPage.js b/src/pages/settings/PreferencesPage.js index 8c1a4d2d23c9..2d7668b86d95 100644 --- a/src/pages/settings/PreferencesPage.js +++ b/src/pages/settings/PreferencesPage.js @@ -1,6 +1,5 @@ import React from 'react'; import {View} from 'react-native'; -import RNPickerSelect from 'react-native-picker-select'; import {withOnyx} from 'react-native-onyx'; import PropTypes from 'prop-types'; diff --git a/src/pages/settings/ProfilePage.js b/src/pages/settings/ProfilePage.js index 61f79bb92e2f..57be0b0902fa 100644 --- a/src/pages/settings/ProfilePage.js +++ b/src/pages/settings/ProfilePage.js @@ -6,7 +6,6 @@ import { TextInput, Pressable, } from 'react-native'; -import RNPickerSelect from 'react-native-picker-select'; import Str from 'expensify-common/lib/str'; import moment from 'moment-timezone'; import HeaderWithCloseButton from '../../components/HeaderWithCloseButton'; From 526be38375910e72eea576a0dce8963497ecc7e3 Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Tue, 6 Apr 2021 20:09:47 +0300 Subject: [PATCH 152/380] refactor: CreateMenu revert `onSelected` to required prop --- src/components/CreateMenu.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/CreateMenu.js b/src/components/CreateMenu.js index 3683956b9929..d09bb6653f99 100644 --- a/src/components/CreateMenu.js +++ b/src/components/CreateMenu.js @@ -21,7 +21,7 @@ const propTypes = { PropTypes.shape({ icon: PropTypes.func.isRequired, text: PropTypes.string.isRequired, - onSelected: PropTypes.func, + onSelected: PropTypes.func.isRequired, }), ).isRequired, @@ -37,7 +37,7 @@ class CreateMenu extends PureComponent { * Trigger the selected item `onSelected` callback when the modal closes */ triggerSelectedItem() { - if (this.selectedItem && this.selectedItem.onSelected) { + if (this.selectedItem) { this.selectedItem.onSelected(); } From ff00697c7dc812adcd203904715fe133d7df34c2 Mon Sep 17 00:00:00 2001 From: Tim Golen Date: Tue, 6 Apr 2021 11:16:41 -0600 Subject: [PATCH 153/380] Add more method docs --- src/pages/settings/ProfilePage.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/pages/settings/ProfilePage.js b/src/pages/settings/ProfilePage.js index 57be0b0902fa..997bda096fc4 100644 --- a/src/pages/settings/ProfilePage.js +++ b/src/pages/settings/ProfilePage.js @@ -104,6 +104,11 @@ class ProfilePage extends Component { this.createMenuItems = this.createMenuItems.bind(this); } + /** + * Update the setting in the state for using automatic timezones + * + * @param {Boolean} isAutomaticTimezone + */ setAutomaticTimezone(isAutomaticTimezone) { this.setState(({selectedTimezone}) => ({ isAutomaticTimezone, @@ -136,7 +141,8 @@ class ProfilePage extends Component { } /** - * Returns all the + * Returns all the items for the picker + * * @param {Function} openPicker method that can be called to open a picker when a menu item * is selected * @returns {Object} From beb40ee40b544cbe5b7697d15fc0b0ba42c7c3c3 Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Tue, 6 Apr 2021 20:18:20 +0300 Subject: [PATCH 154/380] refactor: AttachmentPicker remove the accept attribute - unneeded --- src/components/AttachmentPicker/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/AttachmentPicker/index.js b/src/components/AttachmentPicker/index.js index c0be8621db32..8a81a9d4f8ed 100644 --- a/src/components/AttachmentPicker/index.js +++ b/src/components/AttachmentPicker/index.js @@ -15,7 +15,6 @@ class AttachmentPicker extends React.Component { this.fileInput = el} onChange={(e) => { const file = e.target.files[0]; From 0a1823c1c074c07ed3b862c6d335f063f82ab609 Mon Sep 17 00:00:00 2001 From: Tim Golen Date: Tue, 6 Apr 2021 12:07:52 -0600 Subject: [PATCH 155/380] Revert the DRY changes for checkbox --- src/components/Checkbox.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/components/Checkbox.js b/src/components/Checkbox.js index 65433cb242af..54ca9b8d31c8 100644 --- a/src/components/Checkbox.js +++ b/src/components/Checkbox.js @@ -27,16 +27,17 @@ const Checkbox = ({ }) => ( onClick(!isChecked)}> - {label ? ( + + + + + {label && ( + onClick(!isChecked)}> {label} - ) : ( - - - - )} - + + )} ); From 5a62d87f2713ce2104ddbe69f20690a659c14e09 Mon Sep 17 00:00:00 2001 From: Tim Golen Date: Tue, 6 Apr 2021 14:59:49 -0600 Subject: [PATCH 156/380] Rename files to match conventions --- src/libs/Navigation/AppNavigator/ModalStackNavigators.js | 2 +- src/pages/settings/{ProfilePage => Profile}/LoginField.js | 0 .../settings/{ProfilePage/index.js => Profile/ProfilePage.js} | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename src/pages/settings/{ProfilePage => Profile}/LoginField.js (100%) rename src/pages/settings/{ProfilePage/index.js => Profile/ProfilePage.js} (99%) diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators.js b/src/libs/Navigation/AppNavigator/ModalStackNavigators.js index d2e1c605ae9f..07fd0068e58a 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators.js +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators.js @@ -9,7 +9,7 @@ import DetailsPage from '../../../pages/DetailsPage'; import IOURequestPage from '../../../pages/iou/IOURequestPage'; import IOUBillPage from '../../../pages/iou/IOUBillPage'; import SettingsInitialPage from '../../../pages/settings/InitialPage'; -import SettingsProfilePage from '../../../pages/settings/ProfilePage'; +import SettingsProfilePage from '../../../pages/settings/Profile/ProfilePage'; import SettingsPreferencesPage from '../../../pages/settings/PreferencesPage'; import SettingsPasswordPage from '../../../pages/settings/PasswordPage'; import SettingsPaymentsPage from '../../../pages/settings/PaymentsPage'; diff --git a/src/pages/settings/ProfilePage/LoginField.js b/src/pages/settings/Profile/LoginField.js similarity index 100% rename from src/pages/settings/ProfilePage/LoginField.js rename to src/pages/settings/Profile/LoginField.js diff --git a/src/pages/settings/ProfilePage/index.js b/src/pages/settings/Profile/ProfilePage.js similarity index 99% rename from src/pages/settings/ProfilePage/index.js rename to src/pages/settings/Profile/ProfilePage.js index 0b024b0c5cc6..7a46c2134dce 100644 --- a/src/pages/settings/ProfilePage/index.js +++ b/src/pages/settings/Profile/ProfilePage.js @@ -26,7 +26,7 @@ import LoginField from './LoginField'; import {DownArrow, Upload, Trashcan} from '../../../components/Icon/Expensicons'; import AttachmentPicker from '../../../components/AttachmentPicker'; import CreateMenu from '../../../components/CreateMenu'; -import Picker from '../../components/Picker'; +import Picker from '../../../components/Picker'; const propTypes = { /* Onyx Props */ From 3b87ba5db263c5ed8219dfabd372519674d1d98e Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Wed, 7 Apr 2021 00:26:17 +0300 Subject: [PATCH 157/380] refactor: extracted BaseCreateMenu component Native vs web/desktop implementation of the CreateMenu component On Safari and mobile browsers the attachment picker would not be triggered because `input.click()` is invoked after the CreateMenu is closed and `input` is consider destroyed this is why on Web we need to trigger the click before the CreateMenu closes On mobile native on the other hand triggering another modal needs to happen after CreateMenu closes otherwise the second modal wont appear --- .../BaseCreateMenu.js} | 30 +++++++++++++------ src/components/CreateMenu/index.js | 19 ++++++++++++ src/components/CreateMenu/index.native.js | 3 ++ 3 files changed, 43 insertions(+), 9 deletions(-) rename src/components/{CreateMenu.js => CreateMenu/BaseCreateMenu.js} (72%) create mode 100644 src/components/CreateMenu/index.js create mode 100644 src/components/CreateMenu/index.native.js diff --git a/src/components/CreateMenu.js b/src/components/CreateMenu/BaseCreateMenu.js similarity index 72% rename from src/components/CreateMenu.js rename to src/components/CreateMenu/BaseCreateMenu.js index d09bb6653f99..4f807016bf3f 100644 --- a/src/components/CreateMenu.js +++ b/src/components/CreateMenu/BaseCreateMenu.js @@ -1,10 +1,10 @@ import React, {PureComponent} from 'react'; import {View} from 'react-native'; import PropTypes from 'prop-types'; -import Popover from './Popover'; -import styles from '../styles/styles'; -import withWindowDimensions, {windowDimensionsPropTypes} from './withWindowDimensions'; -import MenuItem from './MenuItem'; +import Popover from '../Popover'; +import styles from '../../styles/styles'; +import withWindowDimensions, {windowDimensionsPropTypes} from '../withWindowDimensions'; +import MenuItem from '../MenuItem'; const propTypes = { // Callback to fire on request to modal close @@ -26,8 +26,16 @@ const propTypes = { ).isRequired, ...windowDimensionsPropTypes, + + // Trigger the item `onSelected` action immediately after press or after the modal hides + invokeActionImmediately: PropTypes.bool, +}; + +const defaultProps = { + invokeActionImmediately: false, }; -class CreateMenu extends PureComponent { + +class BaseCreateMenu extends PureComponent { constructor(props) { super(props); this.triggerSelectedItem = this.triggerSelectedItem.bind(this); @@ -60,7 +68,11 @@ class CreateMenu extends PureComponent { title={item.text} onPress={() => { this.props.onItemSelected(item); - this.selectedItem = item; + if (this.props.invokeActionImmediately) { + item.onSelected(); + } else { + this.selectedItem = item; + } }} /> ))} @@ -70,6 +82,6 @@ class CreateMenu extends PureComponent { } } -CreateMenu.propTypes = propTypes; -CreateMenu.displayName = 'CreateMenu'; -export default withWindowDimensions(CreateMenu); +BaseCreateMenu.propTypes = propTypes; +BaseCreateMenu.defaultProps = defaultProps; +export default withWindowDimensions(BaseCreateMenu); diff --git a/src/components/CreateMenu/index.js b/src/components/CreateMenu/index.js new file mode 100644 index 000000000000..16cf612f3759 --- /dev/null +++ b/src/components/CreateMenu/index.js @@ -0,0 +1,19 @@ +import React from 'react'; +import BaseCreateMenu from './BaseCreateMenu'; + +/** + * The web implementation of the menu needs to trigger actions before the popup closes + * When the modal is closed it's elements are destroyed + * Some browser will ignore interactions on elements that were removed or if the + * the action is not triggered immediately after a click + * This is a precaution against malicious scripts + * + * @param {Object} props + * @returns {React.ReactElement} + */ +function CreateMenu(props) { + // eslint-disable-next-line react/jsx-props-no-spreading + return ; +} + +export default CreateMenu; diff --git a/src/components/CreateMenu/index.native.js b/src/components/CreateMenu/index.native.js new file mode 100644 index 000000000000..dd6a1b4458d4 --- /dev/null +++ b/src/components/CreateMenu/index.native.js @@ -0,0 +1,3 @@ +import BaseCreateMenu from './BaseCreateMenu'; + +export default BaseCreateMenu; From 2988583bdd184f1ac35e5269f83fac80113e7fc8 Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Wed, 7 Apr 2021 00:27:19 +0300 Subject: [PATCH 158/380] refactor: ReportActionCompose restore original usage --- src/pages/home/report/ReportActionCompose.js | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index 2a1758872b39..0ca66aa56f23 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -229,20 +229,16 @@ class ReportActionCompose extends React.Component { this.setMenuVisibility(false)} - onItemSelected={(item) => { - if (item.text === 'Upload Photo') { - openPicker({ - onPicked: file => displayFileInModal({file}), - }); - } - - this.setMenuVisibility(false); - }} + onItemSelected={() => this.setMenuVisibility(false)} menuItems={[ { icon: Paperclip, text: 'Upload Photo', - onSelected: () => {}, + onSelected: () => { + openPicker({ + onPicked: file => displayFileInModal({file}), + }); + }, }, ]} From e6df1671f97ad80a45a6b7da6fd48112ef712f58 Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Wed, 7 Apr 2021 00:32:16 +0300 Subject: [PATCH 159/380] refactor: ProfilePage - update attachment picker usage --- src/pages/settings/ProfilePage/index.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/pages/settings/ProfilePage/index.js b/src/pages/settings/ProfilePage/index.js index 3eea6852c437..db6cb4881faa 100644 --- a/src/pages/settings/ProfilePage/index.js +++ b/src/pages/settings/ProfilePage/index.js @@ -193,11 +193,9 @@ class ProfilePage extends Component { icon: Upload, text: 'Upload Photo', onSelected: () => { - setTimeout(() => { - openPicker({ - onPicked: setAvatar, - }); - }, 10); + openPicker({ + onPicked: setAvatar, + }); }, }, ]; From c4c4b8b7c0d4b00311ac16df200148532b4c0f77 Mon Sep 17 00:00:00 2001 From: Joe Gambino Date: Tue, 6 Apr 2021 14:36:22 -0700 Subject: [PATCH 160/380] remove logs and refactor --- src/components/ImageView/index.native.js | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/src/components/ImageView/index.native.js b/src/components/ImageView/index.native.js index afa0349695f0..4ed99c0eb04e 100644 --- a/src/components/ImageView/index.native.js +++ b/src/components/ImageView/index.native.js @@ -29,10 +29,6 @@ class ImageView extends PureComponent { this.scaleValue = 1; } - joetest(vx, scale) { - console.log(`joetest vx: ${vx} scale: ${scale}`); - } - render() { // Default windowHeight accounts for the modal header height const windowHeight = this.props.windowHeight - variables.contentHeaderHeight; @@ -51,19 +47,8 @@ class ImageView extends PureComponent { cropHeight={windowHeight} imageWidth={this.state.imageWidth} imageHeight={this.state.imageHeight} - responderRelease={this.joetest} - onStartShouldSetPanResponder={(e) => { - console.log(e); - if (e.nativeEvent.touches.length === 2 || this.scaleValue !== 1) { - console.log(`joetest true. scale: ${this.scaleValue}`); - return true; - } else { - console.log(`joetest false. scale: ${this.scaleValue}`); - return false; - } - }} + onStartShouldSetPanResponder={e => e.nativeEvent.touches.length === 2 || this.scaleValue !== 1} onMove={({scale}) => { - console.log(`joetest moving. scale: ${scale}`); this.scaleValue = scale; }} > From c0a3c34e1afe38cb434e053df1e1be0ebd31dc99 Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Wed, 7 Apr 2021 00:36:56 +0300 Subject: [PATCH 161/380] docs: CreateMenu remove "when the modal closes" to avoid confusion --- src/components/CreateMenu/BaseCreateMenu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/CreateMenu/BaseCreateMenu.js b/src/components/CreateMenu/BaseCreateMenu.js index 4f807016bf3f..786509a25ded 100644 --- a/src/components/CreateMenu/BaseCreateMenu.js +++ b/src/components/CreateMenu/BaseCreateMenu.js @@ -42,7 +42,7 @@ class BaseCreateMenu extends PureComponent { } /** - * Trigger the selected item `onSelected` callback when the modal closes + * Trigger the selected item `onSelected` callback */ triggerSelectedItem() { if (this.selectedItem) { From d9b0eaffb94952b06103294cc58a192669c17cd6 Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Wed, 7 Apr 2021 00:40:13 +0300 Subject: [PATCH 162/380] refactor ReportActionCompose restore original usage and remove eslint comment --- src/pages/home/report/ReportActionCompose.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index 0ca66aa56f23..42879452601e 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -1,4 +1,3 @@ -/* eslint-disable no-use-before-define */ import React from 'react'; import PropTypes from 'prop-types'; import {View, TouchableOpacity} from 'react-native'; @@ -236,7 +235,9 @@ class ReportActionCompose extends React.Component { text: 'Upload Photo', onSelected: () => { openPicker({ - onPicked: file => displayFileInModal({file}), + onPicked: (file) => { + displayFileInModal({file}); + }, }); }, }, From 65d81dc8ae76cecdbdc0d7ef3bb5ec41b798b807 Mon Sep 17 00:00:00 2001 From: Joe Gambino Date: Tue, 6 Apr 2021 14:40:18 -0700 Subject: [PATCH 163/380] rename var --- src/components/ImageView/index.native.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/ImageView/index.native.js b/src/components/ImageView/index.native.js index a3c7f8558a6f..cb4874846492 100644 --- a/src/components/ImageView/index.native.js +++ b/src/components/ImageView/index.native.js @@ -26,7 +26,7 @@ class ImageView extends PureComponent { imageHeight: 100, }; - this.scaleValue = 1; + this.imageZoomScale = 1; } render() { @@ -47,9 +47,9 @@ class ImageView extends PureComponent { cropHeight={windowHeight} imageWidth={this.state.imageWidth} imageHeight={this.state.imageHeight} - onStartShouldSetPanResponder={e => e.nativeEvent.touches.length === 2 || this.scaleValue !== 1} + onStartShouldSetPanResponder={e => e.nativeEvent.touches.length === 2 || this.imageZoomScale !== 1} onMove={({scale}) => { - this.scaleValue = scale; + this.imageZoomScale = scale; }} > Date: Tue, 6 Apr 2021 15:29:56 -0700 Subject: [PATCH 164/380] update podfile.lock --- ios/Podfile.lock | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 352903821326..d332e3add8cb 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -402,6 +402,8 @@ PODS: - React-Core - RNCAsyncStorage (1.12.1): - React-Core + - RNCClipboard (1.5.1): + - React-Core - RNCMaskedView (0.1.10): - React - RNCPicker (1.9.11): @@ -489,6 +491,7 @@ DEPENDENCIES: - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - rn-fetch-blob (from `../node_modules/rn-fetch-blob`) - "RNCAsyncStorage (from `../node_modules/@react-native-community/async-storage`)" + - "RNCClipboard (from `../node_modules/@react-native-community/clipboard`)" - "RNCMaskedView (from `../node_modules/@react-native-community/masked-view`)" - "RNCPicker (from `../node_modules/@react-native-picker/picker`)" - "RNFBAnalytics (from `../node_modules/@react-native-firebase/analytics`)" @@ -599,6 +602,8 @@ EXTERNAL SOURCES: :path: "../node_modules/rn-fetch-blob" RNCAsyncStorage: :path: "../node_modules/@react-native-community/async-storage" + RNCClipboard: + :path: "../node_modules/@react-native-community/clipboard" RNCMaskedView: :path: "../node_modules/@react-native-community/masked-view" RNCPicker: @@ -681,6 +686,7 @@ SPEC CHECKSUMS: ReactCommon: 4167844018c9ed375cc01a843e9ee564399e53c3 rn-fetch-blob: f065bb7ab7fb48dd002629f8bdcb0336602d3cba RNCAsyncStorage: cb9a623793918c6699586281f0b51cbc38f046f9 + RNCClipboard: 5e299c6df8e0c98f3d7416b86ae563d3a9f768a3 RNCMaskedView: f5c7d14d6847b7b44853f7acb6284c1da30a3459 RNCPicker: 6780c753e9e674065db90d9c965920516402579d RNFBAnalytics: 2dc4dd9e2445faffca041b10447a23a71dcdabf8 From 707d37af64f46c8c1f25ed9b9e7ba105d657f47a Mon Sep 17 00:00:00 2001 From: Joe Gambino Date: Tue, 6 Apr 2021 16:02:13 -0700 Subject: [PATCH 165/380] try to fix double-tap regression --- src/components/ImageView/index.native.js | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/components/ImageView/index.native.js b/src/components/ImageView/index.native.js index cb4874846492..75957ada28a7 100644 --- a/src/components/ImageView/index.native.js +++ b/src/components/ImageView/index.native.js @@ -1,7 +1,7 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import {View} from 'react-native'; -import ImageZoom from 'react-native-image-pan-zoom'; +import ImageZoom, {ImageZoomProps} from 'react-native-image-pan-zoom'; import ImageWithSizeCalculation from '../ImageWithSizeCalculation'; import styles, {getWidthAndHeightStyle} from '../../styles/styles'; import variables from '../../styles/variables'; @@ -27,6 +27,8 @@ class ImageView extends PureComponent { }; this.imageZoomScale = 1; + this.doubleClickInterval = 1000; + this.lastClickTime = 0; } render() { @@ -47,7 +49,24 @@ class ImageView extends PureComponent { cropHeight={windowHeight} imageWidth={this.state.imageWidth} imageHeight={this.state.imageHeight} - onStartShouldSetPanResponder={e => e.nativeEvent.touches.length === 2 || this.imageZoomScale !== 1} + onStartShouldSetPanResponder={(e) => { + // Let ImageZoom handle the event if the tap is more than one touchPoint or if we are zoomed in + if (e.nativeEvent.touches.length === 2 || this.imageZoomScale !== 1) { + console.log(`joetest returning true case 1`); + return true; + } + + // If this isn't a double click, ignore the event to let the parent handle it + if (new Date().getTime() - this.lastClickTime >= (this.doubleClickInterval || 0)) { + console.log(`joetest returning false case 2. lastClickTime: ${this.lastClickTime}`); + this.lastClickTime = new Date().getTime(); + return false; + } + + // This is a double click, reset the lastClickTime and let ImageZoom handle the event + console.log(`joetest returning true case 3`); + return true; + }} onMove={({scale}) => { this.imageZoomScale = scale; }} From 607de412c0b0961819ddf31ecf06244e09f66e7b Mon Sep 17 00:00:00 2001 From: maftalion Date: Tue, 6 Apr 2021 18:17:53 -0700 Subject: [PATCH 166/380] update menu text --- src/pages/home/report/ReportActionCompose.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index 42879452601e..16595637d045 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -232,7 +232,7 @@ class ReportActionCompose extends React.Component { menuItems={[ { icon: Paperclip, - text: 'Upload Photo', + text: 'Add Attachment', onSelected: () => { openPicker({ onPicked: (file) => { From e56fc52428039db03493cdde11402b1fc5c61b4a Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Wed, 7 Apr 2021 12:41:47 +0300 Subject: [PATCH 167/380] refactor CreateMenu clearer action execution configuration --- src/components/CreateMenu/BaseCreateMenu.js | 43 +++++++++------------ src/components/CreateMenu/index.js | 2 +- 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/src/components/CreateMenu/BaseCreateMenu.js b/src/components/CreateMenu/BaseCreateMenu.js index 786509a25ded..5cf6a98c8651 100644 --- a/src/components/CreateMenu/BaseCreateMenu.js +++ b/src/components/CreateMenu/BaseCreateMenu.js @@ -25,31 +25,31 @@ const propTypes = { }), ).isRequired, - ...windowDimensionsPropTypes, + // Configures when menu item actions should be triggered: as soon as pressed or after the modal is closed + executeActionMode: PropTypes.oneOf(['ON_PRESS', 'AFTER_MODAL_CLOSE']), - // Trigger the item `onSelected` action immediately after press or after the modal hides - invokeActionImmediately: PropTypes.bool, + ...windowDimensionsPropTypes, }; const defaultProps = { - invokeActionImmediately: false, + executeActionMode: 'AFTER_MODAL_CLOSE', }; class BaseCreateMenu extends PureComponent { - constructor(props) { - super(props); - this.triggerSelectedItem = this.triggerSelectedItem.bind(this); - } + selectItem(item) { + this.props.onItemSelected(item); - /** - * Trigger the selected item `onSelected` callback - */ - triggerSelectedItem() { - if (this.selectedItem) { - this.selectedItem.onSelected(); + switch (this.props.executeActionMode) { + case 'ON_PRESS': + item.onSelected(); + this.onModalHide = () => {}; + break; + case 'AFTER_MODAL_CLOSE': + this.onModalHide = () => item.onSelected(); + break; + default: + throw new Error(`Unexpected "executeActionMode" prop value: ${this.props.executeActionMode}`); } - - this.selectedItem = null; } render() { @@ -57,7 +57,7 @@ class BaseCreateMenu extends PureComponent { @@ -66,14 +66,7 @@ class BaseCreateMenu extends PureComponent { key={item.text} icon={item.icon} title={item.text} - onPress={() => { - this.props.onItemSelected(item); - if (this.props.invokeActionImmediately) { - item.onSelected(); - } else { - this.selectedItem = item; - } - }} + onPress={() => this.selectItem(item)} /> ))} diff --git a/src/components/CreateMenu/index.js b/src/components/CreateMenu/index.js index 16cf612f3759..819bc779f0ae 100644 --- a/src/components/CreateMenu/index.js +++ b/src/components/CreateMenu/index.js @@ -13,7 +13,7 @@ import BaseCreateMenu from './BaseCreateMenu'; */ function CreateMenu(props) { // eslint-disable-next-line react/jsx-props-no-spreading - return ; + return ; } export default CreateMenu; From f7689660fea1b8a3b6be946d91626aa7ee16f42c Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Wed, 7 Apr 2021 13:09:51 +0300 Subject: [PATCH 168/380] refactor CreateMenu update prop name and add documentation --- src/components/CreateMenu/BaseCreateMenu.js | 16 +++++++++++----- src/components/CreateMenu/index.js | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/components/CreateMenu/BaseCreateMenu.js b/src/components/CreateMenu/BaseCreateMenu.js index 5cf6a98c8651..f5b34d78638f 100644 --- a/src/components/CreateMenu/BaseCreateMenu.js +++ b/src/components/CreateMenu/BaseCreateMenu.js @@ -25,21 +25,27 @@ const propTypes = { }), ).isRequired, - // Configures when menu item actions should be triggered: as soon as pressed or after the modal is closed - executeActionMode: PropTypes.oneOf(['ON_PRESS', 'AFTER_MODAL_CLOSE']), + /* Configures when menu item actions are triggered: as soon as pressed or after the modal is closed. + * On mobile native we need to wait for the modals to close, while on web as soon as clicked */ + actionExecutionStrategy: PropTypes.oneOf(['ON_PRESS', 'AFTER_MODAL_CLOSE']), ...windowDimensionsPropTypes, }; const defaultProps = { - executeActionMode: 'AFTER_MODAL_CLOSE', + actionExecutionStrategy: 'AFTER_MODAL_CLOSE', }; class BaseCreateMenu extends PureComponent { + /** + * Select an item and apply action execution strategy + * + * @param {object} item - an item from this.props.menuItems + */ selectItem(item) { this.props.onItemSelected(item); - switch (this.props.executeActionMode) { + switch (this.props.actionExecutionStrategy) { case 'ON_PRESS': item.onSelected(); this.onModalHide = () => {}; @@ -48,7 +54,7 @@ class BaseCreateMenu extends PureComponent { this.onModalHide = () => item.onSelected(); break; default: - throw new Error(`Unexpected "executeActionMode" prop value: ${this.props.executeActionMode}`); + throw new Error(`Unexpected "actionExecutionStrategy" value: ${this.props.actionExecutionStrategy}`); } } diff --git a/src/components/CreateMenu/index.js b/src/components/CreateMenu/index.js index 819bc779f0ae..b77c5623405c 100644 --- a/src/components/CreateMenu/index.js +++ b/src/components/CreateMenu/index.js @@ -13,7 +13,7 @@ import BaseCreateMenu from './BaseCreateMenu'; */ function CreateMenu(props) { // eslint-disable-next-line react/jsx-props-no-spreading - return ; + return ; } export default CreateMenu; From a52b371ca82a4abed4502e8a43cef1c239697b8c Mon Sep 17 00:00:00 2001 From: Ahtazaz Ahmed Khan Date: Thu, 8 Apr 2021 01:59:18 +0500 Subject: [PATCH 169/380] @react-navigation/drawer version update to 5.12.5. --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5c1ae578c7c2..ab0e1e84709d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3864,9 +3864,9 @@ } }, "@react-navigation/drawer": { - "version": "5.12.3", - "resolved": "https://registry.npmjs.org/@react-navigation/drawer/-/drawer-5.12.3.tgz", - "integrity": "sha512-I0aR/ULjFZcGick0u724YWxR0shTNhqctXdQnP7YFbOWML645EBS1LCtKgStfd9qd3sojHRSHIc7fReYa8bHfA==", + "version": "5.12.5", + "resolved": "https://registry.npmjs.org/@react-navigation/drawer/-/drawer-5.12.5.tgz", + "integrity": "sha512-WMfz/tKg/K7QBb5rhjXW/pho4zXh3OoHXnHETk5SuVzHlDPM7r84uvAeC5l+ySp5jmipLrJn3zL+kfv9+KKHZQ==", "requires": { "color": "^3.1.3", "react-native-iphone-x-helper": "^1.3.0" diff --git a/package.json b/package.json index 59ad97119902..69fe9dfc3754 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@react-native-firebase/app": "^8.4.5", "@react-native-firebase/crashlytics": "^8.4.9", "@react-native-picker/picker": "^1.9.11", - "@react-navigation/drawer": "5.12.3", + "@react-navigation/drawer": "5.12.5", "@react-navigation/native": "5.9.2", "@react-navigation/stack": "5.14.2", "babel-plugin-transform-remove-console": "^6.9.4", From 19253b94d9b3e2dfa86d205451307bb944158527 Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Wed, 7 Apr 2021 18:59:30 -0700 Subject: [PATCH 170/380] modify validateLogin logic to go through ValidateLoginPage.js --- src/ROUTES.js | 2 +- .../Navigation/AppNavigator/AuthScreens.js | 34 ++++++++++--------- .../Navigation/AppNavigator/PublicScreens.js | 4 +-- src/libs/Navigation/linkingConfig.js | 4 +-- src/libs/actions/User.js | 25 +++++++------- src/pages/SetPasswordPage.js | 12 ++----- src/pages/ValidateLoginPage.js | 33 ++++++++++++++++++ src/pages/routePropTypes.js | 10 ++++++ src/pages/settings/PaymentsPage.js | 4 +-- src/pages/signin/SignInPage.js | 18 ---------- 10 files changed, 83 insertions(+), 63 deletions(-) create mode 100644 src/pages/ValidateLoginPage.js create mode 100644 src/pages/routePropTypes.js diff --git a/src/ROUTES.js b/src/ROUTES.js index 5f44080ef912..6b8c522933f7 100644 --- a/src/ROUTES.js +++ b/src/ROUTES.js @@ -24,5 +24,5 @@ export default { DETAILS_WITH_LOGIN: 'details/:login', getDetailsRoute: login => `details/${login}`, VALIDATE_LOGIN: 'v', - VALIDATE_LOGIN_WITH_CODE: 'v/:accountID/:validateCode', + VALIDATE_LOGIN_WITH_VALIDATE_CODE: 'v/:accountID/:validateCode', }; diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.js b/src/libs/Navigation/AppNavigator/AuthScreens.js index 00eba1184163..c3ba09ad47ff 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.js +++ b/src/libs/Navigation/AppNavigator/AuthScreens.js @@ -30,6 +30,9 @@ import createCustomModalStackNavigator from './createCustomModalStackNavigator'; // Main drawer navigator import MainDrawerNavigator from './MainDrawerNavigator'; +// Validate login page +import ValidateLoginPage from '../../../pages/ValidateLoginPage'; + // Modal Stack Navigators import { IOUBillStackNavigator, @@ -55,14 +58,16 @@ const modalScreenListeners = { }; const propTypes = { - network: PropTypes.shape({isOffline: PropTypes.bool}), - currentURL: PropTypes.string, + // Information about the network + network: PropTypes.shape({ + // Is the network currently offline or not + isOffline: PropTypes.bool, + }), ...windowDimensionsPropTypes, }; const defaultProps = { network: {isOffline: true}, - currentURL: '', }; class AuthScreens extends React.Component { @@ -82,18 +87,10 @@ class AuthScreens extends React.Component { authEndpoint: `${CONFIG.EXPENSIFY.URL_API_ROOT}api?command=Push_Authenticate`, }).then(subscribeToReportCommentEvents); - // If we have a validation code in our URL ensure we validate the associated login - if (this.props.currentURL.includes(`/${ROUTES.VALIDATE_LOGIN}/`)) { - // Split the /v/accountID/validateCode URL string into distinct components - // "", "v", "accountID", "validateCode" - const urlArray = this.props.currentURL.split('/'); - User.validateLogin(Number(urlArray[2]), urlArray[3]); - } - // Fetch some data we need on initialization NameValuePair.get(CONST.NVP.PRIORITY_MODE, ONYXKEYS.NVP_PRIORITY_MODE, 'default'); PersonalDetails.fetch(); - User.fetch(); + User.getUserDetails(); User.getBetas(); fetchAllReports(true, true); fetchCountryCodeByRequestIP(); @@ -107,7 +104,7 @@ class AuthScreens extends React.Component { return; } PersonalDetails.fetch(); - User.fetch(); + User.getUserDetails(); User.getBetas(); }, 1000 * 60 * 30); @@ -159,6 +156,14 @@ class AuthScreens extends React.Component { }} component={MainDrawerNavigator} /> + {/* These are the various modal routes */} {/* Note: Each modal must have it's own stack navigator since we want to be able to navigate to any @@ -220,8 +225,5 @@ export default compose( network: { key: ONYXKEYS.NETWORK, }, - currentURL: { - key: ONYXKEYS.CURRENT_URL, - }, }), )(AuthScreens); diff --git a/src/libs/Navigation/AppNavigator/PublicScreens.js b/src/libs/Navigation/AppNavigator/PublicScreens.js index 47b32fd359ab..b80e19263359 100644 --- a/src/libs/Navigation/AppNavigator/PublicScreens.js +++ b/src/libs/Navigation/AppNavigator/PublicScreens.js @@ -2,6 +2,7 @@ import React from 'react'; import {createStackNavigator} from '@react-navigation/stack'; import SignInPage from '../../../pages/signin/SignInPage'; import SetPasswordPage from '../../../pages/SetPasswordPage'; +import ValidateLoginPage from '../../../pages/ValidateLoginPage'; const RootStack = createStackNavigator(); const defaultScreenOptions = { @@ -19,11 +20,10 @@ export default () => ( options={defaultScreenOptions} component={SignInPage} /> - {/* If we have a validation code but we're unauthenticated, route to the signin page */} { if (response.jsonCode === 200) { const {authToken, email} = response; - if (!sessionAuthToken) { - createTemporaryLogin(authToken, email); + + // If the user is unauthenticated, generate a login for them with the returned authtoken and sign then in + if (isLoggedIn) { + getUserDetails(); } else { - fetch(); - Navigation.navigate(ROUTES.SETTINGS_PROFILE); + createTemporaryLogin(authToken, email); + isLoggedIn = authToken; } } else { const error = lodashGet(response, 'message', 'Unable to validate login.'); Onyx.merge(ONYXKEYS.ACCOUNT, {error}); } - return response; - }).finally((response) => { + }).finally(() => { Onyx.merge(ONYXKEYS.ACCOUNT, {loading: false}); - return response; + Navigation.navigate(redirectRoute); }); } export { changePassword, getBetas, - fetch, + getUserDetails, resendValidateCode, setExpensifyNewsStatus, setSecondaryLogin, diff --git a/src/pages/SetPasswordPage.js b/src/pages/SetPasswordPage.js index 75112a8de3db..d39d15d4def1 100644 --- a/src/pages/SetPasswordPage.js +++ b/src/pages/SetPasswordPage.js @@ -15,6 +15,7 @@ import {setPassword} from '../libs/actions/Session'; import ONYXKEYS from '../ONYXKEYS'; import variables from '../styles/variables'; import ButtonWithLoader from '../components/ButtonWithLoader'; +import routePropTypes from './routePropTypes'; const propTypes = { /* Onyx Props */ @@ -38,16 +39,7 @@ const propTypes = { }), // The accountID and validateCode are passed via the URL - route: PropTypes.shape({ - // Each parameter passed via the URL - params: PropTypes.shape({ - // The user's accountID - accountID: PropTypes.string, - - // The user's validateCode - validateCode: PropTypes.string, - }), - }), + route: PropTypes.objectOf(routePropTypes), }; const defaultProps = { diff --git a/src/pages/ValidateLoginPage.js b/src/pages/ValidateLoginPage.js new file mode 100644 index 000000000000..247433b7973a --- /dev/null +++ b/src/pages/ValidateLoginPage.js @@ -0,0 +1,33 @@ +import {Component} from 'react'; +import PropTypes from 'prop-types'; +import lodashGet from 'lodash/get'; +import routePropTypes from './routePropTypes'; +import {validateLogin} from '../libs/actions/User'; + +const propTypes = { + /* Onyx Props */ + + // The accountID and validateCode are passed via the URL + route: PropTypes.objectOf(routePropTypes), +}; + +const defaultProps = { + route: { + params: {}, + }, +}; + +export default class ValidateLoginPage extends Component { + componentDidMount() { + const accountID = lodashGet(this.props.route.params, 'accountID', ''); + const validateCode = lodashGet(this.props.route.params, 'validateCode', ''); + validateLogin(accountID, validateCode); + } + + render() { + return null; + } +} + +ValidateLoginPage.propTypes = propTypes; +ValidateLoginPage.defaultProps = defaultProps; diff --git a/src/pages/routePropTypes.js b/src/pages/routePropTypes.js new file mode 100644 index 000000000000..0350ce4499fe --- /dev/null +++ b/src/pages/routePropTypes.js @@ -0,0 +1,10 @@ +import PropTypes from 'prop-types'; + +export default PropTypes.shape({ + // The accountID and validateCode are passed via the URL + route: PropTypes.shape({ + // Each parameter passed via the URL + params: PropTypes.shape({ + }), + }), +}); diff --git a/src/pages/settings/PaymentsPage.js b/src/pages/settings/PaymentsPage.js index 0ef4afe61973..eb571a7079e4 100644 --- a/src/pages/settings/PaymentsPage.js +++ b/src/pages/settings/PaymentsPage.js @@ -9,7 +9,7 @@ import HeaderWithCloseButton from '../../components/HeaderWithCloseButton'; import Text from '../../components/Text'; import ScreenWrapper from '../../components/ScreenWrapper'; import NameValuePair from '../../libs/actions/NameValuePair'; -import {fetch} from '../../libs/actions/User'; +import {getUserDetails} from '../../libs/actions/User'; import Navigation from '../../libs/Navigation/Navigation'; import styles from '../../styles/styles'; @@ -32,7 +32,7 @@ class PaymentsPage extends React.Component { } componentDidMount() { - fetch(); + getUserDetails(); } componentDidUpdate(prevProps) { diff --git a/src/pages/signin/SignInPage.js b/src/pages/signin/SignInPage.js index 3053744ec423..1b5f6ed24bef 100644 --- a/src/pages/signin/SignInPage.js +++ b/src/pages/signin/SignInPage.js @@ -5,7 +5,6 @@ import { import PropTypes from 'prop-types'; import {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; -import lodashGet from 'lodash/get'; import ONYXKEYS from '../../ONYXKEYS'; import styles from '../../styles/styles'; import updateUnread from '../../libs/UnreadIndicatorUpdater/updateUnread/index'; @@ -14,7 +13,6 @@ import LoginForm from './LoginForm'; import PasswordForm from './PasswordForm'; import ResendValidationForm from './ResendValidationForm'; import TermsAndLicenses from './TermsAndLicenses'; -import {validateLogin} from '../../libs/actions/User'; const propTypes = { /* Onyx Props */ @@ -46,32 +44,16 @@ const propTypes = { // Error to display when there is a session error returned authToken: PropTypes.string, }), - - route: PropTypes.shape({ - params: PropTypes.shape({ - validateCode: PropTypes.string, - }), - }), }; const defaultProps = { account: {}, session: {}, credentials: {}, - route: { - params: {}, - }, }; class SignInPage extends Component { componentDidMount() { - // If we've redirected to the signin page with a validation code, validate the login - if (_.isMatch(this.props.route, {name: 'ValidateLogin'})) { - const accountID = Number(lodashGet(this.props.route, 'params.accountID', 0)); - const validateCode = lodashGet(this.props.route, 'params.validateCode', ''); - validateLogin(accountID, validateCode); - } - // Always reset the unread counter to zero on this page updateUnread(0); } From 86659fcd76c1a8ea6b1f02335d9118fdd50249ac Mon Sep 17 00:00:00 2001 From: Marc Glasser Date: Wed, 7 Apr 2021 16:38:28 -1000 Subject: [PATCH 171/380] Update all dismissModal --- .../ClickAwayHandler/ClickAwayHandler.js | 2 +- src/libs/Navigation/Navigation.js | 27 ++++++++++++++++--- src/pages/DetailsPage.js | 2 +- src/pages/NewChatPage.js | 2 +- src/pages/NewGroupPage.js | 2 +- src/pages/SearchPage.js | 2 +- src/pages/iou/IOUModal.js | 2 +- src/pages/settings/AddSecondaryLoginPage.js | 2 +- src/pages/settings/InitialPage.js | 2 +- src/pages/settings/PasswordPage.js | 2 +- src/pages/settings/PaymentsPage.js | 2 +- src/pages/settings/PreferencesPage.js | 2 +- src/pages/settings/ProfilePage/index.js | 2 +- 13 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/libs/Navigation/AppNavigator/ClickAwayHandler/ClickAwayHandler.js b/src/libs/Navigation/AppNavigator/ClickAwayHandler/ClickAwayHandler.js index d28118834137..9e1daab19fa7 100644 --- a/src/libs/Navigation/AppNavigator/ClickAwayHandler/ClickAwayHandler.js +++ b/src/libs/Navigation/AppNavigator/ClickAwayHandler/ClickAwayHandler.js @@ -16,7 +16,7 @@ const ClickAwayHandler = (props) => { return ( Navigation.dismissModal()} /> ); }; diff --git a/src/libs/Navigation/Navigation.js b/src/libs/Navigation/Navigation.js index fe3194f84689..7ddeecdc2e85 100644 --- a/src/libs/Navigation/Navigation.js +++ b/src/libs/Navigation/Navigation.js @@ -1,3 +1,4 @@ +import _ from 'underscore'; import React from 'react'; import {StackActions, DrawerActions} from '@react-navigation/native'; import {getIsDrawerOpenFromState} from '@react-navigation/drawer'; @@ -43,13 +44,33 @@ function navigate(route = ROUTES.HOME) { /** * Dismisses a screen presented modally and returns us back to the previous view. + * + * @param {Boolean} shouldOpenDrawer */ -function dismissModal() { +function dismissModal(shouldOpenDrawer = false) { + const normalizedShouldOpenDrawer = _.isBoolean(shouldOpenDrawer) + ? shouldOpenDrawer + : false; + // This should take us to the first view of the modal's stack navigator - navigationRef.current.dispatch(StackActions.popToTop()); + navigationRef.current.dispatch((state) => { + // If there are multiple routes then we can pop back to the first route + if (state.routes.length > 1) { + return StackActions.popToTop(); + } - // From there we can just navigate back and open the drawer + // Otherwise, we are already on the last page of a modal so just do nothing here as goBack() will navigate us + // back to the screen we were on before we opened the modal. + return StackActions.pop(0); + }); + + // Navigate back to where we were before we launched the modal goBack(); + + if (!normalizedShouldOpenDrawer) { + return; + } + openDrawer(); } diff --git a/src/pages/DetailsPage.js b/src/pages/DetailsPage.js index 7cb255523564..d15a9c499f45 100644 --- a/src/pages/DetailsPage.js +++ b/src/pages/DetailsPage.js @@ -37,7 +37,7 @@ const DetailsPage = ({personalDetails, route}) => { Navigation.dismissModal()} /> Navigation.dismissModal()} + onCloseButtonPress={() => Navigation.dismissModal(true)} /> Navigation.dismissModal()} + onCloseButtonPress={() => Navigation.dismissModal(true)} /> Navigation.dismissModal()} + onCloseButtonPress={() => Navigation.dismissModal(true)} /> Navigation.dismissModal()} style={[styles.touchableButtonImage]} > diff --git a/src/pages/settings/AddSecondaryLoginPage.js b/src/pages/settings/AddSecondaryLoginPage.js index ed5fa77ec2d4..7ac3f1e6deb7 100644 --- a/src/pages/settings/AddSecondaryLoginPage.js +++ b/src/pages/settings/AddSecondaryLoginPage.js @@ -100,7 +100,7 @@ class AddSecondaryLoginPage extends Component { title={this.formType === CONST.LOGIN_TYPE.PHONE ? 'Add Phone Number' : 'Add Email Address'} shouldShowBackButton onBackButtonPress={() => Navigation.navigate(ROUTES.SETTINGS_PROFILE)} - onCloseButtonPress={Navigation.dismissModal} + onCloseButtonPress={() => Navigation.dismissModal()} /> diff --git a/src/pages/settings/InitialPage.js b/src/pages/settings/InitialPage.js index 6fe0893d55f3..72bde568aee2 100644 --- a/src/pages/settings/InitialPage.js +++ b/src/pages/settings/InitialPage.js @@ -92,7 +92,7 @@ const InitialSettingsPage = ({ Navigation.dismissModal()} + onCloseButtonPress={() => Navigation.dismissModal(true)} /> Navigation.navigate(ROUTES.SETTINGS)} - onCloseButtonPress={Navigation.dismissModal} + onCloseButtonPress={() => Navigation.dismissModal(true)} /> diff --git a/src/pages/settings/PaymentsPage.js b/src/pages/settings/PaymentsPage.js index 0ef4afe61973..3f218dca8ef4 100644 --- a/src/pages/settings/PaymentsPage.js +++ b/src/pages/settings/PaymentsPage.js @@ -57,7 +57,7 @@ class PaymentsPage extends React.Component { title="Payments" shouldShowBackButton onBackButtonPress={() => Navigation.navigate(ROUTES.SETTINGS)} - onCloseButtonPress={() => Navigation.dismissModal()} + onCloseButtonPress={() => Navigation.dismissModal(true)} /> diff --git a/src/pages/settings/PreferencesPage.js b/src/pages/settings/PreferencesPage.js index 89311c149e09..82186c24ba95 100644 --- a/src/pages/settings/PreferencesPage.js +++ b/src/pages/settings/PreferencesPage.js @@ -54,7 +54,7 @@ const PreferencesPage = ({priorityMode, user}) => ( title="Preferences" shouldShowBackButton onBackButtonPress={() => Navigation.navigate(ROUTES.SETTINGS)} - onCloseButtonPress={Navigation.dismissModal} + onCloseButtonPress={() => Navigation.dismissModal(true)} /> diff --git a/src/pages/settings/ProfilePage/index.js b/src/pages/settings/ProfilePage/index.js index d511b8a22ab3..6ad8ad542e6e 100644 --- a/src/pages/settings/ProfilePage/index.js +++ b/src/pages/settings/ProfilePage/index.js @@ -255,7 +255,7 @@ class ProfilePage extends Component { title="Profile" shouldShowBackButton onBackButtonPress={() => Navigation.navigate(ROUTES.SETTINGS)} - onCloseButtonPress={Navigation.dismissModal} + onCloseButtonPress={() => Navigation.dismissModal(true)} /> Date: Thu, 8 Apr 2021 11:06:16 +0800 Subject: [PATCH 172/380] Add padding for iOS set password views --- src/pages/SetPasswordPage.js | 72 ++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/src/pages/SetPasswordPage.js b/src/pages/SetPasswordPage.js index 75112a8de3db..21fac0a36966 100644 --- a/src/pages/SetPasswordPage.js +++ b/src/pages/SetPasswordPage.js @@ -94,43 +94,45 @@ class SetPasswordPage extends Component { render() { return ( <> - - - - + + + + + + + Enter a password + this.setState({password: text})} + onSubmitEditing={this.submitForm} + /> + + + {this.state.formError && ( + + {this.state.formError} + + )} + {!_.isEmpty(this.props.account.error) && ( + + {this.props.account.error} + + )} - - Enter a password - this.setState({password: text})} - onSubmitEditing={this.submitForm} - /> - - - {this.state.formError && ( - - {this.state.formError} - - )} - {!_.isEmpty(this.props.account.error) && ( - - {this.props.account.error} - - )} - - + + ); } From 77abbcca3051d2dc1216adf84bbe7babc8cec348 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Thu, 8 Apr 2021 11:27:41 +0800 Subject: [PATCH 173/380] style --- src/pages/SetPasswordPage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/SetPasswordPage.js b/src/pages/SetPasswordPage.js index 21fac0a36966..8139e59376f6 100644 --- a/src/pages/SetPasswordPage.js +++ b/src/pages/SetPasswordPage.js @@ -95,7 +95,7 @@ class SetPasswordPage extends Component { return ( <> - + Date: Thu, 1 Apr 2021 01:14:06 +0545 Subject: [PATCH 174/380] Create a group chat info view with participants information. --- src/ROUTES.js | 3 + .../Navigation/AppNavigator/AuthScreens.js | 6 + .../AppNavigator/ModalStackNavigators.js | 18 +++ src/libs/Navigation/linkingConfig.js | 6 + src/pages/ParticipantsPage.js | 140 ++++++++++++++++++ src/pages/home/HeaderView.js | 3 + 6 files changed, 176 insertions(+) create mode 100644 src/pages/ParticipantsPage.js diff --git a/src/ROUTES.js b/src/ROUTES.js index 2e706584f08f..691d2b0bb592 100644 --- a/src/ROUTES.js +++ b/src/ROUTES.js @@ -23,4 +23,7 @@ export default { DETAILS: 'details', DETAILS_WITH_LOGIN: 'details/:login', getDetailsRoute: login => `details/${login}`, + PARTICIPANTS: 'participants', + PARTICIPANTS_WITH_REPORT: 'participants/:reportID', + getParticipantsRoute: reportID => `participants/${reportID}`, }; diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.js b/src/libs/Navigation/AppNavigator/AuthScreens.js index 3f4f2c5ee360..27f98175d427 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.js +++ b/src/libs/Navigation/AppNavigator/AuthScreens.js @@ -35,6 +35,7 @@ import { IOUBillStackNavigator, IOURequestModalStackNavigator, DetailsModalStackNavigator, + ParticipantsModalStackNavigator, SearchModalStackNavigator, NewGroupModalStackNavigator, NewChatModalStackNavigator, @@ -185,6 +186,11 @@ class AuthScreens extends React.Component { component={DetailsModalStackNavigator} listeners={modalScreenListeners} /> + ( ); +const ParticipantsModalStackNavigator = () => ( + + + +); + const SearchModalStackNavigator = () => ( { + const {icons, participants, reportName} = report; + const displayNames = reportName.split(', '); + + const otherMembers = participants.map((login, index) => ( + { + alternateText: login, + icons: [icons[index]], + keyForList: `${index}`, + tooltipText: login, + text: displayNames[index], + login, + displayName: displayNames[index], + } + )); + + const final = [...otherMembers, + { + icons: [personalDetail.avatar], + text: personalDetail.displayName, + login: personalDetail.login, + alternateText: personalDetail.login, + keyForList: `${otherMembers.length}`, + tooltipText: personalDetail.login, + displayName: personalDetail.displayName, + }, + ]; + + return final.map(item => ({...item, participantsList: [item]})); +}; + +const getSections = participants => ([{ + title: '', + data: participants, + shouldShow: true, + indexOffset: 0, +}]); + +const ParticipantsPage = ({ + myPersonalDetails, route, reports, priorityMode, +}) => { + const participants = getAllParticipants(reports[`report_${route.params.reportID}`], myPersonalDetails); + + return ( + + + + { participants.length ? ( + + { + Navigation.navigate(ROUTES.getDetailsRoute(option.login)); + }} + hideSectionHeaders + showTitleTooltip + disableFocusOptions + optionMode={priorityMode === CONST.PRIORITY_MODE.GSD ? 'compact' : 'default'} + forceTextUnreadStyle + optionHoveredStyle={styles.hoveredComponentBG} + /> + ) : null } + + + ); +}; + +ParticipantsPage.propTypes = propTypes; +ParticipantsPage.displayName = 'ParticipantsPage'; + +export default withOnyx({ + myPersonalDetails: { + key: ONYXKEYS.MY_PERSONAL_DETAILS, + }, + reports: { + key: ONYXKEYS.COLLECTION.REPORT, + }, + priorityMode: { + key: ONYXKEYS.NVP_PRIORITY_MODE, + }, +})(ParticipantsPage); diff --git a/src/pages/home/HeaderView.js b/src/pages/home/HeaderView.js index 40e07a82daef..3b1555f0c06d 100644 --- a/src/pages/home/HeaderView.js +++ b/src/pages/home/HeaderView.js @@ -84,6 +84,9 @@ const HeaderView = (props) => { if (participants.length === 1) { Navigation.navigate(ROUTES.getDetailsRoute(participants[0])); } + if (participants.length > 1) { + Navigation.navigate(ROUTES.getParticipantsRoute(props.reportID)); + } }} style={[styles.flexRow, styles.alignItemsCenter, styles.flex1]} > From 255e4ec71cc8106a106fd9ef03d7fb4676f18e4a Mon Sep 17 00:00:00 2001 From: npsedhain Date: Thu, 1 Apr 2021 12:11:59 +0545 Subject: [PATCH 175/380] Resolved PR comments and made code cleaner. --- src/pages/ParticipantsPage.js | 109 +++++++++++++++++----------------- 1 file changed, 55 insertions(+), 54 deletions(-) diff --git a/src/pages/ParticipantsPage.js b/src/pages/ParticipantsPage.js index a57c0c9f86fb..296ba15999ec 100644 --- a/src/pages/ParticipantsPage.js +++ b/src/pages/ParticipantsPage.js @@ -13,80 +13,79 @@ import OptionsList from '../components/OptionsList'; import ROUTES from '../ROUTES'; import CONST from '../CONST'; -const matchType = PropTypes.shape({ - params: PropTypes.shape({ - // reportID passed via route /participants/:reportID - reportID: PropTypes.string, - }), -}); - -const myPersonalDetailsType = PropTypes.shape({ - // Display name of the current user from their personal details - displayName: PropTypes.string, - - // Avatar URL of the current user from their personal details - avatar: PropTypes.string, - - // login of the current user from their personal details - login: PropTypes.string, -}); - const propTypes = { /* Onyx Props */ // The personal details of the person who is logged in - myPersonalDetails: myPersonalDetailsType.isRequired, + myPersonalDetails: PropTypes.shape({ + // Display name of the current user from their personal details + displayName: PropTypes.string, + + // Avatar URL of the current user from their personal details + avatar: PropTypes.string, + + // Login of the current user from their personal details + login: PropTypes.string, + }).isRequired, // List of reports reports: PropTypes.shape({ + // The list of icons icons: PropTypes.arrayOf(PropTypes.string), + + // The report name reportName: PropTypes.string, + + // Array of participants participants: PropTypes.arrayOf(PropTypes.string), }).isRequired, // Route params - route: matchType.isRequired, + route: PropTypes.shape({ + params: PropTypes.shape({ + // Report ID passed via route /participants/:reportID + reportID: PropTypes.string, + }), + }).isRequired, + // The chat priority mode priorityMode: PropTypes.string.isRequired, }; +/** + * Returns all the participants in the active report + * + * @param {Object} report The active report object + * @param {Object} personalDetail The personal detail of the logged user + * @return {Array} + */ const getAllParticipants = (report, personalDetail) => { const {icons, participants, reportName} = report; const displayNames = reportName.split(', '); - const otherMembers = participants.map((login, index) => ( - { + const members = participants.reduce((list, login, idx) => { + list.push({ alternateText: login, - icons: [icons[index]], - keyForList: `${index}`, - tooltipText: login, - text: displayNames[index], + displayName: displayNames[idx], + icons: [icons[idx]], + keyForList: `${idx}`, login, - displayName: displayNames[index], - } - )); - - const final = [...otherMembers, - { - icons: [personalDetail.avatar], - text: personalDetail.displayName, - login: personalDetail.login, - alternateText: personalDetail.login, - keyForList: `${otherMembers.length}`, - tooltipText: personalDetail.login, - displayName: personalDetail.displayName, - }, - ]; - - return final.map(item => ({...item, participantsList: [item]})); + text: displayNames[idx], + tooltipText: login, + }); + return list; + }, [{ + icons: [personalDetail.avatar], + text: personalDetail.displayName, + login: personalDetail.login, + alternateText: personalDetail.login, + keyForList: `${participants.length}`, + tooltipText: personalDetail.login, + displayName: personalDetail.displayName, + }]); + + return members.map(item => ({...item, participantsList: [item]})); }; -const getSections = participants => ([{ - title: '', - data: participants, - shouldShow: true, - indexOffset: 0, -}]); - const ParticipantsPage = ({ myPersonalDetails, route, reports, priorityMode, }) => { @@ -104,10 +103,12 @@ const ParticipantsPage = ({ styles.detailsPageContainer, ]} > - { participants.length ? ( - + { participants.length + && ( { Navigation.navigate(ROUTES.getDetailsRoute(option.login)); }} @@ -118,7 +119,7 @@ const ParticipantsPage = ({ forceTextUnreadStyle optionHoveredStyle={styles.hoveredComponentBG} /> - ) : null } + )} ); From 2a5ddb35f387434e2ee91233b6391d8ee994bc8b Mon Sep 17 00:00:00 2001 From: npsedhain Date: Sat, 3 Apr 2021 14:05:09 +0545 Subject: [PATCH 176/380] Refactor: Make suggested changes and refactor the participants page subscriptions. --- src/libs/Navigation/linkingConfig.js | 1 - src/pages/DetailsPage.js | 2 +- src/pages/ParticipantsPage.js | 71 +++++++++++----------------- src/pages/home/HeaderView.js | 6 +-- src/styles/styles.js | 2 +- 5 files changed, 31 insertions(+), 51 deletions(-) diff --git a/src/libs/Navigation/linkingConfig.js b/src/libs/Navigation/linkingConfig.js index bff8bde7d323..44d714222d62 100644 --- a/src/libs/Navigation/linkingConfig.js +++ b/src/libs/Navigation/linkingConfig.js @@ -71,7 +71,6 @@ export default { }, }, Participants: { - initialRouteName: 'Participants_Root', screens: { Participants_Root: ROUTES.PARTICIPANTS_WITH_REPORT, }, diff --git a/src/pages/DetailsPage.js b/src/pages/DetailsPage.js index 7cb255523564..d7b3fd26de8a 100644 --- a/src/pages/DetailsPage.js +++ b/src/pages/DetailsPage.js @@ -42,7 +42,7 @@ const DetailsPage = ({personalDetails, route}) => { {details ? ( diff --git a/src/pages/ParticipantsPage.js b/src/pages/ParticipantsPage.js index 296ba15999ec..3e09328d607c 100644 --- a/src/pages/ParticipantsPage.js +++ b/src/pages/ParticipantsPage.js @@ -1,4 +1,5 @@ import React from 'react'; +import _ from 'underscore'; import { View, } from 'react-native'; @@ -11,12 +12,11 @@ import Navigation from '../libs/Navigation/Navigation'; import ScreenWrapper from '../components/ScreenWrapper'; import OptionsList from '../components/OptionsList'; import ROUTES from '../ROUTES'; -import CONST from '../CONST'; const propTypes = { /* Onyx Props */ // The personal details of the person who is logged in - myPersonalDetails: PropTypes.shape({ + personalDetails: PropTypes.shape({ // Display name of the current user from their personal details displayName: PropTypes.string, @@ -27,8 +27,8 @@ const propTypes = { login: PropTypes.string, }).isRequired, - // List of reports - reports: PropTypes.shape({ + // The active report + report: PropTypes.shape({ // The list of icons icons: PropTypes.arrayOf(PropTypes.string), @@ -46,64 +46,50 @@ const propTypes = { reportID: PropTypes.string, }), }).isRequired, - - // The chat priority mode - priorityMode: PropTypes.string.isRequired, }; /** * Returns all the participants in the active report * * @param {Object} report The active report object - * @param {Object} personalDetail The personal detail of the logged user + * @param {Array} personalDetails The personal details of the users * @return {Array} */ -const getAllParticipants = (report, personalDetail) => { - const {icons, participants, reportName} = report; - const displayNames = reportName.split(', '); +const getAllParticipants = (report, personalDetails) => { + const {participants} = report; + + return _.map(participants, (login) => { + const userPersonalDetail = personalDetails[login]; - const members = participants.reduce((list, login, idx) => { - list.push({ + return ({ alternateText: login, - displayName: displayNames[idx], - icons: [icons[idx]], - keyForList: `${idx}`, + displayName: userPersonalDetail.displayName, + icons: [userPersonalDetail.avatar], + keyForList: login, login, - text: displayNames[idx], + text: userPersonalDetail.displayName, tooltipText: login, + participantsList: [{login, displayName: userPersonalDetail.displayName}], }); - return list; - }, [{ - icons: [personalDetail.avatar], - text: personalDetail.displayName, - login: personalDetail.login, - alternateText: personalDetail.login, - keyForList: `${participants.length}`, - tooltipText: personalDetail.login, - displayName: personalDetail.displayName, - }]); - - return members.map(item => ({...item, participantsList: [item]})); + }); }; -const ParticipantsPage = ({ - myPersonalDetails, route, reports, priorityMode, -}) => { - const participants = getAllParticipants(reports[`report_${route.params.reportID}`], myPersonalDetails); +const ParticipantsPage = ({personalDetails, report}) => { + const participants = getAllParticipants(report, personalDetails); return ( - { participants.length + {participants.length && ( @@ -129,13 +115,10 @@ ParticipantsPage.propTypes = propTypes; ParticipantsPage.displayName = 'ParticipantsPage'; export default withOnyx({ - myPersonalDetails: { - key: ONYXKEYS.MY_PERSONAL_DETAILS, - }, - reports: { - key: ONYXKEYS.COLLECTION.REPORT, + personalDetails: { + key: ONYXKEYS.PERSONAL_DETAILS, }, - priorityMode: { - key: ONYXKEYS.NVP_PRIORITY_MODE, + report: { + key: ({route}) => `${ONYXKEYS.COLLECTION.REPORT}${route.params.reportID}`, }, })(ParticipantsPage); diff --git a/src/pages/home/HeaderView.js b/src/pages/home/HeaderView.js index 3b1555f0c06d..935bb5f1265e 100644 --- a/src/pages/home/HeaderView.js +++ b/src/pages/home/HeaderView.js @@ -82,11 +82,9 @@ const HeaderView = (props) => { { if (participants.length === 1) { - Navigation.navigate(ROUTES.getDetailsRoute(participants[0])); - } - if (participants.length > 1) { - Navigation.navigate(ROUTES.getParticipantsRoute(props.reportID)); + return Navigation.navigate(ROUTES.getDetailsRoute(participants[0])); } + Navigation.navigate(ROUTES.getParticipantsRoute(props.reportID)); }} style={[styles.flexRow, styles.alignItemsCenter, styles.flex1]} > diff --git a/src/styles/styles.js b/src/styles/styles.js index 6e7fd6395c03..ab1e12055e8e 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -1188,7 +1188,7 @@ const styles = { opacity: 0, }, - detailsPageContainer: { + containerWithSpaceBetween: { justifyContent: 'space-between', width: '100%', flex: 1, From 27e1175233c7ad8b843e08d1f564ad3ed44b05f6 Mon Sep 17 00:00:00 2001 From: npsedhain Date: Tue, 6 Apr 2021 09:16:53 +0545 Subject: [PATCH 177/380] Make the details page not leave the participants navigator. --- src/ROUTES.js | 3 +++ .../Navigation/AppNavigator/ModalStackNavigators.js | 10 ++++++++++ src/libs/Navigation/linkingConfig.js | 1 + src/pages/ParticipantsPage.js | 6 ++++-- 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/ROUTES.js b/src/ROUTES.js index 691d2b0bb592..1f418904874b 100644 --- a/src/ROUTES.js +++ b/src/ROUTES.js @@ -26,4 +26,7 @@ export default { PARTICIPANTS: 'participants', PARTICIPANTS_WITH_REPORT: 'participants/:reportID', getParticipantsRoute: reportID => `participants/${reportID}`, + REPORT_ID: '/:reportID', + PARTICIPANTS_PARTICIPANT_DETAIL: '/participants/:reportID/:login', + getParticipantsPartipantDetail: (reportID, login) => `/participants/${reportID}/${login}`, }; diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators.js b/src/libs/Navigation/AppNavigator/ModalStackNavigators.js index 5f86a1288a50..e1269010f6e7 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators.js +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators.js @@ -94,6 +94,16 @@ const ParticipantsModalStackNavigator = () => ( title: 'Participants', }} /> + ); diff --git a/src/libs/Navigation/linkingConfig.js b/src/libs/Navigation/linkingConfig.js index 44d714222d62..f12988f9d32e 100644 --- a/src/libs/Navigation/linkingConfig.js +++ b/src/libs/Navigation/linkingConfig.js @@ -73,6 +73,7 @@ export default { Participants: { screens: { Participants_Root: ROUTES.PARTICIPANTS_WITH_REPORT, + Details_Root: ROUTES.PARTICIPANTS_PARTICIPANT_DETAIL, }, }, IOU_Request: { diff --git a/src/pages/ParticipantsPage.js b/src/pages/ParticipantsPage.js index 3e09328d607c..fe45ca6b7ec9 100644 --- a/src/pages/ParticipantsPage.js +++ b/src/pages/ParticipantsPage.js @@ -74,7 +74,7 @@ const getAllParticipants = (report, personalDetails) => { }); }; -const ParticipantsPage = ({personalDetails, report}) => { +const ParticipantsPage = ({personalDetails, report, route}) => { const participants = getAllParticipants(report, personalDetails); return ( @@ -96,7 +96,9 @@ const ParticipantsPage = ({personalDetails, report}) => { title: '', data: participants, shouldShow: true, indexOffset: 0, }]} onSelectRow={(option) => { - Navigation.navigate(ROUTES.getDetailsRoute(option.login)); + Navigation.navigate(ROUTES.getParticipantsPartipantDetail( + route.params.reportID, option.login, + )); }} hideSectionHeaders showTitleTooltip From c0592bff2167c288b7d57e3572da5aae02414e1f Mon Sep 17 00:00:00 2001 From: npsedhain Date: Thu, 8 Apr 2021 09:57:48 +0545 Subject: [PATCH 178/380] Refactor: Make the suggested enchancements. --- src/ROUTES.js | 10 +++---- .../Navigation/AppNavigator/AuthScreens.js | 4 +-- .../AppNavigator/ModalStackNavigators.js | 26 +++++++------------ src/libs/Navigation/Navigation.js | 1 + src/libs/Navigation/linkingConfig.js | 4 +-- src/pages/DetailsPage.js | 2 ++ ...pantsPage.js => ReportParticipantsPage.js} | 12 ++++----- src/pages/home/HeaderView.js | 2 +- 8 files changed, 27 insertions(+), 34 deletions(-) rename src/pages/{ParticipantsPage.js => ReportParticipantsPage.js} (91%) diff --git a/src/ROUTES.js b/src/ROUTES.js index 1f418904874b..d12daaa6c092 100644 --- a/src/ROUTES.js +++ b/src/ROUTES.js @@ -23,10 +23,8 @@ export default { DETAILS: 'details', DETAILS_WITH_LOGIN: 'details/:login', getDetailsRoute: login => `details/${login}`, - PARTICIPANTS: 'participants', - PARTICIPANTS_WITH_REPORT: 'participants/:reportID', - getParticipantsRoute: reportID => `participants/${reportID}`, - REPORT_ID: '/:reportID', - PARTICIPANTS_PARTICIPANT_DETAIL: '/participants/:reportID/:login', - getParticipantsPartipantDetail: (reportID, login) => `/participants/${reportID}/${login}`, + REPORT_PARTICIPANTS: 'r/:reportID/participants', + getReportParticipantsRoute: reportID => `r/${reportID}/participants`, + REPORT_PARTICIPANT: 'r/:reportID/participants/:login', + getReportParticipantRoute: (reportID, login) => `r/${reportID}/participants/${login}`, }; diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.js b/src/libs/Navigation/AppNavigator/AuthScreens.js index 27f98175d427..8e4d084e6f20 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.js +++ b/src/libs/Navigation/AppNavigator/AuthScreens.js @@ -35,7 +35,7 @@ import { IOUBillStackNavigator, IOURequestModalStackNavigator, DetailsModalStackNavigator, - ParticipantsModalStackNavigator, + ReportParticipantsModalStackNavigator, SearchModalStackNavigator, NewGroupModalStackNavigator, NewChatModalStackNavigator, @@ -189,7 +189,7 @@ class AuthScreens extends React.Component { ( ); -const ParticipantsModalStackNavigator = () => ( - - ( + + - + ); const SearchModalStackNavigator = () => ( @@ -197,7 +189,7 @@ export { IOUBillStackNavigator, IOURequestModalStackNavigator, DetailsModalStackNavigator, - ParticipantsModalStackNavigator, + ReportParticipantsModalStackNavigator, SearchModalStackNavigator, NewGroupModalStackNavigator, NewChatModalStackNavigator, diff --git a/src/libs/Navigation/Navigation.js b/src/libs/Navigation/Navigation.js index fe3194f84689..2f5bc0a37a67 100644 --- a/src/libs/Navigation/Navigation.js +++ b/src/libs/Navigation/Navigation.js @@ -66,4 +66,5 @@ export default { navigate, dismissModal, isDrawerOpen, + goBack, }; diff --git a/src/libs/Navigation/linkingConfig.js b/src/libs/Navigation/linkingConfig.js index f12988f9d32e..e226980ad3eb 100644 --- a/src/libs/Navigation/linkingConfig.js +++ b/src/libs/Navigation/linkingConfig.js @@ -72,8 +72,8 @@ export default { }, Participants: { screens: { - Participants_Root: ROUTES.PARTICIPANTS_WITH_REPORT, - Details_Root: ROUTES.PARTICIPANTS_PARTICIPANT_DETAIL, + Participants_Root: ROUTES.REPORT_PARTICIPANTS, + Details_Root: ROUTES.REPORT_PARTICIPANT, }, }, IOU_Request: { diff --git a/src/pages/DetailsPage.js b/src/pages/DetailsPage.js index d7b3fd26de8a..bcdddb59cea8 100644 --- a/src/pages/DetailsPage.js +++ b/src/pages/DetailsPage.js @@ -38,6 +38,8 @@ const DetailsPage = ({personalDetails, route}) => { { }); }; -const ParticipantsPage = ({personalDetails, report, route}) => { +const ReportParticipantsPage = ({personalDetails, report, route}) => { const participants = getAllParticipants(report, personalDetails); return ( @@ -96,7 +96,7 @@ const ParticipantsPage = ({personalDetails, report, route}) => { title: '', data: participants, shouldShow: true, indexOffset: 0, }]} onSelectRow={(option) => { - Navigation.navigate(ROUTES.getParticipantsPartipantDetail( + Navigation.navigate(ROUTES.getReportParticipantRoute( route.params.reportID, option.login, )); }} @@ -113,8 +113,8 @@ const ParticipantsPage = ({personalDetails, report, route}) => { ); }; -ParticipantsPage.propTypes = propTypes; -ParticipantsPage.displayName = 'ParticipantsPage'; +ReportParticipantsPage.propTypes = propTypes; +ReportParticipantsPage.displayName = 'ParticipantsPage'; export default withOnyx({ personalDetails: { @@ -123,4 +123,4 @@ export default withOnyx({ report: { key: ({route}) => `${ONYXKEYS.COLLECTION.REPORT}${route.params.reportID}`, }, -})(ParticipantsPage); +})(ReportParticipantsPage); diff --git a/src/pages/home/HeaderView.js b/src/pages/home/HeaderView.js index 935bb5f1265e..e5383dfbf343 100644 --- a/src/pages/home/HeaderView.js +++ b/src/pages/home/HeaderView.js @@ -84,7 +84,7 @@ const HeaderView = (props) => { if (participants.length === 1) { return Navigation.navigate(ROUTES.getDetailsRoute(participants[0])); } - Navigation.navigate(ROUTES.getParticipantsRoute(props.reportID)); + Navigation.navigate(ROUTES.getReportParticipantsRoute(props.reportID)); }} style={[styles.flexRow, styles.alignItemsCenter, styles.flex1]} > From 1ac4540074d61c9353d80c2734e843ac6548a07d Mon Sep 17 00:00:00 2001 From: barun1997 Date: Thu, 8 Apr 2021 20:05:31 +0545 Subject: [PATCH 179/380] Solve github actions bug --- .github/actions/checkDeployBlockers/index.js | 2315 +---------------- .../actions/reopenIssueWithComment/index.js | 2315 +---------------- 2 files changed, 32 insertions(+), 4598 deletions(-) diff --git a/.github/actions/checkDeployBlockers/index.js b/.github/actions/checkDeployBlockers/index.js index baae215e4076..38ff286a9db7 100644 --- a/.github/actions/checkDeployBlockers/index.js +++ b/.github/actions/checkDeployBlockers/index.js @@ -82,8 +82,6 @@ module.exports = run; const _ = __nccwpck_require__(4987); const lodashGet = __nccwpck_require__(6908); -const semverParse = __nccwpck_require__(5925); -const semverSatisfies = __nccwpck_require__(6055); const GITHUB_OWNER = 'Expensify'; const EXPENSIFY_CASH_REPO = 'Expensify.cash'; @@ -144,11 +142,6 @@ class GithubUtils { try { const versionRegex = new RegExp('([0-9]+)\\.([0-9]+)\\.([0-9]+)(?:-([0-9]+))?', 'g'); const tag = issue.body.match(versionRegex)[0].replace(/`/g, ''); - - // eslint-disable-next-line max-len - const compareURLRegex = new RegExp(`${EXPENSIFY_CASH_URL}/compare/${versionRegex.source}\\.\\.\\.${versionRegex.source}`, 'g'); - const comparisonURL = issue.body.match(compareURLRegex)[0]; - return { title: issue.title, url: issue.url, @@ -156,7 +149,6 @@ class GithubUtils { PRList: this.getStagingDeployCashPRList(issue), deployBlockers: this.getStagingDeployCashDeployBlockers(issue), tag, - comparisonURL, }; } catch (exception) { throw new Error(`Unable to find ${STAGING_DEPLOY_CASH_LABEL} issue with correct data.`); @@ -231,71 +223,6 @@ class GithubUtils { ); } - /** - * Generate a comparison URL between two versions following the semverLevel passed - * - * @param {String} repoSlug - The slug of the repository: / - * @param {String} tag - The tag to compare first the previous semverLevel - * @param {String} semverLevel - The semantic versioning MAJOR, MINOR, PATCH and BUILD - * @return {Promise} the url generated - * @throws {Error} If the request to the Github API fails. - */ - generateVersionComparisonURL(repoSlug, tag, semverLevel) { - return new Promise((resolve, reject) => { - const getComparisonURL = (previousTag, currentTag) => ( - `${EXPENSIFY_CASH_URL}/compare/${previousTag}...${currentTag}` - ); - - const [repoOwner, repoName] = repoSlug.split('/'); - const tagSemver = semverParse(tag); - - return this.octokit.repos.listTags({ - owner: repoOwner, - repo: repoName, - }) - .then(githubResponse => githubResponse.data.some(({name: repoTag}) => { - if (semverLevel === 'MAJOR' - && semverSatisfies(repoTag, `<${tagSemver.major}.x.x`, {includePrerelease: true}) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'MINOR' - && semverSatisfies( - repoTag, - `<${tagSemver.major}.${tagSemver.minor}.x`, - {includePrerelease: true}, - ) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'PATCH' - && semverSatisfies(repoTag, `<${tagSemver}`, {includePrerelease: true}) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'BUILD' - && repoTag !== tagSemver.version - && semverSatisfies( - repoTag, - `<=${tagSemver.major}.${tagSemver.minor}.${tagSemver.patch}`, - {includePrerelease: true}, - ) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - return false; - })) - .catch(githubError => reject(githubError)); - }); - } - /** * Creates a new StagingDeployCash issue. * @@ -391,22 +318,16 @@ class GithubUtils { deployBlockers = [], resolvedDeployBlockers = [], ) { - return Promise.all([ - this.generateVersionComparisonURL(`${GITHUB_OWNER}/${EXPENSIFY_CASH_REPO}`, tag, 'PATCH'), - this.octokit.pulls.list({ - owner: GITHUB_OWNER, - repo: EXPENSIFY_CASH_REPO, - per_page: 100, - }), - ]) - .then(results => ({ - comparisonURL: results[0], - automergePRs: _.map( - _.filter(results[1].data, GithubUtils.isAutomergePullRequest), + return this.octokit.pulls.list({ + owner: GITHUB_OWNER, + repo: EXPENSIFY_CASH_REPO, + per_page: 100, + }) + .then(({data}) => { + const automergePRs = _.pluck( + _.filter(data, GithubUtils.isAutomergePullRequest), 'html_url', - ), - })) - .then(({comparisonURL, automergePRs}) => { + ); const sortedPRList = _.chain(PRList) .difference(automergePRs) .unique() @@ -418,8 +339,8 @@ class GithubUtils { ); // Tag version and comparison URL - let issueBody = `**Release Version:** \`${tag}\`\r\n`; - issueBody += `**Compare Changes:** ${comparisonURL}\r\n`; + // eslint-disable-next-line max-len + let issueBody = `**Release Version:** \`${tag}\`\r\n**Compare Changes:** https://github.com/Expensify/Expensify.cash/compare/production...staging\r\n`; // PR list if (!_.isEmpty(PRList)) { @@ -440,11 +361,13 @@ class GithubUtils { } issueBody += '\r\ncc @Expensify/applauseleads\r\n'; - return issueBody; }) - // eslint-disable-next-line no-console - .catch(err => console.warn('Error generating comparison URL, continuing...', err)); + .catch(err => console.warn( + 'Error generating StagingDeployCash issue body!', + 'Automerge PRs may not be properly filtered out. Continuing...', + err, + )); } /** @@ -10790,2212 +10713,6 @@ if (!safer.constants) { module.exports = safer -/***/ }), - -/***/ 1532: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const ANY = Symbol('SemVer ANY') -// hoisted class for cyclic dependency -class Comparator { - static get ANY () { - return ANY - } - constructor (comp, options) { - options = parseOptions(options) - - if (comp instanceof Comparator) { - if (comp.loose === !!options.loose) { - return comp - } else { - comp = comp.value - } - } - - debug('comparator', comp, options) - this.options = options - this.loose = !!options.loose - this.parse(comp) - - if (this.semver === ANY) { - this.value = '' - } else { - this.value = this.operator + this.semver.version - } - - debug('comp', this) - } - - parse (comp) { - const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] - const m = comp.match(r) - - if (!m) { - throw new TypeError(`Invalid comparator: ${comp}`) - } - - this.operator = m[1] !== undefined ? m[1] : '' - if (this.operator === '=') { - this.operator = '' - } - - // if it literally is just '>' or '' then allow anything. - if (!m[2]) { - this.semver = ANY - } else { - this.semver = new SemVer(m[2], this.options.loose) - } - } - - toString () { - return this.value - } - - test (version) { - debug('Comparator.test', version, this.options.loose) - - if (this.semver === ANY || version === ANY) { - return true - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - return cmp(version, this.operator, this.semver, this.options) - } - - intersects (comp, options) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required') - } - - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - if (this.operator === '') { - if (this.value === '') { - return true - } - return new Range(comp.value, options).test(this.value) - } else if (comp.operator === '') { - if (comp.value === '') { - return true - } - return new Range(this.value, options).test(comp.semver) - } - - const sameDirectionIncreasing = - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '>=' || comp.operator === '>') - const sameDirectionDecreasing = - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '<=' || comp.operator === '<') - const sameSemVer = this.semver.version === comp.semver.version - const differentDirectionsInclusive = - (this.operator === '>=' || this.operator === '<=') && - (comp.operator === '>=' || comp.operator === '<=') - const oppositeDirectionsLessThan = - cmp(this.semver, '<', comp.semver, options) && - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '<=' || comp.operator === '<') - const oppositeDirectionsGreaterThan = - cmp(this.semver, '>', comp.semver, options) && - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '>=' || comp.operator === '>') - - return ( - sameDirectionIncreasing || - sameDirectionDecreasing || - (sameSemVer && differentDirectionsInclusive) || - oppositeDirectionsLessThan || - oppositeDirectionsGreaterThan - ) - } -} - -module.exports = Comparator - -const parseOptions = __nccwpck_require__(785) -const {re, t} = __nccwpck_require__(9523) -const cmp = __nccwpck_require__(5098) -const debug = __nccwpck_require__(427) -const SemVer = __nccwpck_require__(8088) -const Range = __nccwpck_require__(9828) - - -/***/ }), - -/***/ 9828: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -// hoisted class for cyclic dependency -class Range { - constructor (range, options) { - options = parseOptions(options) - - if (range instanceof Range) { - if ( - range.loose === !!options.loose && - range.includePrerelease === !!options.includePrerelease - ) { - return range - } else { - return new Range(range.raw, options) - } - } - - if (range instanceof Comparator) { - // just put it in the set and return - this.raw = range.value - this.set = [[range]] - this.format() - return this - } - - this.options = options - this.loose = !!options.loose - this.includePrerelease = !!options.includePrerelease - - // First, split based on boolean or || - this.raw = range - this.set = range - .split(/\s*\|\|\s*/) - // map the range to a 2d array of comparators - .map(range => this.parseRange(range.trim())) - // throw out any comparator lists that are empty - // this generally means that it was not a valid range, which is allowed - // in loose mode, but will still throw if the WHOLE range is invalid. - .filter(c => c.length) - - if (!this.set.length) { - throw new TypeError(`Invalid SemVer Range: ${range}`) - } - - // if we have any that are not the null set, throw out null sets. - if (this.set.length > 1) { - // keep the first one, in case they're all null sets - const first = this.set[0] - this.set = this.set.filter(c => !isNullSet(c[0])) - if (this.set.length === 0) - this.set = [first] - else if (this.set.length > 1) { - // if we have any that are *, then the range is just * - for (const c of this.set) { - if (c.length === 1 && isAny(c[0])) { - this.set = [c] - break - } - } - } - } - - this.format() - } - - format () { - this.range = this.set - .map((comps) => { - return comps.join(' ').trim() - }) - .join('||') - .trim() - return this.range - } - - toString () { - return this.range - } - - parseRange (range) { - range = range.trim() - - // memoize range parsing for performance. - // this is a very hot path, and fully deterministic. - const memoOpts = Object.keys(this.options).join(',') - const memoKey = `parseRange:${memoOpts}:${range}` - const cached = cache.get(memoKey) - if (cached) - return cached - - const loose = this.options.loose - // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` - const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE] - range = range.replace(hr, hyphenReplace(this.options.includePrerelease)) - debug('hyphen replace', range) - // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` - range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace) - debug('comparator trim', range, re[t.COMPARATORTRIM]) - - // `~ 1.2.3` => `~1.2.3` - range = range.replace(re[t.TILDETRIM], tildeTrimReplace) - - // `^ 1.2.3` => `^1.2.3` - range = range.replace(re[t.CARETTRIM], caretTrimReplace) - - // normalize spaces - range = range.split(/\s+/).join(' ') - - // At this point, the range is completely trimmed and - // ready to be split into comparators. - - const compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] - const rangeList = range - .split(' ') - .map(comp => parseComparator(comp, this.options)) - .join(' ') - .split(/\s+/) - // >=0.0.0 is equivalent to * - .map(comp => replaceGTE0(comp, this.options)) - // in loose mode, throw out any that are not valid comparators - .filter(this.options.loose ? comp => !!comp.match(compRe) : () => true) - .map(comp => new Comparator(comp, this.options)) - - // if any comparators are the null set, then replace with JUST null set - // if more than one comparator, remove any * comparators - // also, don't include the same comparator more than once - const l = rangeList.length - const rangeMap = new Map() - for (const comp of rangeList) { - if (isNullSet(comp)) - return [comp] - rangeMap.set(comp.value, comp) - } - if (rangeMap.size > 1 && rangeMap.has('')) - rangeMap.delete('') - - const result = [...rangeMap.values()] - cache.set(memoKey, result) - return result - } - - intersects (range, options) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required') - } - - return this.set.some((thisComparators) => { - return ( - isSatisfiable(thisComparators, options) && - range.set.some((rangeComparators) => { - return ( - isSatisfiable(rangeComparators, options) && - thisComparators.every((thisComparator) => { - return rangeComparators.every((rangeComparator) => { - return thisComparator.intersects(rangeComparator, options) - }) - }) - ) - }) - ) - }) - } - - // if ANY of the sets match ALL of its comparators, then pass - test (version) { - if (!version) { - return false - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - for (let i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version, this.options)) { - return true - } - } - return false - } -} -module.exports = Range - -const LRU = __nccwpck_require__(1196) -const cache = new LRU({ max: 1000 }) - -const parseOptions = __nccwpck_require__(785) -const Comparator = __nccwpck_require__(1532) -const debug = __nccwpck_require__(427) -const SemVer = __nccwpck_require__(8088) -const { - re, - t, - comparatorTrimReplace, - tildeTrimReplace, - caretTrimReplace -} = __nccwpck_require__(9523) - -const isNullSet = c => c.value === '<0.0.0-0' -const isAny = c => c.value === '' - -// take a set of comparators and determine whether there -// exists a version which can satisfy it -const isSatisfiable = (comparators, options) => { - let result = true - const remainingComparators = comparators.slice() - let testComparator = remainingComparators.pop() - - while (result && remainingComparators.length) { - result = remainingComparators.every((otherComparator) => { - return testComparator.intersects(otherComparator, options) - }) - - testComparator = remainingComparators.pop() - } - - return result -} - -// comprised of xranges, tildes, stars, and gtlt's at this point. -// already replaced the hyphen ranges -// turn into a set of JUST comparators. -const parseComparator = (comp, options) => { - debug('comp', comp, options) - comp = replaceCarets(comp, options) - debug('caret', comp) - comp = replaceTildes(comp, options) - debug('tildes', comp) - comp = replaceXRanges(comp, options) - debug('xrange', comp) - comp = replaceStars(comp, options) - debug('stars', comp) - return comp -} - -const isX = id => !id || id.toLowerCase() === 'x' || id === '*' - -// ~, ~> --> * (any, kinda silly) -// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0 -// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0 -// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0 -// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0 -// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0 -const replaceTildes = (comp, options) => - comp.trim().split(/\s+/).map((comp) => { - return replaceTilde(comp, options) - }).join(' ') - -const replaceTilde = (comp, options) => { - const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] - return comp.replace(r, (_, M, m, p, pr) => { - debug('tilde', comp, _, M, m, p, pr) - let ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = `>=${M}.0.0 <${+M + 1}.0.0-0` - } else if (isX(p)) { - // ~1.2 == >=1.2.0 <1.3.0-0 - ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0` - } else if (pr) { - debug('replaceTilde pr', pr) - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${+m + 1}.0-0` - } else { - // ~1.2.3 == >=1.2.3 <1.3.0-0 - ret = `>=${M}.${m}.${p - } <${M}.${+m + 1}.0-0` - } - - debug('tilde return', ret) - return ret - }) -} - -// ^ --> * (any, kinda silly) -// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0 -// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0 -// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0 -// ^1.2.3 --> >=1.2.3 <2.0.0-0 -// ^1.2.0 --> >=1.2.0 <2.0.0-0 -const replaceCarets = (comp, options) => - comp.trim().split(/\s+/).map((comp) => { - return replaceCaret(comp, options) - }).join(' ') - -const replaceCaret = (comp, options) => { - debug('caret', comp, options) - const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET] - const z = options.includePrerelease ? '-0' : '' - return comp.replace(r, (_, M, m, p, pr) => { - debug('caret', comp, _, M, m, p, pr) - let ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0` - } else if (isX(p)) { - if (M === '0') { - ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0` - } else { - ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0` - } - } else if (pr) { - debug('replaceCaret pr', pr) - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${m}.${+p + 1}-0` - } else { - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${+m + 1}.0-0` - } - } else { - ret = `>=${M}.${m}.${p}-${pr - } <${+M + 1}.0.0-0` - } - } else { - debug('no pr') - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p - }${z} <${M}.${m}.${+p + 1}-0` - } else { - ret = `>=${M}.${m}.${p - }${z} <${M}.${+m + 1}.0-0` - } - } else { - ret = `>=${M}.${m}.${p - } <${+M + 1}.0.0-0` - } - } - - debug('caret return', ret) - return ret - }) -} - -const replaceXRanges = (comp, options) => { - debug('replaceXRanges', comp, options) - return comp.split(/\s+/).map((comp) => { - return replaceXRange(comp, options) - }).join(' ') -} - -const replaceXRange = (comp, options) => { - comp = comp.trim() - const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE] - return comp.replace(r, (ret, gtlt, M, m, p, pr) => { - debug('xRange', comp, ret, gtlt, M, m, p, pr) - const xM = isX(M) - const xm = xM || isX(m) - const xp = xm || isX(p) - const anyX = xp - - if (gtlt === '=' && anyX) { - gtlt = '' - } - - // if we're including prereleases in the match, then we need - // to fix this to -0, the lowest possible prerelease value - pr = options.includePrerelease ? '-0' : '' - - if (xM) { - if (gtlt === '>' || gtlt === '<') { - // nothing is allowed - ret = '<0.0.0-0' - } else { - // nothing is forbidden - ret = '*' - } - } else if (gtlt && anyX) { - // we know patch is an x, because we have any x at all. - // replace X with 0 - if (xm) { - m = 0 - } - p = 0 - - if (gtlt === '>') { - // >1 => >=2.0.0 - // >1.2 => >=1.3.0 - gtlt = '>=' - if (xm) { - M = +M + 1 - m = 0 - p = 0 - } else { - m = +m + 1 - p = 0 - } - } else if (gtlt === '<=') { - // <=0.7.x is actually <0.8.0, since any 0.7.x should - // pass. Similarly, <=7.x is actually <8.0.0, etc. - gtlt = '<' - if (xm) { - M = +M + 1 - } else { - m = +m + 1 - } - } - - if (gtlt === '<') - pr = '-0' - - ret = `${gtlt + M}.${m}.${p}${pr}` - } else if (xm) { - ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0` - } else if (xp) { - ret = `>=${M}.${m}.0${pr - } <${M}.${+m + 1}.0-0` - } - - debug('xRange return', ret) - - return ret - }) -} - -// Because * is AND-ed with everything else in the comparator, -// and '' means "any version", just remove the *s entirely. -const replaceStars = (comp, options) => { - debug('replaceStars', comp, options) - // Looseness is ignored here. star is always as loose as it gets! - return comp.trim().replace(re[t.STAR], '') -} - -const replaceGTE0 = (comp, options) => { - debug('replaceGTE0', comp, options) - return comp.trim() - .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '') -} - -// This function is passed to string.replace(re[t.HYPHENRANGE]) -// M, m, patch, prerelease, build -// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 -// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do -// 1.2 - 3.4 => >=1.2.0 <3.5.0-0 -const hyphenReplace = incPr => ($0, - from, fM, fm, fp, fpr, fb, - to, tM, tm, tp, tpr, tb) => { - if (isX(fM)) { - from = '' - } else if (isX(fm)) { - from = `>=${fM}.0.0${incPr ? '-0' : ''}` - } else if (isX(fp)) { - from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}` - } else if (fpr) { - from = `>=${from}` - } else { - from = `>=${from}${incPr ? '-0' : ''}` - } - - if (isX(tM)) { - to = '' - } else if (isX(tm)) { - to = `<${+tM + 1}.0.0-0` - } else if (isX(tp)) { - to = `<${tM}.${+tm + 1}.0-0` - } else if (tpr) { - to = `<=${tM}.${tm}.${tp}-${tpr}` - } else if (incPr) { - to = `<${tM}.${tm}.${+tp + 1}-0` - } else { - to = `<=${to}` - } - - return (`${from} ${to}`).trim() -} - -const testSet = (set, version, options) => { - for (let i = 0; i < set.length; i++) { - if (!set[i].test(version)) { - return false - } - } - - if (version.prerelease.length && !options.includePrerelease) { - // Find the set of versions that are allowed to have prereleases - // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 - // That should allow `1.2.3-pr.2` to pass. - // However, `1.2.4-alpha.notready` should NOT be allowed, - // even though it's within the range set by the comparators. - for (let i = 0; i < set.length; i++) { - debug(set[i].semver) - if (set[i].semver === Comparator.ANY) { - continue - } - - if (set[i].semver.prerelease.length > 0) { - const allowed = set[i].semver - if (allowed.major === version.major && - allowed.minor === version.minor && - allowed.patch === version.patch) { - return true - } - } - } - - // Version has a -pre, but it's not one of the ones we like. - return false - } - - return true -} - - -/***/ }), - -/***/ 8088: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const debug = __nccwpck_require__(427) -const { MAX_LENGTH, MAX_SAFE_INTEGER } = __nccwpck_require__(2293) -const { re, t } = __nccwpck_require__(9523) - -const parseOptions = __nccwpck_require__(785) -const { compareIdentifiers } = __nccwpck_require__(2463) -class SemVer { - constructor (version, options) { - options = parseOptions(options) - - if (version instanceof SemVer) { - if (version.loose === !!options.loose && - version.includePrerelease === !!options.includePrerelease) { - return version - } else { - version = version.version - } - } else if (typeof version !== 'string') { - throw new TypeError(`Invalid Version: ${version}`) - } - - if (version.length > MAX_LENGTH) { - throw new TypeError( - `version is longer than ${MAX_LENGTH} characters` - ) - } - - debug('SemVer', version, options) - this.options = options - this.loose = !!options.loose - // this isn't actually relevant for versions, but keep it so that we - // don't run into trouble passing this.options around. - this.includePrerelease = !!options.includePrerelease - - const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]) - - if (!m) { - throw new TypeError(`Invalid Version: ${version}`) - } - - this.raw = version - - // these are actually numbers - this.major = +m[1] - this.minor = +m[2] - this.patch = +m[3] - - if (this.major > MAX_SAFE_INTEGER || this.major < 0) { - throw new TypeError('Invalid major version') - } - - if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { - throw new TypeError('Invalid minor version') - } - - if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { - throw new TypeError('Invalid patch version') - } - - // numberify any prerelease numeric ids - if (!m[4]) { - this.prerelease = [] - } else { - this.prerelease = m[4].split('.').map((id) => { - if (/^[0-9]+$/.test(id)) { - const num = +id - if (num >= 0 && num < MAX_SAFE_INTEGER) { - return num - } - } - return id - }) - } - - this.build = m[5] ? m[5].split('.') : [] - this.format() - } - - format () { - this.version = `${this.major}.${this.minor}.${this.patch}` - if (this.prerelease.length) { - this.version += `-${this.prerelease.join('.')}` - } - return this.version - } - - toString () { - return this.version - } - - compare (other) { - debug('SemVer.compare', this.version, this.options, other) - if (!(other instanceof SemVer)) { - if (typeof other === 'string' && other === this.version) { - return 0 - } - other = new SemVer(other, this.options) - } - - if (other.version === this.version) { - return 0 - } - - return this.compareMain(other) || this.comparePre(other) - } - - compareMain (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - return ( - compareIdentifiers(this.major, other.major) || - compareIdentifiers(this.minor, other.minor) || - compareIdentifiers(this.patch, other.patch) - ) - } - - comparePre (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - // NOT having a prerelease is > having one - if (this.prerelease.length && !other.prerelease.length) { - return -1 - } else if (!this.prerelease.length && other.prerelease.length) { - return 1 - } else if (!this.prerelease.length && !other.prerelease.length) { - return 0 - } - - let i = 0 - do { - const a = this.prerelease[i] - const b = other.prerelease[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - } - - compareBuild (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - let i = 0 - do { - const a = this.build[i] - const b = other.build[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - } - - // preminor will bump the version up to the next minor release, and immediately - // down to pre-release. premajor and prepatch work the same way. - inc (release, identifier) { - switch (release) { - case 'premajor': - this.prerelease.length = 0 - this.patch = 0 - this.minor = 0 - this.major++ - this.inc('pre', identifier) - break - case 'preminor': - this.prerelease.length = 0 - this.patch = 0 - this.minor++ - this.inc('pre', identifier) - break - case 'prepatch': - // If this is already a prerelease, it will bump to the next version - // drop any prereleases that might already exist, since they are not - // relevant at this point. - this.prerelease.length = 0 - this.inc('patch', identifier) - this.inc('pre', identifier) - break - // If the input is a non-prerelease version, this acts the same as - // prepatch. - case 'prerelease': - if (this.prerelease.length === 0) { - this.inc('patch', identifier) - } - this.inc('pre', identifier) - break - - case 'major': - // If this is a pre-major version, bump up to the same major version. - // Otherwise increment major. - // 1.0.0-5 bumps to 1.0.0 - // 1.1.0 bumps to 2.0.0 - if ( - this.minor !== 0 || - this.patch !== 0 || - this.prerelease.length === 0 - ) { - this.major++ - } - this.minor = 0 - this.patch = 0 - this.prerelease = [] - break - case 'minor': - // If this is a pre-minor version, bump up to the same minor version. - // Otherwise increment minor. - // 1.2.0-5 bumps to 1.2.0 - // 1.2.1 bumps to 1.3.0 - if (this.patch !== 0 || this.prerelease.length === 0) { - this.minor++ - } - this.patch = 0 - this.prerelease = [] - break - case 'patch': - // If this is not a pre-release version, it will increment the patch. - // If it is a pre-release it will bump up to the same patch version. - // 1.2.0-5 patches to 1.2.0 - // 1.2.0 patches to 1.2.1 - if (this.prerelease.length === 0) { - this.patch++ - } - this.prerelease = [] - break - // This probably shouldn't be used publicly. - // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction. - case 'pre': - if (this.prerelease.length === 0) { - this.prerelease = [0] - } else { - let i = this.prerelease.length - while (--i >= 0) { - if (typeof this.prerelease[i] === 'number') { - this.prerelease[i]++ - i = -2 - } - } - if (i === -1) { - // didn't increment anything - this.prerelease.push(0) - } - } - if (identifier) { - // 1.2.0-beta.1 bumps to 1.2.0-beta.2, - // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 - if (this.prerelease[0] === identifier) { - if (isNaN(this.prerelease[1])) { - this.prerelease = [identifier, 0] - } - } else { - this.prerelease = [identifier, 0] - } - } - break - - default: - throw new Error(`invalid increment argument: ${release}`) - } - this.format() - this.raw = this.version - return this - } -} - -module.exports = SemVer - - -/***/ }), - -/***/ 5098: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const eq = __nccwpck_require__(1898) -const neq = __nccwpck_require__(6017) -const gt = __nccwpck_require__(4123) -const gte = __nccwpck_require__(5522) -const lt = __nccwpck_require__(194) -const lte = __nccwpck_require__(7520) - -const cmp = (a, op, b, loose) => { - switch (op) { - case '===': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a === b - - case '!==': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a !== b - - case '': - case '=': - case '==': - return eq(a, b, loose) - - case '!=': - return neq(a, b, loose) - - case '>': - return gt(a, b, loose) - - case '>=': - return gte(a, b, loose) - - case '<': - return lt(a, b, loose) - - case '<=': - return lte(a, b, loose) - - default: - throw new TypeError(`Invalid operator: ${op}`) - } -} -module.exports = cmp - - -/***/ }), - -/***/ 4309: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const SemVer = __nccwpck_require__(8088) -const compare = (a, b, loose) => - new SemVer(a, loose).compare(new SemVer(b, loose)) - -module.exports = compare - - -/***/ }), - -/***/ 1898: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const eq = (a, b, loose) => compare(a, b, loose) === 0 -module.exports = eq - - -/***/ }), - -/***/ 4123: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const gt = (a, b, loose) => compare(a, b, loose) > 0 -module.exports = gt - - -/***/ }), - -/***/ 5522: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const gte = (a, b, loose) => compare(a, b, loose) >= 0 -module.exports = gte - - -/***/ }), - -/***/ 194: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const lt = (a, b, loose) => compare(a, b, loose) < 0 -module.exports = lt - - -/***/ }), - -/***/ 7520: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const lte = (a, b, loose) => compare(a, b, loose) <= 0 -module.exports = lte - - -/***/ }), - -/***/ 6017: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const neq = (a, b, loose) => compare(a, b, loose) !== 0 -module.exports = neq - - -/***/ }), - -/***/ 5925: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const {MAX_LENGTH} = __nccwpck_require__(2293) -const { re, t } = __nccwpck_require__(9523) -const SemVer = __nccwpck_require__(8088) - -const parseOptions = __nccwpck_require__(785) -const parse = (version, options) => { - options = parseOptions(options) - - if (version instanceof SemVer) { - return version - } - - if (typeof version !== 'string') { - return null - } - - if (version.length > MAX_LENGTH) { - return null - } - - const r = options.loose ? re[t.LOOSE] : re[t.FULL] - if (!r.test(version)) { - return null - } - - try { - return new SemVer(version, options) - } catch (er) { - return null - } -} - -module.exports = parse - - -/***/ }), - -/***/ 6055: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const Range = __nccwpck_require__(9828) -const satisfies = (version, range, options) => { - try { - range = new Range(range, options) - } catch (er) { - return false - } - return range.test(version) -} -module.exports = satisfies - - -/***/ }), - -/***/ 2293: -/***/ ((module) => { - -// Note: this is the semver.org version of the spec that it implements -// Not necessarily the package version of this code. -const SEMVER_SPEC_VERSION = '2.0.0' - -const MAX_LENGTH = 256 -const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || - /* istanbul ignore next */ 9007199254740991 - -// Max safe segment length for coercion. -const MAX_SAFE_COMPONENT_LENGTH = 16 - -module.exports = { - SEMVER_SPEC_VERSION, - MAX_LENGTH, - MAX_SAFE_INTEGER, - MAX_SAFE_COMPONENT_LENGTH -} - - -/***/ }), - -/***/ 427: -/***/ ((module) => { - -const debug = ( - typeof process === 'object' && - process.env && - process.env.NODE_DEBUG && - /\bsemver\b/i.test(process.env.NODE_DEBUG) -) ? (...args) => console.error('SEMVER', ...args) - : () => {} - -module.exports = debug - - -/***/ }), - -/***/ 2463: -/***/ ((module) => { - -const numeric = /^[0-9]+$/ -const compareIdentifiers = (a, b) => { - const anum = numeric.test(a) - const bnum = numeric.test(b) - - if (anum && bnum) { - a = +a - b = +b - } - - return a === b ? 0 - : (anum && !bnum) ? -1 - : (bnum && !anum) ? 1 - : a < b ? -1 - : 1 -} - -const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a) - -module.exports = { - compareIdentifiers, - rcompareIdentifiers -} - - -/***/ }), - -/***/ 785: -/***/ ((module) => { - -// parse out just the options we care about so we always get a consistent -// obj with keys in a consistent order. -const opts = ['includePrerelease', 'loose', 'rtl'] -const parseOptions = options => - !options ? {} - : typeof options !== 'object' ? { loose: true } - : opts.filter(k => options[k]).reduce((options, k) => { - options[k] = true - return options - }, {}) -module.exports = parseOptions - - -/***/ }), - -/***/ 9523: -/***/ ((module, exports, __nccwpck_require__) => { - -const { MAX_SAFE_COMPONENT_LENGTH } = __nccwpck_require__(2293) -const debug = __nccwpck_require__(427) -exports = module.exports = {} - -// The actual regexps go on exports.re -const re = exports.re = [] -const src = exports.src = [] -const t = exports.t = {} -let R = 0 - -const createToken = (name, value, isGlobal) => { - const index = R++ - debug(index, value) - t[name] = index - src[index] = value - re[index] = new RegExp(value, isGlobal ? 'g' : undefined) -} - -// The following Regular Expressions can be used for tokenizing, -// validating, and parsing SemVer version strings. - -// ## Numeric Identifier -// A single `0`, or a non-zero digit followed by zero or more digits. - -createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*') -createToken('NUMERICIDENTIFIERLOOSE', '[0-9]+') - -// ## Non-numeric Identifier -// Zero or more digits, followed by a letter or hyphen, and then zero or -// more letters, digits, or hyphens. - -createToken('NONNUMERICIDENTIFIER', '\\d*[a-zA-Z-][a-zA-Z0-9-]*') - -// ## Main Version -// Three dot-separated numeric identifiers. - -createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})`) - -createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})`) - -// ## Pre-release Version Identifier -// A numeric identifier, or a non-numeric identifier. - -createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER] -}|${src[t.NONNUMERICIDENTIFIER]})`) - -createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE] -}|${src[t.NONNUMERICIDENTIFIER]})`) - -// ## Pre-release Version -// Hyphen, followed by one or more dot-separated pre-release version -// identifiers. - -createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER] -}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`) - -createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE] -}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`) - -// ## Build Metadata Identifier -// Any combination of digits, letters, or hyphens. - -createToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+') - -// ## Build Metadata -// Plus sign, followed by one or more period-separated build metadata -// identifiers. - -createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER] -}(?:\\.${src[t.BUILDIDENTIFIER]})*))`) - -// ## Full Version String -// A main version, followed optionally by a pre-release version and -// build metadata. - -// Note that the only major, minor, patch, and pre-release sections of -// the version string are capturing groups. The build metadata is not a -// capturing group, because it should not ever be used in version -// comparison. - -createToken('FULLPLAIN', `v?${src[t.MAINVERSION] -}${src[t.PRERELEASE]}?${ - src[t.BUILD]}?`) - -createToken('FULL', `^${src[t.FULLPLAIN]}$`) - -// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. -// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty -// common in the npm registry. -createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE] -}${src[t.PRERELEASELOOSE]}?${ - src[t.BUILD]}?`) - -createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`) - -createToken('GTLT', '((?:<|>)?=?)') - -// Something like "2.*" or "1.2.x". -// Note that "x.x" is a valid xRange identifer, meaning "any version" -// Only the first item is strictly required. -createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`) -createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`) - -createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:${src[t.PRERELEASE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:${src[t.PRERELEASELOOSE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`) -createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`) - -// Coercion. -// Extract anything that could conceivably be a part of a valid semver -createToken('COERCE', `${'(^|[^\\d])' + - '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + - `(?:$|[^\\d])`) -createToken('COERCERTL', src[t.COERCE], true) - -// Tilde ranges. -// Meaning is "reasonably at or greater than" -createToken('LONETILDE', '(?:~>?)') - -createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true) -exports.tildeTrimReplace = '$1~' - -createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`) -createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`) - -// Caret ranges. -// Meaning is "at least and backwards compatible with" -createToken('LONECARET', '(?:\\^)') - -createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true) -exports.caretTrimReplace = '$1^' - -createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`) -createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`) - -// A simple gt/lt/eq thing, or just "" to indicate "any version" -createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`) -createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`) - -// An expression to strip any whitespace between the gtlt and the thing -// it modifies, so that `> 1.2.3` ==> `>1.2.3` -createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT] -}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true) -exports.comparatorTrimReplace = '$1$2$3' - -// Something like `1.2.3 - 1.2.4` -// Note that these all use the loose form, because they'll be -// checked against either the strict or loose comparator form -// later. -createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAIN]})` + - `\\s*$`) - -createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAINLOOSE]})` + - `\\s*$`) - -// Star ranges basically just allow anything at all. -createToken('STAR', '(<|>)?=?\\s*\\*') -// >=0.0.0 is like a star -createToken('GTE0', '^\\s*>=\\s*0\.0\.0\\s*$') -createToken('GTE0PRE', '^\\s*>=\\s*0\.0\.0-0\\s*$') - - -/***/ }), - -/***/ 1196: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - - -// A linked list to keep track of recently-used-ness -const Yallist = __nccwpck_require__(220) - -const MAX = Symbol('max') -const LENGTH = Symbol('length') -const LENGTH_CALCULATOR = Symbol('lengthCalculator') -const ALLOW_STALE = Symbol('allowStale') -const MAX_AGE = Symbol('maxAge') -const DISPOSE = Symbol('dispose') -const NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet') -const LRU_LIST = Symbol('lruList') -const CACHE = Symbol('cache') -const UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet') - -const naiveLength = () => 1 - -// lruList is a yallist where the head is the youngest -// item, and the tail is the oldest. the list contains the Hit -// objects as the entries. -// Each Hit object has a reference to its Yallist.Node. This -// never changes. -// -// cache is a Map (or PseudoMap) that matches the keys to -// the Yallist.Node object. -class LRUCache { - constructor (options) { - if (typeof options === 'number') - options = { max: options } - - if (!options) - options = {} - - if (options.max && (typeof options.max !== 'number' || options.max < 0)) - throw new TypeError('max must be a non-negative number') - // Kind of weird to have a default max of Infinity, but oh well. - const max = this[MAX] = options.max || Infinity - - const lc = options.length || naiveLength - this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc - this[ALLOW_STALE] = options.stale || false - if (options.maxAge && typeof options.maxAge !== 'number') - throw new TypeError('maxAge must be a number') - this[MAX_AGE] = options.maxAge || 0 - this[DISPOSE] = options.dispose - this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false - this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false - this.reset() - } - - // resize the cache when the max changes. - set max (mL) { - if (typeof mL !== 'number' || mL < 0) - throw new TypeError('max must be a non-negative number') - - this[MAX] = mL || Infinity - trim(this) - } - get max () { - return this[MAX] - } - - set allowStale (allowStale) { - this[ALLOW_STALE] = !!allowStale - } - get allowStale () { - return this[ALLOW_STALE] - } - - set maxAge (mA) { - if (typeof mA !== 'number') - throw new TypeError('maxAge must be a non-negative number') - - this[MAX_AGE] = mA - trim(this) - } - get maxAge () { - return this[MAX_AGE] - } - - // resize the cache when the lengthCalculator changes. - set lengthCalculator (lC) { - if (typeof lC !== 'function') - lC = naiveLength - - if (lC !== this[LENGTH_CALCULATOR]) { - this[LENGTH_CALCULATOR] = lC - this[LENGTH] = 0 - this[LRU_LIST].forEach(hit => { - hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key) - this[LENGTH] += hit.length - }) - } - trim(this) - } - get lengthCalculator () { return this[LENGTH_CALCULATOR] } - - get length () { return this[LENGTH] } - get itemCount () { return this[LRU_LIST].length } - - rforEach (fn, thisp) { - thisp = thisp || this - for (let walker = this[LRU_LIST].tail; walker !== null;) { - const prev = walker.prev - forEachStep(this, fn, walker, thisp) - walker = prev - } - } - - forEach (fn, thisp) { - thisp = thisp || this - for (let walker = this[LRU_LIST].head; walker !== null;) { - const next = walker.next - forEachStep(this, fn, walker, thisp) - walker = next - } - } - - keys () { - return this[LRU_LIST].toArray().map(k => k.key) - } - - values () { - return this[LRU_LIST].toArray().map(k => k.value) - } - - reset () { - if (this[DISPOSE] && - this[LRU_LIST] && - this[LRU_LIST].length) { - this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value)) - } - - this[CACHE] = new Map() // hash of items by key - this[LRU_LIST] = new Yallist() // list of items in order of use recency - this[LENGTH] = 0 // length of items in the list - } - - dump () { - return this[LRU_LIST].map(hit => - isStale(this, hit) ? false : { - k: hit.key, - v: hit.value, - e: hit.now + (hit.maxAge || 0) - }).toArray().filter(h => h) - } - - dumpLru () { - return this[LRU_LIST] - } - - set (key, value, maxAge) { - maxAge = maxAge || this[MAX_AGE] - - if (maxAge && typeof maxAge !== 'number') - throw new TypeError('maxAge must be a number') - - const now = maxAge ? Date.now() : 0 - const len = this[LENGTH_CALCULATOR](value, key) - - if (this[CACHE].has(key)) { - if (len > this[MAX]) { - del(this, this[CACHE].get(key)) - return false - } - - const node = this[CACHE].get(key) - const item = node.value - - // dispose of the old one before overwriting - // split out into 2 ifs for better coverage tracking - if (this[DISPOSE]) { - if (!this[NO_DISPOSE_ON_SET]) - this[DISPOSE](key, item.value) - } - - item.now = now - item.maxAge = maxAge - item.value = value - this[LENGTH] += len - item.length - item.length = len - this.get(key) - trim(this) - return true - } - - const hit = new Entry(key, value, len, now, maxAge) - - // oversized objects fall out of cache automatically. - if (hit.length > this[MAX]) { - if (this[DISPOSE]) - this[DISPOSE](key, value) - - return false - } - - this[LENGTH] += hit.length - this[LRU_LIST].unshift(hit) - this[CACHE].set(key, this[LRU_LIST].head) - trim(this) - return true - } - - has (key) { - if (!this[CACHE].has(key)) return false - const hit = this[CACHE].get(key).value - return !isStale(this, hit) - } - - get (key) { - return get(this, key, true) - } - - peek (key) { - return get(this, key, false) - } - - pop () { - const node = this[LRU_LIST].tail - if (!node) - return null - - del(this, node) - return node.value - } - - del (key) { - del(this, this[CACHE].get(key)) - } - - load (arr) { - // reset the cache - this.reset() - - const now = Date.now() - // A previous serialized cache has the most recent items first - for (let l = arr.length - 1; l >= 0; l--) { - const hit = arr[l] - const expiresAt = hit.e || 0 - if (expiresAt === 0) - // the item was created without expiration in a non aged cache - this.set(hit.k, hit.v) - else { - const maxAge = expiresAt - now - // dont add already expired items - if (maxAge > 0) { - this.set(hit.k, hit.v, maxAge) - } - } - } - } - - prune () { - this[CACHE].forEach((value, key) => get(this, key, false)) - } -} - -const get = (self, key, doUse) => { - const node = self[CACHE].get(key) - if (node) { - const hit = node.value - if (isStale(self, hit)) { - del(self, node) - if (!self[ALLOW_STALE]) - return undefined - } else { - if (doUse) { - if (self[UPDATE_AGE_ON_GET]) - node.value.now = Date.now() - self[LRU_LIST].unshiftNode(node) - } - } - return hit.value - } -} - -const isStale = (self, hit) => { - if (!hit || (!hit.maxAge && !self[MAX_AGE])) - return false - - const diff = Date.now() - hit.now - return hit.maxAge ? diff > hit.maxAge - : self[MAX_AGE] && (diff > self[MAX_AGE]) -} - -const trim = self => { - if (self[LENGTH] > self[MAX]) { - for (let walker = self[LRU_LIST].tail; - self[LENGTH] > self[MAX] && walker !== null;) { - // We know that we're about to delete this one, and also - // what the next least recently used key will be, so just - // go ahead and set it now. - const prev = walker.prev - del(self, walker) - walker = prev - } - } -} - -const del = (self, node) => { - if (node) { - const hit = node.value - if (self[DISPOSE]) - self[DISPOSE](hit.key, hit.value) - - self[LENGTH] -= hit.length - self[CACHE].delete(hit.key) - self[LRU_LIST].removeNode(node) - } -} - -class Entry { - constructor (key, value, length, now, maxAge) { - this.key = key - this.value = value - this.length = length - this.now = now - this.maxAge = maxAge || 0 - } -} - -const forEachStep = (self, fn, node, thisp) => { - let hit = node.value - if (isStale(self, hit)) { - del(self, node) - if (!self[ALLOW_STALE]) - hit = undefined - } - if (hit) - fn.call(thisp, hit.value, hit.key, self) -} - -module.exports = LRUCache - - -/***/ }), - -/***/ 5327: -/***/ ((module) => { - -"use strict"; - -module.exports = function (Yallist) { - Yallist.prototype[Symbol.iterator] = function* () { - for (let walker = this.head; walker; walker = walker.next) { - yield walker.value - } - } -} - - -/***/ }), - -/***/ 220: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - -module.exports = Yallist - -Yallist.Node = Node -Yallist.create = Yallist - -function Yallist (list) { - var self = this - if (!(self instanceof Yallist)) { - self = new Yallist() - } - - self.tail = null - self.head = null - self.length = 0 - - if (list && typeof list.forEach === 'function') { - list.forEach(function (item) { - self.push(item) - }) - } else if (arguments.length > 0) { - for (var i = 0, l = arguments.length; i < l; i++) { - self.push(arguments[i]) - } - } - - return self -} - -Yallist.prototype.removeNode = function (node) { - if (node.list !== this) { - throw new Error('removing node which does not belong to this list') - } - - var next = node.next - var prev = node.prev - - if (next) { - next.prev = prev - } - - if (prev) { - prev.next = next - } - - if (node === this.head) { - this.head = next - } - if (node === this.tail) { - this.tail = prev - } - - node.list.length-- - node.next = null - node.prev = null - node.list = null - - return next -} - -Yallist.prototype.unshiftNode = function (node) { - if (node === this.head) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var head = this.head - node.list = this - node.next = head - if (head) { - head.prev = node - } - - this.head = node - if (!this.tail) { - this.tail = node - } - this.length++ -} - -Yallist.prototype.pushNode = function (node) { - if (node === this.tail) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var tail = this.tail - node.list = this - node.prev = tail - if (tail) { - tail.next = node - } - - this.tail = node - if (!this.head) { - this.head = node - } - this.length++ -} - -Yallist.prototype.push = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - push(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.unshift = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - unshift(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.pop = function () { - if (!this.tail) { - return undefined - } - - var res = this.tail.value - this.tail = this.tail.prev - if (this.tail) { - this.tail.next = null - } else { - this.head = null - } - this.length-- - return res -} - -Yallist.prototype.shift = function () { - if (!this.head) { - return undefined - } - - var res = this.head.value - this.head = this.head.next - if (this.head) { - this.head.prev = null - } else { - this.tail = null - } - this.length-- - return res -} - -Yallist.prototype.forEach = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.head, i = 0; walker !== null; i++) { - fn.call(thisp, walker.value, i, this) - walker = walker.next - } -} - -Yallist.prototype.forEachReverse = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.tail, i = this.length - 1; walker !== null; i--) { - fn.call(thisp, walker.value, i, this) - walker = walker.prev - } -} - -Yallist.prototype.get = function (n) { - for (var i = 0, walker = this.head; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.next - } - if (i === n && walker !== null) { - return walker.value - } -} - -Yallist.prototype.getReverse = function (n) { - for (var i = 0, walker = this.tail; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.prev - } - if (i === n && walker !== null) { - return walker.value - } -} - -Yallist.prototype.map = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.head; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.next - } - return res -} - -Yallist.prototype.mapReverse = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.tail; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.prev - } - return res -} - -Yallist.prototype.reduce = function (fn, initial) { - var acc - var walker = this.head - if (arguments.length > 1) { - acc = initial - } else if (this.head) { - walker = this.head.next - acc = this.head.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } - - for (var i = 0; walker !== null; i++) { - acc = fn(acc, walker.value, i) - walker = walker.next - } - - return acc -} - -Yallist.prototype.reduceReverse = function (fn, initial) { - var acc - var walker = this.tail - if (arguments.length > 1) { - acc = initial - } else if (this.tail) { - walker = this.tail.prev - acc = this.tail.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } - - for (var i = this.length - 1; walker !== null; i--) { - acc = fn(acc, walker.value, i) - walker = walker.prev - } - - return acc -} - -Yallist.prototype.toArray = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.head; walker !== null; i++) { - arr[i] = walker.value - walker = walker.next - } - return arr -} - -Yallist.prototype.toArrayReverse = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.tail; walker !== null; i++) { - arr[i] = walker.value - walker = walker.prev - } - return arr -} - -Yallist.prototype.slice = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = 0, walker = this.head; walker !== null && i < from; i++) { - walker = walker.next - } - for (; walker !== null && i < to; i++, walker = walker.next) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.sliceReverse = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) { - walker = walker.prev - } - for (; walker !== null && i > from; i--, walker = walker.prev) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.splice = function (start, deleteCount, ...nodes) { - if (start > this.length) { - start = this.length - 1 - } - if (start < 0) { - start = this.length + start; - } - - for (var i = 0, walker = this.head; walker !== null && i < start; i++) { - walker = walker.next - } - - var ret = [] - for (var i = 0; walker && i < deleteCount; i++) { - ret.push(walker.value) - walker = this.removeNode(walker) - } - if (walker === null) { - walker = this.tail - } - - if (walker !== this.head && walker !== this.tail) { - walker = walker.prev - } - - for (var i = 0; i < nodes.length; i++) { - walker = insert(this, walker, nodes[i]) - } - return ret; -} - -Yallist.prototype.reverse = function () { - var head = this.head - var tail = this.tail - for (var walker = head; walker !== null; walker = walker.prev) { - var p = walker.prev - walker.prev = walker.next - walker.next = p - } - this.head = tail - this.tail = head - return this -} - -function insert (self, node, value) { - var inserted = node === self.head ? - new Node(value, null, node, self) : - new Node(value, node, node.next, self) - - if (inserted.next === null) { - self.tail = inserted - } - if (inserted.prev === null) { - self.head = inserted - } - - self.length++ - - return inserted -} - -function push (self, item) { - self.tail = new Node(item, self.tail, null, self) - if (!self.head) { - self.head = self.tail - } - self.length++ -} - -function unshift (self, item) { - self.head = new Node(item, null, self.head, self) - if (!self.tail) { - self.tail = self.head - } - self.length++ -} - -function Node (value, prev, next, list) { - if (!(this instanceof Node)) { - return new Node(value, prev, next, list) - } - - this.list = list - this.value = value - - if (prev) { - prev.next = this - this.prev = prev - } else { - this.prev = null - } - - if (next) { - next.prev = this - this.next = next - } else { - this.next = null - } -} - -try { - // add if support for Symbol.iterator is present - __nccwpck_require__(5327)(Yallist) -} catch (er) {} - - /***/ }), /***/ 4294: diff --git a/.github/actions/reopenIssueWithComment/index.js b/.github/actions/reopenIssueWithComment/index.js index a8ac89842010..26f9a663122e 100644 --- a/.github/actions/reopenIssueWithComment/index.js +++ b/.github/actions/reopenIssueWithComment/index.js @@ -53,8 +53,6 @@ reopenIssueWithComment() const _ = __nccwpck_require__(4987); const lodashGet = __nccwpck_require__(6908); -const semverParse = __nccwpck_require__(5925); -const semverSatisfies = __nccwpck_require__(6055); const GITHUB_OWNER = 'Expensify'; const EXPENSIFY_CASH_REPO = 'Expensify.cash'; @@ -115,11 +113,6 @@ class GithubUtils { try { const versionRegex = new RegExp('([0-9]+)\\.([0-9]+)\\.([0-9]+)(?:-([0-9]+))?', 'g'); const tag = issue.body.match(versionRegex)[0].replace(/`/g, ''); - - // eslint-disable-next-line max-len - const compareURLRegex = new RegExp(`${EXPENSIFY_CASH_URL}/compare/${versionRegex.source}\\.\\.\\.${versionRegex.source}`, 'g'); - const comparisonURL = issue.body.match(compareURLRegex)[0]; - return { title: issue.title, url: issue.url, @@ -127,7 +120,6 @@ class GithubUtils { PRList: this.getStagingDeployCashPRList(issue), deployBlockers: this.getStagingDeployCashDeployBlockers(issue), tag, - comparisonURL, }; } catch (exception) { throw new Error(`Unable to find ${STAGING_DEPLOY_CASH_LABEL} issue with correct data.`); @@ -202,71 +194,6 @@ class GithubUtils { ); } - /** - * Generate a comparison URL between two versions following the semverLevel passed - * - * @param {String} repoSlug - The slug of the repository: / - * @param {String} tag - The tag to compare first the previous semverLevel - * @param {String} semverLevel - The semantic versioning MAJOR, MINOR, PATCH and BUILD - * @return {Promise} the url generated - * @throws {Error} If the request to the Github API fails. - */ - generateVersionComparisonURL(repoSlug, tag, semverLevel) { - return new Promise((resolve, reject) => { - const getComparisonURL = (previousTag, currentTag) => ( - `${EXPENSIFY_CASH_URL}/compare/${previousTag}...${currentTag}` - ); - - const [repoOwner, repoName] = repoSlug.split('/'); - const tagSemver = semverParse(tag); - - return this.octokit.repos.listTags({ - owner: repoOwner, - repo: repoName, - }) - .then(githubResponse => githubResponse.data.some(({name: repoTag}) => { - if (semverLevel === 'MAJOR' - && semverSatisfies(repoTag, `<${tagSemver.major}.x.x`, {includePrerelease: true}) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'MINOR' - && semverSatisfies( - repoTag, - `<${tagSemver.major}.${tagSemver.minor}.x`, - {includePrerelease: true}, - ) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'PATCH' - && semverSatisfies(repoTag, `<${tagSemver}`, {includePrerelease: true}) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'BUILD' - && repoTag !== tagSemver.version - && semverSatisfies( - repoTag, - `<=${tagSemver.major}.${tagSemver.minor}.${tagSemver.patch}`, - {includePrerelease: true}, - ) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - return false; - })) - .catch(githubError => reject(githubError)); - }); - } - /** * Creates a new StagingDeployCash issue. * @@ -362,22 +289,16 @@ class GithubUtils { deployBlockers = [], resolvedDeployBlockers = [], ) { - return Promise.all([ - this.generateVersionComparisonURL(`${GITHUB_OWNER}/${EXPENSIFY_CASH_REPO}`, tag, 'PATCH'), - this.octokit.pulls.list({ - owner: GITHUB_OWNER, - repo: EXPENSIFY_CASH_REPO, - per_page: 100, - }), - ]) - .then(results => ({ - comparisonURL: results[0], - automergePRs: _.map( - _.filter(results[1].data, GithubUtils.isAutomergePullRequest), + return this.octokit.pulls.list({ + owner: GITHUB_OWNER, + repo: EXPENSIFY_CASH_REPO, + per_page: 100, + }) + .then(({data}) => { + const automergePRs = _.pluck( + _.filter(data, GithubUtils.isAutomergePullRequest), 'html_url', - ), - })) - .then(({comparisonURL, automergePRs}) => { + ); const sortedPRList = _.chain(PRList) .difference(automergePRs) .unique() @@ -389,8 +310,8 @@ class GithubUtils { ); // Tag version and comparison URL - let issueBody = `**Release Version:** \`${tag}\`\r\n`; - issueBody += `**Compare Changes:** ${comparisonURL}\r\n`; + // eslint-disable-next-line max-len + let issueBody = `**Release Version:** \`${tag}\`\r\n**Compare Changes:** https://github.com/Expensify/Expensify.cash/compare/production...staging\r\n`; // PR list if (!_.isEmpty(PRList)) { @@ -411,11 +332,13 @@ class GithubUtils { } issueBody += '\r\ncc @Expensify/applauseleads\r\n'; - return issueBody; }) - // eslint-disable-next-line no-console - .catch(err => console.warn('Error generating comparison URL, continuing...', err)); + .catch(err => console.warn( + 'Error generating StagingDeployCash issue body!', + 'Automerge PRs may not be properly filtered out. Continuing...', + err, + )); } /** @@ -10761,2212 +10684,6 @@ if (!safer.constants) { module.exports = safer -/***/ }), - -/***/ 1532: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const ANY = Symbol('SemVer ANY') -// hoisted class for cyclic dependency -class Comparator { - static get ANY () { - return ANY - } - constructor (comp, options) { - options = parseOptions(options) - - if (comp instanceof Comparator) { - if (comp.loose === !!options.loose) { - return comp - } else { - comp = comp.value - } - } - - debug('comparator', comp, options) - this.options = options - this.loose = !!options.loose - this.parse(comp) - - if (this.semver === ANY) { - this.value = '' - } else { - this.value = this.operator + this.semver.version - } - - debug('comp', this) - } - - parse (comp) { - const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] - const m = comp.match(r) - - if (!m) { - throw new TypeError(`Invalid comparator: ${comp}`) - } - - this.operator = m[1] !== undefined ? m[1] : '' - if (this.operator === '=') { - this.operator = '' - } - - // if it literally is just '>' or '' then allow anything. - if (!m[2]) { - this.semver = ANY - } else { - this.semver = new SemVer(m[2], this.options.loose) - } - } - - toString () { - return this.value - } - - test (version) { - debug('Comparator.test', version, this.options.loose) - - if (this.semver === ANY || version === ANY) { - return true - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - return cmp(version, this.operator, this.semver, this.options) - } - - intersects (comp, options) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required') - } - - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - if (this.operator === '') { - if (this.value === '') { - return true - } - return new Range(comp.value, options).test(this.value) - } else if (comp.operator === '') { - if (comp.value === '') { - return true - } - return new Range(this.value, options).test(comp.semver) - } - - const sameDirectionIncreasing = - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '>=' || comp.operator === '>') - const sameDirectionDecreasing = - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '<=' || comp.operator === '<') - const sameSemVer = this.semver.version === comp.semver.version - const differentDirectionsInclusive = - (this.operator === '>=' || this.operator === '<=') && - (comp.operator === '>=' || comp.operator === '<=') - const oppositeDirectionsLessThan = - cmp(this.semver, '<', comp.semver, options) && - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '<=' || comp.operator === '<') - const oppositeDirectionsGreaterThan = - cmp(this.semver, '>', comp.semver, options) && - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '>=' || comp.operator === '>') - - return ( - sameDirectionIncreasing || - sameDirectionDecreasing || - (sameSemVer && differentDirectionsInclusive) || - oppositeDirectionsLessThan || - oppositeDirectionsGreaterThan - ) - } -} - -module.exports = Comparator - -const parseOptions = __nccwpck_require__(785) -const {re, t} = __nccwpck_require__(9523) -const cmp = __nccwpck_require__(5098) -const debug = __nccwpck_require__(427) -const SemVer = __nccwpck_require__(8088) -const Range = __nccwpck_require__(9828) - - -/***/ }), - -/***/ 9828: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -// hoisted class for cyclic dependency -class Range { - constructor (range, options) { - options = parseOptions(options) - - if (range instanceof Range) { - if ( - range.loose === !!options.loose && - range.includePrerelease === !!options.includePrerelease - ) { - return range - } else { - return new Range(range.raw, options) - } - } - - if (range instanceof Comparator) { - // just put it in the set and return - this.raw = range.value - this.set = [[range]] - this.format() - return this - } - - this.options = options - this.loose = !!options.loose - this.includePrerelease = !!options.includePrerelease - - // First, split based on boolean or || - this.raw = range - this.set = range - .split(/\s*\|\|\s*/) - // map the range to a 2d array of comparators - .map(range => this.parseRange(range.trim())) - // throw out any comparator lists that are empty - // this generally means that it was not a valid range, which is allowed - // in loose mode, but will still throw if the WHOLE range is invalid. - .filter(c => c.length) - - if (!this.set.length) { - throw new TypeError(`Invalid SemVer Range: ${range}`) - } - - // if we have any that are not the null set, throw out null sets. - if (this.set.length > 1) { - // keep the first one, in case they're all null sets - const first = this.set[0] - this.set = this.set.filter(c => !isNullSet(c[0])) - if (this.set.length === 0) - this.set = [first] - else if (this.set.length > 1) { - // if we have any that are *, then the range is just * - for (const c of this.set) { - if (c.length === 1 && isAny(c[0])) { - this.set = [c] - break - } - } - } - } - - this.format() - } - - format () { - this.range = this.set - .map((comps) => { - return comps.join(' ').trim() - }) - .join('||') - .trim() - return this.range - } - - toString () { - return this.range - } - - parseRange (range) { - range = range.trim() - - // memoize range parsing for performance. - // this is a very hot path, and fully deterministic. - const memoOpts = Object.keys(this.options).join(',') - const memoKey = `parseRange:${memoOpts}:${range}` - const cached = cache.get(memoKey) - if (cached) - return cached - - const loose = this.options.loose - // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` - const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE] - range = range.replace(hr, hyphenReplace(this.options.includePrerelease)) - debug('hyphen replace', range) - // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` - range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace) - debug('comparator trim', range, re[t.COMPARATORTRIM]) - - // `~ 1.2.3` => `~1.2.3` - range = range.replace(re[t.TILDETRIM], tildeTrimReplace) - - // `^ 1.2.3` => `^1.2.3` - range = range.replace(re[t.CARETTRIM], caretTrimReplace) - - // normalize spaces - range = range.split(/\s+/).join(' ') - - // At this point, the range is completely trimmed and - // ready to be split into comparators. - - const compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] - const rangeList = range - .split(' ') - .map(comp => parseComparator(comp, this.options)) - .join(' ') - .split(/\s+/) - // >=0.0.0 is equivalent to * - .map(comp => replaceGTE0(comp, this.options)) - // in loose mode, throw out any that are not valid comparators - .filter(this.options.loose ? comp => !!comp.match(compRe) : () => true) - .map(comp => new Comparator(comp, this.options)) - - // if any comparators are the null set, then replace with JUST null set - // if more than one comparator, remove any * comparators - // also, don't include the same comparator more than once - const l = rangeList.length - const rangeMap = new Map() - for (const comp of rangeList) { - if (isNullSet(comp)) - return [comp] - rangeMap.set(comp.value, comp) - } - if (rangeMap.size > 1 && rangeMap.has('')) - rangeMap.delete('') - - const result = [...rangeMap.values()] - cache.set(memoKey, result) - return result - } - - intersects (range, options) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required') - } - - return this.set.some((thisComparators) => { - return ( - isSatisfiable(thisComparators, options) && - range.set.some((rangeComparators) => { - return ( - isSatisfiable(rangeComparators, options) && - thisComparators.every((thisComparator) => { - return rangeComparators.every((rangeComparator) => { - return thisComparator.intersects(rangeComparator, options) - }) - }) - ) - }) - ) - }) - } - - // if ANY of the sets match ALL of its comparators, then pass - test (version) { - if (!version) { - return false - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - for (let i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version, this.options)) { - return true - } - } - return false - } -} -module.exports = Range - -const LRU = __nccwpck_require__(1196) -const cache = new LRU({ max: 1000 }) - -const parseOptions = __nccwpck_require__(785) -const Comparator = __nccwpck_require__(1532) -const debug = __nccwpck_require__(427) -const SemVer = __nccwpck_require__(8088) -const { - re, - t, - comparatorTrimReplace, - tildeTrimReplace, - caretTrimReplace -} = __nccwpck_require__(9523) - -const isNullSet = c => c.value === '<0.0.0-0' -const isAny = c => c.value === '' - -// take a set of comparators and determine whether there -// exists a version which can satisfy it -const isSatisfiable = (comparators, options) => { - let result = true - const remainingComparators = comparators.slice() - let testComparator = remainingComparators.pop() - - while (result && remainingComparators.length) { - result = remainingComparators.every((otherComparator) => { - return testComparator.intersects(otherComparator, options) - }) - - testComparator = remainingComparators.pop() - } - - return result -} - -// comprised of xranges, tildes, stars, and gtlt's at this point. -// already replaced the hyphen ranges -// turn into a set of JUST comparators. -const parseComparator = (comp, options) => { - debug('comp', comp, options) - comp = replaceCarets(comp, options) - debug('caret', comp) - comp = replaceTildes(comp, options) - debug('tildes', comp) - comp = replaceXRanges(comp, options) - debug('xrange', comp) - comp = replaceStars(comp, options) - debug('stars', comp) - return comp -} - -const isX = id => !id || id.toLowerCase() === 'x' || id === '*' - -// ~, ~> --> * (any, kinda silly) -// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0 -// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0 -// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0 -// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0 -// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0 -const replaceTildes = (comp, options) => - comp.trim().split(/\s+/).map((comp) => { - return replaceTilde(comp, options) - }).join(' ') - -const replaceTilde = (comp, options) => { - const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] - return comp.replace(r, (_, M, m, p, pr) => { - debug('tilde', comp, _, M, m, p, pr) - let ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = `>=${M}.0.0 <${+M + 1}.0.0-0` - } else if (isX(p)) { - // ~1.2 == >=1.2.0 <1.3.0-0 - ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0` - } else if (pr) { - debug('replaceTilde pr', pr) - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${+m + 1}.0-0` - } else { - // ~1.2.3 == >=1.2.3 <1.3.0-0 - ret = `>=${M}.${m}.${p - } <${M}.${+m + 1}.0-0` - } - - debug('tilde return', ret) - return ret - }) -} - -// ^ --> * (any, kinda silly) -// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0 -// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0 -// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0 -// ^1.2.3 --> >=1.2.3 <2.0.0-0 -// ^1.2.0 --> >=1.2.0 <2.0.0-0 -const replaceCarets = (comp, options) => - comp.trim().split(/\s+/).map((comp) => { - return replaceCaret(comp, options) - }).join(' ') - -const replaceCaret = (comp, options) => { - debug('caret', comp, options) - const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET] - const z = options.includePrerelease ? '-0' : '' - return comp.replace(r, (_, M, m, p, pr) => { - debug('caret', comp, _, M, m, p, pr) - let ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0` - } else if (isX(p)) { - if (M === '0') { - ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0` - } else { - ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0` - } - } else if (pr) { - debug('replaceCaret pr', pr) - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${m}.${+p + 1}-0` - } else { - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${+m + 1}.0-0` - } - } else { - ret = `>=${M}.${m}.${p}-${pr - } <${+M + 1}.0.0-0` - } - } else { - debug('no pr') - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p - }${z} <${M}.${m}.${+p + 1}-0` - } else { - ret = `>=${M}.${m}.${p - }${z} <${M}.${+m + 1}.0-0` - } - } else { - ret = `>=${M}.${m}.${p - } <${+M + 1}.0.0-0` - } - } - - debug('caret return', ret) - return ret - }) -} - -const replaceXRanges = (comp, options) => { - debug('replaceXRanges', comp, options) - return comp.split(/\s+/).map((comp) => { - return replaceXRange(comp, options) - }).join(' ') -} - -const replaceXRange = (comp, options) => { - comp = comp.trim() - const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE] - return comp.replace(r, (ret, gtlt, M, m, p, pr) => { - debug('xRange', comp, ret, gtlt, M, m, p, pr) - const xM = isX(M) - const xm = xM || isX(m) - const xp = xm || isX(p) - const anyX = xp - - if (gtlt === '=' && anyX) { - gtlt = '' - } - - // if we're including prereleases in the match, then we need - // to fix this to -0, the lowest possible prerelease value - pr = options.includePrerelease ? '-0' : '' - - if (xM) { - if (gtlt === '>' || gtlt === '<') { - // nothing is allowed - ret = '<0.0.0-0' - } else { - // nothing is forbidden - ret = '*' - } - } else if (gtlt && anyX) { - // we know patch is an x, because we have any x at all. - // replace X with 0 - if (xm) { - m = 0 - } - p = 0 - - if (gtlt === '>') { - // >1 => >=2.0.0 - // >1.2 => >=1.3.0 - gtlt = '>=' - if (xm) { - M = +M + 1 - m = 0 - p = 0 - } else { - m = +m + 1 - p = 0 - } - } else if (gtlt === '<=') { - // <=0.7.x is actually <0.8.0, since any 0.7.x should - // pass. Similarly, <=7.x is actually <8.0.0, etc. - gtlt = '<' - if (xm) { - M = +M + 1 - } else { - m = +m + 1 - } - } - - if (gtlt === '<') - pr = '-0' - - ret = `${gtlt + M}.${m}.${p}${pr}` - } else if (xm) { - ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0` - } else if (xp) { - ret = `>=${M}.${m}.0${pr - } <${M}.${+m + 1}.0-0` - } - - debug('xRange return', ret) - - return ret - }) -} - -// Because * is AND-ed with everything else in the comparator, -// and '' means "any version", just remove the *s entirely. -const replaceStars = (comp, options) => { - debug('replaceStars', comp, options) - // Looseness is ignored here. star is always as loose as it gets! - return comp.trim().replace(re[t.STAR], '') -} - -const replaceGTE0 = (comp, options) => { - debug('replaceGTE0', comp, options) - return comp.trim() - .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '') -} - -// This function is passed to string.replace(re[t.HYPHENRANGE]) -// M, m, patch, prerelease, build -// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 -// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do -// 1.2 - 3.4 => >=1.2.0 <3.5.0-0 -const hyphenReplace = incPr => ($0, - from, fM, fm, fp, fpr, fb, - to, tM, tm, tp, tpr, tb) => { - if (isX(fM)) { - from = '' - } else if (isX(fm)) { - from = `>=${fM}.0.0${incPr ? '-0' : ''}` - } else if (isX(fp)) { - from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}` - } else if (fpr) { - from = `>=${from}` - } else { - from = `>=${from}${incPr ? '-0' : ''}` - } - - if (isX(tM)) { - to = '' - } else if (isX(tm)) { - to = `<${+tM + 1}.0.0-0` - } else if (isX(tp)) { - to = `<${tM}.${+tm + 1}.0-0` - } else if (tpr) { - to = `<=${tM}.${tm}.${tp}-${tpr}` - } else if (incPr) { - to = `<${tM}.${tm}.${+tp + 1}-0` - } else { - to = `<=${to}` - } - - return (`${from} ${to}`).trim() -} - -const testSet = (set, version, options) => { - for (let i = 0; i < set.length; i++) { - if (!set[i].test(version)) { - return false - } - } - - if (version.prerelease.length && !options.includePrerelease) { - // Find the set of versions that are allowed to have prereleases - // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 - // That should allow `1.2.3-pr.2` to pass. - // However, `1.2.4-alpha.notready` should NOT be allowed, - // even though it's within the range set by the comparators. - for (let i = 0; i < set.length; i++) { - debug(set[i].semver) - if (set[i].semver === Comparator.ANY) { - continue - } - - if (set[i].semver.prerelease.length > 0) { - const allowed = set[i].semver - if (allowed.major === version.major && - allowed.minor === version.minor && - allowed.patch === version.patch) { - return true - } - } - } - - // Version has a -pre, but it's not one of the ones we like. - return false - } - - return true -} - - -/***/ }), - -/***/ 8088: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const debug = __nccwpck_require__(427) -const { MAX_LENGTH, MAX_SAFE_INTEGER } = __nccwpck_require__(2293) -const { re, t } = __nccwpck_require__(9523) - -const parseOptions = __nccwpck_require__(785) -const { compareIdentifiers } = __nccwpck_require__(2463) -class SemVer { - constructor (version, options) { - options = parseOptions(options) - - if (version instanceof SemVer) { - if (version.loose === !!options.loose && - version.includePrerelease === !!options.includePrerelease) { - return version - } else { - version = version.version - } - } else if (typeof version !== 'string') { - throw new TypeError(`Invalid Version: ${version}`) - } - - if (version.length > MAX_LENGTH) { - throw new TypeError( - `version is longer than ${MAX_LENGTH} characters` - ) - } - - debug('SemVer', version, options) - this.options = options - this.loose = !!options.loose - // this isn't actually relevant for versions, but keep it so that we - // don't run into trouble passing this.options around. - this.includePrerelease = !!options.includePrerelease - - const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]) - - if (!m) { - throw new TypeError(`Invalid Version: ${version}`) - } - - this.raw = version - - // these are actually numbers - this.major = +m[1] - this.minor = +m[2] - this.patch = +m[3] - - if (this.major > MAX_SAFE_INTEGER || this.major < 0) { - throw new TypeError('Invalid major version') - } - - if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { - throw new TypeError('Invalid minor version') - } - - if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { - throw new TypeError('Invalid patch version') - } - - // numberify any prerelease numeric ids - if (!m[4]) { - this.prerelease = [] - } else { - this.prerelease = m[4].split('.').map((id) => { - if (/^[0-9]+$/.test(id)) { - const num = +id - if (num >= 0 && num < MAX_SAFE_INTEGER) { - return num - } - } - return id - }) - } - - this.build = m[5] ? m[5].split('.') : [] - this.format() - } - - format () { - this.version = `${this.major}.${this.minor}.${this.patch}` - if (this.prerelease.length) { - this.version += `-${this.prerelease.join('.')}` - } - return this.version - } - - toString () { - return this.version - } - - compare (other) { - debug('SemVer.compare', this.version, this.options, other) - if (!(other instanceof SemVer)) { - if (typeof other === 'string' && other === this.version) { - return 0 - } - other = new SemVer(other, this.options) - } - - if (other.version === this.version) { - return 0 - } - - return this.compareMain(other) || this.comparePre(other) - } - - compareMain (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - return ( - compareIdentifiers(this.major, other.major) || - compareIdentifiers(this.minor, other.minor) || - compareIdentifiers(this.patch, other.patch) - ) - } - - comparePre (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - // NOT having a prerelease is > having one - if (this.prerelease.length && !other.prerelease.length) { - return -1 - } else if (!this.prerelease.length && other.prerelease.length) { - return 1 - } else if (!this.prerelease.length && !other.prerelease.length) { - return 0 - } - - let i = 0 - do { - const a = this.prerelease[i] - const b = other.prerelease[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - } - - compareBuild (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - let i = 0 - do { - const a = this.build[i] - const b = other.build[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - } - - // preminor will bump the version up to the next minor release, and immediately - // down to pre-release. premajor and prepatch work the same way. - inc (release, identifier) { - switch (release) { - case 'premajor': - this.prerelease.length = 0 - this.patch = 0 - this.minor = 0 - this.major++ - this.inc('pre', identifier) - break - case 'preminor': - this.prerelease.length = 0 - this.patch = 0 - this.minor++ - this.inc('pre', identifier) - break - case 'prepatch': - // If this is already a prerelease, it will bump to the next version - // drop any prereleases that might already exist, since they are not - // relevant at this point. - this.prerelease.length = 0 - this.inc('patch', identifier) - this.inc('pre', identifier) - break - // If the input is a non-prerelease version, this acts the same as - // prepatch. - case 'prerelease': - if (this.prerelease.length === 0) { - this.inc('patch', identifier) - } - this.inc('pre', identifier) - break - - case 'major': - // If this is a pre-major version, bump up to the same major version. - // Otherwise increment major. - // 1.0.0-5 bumps to 1.0.0 - // 1.1.0 bumps to 2.0.0 - if ( - this.minor !== 0 || - this.patch !== 0 || - this.prerelease.length === 0 - ) { - this.major++ - } - this.minor = 0 - this.patch = 0 - this.prerelease = [] - break - case 'minor': - // If this is a pre-minor version, bump up to the same minor version. - // Otherwise increment minor. - // 1.2.0-5 bumps to 1.2.0 - // 1.2.1 bumps to 1.3.0 - if (this.patch !== 0 || this.prerelease.length === 0) { - this.minor++ - } - this.patch = 0 - this.prerelease = [] - break - case 'patch': - // If this is not a pre-release version, it will increment the patch. - // If it is a pre-release it will bump up to the same patch version. - // 1.2.0-5 patches to 1.2.0 - // 1.2.0 patches to 1.2.1 - if (this.prerelease.length === 0) { - this.patch++ - } - this.prerelease = [] - break - // This probably shouldn't be used publicly. - // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction. - case 'pre': - if (this.prerelease.length === 0) { - this.prerelease = [0] - } else { - let i = this.prerelease.length - while (--i >= 0) { - if (typeof this.prerelease[i] === 'number') { - this.prerelease[i]++ - i = -2 - } - } - if (i === -1) { - // didn't increment anything - this.prerelease.push(0) - } - } - if (identifier) { - // 1.2.0-beta.1 bumps to 1.2.0-beta.2, - // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 - if (this.prerelease[0] === identifier) { - if (isNaN(this.prerelease[1])) { - this.prerelease = [identifier, 0] - } - } else { - this.prerelease = [identifier, 0] - } - } - break - - default: - throw new Error(`invalid increment argument: ${release}`) - } - this.format() - this.raw = this.version - return this - } -} - -module.exports = SemVer - - -/***/ }), - -/***/ 5098: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const eq = __nccwpck_require__(1898) -const neq = __nccwpck_require__(6017) -const gt = __nccwpck_require__(4123) -const gte = __nccwpck_require__(5522) -const lt = __nccwpck_require__(194) -const lte = __nccwpck_require__(7520) - -const cmp = (a, op, b, loose) => { - switch (op) { - case '===': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a === b - - case '!==': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a !== b - - case '': - case '=': - case '==': - return eq(a, b, loose) - - case '!=': - return neq(a, b, loose) - - case '>': - return gt(a, b, loose) - - case '>=': - return gte(a, b, loose) - - case '<': - return lt(a, b, loose) - - case '<=': - return lte(a, b, loose) - - default: - throw new TypeError(`Invalid operator: ${op}`) - } -} -module.exports = cmp - - -/***/ }), - -/***/ 4309: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const SemVer = __nccwpck_require__(8088) -const compare = (a, b, loose) => - new SemVer(a, loose).compare(new SemVer(b, loose)) - -module.exports = compare - - -/***/ }), - -/***/ 1898: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const eq = (a, b, loose) => compare(a, b, loose) === 0 -module.exports = eq - - -/***/ }), - -/***/ 4123: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const gt = (a, b, loose) => compare(a, b, loose) > 0 -module.exports = gt - - -/***/ }), - -/***/ 5522: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const gte = (a, b, loose) => compare(a, b, loose) >= 0 -module.exports = gte - - -/***/ }), - -/***/ 194: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const lt = (a, b, loose) => compare(a, b, loose) < 0 -module.exports = lt - - -/***/ }), - -/***/ 7520: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const lte = (a, b, loose) => compare(a, b, loose) <= 0 -module.exports = lte - - -/***/ }), - -/***/ 6017: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const neq = (a, b, loose) => compare(a, b, loose) !== 0 -module.exports = neq - - -/***/ }), - -/***/ 5925: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const {MAX_LENGTH} = __nccwpck_require__(2293) -const { re, t } = __nccwpck_require__(9523) -const SemVer = __nccwpck_require__(8088) - -const parseOptions = __nccwpck_require__(785) -const parse = (version, options) => { - options = parseOptions(options) - - if (version instanceof SemVer) { - return version - } - - if (typeof version !== 'string') { - return null - } - - if (version.length > MAX_LENGTH) { - return null - } - - const r = options.loose ? re[t.LOOSE] : re[t.FULL] - if (!r.test(version)) { - return null - } - - try { - return new SemVer(version, options) - } catch (er) { - return null - } -} - -module.exports = parse - - -/***/ }), - -/***/ 6055: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const Range = __nccwpck_require__(9828) -const satisfies = (version, range, options) => { - try { - range = new Range(range, options) - } catch (er) { - return false - } - return range.test(version) -} -module.exports = satisfies - - -/***/ }), - -/***/ 2293: -/***/ ((module) => { - -// Note: this is the semver.org version of the spec that it implements -// Not necessarily the package version of this code. -const SEMVER_SPEC_VERSION = '2.0.0' - -const MAX_LENGTH = 256 -const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || - /* istanbul ignore next */ 9007199254740991 - -// Max safe segment length for coercion. -const MAX_SAFE_COMPONENT_LENGTH = 16 - -module.exports = { - SEMVER_SPEC_VERSION, - MAX_LENGTH, - MAX_SAFE_INTEGER, - MAX_SAFE_COMPONENT_LENGTH -} - - -/***/ }), - -/***/ 427: -/***/ ((module) => { - -const debug = ( - typeof process === 'object' && - process.env && - process.env.NODE_DEBUG && - /\bsemver\b/i.test(process.env.NODE_DEBUG) -) ? (...args) => console.error('SEMVER', ...args) - : () => {} - -module.exports = debug - - -/***/ }), - -/***/ 2463: -/***/ ((module) => { - -const numeric = /^[0-9]+$/ -const compareIdentifiers = (a, b) => { - const anum = numeric.test(a) - const bnum = numeric.test(b) - - if (anum && bnum) { - a = +a - b = +b - } - - return a === b ? 0 - : (anum && !bnum) ? -1 - : (bnum && !anum) ? 1 - : a < b ? -1 - : 1 -} - -const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a) - -module.exports = { - compareIdentifiers, - rcompareIdentifiers -} - - -/***/ }), - -/***/ 785: -/***/ ((module) => { - -// parse out just the options we care about so we always get a consistent -// obj with keys in a consistent order. -const opts = ['includePrerelease', 'loose', 'rtl'] -const parseOptions = options => - !options ? {} - : typeof options !== 'object' ? { loose: true } - : opts.filter(k => options[k]).reduce((options, k) => { - options[k] = true - return options - }, {}) -module.exports = parseOptions - - -/***/ }), - -/***/ 9523: -/***/ ((module, exports, __nccwpck_require__) => { - -const { MAX_SAFE_COMPONENT_LENGTH } = __nccwpck_require__(2293) -const debug = __nccwpck_require__(427) -exports = module.exports = {} - -// The actual regexps go on exports.re -const re = exports.re = [] -const src = exports.src = [] -const t = exports.t = {} -let R = 0 - -const createToken = (name, value, isGlobal) => { - const index = R++ - debug(index, value) - t[name] = index - src[index] = value - re[index] = new RegExp(value, isGlobal ? 'g' : undefined) -} - -// The following Regular Expressions can be used for tokenizing, -// validating, and parsing SemVer version strings. - -// ## Numeric Identifier -// A single `0`, or a non-zero digit followed by zero or more digits. - -createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*') -createToken('NUMERICIDENTIFIERLOOSE', '[0-9]+') - -// ## Non-numeric Identifier -// Zero or more digits, followed by a letter or hyphen, and then zero or -// more letters, digits, or hyphens. - -createToken('NONNUMERICIDENTIFIER', '\\d*[a-zA-Z-][a-zA-Z0-9-]*') - -// ## Main Version -// Three dot-separated numeric identifiers. - -createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})`) - -createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})`) - -// ## Pre-release Version Identifier -// A numeric identifier, or a non-numeric identifier. - -createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER] -}|${src[t.NONNUMERICIDENTIFIER]})`) - -createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE] -}|${src[t.NONNUMERICIDENTIFIER]})`) - -// ## Pre-release Version -// Hyphen, followed by one or more dot-separated pre-release version -// identifiers. - -createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER] -}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`) - -createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE] -}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`) - -// ## Build Metadata Identifier -// Any combination of digits, letters, or hyphens. - -createToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+') - -// ## Build Metadata -// Plus sign, followed by one or more period-separated build metadata -// identifiers. - -createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER] -}(?:\\.${src[t.BUILDIDENTIFIER]})*))`) - -// ## Full Version String -// A main version, followed optionally by a pre-release version and -// build metadata. - -// Note that the only major, minor, patch, and pre-release sections of -// the version string are capturing groups. The build metadata is not a -// capturing group, because it should not ever be used in version -// comparison. - -createToken('FULLPLAIN', `v?${src[t.MAINVERSION] -}${src[t.PRERELEASE]}?${ - src[t.BUILD]}?`) - -createToken('FULL', `^${src[t.FULLPLAIN]}$`) - -// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. -// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty -// common in the npm registry. -createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE] -}${src[t.PRERELEASELOOSE]}?${ - src[t.BUILD]}?`) - -createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`) - -createToken('GTLT', '((?:<|>)?=?)') - -// Something like "2.*" or "1.2.x". -// Note that "x.x" is a valid xRange identifer, meaning "any version" -// Only the first item is strictly required. -createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`) -createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`) - -createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:${src[t.PRERELEASE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:${src[t.PRERELEASELOOSE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`) -createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`) - -// Coercion. -// Extract anything that could conceivably be a part of a valid semver -createToken('COERCE', `${'(^|[^\\d])' + - '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + - `(?:$|[^\\d])`) -createToken('COERCERTL', src[t.COERCE], true) - -// Tilde ranges. -// Meaning is "reasonably at or greater than" -createToken('LONETILDE', '(?:~>?)') - -createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true) -exports.tildeTrimReplace = '$1~' - -createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`) -createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`) - -// Caret ranges. -// Meaning is "at least and backwards compatible with" -createToken('LONECARET', '(?:\\^)') - -createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true) -exports.caretTrimReplace = '$1^' - -createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`) -createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`) - -// A simple gt/lt/eq thing, or just "" to indicate "any version" -createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`) -createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`) - -// An expression to strip any whitespace between the gtlt and the thing -// it modifies, so that `> 1.2.3` ==> `>1.2.3` -createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT] -}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true) -exports.comparatorTrimReplace = '$1$2$3' - -// Something like `1.2.3 - 1.2.4` -// Note that these all use the loose form, because they'll be -// checked against either the strict or loose comparator form -// later. -createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAIN]})` + - `\\s*$`) - -createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAINLOOSE]})` + - `\\s*$`) - -// Star ranges basically just allow anything at all. -createToken('STAR', '(<|>)?=?\\s*\\*') -// >=0.0.0 is like a star -createToken('GTE0', '^\\s*>=\\s*0\.0\.0\\s*$') -createToken('GTE0PRE', '^\\s*>=\\s*0\.0\.0-0\\s*$') - - -/***/ }), - -/***/ 1196: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - - -// A linked list to keep track of recently-used-ness -const Yallist = __nccwpck_require__(220) - -const MAX = Symbol('max') -const LENGTH = Symbol('length') -const LENGTH_CALCULATOR = Symbol('lengthCalculator') -const ALLOW_STALE = Symbol('allowStale') -const MAX_AGE = Symbol('maxAge') -const DISPOSE = Symbol('dispose') -const NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet') -const LRU_LIST = Symbol('lruList') -const CACHE = Symbol('cache') -const UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet') - -const naiveLength = () => 1 - -// lruList is a yallist where the head is the youngest -// item, and the tail is the oldest. the list contains the Hit -// objects as the entries. -// Each Hit object has a reference to its Yallist.Node. This -// never changes. -// -// cache is a Map (or PseudoMap) that matches the keys to -// the Yallist.Node object. -class LRUCache { - constructor (options) { - if (typeof options === 'number') - options = { max: options } - - if (!options) - options = {} - - if (options.max && (typeof options.max !== 'number' || options.max < 0)) - throw new TypeError('max must be a non-negative number') - // Kind of weird to have a default max of Infinity, but oh well. - const max = this[MAX] = options.max || Infinity - - const lc = options.length || naiveLength - this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc - this[ALLOW_STALE] = options.stale || false - if (options.maxAge && typeof options.maxAge !== 'number') - throw new TypeError('maxAge must be a number') - this[MAX_AGE] = options.maxAge || 0 - this[DISPOSE] = options.dispose - this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false - this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false - this.reset() - } - - // resize the cache when the max changes. - set max (mL) { - if (typeof mL !== 'number' || mL < 0) - throw new TypeError('max must be a non-negative number') - - this[MAX] = mL || Infinity - trim(this) - } - get max () { - return this[MAX] - } - - set allowStale (allowStale) { - this[ALLOW_STALE] = !!allowStale - } - get allowStale () { - return this[ALLOW_STALE] - } - - set maxAge (mA) { - if (typeof mA !== 'number') - throw new TypeError('maxAge must be a non-negative number') - - this[MAX_AGE] = mA - trim(this) - } - get maxAge () { - return this[MAX_AGE] - } - - // resize the cache when the lengthCalculator changes. - set lengthCalculator (lC) { - if (typeof lC !== 'function') - lC = naiveLength - - if (lC !== this[LENGTH_CALCULATOR]) { - this[LENGTH_CALCULATOR] = lC - this[LENGTH] = 0 - this[LRU_LIST].forEach(hit => { - hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key) - this[LENGTH] += hit.length - }) - } - trim(this) - } - get lengthCalculator () { return this[LENGTH_CALCULATOR] } - - get length () { return this[LENGTH] } - get itemCount () { return this[LRU_LIST].length } - - rforEach (fn, thisp) { - thisp = thisp || this - for (let walker = this[LRU_LIST].tail; walker !== null;) { - const prev = walker.prev - forEachStep(this, fn, walker, thisp) - walker = prev - } - } - - forEach (fn, thisp) { - thisp = thisp || this - for (let walker = this[LRU_LIST].head; walker !== null;) { - const next = walker.next - forEachStep(this, fn, walker, thisp) - walker = next - } - } - - keys () { - return this[LRU_LIST].toArray().map(k => k.key) - } - - values () { - return this[LRU_LIST].toArray().map(k => k.value) - } - - reset () { - if (this[DISPOSE] && - this[LRU_LIST] && - this[LRU_LIST].length) { - this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value)) - } - - this[CACHE] = new Map() // hash of items by key - this[LRU_LIST] = new Yallist() // list of items in order of use recency - this[LENGTH] = 0 // length of items in the list - } - - dump () { - return this[LRU_LIST].map(hit => - isStale(this, hit) ? false : { - k: hit.key, - v: hit.value, - e: hit.now + (hit.maxAge || 0) - }).toArray().filter(h => h) - } - - dumpLru () { - return this[LRU_LIST] - } - - set (key, value, maxAge) { - maxAge = maxAge || this[MAX_AGE] - - if (maxAge && typeof maxAge !== 'number') - throw new TypeError('maxAge must be a number') - - const now = maxAge ? Date.now() : 0 - const len = this[LENGTH_CALCULATOR](value, key) - - if (this[CACHE].has(key)) { - if (len > this[MAX]) { - del(this, this[CACHE].get(key)) - return false - } - - const node = this[CACHE].get(key) - const item = node.value - - // dispose of the old one before overwriting - // split out into 2 ifs for better coverage tracking - if (this[DISPOSE]) { - if (!this[NO_DISPOSE_ON_SET]) - this[DISPOSE](key, item.value) - } - - item.now = now - item.maxAge = maxAge - item.value = value - this[LENGTH] += len - item.length - item.length = len - this.get(key) - trim(this) - return true - } - - const hit = new Entry(key, value, len, now, maxAge) - - // oversized objects fall out of cache automatically. - if (hit.length > this[MAX]) { - if (this[DISPOSE]) - this[DISPOSE](key, value) - - return false - } - - this[LENGTH] += hit.length - this[LRU_LIST].unshift(hit) - this[CACHE].set(key, this[LRU_LIST].head) - trim(this) - return true - } - - has (key) { - if (!this[CACHE].has(key)) return false - const hit = this[CACHE].get(key).value - return !isStale(this, hit) - } - - get (key) { - return get(this, key, true) - } - - peek (key) { - return get(this, key, false) - } - - pop () { - const node = this[LRU_LIST].tail - if (!node) - return null - - del(this, node) - return node.value - } - - del (key) { - del(this, this[CACHE].get(key)) - } - - load (arr) { - // reset the cache - this.reset() - - const now = Date.now() - // A previous serialized cache has the most recent items first - for (let l = arr.length - 1; l >= 0; l--) { - const hit = arr[l] - const expiresAt = hit.e || 0 - if (expiresAt === 0) - // the item was created without expiration in a non aged cache - this.set(hit.k, hit.v) - else { - const maxAge = expiresAt - now - // dont add already expired items - if (maxAge > 0) { - this.set(hit.k, hit.v, maxAge) - } - } - } - } - - prune () { - this[CACHE].forEach((value, key) => get(this, key, false)) - } -} - -const get = (self, key, doUse) => { - const node = self[CACHE].get(key) - if (node) { - const hit = node.value - if (isStale(self, hit)) { - del(self, node) - if (!self[ALLOW_STALE]) - return undefined - } else { - if (doUse) { - if (self[UPDATE_AGE_ON_GET]) - node.value.now = Date.now() - self[LRU_LIST].unshiftNode(node) - } - } - return hit.value - } -} - -const isStale = (self, hit) => { - if (!hit || (!hit.maxAge && !self[MAX_AGE])) - return false - - const diff = Date.now() - hit.now - return hit.maxAge ? diff > hit.maxAge - : self[MAX_AGE] && (diff > self[MAX_AGE]) -} - -const trim = self => { - if (self[LENGTH] > self[MAX]) { - for (let walker = self[LRU_LIST].tail; - self[LENGTH] > self[MAX] && walker !== null;) { - // We know that we're about to delete this one, and also - // what the next least recently used key will be, so just - // go ahead and set it now. - const prev = walker.prev - del(self, walker) - walker = prev - } - } -} - -const del = (self, node) => { - if (node) { - const hit = node.value - if (self[DISPOSE]) - self[DISPOSE](hit.key, hit.value) - - self[LENGTH] -= hit.length - self[CACHE].delete(hit.key) - self[LRU_LIST].removeNode(node) - } -} - -class Entry { - constructor (key, value, length, now, maxAge) { - this.key = key - this.value = value - this.length = length - this.now = now - this.maxAge = maxAge || 0 - } -} - -const forEachStep = (self, fn, node, thisp) => { - let hit = node.value - if (isStale(self, hit)) { - del(self, node) - if (!self[ALLOW_STALE]) - hit = undefined - } - if (hit) - fn.call(thisp, hit.value, hit.key, self) -} - -module.exports = LRUCache - - -/***/ }), - -/***/ 5327: -/***/ ((module) => { - -"use strict"; - -module.exports = function (Yallist) { - Yallist.prototype[Symbol.iterator] = function* () { - for (let walker = this.head; walker; walker = walker.next) { - yield walker.value - } - } -} - - -/***/ }), - -/***/ 220: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - -module.exports = Yallist - -Yallist.Node = Node -Yallist.create = Yallist - -function Yallist (list) { - var self = this - if (!(self instanceof Yallist)) { - self = new Yallist() - } - - self.tail = null - self.head = null - self.length = 0 - - if (list && typeof list.forEach === 'function') { - list.forEach(function (item) { - self.push(item) - }) - } else if (arguments.length > 0) { - for (var i = 0, l = arguments.length; i < l; i++) { - self.push(arguments[i]) - } - } - - return self -} - -Yallist.prototype.removeNode = function (node) { - if (node.list !== this) { - throw new Error('removing node which does not belong to this list') - } - - var next = node.next - var prev = node.prev - - if (next) { - next.prev = prev - } - - if (prev) { - prev.next = next - } - - if (node === this.head) { - this.head = next - } - if (node === this.tail) { - this.tail = prev - } - - node.list.length-- - node.next = null - node.prev = null - node.list = null - - return next -} - -Yallist.prototype.unshiftNode = function (node) { - if (node === this.head) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var head = this.head - node.list = this - node.next = head - if (head) { - head.prev = node - } - - this.head = node - if (!this.tail) { - this.tail = node - } - this.length++ -} - -Yallist.prototype.pushNode = function (node) { - if (node === this.tail) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var tail = this.tail - node.list = this - node.prev = tail - if (tail) { - tail.next = node - } - - this.tail = node - if (!this.head) { - this.head = node - } - this.length++ -} - -Yallist.prototype.push = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - push(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.unshift = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - unshift(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.pop = function () { - if (!this.tail) { - return undefined - } - - var res = this.tail.value - this.tail = this.tail.prev - if (this.tail) { - this.tail.next = null - } else { - this.head = null - } - this.length-- - return res -} - -Yallist.prototype.shift = function () { - if (!this.head) { - return undefined - } - - var res = this.head.value - this.head = this.head.next - if (this.head) { - this.head.prev = null - } else { - this.tail = null - } - this.length-- - return res -} - -Yallist.prototype.forEach = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.head, i = 0; walker !== null; i++) { - fn.call(thisp, walker.value, i, this) - walker = walker.next - } -} - -Yallist.prototype.forEachReverse = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.tail, i = this.length - 1; walker !== null; i--) { - fn.call(thisp, walker.value, i, this) - walker = walker.prev - } -} - -Yallist.prototype.get = function (n) { - for (var i = 0, walker = this.head; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.next - } - if (i === n && walker !== null) { - return walker.value - } -} - -Yallist.prototype.getReverse = function (n) { - for (var i = 0, walker = this.tail; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.prev - } - if (i === n && walker !== null) { - return walker.value - } -} - -Yallist.prototype.map = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.head; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.next - } - return res -} - -Yallist.prototype.mapReverse = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.tail; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.prev - } - return res -} - -Yallist.prototype.reduce = function (fn, initial) { - var acc - var walker = this.head - if (arguments.length > 1) { - acc = initial - } else if (this.head) { - walker = this.head.next - acc = this.head.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } - - for (var i = 0; walker !== null; i++) { - acc = fn(acc, walker.value, i) - walker = walker.next - } - - return acc -} - -Yallist.prototype.reduceReverse = function (fn, initial) { - var acc - var walker = this.tail - if (arguments.length > 1) { - acc = initial - } else if (this.tail) { - walker = this.tail.prev - acc = this.tail.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } - - for (var i = this.length - 1; walker !== null; i--) { - acc = fn(acc, walker.value, i) - walker = walker.prev - } - - return acc -} - -Yallist.prototype.toArray = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.head; walker !== null; i++) { - arr[i] = walker.value - walker = walker.next - } - return arr -} - -Yallist.prototype.toArrayReverse = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.tail; walker !== null; i++) { - arr[i] = walker.value - walker = walker.prev - } - return arr -} - -Yallist.prototype.slice = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = 0, walker = this.head; walker !== null && i < from; i++) { - walker = walker.next - } - for (; walker !== null && i < to; i++, walker = walker.next) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.sliceReverse = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) { - walker = walker.prev - } - for (; walker !== null && i > from; i--, walker = walker.prev) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.splice = function (start, deleteCount, ...nodes) { - if (start > this.length) { - start = this.length - 1 - } - if (start < 0) { - start = this.length + start; - } - - for (var i = 0, walker = this.head; walker !== null && i < start; i++) { - walker = walker.next - } - - var ret = [] - for (var i = 0; walker && i < deleteCount; i++) { - ret.push(walker.value) - walker = this.removeNode(walker) - } - if (walker === null) { - walker = this.tail - } - - if (walker !== this.head && walker !== this.tail) { - walker = walker.prev - } - - for (var i = 0; i < nodes.length; i++) { - walker = insert(this, walker, nodes[i]) - } - return ret; -} - -Yallist.prototype.reverse = function () { - var head = this.head - var tail = this.tail - for (var walker = head; walker !== null; walker = walker.prev) { - var p = walker.prev - walker.prev = walker.next - walker.next = p - } - this.head = tail - this.tail = head - return this -} - -function insert (self, node, value) { - var inserted = node === self.head ? - new Node(value, null, node, self) : - new Node(value, node, node.next, self) - - if (inserted.next === null) { - self.tail = inserted - } - if (inserted.prev === null) { - self.head = inserted - } - - self.length++ - - return inserted -} - -function push (self, item) { - self.tail = new Node(item, self.tail, null, self) - if (!self.head) { - self.head = self.tail - } - self.length++ -} - -function unshift (self, item) { - self.head = new Node(item, null, self.head, self) - if (!self.tail) { - self.tail = self.head - } - self.length++ -} - -function Node (value, prev, next, list) { - if (!(this instanceof Node)) { - return new Node(value, prev, next, list) - } - - this.list = list - this.value = value - - if (prev) { - prev.next = this - this.prev = prev - } else { - this.prev = null - } - - if (next) { - next.prev = this - this.next = next - } else { - this.next = null - } -} - -try { - // add if support for Symbol.iterator is present - __nccwpck_require__(5327)(Yallist) -} catch (er) {} - - /***/ }), /***/ 4294: From 2263d244d8a4ebce476ca6d226fdd15ce452120e Mon Sep 17 00:00:00 2001 From: Ariel Green <37308300+arielgreen@users.noreply.github.com> Date: Thu, 8 Apr 2021 10:44:38 -0400 Subject: [PATCH 180/380] Fix typo --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bd6b1fd5792d..46f3c18c54cd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -54,7 +54,7 @@ In this scenario, itā€™s possible that you found a bug or enhancement that we ha 5. Pause at this step until Expensify provides feedback on your proposal (do not begin coding or creating a pull request yet). 6. If your solution proposal is accepted, Expensify will hire you on Upwork and assign the GitHub issue to you. -#### Begin coding your solution in a pull reuqest +#### Begin coding your solution in a pull request 7. When you are ready to start, fork the repository and create a new branch. 8. Before you begin writing any code, please be aware that we require all commits to be [signed](https://docs.github.com/en/github/authenticating-to-github/signing-commits). The easiest way to do that is to [generate a new GPG key](https://docs.github.com/en/github/authenticating-to-github/generating-a-new-gpg-key) and [add it to your Github account](https://docs.github.com/en/github/authenticating-to-github/adding-a-new-gpg-key-to-your-github-account). Once you've done that, you can automatically sign all your commits by adding the following to your `.gitconfig`: ``` From 6789c868fd889dcc1fde0b2e1d2835792e908e8c Mon Sep 17 00:00:00 2001 From: npsedhain Date: Thu, 8 Apr 2021 21:50:31 +0545 Subject: [PATCH 181/380] Fix the github action check failing. --- .github/actions/checkDeployBlockers/index.js | 2315 +---------------- .../actions/reopenIssueWithComment/index.js | 2315 +---------------- 2 files changed, 32 insertions(+), 4598 deletions(-) diff --git a/.github/actions/checkDeployBlockers/index.js b/.github/actions/checkDeployBlockers/index.js index baae215e4076..38ff286a9db7 100644 --- a/.github/actions/checkDeployBlockers/index.js +++ b/.github/actions/checkDeployBlockers/index.js @@ -82,8 +82,6 @@ module.exports = run; const _ = __nccwpck_require__(4987); const lodashGet = __nccwpck_require__(6908); -const semverParse = __nccwpck_require__(5925); -const semverSatisfies = __nccwpck_require__(6055); const GITHUB_OWNER = 'Expensify'; const EXPENSIFY_CASH_REPO = 'Expensify.cash'; @@ -144,11 +142,6 @@ class GithubUtils { try { const versionRegex = new RegExp('([0-9]+)\\.([0-9]+)\\.([0-9]+)(?:-([0-9]+))?', 'g'); const tag = issue.body.match(versionRegex)[0].replace(/`/g, ''); - - // eslint-disable-next-line max-len - const compareURLRegex = new RegExp(`${EXPENSIFY_CASH_URL}/compare/${versionRegex.source}\\.\\.\\.${versionRegex.source}`, 'g'); - const comparisonURL = issue.body.match(compareURLRegex)[0]; - return { title: issue.title, url: issue.url, @@ -156,7 +149,6 @@ class GithubUtils { PRList: this.getStagingDeployCashPRList(issue), deployBlockers: this.getStagingDeployCashDeployBlockers(issue), tag, - comparisonURL, }; } catch (exception) { throw new Error(`Unable to find ${STAGING_DEPLOY_CASH_LABEL} issue with correct data.`); @@ -231,71 +223,6 @@ class GithubUtils { ); } - /** - * Generate a comparison URL between two versions following the semverLevel passed - * - * @param {String} repoSlug - The slug of the repository: / - * @param {String} tag - The tag to compare first the previous semverLevel - * @param {String} semverLevel - The semantic versioning MAJOR, MINOR, PATCH and BUILD - * @return {Promise} the url generated - * @throws {Error} If the request to the Github API fails. - */ - generateVersionComparisonURL(repoSlug, tag, semverLevel) { - return new Promise((resolve, reject) => { - const getComparisonURL = (previousTag, currentTag) => ( - `${EXPENSIFY_CASH_URL}/compare/${previousTag}...${currentTag}` - ); - - const [repoOwner, repoName] = repoSlug.split('/'); - const tagSemver = semverParse(tag); - - return this.octokit.repos.listTags({ - owner: repoOwner, - repo: repoName, - }) - .then(githubResponse => githubResponse.data.some(({name: repoTag}) => { - if (semverLevel === 'MAJOR' - && semverSatisfies(repoTag, `<${tagSemver.major}.x.x`, {includePrerelease: true}) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'MINOR' - && semverSatisfies( - repoTag, - `<${tagSemver.major}.${tagSemver.minor}.x`, - {includePrerelease: true}, - ) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'PATCH' - && semverSatisfies(repoTag, `<${tagSemver}`, {includePrerelease: true}) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'BUILD' - && repoTag !== tagSemver.version - && semverSatisfies( - repoTag, - `<=${tagSemver.major}.${tagSemver.minor}.${tagSemver.patch}`, - {includePrerelease: true}, - ) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - return false; - })) - .catch(githubError => reject(githubError)); - }); - } - /** * Creates a new StagingDeployCash issue. * @@ -391,22 +318,16 @@ class GithubUtils { deployBlockers = [], resolvedDeployBlockers = [], ) { - return Promise.all([ - this.generateVersionComparisonURL(`${GITHUB_OWNER}/${EXPENSIFY_CASH_REPO}`, tag, 'PATCH'), - this.octokit.pulls.list({ - owner: GITHUB_OWNER, - repo: EXPENSIFY_CASH_REPO, - per_page: 100, - }), - ]) - .then(results => ({ - comparisonURL: results[0], - automergePRs: _.map( - _.filter(results[1].data, GithubUtils.isAutomergePullRequest), + return this.octokit.pulls.list({ + owner: GITHUB_OWNER, + repo: EXPENSIFY_CASH_REPO, + per_page: 100, + }) + .then(({data}) => { + const automergePRs = _.pluck( + _.filter(data, GithubUtils.isAutomergePullRequest), 'html_url', - ), - })) - .then(({comparisonURL, automergePRs}) => { + ); const sortedPRList = _.chain(PRList) .difference(automergePRs) .unique() @@ -418,8 +339,8 @@ class GithubUtils { ); // Tag version and comparison URL - let issueBody = `**Release Version:** \`${tag}\`\r\n`; - issueBody += `**Compare Changes:** ${comparisonURL}\r\n`; + // eslint-disable-next-line max-len + let issueBody = `**Release Version:** \`${tag}\`\r\n**Compare Changes:** https://github.com/Expensify/Expensify.cash/compare/production...staging\r\n`; // PR list if (!_.isEmpty(PRList)) { @@ -440,11 +361,13 @@ class GithubUtils { } issueBody += '\r\ncc @Expensify/applauseleads\r\n'; - return issueBody; }) - // eslint-disable-next-line no-console - .catch(err => console.warn('Error generating comparison URL, continuing...', err)); + .catch(err => console.warn( + 'Error generating StagingDeployCash issue body!', + 'Automerge PRs may not be properly filtered out. Continuing...', + err, + )); } /** @@ -10790,2212 +10713,6 @@ if (!safer.constants) { module.exports = safer -/***/ }), - -/***/ 1532: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const ANY = Symbol('SemVer ANY') -// hoisted class for cyclic dependency -class Comparator { - static get ANY () { - return ANY - } - constructor (comp, options) { - options = parseOptions(options) - - if (comp instanceof Comparator) { - if (comp.loose === !!options.loose) { - return comp - } else { - comp = comp.value - } - } - - debug('comparator', comp, options) - this.options = options - this.loose = !!options.loose - this.parse(comp) - - if (this.semver === ANY) { - this.value = '' - } else { - this.value = this.operator + this.semver.version - } - - debug('comp', this) - } - - parse (comp) { - const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] - const m = comp.match(r) - - if (!m) { - throw new TypeError(`Invalid comparator: ${comp}`) - } - - this.operator = m[1] !== undefined ? m[1] : '' - if (this.operator === '=') { - this.operator = '' - } - - // if it literally is just '>' or '' then allow anything. - if (!m[2]) { - this.semver = ANY - } else { - this.semver = new SemVer(m[2], this.options.loose) - } - } - - toString () { - return this.value - } - - test (version) { - debug('Comparator.test', version, this.options.loose) - - if (this.semver === ANY || version === ANY) { - return true - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - return cmp(version, this.operator, this.semver, this.options) - } - - intersects (comp, options) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required') - } - - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - if (this.operator === '') { - if (this.value === '') { - return true - } - return new Range(comp.value, options).test(this.value) - } else if (comp.operator === '') { - if (comp.value === '') { - return true - } - return new Range(this.value, options).test(comp.semver) - } - - const sameDirectionIncreasing = - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '>=' || comp.operator === '>') - const sameDirectionDecreasing = - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '<=' || comp.operator === '<') - const sameSemVer = this.semver.version === comp.semver.version - const differentDirectionsInclusive = - (this.operator === '>=' || this.operator === '<=') && - (comp.operator === '>=' || comp.operator === '<=') - const oppositeDirectionsLessThan = - cmp(this.semver, '<', comp.semver, options) && - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '<=' || comp.operator === '<') - const oppositeDirectionsGreaterThan = - cmp(this.semver, '>', comp.semver, options) && - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '>=' || comp.operator === '>') - - return ( - sameDirectionIncreasing || - sameDirectionDecreasing || - (sameSemVer && differentDirectionsInclusive) || - oppositeDirectionsLessThan || - oppositeDirectionsGreaterThan - ) - } -} - -module.exports = Comparator - -const parseOptions = __nccwpck_require__(785) -const {re, t} = __nccwpck_require__(9523) -const cmp = __nccwpck_require__(5098) -const debug = __nccwpck_require__(427) -const SemVer = __nccwpck_require__(8088) -const Range = __nccwpck_require__(9828) - - -/***/ }), - -/***/ 9828: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -// hoisted class for cyclic dependency -class Range { - constructor (range, options) { - options = parseOptions(options) - - if (range instanceof Range) { - if ( - range.loose === !!options.loose && - range.includePrerelease === !!options.includePrerelease - ) { - return range - } else { - return new Range(range.raw, options) - } - } - - if (range instanceof Comparator) { - // just put it in the set and return - this.raw = range.value - this.set = [[range]] - this.format() - return this - } - - this.options = options - this.loose = !!options.loose - this.includePrerelease = !!options.includePrerelease - - // First, split based on boolean or || - this.raw = range - this.set = range - .split(/\s*\|\|\s*/) - // map the range to a 2d array of comparators - .map(range => this.parseRange(range.trim())) - // throw out any comparator lists that are empty - // this generally means that it was not a valid range, which is allowed - // in loose mode, but will still throw if the WHOLE range is invalid. - .filter(c => c.length) - - if (!this.set.length) { - throw new TypeError(`Invalid SemVer Range: ${range}`) - } - - // if we have any that are not the null set, throw out null sets. - if (this.set.length > 1) { - // keep the first one, in case they're all null sets - const first = this.set[0] - this.set = this.set.filter(c => !isNullSet(c[0])) - if (this.set.length === 0) - this.set = [first] - else if (this.set.length > 1) { - // if we have any that are *, then the range is just * - for (const c of this.set) { - if (c.length === 1 && isAny(c[0])) { - this.set = [c] - break - } - } - } - } - - this.format() - } - - format () { - this.range = this.set - .map((comps) => { - return comps.join(' ').trim() - }) - .join('||') - .trim() - return this.range - } - - toString () { - return this.range - } - - parseRange (range) { - range = range.trim() - - // memoize range parsing for performance. - // this is a very hot path, and fully deterministic. - const memoOpts = Object.keys(this.options).join(',') - const memoKey = `parseRange:${memoOpts}:${range}` - const cached = cache.get(memoKey) - if (cached) - return cached - - const loose = this.options.loose - // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` - const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE] - range = range.replace(hr, hyphenReplace(this.options.includePrerelease)) - debug('hyphen replace', range) - // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` - range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace) - debug('comparator trim', range, re[t.COMPARATORTRIM]) - - // `~ 1.2.3` => `~1.2.3` - range = range.replace(re[t.TILDETRIM], tildeTrimReplace) - - // `^ 1.2.3` => `^1.2.3` - range = range.replace(re[t.CARETTRIM], caretTrimReplace) - - // normalize spaces - range = range.split(/\s+/).join(' ') - - // At this point, the range is completely trimmed and - // ready to be split into comparators. - - const compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] - const rangeList = range - .split(' ') - .map(comp => parseComparator(comp, this.options)) - .join(' ') - .split(/\s+/) - // >=0.0.0 is equivalent to * - .map(comp => replaceGTE0(comp, this.options)) - // in loose mode, throw out any that are not valid comparators - .filter(this.options.loose ? comp => !!comp.match(compRe) : () => true) - .map(comp => new Comparator(comp, this.options)) - - // if any comparators are the null set, then replace with JUST null set - // if more than one comparator, remove any * comparators - // also, don't include the same comparator more than once - const l = rangeList.length - const rangeMap = new Map() - for (const comp of rangeList) { - if (isNullSet(comp)) - return [comp] - rangeMap.set(comp.value, comp) - } - if (rangeMap.size > 1 && rangeMap.has('')) - rangeMap.delete('') - - const result = [...rangeMap.values()] - cache.set(memoKey, result) - return result - } - - intersects (range, options) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required') - } - - return this.set.some((thisComparators) => { - return ( - isSatisfiable(thisComparators, options) && - range.set.some((rangeComparators) => { - return ( - isSatisfiable(rangeComparators, options) && - thisComparators.every((thisComparator) => { - return rangeComparators.every((rangeComparator) => { - return thisComparator.intersects(rangeComparator, options) - }) - }) - ) - }) - ) - }) - } - - // if ANY of the sets match ALL of its comparators, then pass - test (version) { - if (!version) { - return false - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - for (let i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version, this.options)) { - return true - } - } - return false - } -} -module.exports = Range - -const LRU = __nccwpck_require__(1196) -const cache = new LRU({ max: 1000 }) - -const parseOptions = __nccwpck_require__(785) -const Comparator = __nccwpck_require__(1532) -const debug = __nccwpck_require__(427) -const SemVer = __nccwpck_require__(8088) -const { - re, - t, - comparatorTrimReplace, - tildeTrimReplace, - caretTrimReplace -} = __nccwpck_require__(9523) - -const isNullSet = c => c.value === '<0.0.0-0' -const isAny = c => c.value === '' - -// take a set of comparators and determine whether there -// exists a version which can satisfy it -const isSatisfiable = (comparators, options) => { - let result = true - const remainingComparators = comparators.slice() - let testComparator = remainingComparators.pop() - - while (result && remainingComparators.length) { - result = remainingComparators.every((otherComparator) => { - return testComparator.intersects(otherComparator, options) - }) - - testComparator = remainingComparators.pop() - } - - return result -} - -// comprised of xranges, tildes, stars, and gtlt's at this point. -// already replaced the hyphen ranges -// turn into a set of JUST comparators. -const parseComparator = (comp, options) => { - debug('comp', comp, options) - comp = replaceCarets(comp, options) - debug('caret', comp) - comp = replaceTildes(comp, options) - debug('tildes', comp) - comp = replaceXRanges(comp, options) - debug('xrange', comp) - comp = replaceStars(comp, options) - debug('stars', comp) - return comp -} - -const isX = id => !id || id.toLowerCase() === 'x' || id === '*' - -// ~, ~> --> * (any, kinda silly) -// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0 -// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0 -// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0 -// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0 -// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0 -const replaceTildes = (comp, options) => - comp.trim().split(/\s+/).map((comp) => { - return replaceTilde(comp, options) - }).join(' ') - -const replaceTilde = (comp, options) => { - const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] - return comp.replace(r, (_, M, m, p, pr) => { - debug('tilde', comp, _, M, m, p, pr) - let ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = `>=${M}.0.0 <${+M + 1}.0.0-0` - } else if (isX(p)) { - // ~1.2 == >=1.2.0 <1.3.0-0 - ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0` - } else if (pr) { - debug('replaceTilde pr', pr) - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${+m + 1}.0-0` - } else { - // ~1.2.3 == >=1.2.3 <1.3.0-0 - ret = `>=${M}.${m}.${p - } <${M}.${+m + 1}.0-0` - } - - debug('tilde return', ret) - return ret - }) -} - -// ^ --> * (any, kinda silly) -// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0 -// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0 -// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0 -// ^1.2.3 --> >=1.2.3 <2.0.0-0 -// ^1.2.0 --> >=1.2.0 <2.0.0-0 -const replaceCarets = (comp, options) => - comp.trim().split(/\s+/).map((comp) => { - return replaceCaret(comp, options) - }).join(' ') - -const replaceCaret = (comp, options) => { - debug('caret', comp, options) - const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET] - const z = options.includePrerelease ? '-0' : '' - return comp.replace(r, (_, M, m, p, pr) => { - debug('caret', comp, _, M, m, p, pr) - let ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0` - } else if (isX(p)) { - if (M === '0') { - ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0` - } else { - ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0` - } - } else if (pr) { - debug('replaceCaret pr', pr) - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${m}.${+p + 1}-0` - } else { - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${+m + 1}.0-0` - } - } else { - ret = `>=${M}.${m}.${p}-${pr - } <${+M + 1}.0.0-0` - } - } else { - debug('no pr') - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p - }${z} <${M}.${m}.${+p + 1}-0` - } else { - ret = `>=${M}.${m}.${p - }${z} <${M}.${+m + 1}.0-0` - } - } else { - ret = `>=${M}.${m}.${p - } <${+M + 1}.0.0-0` - } - } - - debug('caret return', ret) - return ret - }) -} - -const replaceXRanges = (comp, options) => { - debug('replaceXRanges', comp, options) - return comp.split(/\s+/).map((comp) => { - return replaceXRange(comp, options) - }).join(' ') -} - -const replaceXRange = (comp, options) => { - comp = comp.trim() - const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE] - return comp.replace(r, (ret, gtlt, M, m, p, pr) => { - debug('xRange', comp, ret, gtlt, M, m, p, pr) - const xM = isX(M) - const xm = xM || isX(m) - const xp = xm || isX(p) - const anyX = xp - - if (gtlt === '=' && anyX) { - gtlt = '' - } - - // if we're including prereleases in the match, then we need - // to fix this to -0, the lowest possible prerelease value - pr = options.includePrerelease ? '-0' : '' - - if (xM) { - if (gtlt === '>' || gtlt === '<') { - // nothing is allowed - ret = '<0.0.0-0' - } else { - // nothing is forbidden - ret = '*' - } - } else if (gtlt && anyX) { - // we know patch is an x, because we have any x at all. - // replace X with 0 - if (xm) { - m = 0 - } - p = 0 - - if (gtlt === '>') { - // >1 => >=2.0.0 - // >1.2 => >=1.3.0 - gtlt = '>=' - if (xm) { - M = +M + 1 - m = 0 - p = 0 - } else { - m = +m + 1 - p = 0 - } - } else if (gtlt === '<=') { - // <=0.7.x is actually <0.8.0, since any 0.7.x should - // pass. Similarly, <=7.x is actually <8.0.0, etc. - gtlt = '<' - if (xm) { - M = +M + 1 - } else { - m = +m + 1 - } - } - - if (gtlt === '<') - pr = '-0' - - ret = `${gtlt + M}.${m}.${p}${pr}` - } else if (xm) { - ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0` - } else if (xp) { - ret = `>=${M}.${m}.0${pr - } <${M}.${+m + 1}.0-0` - } - - debug('xRange return', ret) - - return ret - }) -} - -// Because * is AND-ed with everything else in the comparator, -// and '' means "any version", just remove the *s entirely. -const replaceStars = (comp, options) => { - debug('replaceStars', comp, options) - // Looseness is ignored here. star is always as loose as it gets! - return comp.trim().replace(re[t.STAR], '') -} - -const replaceGTE0 = (comp, options) => { - debug('replaceGTE0', comp, options) - return comp.trim() - .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '') -} - -// This function is passed to string.replace(re[t.HYPHENRANGE]) -// M, m, patch, prerelease, build -// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 -// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do -// 1.2 - 3.4 => >=1.2.0 <3.5.0-0 -const hyphenReplace = incPr => ($0, - from, fM, fm, fp, fpr, fb, - to, tM, tm, tp, tpr, tb) => { - if (isX(fM)) { - from = '' - } else if (isX(fm)) { - from = `>=${fM}.0.0${incPr ? '-0' : ''}` - } else if (isX(fp)) { - from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}` - } else if (fpr) { - from = `>=${from}` - } else { - from = `>=${from}${incPr ? '-0' : ''}` - } - - if (isX(tM)) { - to = '' - } else if (isX(tm)) { - to = `<${+tM + 1}.0.0-0` - } else if (isX(tp)) { - to = `<${tM}.${+tm + 1}.0-0` - } else if (tpr) { - to = `<=${tM}.${tm}.${tp}-${tpr}` - } else if (incPr) { - to = `<${tM}.${tm}.${+tp + 1}-0` - } else { - to = `<=${to}` - } - - return (`${from} ${to}`).trim() -} - -const testSet = (set, version, options) => { - for (let i = 0; i < set.length; i++) { - if (!set[i].test(version)) { - return false - } - } - - if (version.prerelease.length && !options.includePrerelease) { - // Find the set of versions that are allowed to have prereleases - // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 - // That should allow `1.2.3-pr.2` to pass. - // However, `1.2.4-alpha.notready` should NOT be allowed, - // even though it's within the range set by the comparators. - for (let i = 0; i < set.length; i++) { - debug(set[i].semver) - if (set[i].semver === Comparator.ANY) { - continue - } - - if (set[i].semver.prerelease.length > 0) { - const allowed = set[i].semver - if (allowed.major === version.major && - allowed.minor === version.minor && - allowed.patch === version.patch) { - return true - } - } - } - - // Version has a -pre, but it's not one of the ones we like. - return false - } - - return true -} - - -/***/ }), - -/***/ 8088: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const debug = __nccwpck_require__(427) -const { MAX_LENGTH, MAX_SAFE_INTEGER } = __nccwpck_require__(2293) -const { re, t } = __nccwpck_require__(9523) - -const parseOptions = __nccwpck_require__(785) -const { compareIdentifiers } = __nccwpck_require__(2463) -class SemVer { - constructor (version, options) { - options = parseOptions(options) - - if (version instanceof SemVer) { - if (version.loose === !!options.loose && - version.includePrerelease === !!options.includePrerelease) { - return version - } else { - version = version.version - } - } else if (typeof version !== 'string') { - throw new TypeError(`Invalid Version: ${version}`) - } - - if (version.length > MAX_LENGTH) { - throw new TypeError( - `version is longer than ${MAX_LENGTH} characters` - ) - } - - debug('SemVer', version, options) - this.options = options - this.loose = !!options.loose - // this isn't actually relevant for versions, but keep it so that we - // don't run into trouble passing this.options around. - this.includePrerelease = !!options.includePrerelease - - const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]) - - if (!m) { - throw new TypeError(`Invalid Version: ${version}`) - } - - this.raw = version - - // these are actually numbers - this.major = +m[1] - this.minor = +m[2] - this.patch = +m[3] - - if (this.major > MAX_SAFE_INTEGER || this.major < 0) { - throw new TypeError('Invalid major version') - } - - if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { - throw new TypeError('Invalid minor version') - } - - if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { - throw new TypeError('Invalid patch version') - } - - // numberify any prerelease numeric ids - if (!m[4]) { - this.prerelease = [] - } else { - this.prerelease = m[4].split('.').map((id) => { - if (/^[0-9]+$/.test(id)) { - const num = +id - if (num >= 0 && num < MAX_SAFE_INTEGER) { - return num - } - } - return id - }) - } - - this.build = m[5] ? m[5].split('.') : [] - this.format() - } - - format () { - this.version = `${this.major}.${this.minor}.${this.patch}` - if (this.prerelease.length) { - this.version += `-${this.prerelease.join('.')}` - } - return this.version - } - - toString () { - return this.version - } - - compare (other) { - debug('SemVer.compare', this.version, this.options, other) - if (!(other instanceof SemVer)) { - if (typeof other === 'string' && other === this.version) { - return 0 - } - other = new SemVer(other, this.options) - } - - if (other.version === this.version) { - return 0 - } - - return this.compareMain(other) || this.comparePre(other) - } - - compareMain (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - return ( - compareIdentifiers(this.major, other.major) || - compareIdentifiers(this.minor, other.minor) || - compareIdentifiers(this.patch, other.patch) - ) - } - - comparePre (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - // NOT having a prerelease is > having one - if (this.prerelease.length && !other.prerelease.length) { - return -1 - } else if (!this.prerelease.length && other.prerelease.length) { - return 1 - } else if (!this.prerelease.length && !other.prerelease.length) { - return 0 - } - - let i = 0 - do { - const a = this.prerelease[i] - const b = other.prerelease[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - } - - compareBuild (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - let i = 0 - do { - const a = this.build[i] - const b = other.build[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - } - - // preminor will bump the version up to the next minor release, and immediately - // down to pre-release. premajor and prepatch work the same way. - inc (release, identifier) { - switch (release) { - case 'premajor': - this.prerelease.length = 0 - this.patch = 0 - this.minor = 0 - this.major++ - this.inc('pre', identifier) - break - case 'preminor': - this.prerelease.length = 0 - this.patch = 0 - this.minor++ - this.inc('pre', identifier) - break - case 'prepatch': - // If this is already a prerelease, it will bump to the next version - // drop any prereleases that might already exist, since they are not - // relevant at this point. - this.prerelease.length = 0 - this.inc('patch', identifier) - this.inc('pre', identifier) - break - // If the input is a non-prerelease version, this acts the same as - // prepatch. - case 'prerelease': - if (this.prerelease.length === 0) { - this.inc('patch', identifier) - } - this.inc('pre', identifier) - break - - case 'major': - // If this is a pre-major version, bump up to the same major version. - // Otherwise increment major. - // 1.0.0-5 bumps to 1.0.0 - // 1.1.0 bumps to 2.0.0 - if ( - this.minor !== 0 || - this.patch !== 0 || - this.prerelease.length === 0 - ) { - this.major++ - } - this.minor = 0 - this.patch = 0 - this.prerelease = [] - break - case 'minor': - // If this is a pre-minor version, bump up to the same minor version. - // Otherwise increment minor. - // 1.2.0-5 bumps to 1.2.0 - // 1.2.1 bumps to 1.3.0 - if (this.patch !== 0 || this.prerelease.length === 0) { - this.minor++ - } - this.patch = 0 - this.prerelease = [] - break - case 'patch': - // If this is not a pre-release version, it will increment the patch. - // If it is a pre-release it will bump up to the same patch version. - // 1.2.0-5 patches to 1.2.0 - // 1.2.0 patches to 1.2.1 - if (this.prerelease.length === 0) { - this.patch++ - } - this.prerelease = [] - break - // This probably shouldn't be used publicly. - // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction. - case 'pre': - if (this.prerelease.length === 0) { - this.prerelease = [0] - } else { - let i = this.prerelease.length - while (--i >= 0) { - if (typeof this.prerelease[i] === 'number') { - this.prerelease[i]++ - i = -2 - } - } - if (i === -1) { - // didn't increment anything - this.prerelease.push(0) - } - } - if (identifier) { - // 1.2.0-beta.1 bumps to 1.2.0-beta.2, - // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 - if (this.prerelease[0] === identifier) { - if (isNaN(this.prerelease[1])) { - this.prerelease = [identifier, 0] - } - } else { - this.prerelease = [identifier, 0] - } - } - break - - default: - throw new Error(`invalid increment argument: ${release}`) - } - this.format() - this.raw = this.version - return this - } -} - -module.exports = SemVer - - -/***/ }), - -/***/ 5098: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const eq = __nccwpck_require__(1898) -const neq = __nccwpck_require__(6017) -const gt = __nccwpck_require__(4123) -const gte = __nccwpck_require__(5522) -const lt = __nccwpck_require__(194) -const lte = __nccwpck_require__(7520) - -const cmp = (a, op, b, loose) => { - switch (op) { - case '===': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a === b - - case '!==': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a !== b - - case '': - case '=': - case '==': - return eq(a, b, loose) - - case '!=': - return neq(a, b, loose) - - case '>': - return gt(a, b, loose) - - case '>=': - return gte(a, b, loose) - - case '<': - return lt(a, b, loose) - - case '<=': - return lte(a, b, loose) - - default: - throw new TypeError(`Invalid operator: ${op}`) - } -} -module.exports = cmp - - -/***/ }), - -/***/ 4309: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const SemVer = __nccwpck_require__(8088) -const compare = (a, b, loose) => - new SemVer(a, loose).compare(new SemVer(b, loose)) - -module.exports = compare - - -/***/ }), - -/***/ 1898: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const eq = (a, b, loose) => compare(a, b, loose) === 0 -module.exports = eq - - -/***/ }), - -/***/ 4123: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const gt = (a, b, loose) => compare(a, b, loose) > 0 -module.exports = gt - - -/***/ }), - -/***/ 5522: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const gte = (a, b, loose) => compare(a, b, loose) >= 0 -module.exports = gte - - -/***/ }), - -/***/ 194: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const lt = (a, b, loose) => compare(a, b, loose) < 0 -module.exports = lt - - -/***/ }), - -/***/ 7520: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const lte = (a, b, loose) => compare(a, b, loose) <= 0 -module.exports = lte - - -/***/ }), - -/***/ 6017: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const neq = (a, b, loose) => compare(a, b, loose) !== 0 -module.exports = neq - - -/***/ }), - -/***/ 5925: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const {MAX_LENGTH} = __nccwpck_require__(2293) -const { re, t } = __nccwpck_require__(9523) -const SemVer = __nccwpck_require__(8088) - -const parseOptions = __nccwpck_require__(785) -const parse = (version, options) => { - options = parseOptions(options) - - if (version instanceof SemVer) { - return version - } - - if (typeof version !== 'string') { - return null - } - - if (version.length > MAX_LENGTH) { - return null - } - - const r = options.loose ? re[t.LOOSE] : re[t.FULL] - if (!r.test(version)) { - return null - } - - try { - return new SemVer(version, options) - } catch (er) { - return null - } -} - -module.exports = parse - - -/***/ }), - -/***/ 6055: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const Range = __nccwpck_require__(9828) -const satisfies = (version, range, options) => { - try { - range = new Range(range, options) - } catch (er) { - return false - } - return range.test(version) -} -module.exports = satisfies - - -/***/ }), - -/***/ 2293: -/***/ ((module) => { - -// Note: this is the semver.org version of the spec that it implements -// Not necessarily the package version of this code. -const SEMVER_SPEC_VERSION = '2.0.0' - -const MAX_LENGTH = 256 -const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || - /* istanbul ignore next */ 9007199254740991 - -// Max safe segment length for coercion. -const MAX_SAFE_COMPONENT_LENGTH = 16 - -module.exports = { - SEMVER_SPEC_VERSION, - MAX_LENGTH, - MAX_SAFE_INTEGER, - MAX_SAFE_COMPONENT_LENGTH -} - - -/***/ }), - -/***/ 427: -/***/ ((module) => { - -const debug = ( - typeof process === 'object' && - process.env && - process.env.NODE_DEBUG && - /\bsemver\b/i.test(process.env.NODE_DEBUG) -) ? (...args) => console.error('SEMVER', ...args) - : () => {} - -module.exports = debug - - -/***/ }), - -/***/ 2463: -/***/ ((module) => { - -const numeric = /^[0-9]+$/ -const compareIdentifiers = (a, b) => { - const anum = numeric.test(a) - const bnum = numeric.test(b) - - if (anum && bnum) { - a = +a - b = +b - } - - return a === b ? 0 - : (anum && !bnum) ? -1 - : (bnum && !anum) ? 1 - : a < b ? -1 - : 1 -} - -const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a) - -module.exports = { - compareIdentifiers, - rcompareIdentifiers -} - - -/***/ }), - -/***/ 785: -/***/ ((module) => { - -// parse out just the options we care about so we always get a consistent -// obj with keys in a consistent order. -const opts = ['includePrerelease', 'loose', 'rtl'] -const parseOptions = options => - !options ? {} - : typeof options !== 'object' ? { loose: true } - : opts.filter(k => options[k]).reduce((options, k) => { - options[k] = true - return options - }, {}) -module.exports = parseOptions - - -/***/ }), - -/***/ 9523: -/***/ ((module, exports, __nccwpck_require__) => { - -const { MAX_SAFE_COMPONENT_LENGTH } = __nccwpck_require__(2293) -const debug = __nccwpck_require__(427) -exports = module.exports = {} - -// The actual regexps go on exports.re -const re = exports.re = [] -const src = exports.src = [] -const t = exports.t = {} -let R = 0 - -const createToken = (name, value, isGlobal) => { - const index = R++ - debug(index, value) - t[name] = index - src[index] = value - re[index] = new RegExp(value, isGlobal ? 'g' : undefined) -} - -// The following Regular Expressions can be used for tokenizing, -// validating, and parsing SemVer version strings. - -// ## Numeric Identifier -// A single `0`, or a non-zero digit followed by zero or more digits. - -createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*') -createToken('NUMERICIDENTIFIERLOOSE', '[0-9]+') - -// ## Non-numeric Identifier -// Zero or more digits, followed by a letter or hyphen, and then zero or -// more letters, digits, or hyphens. - -createToken('NONNUMERICIDENTIFIER', '\\d*[a-zA-Z-][a-zA-Z0-9-]*') - -// ## Main Version -// Three dot-separated numeric identifiers. - -createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})`) - -createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})`) - -// ## Pre-release Version Identifier -// A numeric identifier, or a non-numeric identifier. - -createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER] -}|${src[t.NONNUMERICIDENTIFIER]})`) - -createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE] -}|${src[t.NONNUMERICIDENTIFIER]})`) - -// ## Pre-release Version -// Hyphen, followed by one or more dot-separated pre-release version -// identifiers. - -createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER] -}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`) - -createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE] -}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`) - -// ## Build Metadata Identifier -// Any combination of digits, letters, or hyphens. - -createToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+') - -// ## Build Metadata -// Plus sign, followed by one or more period-separated build metadata -// identifiers. - -createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER] -}(?:\\.${src[t.BUILDIDENTIFIER]})*))`) - -// ## Full Version String -// A main version, followed optionally by a pre-release version and -// build metadata. - -// Note that the only major, minor, patch, and pre-release sections of -// the version string are capturing groups. The build metadata is not a -// capturing group, because it should not ever be used in version -// comparison. - -createToken('FULLPLAIN', `v?${src[t.MAINVERSION] -}${src[t.PRERELEASE]}?${ - src[t.BUILD]}?`) - -createToken('FULL', `^${src[t.FULLPLAIN]}$`) - -// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. -// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty -// common in the npm registry. -createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE] -}${src[t.PRERELEASELOOSE]}?${ - src[t.BUILD]}?`) - -createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`) - -createToken('GTLT', '((?:<|>)?=?)') - -// Something like "2.*" or "1.2.x". -// Note that "x.x" is a valid xRange identifer, meaning "any version" -// Only the first item is strictly required. -createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`) -createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`) - -createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:${src[t.PRERELEASE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:${src[t.PRERELEASELOOSE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`) -createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`) - -// Coercion. -// Extract anything that could conceivably be a part of a valid semver -createToken('COERCE', `${'(^|[^\\d])' + - '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + - `(?:$|[^\\d])`) -createToken('COERCERTL', src[t.COERCE], true) - -// Tilde ranges. -// Meaning is "reasonably at or greater than" -createToken('LONETILDE', '(?:~>?)') - -createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true) -exports.tildeTrimReplace = '$1~' - -createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`) -createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`) - -// Caret ranges. -// Meaning is "at least and backwards compatible with" -createToken('LONECARET', '(?:\\^)') - -createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true) -exports.caretTrimReplace = '$1^' - -createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`) -createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`) - -// A simple gt/lt/eq thing, or just "" to indicate "any version" -createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`) -createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`) - -// An expression to strip any whitespace between the gtlt and the thing -// it modifies, so that `> 1.2.3` ==> `>1.2.3` -createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT] -}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true) -exports.comparatorTrimReplace = '$1$2$3' - -// Something like `1.2.3 - 1.2.4` -// Note that these all use the loose form, because they'll be -// checked against either the strict or loose comparator form -// later. -createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAIN]})` + - `\\s*$`) - -createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAINLOOSE]})` + - `\\s*$`) - -// Star ranges basically just allow anything at all. -createToken('STAR', '(<|>)?=?\\s*\\*') -// >=0.0.0 is like a star -createToken('GTE0', '^\\s*>=\\s*0\.0\.0\\s*$') -createToken('GTE0PRE', '^\\s*>=\\s*0\.0\.0-0\\s*$') - - -/***/ }), - -/***/ 1196: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - - -// A linked list to keep track of recently-used-ness -const Yallist = __nccwpck_require__(220) - -const MAX = Symbol('max') -const LENGTH = Symbol('length') -const LENGTH_CALCULATOR = Symbol('lengthCalculator') -const ALLOW_STALE = Symbol('allowStale') -const MAX_AGE = Symbol('maxAge') -const DISPOSE = Symbol('dispose') -const NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet') -const LRU_LIST = Symbol('lruList') -const CACHE = Symbol('cache') -const UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet') - -const naiveLength = () => 1 - -// lruList is a yallist where the head is the youngest -// item, and the tail is the oldest. the list contains the Hit -// objects as the entries. -// Each Hit object has a reference to its Yallist.Node. This -// never changes. -// -// cache is a Map (or PseudoMap) that matches the keys to -// the Yallist.Node object. -class LRUCache { - constructor (options) { - if (typeof options === 'number') - options = { max: options } - - if (!options) - options = {} - - if (options.max && (typeof options.max !== 'number' || options.max < 0)) - throw new TypeError('max must be a non-negative number') - // Kind of weird to have a default max of Infinity, but oh well. - const max = this[MAX] = options.max || Infinity - - const lc = options.length || naiveLength - this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc - this[ALLOW_STALE] = options.stale || false - if (options.maxAge && typeof options.maxAge !== 'number') - throw new TypeError('maxAge must be a number') - this[MAX_AGE] = options.maxAge || 0 - this[DISPOSE] = options.dispose - this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false - this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false - this.reset() - } - - // resize the cache when the max changes. - set max (mL) { - if (typeof mL !== 'number' || mL < 0) - throw new TypeError('max must be a non-negative number') - - this[MAX] = mL || Infinity - trim(this) - } - get max () { - return this[MAX] - } - - set allowStale (allowStale) { - this[ALLOW_STALE] = !!allowStale - } - get allowStale () { - return this[ALLOW_STALE] - } - - set maxAge (mA) { - if (typeof mA !== 'number') - throw new TypeError('maxAge must be a non-negative number') - - this[MAX_AGE] = mA - trim(this) - } - get maxAge () { - return this[MAX_AGE] - } - - // resize the cache when the lengthCalculator changes. - set lengthCalculator (lC) { - if (typeof lC !== 'function') - lC = naiveLength - - if (lC !== this[LENGTH_CALCULATOR]) { - this[LENGTH_CALCULATOR] = lC - this[LENGTH] = 0 - this[LRU_LIST].forEach(hit => { - hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key) - this[LENGTH] += hit.length - }) - } - trim(this) - } - get lengthCalculator () { return this[LENGTH_CALCULATOR] } - - get length () { return this[LENGTH] } - get itemCount () { return this[LRU_LIST].length } - - rforEach (fn, thisp) { - thisp = thisp || this - for (let walker = this[LRU_LIST].tail; walker !== null;) { - const prev = walker.prev - forEachStep(this, fn, walker, thisp) - walker = prev - } - } - - forEach (fn, thisp) { - thisp = thisp || this - for (let walker = this[LRU_LIST].head; walker !== null;) { - const next = walker.next - forEachStep(this, fn, walker, thisp) - walker = next - } - } - - keys () { - return this[LRU_LIST].toArray().map(k => k.key) - } - - values () { - return this[LRU_LIST].toArray().map(k => k.value) - } - - reset () { - if (this[DISPOSE] && - this[LRU_LIST] && - this[LRU_LIST].length) { - this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value)) - } - - this[CACHE] = new Map() // hash of items by key - this[LRU_LIST] = new Yallist() // list of items in order of use recency - this[LENGTH] = 0 // length of items in the list - } - - dump () { - return this[LRU_LIST].map(hit => - isStale(this, hit) ? false : { - k: hit.key, - v: hit.value, - e: hit.now + (hit.maxAge || 0) - }).toArray().filter(h => h) - } - - dumpLru () { - return this[LRU_LIST] - } - - set (key, value, maxAge) { - maxAge = maxAge || this[MAX_AGE] - - if (maxAge && typeof maxAge !== 'number') - throw new TypeError('maxAge must be a number') - - const now = maxAge ? Date.now() : 0 - const len = this[LENGTH_CALCULATOR](value, key) - - if (this[CACHE].has(key)) { - if (len > this[MAX]) { - del(this, this[CACHE].get(key)) - return false - } - - const node = this[CACHE].get(key) - const item = node.value - - // dispose of the old one before overwriting - // split out into 2 ifs for better coverage tracking - if (this[DISPOSE]) { - if (!this[NO_DISPOSE_ON_SET]) - this[DISPOSE](key, item.value) - } - - item.now = now - item.maxAge = maxAge - item.value = value - this[LENGTH] += len - item.length - item.length = len - this.get(key) - trim(this) - return true - } - - const hit = new Entry(key, value, len, now, maxAge) - - // oversized objects fall out of cache automatically. - if (hit.length > this[MAX]) { - if (this[DISPOSE]) - this[DISPOSE](key, value) - - return false - } - - this[LENGTH] += hit.length - this[LRU_LIST].unshift(hit) - this[CACHE].set(key, this[LRU_LIST].head) - trim(this) - return true - } - - has (key) { - if (!this[CACHE].has(key)) return false - const hit = this[CACHE].get(key).value - return !isStale(this, hit) - } - - get (key) { - return get(this, key, true) - } - - peek (key) { - return get(this, key, false) - } - - pop () { - const node = this[LRU_LIST].tail - if (!node) - return null - - del(this, node) - return node.value - } - - del (key) { - del(this, this[CACHE].get(key)) - } - - load (arr) { - // reset the cache - this.reset() - - const now = Date.now() - // A previous serialized cache has the most recent items first - for (let l = arr.length - 1; l >= 0; l--) { - const hit = arr[l] - const expiresAt = hit.e || 0 - if (expiresAt === 0) - // the item was created without expiration in a non aged cache - this.set(hit.k, hit.v) - else { - const maxAge = expiresAt - now - // dont add already expired items - if (maxAge > 0) { - this.set(hit.k, hit.v, maxAge) - } - } - } - } - - prune () { - this[CACHE].forEach((value, key) => get(this, key, false)) - } -} - -const get = (self, key, doUse) => { - const node = self[CACHE].get(key) - if (node) { - const hit = node.value - if (isStale(self, hit)) { - del(self, node) - if (!self[ALLOW_STALE]) - return undefined - } else { - if (doUse) { - if (self[UPDATE_AGE_ON_GET]) - node.value.now = Date.now() - self[LRU_LIST].unshiftNode(node) - } - } - return hit.value - } -} - -const isStale = (self, hit) => { - if (!hit || (!hit.maxAge && !self[MAX_AGE])) - return false - - const diff = Date.now() - hit.now - return hit.maxAge ? diff > hit.maxAge - : self[MAX_AGE] && (diff > self[MAX_AGE]) -} - -const trim = self => { - if (self[LENGTH] > self[MAX]) { - for (let walker = self[LRU_LIST].tail; - self[LENGTH] > self[MAX] && walker !== null;) { - // We know that we're about to delete this one, and also - // what the next least recently used key will be, so just - // go ahead and set it now. - const prev = walker.prev - del(self, walker) - walker = prev - } - } -} - -const del = (self, node) => { - if (node) { - const hit = node.value - if (self[DISPOSE]) - self[DISPOSE](hit.key, hit.value) - - self[LENGTH] -= hit.length - self[CACHE].delete(hit.key) - self[LRU_LIST].removeNode(node) - } -} - -class Entry { - constructor (key, value, length, now, maxAge) { - this.key = key - this.value = value - this.length = length - this.now = now - this.maxAge = maxAge || 0 - } -} - -const forEachStep = (self, fn, node, thisp) => { - let hit = node.value - if (isStale(self, hit)) { - del(self, node) - if (!self[ALLOW_STALE]) - hit = undefined - } - if (hit) - fn.call(thisp, hit.value, hit.key, self) -} - -module.exports = LRUCache - - -/***/ }), - -/***/ 5327: -/***/ ((module) => { - -"use strict"; - -module.exports = function (Yallist) { - Yallist.prototype[Symbol.iterator] = function* () { - for (let walker = this.head; walker; walker = walker.next) { - yield walker.value - } - } -} - - -/***/ }), - -/***/ 220: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - -module.exports = Yallist - -Yallist.Node = Node -Yallist.create = Yallist - -function Yallist (list) { - var self = this - if (!(self instanceof Yallist)) { - self = new Yallist() - } - - self.tail = null - self.head = null - self.length = 0 - - if (list && typeof list.forEach === 'function') { - list.forEach(function (item) { - self.push(item) - }) - } else if (arguments.length > 0) { - for (var i = 0, l = arguments.length; i < l; i++) { - self.push(arguments[i]) - } - } - - return self -} - -Yallist.prototype.removeNode = function (node) { - if (node.list !== this) { - throw new Error('removing node which does not belong to this list') - } - - var next = node.next - var prev = node.prev - - if (next) { - next.prev = prev - } - - if (prev) { - prev.next = next - } - - if (node === this.head) { - this.head = next - } - if (node === this.tail) { - this.tail = prev - } - - node.list.length-- - node.next = null - node.prev = null - node.list = null - - return next -} - -Yallist.prototype.unshiftNode = function (node) { - if (node === this.head) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var head = this.head - node.list = this - node.next = head - if (head) { - head.prev = node - } - - this.head = node - if (!this.tail) { - this.tail = node - } - this.length++ -} - -Yallist.prototype.pushNode = function (node) { - if (node === this.tail) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var tail = this.tail - node.list = this - node.prev = tail - if (tail) { - tail.next = node - } - - this.tail = node - if (!this.head) { - this.head = node - } - this.length++ -} - -Yallist.prototype.push = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - push(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.unshift = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - unshift(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.pop = function () { - if (!this.tail) { - return undefined - } - - var res = this.tail.value - this.tail = this.tail.prev - if (this.tail) { - this.tail.next = null - } else { - this.head = null - } - this.length-- - return res -} - -Yallist.prototype.shift = function () { - if (!this.head) { - return undefined - } - - var res = this.head.value - this.head = this.head.next - if (this.head) { - this.head.prev = null - } else { - this.tail = null - } - this.length-- - return res -} - -Yallist.prototype.forEach = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.head, i = 0; walker !== null; i++) { - fn.call(thisp, walker.value, i, this) - walker = walker.next - } -} - -Yallist.prototype.forEachReverse = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.tail, i = this.length - 1; walker !== null; i--) { - fn.call(thisp, walker.value, i, this) - walker = walker.prev - } -} - -Yallist.prototype.get = function (n) { - for (var i = 0, walker = this.head; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.next - } - if (i === n && walker !== null) { - return walker.value - } -} - -Yallist.prototype.getReverse = function (n) { - for (var i = 0, walker = this.tail; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.prev - } - if (i === n && walker !== null) { - return walker.value - } -} - -Yallist.prototype.map = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.head; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.next - } - return res -} - -Yallist.prototype.mapReverse = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.tail; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.prev - } - return res -} - -Yallist.prototype.reduce = function (fn, initial) { - var acc - var walker = this.head - if (arguments.length > 1) { - acc = initial - } else if (this.head) { - walker = this.head.next - acc = this.head.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } - - for (var i = 0; walker !== null; i++) { - acc = fn(acc, walker.value, i) - walker = walker.next - } - - return acc -} - -Yallist.prototype.reduceReverse = function (fn, initial) { - var acc - var walker = this.tail - if (arguments.length > 1) { - acc = initial - } else if (this.tail) { - walker = this.tail.prev - acc = this.tail.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } - - for (var i = this.length - 1; walker !== null; i--) { - acc = fn(acc, walker.value, i) - walker = walker.prev - } - - return acc -} - -Yallist.prototype.toArray = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.head; walker !== null; i++) { - arr[i] = walker.value - walker = walker.next - } - return arr -} - -Yallist.prototype.toArrayReverse = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.tail; walker !== null; i++) { - arr[i] = walker.value - walker = walker.prev - } - return arr -} - -Yallist.prototype.slice = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = 0, walker = this.head; walker !== null && i < from; i++) { - walker = walker.next - } - for (; walker !== null && i < to; i++, walker = walker.next) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.sliceReverse = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) { - walker = walker.prev - } - for (; walker !== null && i > from; i--, walker = walker.prev) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.splice = function (start, deleteCount, ...nodes) { - if (start > this.length) { - start = this.length - 1 - } - if (start < 0) { - start = this.length + start; - } - - for (var i = 0, walker = this.head; walker !== null && i < start; i++) { - walker = walker.next - } - - var ret = [] - for (var i = 0; walker && i < deleteCount; i++) { - ret.push(walker.value) - walker = this.removeNode(walker) - } - if (walker === null) { - walker = this.tail - } - - if (walker !== this.head && walker !== this.tail) { - walker = walker.prev - } - - for (var i = 0; i < nodes.length; i++) { - walker = insert(this, walker, nodes[i]) - } - return ret; -} - -Yallist.prototype.reverse = function () { - var head = this.head - var tail = this.tail - for (var walker = head; walker !== null; walker = walker.prev) { - var p = walker.prev - walker.prev = walker.next - walker.next = p - } - this.head = tail - this.tail = head - return this -} - -function insert (self, node, value) { - var inserted = node === self.head ? - new Node(value, null, node, self) : - new Node(value, node, node.next, self) - - if (inserted.next === null) { - self.tail = inserted - } - if (inserted.prev === null) { - self.head = inserted - } - - self.length++ - - return inserted -} - -function push (self, item) { - self.tail = new Node(item, self.tail, null, self) - if (!self.head) { - self.head = self.tail - } - self.length++ -} - -function unshift (self, item) { - self.head = new Node(item, null, self.head, self) - if (!self.tail) { - self.tail = self.head - } - self.length++ -} - -function Node (value, prev, next, list) { - if (!(this instanceof Node)) { - return new Node(value, prev, next, list) - } - - this.list = list - this.value = value - - if (prev) { - prev.next = this - this.prev = prev - } else { - this.prev = null - } - - if (next) { - next.prev = this - this.next = next - } else { - this.next = null - } -} - -try { - // add if support for Symbol.iterator is present - __nccwpck_require__(5327)(Yallist) -} catch (er) {} - - /***/ }), /***/ 4294: diff --git a/.github/actions/reopenIssueWithComment/index.js b/.github/actions/reopenIssueWithComment/index.js index a8ac89842010..26f9a663122e 100644 --- a/.github/actions/reopenIssueWithComment/index.js +++ b/.github/actions/reopenIssueWithComment/index.js @@ -53,8 +53,6 @@ reopenIssueWithComment() const _ = __nccwpck_require__(4987); const lodashGet = __nccwpck_require__(6908); -const semverParse = __nccwpck_require__(5925); -const semverSatisfies = __nccwpck_require__(6055); const GITHUB_OWNER = 'Expensify'; const EXPENSIFY_CASH_REPO = 'Expensify.cash'; @@ -115,11 +113,6 @@ class GithubUtils { try { const versionRegex = new RegExp('([0-9]+)\\.([0-9]+)\\.([0-9]+)(?:-([0-9]+))?', 'g'); const tag = issue.body.match(versionRegex)[0].replace(/`/g, ''); - - // eslint-disable-next-line max-len - const compareURLRegex = new RegExp(`${EXPENSIFY_CASH_URL}/compare/${versionRegex.source}\\.\\.\\.${versionRegex.source}`, 'g'); - const comparisonURL = issue.body.match(compareURLRegex)[0]; - return { title: issue.title, url: issue.url, @@ -127,7 +120,6 @@ class GithubUtils { PRList: this.getStagingDeployCashPRList(issue), deployBlockers: this.getStagingDeployCashDeployBlockers(issue), tag, - comparisonURL, }; } catch (exception) { throw new Error(`Unable to find ${STAGING_DEPLOY_CASH_LABEL} issue with correct data.`); @@ -202,71 +194,6 @@ class GithubUtils { ); } - /** - * Generate a comparison URL between two versions following the semverLevel passed - * - * @param {String} repoSlug - The slug of the repository: / - * @param {String} tag - The tag to compare first the previous semverLevel - * @param {String} semverLevel - The semantic versioning MAJOR, MINOR, PATCH and BUILD - * @return {Promise} the url generated - * @throws {Error} If the request to the Github API fails. - */ - generateVersionComparisonURL(repoSlug, tag, semverLevel) { - return new Promise((resolve, reject) => { - const getComparisonURL = (previousTag, currentTag) => ( - `${EXPENSIFY_CASH_URL}/compare/${previousTag}...${currentTag}` - ); - - const [repoOwner, repoName] = repoSlug.split('/'); - const tagSemver = semverParse(tag); - - return this.octokit.repos.listTags({ - owner: repoOwner, - repo: repoName, - }) - .then(githubResponse => githubResponse.data.some(({name: repoTag}) => { - if (semverLevel === 'MAJOR' - && semverSatisfies(repoTag, `<${tagSemver.major}.x.x`, {includePrerelease: true}) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'MINOR' - && semverSatisfies( - repoTag, - `<${tagSemver.major}.${tagSemver.minor}.x`, - {includePrerelease: true}, - ) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'PATCH' - && semverSatisfies(repoTag, `<${tagSemver}`, {includePrerelease: true}) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'BUILD' - && repoTag !== tagSemver.version - && semverSatisfies( - repoTag, - `<=${tagSemver.major}.${tagSemver.minor}.${tagSemver.patch}`, - {includePrerelease: true}, - ) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - return false; - })) - .catch(githubError => reject(githubError)); - }); - } - /** * Creates a new StagingDeployCash issue. * @@ -362,22 +289,16 @@ class GithubUtils { deployBlockers = [], resolvedDeployBlockers = [], ) { - return Promise.all([ - this.generateVersionComparisonURL(`${GITHUB_OWNER}/${EXPENSIFY_CASH_REPO}`, tag, 'PATCH'), - this.octokit.pulls.list({ - owner: GITHUB_OWNER, - repo: EXPENSIFY_CASH_REPO, - per_page: 100, - }), - ]) - .then(results => ({ - comparisonURL: results[0], - automergePRs: _.map( - _.filter(results[1].data, GithubUtils.isAutomergePullRequest), + return this.octokit.pulls.list({ + owner: GITHUB_OWNER, + repo: EXPENSIFY_CASH_REPO, + per_page: 100, + }) + .then(({data}) => { + const automergePRs = _.pluck( + _.filter(data, GithubUtils.isAutomergePullRequest), 'html_url', - ), - })) - .then(({comparisonURL, automergePRs}) => { + ); const sortedPRList = _.chain(PRList) .difference(automergePRs) .unique() @@ -389,8 +310,8 @@ class GithubUtils { ); // Tag version and comparison URL - let issueBody = `**Release Version:** \`${tag}\`\r\n`; - issueBody += `**Compare Changes:** ${comparisonURL}\r\n`; + // eslint-disable-next-line max-len + let issueBody = `**Release Version:** \`${tag}\`\r\n**Compare Changes:** https://github.com/Expensify/Expensify.cash/compare/production...staging\r\n`; // PR list if (!_.isEmpty(PRList)) { @@ -411,11 +332,13 @@ class GithubUtils { } issueBody += '\r\ncc @Expensify/applauseleads\r\n'; - return issueBody; }) - // eslint-disable-next-line no-console - .catch(err => console.warn('Error generating comparison URL, continuing...', err)); + .catch(err => console.warn( + 'Error generating StagingDeployCash issue body!', + 'Automerge PRs may not be properly filtered out. Continuing...', + err, + )); } /** @@ -10761,2212 +10684,6 @@ if (!safer.constants) { module.exports = safer -/***/ }), - -/***/ 1532: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const ANY = Symbol('SemVer ANY') -// hoisted class for cyclic dependency -class Comparator { - static get ANY () { - return ANY - } - constructor (comp, options) { - options = parseOptions(options) - - if (comp instanceof Comparator) { - if (comp.loose === !!options.loose) { - return comp - } else { - comp = comp.value - } - } - - debug('comparator', comp, options) - this.options = options - this.loose = !!options.loose - this.parse(comp) - - if (this.semver === ANY) { - this.value = '' - } else { - this.value = this.operator + this.semver.version - } - - debug('comp', this) - } - - parse (comp) { - const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] - const m = comp.match(r) - - if (!m) { - throw new TypeError(`Invalid comparator: ${comp}`) - } - - this.operator = m[1] !== undefined ? m[1] : '' - if (this.operator === '=') { - this.operator = '' - } - - // if it literally is just '>' or '' then allow anything. - if (!m[2]) { - this.semver = ANY - } else { - this.semver = new SemVer(m[2], this.options.loose) - } - } - - toString () { - return this.value - } - - test (version) { - debug('Comparator.test', version, this.options.loose) - - if (this.semver === ANY || version === ANY) { - return true - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - return cmp(version, this.operator, this.semver, this.options) - } - - intersects (comp, options) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required') - } - - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - if (this.operator === '') { - if (this.value === '') { - return true - } - return new Range(comp.value, options).test(this.value) - } else if (comp.operator === '') { - if (comp.value === '') { - return true - } - return new Range(this.value, options).test(comp.semver) - } - - const sameDirectionIncreasing = - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '>=' || comp.operator === '>') - const sameDirectionDecreasing = - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '<=' || comp.operator === '<') - const sameSemVer = this.semver.version === comp.semver.version - const differentDirectionsInclusive = - (this.operator === '>=' || this.operator === '<=') && - (comp.operator === '>=' || comp.operator === '<=') - const oppositeDirectionsLessThan = - cmp(this.semver, '<', comp.semver, options) && - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '<=' || comp.operator === '<') - const oppositeDirectionsGreaterThan = - cmp(this.semver, '>', comp.semver, options) && - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '>=' || comp.operator === '>') - - return ( - sameDirectionIncreasing || - sameDirectionDecreasing || - (sameSemVer && differentDirectionsInclusive) || - oppositeDirectionsLessThan || - oppositeDirectionsGreaterThan - ) - } -} - -module.exports = Comparator - -const parseOptions = __nccwpck_require__(785) -const {re, t} = __nccwpck_require__(9523) -const cmp = __nccwpck_require__(5098) -const debug = __nccwpck_require__(427) -const SemVer = __nccwpck_require__(8088) -const Range = __nccwpck_require__(9828) - - -/***/ }), - -/***/ 9828: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -// hoisted class for cyclic dependency -class Range { - constructor (range, options) { - options = parseOptions(options) - - if (range instanceof Range) { - if ( - range.loose === !!options.loose && - range.includePrerelease === !!options.includePrerelease - ) { - return range - } else { - return new Range(range.raw, options) - } - } - - if (range instanceof Comparator) { - // just put it in the set and return - this.raw = range.value - this.set = [[range]] - this.format() - return this - } - - this.options = options - this.loose = !!options.loose - this.includePrerelease = !!options.includePrerelease - - // First, split based on boolean or || - this.raw = range - this.set = range - .split(/\s*\|\|\s*/) - // map the range to a 2d array of comparators - .map(range => this.parseRange(range.trim())) - // throw out any comparator lists that are empty - // this generally means that it was not a valid range, which is allowed - // in loose mode, but will still throw if the WHOLE range is invalid. - .filter(c => c.length) - - if (!this.set.length) { - throw new TypeError(`Invalid SemVer Range: ${range}`) - } - - // if we have any that are not the null set, throw out null sets. - if (this.set.length > 1) { - // keep the first one, in case they're all null sets - const first = this.set[0] - this.set = this.set.filter(c => !isNullSet(c[0])) - if (this.set.length === 0) - this.set = [first] - else if (this.set.length > 1) { - // if we have any that are *, then the range is just * - for (const c of this.set) { - if (c.length === 1 && isAny(c[0])) { - this.set = [c] - break - } - } - } - } - - this.format() - } - - format () { - this.range = this.set - .map((comps) => { - return comps.join(' ').trim() - }) - .join('||') - .trim() - return this.range - } - - toString () { - return this.range - } - - parseRange (range) { - range = range.trim() - - // memoize range parsing for performance. - // this is a very hot path, and fully deterministic. - const memoOpts = Object.keys(this.options).join(',') - const memoKey = `parseRange:${memoOpts}:${range}` - const cached = cache.get(memoKey) - if (cached) - return cached - - const loose = this.options.loose - // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` - const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE] - range = range.replace(hr, hyphenReplace(this.options.includePrerelease)) - debug('hyphen replace', range) - // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` - range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace) - debug('comparator trim', range, re[t.COMPARATORTRIM]) - - // `~ 1.2.3` => `~1.2.3` - range = range.replace(re[t.TILDETRIM], tildeTrimReplace) - - // `^ 1.2.3` => `^1.2.3` - range = range.replace(re[t.CARETTRIM], caretTrimReplace) - - // normalize spaces - range = range.split(/\s+/).join(' ') - - // At this point, the range is completely trimmed and - // ready to be split into comparators. - - const compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] - const rangeList = range - .split(' ') - .map(comp => parseComparator(comp, this.options)) - .join(' ') - .split(/\s+/) - // >=0.0.0 is equivalent to * - .map(comp => replaceGTE0(comp, this.options)) - // in loose mode, throw out any that are not valid comparators - .filter(this.options.loose ? comp => !!comp.match(compRe) : () => true) - .map(comp => new Comparator(comp, this.options)) - - // if any comparators are the null set, then replace with JUST null set - // if more than one comparator, remove any * comparators - // also, don't include the same comparator more than once - const l = rangeList.length - const rangeMap = new Map() - for (const comp of rangeList) { - if (isNullSet(comp)) - return [comp] - rangeMap.set(comp.value, comp) - } - if (rangeMap.size > 1 && rangeMap.has('')) - rangeMap.delete('') - - const result = [...rangeMap.values()] - cache.set(memoKey, result) - return result - } - - intersects (range, options) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required') - } - - return this.set.some((thisComparators) => { - return ( - isSatisfiable(thisComparators, options) && - range.set.some((rangeComparators) => { - return ( - isSatisfiable(rangeComparators, options) && - thisComparators.every((thisComparator) => { - return rangeComparators.every((rangeComparator) => { - return thisComparator.intersects(rangeComparator, options) - }) - }) - ) - }) - ) - }) - } - - // if ANY of the sets match ALL of its comparators, then pass - test (version) { - if (!version) { - return false - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - for (let i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version, this.options)) { - return true - } - } - return false - } -} -module.exports = Range - -const LRU = __nccwpck_require__(1196) -const cache = new LRU({ max: 1000 }) - -const parseOptions = __nccwpck_require__(785) -const Comparator = __nccwpck_require__(1532) -const debug = __nccwpck_require__(427) -const SemVer = __nccwpck_require__(8088) -const { - re, - t, - comparatorTrimReplace, - tildeTrimReplace, - caretTrimReplace -} = __nccwpck_require__(9523) - -const isNullSet = c => c.value === '<0.0.0-0' -const isAny = c => c.value === '' - -// take a set of comparators and determine whether there -// exists a version which can satisfy it -const isSatisfiable = (comparators, options) => { - let result = true - const remainingComparators = comparators.slice() - let testComparator = remainingComparators.pop() - - while (result && remainingComparators.length) { - result = remainingComparators.every((otherComparator) => { - return testComparator.intersects(otherComparator, options) - }) - - testComparator = remainingComparators.pop() - } - - return result -} - -// comprised of xranges, tildes, stars, and gtlt's at this point. -// already replaced the hyphen ranges -// turn into a set of JUST comparators. -const parseComparator = (comp, options) => { - debug('comp', comp, options) - comp = replaceCarets(comp, options) - debug('caret', comp) - comp = replaceTildes(comp, options) - debug('tildes', comp) - comp = replaceXRanges(comp, options) - debug('xrange', comp) - comp = replaceStars(comp, options) - debug('stars', comp) - return comp -} - -const isX = id => !id || id.toLowerCase() === 'x' || id === '*' - -// ~, ~> --> * (any, kinda silly) -// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0 -// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0 -// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0 -// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0 -// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0 -const replaceTildes = (comp, options) => - comp.trim().split(/\s+/).map((comp) => { - return replaceTilde(comp, options) - }).join(' ') - -const replaceTilde = (comp, options) => { - const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] - return comp.replace(r, (_, M, m, p, pr) => { - debug('tilde', comp, _, M, m, p, pr) - let ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = `>=${M}.0.0 <${+M + 1}.0.0-0` - } else if (isX(p)) { - // ~1.2 == >=1.2.0 <1.3.0-0 - ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0` - } else if (pr) { - debug('replaceTilde pr', pr) - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${+m + 1}.0-0` - } else { - // ~1.2.3 == >=1.2.3 <1.3.0-0 - ret = `>=${M}.${m}.${p - } <${M}.${+m + 1}.0-0` - } - - debug('tilde return', ret) - return ret - }) -} - -// ^ --> * (any, kinda silly) -// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0 -// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0 -// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0 -// ^1.2.3 --> >=1.2.3 <2.0.0-0 -// ^1.2.0 --> >=1.2.0 <2.0.0-0 -const replaceCarets = (comp, options) => - comp.trim().split(/\s+/).map((comp) => { - return replaceCaret(comp, options) - }).join(' ') - -const replaceCaret = (comp, options) => { - debug('caret', comp, options) - const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET] - const z = options.includePrerelease ? '-0' : '' - return comp.replace(r, (_, M, m, p, pr) => { - debug('caret', comp, _, M, m, p, pr) - let ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0` - } else if (isX(p)) { - if (M === '0') { - ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0` - } else { - ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0` - } - } else if (pr) { - debug('replaceCaret pr', pr) - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${m}.${+p + 1}-0` - } else { - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${+m + 1}.0-0` - } - } else { - ret = `>=${M}.${m}.${p}-${pr - } <${+M + 1}.0.0-0` - } - } else { - debug('no pr') - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p - }${z} <${M}.${m}.${+p + 1}-0` - } else { - ret = `>=${M}.${m}.${p - }${z} <${M}.${+m + 1}.0-0` - } - } else { - ret = `>=${M}.${m}.${p - } <${+M + 1}.0.0-0` - } - } - - debug('caret return', ret) - return ret - }) -} - -const replaceXRanges = (comp, options) => { - debug('replaceXRanges', comp, options) - return comp.split(/\s+/).map((comp) => { - return replaceXRange(comp, options) - }).join(' ') -} - -const replaceXRange = (comp, options) => { - comp = comp.trim() - const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE] - return comp.replace(r, (ret, gtlt, M, m, p, pr) => { - debug('xRange', comp, ret, gtlt, M, m, p, pr) - const xM = isX(M) - const xm = xM || isX(m) - const xp = xm || isX(p) - const anyX = xp - - if (gtlt === '=' && anyX) { - gtlt = '' - } - - // if we're including prereleases in the match, then we need - // to fix this to -0, the lowest possible prerelease value - pr = options.includePrerelease ? '-0' : '' - - if (xM) { - if (gtlt === '>' || gtlt === '<') { - // nothing is allowed - ret = '<0.0.0-0' - } else { - // nothing is forbidden - ret = '*' - } - } else if (gtlt && anyX) { - // we know patch is an x, because we have any x at all. - // replace X with 0 - if (xm) { - m = 0 - } - p = 0 - - if (gtlt === '>') { - // >1 => >=2.0.0 - // >1.2 => >=1.3.0 - gtlt = '>=' - if (xm) { - M = +M + 1 - m = 0 - p = 0 - } else { - m = +m + 1 - p = 0 - } - } else if (gtlt === '<=') { - // <=0.7.x is actually <0.8.0, since any 0.7.x should - // pass. Similarly, <=7.x is actually <8.0.0, etc. - gtlt = '<' - if (xm) { - M = +M + 1 - } else { - m = +m + 1 - } - } - - if (gtlt === '<') - pr = '-0' - - ret = `${gtlt + M}.${m}.${p}${pr}` - } else if (xm) { - ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0` - } else if (xp) { - ret = `>=${M}.${m}.0${pr - } <${M}.${+m + 1}.0-0` - } - - debug('xRange return', ret) - - return ret - }) -} - -// Because * is AND-ed with everything else in the comparator, -// and '' means "any version", just remove the *s entirely. -const replaceStars = (comp, options) => { - debug('replaceStars', comp, options) - // Looseness is ignored here. star is always as loose as it gets! - return comp.trim().replace(re[t.STAR], '') -} - -const replaceGTE0 = (comp, options) => { - debug('replaceGTE0', comp, options) - return comp.trim() - .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '') -} - -// This function is passed to string.replace(re[t.HYPHENRANGE]) -// M, m, patch, prerelease, build -// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 -// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do -// 1.2 - 3.4 => >=1.2.0 <3.5.0-0 -const hyphenReplace = incPr => ($0, - from, fM, fm, fp, fpr, fb, - to, tM, tm, tp, tpr, tb) => { - if (isX(fM)) { - from = '' - } else if (isX(fm)) { - from = `>=${fM}.0.0${incPr ? '-0' : ''}` - } else if (isX(fp)) { - from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}` - } else if (fpr) { - from = `>=${from}` - } else { - from = `>=${from}${incPr ? '-0' : ''}` - } - - if (isX(tM)) { - to = '' - } else if (isX(tm)) { - to = `<${+tM + 1}.0.0-0` - } else if (isX(tp)) { - to = `<${tM}.${+tm + 1}.0-0` - } else if (tpr) { - to = `<=${tM}.${tm}.${tp}-${tpr}` - } else if (incPr) { - to = `<${tM}.${tm}.${+tp + 1}-0` - } else { - to = `<=${to}` - } - - return (`${from} ${to}`).trim() -} - -const testSet = (set, version, options) => { - for (let i = 0; i < set.length; i++) { - if (!set[i].test(version)) { - return false - } - } - - if (version.prerelease.length && !options.includePrerelease) { - // Find the set of versions that are allowed to have prereleases - // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 - // That should allow `1.2.3-pr.2` to pass. - // However, `1.2.4-alpha.notready` should NOT be allowed, - // even though it's within the range set by the comparators. - for (let i = 0; i < set.length; i++) { - debug(set[i].semver) - if (set[i].semver === Comparator.ANY) { - continue - } - - if (set[i].semver.prerelease.length > 0) { - const allowed = set[i].semver - if (allowed.major === version.major && - allowed.minor === version.minor && - allowed.patch === version.patch) { - return true - } - } - } - - // Version has a -pre, but it's not one of the ones we like. - return false - } - - return true -} - - -/***/ }), - -/***/ 8088: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const debug = __nccwpck_require__(427) -const { MAX_LENGTH, MAX_SAFE_INTEGER } = __nccwpck_require__(2293) -const { re, t } = __nccwpck_require__(9523) - -const parseOptions = __nccwpck_require__(785) -const { compareIdentifiers } = __nccwpck_require__(2463) -class SemVer { - constructor (version, options) { - options = parseOptions(options) - - if (version instanceof SemVer) { - if (version.loose === !!options.loose && - version.includePrerelease === !!options.includePrerelease) { - return version - } else { - version = version.version - } - } else if (typeof version !== 'string') { - throw new TypeError(`Invalid Version: ${version}`) - } - - if (version.length > MAX_LENGTH) { - throw new TypeError( - `version is longer than ${MAX_LENGTH} characters` - ) - } - - debug('SemVer', version, options) - this.options = options - this.loose = !!options.loose - // this isn't actually relevant for versions, but keep it so that we - // don't run into trouble passing this.options around. - this.includePrerelease = !!options.includePrerelease - - const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]) - - if (!m) { - throw new TypeError(`Invalid Version: ${version}`) - } - - this.raw = version - - // these are actually numbers - this.major = +m[1] - this.minor = +m[2] - this.patch = +m[3] - - if (this.major > MAX_SAFE_INTEGER || this.major < 0) { - throw new TypeError('Invalid major version') - } - - if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { - throw new TypeError('Invalid minor version') - } - - if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { - throw new TypeError('Invalid patch version') - } - - // numberify any prerelease numeric ids - if (!m[4]) { - this.prerelease = [] - } else { - this.prerelease = m[4].split('.').map((id) => { - if (/^[0-9]+$/.test(id)) { - const num = +id - if (num >= 0 && num < MAX_SAFE_INTEGER) { - return num - } - } - return id - }) - } - - this.build = m[5] ? m[5].split('.') : [] - this.format() - } - - format () { - this.version = `${this.major}.${this.minor}.${this.patch}` - if (this.prerelease.length) { - this.version += `-${this.prerelease.join('.')}` - } - return this.version - } - - toString () { - return this.version - } - - compare (other) { - debug('SemVer.compare', this.version, this.options, other) - if (!(other instanceof SemVer)) { - if (typeof other === 'string' && other === this.version) { - return 0 - } - other = new SemVer(other, this.options) - } - - if (other.version === this.version) { - return 0 - } - - return this.compareMain(other) || this.comparePre(other) - } - - compareMain (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - return ( - compareIdentifiers(this.major, other.major) || - compareIdentifiers(this.minor, other.minor) || - compareIdentifiers(this.patch, other.patch) - ) - } - - comparePre (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - // NOT having a prerelease is > having one - if (this.prerelease.length && !other.prerelease.length) { - return -1 - } else if (!this.prerelease.length && other.prerelease.length) { - return 1 - } else if (!this.prerelease.length && !other.prerelease.length) { - return 0 - } - - let i = 0 - do { - const a = this.prerelease[i] - const b = other.prerelease[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - } - - compareBuild (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - let i = 0 - do { - const a = this.build[i] - const b = other.build[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - } - - // preminor will bump the version up to the next minor release, and immediately - // down to pre-release. premajor and prepatch work the same way. - inc (release, identifier) { - switch (release) { - case 'premajor': - this.prerelease.length = 0 - this.patch = 0 - this.minor = 0 - this.major++ - this.inc('pre', identifier) - break - case 'preminor': - this.prerelease.length = 0 - this.patch = 0 - this.minor++ - this.inc('pre', identifier) - break - case 'prepatch': - // If this is already a prerelease, it will bump to the next version - // drop any prereleases that might already exist, since they are not - // relevant at this point. - this.prerelease.length = 0 - this.inc('patch', identifier) - this.inc('pre', identifier) - break - // If the input is a non-prerelease version, this acts the same as - // prepatch. - case 'prerelease': - if (this.prerelease.length === 0) { - this.inc('patch', identifier) - } - this.inc('pre', identifier) - break - - case 'major': - // If this is a pre-major version, bump up to the same major version. - // Otherwise increment major. - // 1.0.0-5 bumps to 1.0.0 - // 1.1.0 bumps to 2.0.0 - if ( - this.minor !== 0 || - this.patch !== 0 || - this.prerelease.length === 0 - ) { - this.major++ - } - this.minor = 0 - this.patch = 0 - this.prerelease = [] - break - case 'minor': - // If this is a pre-minor version, bump up to the same minor version. - // Otherwise increment minor. - // 1.2.0-5 bumps to 1.2.0 - // 1.2.1 bumps to 1.3.0 - if (this.patch !== 0 || this.prerelease.length === 0) { - this.minor++ - } - this.patch = 0 - this.prerelease = [] - break - case 'patch': - // If this is not a pre-release version, it will increment the patch. - // If it is a pre-release it will bump up to the same patch version. - // 1.2.0-5 patches to 1.2.0 - // 1.2.0 patches to 1.2.1 - if (this.prerelease.length === 0) { - this.patch++ - } - this.prerelease = [] - break - // This probably shouldn't be used publicly. - // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction. - case 'pre': - if (this.prerelease.length === 0) { - this.prerelease = [0] - } else { - let i = this.prerelease.length - while (--i >= 0) { - if (typeof this.prerelease[i] === 'number') { - this.prerelease[i]++ - i = -2 - } - } - if (i === -1) { - // didn't increment anything - this.prerelease.push(0) - } - } - if (identifier) { - // 1.2.0-beta.1 bumps to 1.2.0-beta.2, - // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 - if (this.prerelease[0] === identifier) { - if (isNaN(this.prerelease[1])) { - this.prerelease = [identifier, 0] - } - } else { - this.prerelease = [identifier, 0] - } - } - break - - default: - throw new Error(`invalid increment argument: ${release}`) - } - this.format() - this.raw = this.version - return this - } -} - -module.exports = SemVer - - -/***/ }), - -/***/ 5098: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const eq = __nccwpck_require__(1898) -const neq = __nccwpck_require__(6017) -const gt = __nccwpck_require__(4123) -const gte = __nccwpck_require__(5522) -const lt = __nccwpck_require__(194) -const lte = __nccwpck_require__(7520) - -const cmp = (a, op, b, loose) => { - switch (op) { - case '===': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a === b - - case '!==': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a !== b - - case '': - case '=': - case '==': - return eq(a, b, loose) - - case '!=': - return neq(a, b, loose) - - case '>': - return gt(a, b, loose) - - case '>=': - return gte(a, b, loose) - - case '<': - return lt(a, b, loose) - - case '<=': - return lte(a, b, loose) - - default: - throw new TypeError(`Invalid operator: ${op}`) - } -} -module.exports = cmp - - -/***/ }), - -/***/ 4309: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const SemVer = __nccwpck_require__(8088) -const compare = (a, b, loose) => - new SemVer(a, loose).compare(new SemVer(b, loose)) - -module.exports = compare - - -/***/ }), - -/***/ 1898: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const eq = (a, b, loose) => compare(a, b, loose) === 0 -module.exports = eq - - -/***/ }), - -/***/ 4123: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const gt = (a, b, loose) => compare(a, b, loose) > 0 -module.exports = gt - - -/***/ }), - -/***/ 5522: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const gte = (a, b, loose) => compare(a, b, loose) >= 0 -module.exports = gte - - -/***/ }), - -/***/ 194: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const lt = (a, b, loose) => compare(a, b, loose) < 0 -module.exports = lt - - -/***/ }), - -/***/ 7520: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const lte = (a, b, loose) => compare(a, b, loose) <= 0 -module.exports = lte - - -/***/ }), - -/***/ 6017: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const neq = (a, b, loose) => compare(a, b, loose) !== 0 -module.exports = neq - - -/***/ }), - -/***/ 5925: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const {MAX_LENGTH} = __nccwpck_require__(2293) -const { re, t } = __nccwpck_require__(9523) -const SemVer = __nccwpck_require__(8088) - -const parseOptions = __nccwpck_require__(785) -const parse = (version, options) => { - options = parseOptions(options) - - if (version instanceof SemVer) { - return version - } - - if (typeof version !== 'string') { - return null - } - - if (version.length > MAX_LENGTH) { - return null - } - - const r = options.loose ? re[t.LOOSE] : re[t.FULL] - if (!r.test(version)) { - return null - } - - try { - return new SemVer(version, options) - } catch (er) { - return null - } -} - -module.exports = parse - - -/***/ }), - -/***/ 6055: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const Range = __nccwpck_require__(9828) -const satisfies = (version, range, options) => { - try { - range = new Range(range, options) - } catch (er) { - return false - } - return range.test(version) -} -module.exports = satisfies - - -/***/ }), - -/***/ 2293: -/***/ ((module) => { - -// Note: this is the semver.org version of the spec that it implements -// Not necessarily the package version of this code. -const SEMVER_SPEC_VERSION = '2.0.0' - -const MAX_LENGTH = 256 -const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || - /* istanbul ignore next */ 9007199254740991 - -// Max safe segment length for coercion. -const MAX_SAFE_COMPONENT_LENGTH = 16 - -module.exports = { - SEMVER_SPEC_VERSION, - MAX_LENGTH, - MAX_SAFE_INTEGER, - MAX_SAFE_COMPONENT_LENGTH -} - - -/***/ }), - -/***/ 427: -/***/ ((module) => { - -const debug = ( - typeof process === 'object' && - process.env && - process.env.NODE_DEBUG && - /\bsemver\b/i.test(process.env.NODE_DEBUG) -) ? (...args) => console.error('SEMVER', ...args) - : () => {} - -module.exports = debug - - -/***/ }), - -/***/ 2463: -/***/ ((module) => { - -const numeric = /^[0-9]+$/ -const compareIdentifiers = (a, b) => { - const anum = numeric.test(a) - const bnum = numeric.test(b) - - if (anum && bnum) { - a = +a - b = +b - } - - return a === b ? 0 - : (anum && !bnum) ? -1 - : (bnum && !anum) ? 1 - : a < b ? -1 - : 1 -} - -const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a) - -module.exports = { - compareIdentifiers, - rcompareIdentifiers -} - - -/***/ }), - -/***/ 785: -/***/ ((module) => { - -// parse out just the options we care about so we always get a consistent -// obj with keys in a consistent order. -const opts = ['includePrerelease', 'loose', 'rtl'] -const parseOptions = options => - !options ? {} - : typeof options !== 'object' ? { loose: true } - : opts.filter(k => options[k]).reduce((options, k) => { - options[k] = true - return options - }, {}) -module.exports = parseOptions - - -/***/ }), - -/***/ 9523: -/***/ ((module, exports, __nccwpck_require__) => { - -const { MAX_SAFE_COMPONENT_LENGTH } = __nccwpck_require__(2293) -const debug = __nccwpck_require__(427) -exports = module.exports = {} - -// The actual regexps go on exports.re -const re = exports.re = [] -const src = exports.src = [] -const t = exports.t = {} -let R = 0 - -const createToken = (name, value, isGlobal) => { - const index = R++ - debug(index, value) - t[name] = index - src[index] = value - re[index] = new RegExp(value, isGlobal ? 'g' : undefined) -} - -// The following Regular Expressions can be used for tokenizing, -// validating, and parsing SemVer version strings. - -// ## Numeric Identifier -// A single `0`, or a non-zero digit followed by zero or more digits. - -createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*') -createToken('NUMERICIDENTIFIERLOOSE', '[0-9]+') - -// ## Non-numeric Identifier -// Zero or more digits, followed by a letter or hyphen, and then zero or -// more letters, digits, or hyphens. - -createToken('NONNUMERICIDENTIFIER', '\\d*[a-zA-Z-][a-zA-Z0-9-]*') - -// ## Main Version -// Three dot-separated numeric identifiers. - -createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})`) - -createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})`) - -// ## Pre-release Version Identifier -// A numeric identifier, or a non-numeric identifier. - -createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER] -}|${src[t.NONNUMERICIDENTIFIER]})`) - -createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE] -}|${src[t.NONNUMERICIDENTIFIER]})`) - -// ## Pre-release Version -// Hyphen, followed by one or more dot-separated pre-release version -// identifiers. - -createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER] -}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`) - -createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE] -}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`) - -// ## Build Metadata Identifier -// Any combination of digits, letters, or hyphens. - -createToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+') - -// ## Build Metadata -// Plus sign, followed by one or more period-separated build metadata -// identifiers. - -createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER] -}(?:\\.${src[t.BUILDIDENTIFIER]})*))`) - -// ## Full Version String -// A main version, followed optionally by a pre-release version and -// build metadata. - -// Note that the only major, minor, patch, and pre-release sections of -// the version string are capturing groups. The build metadata is not a -// capturing group, because it should not ever be used in version -// comparison. - -createToken('FULLPLAIN', `v?${src[t.MAINVERSION] -}${src[t.PRERELEASE]}?${ - src[t.BUILD]}?`) - -createToken('FULL', `^${src[t.FULLPLAIN]}$`) - -// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. -// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty -// common in the npm registry. -createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE] -}${src[t.PRERELEASELOOSE]}?${ - src[t.BUILD]}?`) - -createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`) - -createToken('GTLT', '((?:<|>)?=?)') - -// Something like "2.*" or "1.2.x". -// Note that "x.x" is a valid xRange identifer, meaning "any version" -// Only the first item is strictly required. -createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`) -createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`) - -createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:${src[t.PRERELEASE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:${src[t.PRERELEASELOOSE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`) -createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`) - -// Coercion. -// Extract anything that could conceivably be a part of a valid semver -createToken('COERCE', `${'(^|[^\\d])' + - '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + - `(?:$|[^\\d])`) -createToken('COERCERTL', src[t.COERCE], true) - -// Tilde ranges. -// Meaning is "reasonably at or greater than" -createToken('LONETILDE', '(?:~>?)') - -createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true) -exports.tildeTrimReplace = '$1~' - -createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`) -createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`) - -// Caret ranges. -// Meaning is "at least and backwards compatible with" -createToken('LONECARET', '(?:\\^)') - -createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true) -exports.caretTrimReplace = '$1^' - -createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`) -createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`) - -// A simple gt/lt/eq thing, or just "" to indicate "any version" -createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`) -createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`) - -// An expression to strip any whitespace between the gtlt and the thing -// it modifies, so that `> 1.2.3` ==> `>1.2.3` -createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT] -}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true) -exports.comparatorTrimReplace = '$1$2$3' - -// Something like `1.2.3 - 1.2.4` -// Note that these all use the loose form, because they'll be -// checked against either the strict or loose comparator form -// later. -createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAIN]})` + - `\\s*$`) - -createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAINLOOSE]})` + - `\\s*$`) - -// Star ranges basically just allow anything at all. -createToken('STAR', '(<|>)?=?\\s*\\*') -// >=0.0.0 is like a star -createToken('GTE0', '^\\s*>=\\s*0\.0\.0\\s*$') -createToken('GTE0PRE', '^\\s*>=\\s*0\.0\.0-0\\s*$') - - -/***/ }), - -/***/ 1196: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - - -// A linked list to keep track of recently-used-ness -const Yallist = __nccwpck_require__(220) - -const MAX = Symbol('max') -const LENGTH = Symbol('length') -const LENGTH_CALCULATOR = Symbol('lengthCalculator') -const ALLOW_STALE = Symbol('allowStale') -const MAX_AGE = Symbol('maxAge') -const DISPOSE = Symbol('dispose') -const NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet') -const LRU_LIST = Symbol('lruList') -const CACHE = Symbol('cache') -const UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet') - -const naiveLength = () => 1 - -// lruList is a yallist where the head is the youngest -// item, and the tail is the oldest. the list contains the Hit -// objects as the entries. -// Each Hit object has a reference to its Yallist.Node. This -// never changes. -// -// cache is a Map (or PseudoMap) that matches the keys to -// the Yallist.Node object. -class LRUCache { - constructor (options) { - if (typeof options === 'number') - options = { max: options } - - if (!options) - options = {} - - if (options.max && (typeof options.max !== 'number' || options.max < 0)) - throw new TypeError('max must be a non-negative number') - // Kind of weird to have a default max of Infinity, but oh well. - const max = this[MAX] = options.max || Infinity - - const lc = options.length || naiveLength - this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc - this[ALLOW_STALE] = options.stale || false - if (options.maxAge && typeof options.maxAge !== 'number') - throw new TypeError('maxAge must be a number') - this[MAX_AGE] = options.maxAge || 0 - this[DISPOSE] = options.dispose - this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false - this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false - this.reset() - } - - // resize the cache when the max changes. - set max (mL) { - if (typeof mL !== 'number' || mL < 0) - throw new TypeError('max must be a non-negative number') - - this[MAX] = mL || Infinity - trim(this) - } - get max () { - return this[MAX] - } - - set allowStale (allowStale) { - this[ALLOW_STALE] = !!allowStale - } - get allowStale () { - return this[ALLOW_STALE] - } - - set maxAge (mA) { - if (typeof mA !== 'number') - throw new TypeError('maxAge must be a non-negative number') - - this[MAX_AGE] = mA - trim(this) - } - get maxAge () { - return this[MAX_AGE] - } - - // resize the cache when the lengthCalculator changes. - set lengthCalculator (lC) { - if (typeof lC !== 'function') - lC = naiveLength - - if (lC !== this[LENGTH_CALCULATOR]) { - this[LENGTH_CALCULATOR] = lC - this[LENGTH] = 0 - this[LRU_LIST].forEach(hit => { - hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key) - this[LENGTH] += hit.length - }) - } - trim(this) - } - get lengthCalculator () { return this[LENGTH_CALCULATOR] } - - get length () { return this[LENGTH] } - get itemCount () { return this[LRU_LIST].length } - - rforEach (fn, thisp) { - thisp = thisp || this - for (let walker = this[LRU_LIST].tail; walker !== null;) { - const prev = walker.prev - forEachStep(this, fn, walker, thisp) - walker = prev - } - } - - forEach (fn, thisp) { - thisp = thisp || this - for (let walker = this[LRU_LIST].head; walker !== null;) { - const next = walker.next - forEachStep(this, fn, walker, thisp) - walker = next - } - } - - keys () { - return this[LRU_LIST].toArray().map(k => k.key) - } - - values () { - return this[LRU_LIST].toArray().map(k => k.value) - } - - reset () { - if (this[DISPOSE] && - this[LRU_LIST] && - this[LRU_LIST].length) { - this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value)) - } - - this[CACHE] = new Map() // hash of items by key - this[LRU_LIST] = new Yallist() // list of items in order of use recency - this[LENGTH] = 0 // length of items in the list - } - - dump () { - return this[LRU_LIST].map(hit => - isStale(this, hit) ? false : { - k: hit.key, - v: hit.value, - e: hit.now + (hit.maxAge || 0) - }).toArray().filter(h => h) - } - - dumpLru () { - return this[LRU_LIST] - } - - set (key, value, maxAge) { - maxAge = maxAge || this[MAX_AGE] - - if (maxAge && typeof maxAge !== 'number') - throw new TypeError('maxAge must be a number') - - const now = maxAge ? Date.now() : 0 - const len = this[LENGTH_CALCULATOR](value, key) - - if (this[CACHE].has(key)) { - if (len > this[MAX]) { - del(this, this[CACHE].get(key)) - return false - } - - const node = this[CACHE].get(key) - const item = node.value - - // dispose of the old one before overwriting - // split out into 2 ifs for better coverage tracking - if (this[DISPOSE]) { - if (!this[NO_DISPOSE_ON_SET]) - this[DISPOSE](key, item.value) - } - - item.now = now - item.maxAge = maxAge - item.value = value - this[LENGTH] += len - item.length - item.length = len - this.get(key) - trim(this) - return true - } - - const hit = new Entry(key, value, len, now, maxAge) - - // oversized objects fall out of cache automatically. - if (hit.length > this[MAX]) { - if (this[DISPOSE]) - this[DISPOSE](key, value) - - return false - } - - this[LENGTH] += hit.length - this[LRU_LIST].unshift(hit) - this[CACHE].set(key, this[LRU_LIST].head) - trim(this) - return true - } - - has (key) { - if (!this[CACHE].has(key)) return false - const hit = this[CACHE].get(key).value - return !isStale(this, hit) - } - - get (key) { - return get(this, key, true) - } - - peek (key) { - return get(this, key, false) - } - - pop () { - const node = this[LRU_LIST].tail - if (!node) - return null - - del(this, node) - return node.value - } - - del (key) { - del(this, this[CACHE].get(key)) - } - - load (arr) { - // reset the cache - this.reset() - - const now = Date.now() - // A previous serialized cache has the most recent items first - for (let l = arr.length - 1; l >= 0; l--) { - const hit = arr[l] - const expiresAt = hit.e || 0 - if (expiresAt === 0) - // the item was created without expiration in a non aged cache - this.set(hit.k, hit.v) - else { - const maxAge = expiresAt - now - // dont add already expired items - if (maxAge > 0) { - this.set(hit.k, hit.v, maxAge) - } - } - } - } - - prune () { - this[CACHE].forEach((value, key) => get(this, key, false)) - } -} - -const get = (self, key, doUse) => { - const node = self[CACHE].get(key) - if (node) { - const hit = node.value - if (isStale(self, hit)) { - del(self, node) - if (!self[ALLOW_STALE]) - return undefined - } else { - if (doUse) { - if (self[UPDATE_AGE_ON_GET]) - node.value.now = Date.now() - self[LRU_LIST].unshiftNode(node) - } - } - return hit.value - } -} - -const isStale = (self, hit) => { - if (!hit || (!hit.maxAge && !self[MAX_AGE])) - return false - - const diff = Date.now() - hit.now - return hit.maxAge ? diff > hit.maxAge - : self[MAX_AGE] && (diff > self[MAX_AGE]) -} - -const trim = self => { - if (self[LENGTH] > self[MAX]) { - for (let walker = self[LRU_LIST].tail; - self[LENGTH] > self[MAX] && walker !== null;) { - // We know that we're about to delete this one, and also - // what the next least recently used key will be, so just - // go ahead and set it now. - const prev = walker.prev - del(self, walker) - walker = prev - } - } -} - -const del = (self, node) => { - if (node) { - const hit = node.value - if (self[DISPOSE]) - self[DISPOSE](hit.key, hit.value) - - self[LENGTH] -= hit.length - self[CACHE].delete(hit.key) - self[LRU_LIST].removeNode(node) - } -} - -class Entry { - constructor (key, value, length, now, maxAge) { - this.key = key - this.value = value - this.length = length - this.now = now - this.maxAge = maxAge || 0 - } -} - -const forEachStep = (self, fn, node, thisp) => { - let hit = node.value - if (isStale(self, hit)) { - del(self, node) - if (!self[ALLOW_STALE]) - hit = undefined - } - if (hit) - fn.call(thisp, hit.value, hit.key, self) -} - -module.exports = LRUCache - - -/***/ }), - -/***/ 5327: -/***/ ((module) => { - -"use strict"; - -module.exports = function (Yallist) { - Yallist.prototype[Symbol.iterator] = function* () { - for (let walker = this.head; walker; walker = walker.next) { - yield walker.value - } - } -} - - -/***/ }), - -/***/ 220: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - -module.exports = Yallist - -Yallist.Node = Node -Yallist.create = Yallist - -function Yallist (list) { - var self = this - if (!(self instanceof Yallist)) { - self = new Yallist() - } - - self.tail = null - self.head = null - self.length = 0 - - if (list && typeof list.forEach === 'function') { - list.forEach(function (item) { - self.push(item) - }) - } else if (arguments.length > 0) { - for (var i = 0, l = arguments.length; i < l; i++) { - self.push(arguments[i]) - } - } - - return self -} - -Yallist.prototype.removeNode = function (node) { - if (node.list !== this) { - throw new Error('removing node which does not belong to this list') - } - - var next = node.next - var prev = node.prev - - if (next) { - next.prev = prev - } - - if (prev) { - prev.next = next - } - - if (node === this.head) { - this.head = next - } - if (node === this.tail) { - this.tail = prev - } - - node.list.length-- - node.next = null - node.prev = null - node.list = null - - return next -} - -Yallist.prototype.unshiftNode = function (node) { - if (node === this.head) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var head = this.head - node.list = this - node.next = head - if (head) { - head.prev = node - } - - this.head = node - if (!this.tail) { - this.tail = node - } - this.length++ -} - -Yallist.prototype.pushNode = function (node) { - if (node === this.tail) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var tail = this.tail - node.list = this - node.prev = tail - if (tail) { - tail.next = node - } - - this.tail = node - if (!this.head) { - this.head = node - } - this.length++ -} - -Yallist.prototype.push = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - push(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.unshift = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - unshift(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.pop = function () { - if (!this.tail) { - return undefined - } - - var res = this.tail.value - this.tail = this.tail.prev - if (this.tail) { - this.tail.next = null - } else { - this.head = null - } - this.length-- - return res -} - -Yallist.prototype.shift = function () { - if (!this.head) { - return undefined - } - - var res = this.head.value - this.head = this.head.next - if (this.head) { - this.head.prev = null - } else { - this.tail = null - } - this.length-- - return res -} - -Yallist.prototype.forEach = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.head, i = 0; walker !== null; i++) { - fn.call(thisp, walker.value, i, this) - walker = walker.next - } -} - -Yallist.prototype.forEachReverse = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.tail, i = this.length - 1; walker !== null; i--) { - fn.call(thisp, walker.value, i, this) - walker = walker.prev - } -} - -Yallist.prototype.get = function (n) { - for (var i = 0, walker = this.head; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.next - } - if (i === n && walker !== null) { - return walker.value - } -} - -Yallist.prototype.getReverse = function (n) { - for (var i = 0, walker = this.tail; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.prev - } - if (i === n && walker !== null) { - return walker.value - } -} - -Yallist.prototype.map = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.head; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.next - } - return res -} - -Yallist.prototype.mapReverse = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.tail; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.prev - } - return res -} - -Yallist.prototype.reduce = function (fn, initial) { - var acc - var walker = this.head - if (arguments.length > 1) { - acc = initial - } else if (this.head) { - walker = this.head.next - acc = this.head.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } - - for (var i = 0; walker !== null; i++) { - acc = fn(acc, walker.value, i) - walker = walker.next - } - - return acc -} - -Yallist.prototype.reduceReverse = function (fn, initial) { - var acc - var walker = this.tail - if (arguments.length > 1) { - acc = initial - } else if (this.tail) { - walker = this.tail.prev - acc = this.tail.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } - - for (var i = this.length - 1; walker !== null; i--) { - acc = fn(acc, walker.value, i) - walker = walker.prev - } - - return acc -} - -Yallist.prototype.toArray = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.head; walker !== null; i++) { - arr[i] = walker.value - walker = walker.next - } - return arr -} - -Yallist.prototype.toArrayReverse = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.tail; walker !== null; i++) { - arr[i] = walker.value - walker = walker.prev - } - return arr -} - -Yallist.prototype.slice = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = 0, walker = this.head; walker !== null && i < from; i++) { - walker = walker.next - } - for (; walker !== null && i < to; i++, walker = walker.next) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.sliceReverse = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) { - walker = walker.prev - } - for (; walker !== null && i > from; i--, walker = walker.prev) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.splice = function (start, deleteCount, ...nodes) { - if (start > this.length) { - start = this.length - 1 - } - if (start < 0) { - start = this.length + start; - } - - for (var i = 0, walker = this.head; walker !== null && i < start; i++) { - walker = walker.next - } - - var ret = [] - for (var i = 0; walker && i < deleteCount; i++) { - ret.push(walker.value) - walker = this.removeNode(walker) - } - if (walker === null) { - walker = this.tail - } - - if (walker !== this.head && walker !== this.tail) { - walker = walker.prev - } - - for (var i = 0; i < nodes.length; i++) { - walker = insert(this, walker, nodes[i]) - } - return ret; -} - -Yallist.prototype.reverse = function () { - var head = this.head - var tail = this.tail - for (var walker = head; walker !== null; walker = walker.prev) { - var p = walker.prev - walker.prev = walker.next - walker.next = p - } - this.head = tail - this.tail = head - return this -} - -function insert (self, node, value) { - var inserted = node === self.head ? - new Node(value, null, node, self) : - new Node(value, node, node.next, self) - - if (inserted.next === null) { - self.tail = inserted - } - if (inserted.prev === null) { - self.head = inserted - } - - self.length++ - - return inserted -} - -function push (self, item) { - self.tail = new Node(item, self.tail, null, self) - if (!self.head) { - self.head = self.tail - } - self.length++ -} - -function unshift (self, item) { - self.head = new Node(item, null, self.head, self) - if (!self.tail) { - self.tail = self.head - } - self.length++ -} - -function Node (value, prev, next, list) { - if (!(this instanceof Node)) { - return new Node(value, prev, next, list) - } - - this.list = list - this.value = value - - if (prev) { - prev.next = this - this.prev = prev - } else { - this.prev = null - } - - if (next) { - next.prev = this - this.next = next - } else { - this.next = null - } -} - -try { - // add if support for Symbol.iterator is present - __nccwpck_require__(5327)(Yallist) -} catch (er) {} - - /***/ }), /***/ 4294: From 6abfbb93f32e2b4a5e9493ed2beed6e762ac7e17 Mon Sep 17 00:00:00 2001 From: Tim Golen Date: Thu, 8 Apr 2021 11:08:13 -0600 Subject: [PATCH 182/380] Only have platform specific styles --- ios/Podfile.lock | 26 ++++++++------ ...{pickerPropTypes.js => PickerPropTypes.js} | 0 src/components/Picker/index.android.js | 35 ------------------- src/components/Picker/index.ios.js | 33 ----------------- src/components/Picker/index.js | 8 ++--- .../pickerDisabledStyles/index.android.js | 6 ++++ .../Picker/pickerDisabledStyles/index.ios.js | 6 ++++ .../Picker/pickerDisabledStyles/index.js | 6 ++++ 8 files changed, 37 insertions(+), 83 deletions(-) rename src/components/Picker/{pickerPropTypes.js => PickerPropTypes.js} (100%) delete mode 100644 src/components/Picker/index.android.js delete mode 100644 src/components/Picker/index.ios.js create mode 100644 src/components/Picker/pickerDisabledStyles/index.android.js create mode 100644 src/components/Picker/pickerDisabledStyles/index.ios.js create mode 100644 src/components/Picker/pickerDisabledStyles/index.js diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 352903821326..ca9ea57ff8aa 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -402,6 +402,8 @@ PODS: - React-Core - RNCAsyncStorage (1.12.1): - React-Core + - RNCClipboard (1.5.1): + - React-Core - RNCMaskedView (0.1.10): - React - RNCPicker (1.9.11): @@ -489,6 +491,7 @@ DEPENDENCIES: - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - rn-fetch-blob (from `../node_modules/rn-fetch-blob`) - "RNCAsyncStorage (from `../node_modules/@react-native-community/async-storage`)" + - "RNCClipboard (from `../node_modules/@react-native-community/clipboard`)" - "RNCMaskedView (from `../node_modules/@react-native-community/masked-view`)" - "RNCPicker (from `../node_modules/@react-native-picker/picker`)" - "RNFBAnalytics (from `../node_modules/@react-native-firebase/analytics`)" @@ -599,6 +602,8 @@ EXTERNAL SOURCES: :path: "../node_modules/rn-fetch-blob" RNCAsyncStorage: :path: "../node_modules/@react-native-community/async-storage" + RNCClipboard: + :path: "../node_modules/@react-native-community/clipboard" RNCMaskedView: :path: "../node_modules/@react-native-community/masked-view" RNCPicker: @@ -662,13 +667,13 @@ SPEC CHECKSUMS: React-jsiexecutor: b56c03e61c0dd5f5801255f2160a815f4a53d451 React-jsinspector: 8e68ffbfe23880d3ee9bafa8be2777f60b25cbe2 react-native-config: d8b45133fd13d4f23bd2064b72f6e2c08b2763ed - react-native-document-picker: b3e78a8f7fef98b5cb069f20fc35797d55e68e28 - react-native-image-picker: 32d1ad2c0024ca36161ae0d5c2117e2d6c441f11 - react-native-netinfo: 52cf0ee8342548a485e28f4b09e56b477567244d + react-native-document-picker: 0bba80cc56caab1f67dbaa81ff557e3a9b7f2b9f + react-native-image-picker: c6d75c4ab2cf46f9289f341242b219cb3c1180d3 + react-native-netinfo: 30fb89fa913c342be82a887b56e96be6d71201dd react-native-pdf: 4b5a9e4465a6a3b399e91dc4838eb44ddf716d1f - react-native-progress-bar-android: ce95a69f11ac580799021633071368d08aaf9ad8 - react-native-progress-view: 5816e8a6be812c2b122c6225a2a3db82d9008640 - react-native-safe-area-context: 01158a92c300895d79dee447e980672dc3fb85a6 + react-native-progress-bar-android: be43138ab7da30d51fc038bafa98e9ed594d0c40 + react-native-progress-view: 21b1e29e70c7559c16c9e0a04c4adc19fce6ede2 + react-native-safe-area-context: 79fea126c6830c85f65947c223a5e3058a666937 React-RCTActionSheet: 53ea72699698b0b47a6421cb1c8b4ab215a774aa React-RCTAnimation: 1befece0b5183c22ae01b966f5583f42e69a83c2 React-RCTBlob: 0b284339cbe4b15705a05e2313a51c6d8b51fa40 @@ -680,8 +685,9 @@ SPEC CHECKSUMS: React-RCTVibration: 8e9fb25724a0805107fc1acc9075e26f814df454 ReactCommon: 4167844018c9ed375cc01a843e9ee564399e53c3 rn-fetch-blob: f065bb7ab7fb48dd002629f8bdcb0336602d3cba - RNCAsyncStorage: cb9a623793918c6699586281f0b51cbc38f046f9 - RNCMaskedView: f5c7d14d6847b7b44853f7acb6284c1da30a3459 + RNCAsyncStorage: b03032fdbdb725bea0bd9e5ec5a7272865ae7398 + RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495 + RNCMaskedView: 5a8ec07677aa885546a0d98da336457e2bea557f RNCPicker: 6780c753e9e674065db90d9c965920516402579d RNFBAnalytics: 2dc4dd9e2445faffca041b10447a23a71dcdabf8 RNFBApp: 7eacc7da7ab19f96c05e434017d44a9f09410da8 @@ -690,10 +696,10 @@ SPEC CHECKSUMS: RNReanimated: e03f7425cb7a38dcf1b644d680d1bfc91c3337ad RNScreens: b6c9607e6fe47c1b6e2f1910d2acd46dd7ecea3a RNSVG: ce9d996113475209013317e48b05c21ee988d42e - urbanairship-react-native: dfb6dc22b2f41ccaadd636b73d51b448cd1b2bbc + urbanairship-react-native: afab7684561909be2a6a2a52baa3435776d050de Yoga: 7d13633d129fd179e01b8953d38d47be90db185a YogaKit: f782866e155069a2cca2517aafea43200b01fd5a PODFILE CHECKSUM: 41b806c7f131f87b716be1f1f9377532d6c9e43a -COCOAPODS: 1.10.0 +COCOAPODS: 1.8.4 diff --git a/src/components/Picker/pickerPropTypes.js b/src/components/Picker/PickerPropTypes.js similarity index 100% rename from src/components/Picker/pickerPropTypes.js rename to src/components/Picker/PickerPropTypes.js diff --git a/src/components/Picker/index.android.js b/src/components/Picker/index.android.js deleted file mode 100644 index 3fa3a775f35f..000000000000 --- a/src/components/Picker/index.android.js +++ /dev/null @@ -1,35 +0,0 @@ -import React from 'react'; -import RNPickerSelect from 'react-native-picker-select'; - -import * as pickerPropTypes from './pickerPropTypes'; -import styles from '../../styles/styles'; - -const Picker = ({ - onChange, - items, - useDisabledStyles, - placeholder, - value, - icon, -}) => ( - -); - -Picker.propTypes = pickerPropTypes.propTypes; -Picker.defaultProps = pickerPropTypes.defaultProps; -Picker.displayName = 'Picker'; - -export default Picker; diff --git a/src/components/Picker/index.ios.js b/src/components/Picker/index.ios.js deleted file mode 100644 index b014caf2db2a..000000000000 --- a/src/components/Picker/index.ios.js +++ /dev/null @@ -1,33 +0,0 @@ -import React from 'react'; -import RNPickerSelect from 'react-native-picker-select'; - -import styles from '../../styles/styles'; -import * as pickerPropTypes from './pickerPropTypes'; - -const Picker = ({ - onChange, - items, - useDisabledStyles, - placeholder, - value, - icon, -}) => ( - -); - -Picker.propTypes = pickerPropTypes.propTypes; -Picker.defaultProps = pickerPropTypes.defaultProps; -Picker.displayName = 'Picker'; - -export default Picker; diff --git a/src/components/Picker/index.js b/src/components/Picker/index.js index 28b7deaada3f..db62589fc29f 100644 --- a/src/components/Picker/index.js +++ b/src/components/Picker/index.js @@ -2,7 +2,8 @@ import React from 'react'; import RNPickerSelect from 'react-native-picker-select'; import styles from '../../styles/styles'; -import * as pickerPropTypes from './pickerPropTypes'; +import pickerDisabledStyles from './pickerDisabledStyles'; +import * as pickerPropTypes from './PickerPropTypes'; const Picker = ({ onChange, @@ -15,10 +16,7 @@ const Picker = ({ Date: Thu, 8 Apr 2021 11:22:19 -0600 Subject: [PATCH 183/380] Revert changes to lock file --- ios/Podfile.lock | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index ca9ea57ff8aa..352903821326 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -402,8 +402,6 @@ PODS: - React-Core - RNCAsyncStorage (1.12.1): - React-Core - - RNCClipboard (1.5.1): - - React-Core - RNCMaskedView (0.1.10): - React - RNCPicker (1.9.11): @@ -491,7 +489,6 @@ DEPENDENCIES: - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - rn-fetch-blob (from `../node_modules/rn-fetch-blob`) - "RNCAsyncStorage (from `../node_modules/@react-native-community/async-storage`)" - - "RNCClipboard (from `../node_modules/@react-native-community/clipboard`)" - "RNCMaskedView (from `../node_modules/@react-native-community/masked-view`)" - "RNCPicker (from `../node_modules/@react-native-picker/picker`)" - "RNFBAnalytics (from `../node_modules/@react-native-firebase/analytics`)" @@ -602,8 +599,6 @@ EXTERNAL SOURCES: :path: "../node_modules/rn-fetch-blob" RNCAsyncStorage: :path: "../node_modules/@react-native-community/async-storage" - RNCClipboard: - :path: "../node_modules/@react-native-community/clipboard" RNCMaskedView: :path: "../node_modules/@react-native-community/masked-view" RNCPicker: @@ -667,13 +662,13 @@ SPEC CHECKSUMS: React-jsiexecutor: b56c03e61c0dd5f5801255f2160a815f4a53d451 React-jsinspector: 8e68ffbfe23880d3ee9bafa8be2777f60b25cbe2 react-native-config: d8b45133fd13d4f23bd2064b72f6e2c08b2763ed - react-native-document-picker: 0bba80cc56caab1f67dbaa81ff557e3a9b7f2b9f - react-native-image-picker: c6d75c4ab2cf46f9289f341242b219cb3c1180d3 - react-native-netinfo: 30fb89fa913c342be82a887b56e96be6d71201dd + react-native-document-picker: b3e78a8f7fef98b5cb069f20fc35797d55e68e28 + react-native-image-picker: 32d1ad2c0024ca36161ae0d5c2117e2d6c441f11 + react-native-netinfo: 52cf0ee8342548a485e28f4b09e56b477567244d react-native-pdf: 4b5a9e4465a6a3b399e91dc4838eb44ddf716d1f - react-native-progress-bar-android: be43138ab7da30d51fc038bafa98e9ed594d0c40 - react-native-progress-view: 21b1e29e70c7559c16c9e0a04c4adc19fce6ede2 - react-native-safe-area-context: 79fea126c6830c85f65947c223a5e3058a666937 + react-native-progress-bar-android: ce95a69f11ac580799021633071368d08aaf9ad8 + react-native-progress-view: 5816e8a6be812c2b122c6225a2a3db82d9008640 + react-native-safe-area-context: 01158a92c300895d79dee447e980672dc3fb85a6 React-RCTActionSheet: 53ea72699698b0b47a6421cb1c8b4ab215a774aa React-RCTAnimation: 1befece0b5183c22ae01b966f5583f42e69a83c2 React-RCTBlob: 0b284339cbe4b15705a05e2313a51c6d8b51fa40 @@ -685,9 +680,8 @@ SPEC CHECKSUMS: React-RCTVibration: 8e9fb25724a0805107fc1acc9075e26f814df454 ReactCommon: 4167844018c9ed375cc01a843e9ee564399e53c3 rn-fetch-blob: f065bb7ab7fb48dd002629f8bdcb0336602d3cba - RNCAsyncStorage: b03032fdbdb725bea0bd9e5ec5a7272865ae7398 - RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495 - RNCMaskedView: 5a8ec07677aa885546a0d98da336457e2bea557f + RNCAsyncStorage: cb9a623793918c6699586281f0b51cbc38f046f9 + RNCMaskedView: f5c7d14d6847b7b44853f7acb6284c1da30a3459 RNCPicker: 6780c753e9e674065db90d9c965920516402579d RNFBAnalytics: 2dc4dd9e2445faffca041b10447a23a71dcdabf8 RNFBApp: 7eacc7da7ab19f96c05e434017d44a9f09410da8 @@ -696,10 +690,10 @@ SPEC CHECKSUMS: RNReanimated: e03f7425cb7a38dcf1b644d680d1bfc91c3337ad RNScreens: b6c9607e6fe47c1b6e2f1910d2acd46dd7ecea3a RNSVG: ce9d996113475209013317e48b05c21ee988d42e - urbanairship-react-native: afab7684561909be2a6a2a52baa3435776d050de + urbanairship-react-native: dfb6dc22b2f41ccaadd636b73d51b448cd1b2bbc Yoga: 7d13633d129fd179e01b8953d38d47be90db185a YogaKit: f782866e155069a2cca2517aafea43200b01fd5a PODFILE CHECKSUM: 41b806c7f131f87b716be1f1f9377532d6c9e43a -COCOAPODS: 1.8.4 +COCOAPODS: 1.10.0 From 6ab86256d493ec78b1bc59700e7973bfffa719b5 Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Thu, 8 Apr 2021 11:01:10 -0700 Subject: [PATCH 184/380] redirec to currentlyViewedReportID instead of home so that we display the view correctly after validating --- src/libs/actions/User.js | 10 ++++++++-- src/pages/SetPasswordPage.js | 2 +- src/pages/ValidateLoginPage.js | 3 ++- src/pages/routePropTypes.js | 10 ---------- 4 files changed, 11 insertions(+), 14 deletions(-) delete mode 100644 src/pages/routePropTypes.js diff --git a/src/libs/actions/User.js b/src/libs/actions/User.js index f94b079250dd..81e84b59357b 100644 --- a/src/libs/actions/User.js +++ b/src/libs/actions/User.js @@ -14,6 +14,12 @@ Onyx.connect({ callback: val => sessionAuthToken = val ? val.authToken : '', }); +let currentlyViewedReportID = ''; +Onyx.connect({ + key: ONYXKEYS.CURRENTLY_VIEWED_REPORTID, + callback: val => currentlyViewedReportID = val, +}); + /** * Changes a password for a given account * @@ -135,8 +141,8 @@ function setSecondaryLogin(login, password) { * @param {String} validateCode */ function validateLogin(accountID, validateCode) { - let isLoggedIn = sessionAuthToken; - const redirectRoute = isLoggedIn ? ROUTES.HOME : ROUTES.SIGNIN; + let isLoggedIn = !_.isEmpty(sessionAuthToken); + const redirectRoute = isLoggedIn ? ROUTES.getReportRoute(currentlyViewedReportID) : ROUTES.SIGNIN; Onyx.merge(ONYXKEYS.ACCOUNT, {error: '', loading: true}); API.ValidateEmail({ diff --git a/src/pages/SetPasswordPage.js b/src/pages/SetPasswordPage.js index d39d15d4def1..ea2fc9b42940 100644 --- a/src/pages/SetPasswordPage.js +++ b/src/pages/SetPasswordPage.js @@ -15,7 +15,7 @@ import {setPassword} from '../libs/actions/Session'; import ONYXKEYS from '../ONYXKEYS'; import variables from '../styles/variables'; import ButtonWithLoader from '../components/ButtonWithLoader'; -import routePropTypes from './routePropTypes'; +import routePropTypes from './validateLinkPropTypes'; const propTypes = { /* Onyx Props */ diff --git a/src/pages/ValidateLoginPage.js b/src/pages/ValidateLoginPage.js index 247433b7973a..1c67760d2366 100644 --- a/src/pages/ValidateLoginPage.js +++ b/src/pages/ValidateLoginPage.js @@ -1,7 +1,7 @@ import {Component} from 'react'; import PropTypes from 'prop-types'; import lodashGet from 'lodash/get'; -import routePropTypes from './routePropTypes'; +import routePropTypes from './validateLinkPropTypes'; import {validateLogin} from '../libs/actions/User'; const propTypes = { @@ -25,6 +25,7 @@ export default class ValidateLoginPage extends Component { } render() { + // Don't render anything here since we will redirect the user once we've attempted to validate their login return null; } } diff --git a/src/pages/routePropTypes.js b/src/pages/routePropTypes.js deleted file mode 100644 index 0350ce4499fe..000000000000 --- a/src/pages/routePropTypes.js +++ /dev/null @@ -1,10 +0,0 @@ -import PropTypes from 'prop-types'; - -export default PropTypes.shape({ - // The accountID and validateCode are passed via the URL - route: PropTypes.shape({ - // Each parameter passed via the URL - params: PropTypes.shape({ - }), - }), -}); From 19dbc719f63dd028a3aa1abf91fe763b06be1898 Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Thu, 8 Apr 2021 11:22:21 -0700 Subject: [PATCH 185/380] fix import --- src/pages/SetPasswordPage.js | 2 +- src/pages/ValidateLoginPage.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/SetPasswordPage.js b/src/pages/SetPasswordPage.js index ea2fc9b42940..a08c6362a4ed 100644 --- a/src/pages/SetPasswordPage.js +++ b/src/pages/SetPasswordPage.js @@ -15,7 +15,7 @@ import {setPassword} from '../libs/actions/Session'; import ONYXKEYS from '../ONYXKEYS'; import variables from '../styles/variables'; import ButtonWithLoader from '../components/ButtonWithLoader'; -import routePropTypes from './validateLinkPropTypes'; +import {routePropTypes} from './validateLinkPropTypes'; const propTypes = { /* Onyx Props */ diff --git a/src/pages/ValidateLoginPage.js b/src/pages/ValidateLoginPage.js index 1c67760d2366..0439683917f7 100644 --- a/src/pages/ValidateLoginPage.js +++ b/src/pages/ValidateLoginPage.js @@ -1,7 +1,7 @@ import {Component} from 'react'; import PropTypes from 'prop-types'; import lodashGet from 'lodash/get'; -import routePropTypes from './validateLinkPropTypes'; +import {routePropTypes} from './validateLinkPropTypes'; import {validateLogin} from '../libs/actions/User'; const propTypes = { From 476d5297017bfcfcdda04e2f53bbd3c1fa44fa4f Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Thu, 8 Apr 2021 11:34:44 -0700 Subject: [PATCH 186/380] update validationLinkPropTypes --- src/pages/SetPasswordPage.js | 4 ++-- src/pages/ValidateLoginPage.js | 4 ++-- src/pages/validateLinkPropTypes.js | 18 ++++++++++++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 src/pages/validateLinkPropTypes.js diff --git a/src/pages/SetPasswordPage.js b/src/pages/SetPasswordPage.js index a08c6362a4ed..2738dab3b2bc 100644 --- a/src/pages/SetPasswordPage.js +++ b/src/pages/SetPasswordPage.js @@ -9,13 +9,13 @@ import PropTypes from 'prop-types'; import {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; import lodashGet from 'lodash/get'; +import validateLinkPropTypes from './validateLinkPropTypes'; import styles from '../styles/styles'; import ExpensifyCashLogo from '../../assets/images/expensify-cash.svg'; import {setPassword} from '../libs/actions/Session'; import ONYXKEYS from '../ONYXKEYS'; import variables from '../styles/variables'; import ButtonWithLoader from '../components/ButtonWithLoader'; -import {routePropTypes} from './validateLinkPropTypes'; const propTypes = { /* Onyx Props */ @@ -39,7 +39,7 @@ const propTypes = { }), // The accountID and validateCode are passed via the URL - route: PropTypes.objectOf(routePropTypes), + route: PropTypes.objectOf(validateLinkPropTypes), }; const defaultProps = { diff --git a/src/pages/ValidateLoginPage.js b/src/pages/ValidateLoginPage.js index 0439683917f7..30c51fc34165 100644 --- a/src/pages/ValidateLoginPage.js +++ b/src/pages/ValidateLoginPage.js @@ -1,14 +1,14 @@ import {Component} from 'react'; import PropTypes from 'prop-types'; import lodashGet from 'lodash/get'; -import {routePropTypes} from './validateLinkPropTypes'; +import validateLinkPropTypes from './validateLinkPropTypes'; import {validateLogin} from '../libs/actions/User'; const propTypes = { /* Onyx Props */ // The accountID and validateCode are passed via the URL - route: PropTypes.objectOf(routePropTypes), + route: PropTypes.objectOf(validateLinkPropTypes), }; const defaultProps = { diff --git a/src/pages/validateLinkPropTypes.js b/src/pages/validateLinkPropTypes.js new file mode 100644 index 000000000000..399420f5e584 --- /dev/null +++ b/src/pages/validateLinkPropTypes.js @@ -0,0 +1,18 @@ +import PropTypes from 'prop-types'; + +export default PropTypes.shape({ + // The name of the route + name: PropTypes.string, + + // Unique key associated with the route + key: PropTypes.string, + + // Each parameter passed via the URL + params: PropTypes.shape({ + // AccountID associated with the validation link + accountID: PropTypes.string, + + // Validation code associated with the validation link + validateCode: PropTypes.string, + }), +}); From d68475e5cbeaa9d6308de37da2e244c84418291f Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Thu, 8 Apr 2021 15:02:47 -0700 Subject: [PATCH 187/380] don't try to log the user in after validating secondary login --- src/CONST.js | 1 + src/libs/actions/Session.js | 8 ++++---- src/libs/actions/User.js | 19 ++++++++++--------- src/pages/settings/PasswordPage.js | 5 ++++- src/pages/signin/LoginForm/LoginFormWide.js | 8 ++++++++ 5 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/CONST.js b/src/CONST.js index f7dcbaa26ff6..3fcf2a6590ca 100644 --- a/src/CONST.js +++ b/src/CONST.js @@ -77,6 +77,7 @@ const CONST = { TIMEZONE: 'timeZone', }, DEFAULT_TIME_ZONE: {automatic: true, selected: 'America/Los_Angeles'}, + DEFAULT_ACCOUNT_DATA: {error: '', success: '', loading: true}, PRONOUNS: { HE_HIM_HIS: 'He/him', SHE_HER_HERS: 'She/her', diff --git a/src/libs/actions/Session.js b/src/libs/actions/Session.js index 69c59222cd5e..268f8aa1b54d 100644 --- a/src/libs/actions/Session.js +++ b/src/libs/actions/Session.js @@ -7,6 +7,7 @@ import * as API from '../API'; import CONFIG from '../../CONFIG'; import PushNotification from '../Notification/PushNotification'; import Timing from './Timing'; +import CONST from '../../CONST'; let credentials = {}; Onyx.connect({ @@ -76,7 +77,7 @@ function signOut() { * @param {String} login */ function fetchAccountDetails(login) { - Onyx.merge(ONYXKEYS.ACCOUNT, {error: '', loading: true}); + Onyx.merge(ONYXKEYS.ACCOUNT, CONST.DEFAULT_ACCOUNT_DATA); API.GetAccountStatus({email: login}) .then((response) => { @@ -164,7 +165,7 @@ function createTemporaryLogin(authToken, email) { * @param {String} [twoFactorAuthCode] */ function signIn(password, twoFactorAuthCode) { - Onyx.merge(ONYXKEYS.ACCOUNT, {error: '', loading: true}); + Onyx.merge(ONYXKEYS.ACCOUNT, CONST.DEFAULT_ACCOUNT_DATA); API.Authenticate({ useExpensifyLogin: true, @@ -224,7 +225,7 @@ function restartSignin() { * @param {String} accountID */ function setPassword(password, validateCode, accountID) { - Onyx.merge(ONYXKEYS.ACCOUNT, {error: '', loading: true}); + Onyx.merge(ONYXKEYS.ACCOUNT, CONST.DEFAULT_ACCOUNT_DATA); API.SetPassword({ password, @@ -246,7 +247,6 @@ function setPassword(password, validateCode, accountID) { } export { - createTemporaryLogin, fetchAccountDetails, setPassword, signIn, diff --git a/src/libs/actions/User.js b/src/libs/actions/User.js index 81e84b59357b..7881a029c009 100644 --- a/src/libs/actions/User.js +++ b/src/libs/actions/User.js @@ -4,7 +4,7 @@ import Onyx from 'react-native-onyx'; import ONYXKEYS from '../../ONYXKEYS'; import * as API from '../API'; import CONST from '../../CONST'; -import {createTemporaryLogin} from './Session'; +import {setCurrentURL} from './App'; import Navigation from '../Navigation/Navigation'; import ROUTES from '../../ROUTES'; @@ -17,7 +17,7 @@ Onyx.connect({ let currentlyViewedReportID = ''; Onyx.connect({ key: ONYXKEYS.CURRENTLY_VIEWED_REPORTID, - callback: val => currentlyViewedReportID = val, + callback: val => currentlyViewedReportID = val || '', }); /** @@ -28,7 +28,7 @@ Onyx.connect({ * @returns {Promise} */ function changePassword(oldPassword, password) { - Onyx.merge(ONYXKEYS.ACCOUNT, {error: '', loading: true}); + Onyx.merge(ONYXKEYS.ACCOUNT, CONST.DEFAULT_ACCOUNT_DATA); return API.ChangePassword({oldPassword, password}) .then((response) => { @@ -108,7 +108,7 @@ function setExpensifyNewsStatus(subscribed) { * @returns {Promise} */ function setSecondaryLogin(login, password) { - Onyx.merge(ONYXKEYS.ACCOUNT, {error: '', loading: true}); + Onyx.merge(ONYXKEYS.ACCOUNT, CONST.DEFAULT_ACCOUNT_DATA); return API.User_SecondaryLogin_Send({ email: login, @@ -141,23 +141,23 @@ function setSecondaryLogin(login, password) { * @param {String} validateCode */ function validateLogin(accountID, validateCode) { - let isLoggedIn = !_.isEmpty(sessionAuthToken); + const isLoggedIn = !_.isEmpty(sessionAuthToken); const redirectRoute = isLoggedIn ? ROUTES.getReportRoute(currentlyViewedReportID) : ROUTES.SIGNIN; - Onyx.merge(ONYXKEYS.ACCOUNT, {error: '', loading: true}); + Onyx.merge(ONYXKEYS.ACCOUNT, CONST.DEFAULT_ACCOUNT_DATA); API.ValidateEmail({ accountID, validateCode, }).then((response) => { if (response.jsonCode === 200) { - const {authToken, email} = response; + const {email} = response; // If the user is unauthenticated, generate a login for them with the returned authtoken and sign then in if (isLoggedIn) { getUserDetails(); } else { - createTemporaryLogin(authToken, email); - isLoggedIn = authToken; + const success = lodashGet(response, 'message', `Your secondary login ${email} has been validated.`); + Onyx.merge(ONYXKEYS.ACCOUNT, {success}); } } else { const error = lodashGet(response, 'message', 'Unable to validate login.'); @@ -165,6 +165,7 @@ function validateLogin(accountID, validateCode) { } }).finally(() => { Onyx.merge(ONYXKEYS.ACCOUNT, {loading: false}); + setCurrentURL(redirectRoute); Navigation.navigate(redirectRoute); }); } diff --git a/src/pages/settings/PasswordPage.js b/src/pages/settings/PasswordPage.js index 45a5201e080c..871701e45d57 100644 --- a/src/pages/settings/PasswordPage.js +++ b/src/pages/settings/PasswordPage.js @@ -22,6 +22,9 @@ const propTypes = { // An error message to display to the user error: PropTypes.string, + // Success message to display when necessary + success: PropTypes.string, + // Whether or not a sign on form is loading (being submitted) loading: PropTypes.bool, }), @@ -45,7 +48,7 @@ class PasswordPage extends Component { } componentWillUnmount() { - Onyx.merge(ONYXKEYS.ACCOUNT, {error: ''}); + Onyx.merge(ONYXKEYS.ACCOUNT, {error: '', success: ''}); } handleChangePassword() { diff --git a/src/pages/signin/LoginForm/LoginFormWide.js b/src/pages/signin/LoginForm/LoginFormWide.js index 7eccb16bf25b..5ba923d44e9b 100644 --- a/src/pages/signin/LoginForm/LoginFormWide.js +++ b/src/pages/signin/LoginForm/LoginFormWide.js @@ -17,6 +17,9 @@ const propTypes = { // An error message to display to the user error: PropTypes.string, + // Success message to display when necessary + success: PropTypes.string, + // Whether or not a sign on form is loading (being submitted) loading: PropTypes.bool, }), @@ -92,6 +95,11 @@ class LoginFormWide extends React.Component { {this.props.account.error} )} + {!_.isEmpty(this.props.account.success) && ( + + {this.props.account.success} + + )} From f86a477e117f72e3e9d30986d197673d4c5c81f9 Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Thu, 8 Apr 2021 16:09:19 -0700 Subject: [PATCH 188/380] update timezone on login/page reload if user has it set to automatic --- src/libs/Navigation/AppNavigator/AuthScreens.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.js b/src/libs/Navigation/AppNavigator/AuthScreens.js index 3f4f2c5ee360..02dc3e396aac 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.js +++ b/src/libs/Navigation/AppNavigator/AuthScreens.js @@ -1,6 +1,9 @@ import React from 'react'; import PropTypes from 'prop-types'; import {withOnyx} from 'react-native-onyx'; +import _ from 'underscore'; +import lodashGet from 'lodash/get'; +import moment from 'moment'; import {getNavigationModalCardStyle} from '../../../styles/styles'; import withWindowDimensions, {windowDimensionsPropTypes} from '../../../components/withWindowDimensions'; import CONST from '../../../CONST'; @@ -26,6 +29,7 @@ import {setModalVisibility} from '../../actions/Modal'; import NameValuePair from '../../actions/NameValuePair'; import modalCardStyleInterpolator from './modalCardStyleInterpolator'; import createCustomModalStackNavigator from './createCustomModalStackNavigator'; +import personalDetailsPropType from '../../../pages/personalDetailsPropType'; // Main drawer navigator import MainDrawerNavigator from './MainDrawerNavigator'; @@ -56,11 +60,13 @@ const modalScreenListeners = { const propTypes = { network: PropTypes.shape({isOffline: PropTypes.bool}), + myPersonalDetails: PropTypes.objectOf(personalDetailsPropType), ...windowDimensionsPropTypes, }; const defaultProps = { network: {isOffline: true}, + myPersonalDetails: {}, }; class AuthScreens extends React.Component { @@ -101,6 +107,13 @@ class AuthScreens extends React.Component { User.getBetas(); }, 1000 * 60 * 30); + // Update the users timezone if they have it set to automatic + const timezone = lodashGet(this.props.myPersonalDetails, 'timezone', CONST.DEFAULT_TIME_ZONE); + if (_.isObject(timezone) && timezone.automatic) { + timezone.selected = moment.tz.guess(); + PersonalDetails.setPersonalDetails({timezone}); + } + Timing.end(CONST.TIMING.HOMEPAGE_INITIAL_RENDER); // Listen for the Command+K key being pressed so the focus can be given to the chat switcher @@ -210,5 +223,8 @@ export default compose( network: { key: ONYXKEYS.NETWORK, }, + myPersonalDetails: { + key: ONYXKEYS.MY_PERSONAL_DETAILS, + }, }), )(AuthScreens); From 29d650ba21bf9e02b6de5e590caa3e738605282a Mon Sep 17 00:00:00 2001 From: Joe Gambino Date: Thu, 8 Apr 2021 16:15:07 -0700 Subject: [PATCH 189/380] Show a user's display name for 'is typing' indicator remove trim --- src/libs/actions/PersonalDetails.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/libs/actions/PersonalDetails.js b/src/libs/actions/PersonalDetails.js index 7a677d5cf01d..604a116d567f 100644 --- a/src/libs/actions/PersonalDetails.js +++ b/src/libs/actions/PersonalDetails.js @@ -67,6 +67,10 @@ function getDisplayName(login, personalDetail) { return userLogin; } + if (userDetails.displayName) { + return userDetails.displayName; + } + const firstName = userDetails.firstName || ''; const lastName = userDetails.lastName || ''; @@ -86,6 +90,8 @@ function formatPersonalDetails(personalDetailsList) { const displayName = getDisplayName(login, personalDetailsResponse); const pronouns = lodashGet(personalDetailsResponse, 'pronouns', ''); const timezone = lodashGet(personalDetailsResponse, 'timeZone', CONST.DEFAULT_TIME_ZONE); + const firstName = lodashGet(personalDetailsResponse, 'firstName', ''); + const lastName = lodashGet(personalDetailsResponse, 'lastName', ''); return { ...finalObject, @@ -93,6 +99,8 @@ function formatPersonalDetails(personalDetailsList) { login, avatar, displayName, + firstName, + lastName, pronouns, timezone, }, From fe96c56b163018e8abd06b9adcf36fbff6e19cf9 Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Thu, 8 Apr 2021 16:42:33 -0700 Subject: [PATCH 190/380] update comment, remove unecessary setCurrentURL --- src/libs/actions/User.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/libs/actions/User.js b/src/libs/actions/User.js index 7881a029c009..154cc9725bfd 100644 --- a/src/libs/actions/User.js +++ b/src/libs/actions/User.js @@ -4,7 +4,6 @@ import Onyx from 'react-native-onyx'; import ONYXKEYS from '../../ONYXKEYS'; import * as API from '../API'; import CONST from '../../CONST'; -import {setCurrentURL} from './App'; import Navigation from '../Navigation/Navigation'; import ROUTES from '../../ROUTES'; @@ -152,10 +151,10 @@ function validateLogin(accountID, validateCode) { if (response.jsonCode === 200) { const {email} = response; - // If the user is unauthenticated, generate a login for them with the returned authtoken and sign then in if (isLoggedIn) { getUserDetails(); } else { + // Let the user know we've successfully validated their login const success = lodashGet(response, 'message', `Your secondary login ${email} has been validated.`); Onyx.merge(ONYXKEYS.ACCOUNT, {success}); } @@ -165,7 +164,6 @@ function validateLogin(accountID, validateCode) { } }).finally(() => { Onyx.merge(ONYXKEYS.ACCOUNT, {loading: false}); - setCurrentURL(redirectRoute); Navigation.navigate(redirectRoute); }); } From 2778ad1e13fe3d6600330d804f1b6bbfe2ba9dc8 Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Thu, 8 Apr 2021 19:13:45 -0700 Subject: [PATCH 191/380] add success message to narrow signin view remove @expensify.sms domain for ChangeExpensifyLoginLink --- apple-app-site-association | 3 ++- src/libs/Navigation/Navigation.js | 6 ++++++ src/pages/signin/ChangeExpensifyLoginLink.js | 4 +++- src/pages/signin/LoginForm/LoginFormNarrow.js | 8 ++++++++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/apple-app-site-association b/apple-app-site-association index 4e6aeb8f4a3a..0c14fa69c1e6 100644 --- a/apple-app-site-association +++ b/apple-app-site-association @@ -8,7 +8,8 @@ "/r/*", "/settings/*", "/setpassword/*", - "/details/*" + "/details/*", + "/v/*", ] } ] diff --git a/src/libs/Navigation/Navigation.js b/src/libs/Navigation/Navigation.js index fe3194f84689..88e9b4409b39 100644 --- a/src/libs/Navigation/Navigation.js +++ b/src/libs/Navigation/Navigation.js @@ -33,6 +33,12 @@ function goBack() { * @param {String} route */ function navigate(route = ROUTES.HOME) { + // If we're navigating to the signIn page, replace the existing route in the stack with the SignIn route. + if (route === ROUTES.SIGNIN) { + navigationRef.current.dispatch(StackActions.replace('SignIn')); + return; + } + if (route === ROUTES.HOME) { openDrawer(); return; diff --git a/src/pages/signin/ChangeExpensifyLoginLink.js b/src/pages/signin/ChangeExpensifyLoginLink.js index 901bb8d4906c..a973d81da0f5 100644 --- a/src/pages/signin/ChangeExpensifyLoginLink.js +++ b/src/pages/signin/ChangeExpensifyLoginLink.js @@ -2,6 +2,7 @@ import React from 'react'; import {Text, TouchableOpacity, View} from 'react-native'; import {withOnyx} from 'react-native-onyx'; import PropTypes from 'prop-types'; +import Str from 'expensify-common/lib/str'; import styles from '../../styles/styles'; import {restartSignin} from '../../libs/actions/Session'; import themeColors from '../../styles/themes/default'; @@ -24,7 +25,8 @@ const ChangeExpensifyLoginLink = ({credentials}) => ( > Not  - {credentials.login} + {Str.removeSMSDomain(credentials.login)} + ? diff --git a/src/pages/signin/LoginForm/LoginFormNarrow.js b/src/pages/signin/LoginForm/LoginFormNarrow.js index 61c3f8571f38..1d6e70883dae 100644 --- a/src/pages/signin/LoginForm/LoginFormNarrow.js +++ b/src/pages/signin/LoginForm/LoginFormNarrow.js @@ -21,6 +21,9 @@ const propTypes = { // An error message to display to the user error: PropTypes.string, + // Success message to display when necessary + success: PropTypes.string, + // Whether or not a sign on form is loading (being submitted) loading: PropTypes.bool, }), @@ -95,6 +98,11 @@ class LoginFormNarrow extends React.Component { {this.props.account.error} )} + {!_.isEmpty(this.props.account.success) && ( + + {this.props.account.success} + + )} Date: Fri, 9 Apr 2021 17:26:29 +0000 Subject: [PATCH 192/380] Update version to 1.0.18-0 --- android/app/build.gradle | 4 ++-- ios/ExpensifyCash/Info.plist | 4 ++-- ios/ExpensifyCashTests/Info.plist | 4 ++-- package-lock.json | 2 +- package.json | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index be6d160a236c..42db66df75b3 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -148,8 +148,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001001703 - versionName "1.0.17-3" + versionCode 1001001800 + versionName "1.0.18-0" } splits { abi { diff --git a/ios/ExpensifyCash/Info.plist b/ios/ExpensifyCash/Info.plist index b1d4b37527cb..6b11c7772ead 100644 --- a/ios/ExpensifyCash/Info.plist +++ b/ios/ExpensifyCash/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0.17 + 1.0.18 CFBundleSignature ???? CFBundleURLTypes @@ -30,7 +30,7 @@ CFBundleVersion - 1.0.17.3 + 1.0.18.0 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/ExpensifyCashTests/Info.plist b/ios/ExpensifyCashTests/Info.plist index 24c0e7b80e88..566d4f30ef5a 100644 --- a/ios/ExpensifyCashTests/Info.plist +++ b/ios/ExpensifyCashTests/Info.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 1.0.17 + 1.0.18 CFBundleSignature ???? CFBundleVersion - 1.0.17.3 + 1.0.18.0 diff --git a/package-lock.json b/package-lock.json index 6315f431cb45..9702f20d9c8e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.17-3", + "version": "1.0.18-0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 932fe0616d52..a92b63fd51b9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.17-3", + "version": "1.0.18-0", "author": "Expensify, Inc.", "homepage": "https://expensify.cash", "description": "Expensify.cash is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", From e752bc9ba4db52255fff65fdb6663a9dcf380a73 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Fri, 9 Apr 2021 11:42:31 -0600 Subject: [PATCH 193/380] Styles --- src/pages/home/report/ReportActionCompose.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index 6dc5493c3a03..41380d9293fb 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -9,7 +9,9 @@ import themeColors from '../../../styles/themes/default'; import TextInputFocusable from '../../../components/TextInputFocusable'; import ONYXKEYS from '../../../ONYXKEYS'; import Icon from '../../../components/Icon'; -import {Plus, Send, Emoji, Paperclip} from '../../../components/Icon/Expensicons'; +import { + Plus, Send, Emoji, Paperclip, +} from '../../../components/Icon/Expensicons'; import AttachmentPicker from '../../../components/AttachmentPicker'; import {addAction, saveReportComment, broadcastUserIsTyping} from '../../../libs/actions/Report'; import ReportTypingIndicator from './ReportTypingIndicator'; From cd3f6441b528d4ca9ecc2b3320efa0caf2f47a53 Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Fri, 9 Apr 2021 10:54:35 -0700 Subject: [PATCH 194/380] move auto-update timezone logic to personalDetails.js --- src/libs/Navigation/AppNavigator/AuthScreens.js | 16 ---------------- src/libs/actions/PersonalDetails.js | 6 ++++++ 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.js b/src/libs/Navigation/AppNavigator/AuthScreens.js index 02dc3e396aac..3f4f2c5ee360 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.js +++ b/src/libs/Navigation/AppNavigator/AuthScreens.js @@ -1,9 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; import {withOnyx} from 'react-native-onyx'; -import _ from 'underscore'; -import lodashGet from 'lodash/get'; -import moment from 'moment'; import {getNavigationModalCardStyle} from '../../../styles/styles'; import withWindowDimensions, {windowDimensionsPropTypes} from '../../../components/withWindowDimensions'; import CONST from '../../../CONST'; @@ -29,7 +26,6 @@ import {setModalVisibility} from '../../actions/Modal'; import NameValuePair from '../../actions/NameValuePair'; import modalCardStyleInterpolator from './modalCardStyleInterpolator'; import createCustomModalStackNavigator from './createCustomModalStackNavigator'; -import personalDetailsPropType from '../../../pages/personalDetailsPropType'; // Main drawer navigator import MainDrawerNavigator from './MainDrawerNavigator'; @@ -60,13 +56,11 @@ const modalScreenListeners = { const propTypes = { network: PropTypes.shape({isOffline: PropTypes.bool}), - myPersonalDetails: PropTypes.objectOf(personalDetailsPropType), ...windowDimensionsPropTypes, }; const defaultProps = { network: {isOffline: true}, - myPersonalDetails: {}, }; class AuthScreens extends React.Component { @@ -107,13 +101,6 @@ class AuthScreens extends React.Component { User.getBetas(); }, 1000 * 60 * 30); - // Update the users timezone if they have it set to automatic - const timezone = lodashGet(this.props.myPersonalDetails, 'timezone', CONST.DEFAULT_TIME_ZONE); - if (_.isObject(timezone) && timezone.automatic) { - timezone.selected = moment.tz.guess(); - PersonalDetails.setPersonalDetails({timezone}); - } - Timing.end(CONST.TIMING.HOMEPAGE_INITIAL_RENDER); // Listen for the Command+K key being pressed so the focus can be given to the chat switcher @@ -223,8 +210,5 @@ export default compose( network: { key: ONYXKEYS.NETWORK, }, - myPersonalDetails: { - key: ONYXKEYS.MY_PERSONAL_DETAILS, - }, }), )(AuthScreens); diff --git a/src/libs/actions/PersonalDetails.js b/src/libs/actions/PersonalDetails.js index 7a677d5cf01d..f92135f8dca7 100644 --- a/src/libs/actions/PersonalDetails.js +++ b/src/libs/actions/PersonalDetails.js @@ -3,6 +3,7 @@ import lodashGet from 'lodash/get'; import lodashMerge from 'lodash/merge'; import Onyx from 'react-native-onyx'; import Str from 'expensify-common/lib/str'; +import moment from 'moment'; import ONYXKEYS from '../../ONYXKEYS'; import md5 from '../md5'; import CONST from '../../CONST'; @@ -87,6 +88,11 @@ function formatPersonalDetails(personalDetailsList) { const pronouns = lodashGet(personalDetailsResponse, 'pronouns', ''); const timezone = lodashGet(personalDetailsResponse, 'timeZone', CONST.DEFAULT_TIME_ZONE); + // Update the users timezone if they have it set to automatic + if (login === currentUserEmail && _.isObject(timezone) && timezone.automatic) { + timezone.selected = moment.tz.guess(true); + } + return { ...finalObject, [login]: { From 5138c729a8d4f59a122fabe1cee04510caa2579b Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Fri, 9 Apr 2021 11:06:48 -0700 Subject: [PATCH 195/380] ensure we update timezone nvp in addition to onyx key --- src/libs/actions/PersonalDetails.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/libs/actions/PersonalDetails.js b/src/libs/actions/PersonalDetails.js index f92135f8dca7..d3bb21376682 100644 --- a/src/libs/actions/PersonalDetails.js +++ b/src/libs/actions/PersonalDetails.js @@ -88,9 +88,15 @@ function formatPersonalDetails(personalDetailsList) { const pronouns = lodashGet(personalDetailsResponse, 'pronouns', ''); const timezone = lodashGet(personalDetailsResponse, 'timeZone', CONST.DEFAULT_TIME_ZONE); - // Update the users timezone if they have it set to automatic + // Update the users timezone when necessary if they have it set to automatic if (login === currentUserEmail && _.isObject(timezone) && timezone.automatic) { - timezone.selected = moment.tz.guess(true); + const currentTimezone = moment.tz.guess(true); + + // We've obtained a different timezone, so update the requisite NVP + if (timezone.selected !== currentTimezone) { + timezone.selected = currentTimezone; + NameValuePair.set(CONST.NVP.TIMEZONE, timezone); + } } return { From 4a9a842121acac1ece505028d76c8bb312e15e3f Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Fri, 9 Apr 2021 12:43:43 -0600 Subject: [PATCH 196/380] Make a native version of the emoji picker without a search bar --- .../index.js} | 12 +- .../report/EmojiPickerMenu/index.native.js | 119 ++++++++++++++++++ 2 files changed, 125 insertions(+), 6 deletions(-) rename src/pages/home/report/{EmojiPickerMenu.js => EmojiPickerMenu/index.js} (93%) create mode 100644 src/pages/home/report/EmojiPickerMenu/index.native.js diff --git a/src/pages/home/report/EmojiPickerMenu.js b/src/pages/home/report/EmojiPickerMenu/index.js similarity index 93% rename from src/pages/home/report/EmojiPickerMenu.js rename to src/pages/home/report/EmojiPickerMenu/index.js index 2e99d4104fb8..6e2e5a058d1a 100644 --- a/src/pages/home/report/EmojiPickerMenu.js +++ b/src/pages/home/report/EmojiPickerMenu/index.js @@ -2,12 +2,12 @@ import React, {Component} from 'react'; import {View, FlatList, Text} from 'react-native'; import PropTypes from 'prop-types'; import _ from 'underscore'; -import CONST from '../../../CONST'; -import styles from '../../../styles/styles'; -import themeColors from '../../../styles/themes/default'; -import emojis from '../../../../assets/emojis'; -import EmojiPickerMenuItem from './EmojiPickerMenuItem'; -import TextInputFocusable from '../../../components/TextInputFocusable'; +import CONST from '../../../../CONST'; +import styles from '../../../../styles/styles'; +import themeColors from '../../../../styles/themes/default'; +import emojis from '../../../../../assets/emojis'; +import EmojiPickerMenuItem from '../EmojiPickerMenuItem'; +import TextInputFocusable from '../../../../components/TextInputFocusable'; const propTypes = { // Function to add the selected emoji to the main compose text input diff --git a/src/pages/home/report/EmojiPickerMenu/index.native.js b/src/pages/home/report/EmojiPickerMenu/index.native.js new file mode 100644 index 000000000000..9cec2fb4c5bd --- /dev/null +++ b/src/pages/home/report/EmojiPickerMenu/index.native.js @@ -0,0 +1,119 @@ +import React, {Component} from 'react'; +import {View, FlatList, Text} from 'react-native'; +import PropTypes from 'prop-types'; +import _ from 'underscore'; +import CONST from '../../../../CONST'; +import styles from '../../../../styles/styles'; +import emojis from '../../../../../assets/emojis'; +import EmojiPickerMenuItem from '../EmojiPickerMenuItem'; + +const propTypes = { + // Function to add the selected emoji to the main compose text input + onEmojiSelected: PropTypes.func.isRequired, +}; + +class EmojiPickerMenu extends Component { + constructor(props) { + super(props); + + // Ref for the emoji search input + this.searchInput = undefined; + + // This is the number of columns in each row of the picker. + // Because of how flatList implements these rows, each row is an index rather than each element + // For this reason to make headers work, we need to have the header be the only rendered element in its row + // If this number is changed, emojis.js will need to be updated to have the proper number of spacer elements + // around each header. + this.numColumns = 8; + + // This is the indices of each category of emojis + // The positions are static, and are calculated as index/numColumns (8 in our case) + // This is because each row of 8 emojis counts as one index + // If this emojis are ever added to emojis.js this will need to be updated or things will break + this.unfilteredHeaderIndices = [0, 34, 60, 88, 99, 121, 148]; + + this.filterEmojis = _.debounce(this.filterEmojis.bind(this), 300, false); + this.renderItem = this.renderItem.bind(this); + + this.state = { + filteredEmojis: emojis, + headerIndices: this.unfilteredHeaderIndices, + }; + } + + /** + * Filter the entire list of emojis to only emojis that have the search term in their keywords + * + * @param {String} searchTerm + */ + filterEmojis(searchTerm) { + const normalizedSearchTerm = searchTerm.toLowerCase(); + if (normalizedSearchTerm === '') { + // There are no headers when searching, so we need to re-make them sticky when there is no search term + this.setState({filteredEmojis: emojis, headerIndices: this.unfilteredHeaderIndices}); + return; + } + const newFilteredEmojiList = []; + _.each(emojis, (emoji) => { + if (emoji.header || emoji.code === CONST.EMOJI_SPACER) { + return; + } + + if (_.find(emoji.keywords, keyword => keyword.includes(normalizedSearchTerm))) { + newFilteredEmojiList.push(emoji); + } + }); + + // Remove sticky header indices. There are no headers while searching and we don't want to make emojis sticky + this.setState({filteredEmojis: newFilteredEmojiList, headerIndices: []}); + } + + /** + * Given an emoji item object, render a component based on its type. + * Items with the code "SPACER" return nothing and are used to fill rows up to 8 + * so that the sticky headers function properly + * + * @param {Object} item + * @returns {*} + */ + renderItem({item}) { + if (item.code === CONST.EMOJI_SPACER) { + return null; + } + + if (item.header) { + return ( + + {item.code} + + ); + } + + return ( + + ); + } + + render() { + return ( + + (`emoji_picker_${item.code}`)} + numColumns={this.numColumns} + style={styles.emojiPickerList} + extraData={this.state.filteredEmojis} + stickyHeaderIndices={this.state.headerIndices} + /> + + ); + } +} + +EmojiPickerMenu.propTypes = propTypes; + +export default EmojiPickerMenu; From a4107f1b540e36ab28b954d0458af8d3f480259c Mon Sep 17 00:00:00 2001 From: Rory Abraham Date: Fri, 9 Apr 2021 12:49:56 -0700 Subject: [PATCH 197/380] Get rid of hasEllipsis library --- src/components/DisplayNames/DisplayNamesPropTypes.js | 3 +++ src/components/DisplayNames/index.js | 6 ++++-- src/libs/hasContentWiderThanScrollWidth.js | 11 ----------- 3 files changed, 7 insertions(+), 13 deletions(-) delete mode 100644 src/libs/hasContentWiderThanScrollWidth.js diff --git a/src/components/DisplayNames/DisplayNamesPropTypes.js b/src/components/DisplayNames/DisplayNamesPropTypes.js index 9be34fbd0f9f..4f1ef3b21119 100644 --- a/src/components/DisplayNames/DisplayNamesPropTypes.js +++ b/src/components/DisplayNames/DisplayNamesPropTypes.js @@ -6,7 +6,10 @@ const propTypes = { // Array of objects that map display names to their corresponding tooltip displayNamesToTooltips: PropTypes.arrayOf(PropTypes.shape({ + // The name to display in bold displayName: PropTypes.string, + + // The tooltip to show when the associated name is hovered tooltip: PropTypes.string, })), diff --git a/src/components/DisplayNames/index.js b/src/components/DisplayNames/index.js index 28e0c305ead9..bb44c0b8a09b 100644 --- a/src/components/DisplayNames/index.js +++ b/src/components/DisplayNames/index.js @@ -4,7 +4,6 @@ import {Text, View} from 'react-native'; import {propTypes, defaultProps} from './DisplayNamesPropTypes'; import styles from '../../styles/styles'; import Tooltip from '../Tooltip'; -import hasContentWiderThanScrollWidth from '../../libs/hasContentWiderThanScrollWidth'; class DisplayNames extends PureComponent { constructor(props) { @@ -20,7 +19,10 @@ class DisplayNames extends PureComponent { componentDidMount() { this.setState({ - isEllipsisActive: this.containerRef && hasContentWiderThanScrollWidth(this.containerRef), + isEllipsisActive: this.containerRef + && this.containerRef.offsetWidth + && this.containerRef.scrollWidth + && this.containerRef.offsetWidth < this.containerRef.scrollWidth, }); } diff --git a/src/libs/hasContentWiderThanScrollWidth.js b/src/libs/hasContentWiderThanScrollWidth.js deleted file mode 100644 index 81df3455937c..000000000000 --- a/src/libs/hasContentWiderThanScrollWidth.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Does an element have content wider than it's scroll width? - * - * @param {HTMLElement} el Element to check - * @returns {Boolean} - */ -function hasContentWiderThanScrollWidth(el) { - return el.offsetWidth && el.scrollWidth && el.offsetWidth < el.scrollWidth; -} - -export default hasContentWiderThanScrollWidth; From 23aca9c23378627a57ef533c1cf34ba0fc080764 Mon Sep 17 00:00:00 2001 From: Rory Abraham Date: Fri, 9 Apr 2021 12:52:21 -0700 Subject: [PATCH 198/380] Rename displayNamesToTooltips prop --- src/components/DisplayNames/DisplayNamesPropTypes.js | 2 +- src/pages/home/HeaderView.js | 4 ++-- src/pages/home/sidebar/OptionRow.js | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/DisplayNames/DisplayNamesPropTypes.js b/src/components/DisplayNames/DisplayNamesPropTypes.js index 4f1ef3b21119..5a94673a9bfa 100644 --- a/src/components/DisplayNames/DisplayNamesPropTypes.js +++ b/src/components/DisplayNames/DisplayNamesPropTypes.js @@ -5,7 +5,7 @@ const propTypes = { fullTitle: PropTypes.string, // Array of objects that map display names to their corresponding tooltip - displayNamesToTooltips: PropTypes.arrayOf(PropTypes.shape({ + displayNamesWithTooltips: PropTypes.arrayOf(PropTypes.shape({ // The name to display in bold displayName: PropTypes.string, diff --git a/src/pages/home/HeaderView.js b/src/pages/home/HeaderView.js index 6de0ec80d7bc..d94eab3d18b6 100644 --- a/src/pages/home/HeaderView.js +++ b/src/pages/home/HeaderView.js @@ -54,7 +54,7 @@ const defaultProps = { const HeaderView = (props) => { const participants = lodashGet(props.report, 'participants', []); - const displayNamesToTooltips = _.map( + const displayNamesWithTooltips = _.map( getPersonalDetailsForLogins(participants, props.personalDetails), ({displayName, login}) => ({displayName, tooltip: login}), ); @@ -94,7 +94,7 @@ const HeaderView = (props) => { ({displayName, tooltip: login}), ); @@ -159,7 +159,7 @@ const OptionRow = ({ Date: Fri, 9 Apr 2021 12:58:51 -0700 Subject: [PATCH 199/380] Rename propTypes file to camelCase --- .../{DisplayNamesPropTypes.js => displayNamesPropTypes.js} | 0 src/components/DisplayNames/index.js | 2 +- src/components/DisplayNames/index.native.js | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename src/components/DisplayNames/{DisplayNamesPropTypes.js => displayNamesPropTypes.js} (100%) diff --git a/src/components/DisplayNames/DisplayNamesPropTypes.js b/src/components/DisplayNames/displayNamesPropTypes.js similarity index 100% rename from src/components/DisplayNames/DisplayNamesPropTypes.js rename to src/components/DisplayNames/displayNamesPropTypes.js diff --git a/src/components/DisplayNames/index.js b/src/components/DisplayNames/index.js index bb44c0b8a09b..72f89e6f1e22 100644 --- a/src/components/DisplayNames/index.js +++ b/src/components/DisplayNames/index.js @@ -1,7 +1,7 @@ import _ from 'underscore'; import React, {Fragment, PureComponent} from 'react'; import {Text, View} from 'react-native'; -import {propTypes, defaultProps} from './DisplayNamesPropTypes'; +import {propTypes, defaultProps} from './displayNamesPropTypes'; import styles from '../../styles/styles'; import Tooltip from '../Tooltip'; diff --git a/src/components/DisplayNames/index.native.js b/src/components/DisplayNames/index.native.js index 81c0f9dfc50b..8a882f8eb576 100644 --- a/src/components/DisplayNames/index.native.js +++ b/src/components/DisplayNames/index.native.js @@ -1,6 +1,6 @@ import React from 'react'; import {Text} from 'react-native'; -import {propTypes, defaultProps} from './DisplayNamesPropTypes'; +import {propTypes, defaultProps} from './displayNamesPropTypes'; // As we don't have to show tooltips of the Native platform so we simply render the full display names list. const DisplayNames = ({ From a9bd2426f465555035d197b4b80d6404b8293c6a Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Fri, 9 Apr 2021 13:22:11 -0700 Subject: [PATCH 200/380] update comments, use const where applicable, and put export at EOF --- src/Expensify.js | 3 ++- src/libs/Navigation/Navigation.js | 3 ++- src/pages/ValidateLoginPage.js | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Expensify.js b/src/Expensify.js index 0e4fb91fbee2..1c2ea12deb7c 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -6,6 +6,7 @@ import Onyx, {withOnyx} from 'react-native-onyx'; import listenToStorageEvents from './libs/listenToStorageEvents'; import * as ActiveClientManager from './libs/ActiveClientManager'; import ONYXKEYS from './ONYXKEYS'; +import CONST from './CONST'; import NavigationRoot from './libs/Navigation/NavigationRoot'; import Log from './libs/Log'; import migrateOnyx from './libs/migrateOnyx'; @@ -21,7 +22,7 @@ Onyx.init({ // Clear any loading and error messages so they do not appear on app startup [ONYXKEYS.SESSION]: {loading: false}, - [ONYXKEYS.ACCOUNT]: {loading: false, error: ''}, + [ONYXKEYS.ACCOUNT]: CONST.DEFAULT_ACCOUNT_DATA, [ONYXKEYS.NETWORK]: {isOffline: false}, [ONYXKEYS.IOU]: {loading: false}, }, diff --git a/src/libs/Navigation/Navigation.js b/src/libs/Navigation/Navigation.js index 88e9b4409b39..808d8d87bdb7 100644 --- a/src/libs/Navigation/Navigation.js +++ b/src/libs/Navigation/Navigation.js @@ -33,7 +33,8 @@ function goBack() { * @param {String} route */ function navigate(route = ROUTES.HOME) { - // If we're navigating to the signIn page, replace the existing route in the stack with the SignIn route. + // If we're navigating to the signIn page, replace the existing route in the stack with the SignIn route so that we + // don't mistakenly route back to any older routes after the user signs in if (route === ROUTES.SIGNIN) { navigationRef.current.dispatch(StackActions.replace('SignIn')); return; diff --git a/src/pages/ValidateLoginPage.js b/src/pages/ValidateLoginPage.js index 30c51fc34165..aafc3b2338bc 100644 --- a/src/pages/ValidateLoginPage.js +++ b/src/pages/ValidateLoginPage.js @@ -16,8 +16,7 @@ const defaultProps = { params: {}, }, }; - -export default class ValidateLoginPage extends Component { +class ValidateLoginPage extends Component { componentDidMount() { const accountID = lodashGet(this.props.route.params, 'accountID', ''); const validateCode = lodashGet(this.props.route.params, 'validateCode', ''); @@ -32,3 +31,4 @@ export default class ValidateLoginPage extends Component { ValidateLoginPage.propTypes = propTypes; ValidateLoginPage.defaultProps = defaultProps; +export default ValidateLoginPage; From c1f3cec3b86c69819b4de4f22f652bdc27a37459 Mon Sep 17 00:00:00 2001 From: Joe Gambino Date: Fri, 9 Apr 2021 13:55:38 -0700 Subject: [PATCH 201/380] prioritize full name first --- src/libs/actions/PersonalDetails.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/libs/actions/PersonalDetails.js b/src/libs/actions/PersonalDetails.js index 604a116d567f..d25bb757bd04 100644 --- a/src/libs/actions/PersonalDetails.js +++ b/src/libs/actions/PersonalDetails.js @@ -67,14 +67,14 @@ function getDisplayName(login, personalDetail) { return userLogin; } - if (userDetails.displayName) { - return userDetails.displayName; - } - const firstName = userDetails.firstName || ''; const lastName = userDetails.lastName || ''; + const fullName = (`${firstName} ${lastName}`).trim(); + if (fullName) { + return fullName; + } - return (`${firstName} ${lastName}`).trim() || userLogin; + return userDetails.displayName || userLogin; } /** From d8f406a6417108e4b3d6586febeb4bd09992855f Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Fri, 9 Apr 2021 15:46:04 -0700 Subject: [PATCH 202/380] update default account data const to not inlcude loading --- src/CONST.js | 2 +- src/Expensify.js | 2 +- src/libs/actions/Session.js | 6 +++--- src/libs/actions/User.js | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/CONST.js b/src/CONST.js index 3fcf2a6590ca..69d6ca14446b 100644 --- a/src/CONST.js +++ b/src/CONST.js @@ -77,7 +77,7 @@ const CONST = { TIMEZONE: 'timeZone', }, DEFAULT_TIME_ZONE: {automatic: true, selected: 'America/Los_Angeles'}, - DEFAULT_ACCOUNT_DATA: {error: '', success: '', loading: true}, + DEFAULT_ACCOUNT_DATA: {error: '', success: ''}, PRONOUNS: { HE_HIM_HIS: 'He/him', SHE_HER_HERS: 'She/her', diff --git a/src/Expensify.js b/src/Expensify.js index 1c2ea12deb7c..c3eb3369cb26 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -22,7 +22,7 @@ Onyx.init({ // Clear any loading and error messages so they do not appear on app startup [ONYXKEYS.SESSION]: {loading: false}, - [ONYXKEYS.ACCOUNT]: CONST.DEFAULT_ACCOUNT_DATA, + [ONYXKEYS.ACCOUNT]: {...CONST.DEFAULT_ACCOUNT_DATA, ...{loading: false}}, [ONYXKEYS.NETWORK]: {isOffline: false}, [ONYXKEYS.IOU]: {loading: false}, }, diff --git a/src/libs/actions/Session.js b/src/libs/actions/Session.js index 268f8aa1b54d..22c885ff0e01 100644 --- a/src/libs/actions/Session.js +++ b/src/libs/actions/Session.js @@ -77,7 +77,7 @@ function signOut() { * @param {String} login */ function fetchAccountDetails(login) { - Onyx.merge(ONYXKEYS.ACCOUNT, CONST.DEFAULT_ACCOUNT_DATA); + Onyx.merge(ONYXKEYS.ACCOUNT, {...CONST.DEFAULT_ACCOUNT_DATA, ...{loading: true}}); API.GetAccountStatus({email: login}) .then((response) => { @@ -165,7 +165,7 @@ function createTemporaryLogin(authToken, email) { * @param {String} [twoFactorAuthCode] */ function signIn(password, twoFactorAuthCode) { - Onyx.merge(ONYXKEYS.ACCOUNT, CONST.DEFAULT_ACCOUNT_DATA); + Onyx.merge(ONYXKEYS.ACCOUNT, {...CONST.DEFAULT_ACCOUNT_DATA, ...{loading: true}}); API.Authenticate({ useExpensifyLogin: true, @@ -225,7 +225,7 @@ function restartSignin() { * @param {String} accountID */ function setPassword(password, validateCode, accountID) { - Onyx.merge(ONYXKEYS.ACCOUNT, CONST.DEFAULT_ACCOUNT_DATA); + Onyx.merge(ONYXKEYS.ACCOUNT, {...CONST.DEFAULT_ACCOUNT_DATA, ...{loading: true}}); API.SetPassword({ password, diff --git a/src/libs/actions/User.js b/src/libs/actions/User.js index 154cc9725bfd..99a582f096f8 100644 --- a/src/libs/actions/User.js +++ b/src/libs/actions/User.js @@ -27,7 +27,7 @@ Onyx.connect({ * @returns {Promise} */ function changePassword(oldPassword, password) { - Onyx.merge(ONYXKEYS.ACCOUNT, CONST.DEFAULT_ACCOUNT_DATA); + Onyx.merge(ONYXKEYS.ACCOUNT, {...CONST.DEFAULT_ACCOUNT_DATA, ...{loading: true}}); return API.ChangePassword({oldPassword, password}) .then((response) => { @@ -107,7 +107,7 @@ function setExpensifyNewsStatus(subscribed) { * @returns {Promise} */ function setSecondaryLogin(login, password) { - Onyx.merge(ONYXKEYS.ACCOUNT, CONST.DEFAULT_ACCOUNT_DATA); + Onyx.merge(ONYXKEYS.ACCOUNT, {...CONST.DEFAULT_ACCOUNT_DATA, ...{loading: true}}); return API.User_SecondaryLogin_Send({ email: login, @@ -142,7 +142,7 @@ function setSecondaryLogin(login, password) { function validateLogin(accountID, validateCode) { const isLoggedIn = !_.isEmpty(sessionAuthToken); const redirectRoute = isLoggedIn ? ROUTES.getReportRoute(currentlyViewedReportID) : ROUTES.SIGNIN; - Onyx.merge(ONYXKEYS.ACCOUNT, CONST.DEFAULT_ACCOUNT_DATA); + Onyx.merge(ONYXKEYS.ACCOUNT, {...CONST.DEFAULT_ACCOUNT_DATA, ...{loading: true}}); API.ValidateEmail({ accountID, From a019e1eb190ebfcc3d98e58747cdb404fa869430 Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Fri, 9 Apr 2021 16:07:16 -0700 Subject: [PATCH 203/380] set timezone inside callback --- .../Navigation/AppNavigator/AuthScreens.js | 20 ++++++++++++++++++- src/libs/actions/PersonalDetails.js | 12 ----------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.js b/src/libs/Navigation/AppNavigator/AuthScreens.js index 3f4f2c5ee360..76b55fb3c5a8 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.js +++ b/src/libs/Navigation/AppNavigator/AuthScreens.js @@ -1,6 +1,9 @@ import React from 'react'; import PropTypes from 'prop-types'; -import {withOnyx} from 'react-native-onyx'; +import Onyx, {withOnyx} from 'react-native-onyx'; +import moment from 'moment'; +import _ from 'underscore'; +import lodashGet from 'lodash/get'; import {getNavigationModalCardStyle} from '../../../styles/styles'; import withWindowDimensions, {windowDimensionsPropTypes} from '../../../components/withWindowDimensions'; import CONST from '../../../CONST'; @@ -41,6 +44,21 @@ import { SettingsModalStackNavigator, } from './ModalStackNavigators'; +Onyx.connect({ + key: ONYXKEYS.MY_PERSONAL_DETAILS, + callback: (val) => { + const timezone = lodashGet(val, 'timezone', {}); + const currentTimezone = moment.tz.guess(true); + + // If the current timezone is different than the user's timezone, and their timezone is set to automatic + // then update their timezone. + if (_.isObject(timezone) && timezone.automatic && timezone.selected !== currentTimezone) { + timezone.selected = moment.tz.guess(true); + PersonalDetails.setPersonalDetails({timezone}); + } + }, +}); + const RootStack = createCustomModalStackNavigator(); // When modal screen gets focused, update modal visibility in Onyx diff --git a/src/libs/actions/PersonalDetails.js b/src/libs/actions/PersonalDetails.js index d3bb21376682..7a677d5cf01d 100644 --- a/src/libs/actions/PersonalDetails.js +++ b/src/libs/actions/PersonalDetails.js @@ -3,7 +3,6 @@ import lodashGet from 'lodash/get'; import lodashMerge from 'lodash/merge'; import Onyx from 'react-native-onyx'; import Str from 'expensify-common/lib/str'; -import moment from 'moment'; import ONYXKEYS from '../../ONYXKEYS'; import md5 from '../md5'; import CONST from '../../CONST'; @@ -88,17 +87,6 @@ function formatPersonalDetails(personalDetailsList) { const pronouns = lodashGet(personalDetailsResponse, 'pronouns', ''); const timezone = lodashGet(personalDetailsResponse, 'timeZone', CONST.DEFAULT_TIME_ZONE); - // Update the users timezone when necessary if they have it set to automatic - if (login === currentUserEmail && _.isObject(timezone) && timezone.automatic) { - const currentTimezone = moment.tz.guess(true); - - // We've obtained a different timezone, so update the requisite NVP - if (timezone.selected !== currentTimezone) { - timezone.selected = currentTimezone; - NameValuePair.set(CONST.NVP.TIMEZONE, timezone); - } - } - return { ...finalObject, [login]: { From cb7404948007b703d8ec9eacc7cd22c300924e9b Mon Sep 17 00:00:00 2001 From: runner Date: Fri, 9 Apr 2021 23:50:48 +0000 Subject: [PATCH 204/380] Update version to 1.0.18-1 --- android/app/build.gradle | 4 ++-- ios/ExpensifyCash/Info.plist | 2 +- ios/ExpensifyCashTests/Info.plist | 2 +- package-lock.json | 2 +- package.json | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 42db66df75b3..62774e3bc326 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -148,8 +148,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001001800 - versionName "1.0.18-0" + versionCode 1001001801 + versionName "1.0.18-1" } splits { abi { diff --git a/ios/ExpensifyCash/Info.plist b/ios/ExpensifyCash/Info.plist index 6b11c7772ead..0dc9da792f8b 100644 --- a/ios/ExpensifyCash/Info.plist +++ b/ios/ExpensifyCash/Info.plist @@ -30,7 +30,7 @@ CFBundleVersion - 1.0.18.0 + 1.0.18.1 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/ExpensifyCashTests/Info.plist b/ios/ExpensifyCashTests/Info.plist index 566d4f30ef5a..36b7a15dc7a5 100644 --- a/ios/ExpensifyCashTests/Info.plist +++ b/ios/ExpensifyCashTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.0.18.0 + 1.0.18.1 diff --git a/package-lock.json b/package-lock.json index 43a86da13a74..6946a196bc40 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.18-0", + "version": "1.0.18-1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index cf9a9346ec55..6b77ede0afb8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.18-0", + "version": "1.0.18-1", "author": "Expensify, Inc.", "homepage": "https://expensify.cash", "description": "Expensify.cash is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", From 6c0d1ecc944aa3d7d2d8a6e72e270cabf33f87bd Mon Sep 17 00:00:00 2001 From: Rory Abraham Date: Fri, 9 Apr 2021 17:00:06 -0700 Subject: [PATCH 205/380] Convert android version_code from string to int --- fastlane/Fastfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 750599a3adf8..16b6c9417946 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -55,7 +55,7 @@ platform :android do upload_to_play_store( package_name: "com.expensify.chat", json_key: './android/app/android-fastlane-json-key.json', - version_code: ENV["VERSION_CODE"], + version_code: ENV["VERSION_CODE"].to_i, track: 'internal', track_promote_to: 'production', rollout: '1.0', From 65b0aaf6ac920edb2d87620cf4a592dbca30009e Mon Sep 17 00:00:00 2001 From: Joe Gambino Date: Fri, 9 Apr 2021 17:16:24 -0700 Subject: [PATCH 206/380] don't use display name --- src/libs/actions/PersonalDetails.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/libs/actions/PersonalDetails.js b/src/libs/actions/PersonalDetails.js index d25bb757bd04..1fb9512c86c2 100644 --- a/src/libs/actions/PersonalDetails.js +++ b/src/libs/actions/PersonalDetails.js @@ -70,11 +70,8 @@ function getDisplayName(login, personalDetail) { const firstName = userDetails.firstName || ''; const lastName = userDetails.lastName || ''; const fullName = (`${firstName} ${lastName}`).trim(); - if (fullName) { - return fullName; - } - return userDetails.displayName || userLogin; + return fullName || userLogin; } /** From 2c534b285b9ea2648360e902299a11721cded200 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Sat, 10 Apr 2021 00:37:07 +0000 Subject: [PATCH 207/380] Update version to 1.0.18-2 --- android/app/build.gradle | 4 ++-- ios/ExpensifyCash/Info.plist | 2 +- ios/ExpensifyCashTests/Info.plist | 2 +- package-lock.json | 2 +- package.json | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 62774e3bc326..3f583ac0f294 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -148,8 +148,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001001801 - versionName "1.0.18-1" + versionCode 1001001802 + versionName "1.0.18-2" } splits { abi { diff --git a/ios/ExpensifyCash/Info.plist b/ios/ExpensifyCash/Info.plist index 0dc9da792f8b..565287b5ee93 100644 --- a/ios/ExpensifyCash/Info.plist +++ b/ios/ExpensifyCash/Info.plist @@ -30,7 +30,7 @@ CFBundleVersion - 1.0.18.1 + 1.0.18.2 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/ExpensifyCashTests/Info.plist b/ios/ExpensifyCashTests/Info.plist index 36b7a15dc7a5..744bffe9b86a 100644 --- a/ios/ExpensifyCashTests/Info.plist +++ b/ios/ExpensifyCashTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.0.18.1 + 1.0.18.2 diff --git a/package-lock.json b/package-lock.json index 6946a196bc40..a7207afccbc6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.18-1", + "version": "1.0.18-2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 6b77ede0afb8..d0d4193fc280 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.18-1", + "version": "1.0.18-2", "author": "Expensify, Inc.", "homepage": "https://expensify.cash", "description": "Expensify.cash is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", From 076c1a5d086f9f9b2910e584d1cef412b6b7cb93 Mon Sep 17 00:00:00 2001 From: Marc Glasser Date: Fri, 9 Apr 2021 14:52:21 -1000 Subject: [PATCH 208/380] make New indicator permanent until navigating away from chat; --- src/components/UnreadActionIndicator.js | 20 ++++----------- src/pages/home/report/ReportActionsView.js | 30 +++------------------- src/styles/styles.js | 12 ++------- src/styles/variables.js | 2 ++ 4 files changed, 13 insertions(+), 51 deletions(-) diff --git a/src/components/UnreadActionIndicator.js b/src/components/UnreadActionIndicator.js index 0a3fa8d3d95d..4cd062afeb82 100644 --- a/src/components/UnreadActionIndicator.js +++ b/src/components/UnreadActionIndicator.js @@ -1,29 +1,19 @@ import React from 'react'; -import {Animated, View} from 'react-native'; -import PropTypes from 'prop-types'; -import styles, {getOpacityStyle} from '../styles/styles'; +import {View} from 'react-native'; +import styles from '../styles/styles'; import Text from './Text'; -const propTypes = { - // Animated opacity - // eslint-disable-next-line react/forbid-prop-types - animatedOpacity: PropTypes.object.isRequired, -}; - -const UnreadActionIndicator = props => ( - ( + NEW - + ); -UnreadActionIndicator.propTypes = propTypes; UnreadActionIndicator.displayName = 'UnreadActionIndicator'; - export default UnreadActionIndicator; diff --git a/src/pages/home/report/ReportActionsView.js b/src/pages/home/report/ReportActionsView.js index d41e7a3c0d86..a829e875e40c 100644 --- a/src/pages/home/report/ReportActionsView.js +++ b/src/pages/home/report/ReportActionsView.js @@ -71,7 +71,6 @@ class ReportActionsView extends React.Component { this.loadMoreChats = this.loadMoreChats.bind(this); this.sortedReportActions = []; this.timers = []; - this.unreadIndicatorOpacity = new Animated.Value(1); // Helper variable that keeps track of the unread action count before it updates to zero this.unreadActionCount = 0; @@ -89,7 +88,7 @@ class ReportActionsView extends React.Component { this.keyboardEvent = Keyboard.addListener('keyboardDidShow', this.scrollToListBottom); this.recordMaxAction(); fetchActions(this.props.reportID); - this.setUpUnreadActionIndicator(); + this.initialUnreadActionCount = this.props.report.unreadActionCount; Timing.end(CONST.TIMING.SWITCH_REPORT, CONST.TIMING.COLD); } @@ -146,25 +145,6 @@ class ReportActionsView extends React.Component { } } - /** - * Checks if the unreadActionIndicator should be shown. - * If it does, starts a timeout for the fading out animation and creates - * a flag to not show it again if the report is still open - */ - setUpUnreadActionIndicator() { - this.unreadActionCount = this.props.report.unreadActionCount; - - if (this.unreadActionCount > 0) { - this.unreadIndicatorOpacity = new Animated.Value(1); - this.timers.push(setTimeout(() => { - Animated.timing(this.unreadIndicatorOpacity, { - toValue: 0, - useNativeDriver: false, - }).start(); - }, 3000)); - } - } - /** * Retrieves the next set of report actions for the chat once we are nearing the end of what we are currently * displaying. @@ -232,8 +212,7 @@ class ReportActionsView extends React.Component { } /** - * When the bottom of the list is reached, this is triggered, so it's a little different than recording the max - * action when scrolled + * Recorded when the report first opens and when the list is scrolled to the bottom */ recordMaxAction() { const reportActions = lodashGet(this.props, 'reportActions', {}); @@ -306,8 +285,8 @@ class ReportActionsView extends React.Component { // are implemented on native and web/desktop which leads to // the unread indicator on native to render below the message instead of above it. - {this.unreadActionCount > 0 && index === this.unreadActionCount - 1 && ( - + {this.initialUnreadActionCount > 0 && index === this.initialUnreadActionCount - 1 && ( + )} this.actionListElement = el} diff --git a/src/styles/styles.js b/src/styles/styles.js index fae27fd6d72c..c4f16e1b7998 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -835,7 +835,7 @@ const styles = { left: 0, top: 0, bottom: 0, - zIndex: 2, + zIndex: variables.zIndexTop, }, navigationModalOverlay: { @@ -1153,6 +1153,7 @@ const styles = { paddingHorizontal: 20, flexDirection: 'row', alignItems: 'center', + zIndex: variables.zIndexMiddle, }, unreadIndicatorLine: { @@ -1520,14 +1521,6 @@ function getWidthAndHeightStyle(width, height) { }; } -/** - * @param {Number} opacity - * @returns {Object} - */ -function getOpacityStyle(opacity) { - return {opacity}; -} - /** * @param {Object} params * @returns {Object} @@ -1566,6 +1559,5 @@ export { getIconFillColor, getAnimatedFABStyle, getWidthAndHeightStyle, - getOpacityStyle, getModalPaddingStyles, }; diff --git a/src/styles/variables.js b/src/styles/variables.js index 9b70c5d5b072..3d3dbe3054b0 100644 --- a/src/styles/variables.js +++ b/src/styles/variables.js @@ -24,4 +24,6 @@ export default { sideBarWidth: 375, pdfPageMaxWidth: 992, tooltipzIndex: 10050, + zIndexMiddle: 50, + zIndexTop: 999, }; From b824e84a216be653793a86667e50b314621c6d57 Mon Sep 17 00:00:00 2001 From: Marc Glasser Date: Fri, 9 Apr 2021 15:04:44 -1000 Subject: [PATCH 209/380] remove animated --- src/pages/home/report/ReportActionsView.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/home/report/ReportActionsView.js b/src/pages/home/report/ReportActionsView.js index a829e875e40c..e40993b6a1f1 100644 --- a/src/pages/home/report/ReportActionsView.js +++ b/src/pages/home/report/ReportActionsView.js @@ -1,6 +1,5 @@ import React from 'react'; import { - Animated, View, Keyboard, AppState, From 444769d644dc7a47ab9f2a83796d6291da684093 Mon Sep 17 00:00:00 2001 From: Rory Abraham Date: Sat, 10 Apr 2021 00:23:52 -0700 Subject: [PATCH 210/380] Fix web DisplayNames --- src/components/DisplayNames/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/DisplayNames/index.js b/src/components/DisplayNames/index.js index 72f89e6f1e22..d01b211188a9 100644 --- a/src/components/DisplayNames/index.js +++ b/src/components/DisplayNames/index.js @@ -88,7 +88,7 @@ class DisplayNames extends PureComponent { numberOfLines={1} ref={el => this.containerRef = el} > - {_.map(this.props.displayNamesToTooltips, ({displayName, tooltip}, index) => ( + {_.map(this.props.displayNamesWithTooltips, ({displayName, tooltip}, index) => ( - {index < this.props.displayNamesToTooltips.length - 1 && } + {index < this.props.displayNamesWithTooltips.length - 1 && } ))} - {this.props.displayNamesToTooltips.length > 1 && this.state.isEllipsisActive + {this.props.displayNamesWithTooltips.length > 1 && this.state.isEllipsisActive && ( From b0a75086eb9567b618066d7209f874274ba28e0a Mon Sep 17 00:00:00 2001 From: OSBotify Date: Sat, 10 Apr 2021 08:34:24 +0000 Subject: [PATCH 211/380] Update version to 1.0.18-3 --- android/app/build.gradle | 4 ++-- ios/ExpensifyCash/Info.plist | 2 +- ios/ExpensifyCashTests/Info.plist | 2 +- package-lock.json | 2 +- package.json | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 3f583ac0f294..507dd44a2106 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -148,8 +148,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001001802 - versionName "1.0.18-2" + versionCode 1001001803 + versionName "1.0.18-3" } splits { abi { diff --git a/ios/ExpensifyCash/Info.plist b/ios/ExpensifyCash/Info.plist index 565287b5ee93..36780a26e08b 100644 --- a/ios/ExpensifyCash/Info.plist +++ b/ios/ExpensifyCash/Info.plist @@ -30,7 +30,7 @@ CFBundleVersion - 1.0.18.2 + 1.0.18.3 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/ExpensifyCashTests/Info.plist b/ios/ExpensifyCashTests/Info.plist index 744bffe9b86a..2d0e771ae114 100644 --- a/ios/ExpensifyCashTests/Info.plist +++ b/ios/ExpensifyCashTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.0.18.2 + 1.0.18.3 diff --git a/package-lock.json b/package-lock.json index a7207afccbc6..aee7a4ccb156 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.18-2", + "version": "1.0.18-3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index d0d4193fc280..eca697980711 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.18-2", + "version": "1.0.18-3", "author": "Expensify, Inc.", "homepage": "https://expensify.cash", "description": "Expensify.cash is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", From 1a2560ee7bb96dbf768cb71cf5d01ca568f660fb Mon Sep 17 00:00:00 2001 From: npsedhain Date: Sun, 11 Apr 2021 15:59:02 +0545 Subject: [PATCH 212/380] Refactor: Added conditional rendering for back button and other changes. --- .../AppNavigator/ModalStackNavigators.js | 3 +-- src/libs/Navigation/linkingConfig.js | 2 +- src/pages/DetailsPage.js | 5 +++- src/pages/ReportParticipantsPage.js | 24 +++++++------------ 4 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators.js b/src/libs/Navigation/AppNavigator/ModalStackNavigators.js index 4898e87af136..da61365a6f0e 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators.js +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators.js @@ -85,7 +85,7 @@ const DetailsModalStackNavigator = () => ( const ReportParticipantsModalStackNavigator = () => ( ( /> diff --git a/src/libs/Navigation/linkingConfig.js b/src/libs/Navigation/linkingConfig.js index e226980ad3eb..0ccfd420e7d9 100644 --- a/src/libs/Navigation/linkingConfig.js +++ b/src/libs/Navigation/linkingConfig.js @@ -72,7 +72,7 @@ export default { }, Participants: { screens: { - Participants_Root: ROUTES.REPORT_PARTICIPANTS, + Participants_Details: ROUTES.REPORT_PARTICIPANTS, Details_Root: ROUTES.REPORT_PARTICIPANT, }, }, diff --git a/src/pages/DetailsPage.js b/src/pages/DetailsPage.js index bcdddb59cea8..1085a505271c 100644 --- a/src/pages/DetailsPage.js +++ b/src/pages/DetailsPage.js @@ -19,6 +19,9 @@ const matchType = PropTypes.shape({ params: PropTypes.shape({ // login passed via route /details/:login login: PropTypes.string, + + // report ID passed + reportID: PropTypes.string, }), }); @@ -38,7 +41,7 @@ const DetailsPage = ({personalDetails, route}) => { { @@ -60,16 +53,17 @@ const getAllParticipants = (report, personalDetails) => { return _.map(participants, (login) => { const userPersonalDetail = personalDetails[login]; + const userLogin = Str.removeSMSDomain(login); return ({ - alternateText: login, + alternateText: userLogin, displayName: userPersonalDetail.displayName, icons: [userPersonalDetail.avatar], keyForList: login, - login, + login: userLogin, text: userPersonalDetail.displayName, - tooltipText: login, - participantsList: [{login, displayName: userPersonalDetail.displayName}], + tooltipText: userLogin, + participantsList: [{login: userLogin, displayName: userPersonalDetail.displayName}], }); }); }; From 39dba0c60acbbac278874f71891fdcc180e6fa0d Mon Sep 17 00:00:00 2001 From: barun1997 Date: Mon, 12 Apr 2021 00:25:43 +0545 Subject: [PATCH 213/380] Make IOUConfirmPage a single page and add creatingIOUTransaction to IOU Onyx --- src/libs/actions/IOU.js | 13 +- src/pages/iou/IOUModal.js | 34 ++-- .../IOUConfirmSplit.js => IOUConfirmPage.js} | 101 +++++++----- .../steps/IOUConfirmPage/IOUConfirmRequest.js | 151 ------------------ src/pages/iou/steps/IOUConfirmPage/index.js | 86 ---------- 5 files changed, 89 insertions(+), 296 deletions(-) rename src/pages/iou/steps/{IOUConfirmPage/IOUConfirmSplit.js => IOUConfirmPage.js} (67%) delete mode 100644 src/pages/iou/steps/IOUConfirmPage/IOUConfirmRequest.js delete mode 100644 src/pages/iou/steps/IOUConfirmPage/index.js diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index 1a79e7e55548..6945162127e7 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -27,7 +27,7 @@ function getPreferredCurrency() { function createIOUTransaction({ comment, amount, currency, debtorEmail, }) { - Onyx.merge(ONYXKEYS.IOU, {loading: true}); + Onyx.merge(ONYXKEYS.IOU, {loading: true, creatingIOUTransaction: true, error: false}); let iouReportID = ''; API.CreateIOUTransaction({ comment, @@ -57,10 +57,11 @@ function createIOUTransaction({ Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_IOUS}${iouReportID}`, getSimplifiedIOUReport(iouReportData)); - Onyx.merge(ONYXKEYS.IOU, {loading: false}); + Onyx.merge(ONYXKEYS.IOU, {loading: false, creatingIOUTransaction: false, error: false}); }) .catch((error) => { - console.debug(`[Report] Failed to populate IOU Collection: ${error.message}`); + Onyx.merge(ONYXKEYS.IOU, {loading: false, creatingIOUTransaction: false, error: true}); + throw new Error(`[Report] Failed to populate IOU Collection: ${error.message}`); }); } @@ -81,7 +82,7 @@ function createIOUSplit({ splits, }) { let reportIDs = []; - Onyx.merge(ONYXKEYS.IOU, {loading: true}); + Onyx.merge(ONYXKEYS.IOU, {loading: true, creatingIOUTransaction: true, error: false}); API.CreateChatReport({ emailList: participants.join(','), }) @@ -116,11 +117,11 @@ function createIOUSplit({ return Onyx.mergeCollection(ONYXKEYS.COLLECTION.REPORT_IOUS, {...reportIOUData}); }) .then(() => { - Onyx.merge(ONYXKEYS.IOU, {loading: false}); + Onyx.merge(ONYXKEYS.IOU, {loading: false, creatingIOUTransaction: false, error: false}); }) .catch((error) => { console.debug(`Error: ${error.message}`); - Onyx.merge(ONYXKEYS.IOU, {loading: false}); + Onyx.merge(ONYXKEYS.IOU, {loading: false, creatingIOUTransaction: false, error: true}); }); } diff --git a/src/pages/iou/IOUModal.js b/src/pages/iou/IOUModal.js index 32d1020bda27..63f9872a25c1 100644 --- a/src/pages/iou/IOUModal.js +++ b/src/pages/iou/IOUModal.js @@ -1,6 +1,5 @@ import React, {Component} from 'react'; import {View, TouchableOpacity} from 'react-native'; -import _ from 'underscore'; import PropTypes from 'prop-types'; import {withOnyx} from 'react-native-onyx'; import IOUAmountPage from './steps/IOUAmountPage'; @@ -21,16 +20,20 @@ const propTypes = { // Is this new IOU for a single request or group bill split? hasMultipleParticipants: PropTypes.bool, - /* Onyx Props */ - iousReport: PropTypes.objectOf(PropTypes.shape({ - currency: PropTypes.string, - managerEmail: PropTypes.string, - ownerEmail: PropTypes.string, - reportID: PropTypes.number, - transactions: PropTypes.arrayOf(PropTypes.shape({ - transactionID: PropTypes.string, - })), - })).isRequired, + // Holds data related to IOU view state, rather than the underlying IOU data. + iou: PropTypes.shape({ + + // Whether or not the IOU step is loading (creating the IOU Report) + loading: PropTypes.bool, + + // Whether or not transaction creation has started + creatingIOUTransaction: PropTypes.bool, + + // Whether or not transaction creation has resulted to error + error: PropTypes.bool, + }).isRequired, + + }; const defaultProps = { @@ -62,6 +65,8 @@ class IOUModal extends Component { this.state = { currentStepIndex: 0, participants: [], + + // amount is currency in decimal format amount: '', selectedCurrency: 'USD', isAmountPageNextButtonDisabled: true, @@ -74,9 +79,9 @@ class IOUModal extends Component { } componentDidUpdate(prevProps) { - // if the prevProps isn't equivalent to new prop, dismiss the modal - if (!_.isEqual(prevProps.iousReport, this.props.iousReport)) { - return Navigation.dismissModal(); + // Successfully close the modal if transaction creation has ended and theree is no error + if (prevProps.iou.creatingIOUTransaction && !this.props.iou.creatingIOUTransaction && !this.props.iou.error) { + Navigation.dismissModal(); } } @@ -277,4 +282,5 @@ export default withOnyx({ iousReport: { key: ONYXKEYS.COLLECTION.REPORT_IOUS, }, + iou: {key: ONYXKEYS.IOU}, })(IOUModal); diff --git a/src/pages/iou/steps/IOUConfirmPage/IOUConfirmSplit.js b/src/pages/iou/steps/IOUConfirmPage.js similarity index 67% rename from src/pages/iou/steps/IOUConfirmPage/IOUConfirmSplit.js rename to src/pages/iou/steps/IOUConfirmPage.js index 6f7c8f25c1f6..6ccedbf525b7 100644 --- a/src/pages/iou/steps/IOUConfirmPage/IOUConfirmSplit.js +++ b/src/pages/iou/steps/IOUConfirmPage.js @@ -3,16 +3,16 @@ import {View} from 'react-native'; import PropTypes from 'prop-types'; import {withOnyx} from 'react-native-onyx'; import {TextInput} from 'react-native-gesture-handler'; -import ONYXKEYS from '../../../../ONYXKEYS'; -import styles from '../../../../styles/styles'; -import Text from '../../../../components/Text'; -import themeColors from '../../../../styles/themes/default'; +import ONYXKEYS from '../../../ONYXKEYS'; +import styles from '../../../styles/styles'; +import Text from '../../../components/Text'; +import themeColors from '../../../styles/themes/default'; import { getDisplayOptionFromMyPersonalDetail, getDisplayOptionsFromParticipants, -} from '../../../../libs/OptionsListUtils'; -import ButtonWithLoader from '../../../../components/ButtonWithLoader'; -import OptionsList from '../../../../components/OptionsList'; +} from '../../../libs/OptionsListUtils'; +import ButtonWithLoader from '../../../components/ButtonWithLoader'; +import OptionsList from '../../../components/OptionsList'; const propTypes = { // Callback to inform parent modal of success @@ -24,6 +24,9 @@ const propTypes = { // comment value from IOUModal comment: PropTypes.string, + // Should we request a single or multiple participant selection from user + hasMultipleParticipants: PropTypes.bool.isRequired, + // IOU amount iouAmount: PropTypes.string.isRequired, @@ -76,7 +79,7 @@ const defaultProps = { comment: '', }; -class IOUConfirmSplitPage extends Component { +class IOUConfirmPage extends Component { /** * Returns the sections needed for the OptionsSelector * @@ -86,26 +89,38 @@ class IOUConfirmSplitPage extends Component { getSections() { const sections = []; - const formattedMyPersonalDetails = getDisplayOptionFromMyPersonalDetail(this.props.myPersonalDetails, - - // convert from cent to bigger form - `$${this.calculateAmount(true) / 100}`); - const formattedParticipants = getDisplayOptionsFromParticipants(this.props.participants, - `$${this.calculateAmount() / 100}`); - - sections.push({ - title: 'WHO PAID?', - data: formattedMyPersonalDetails, - shouldShow: true, - indexOffset: 0, - }); - sections.push({ - title: 'WHO WAS THERE?', - data: formattedParticipants, - shouldShow: true, - indexOffset: 0, - }); - + if (this.props.hasMultipleParticipants) { + const formattedMyPersonalDetails = getDisplayOptionFromMyPersonalDetail(this.props.myPersonalDetails, + + // convert from cent to bigger form + `$${this.calculateAmount(true) / 100}`); + const formattedParticipants = getDisplayOptionsFromParticipants(this.props.participants, + `$${this.calculateAmount() / 100}`); + + sections.push({ + title: 'WHO PAID?', + data: formattedMyPersonalDetails, + shouldShow: true, + indexOffset: 0, + }); + sections.push({ + title: 'WHO WAS THERE?', + data: formattedParticipants, + shouldShow: true, + indexOffset: 0, + }); + } else { + // $ should be replaced by currency symbol once available + const formattedParticipants = getDisplayOptionsFromParticipants(this.props.participants, + `$${this.props.iouAmount}`); + + sections.push({ + title: 'TO', + data: formattedParticipants, + shouldShow: true, + indexOffset: 0, + }); + } return sections; } @@ -183,9 +198,9 @@ class IOUConfirmSplitPage extends Component { disableArrowKeysActions hideAdditionalOptionStates forceTextUnreadStyle - canSelectMultipleOptions + canSelectMultipleOptions={this.props.hasMultipleParticipants} disableFocusOptions - selectedOptions={this.getAllOptionsAsSelected()} + selectedOptions={this.props.hasMultipleParticipants && this.getAllOptionsAsSelected()} /> @@ -205,11 +220,19 @@ class IOUConfirmSplitPage extends Component { this.props.onConfirm({ - splits: this.getSplits(), - participants: this.getParticipants(), - })} + text={this.props.hasMultipleParticipants ? 'Split' : `Request $${this.props.iouAmount}`} + onClick={() => { + if (this.props.hasMultipleParticipants) { + this.props.onConfirm({ + splits: this.getSplits(), + participants: this.getParticipants(), + }); + } else { + this.props.onConfirm({ + debtorEmail: this.props.participants[0].login, + }); + } + }} /> @@ -217,9 +240,9 @@ class IOUConfirmSplitPage extends Component { } } -IOUConfirmSplitPage.displayName = 'IOUConfirmSplitPage'; -IOUConfirmSplitPage.propTypes = propTypes; -IOUConfirmSplitPage.defaultProps = defaultProps; +IOUConfirmPage.displayName = 'IOUConfirmPage'; +IOUConfirmPage.propTypes = propTypes; +IOUConfirmPage.defaultProps = defaultProps; export default withOnyx({ iou: {key: ONYXKEYS.IOU}, @@ -229,4 +252,4 @@ export default withOnyx({ myPersonalDetails: { key: ONYXKEYS.MY_PERSONAL_DETAILS, }, -})(IOUConfirmSplitPage); +})(IOUConfirmPage); diff --git a/src/pages/iou/steps/IOUConfirmPage/IOUConfirmRequest.js b/src/pages/iou/steps/IOUConfirmPage/IOUConfirmRequest.js deleted file mode 100644 index a57c06aafeb6..000000000000 --- a/src/pages/iou/steps/IOUConfirmPage/IOUConfirmRequest.js +++ /dev/null @@ -1,151 +0,0 @@ -import React, {Component} from 'react'; -import {View, TextInput} from 'react-native'; -import PropTypes from 'prop-types'; -import {withOnyx} from 'react-native-onyx'; -import ONYXKEYS from '../../../../ONYXKEYS'; -import styles from '../../../../styles/styles'; -import Text from '../../../../components/Text'; -import ButtonWithLoader from '../../../../components/ButtonWithLoader'; -import themeColors from '../../../../styles/themes/default'; -import {getDisplayOptionsFromParticipants} from '../../../../libs/OptionsListUtils'; -import OptionsList from '../../../../components/OptionsList'; - -const propTypes = { - // Callback to inform parent modal of success - onConfirm: PropTypes.func.isRequired, - - // IOU amount - iouAmount: PropTypes.string.isRequired, - - // callback to update comment from IOUModal - onUpdateComment: PropTypes.func, - - // Selected currency from the user - // remove eslint disable after currency symbol is available - // eslint-disable-next-line react/no-unused-prop-types - selectedCurrency: PropTypes.string.isRequired, - - // comment value from IOUModal - comment: PropTypes.string, - - // Selected participants from IOUMOdal with login - participants: PropTypes.arrayOf(PropTypes.shape({ - login: PropTypes.string.isRequired, - alternateText: PropTypes.string, - hasDraftComment: PropTypes.bool, - icons: PropTypes.arrayOf(PropTypes.string), - searchText: PropTypes.string, - text: PropTypes.string, - keyForList: PropTypes.string, - isPinned: PropTypes.bool, - isUnread: PropTypes.bool, - reportID: PropTypes.number, - participantsList: PropTypes.arrayOf(PropTypes.object), - })).isRequired, - - /* Onyx Props */ - - // The personal details of the person who is logged in - myPersonalDetails: PropTypes.shape({ - - // Display name of the current user from their personal details - displayName: PropTypes.string, - - // Avatar URL of the current user from their personal details - avatar: PropTypes.string, - }).isRequired, - - // Holds data related to IOU view state, rather than the underlying IOU data. - iou: PropTypes.shape({ - - // Whether or not the IOU step is loading (creating the IOU Report) - loading: PropTypes.bool, - }), -}; - -const defaultProps = { - iou: {}, - onUpdateComment: null, - comment: '', -}; - -class IOUConfirmRequestPage extends Component { - /** - * Returns the sections needed for the OptionsSelector - * - * @param {Boolean} maxParticipantsReached - * @returns {Array} - */ - getSections() { - const sections = []; - - // $ should be replaced by currency symbol once available - const formattedParticipants = getDisplayOptionsFromParticipants(this.props.participants, - `$${this.props.iouAmount}`); - - sections.push({ - title: 'TO', - data: formattedParticipants, - shouldShow: true, - indexOffset: 0, - }); - return sections; - } - - render() { - const sections = this.getSections(); - return ( - - - - - - WHAT'S IT FOR? - - - - - - - - this.props.onConfirm({ - debtorEmail: this.props.participants[0].login, - })} - /> - - - ); - } -} - -IOUConfirmRequestPage.displayName = 'IOUConfirmRequestPage'; -IOUConfirmRequestPage.propTypes = propTypes; -IOUConfirmRequestPage.defaultProps = defaultProps; - -export default withOnyx({ - iou: {key: ONYXKEYS.IOU}, - personalDetails: { - key: ONYXKEYS.PERSONAL_DETAILS, - }, - myPersonalDetails: { - key: ONYXKEYS.MY_PERSONAL_DETAILS, - }, - user: { - key: ONYXKEYS.USER, - }, -})(IOUConfirmRequestPage); diff --git a/src/pages/iou/steps/IOUConfirmPage/index.js b/src/pages/iou/steps/IOUConfirmPage/index.js deleted file mode 100644 index 0905720f5ae1..000000000000 --- a/src/pages/iou/steps/IOUConfirmPage/index.js +++ /dev/null @@ -1,86 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import {withOnyx} from 'react-native-onyx'; -import ONYXKEYS from '../../../../ONYXKEYS'; -import IOUConfirmRequest from './IOUConfirmRequest'; -import IOUConfirmSplit from './IOUConfirmSplit'; - -const propTypes = { - // Callback to inform parent modal of success - onConfirm: PropTypes.func.isRequired, - - // Selected currency from the user - selectedCurrency: PropTypes.string.isRequired, - - // Should we request a single or multiple participant selection from user - hasMultipleParticipants: PropTypes.bool.isRequired, - - // IOU amount - iouAmount: PropTypes.string.isRequired, - - // optional comment - comment: PropTypes.string, - - // callback to update comment - onUpdateComment: PropTypes.func, - - // Selected participants from IOUMOdal with login - participants: PropTypes.arrayOf(PropTypes.shape({ - login: PropTypes.string.isRequired, - alternateText: PropTypes.string, - hasDraftComment: PropTypes.bool, - icons: PropTypes.arrayOf(PropTypes.string), - searchText: PropTypes.string, - text: PropTypes.string, - keyForList: PropTypes.string, - isPinned: PropTypes.bool, - isUnread: PropTypes.bool, - reportID: PropTypes.number, - })).isRequired, - - /* Onyx Props */ - - // Holds data related to IOU view state, rather than the underlying IOU data. - iou: PropTypes.shape({ - - // Whether or not the IOU step is loading (creating the IOU Report) - loading: PropTypes.bool, - }), -}; - -const defaultProps = { - iou: {}, - comment: '', - onUpdateComment: null, -}; - -const IOUConfirmPage = props => (props.hasMultipleParticipants - ? ( - - ) - : ( - - ) -); - -IOUConfirmPage.displayName = 'IOUConfirmPage'; -IOUConfirmPage.propTypes = propTypes; -IOUConfirmPage.defaultProps = defaultProps; - -export default withOnyx({ - iou: {key: ONYXKEYS.IOU}, -})(IOUConfirmPage); From ee4d2451ba9dc7df4207f916ef0622f7a30cb66e Mon Sep 17 00:00:00 2001 From: barun1997 Date: Mon, 12 Apr 2021 01:25:43 +0545 Subject: [PATCH 214/380] Fix styling issues --- src/components/OptionsList.js | 2 +- src/pages/iou/steps/IOUConfirmPage.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/OptionsList.js b/src/components/OptionsList.js index 091b7d6f1b2c..d6f81138c538 100644 --- a/src/components/OptionsList.js +++ b/src/components/OptionsList.js @@ -196,7 +196,7 @@ class OptionsList extends Component { render() { return ( - + {this.props.headerMessage ? ( diff --git a/src/pages/iou/steps/IOUConfirmPage.js b/src/pages/iou/steps/IOUConfirmPage.js index 6ccedbf525b7..9870dbeb216d 100644 --- a/src/pages/iou/steps/IOUConfirmPage.js +++ b/src/pages/iou/steps/IOUConfirmPage.js @@ -191,8 +191,8 @@ class IOUConfirmPage extends Component { render() { const sections = this.getSections(); return ( - - + + Date: Mon, 12 Apr 2021 08:21:05 +0800 Subject: [PATCH 215/380] Fix PropType usage --- src/pages/signin/SignInPageLayout/SignInPageLayoutNarrow.js | 4 ++-- src/pages/signin/SignInPageLayout/SignInPageLayoutWide.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pages/signin/SignInPageLayout/SignInPageLayoutNarrow.js b/src/pages/signin/SignInPageLayout/SignInPageLayoutNarrow.js index d9bc4c8351ae..843c4d7b89d2 100644 --- a/src/pages/signin/SignInPageLayout/SignInPageLayoutNarrow.js +++ b/src/pages/signin/SignInPageLayout/SignInPageLayoutNarrow.js @@ -17,8 +17,8 @@ const propTypes = { children: PropTypes.node.isRequired, // Whether we should show the welcome elements - shouldShowWelcomeText: PropTypes.Boolean, - shouldShowWelcomeScreenshot: PropTypes.Boolean, + shouldShowWelcomeText: PropTypes.bool, + shouldShowWelcomeScreenshot: PropTypes.bool, }; const defaultProps = { diff --git a/src/pages/signin/SignInPageLayout/SignInPageLayoutWide.js b/src/pages/signin/SignInPageLayout/SignInPageLayoutWide.js index ebc2cda5c9df..248a8d657857 100644 --- a/src/pages/signin/SignInPageLayout/SignInPageLayoutWide.js +++ b/src/pages/signin/SignInPageLayout/SignInPageLayoutWide.js @@ -16,7 +16,7 @@ const propTypes = { // Whether we should show the welcome text // (the welcome screenshot always displays on wide views) - shouldShowWelcomeText: PropTypes.Boolean, + shouldShowWelcomeText: PropTypes.bool, }; const defaultProps = { From fe70523978f1187e69f3f6be26a928b6aadf0e11 Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Mon, 12 Apr 2021 13:10:57 +0300 Subject: [PATCH 216/380] refactor: CreateMenu extract platform specific implementations from base --- src/components/CreateMenu/BaseCreateMenu.js | 52 +++---------------- .../CreateMenu/CreateMenuPropTypes.js | 23 ++++++++ src/components/CreateMenu/index.js | 15 ++++-- src/components/CreateMenu/index.native.js | 39 +++++++++++++- 4 files changed, 80 insertions(+), 49 deletions(-) create mode 100644 src/components/CreateMenu/CreateMenuPropTypes.js diff --git a/src/components/CreateMenu/BaseCreateMenu.js b/src/components/CreateMenu/BaseCreateMenu.js index f5b34d78638f..77ae28cf69da 100644 --- a/src/components/CreateMenu/BaseCreateMenu.js +++ b/src/components/CreateMenu/BaseCreateMenu.js @@ -5,65 +5,27 @@ import Popover from '../Popover'; import styles from '../../styles/styles'; import withWindowDimensions, {windowDimensionsPropTypes} from '../withWindowDimensions'; import MenuItem from '../MenuItem'; +import createMenuPropTypes from './CreateMenuPropTypes'; const propTypes = { - // Callback to fire on request to modal close - onClose: PropTypes.func.isRequired, - - // State that determines whether to display the create menu or not - isVisible: PropTypes.bool.isRequired, - - // Callback to fire when a CreateMenu item is selected - onItemSelected: PropTypes.func.isRequired, - - // Menu items to be rendered on the list - menuItems: PropTypes.arrayOf( - PropTypes.shape({ - icon: PropTypes.func.isRequired, - text: PropTypes.string.isRequired, - onSelected: PropTypes.func.isRequired, - }), - ).isRequired, - - /* Configures when menu item actions are triggered: as soon as pressed or after the modal is closed. - * On mobile native we need to wait for the modals to close, while on web as soon as clicked */ - actionExecutionStrategy: PropTypes.oneOf(['ON_PRESS', 'AFTER_MODAL_CLOSE']), + // Callback fired when the menu is completely closed + onModalHide: PropTypes.func, + ...createMenuPropTypes, ...windowDimensionsPropTypes, }; const defaultProps = { - actionExecutionStrategy: 'AFTER_MODAL_CLOSE', + onModalHide: () => {}, }; class BaseCreateMenu extends PureComponent { - /** - * Select an item and apply action execution strategy - * - * @param {object} item - an item from this.props.menuItems - */ - selectItem(item) { - this.props.onItemSelected(item); - - switch (this.props.actionExecutionStrategy) { - case 'ON_PRESS': - item.onSelected(); - this.onModalHide = () => {}; - break; - case 'AFTER_MODAL_CLOSE': - this.onModalHide = () => item.onSelected(); - break; - default: - throw new Error(`Unexpected "actionExecutionStrategy" value: ${this.props.actionExecutionStrategy}`); - } - } - render() { return ( @@ -72,7 +34,7 @@ class BaseCreateMenu extends PureComponent { key={item.text} icon={item.icon} title={item.text} - onPress={() => this.selectItem(item)} + onPress={() => this.props.onItemSelected(item)} /> ))} diff --git a/src/components/CreateMenu/CreateMenuPropTypes.js b/src/components/CreateMenu/CreateMenuPropTypes.js new file mode 100644 index 000000000000..5530197028a5 --- /dev/null +++ b/src/components/CreateMenu/CreateMenuPropTypes.js @@ -0,0 +1,23 @@ +import PropTypes from 'prop-types'; + +const createMenuPropTypes = { + // Callback method fired when the user requests to close the modal + onClose: PropTypes.func.isRequired, + + // State that determines whether to display the modal or not + isVisible: PropTypes.bool.isRequired, + + // Callback to fire when a CreateMenu item is selected + onItemSelected: PropTypes.func.isRequired, + + // Menu items to be rendered on the list + menuItems: PropTypes.arrayOf( + PropTypes.shape({ + icon: PropTypes.func.isRequired, + text: PropTypes.string.isRequired, + onSelected: PropTypes.func.isRequired, + }), + ).isRequired, +}; + +export default createMenuPropTypes; diff --git a/src/components/CreateMenu/index.js b/src/components/CreateMenu/index.js index b77c5623405c..2bc0c03226c8 100644 --- a/src/components/CreateMenu/index.js +++ b/src/components/CreateMenu/index.js @@ -1,5 +1,6 @@ import React from 'react'; import BaseCreateMenu from './BaseCreateMenu'; +import createMenuPropTypes from './CreateMenuPropTypes'; /** * The web implementation of the menu needs to trigger actions before the popup closes @@ -11,9 +12,17 @@ import BaseCreateMenu from './BaseCreateMenu'; * @param {Object} props * @returns {React.ReactElement} */ -function CreateMenu(props) { +const CreateMenu = (props) => { + // Trigger the item's `onSelect` action as soon as clicked + const selectItem = (item) => { + item.onSelected(); + props.onItemSelected(item); + }; + // eslint-disable-next-line react/jsx-props-no-spreading - return ; -} + return ; +}; + +CreateMenu.propTypes = createMenuPropTypes; export default CreateMenu; diff --git a/src/components/CreateMenu/index.native.js b/src/components/CreateMenu/index.native.js index dd6a1b4458d4..2f044ac961a1 100644 --- a/src/components/CreateMenu/index.native.js +++ b/src/components/CreateMenu/index.native.js @@ -1,3 +1,40 @@ +import React, {Component} from 'react'; import BaseCreateMenu from './BaseCreateMenu'; +import createMenuPropTypes from './CreateMenuPropTypes'; -export default BaseCreateMenu; +/** + * The mobile native implementation of the CreateMenu needs to trigger actions after the popup closes + * We need to wait for the modal to close otherwise menu actions that trigger another modal + * would not work + */ +class CreateMenu extends Component { + /** + * Set the item's `onSelected` action to fire after the modal closes + * @param {{onSelected: function}} item + */ + selectItem(item) { + this.onModalHide = () => { + item.onSelected(); + + // Clean up so that open and cancel does not trigger the same action + this.onModalHide = () => {}; + }; + + this.props.onItemSelected(item); + } + + render() { + return ( + this.selectItem(item)} + /> + ); + } +} + +CreateMenu.propTypes = createMenuPropTypes; + +export default CreateMenu; From ab23679c9fdc4b7fe152ac678280f7e357f90c2b Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Mon, 12 Apr 2021 13:30:58 +0300 Subject: [PATCH 217/380] refactor: CreateMenu describe prop Types Fix `icon` prop - it's not just any function It should be a react component - elementType --- src/components/CreateMenu/CreateMenuPropTypes.js | 7 ++++++- src/components/MenuItem.js | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/components/CreateMenu/CreateMenuPropTypes.js b/src/components/CreateMenu/CreateMenuPropTypes.js index 5530197028a5..b8fd59c2493c 100644 --- a/src/components/CreateMenu/CreateMenuPropTypes.js +++ b/src/components/CreateMenu/CreateMenuPropTypes.js @@ -13,8 +13,13 @@ const createMenuPropTypes = { // Menu items to be rendered on the list menuItems: PropTypes.arrayOf( PropTypes.shape({ - icon: PropTypes.func.isRequired, + // An icon element displayed on the left side + icon: PropTypes.elementType.isRequired, + + // Text label text: PropTypes.string.isRequired, + + // A callback triggered when this item is selected onSelected: PropTypes.func.isRequired, }), ).isRequired, diff --git a/src/components/MenuItem.js b/src/components/MenuItem.js index 4fadcea2b606..98069da65634 100644 --- a/src/components/MenuItem.js +++ b/src/components/MenuItem.js @@ -17,7 +17,7 @@ const propTypes = { onPress: PropTypes.func.isRequired, // Icon to display on the left side of component - icon: PropTypes.func.isRequired, + icon: PropTypes.elementType.isRequired, // Text to display for the item title: PropTypes.string.isRequired, From ee27ea5423f6db448145d9380c5743c40553cb90 Mon Sep 17 00:00:00 2001 From: npsedhain Date: Mon, 12 Apr 2021 18:04:51 +0545 Subject: [PATCH 218/380] Refactor: Resolve the comments, removed anchor position and others. --- src/components/CreateMenu.js | 20 ----------- src/components/Modal/ModalPropTypes.js | 11 ++---- src/components/Popover/PopoverPropTypes.js | 1 + src/components/Popover/index.js | 39 +++++++++++++++++----- src/styles/styles.js | 2 +- 5 files changed, 34 insertions(+), 39 deletions(-) diff --git a/src/components/CreateMenu.js b/src/components/CreateMenu.js index 5c7366c04dfa..6e56a790a179 100644 --- a/src/components/CreateMenu.js +++ b/src/components/CreateMenu.js @@ -53,24 +53,6 @@ class CreateMenu extends PureComponent { this.onModalHide = callback; } - /** - * Get the anchor position using the type of the modal into account - * @param {String} type - * @returns {Object} - */ - getAnchorPosition(type) { - switch (type) { - case CONST.MODAL.MODAL_TYPE.POPOVER_LEFT_DOCKED: - return styles.createMenuPositionSidebar; - case CONST.MODAL.MODAL_TYPE.POPOVER_CENTER_BOTTOM: - return styles.createMenuPositionReportCompose; - case CONST.MODAL.MODAL_TYPE.POPOVER_RIGHT_DOCKED: - return styles.createMenuPositionProfile; - default: - return styles.createMenuPositionSidebar; - } - } - /** * After the modal hides, reset the onModalHide to an empty function */ @@ -79,7 +61,6 @@ class CreateMenu extends PureComponent { } render() { - console.debug(this.props.popOverType, this.getAnchorPosition()); return ( diff --git a/src/components/Modal/ModalPropTypes.js b/src/components/Modal/ModalPropTypes.js index e5e52f051e5f..777598455f61 100644 --- a/src/components/Modal/ModalPropTypes.js +++ b/src/components/Modal/ModalPropTypes.js @@ -1,4 +1,5 @@ import PropTypes from 'prop-types'; +import _ from 'underscore'; import CONST from '../../CONST'; import {windowDimensionsPropTypes} from '../withWindowDimensions'; @@ -19,15 +20,7 @@ const propTypes = { onModalHide: PropTypes.func, // Style of modal to display - type: PropTypes.oneOf([ - CONST.MODAL.MODAL_TYPE.CONFIRM, - CONST.MODAL.MODAL_TYPE.CENTERED, - CONST.MODAL.MODAL_TYPE.BOTTOM_DOCKED, - CONST.MODAL.MODAL_TYPE.POPOVER_CENTER_BOTTOM, - CONST.MODAL.MODAL_TYPE.POPOVER_LEFT_DOCKED, - CONST.MODAL.MODAL_TYPE.POPOVER_RIGHT_DOCKED, - CONST.MODAL.MODAL_TYPE.RIGHT_DOCKED, - ]), + type: PropTypes.oneOf(_.values(CONST.MODAL.MODAL_TYPE)), // A react-native-animatable animation definition for the modal display animation. animationIn: PropTypes.oneOfType([ diff --git a/src/components/Popover/PopoverPropTypes.js b/src/components/Popover/PopoverPropTypes.js index b4973b9d28f2..bf1c2df7189c 100644 --- a/src/components/Popover/PopoverPropTypes.js +++ b/src/components/Popover/PopoverPropTypes.js @@ -13,6 +13,7 @@ const propTypes = { left: PropTypes.number, }).isRequired, + // Describes what type of pop over is it - based on the position popOverType: modalPropTypes.type, }; diff --git a/src/components/Popover/index.js b/src/components/Popover/index.js index 709a845b56bb..3231ccfd4f25 100644 --- a/src/components/Popover/index.js +++ b/src/components/Popover/index.js @@ -3,21 +3,42 @@ import {propTypes, defaultProps} from './PopoverPropTypes'; import CONST from '../../CONST'; import Modal from '../Modal'; import withWindowDimensions from '../withWindowDimensions'; +import styles from '../../styles/styles'; /* * This is a convenience wrapper around the Modal component for a responsive Popover. * On small screen widths, it uses BottomDocked modal type, and a Popover type on wide screen widths. */ -const Popover = props => ( - { + /** + * Get the anchor position using the type of the modal into account + * @param {String} type + * @returns {Object} + */ + function getAnchorPosition(type) { + switch (type) { + case CONST.MODAL.MODAL_TYPE.POPOVER_LEFT_DOCKED: + return styles.createMenuPositionSidebar; + case CONST.MODAL.MODAL_TYPE.POPOVER_CENTER_BOTTOM: + return styles.createMenuPositionReportCompose; + case CONST.MODAL.MODAL_TYPE.POPOVER_RIGHT_DOCKED: + return styles.createMenuPositionProfile; + default: + return styles.createMenuPositionSidebar; + } + } + + return ( + -); + {...props} + animationIn={props.isSmallScreenWidth ? undefined : props.animationIn} + animationOut={props.isSmallScreenWidth ? undefined : props.animationOut} + /> + ); +}; Popover.propTypes = propTypes; Popover.defaultProps = defaultProps; diff --git a/src/styles/styles.js b/src/styles/styles.js index 98df6b7cd35a..aa113a06bea3 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -506,7 +506,7 @@ const styles = { createMenuPositionReportCompose: { left: 18 + variables.sideBarWidth, - bottom: 100, + bottom: 75, }, createMenuContainer: { From d1a2aa5c825d14ba9c8b43ecf69fca9f13dba393 Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Mon, 12 Apr 2021 15:45:00 +0300 Subject: [PATCH 219/380] refactor: NavigationRoot extract `renderFallback` --- src/libs/Navigation/NavigationRoot.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/libs/Navigation/NavigationRoot.js b/src/libs/Navigation/NavigationRoot.js index a7e781abecb4..af069c741e4e 100644 --- a/src/libs/Navigation/NavigationRoot.js +++ b/src/libs/Navigation/NavigationRoot.js @@ -1,6 +1,6 @@ import _ from 'underscore'; import React, {Component} from 'react'; -import {ActivityIndicator, Linking, View} from 'react-native'; +import {Linking} from 'react-native'; import PropTypes from 'prop-types'; import { getStateFromPath, @@ -14,10 +14,9 @@ import AppNavigator from './AppNavigator'; import getPathName from './getPathName'; import ONYXKEYS from '../../ONYXKEYS'; import ROUTES from '../../ROUTES'; -import styles from '../../styles/styles'; -import themeColors from '../../styles/themes/default'; import {updateCurrentlyViewedReportID} from '../actions/Report'; import {setCurrentURL} from '../actions/App'; +import FullScreenLoadingIndicator from '../../components/FullscreenLoadingIndicator'; const propTypes = { // Whether the current user is logged in with an authToken @@ -82,13 +81,17 @@ class NavigationRoot extends Component { }); } + /** + * Render some fallback content until the navigation is ready + * @returns {JSX.Element} + */ + renderFallback() { + return ; + } + render() { if (this.state.loading) { - return ( - - - - ); + return this.renderFallback(); } // If we are on web, desktop, or a widescreen width we will use our custom navigator to create the wider layout From ceac113bfe45d96cad4101b2783f32d8e9c3e4d1 Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Mon, 12 Apr 2021 16:06:12 +0300 Subject: [PATCH 220/380] refactor: NavigationRoot extract change handler --- src/libs/Navigation/NavigationRoot.js | 38 ++++++++++++++++----------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/src/libs/Navigation/NavigationRoot.js b/src/libs/Navigation/NavigationRoot.js index af069c741e4e..5d58eeb9bd90 100644 --- a/src/libs/Navigation/NavigationRoot.js +++ b/src/libs/Navigation/NavigationRoot.js @@ -38,6 +38,8 @@ class NavigationRoot extends Component { loading: true, initialState: undefined, }; + + this.handleStateChange = this.handleStateChange.bind(this); } componentDidMount() { @@ -81,6 +83,26 @@ class NavigationRoot extends Component { }); } + /** + * Intercept state changes and perform different logic + * @param {NavigationState} state + */ + handleStateChange(state) { + if (!state) { + return; + } + + const path = getPathFromState(state, linkingConfig.config); + if (path.includes(ROUTES.REPORT)) { + const reportID = Number(_.last(path.split('/'))); + if (reportID && !_.isNaN(reportID)) { + updateCurrentlyViewedReportID(reportID); + } + } + + setCurrentURL(path); + } + /** * Render some fallback content until the navigation is ready * @returns {JSX.Element} @@ -98,21 +120,7 @@ class NavigationRoot extends Component { return ( { - if (!state) { - return; - } - - const path = getPathFromState(state, linkingConfig.config); - if (path.includes(ROUTES.REPORT)) { - const reportID = Number(_.last(path.split('/'))); - if (reportID && !_.isNaN(reportID)) { - updateCurrentlyViewedReportID(reportID); - } - } - - setCurrentURL(path); - }} + onStateChange={this.handleStateChange} ref={navigationRef} linking={linkingConfig} documentTitle={{ From 0c539481c44fe57ab0fca0878a81c19c7c780b2d Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Mon, 12 Apr 2021 17:17:47 +0300 Subject: [PATCH 221/380] refactor: NavigationRoot remove Linking handling With the current configuration it should be possible for the navigation to resolve initial state entirely through `linkingConfig` --- src/libs/Navigation/NavigationRoot.js | 85 +-------------------------- 1 file changed, 3 insertions(+), 82 deletions(-) diff --git a/src/libs/Navigation/NavigationRoot.js b/src/libs/Navigation/NavigationRoot.js index 5d58eeb9bd90..0b6707b70a0f 100644 --- a/src/libs/Navigation/NavigationRoot.js +++ b/src/libs/Navigation/NavigationRoot.js @@ -1,18 +1,10 @@ import _ from 'underscore'; import React, {Component} from 'react'; -import {Linking} from 'react-native'; import PropTypes from 'prop-types'; -import { - getStateFromPath, - getPathFromState, - NavigationContainer, -} from '@react-navigation/native'; -import {withOnyx} from 'react-native-onyx'; +import {getPathFromState, NavigationContainer} from '@react-navigation/native'; import {navigationRef} from './Navigation'; import linkingConfig from './linkingConfig'; import AppNavigator from './AppNavigator'; -import getPathName from './getPathName'; -import ONYXKEYS from '../../ONYXKEYS'; import ROUTES from '../../ROUTES'; import {updateCurrentlyViewedReportID} from '../actions/Report'; import {setCurrentURL} from '../actions/App'; @@ -21,68 +13,15 @@ import FullScreenLoadingIndicator from '../../components/FullscreenLoadingIndica const propTypes = { // Whether the current user is logged in with an authToken authenticated: PropTypes.bool.isRequired, - - // The current reportID that we are navigated to or should show in the ReportScreen - currentlyViewedReportID: PropTypes.string, -}; - -const defaultProps = { - currentlyViewedReportID: null, }; class NavigationRoot extends Component { constructor(props) { super(props); - this.state = { - loading: true, - initialState: undefined, - }; - this.handleStateChange = this.handleStateChange.bind(this); } - componentDidMount() { - Linking.getInitialURL() - .then((initialUrl) => { - // On web we should be able to parse this. It will be null on native for now until deep links are - // hooked up - const path = getPathName(initialUrl); - let initialState = getStateFromPath(path, linkingConfig.config); - setCurrentURL(path); - - // If we are landing on something other than the report screen or site root then we MUST set the - // initial route to the currently viewed report so there some history to navigate back from - if (path !== `/${ROUTES.HOME}` && !path.includes(`/${ROUTES.REPORT}`)) { - const homeRoute = { - name: 'Home', - }; - - if (this.props.currentlyViewedReportID) { - homeRoute.params = { - screen: 'Report', - params: { - reportID: this.props.currentlyViewedReportID, - }, - }; - } - - if (!initialState) { - initialState = { - routes: [], - }; - } - - initialState.routes = [ - homeRoute, - ...initialState.routes, - ]; - } - - this.setState({loading: false, initialState}); - }); - } - /** * Intercept state changes and perform different logic * @param {NavigationState} state @@ -103,23 +42,10 @@ class NavigationRoot extends Component { setCurrentURL(path); } - /** - * Render some fallback content until the navigation is ready - * @returns {JSX.Element} - */ - renderFallback() { - return ; - } - render() { - if (this.state.loading) { - return this.renderFallback(); - } - - // If we are on web, desktop, or a widescreen width we will use our custom navigator to create the wider layout return ( } onStateChange={this.handleStateChange} ref={navigationRef} linking={linkingConfig} @@ -134,9 +60,4 @@ class NavigationRoot extends Component { } NavigationRoot.propTypes = propTypes; -NavigationRoot.defaultProps = defaultProps; -export default withOnyx({ - currentlyViewedReportID: { - key: ONYXKEYS.CURRENTLY_VIEWED_REPORTID, - }, -})(NavigationRoot); +export default NavigationRoot; From d47683ea2258326f571a5346fe5830b6dea10dab Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Mon, 12 Apr 2021 17:26:25 +0300 Subject: [PATCH 222/380] feat: AuthScreens setup initial Home screen params 1. Either initial report data is available right from the start from Onyx 2. Or it is fetched and restored by `fetchAllReports` 3. Or if all else fails start with no report opened --- .../Navigation/AppNavigator/AuthScreens.js | 41 ++++++++++++++++++- src/libs/Navigation/linkingConfig.js | 2 +- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.js b/src/libs/Navigation/AppNavigator/AuthScreens.js index 3f4f2c5ee360..9f13d9261105 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.js +++ b/src/libs/Navigation/AppNavigator/AuthScreens.js @@ -56,11 +56,16 @@ const modalScreenListeners = { const propTypes = { network: PropTypes.shape({isOffline: PropTypes.bool}), + + /* The initial report for the home screen */ + initialReportID: PropTypes.string, + ...windowDimensionsPropTypes, }; const defaultProps = { network: {isOffline: true}, + initialReportID: null, }; class AuthScreens extends React.Component { @@ -69,6 +74,10 @@ class AuthScreens extends React.Component { Timing.start(CONST.TIMING.HOMEPAGE_INITIAL_RENDER); Timing.start(CONST.TIMING.HOMEPAGE_REPORTS_LOADED); + + if (props.initialReportID) { + this.setInitialHomeParams(props.initialReportID); + } } componentDidMount() { @@ -109,11 +118,20 @@ class AuthScreens extends React.Component { }, ['meta'], true); } - shouldComponentUpdate(prevProps) { - if (prevProps.isSmallScreenWidth !== this.props.isSmallScreenWidth) { + shouldComponentUpdate(nextProps) { + if (nextProps.isSmallScreenWidth !== this.props.isSmallScreenWidth) { return true; } + // Update initialHomeParams only once + if (!this.initialHomeParams) { + // Either we have a reportID or fetchAllReports resolved with no reports. Otherwise keep waiting + if (nextProps.initialReportID || nextProps.initialReportID === '') { + this.setInitialHomeParams(nextProps.initialReportID); + return true; + } + } + return false; } @@ -124,7 +142,22 @@ class AuthScreens extends React.Component { this.interval = null; } + /** + * Setting the initial params would update the URL in the address bar to correctly + * It would also setup correct initial state for the Home screen + * + * @param {String} reportID + */ + setInitialHomeParams(reportID) { + this.initialHomeParams = { + screen: 'Report', + params: {reportID}, + }; + } + render() { + if (!this.initialHomeParams) { return null; } + const modalScreenOptions = { headerShown: false, cardStyle: getNavigationModalCardStyle(this.props.isSmallScreenWidth), @@ -147,6 +180,7 @@ class AuthScreens extends React.Component { headerShown: false, title: 'Expensify.cash', }} + initialParams={this.initialHomeParams} component={MainDrawerNavigator} /> @@ -210,5 +244,8 @@ export default compose( network: { key: ONYXKEYS.NETWORK, }, + initialReportID: { + key: ONYXKEYS.CURRENTLY_VIEWED_REPORTID, + }, }), )(AuthScreens); diff --git a/src/libs/Navigation/linkingConfig.js b/src/libs/Navigation/linkingConfig.js index b24e916ab1ec..b3a3ee95d93c 100644 --- a/src/libs/Navigation/linkingConfig.js +++ b/src/libs/Navigation/linkingConfig.js @@ -11,7 +11,7 @@ export default { config: { screens: { Home: { - path: '', + path: ROUTES.HOME, initialRouteName: 'Report', screens: { // Report route From 6c59da5654acd96c8099f48b89b049640d79eab9 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Mon, 12 Apr 2021 14:37:23 +0000 Subject: [PATCH 223/380] Update version to 1.0.18-4 --- android/app/build.gradle | 4 ++-- ios/ExpensifyCash/Info.plist | 2 +- ios/ExpensifyCashTests/Info.plist | 2 +- package-lock.json | 2 +- package.json | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 507dd44a2106..aa334208ef2c 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -148,8 +148,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001001803 - versionName "1.0.18-3" + versionCode 1001001804 + versionName "1.0.18-4" } splits { abi { diff --git a/ios/ExpensifyCash/Info.plist b/ios/ExpensifyCash/Info.plist index 36780a26e08b..a3fb1c9fd8de 100644 --- a/ios/ExpensifyCash/Info.plist +++ b/ios/ExpensifyCash/Info.plist @@ -30,7 +30,7 @@ CFBundleVersion - 1.0.18.3 + 1.0.18.4 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/ExpensifyCashTests/Info.plist b/ios/ExpensifyCashTests/Info.plist index 2d0e771ae114..908d6390af93 100644 --- a/ios/ExpensifyCashTests/Info.plist +++ b/ios/ExpensifyCashTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.0.18.3 + 1.0.18.4 diff --git a/package-lock.json b/package-lock.json index aee7a4ccb156..a3813d5f0500 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.18-3", + "version": "1.0.18-4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index eca697980711..b691a0321f11 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.18-3", + "version": "1.0.18-4", "author": "Expensify, Inc.", "homepage": "https://expensify.cash", "description": "Expensify.cash is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", From 8686b1fef8d2e5d229394f6db7471a8262c40c82 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Mon, 12 Apr 2021 15:51:56 +0000 Subject: [PATCH 224/380] Update version to 1.0.18-5 --- android/app/build.gradle | 4 ++-- ios/ExpensifyCash/Info.plist | 2 +- ios/ExpensifyCashTests/Info.plist | 2 +- package-lock.json | 2 +- package.json | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index aa334208ef2c..8b5f52639af6 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -148,8 +148,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001001804 - versionName "1.0.18-4" + versionCode 1001001805 + versionName "1.0.18-5" } splits { abi { diff --git a/ios/ExpensifyCash/Info.plist b/ios/ExpensifyCash/Info.plist index a3fb1c9fd8de..00b6893f6a59 100644 --- a/ios/ExpensifyCash/Info.plist +++ b/ios/ExpensifyCash/Info.plist @@ -30,7 +30,7 @@ CFBundleVersion - 1.0.18.4 + 1.0.18.5 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/ExpensifyCashTests/Info.plist b/ios/ExpensifyCashTests/Info.plist index 908d6390af93..4e65953c21a3 100644 --- a/ios/ExpensifyCashTests/Info.plist +++ b/ios/ExpensifyCashTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.0.18.4 + 1.0.18.5 diff --git a/package-lock.json b/package-lock.json index a3813d5f0500..f3d9328f8da7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.18-4", + "version": "1.0.18-5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b691a0321f11..4ffa05b44d09 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.18-4", + "version": "1.0.18-5", "author": "Expensify, Inc.", "homepage": "https://expensify.cash", "description": "Expensify.cash is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", From 87c3b3dbf5045b196eacf2d89554a3cd2d74586f Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Mon, 12 Apr 2021 09:02:19 -0700 Subject: [PATCH 225/380] use currentTimezone where applicable --- src/libs/Navigation/AppNavigator/AuthScreens.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.js b/src/libs/Navigation/AppNavigator/AuthScreens.js index 76b55fb3c5a8..7895820f2063 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.js +++ b/src/libs/Navigation/AppNavigator/AuthScreens.js @@ -53,7 +53,7 @@ Onyx.connect({ // If the current timezone is different than the user's timezone, and their timezone is set to automatic // then update their timezone. if (_.isObject(timezone) && timezone.automatic && timezone.selected !== currentTimezone) { - timezone.selected = moment.tz.guess(true); + timezone.selected = currentTimezone; PersonalDetails.setPersonalDetails({timezone}); } }, From b465ce39661d5e9c0d1a9e85e3bad6c8b6bd5472 Mon Sep 17 00:00:00 2001 From: Marc Glasser Date: Mon, 12 Apr 2021 06:30:21 -1000 Subject: [PATCH 226/380] Move indicator into ReportActionItem --- src/pages/home/report/ReportActionItem.js | 6 ++++++ src/pages/home/report/ReportActionsView.js | 13 ++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index 3cc279702809..4079b543833a 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -13,6 +13,7 @@ import PopoverWithMeasuredContent from '../../../components/PopoverWithMeasuredC import ReportActionItemSingle from './ReportActionItemSingle'; import ReportActionItemGrouped from './ReportActionItemGrouped'; import ReportActionContextMenu from './ReportActionContextMenu'; +import UnreadActionIndicator from '../../../components/UnreadActionIndicator'; const propTypes = { // The ID of the report this action is on. @@ -23,6 +24,9 @@ const propTypes = { // Should the comment have the appearance of being grouped with the previous comment? displayAsGroup: PropTypes.bool.isRequired, + + // Should we display the new indicator on top of the comment? + shouldDisplayNewIndicator: PropTypes.bool.isRequired, }; class ReportActionItem extends Component { @@ -46,6 +50,7 @@ class ReportActionItem extends Component { shouldComponentUpdate(nextProps, nextState) { return this.state.isPopoverVisible !== nextState.isPopoverVisible || this.props.displayAsGroup !== nextProps.displayAsGroup + || (this.props.shouldDisplayNewIndicator !== nextProps.shouldDisplayNewIndicator) || !_.isEqual(this.props.action, nextProps.action); } @@ -85,6 +90,7 @@ class ReportActionItem extends Component { {hovered => ( + {this.props.shouldDisplayNewIndicator && } {!this.props.displayAsGroup ? diff --git a/src/pages/home/report/ReportActionsView.js b/src/pages/home/report/ReportActionsView.js index e40993b6a1f1..b46f363794ff 100644 --- a/src/pages/home/report/ReportActionsView.js +++ b/src/pages/home/report/ReportActionsView.js @@ -10,7 +10,6 @@ import _ from 'underscore'; import lodashGet from 'lodash/get'; import {withOnyx} from 'react-native-onyx'; import Text from '../../../components/Text'; -import UnreadActionIndicator from '../../../components/UnreadActionIndicator'; import { fetchActions, updateLastReadActionID, @@ -280,18 +279,18 @@ class ReportActionsView extends React.Component { }) { return ( - // Using instead of a Fragment because there is a difference between how - // are implemented on native and web/desktop which leads to - // the unread indicator on native to render below the message instead of above it. + // Using instead of a Fragment because there is a difference between how are + // implemented on native and web/desktop which leads to the unread indicator on native to render below the + // message instead of above it. - {this.initialUnreadActionCount > 0 && index === this.initialUnreadActionCount - 1 && ( - - )} 0 + && index === this.initialUnreadActionCount - 1 + } /> ); From 73911c40af86a5eea478c9970f5810730a233cf9 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Mon, 12 Apr 2021 16:37:41 +0000 Subject: [PATCH 227/380] Update version to 1.0.18-6 --- android/app/build.gradle | 4 ++-- ios/ExpensifyCash/Info.plist | 2 +- ios/ExpensifyCashTests/Info.plist | 2 +- package-lock.json | 2 +- package.json | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 8b5f52639af6..9f340761222c 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -148,8 +148,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001001805 - versionName "1.0.18-5" + versionCode 1001001806 + versionName "1.0.18-6" } splits { abi { diff --git a/ios/ExpensifyCash/Info.plist b/ios/ExpensifyCash/Info.plist index 00b6893f6a59..6fe6f939e218 100644 --- a/ios/ExpensifyCash/Info.plist +++ b/ios/ExpensifyCash/Info.plist @@ -30,7 +30,7 @@ CFBundleVersion - 1.0.18.5 + 1.0.18.6 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/ExpensifyCashTests/Info.plist b/ios/ExpensifyCashTests/Info.plist index 4e65953c21a3..f54dfcfa3508 100644 --- a/ios/ExpensifyCashTests/Info.plist +++ b/ios/ExpensifyCashTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.0.18.5 + 1.0.18.6 diff --git a/package-lock.json b/package-lock.json index f3d9328f8da7..0c4844b1cbfa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.18-5", + "version": "1.0.18-6", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 4ffa05b44d09..906f7906aeb5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.18-5", + "version": "1.0.18-6", "author": "Expensify, Inc.", "homepage": "https://expensify.cash", "description": "Expensify.cash is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", From 270a74442e5f6bf009d52bb85a2f685ed187b6bd Mon Sep 17 00:00:00 2001 From: OSBotify Date: Mon, 12 Apr 2021 16:40:26 +0000 Subject: [PATCH 228/380] Update version to 1.0.18-7 --- android/app/build.gradle | 4 ++-- ios/ExpensifyCash/Info.plist | 2 +- ios/ExpensifyCashTests/Info.plist | 2 +- package-lock.json | 2 +- package.json | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 9f340761222c..2ad4f5cd0ca5 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -148,8 +148,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001001806 - versionName "1.0.18-6" + versionCode 1001001807 + versionName "1.0.18-7" } splits { abi { diff --git a/ios/ExpensifyCash/Info.plist b/ios/ExpensifyCash/Info.plist index 6fe6f939e218..0246fbfe6a40 100644 --- a/ios/ExpensifyCash/Info.plist +++ b/ios/ExpensifyCash/Info.plist @@ -30,7 +30,7 @@ CFBundleVersion - 1.0.18.6 + 1.0.18.7 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/ExpensifyCashTests/Info.plist b/ios/ExpensifyCashTests/Info.plist index f54dfcfa3508..2479d6678bff 100644 --- a/ios/ExpensifyCashTests/Info.plist +++ b/ios/ExpensifyCashTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.0.18.6 + 1.0.18.7 diff --git a/package-lock.json b/package-lock.json index 0c4844b1cbfa..75d191fc25cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.18-6", + "version": "1.0.18-7", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 906f7906aeb5..6162ffe9c5f9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.18-6", + "version": "1.0.18-7", "author": "Expensify, Inc.", "homepage": "https://expensify.cash", "description": "Expensify.cash is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", From 6a382c1946397a5e07fb0cd94b49c190b13fd99c Mon Sep 17 00:00:00 2001 From: tugbadogan Date: Mon, 12 Apr 2021 18:07:59 +0100 Subject: [PATCH 229/380] Addressing comments --- src/components/BigNumberPad.js | 76 +++++++--------------- src/components/TextInputAutoGrow.js | 31 ++++----- src/components/TextInputFocusable/index.js | 4 +- src/pages/iou/steps/IOUAmountPage.js | 1 - src/styles/styles.js | 2 + 5 files changed, 41 insertions(+), 73 deletions(-) diff --git a/src/components/BigNumberPad.js b/src/components/BigNumberPad.js index 3f12fdacaa62..8181cb67e9a9 100644 --- a/src/components/BigNumberPad.js +++ b/src/components/BigNumberPad.js @@ -1,7 +1,8 @@ -import React, {PureComponent} from 'react'; +import React from 'react'; import { Text, TouchableOpacity, View, } from 'react-native'; +import _ from 'underscore'; import PropTypes from 'prop-types'; import styles from '../styles/styles'; @@ -17,57 +18,30 @@ const padNumbers = [ ['.', '0', '<'], ]; -class BigNumberPad extends PureComponent { - /** - * Creates set of buttons for given row - * - * @param {number} row - * @returns {View} - */ - createNumberPadRow(row) { - const self = this; - const numberPadRow = padNumbers[row].map((column, index) => self.createNumberPadButton(row, index)); - return ( - - {numberPadRow} +const BigNumberPad = ({numberPressed}) => ( + + {_.map(padNumbers, (row, rowIndex) => ( + + {_.map(row, (column, columnIndex) => { + // Adding margin between buttons except first column to + // avoid unccessary space before the first column. + const marginLeft = columnIndex > 0 ? styles.ml3 : {}; + return ( + numberPressed(column)} + > + + {column} + + + ); + })} - ); - } - - /** - * Creates a button for given row and column - * - * @param {number} row - * @param {number} column - * @returns {View} - */ - createNumberPadButton(row, column) { - // Adding margin between buttons except first column to - // avoid unccessary space before the first column. - const marginLeft = column > 0 ? styles.ml3 : {}; - return ( - this.props.numberPressed(padNumbers[row][column])} - > - - {padNumbers[row][column]} - - - ); - } - - render() { - const self = this; - const numberPad = padNumbers.map((row, index) => self.createNumberPadRow(index)); - return ( - - {numberPad} - - ); - } -} + ))} + +); BigNumberPad.propTypes = propTypes; BigNumberPad.displayName = 'BigNumberPad'; diff --git a/src/components/TextInputAutoGrow.js b/src/components/TextInputAutoGrow.js index ca2200d47f26..b60d367029a0 100644 --- a/src/components/TextInputAutoGrow.js +++ b/src/components/TextInputAutoGrow.js @@ -39,24 +39,6 @@ class TextInputAutoGrow extends React.Component { }; } - /** - * Text input component doesn't support auto grow by default. We're using a hidden text input to achieve that. - * This text view is used to calculate width of the input value given textStyle in this component. - * This text component is intentionally positioned out of the screen. - * - * @returns {Text} - */ - getHiddenTextView() { - return ( - this.setState({textInputWidth: e.nativeEvent.layout.width})} - > - {this.props.value} - - ); - } - render() { const propsWithoutStyles = _.omit( this.props, @@ -70,7 +52,18 @@ class TextInputAutoGrow extends React.Component { /* eslint-disable-next-line react/jsx-props-no-spreading */ {...propsWithoutStyles} /> - {this.getHiddenTextView()} + {/* + Text input component doesn't support auto grow by default. + We're using a hidden text input to achieve that. + This text view is used to calculate width of the input value given textStyle in this component. + This text component is intentionally positioned out of the screen. + */} + this.setState({textInputWidth: e.nativeEvent.layout.width})} + > + {this.props.value} + ); } diff --git a/src/components/TextInputFocusable/index.js b/src/components/TextInputFocusable/index.js index f10d98c3d138..d7a6638aa3ce 100644 --- a/src/components/TextInputFocusable/index.js +++ b/src/components/TextInputFocusable/index.js @@ -43,8 +43,8 @@ const propTypes = { }; const defaultProps = { - defaultValue: undefined, - value: undefined, + defaultValue: '', + value: '', maxLines: -1, onPasteFile: () => {}, shouldClear: false, diff --git a/src/pages/iou/steps/IOUAmountPage.js b/src/pages/iou/steps/IOUAmountPage.js index 6301d4b6c25c..7277c1062a1d 100644 --- a/src/pages/iou/steps/IOUAmountPage.js +++ b/src/pages/iou/steps/IOUAmountPage.js @@ -115,7 +115,6 @@ class IOUAmountPage extends React.Component { }} ref={el => this.textInput = el} value={this.state.amount} - textAlign="left" /> )} diff --git a/src/styles/styles.js b/src/styles/styles.js index 40f87db3f461..42b540589c5f 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -1231,12 +1231,14 @@ const styles = { fontFamily: fontFamily.GTA_BOLD, fontWeight: fontWeightBold, fontSize: variables.iouAmountTextSize, + color: themeColors.heading, }, iouAmountTextInput: addOutlineWidth({ fontFamily: fontFamily.GTA_BOLD, fontWeight: fontWeightBold, fontSize: variables.iouAmountTextSize, + color: themeColors.heading, }, 0), noScrollbars: { From 107b163679cc3945f79d44806a75c4da4e78730f Mon Sep 17 00:00:00 2001 From: OSBotify Date: Mon, 12 Apr 2021 17:20:59 +0000 Subject: [PATCH 230/380] Update version to 1.0.19-0 --- android/app/build.gradle | 4 ++-- ios/ExpensifyCash/Info.plist | 4 ++-- ios/ExpensifyCashTests/Info.plist | 4 ++-- package-lock.json | 2 +- package.json | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 2ad4f5cd0ca5..a7a68b22f6d4 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -148,8 +148,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001001807 - versionName "1.0.18-7" + versionCode 1001001900 + versionName "1.0.19-0" } splits { abi { diff --git a/ios/ExpensifyCash/Info.plist b/ios/ExpensifyCash/Info.plist index 0246fbfe6a40..1b6c540a3280 100644 --- a/ios/ExpensifyCash/Info.plist +++ b/ios/ExpensifyCash/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0.18 + 1.0.19 CFBundleSignature ???? CFBundleURLTypes @@ -30,7 +30,7 @@ CFBundleVersion - 1.0.18.7 + 1.0.19.0 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/ExpensifyCashTests/Info.plist b/ios/ExpensifyCashTests/Info.plist index 2479d6678bff..ebe9c3233f33 100644 --- a/ios/ExpensifyCashTests/Info.plist +++ b/ios/ExpensifyCashTests/Info.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 1.0.18 + 1.0.19 CFBundleSignature ???? CFBundleVersion - 1.0.18.7 + 1.0.19.0 diff --git a/package-lock.json b/package-lock.json index 75d191fc25cb..ab0a46a9e07d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.18-7", + "version": "1.0.19-0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 6162ffe9c5f9..9815a5516bbd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.18-7", + "version": "1.0.19-0", "author": "Expensify, Inc.", "homepage": "https://expensify.cash", "description": "Expensify.cash is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", From e811b70944ae4da4fccea1f2809f0c9dee2d2564 Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Mon, 12 Apr 2021 20:32:32 +0300 Subject: [PATCH 231/380] refactor: BaseCreateMenu rename `onModalHide` to `onMenuHide` --- src/components/CreateMenu/BaseCreateMenu.js | 6 +++--- src/components/CreateMenu/index.native.js | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/CreateMenu/BaseCreateMenu.js b/src/components/CreateMenu/BaseCreateMenu.js index 77ae28cf69da..667158645ae5 100644 --- a/src/components/CreateMenu/BaseCreateMenu.js +++ b/src/components/CreateMenu/BaseCreateMenu.js @@ -9,14 +9,14 @@ import createMenuPropTypes from './CreateMenuPropTypes'; const propTypes = { // Callback fired when the menu is completely closed - onModalHide: PropTypes.func, + onMenuHide: PropTypes.func, ...createMenuPropTypes, ...windowDimensionsPropTypes, }; const defaultProps = { - onModalHide: () => {}, + onMenuHide: () => {}, }; class BaseCreateMenu extends PureComponent { @@ -25,7 +25,7 @@ class BaseCreateMenu extends PureComponent { diff --git a/src/components/CreateMenu/index.native.js b/src/components/CreateMenu/index.native.js index 2f044ac961a1..043da3819853 100644 --- a/src/components/CreateMenu/index.native.js +++ b/src/components/CreateMenu/index.native.js @@ -9,15 +9,15 @@ import createMenuPropTypes from './CreateMenuPropTypes'; */ class CreateMenu extends Component { /** - * Set the item's `onSelected` action to fire after the modal closes + * Set the item's `onSelected` action to fire after the menu popup closes * @param {{onSelected: function}} item */ selectItem(item) { - this.onModalHide = () => { + this.onMenuHide = () => { item.onSelected(); - // Clean up so that open and cancel does not trigger the same action - this.onModalHide = () => {}; + // Clean up: open and immediately cancel should not re-trigger the last action + this.onMenuHide = () => {}; }; this.props.onItemSelected(item); @@ -28,7 +28,7 @@ class CreateMenu extends Component { this.selectItem(item)} /> ); From 126274056af87da3e25ff1a0005df9b573f3148c Mon Sep 17 00:00:00 2001 From: Marc Glasser Date: Mon, 12 Apr 2021 07:48:19 -1000 Subject: [PATCH 232/380] Use maxSequenceNumber since chats can be paginated --- src/pages/home/report/ReportActionsView.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/pages/home/report/ReportActionsView.js b/src/pages/home/report/ReportActionsView.js index b46f363794ff..4f17d0931cb3 100644 --- a/src/pages/home/report/ReportActionsView.js +++ b/src/pages/home/report/ReportActionsView.js @@ -37,6 +37,9 @@ const propTypes = { report: PropTypes.shape({ // Number of actions unread unreadActionCount: PropTypes.number, + + // The largest sequenceNumber on this report + maxSequenceNumber: PropTypes.number, }), // Array of report actions for this report @@ -52,6 +55,7 @@ const propTypes = { const defaultProps = { report: { unreadActionCount: 0, + maxSequenceNumber: 0, }, reportActions: {}, session: {}, @@ -70,8 +74,9 @@ class ReportActionsView extends React.Component { this.sortedReportActions = []; this.timers = []; - // Helper variable that keeps track of the unread action count before it updates to zero - this.unreadActionCount = 0; + this.initialNewMarkerPosition = props.report.unreadActionCount === 0 + ? 0 + : (props.report.maxSequenceNumber + 1) - props.report.unreadActionCount; this.state = { isLoadingMoreChats: false, @@ -86,7 +91,6 @@ class ReportActionsView extends React.Component { this.keyboardEvent = Keyboard.addListener('keyboardDidShow', this.scrollToListBottom); this.recordMaxAction(); fetchActions(this.props.reportID); - this.initialUnreadActionCount = this.props.report.unreadActionCount; Timing.end(CONST.TIMING.SWITCH_REPORT, CONST.TIMING.COLD); } @@ -288,9 +292,8 @@ class ReportActionsView extends React.Component { action={item.action} displayAsGroup={this.isConsecutiveActionMadeByPreviousActor(index)} onLayout={onLayout} - shouldDisplayNewIndicator={this.initialUnreadActionCount > 0 - && index === this.initialUnreadActionCount - 1 - } + shouldDisplayNewIndicator={this.initialNewMarkerPosition > 0 + && item.action.sequenceNumber === this.initialNewMarkerPosition} /> ); From f3c0c40e63c01f19b3ce0524f1bc255114b0b6ca Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 12 Apr 2021 13:11:03 -0600 Subject: [PATCH 233/380] fix scuffed merge --- src/components/PopoverWithMeasuredContent.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/PopoverWithMeasuredContent.js b/src/components/PopoverWithMeasuredContent.js index 293be0b8f4c0..71bb3841025e 100644 --- a/src/components/PopoverWithMeasuredContent.js +++ b/src/components/PopoverWithMeasuredContent.js @@ -126,7 +126,7 @@ class PopoverWithMeasuredContent extends Component { {...this.props} anchorPosition={this.calculateAdjustedAnchorPosition()} > - {this.props.measureContent()} + {this.props.children} ) : ( From ee8e493734259f3870ddea260865f30c6bc8cad0 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 12 Apr 2021 13:12:36 -0600 Subject: [PATCH 234/380] fix comment --- src/pages/home/report/EmojiPickerMenu/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/home/report/EmojiPickerMenu/index.js b/src/pages/home/report/EmojiPickerMenu/index.js index 6e2e5a058d1a..af84ad522066 100644 --- a/src/pages/home/report/EmojiPickerMenu/index.js +++ b/src/pages/home/report/EmojiPickerMenu/index.js @@ -31,7 +31,7 @@ class EmojiPickerMenu extends Component { // This is the indices of each category of emojis // The positions are static, and are calculated as index/numColumns (8 in our case) // This is because each row of 8 emojis counts as one index - // If this emojis are ever added to emojis.js this will need to be updated or things will break + // If more emojis are ever added to emojis.js this will need to be updated or things will break this.unfilteredHeaderIndices = [0, 34, 60, 88, 99, 121, 148]; this.filterEmojis = _.debounce(this.filterEmojis.bind(this), 300, false); From 29546d1293dda91205d96803a60b180be6964e76 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 12 Apr 2021 13:13:25 -0600 Subject: [PATCH 235/380] remove unnecessary param since it's default --- src/pages/home/report/EmojiPickerMenu/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/home/report/EmojiPickerMenu/index.js b/src/pages/home/report/EmojiPickerMenu/index.js index af84ad522066..7a333431e531 100644 --- a/src/pages/home/report/EmojiPickerMenu/index.js +++ b/src/pages/home/report/EmojiPickerMenu/index.js @@ -34,7 +34,7 @@ class EmojiPickerMenu extends Component { // If more emojis are ever added to emojis.js this will need to be updated or things will break this.unfilteredHeaderIndices = [0, 34, 60, 88, 99, 121, 148]; - this.filterEmojis = _.debounce(this.filterEmojis.bind(this), 300, false); + this.filterEmojis = _.debounce(this.filterEmojis.bind(this), 300); this.renderItem = this.renderItem.bind(this); this.state = { From d508a078782d902b7322bd2d5ba4eb85dfb980ac Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 12 Apr 2021 13:37:02 -0600 Subject: [PATCH 236/380] remove unnecessary parens --- src/pages/home/report/EmojiPickerMenu/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/home/report/EmojiPickerMenu/index.js b/src/pages/home/report/EmojiPickerMenu/index.js index 7a333431e531..9a794fd656d1 100644 --- a/src/pages/home/report/EmojiPickerMenu/index.js +++ b/src/pages/home/report/EmojiPickerMenu/index.js @@ -116,7 +116,7 @@ class EmojiPickerMenu extends Component { (`emoji_picker_${item.code}`)} + keyExtractor={item => `emoji_picker_${item.code}`} numColumns={this.numColumns} style={styles.emojiPickerList} extraData={this.state.filteredEmojis} From 2c7e1963edb99716eca217c0a3bc58d8ae0868f6 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 12 Apr 2021 14:55:16 -0600 Subject: [PATCH 237/380] Add pressed state to button styles --- src/pages/home/report/EmojiPickerMenuItem.js | 7 ++++--- src/pages/home/report/ReportActionCompose.js | 11 ++++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/pages/home/report/EmojiPickerMenuItem.js b/src/pages/home/report/EmojiPickerMenuItem.js index 311884e76de8..5d139163ea6e 100644 --- a/src/pages/home/report/EmojiPickerMenuItem.js +++ b/src/pages/home/report/EmojiPickerMenuItem.js @@ -1,7 +1,8 @@ import React from 'react'; import PropTypes from 'prop-types'; import {Pressable, Text} from 'react-native'; -import styles from '../../../styles/styles'; +import styles, {getButtonBackgroundColorStyle} from '../../../styles/styles'; +import getButtonState from '../../../libs/getButtonState'; const propTypes = { // The unicode that is used to display the emoji @@ -14,9 +15,9 @@ const propTypes = { const EmojiPickerMenuItem = props => ( props.onPress(props.emoji)} - style={({hovered}) => ([ + style={({hovered, pressed}) => ([ styles.emojiItem, - hovered && styles.hoveredButton, + getButtonBackgroundColorStyle(getButtonState(hovered, pressed)), ])} > {props.emoji} diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index 41380d9293fb..dc12bae931c5 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -4,7 +4,7 @@ import {View, TouchableOpacity, Pressable} from 'react-native'; import _ from 'underscore'; import lodashGet from 'lodash/get'; import {withOnyx} from 'react-native-onyx'; -import styles from '../../../styles/styles'; +import styles, {getButtonBackgroundColorStyle, getIconFillColor} from '../../../styles/styles'; import themeColors from '../../../styles/themes/default'; import TextInputFocusable from '../../../components/TextInputFocusable'; import ONYXKEYS from '../../../ONYXKEYS'; @@ -22,6 +22,7 @@ import Popover from '../../../components/Popover'; import EmojiPickerMenu from './EmojiPickerMenu'; import withWindowDimensions from '../../../components/withWindowDimensions'; import withDrawerState from '../../../components/withDrawerState'; +import getButtonState from '../../../libs/getButtonState'; const propTypes = { // A method to call when the form is submitted @@ -356,16 +357,16 @@ class ReportActionCompose extends React.Component { /> ([ + style={({hovered, pressed}) => ([ styles.chatItemEmojiButton, - hovered && styles.hoveredButton, + getButtonBackgroundColorStyle(getButtonState(hovered, pressed)), ])} onPress={this.showEmojiPicker} > - {({hovered}) => ( + {({hovered, pressed}) => ( )} From 9b75d6dff81f3d02e7481a4ed326759391fd5f86 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 12 Apr 2021 14:56:25 -0600 Subject: [PATCH 238/380] Make comment more accurate --- src/pages/home/report/ReportActionCompose.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index dc12bae931c5..47bb5ab3f889 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -83,7 +83,7 @@ class ReportActionCompose extends React.Component { isEmojiPickerVisible: false, isMenuVisible: false, - // The horizontal and vertical position (relative to the screen) where the emoji popover will display. + // The horizontal and vertical position (relative to the window) where the emoji popover will display. emojiPopoverAnchorPosition: { horizontal: 0, vertical: 0, From 1b72fba123b55a8b7d82de64267063c08eb4f7de Mon Sep 17 00:00:00 2001 From: Rajat Parashar Date: Tue, 13 Apr 2021 02:36:51 +0530 Subject: [PATCH 239/380] fix: Url parsing in chat messages --- package-lock.json | 31846 +++++++++++++++++++++++++++++++++++++++++++- package.json | 2 +- 2 files changed, 31526 insertions(+), 322 deletions(-) diff --git a/package-lock.json b/package-lock.json index ab0a46a9e07d..452850b540fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,61 +1,177 @@ { "name": "expensify.cash", "version": "1.0.19-0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, - "dependencies": { - "7zip-bin": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.0.3.tgz", - "integrity": "sha512-GLyWIFBbGvpKPGo55JyRZAo4lVbnBiD52cKlw/0Vt+wnmKvWJkpZvsjVoaIolyBXDeAQKSicRtqFNPem9w0WYA==", - "dev": true + "packages": { + "": { + "name": "expensify.cash", + "version": "1.0.19-0", + "license": "MIT", + "dependencies": { + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/preset-flow": "^7.12.13", + "@formatjs/intl-getcanonicallocales": "^1.5.8", + "@formatjs/intl-locale": "^2.4.21", + "@formatjs/intl-numberformat": "^6.2.5", + "@formatjs/intl-pluralrules": "^4.0.13", + "@react-native-community/async-storage": "^1.11.0", + "@react-native-community/cli": "4.13.1", + "@react-native-community/clipboard": "^1.5.1", + "@react-native-community/masked-view": "^0.1.10", + "@react-native-community/netinfo": "^5.9.10", + "@react-native-community/progress-bar-android": "^1.0.4", + "@react-native-community/progress-view": "^1.2.3", + "@react-native-firebase/analytics": "^7.6.7", + "@react-native-firebase/app": "^8.4.5", + "@react-native-firebase/crashlytics": "^8.4.9", + "@react-native-picker/picker": "^1.9.11", + "@react-navigation/drawer": "5.12.5", + "@react-navigation/native": "5.9.2", + "@react-navigation/stack": "5.14.2", + "babel-plugin-transform-remove-console": "^6.9.4", + "dotenv": "^8.2.0", + "electron-context-menu": "^2.3.0", + "electron-log": "^4.2.4", + "electron-serve": "^1.0.0", + "electron-updater": "^4.3.4", + "expensify-common": "git+https://github.com/Expensify/expensify-common.git#d5edd0a956ef5c12fb6e9493d1f4608289f82a0e", + "file-loader": "^6.0.0", + "html-entities": "^1.3.1", + "lodash": "4.17.21", + "metro-config": "^0.64.0", + "moment": "^2.27.0", + "moment-timezone": "^0.5.31", + "prop-types": "^15.7.2", + "pusher-js": "^7.0.0", + "react": "^16.13.1", + "react-dom": "^16.13.1", + "react-native": "0.63.3", + "react-native-config": "^1.4.0", + "react-native-document-picker": "^4.0.0", + "react-native-gesture-handler": "1.9.0", + "react-native-image-pan-zoom": "^2.1.12", + "react-native-image-picker": "^2.3.3", + "react-native-keyboard-spacer": "^0.4.1", + "react-native-modal": "^11.5.6", + "react-native-onyx": "git+https://github.com/Expensify/react-native-onyx.git#3635fc34f00c8c8f97500b97fd42251ab4d22ab5", + "react-native-pdf": "^6.2.2", + "react-native-picker-select": "8.0.4", + "react-native-reanimated": "1.13.2", + "react-native-render-html": "^6.0.0-alpha.10", + "react-native-safe-area-context": "^3.1.4", + "react-native-screens": "2.17.1", + "react-native-svg": "^12.1.0", + "react-native-web": "^0.14.1", + "react-pdf": "^5.2.0", + "react-web-config": "^1.0.0", + "rn-fetch-blob": "^0.12.0", + "save": "^2.4.0", + "underscore": "^1.10.2", + "urbanairship-react-native": "^10.0.0" + }, + "devDependencies": { + "@actions/core": "^1.2.6", + "@actions/github": "^4.0.0", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/preset-flow": "^7.12.13", + "@babel/preset-react": "^7.10.4", + "@babel/runtime": "^7.11.2", + "@octokit/core": "^3.3.1", + "@octokit/rest": "^18.3.5", + "@react-native-community/eslint-config": "^2.0.0", + "@svgr/webpack": "^5.5.0", + "@testing-library/jest-native": "^3.4.2", + "@testing-library/react-native": "^7.0.2", + "@vercel/ncc": "^0.27.0", + "ajv-cli": "^5.0.0", + "babel-eslint": "^10.1.0", + "babel-jest": "^26.2.2", + "babel-loader": "^8.1.0", + "babel-plugin-module-resolver": "^4.0.0", + "babel-plugin-react-native-web": "^0.13.5", + "babel-plugin-transform-class-properties": "^6.24.1", + "clean-webpack-plugin": "^3.0.0", + "concurrently": "^5.3.0", + "copy-webpack-plugin": "^6.0.3", + "detox": "^17.8.3", + "diff-so-fancy": "^1.3.0", + "electron": "^9.2.0", + "electron-builder": "^22.8.0", + "electron-notarize": "^1.0.0", + "electron-reloader": "^1.2.0", + "eslint": "^7.6.0", + "eslint-config-expensify": "^2.0.15", + "eslint-loader": "^4.0.2", + "eslint-plugin-detox": "^1.0.0", + "eslint-plugin-jest": "^24.1.0", + "html-webpack-plugin": "^4.3.0", + "jest": "^26.5.2", + "jest-circus": "^26.5.2", + "jest-cli": "^26.5.2", + "metro-react-native-babel-preset": "^0.61.0", + "mock-fs": "^4.13.0", + "portfinder": "^1.0.28", + "pusher-js-mock": "^0.3.3", + "react-hot-loader": "^4.12.21", + "react-native-svg-transformer": "^0.14.3", + "react-test-renderer": "16.13.1", + "semver": "^7.3.4", + "wait-port": "^0.2.9", + "webpack": "^4.44.1", + "webpack-bundle-analyzer": "^4.4.0", + "webpack-cli": "^3.3.12", + "webpack-dev-server": "^3.11.0", + "webpack-merge": "^5.1.1" + } }, - "@actions/core": { + "node_modules/@actions/core": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.6.tgz", "integrity": "sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA==", "dev": true }, - "@actions/github": { + "node_modules/@actions/github": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@actions/github/-/github-4.0.0.tgz", "integrity": "sha512-Ej/Y2E+VV6sR9X7pWL5F3VgEWrABaT292DRqRU6R4hnQjPtC/zD3nagxVdXWiRQvYDh8kHXo7IDmG42eJ/dOMA==", "dev": true, - "requires": { + "dependencies": { "@actions/http-client": "^1.0.8", "@octokit/core": "^3.0.0", "@octokit/plugin-paginate-rest": "^2.2.3", "@octokit/plugin-rest-endpoint-methods": "^4.0.0" } }, - "@actions/http-client": { + "node_modules/@actions/http-client": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.9.tgz", "integrity": "sha512-0O4SsJ7q+MK0ycvXPl2e6bMXV7dxAXOGjrXS1eTF9s2S401Tp6c/P3c3Joz04QefC1J6Gt942Wl2jbm3f4mLcg==", "dev": true, - "requires": { + "dependencies": { "tunnel": "0.0.6" } }, - "@babel/code-frame": { + "node_modules/@babel/code-frame": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { + "dependencies": { "@babel/highlight": "^7.10.4" } }, - "@babel/compat-data": { + "node_modules/@babel/compat-data": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.1.tgz", "integrity": "sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ==", "dev": true }, - "@babel/core": { + "node_modules/@babel/core": { "version": "7.12.3", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", - "requires": { + "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/generator": "^7.12.1", "@babel/helper-module-transforms": "^7.12.1", @@ -73,85 +189,90 @@ "semver": "^5.4.1", "source-map": "^0.5.0" }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } + "engines": { + "node": ">=6.9.0" } }, - "@babel/generator": { + "node_modules/@babel/core/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/generator": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", - "requires": { + "dependencies": { "@babel/types": "^7.12.1", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, - "@babel/helper-annotate-as-pure": { + "node_modules/@babel/helper-annotate-as-pure": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", - "requires": { + "dependencies": { "@babel/types": "^7.10.4" } }, - "@babel/helper-builder-binary-assignment-operator-visitor": { + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", - "requires": { + "dependencies": { "@babel/helper-explode-assignable-expression": "^7.10.4", "@babel/types": "^7.10.4" } }, - "@babel/helper-builder-react-jsx": { + "node_modules/@babel/helper-builder-react-jsx": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz", "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", - "requires": { + "dependencies": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/types": "^7.10.4" } }, - "@babel/helper-builder-react-jsx-experimental": { + "node_modules/@babel/helper-builder-react-jsx-experimental": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.1.tgz", "integrity": "sha512-82to8lR7TofZWbTd3IEZT1xNHfeU/Ef4rDm/GLXddzqDh+yQ19QuGSzqww51aNxVH8rwfRIzL0EUQsvODVhtyw==", - "requires": { + "dependencies": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-module-imports": "^7.12.1", "@babel/types": "^7.12.1" } }, - "@babel/helper-compilation-targets": { + "node_modules/@babel/helper-compilation-targets": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz", "integrity": "sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g==", "dev": true, - "requires": { + "dependencies": { "@babel/compat-data": "^7.12.1", "@babel/helper-validator-option": "^7.12.1", "browserslist": "^4.12.0", "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } } }, - "@babel/helper-create-class-features-plugin": { + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", - "requires": { + "dependencies": { "@babel/helper-function-name": "^7.10.4", "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", @@ -159,82 +280,82 @@ "@babel/helper-split-export-declaration": "^7.10.4" } }, - "@babel/helper-create-regexp-features-plugin": { + "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", - "requires": { + "dependencies": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-regex": "^7.10.4", "regexpu-core": "^4.7.1" } }, - "@babel/helper-define-map": { + "node_modules/@babel/helper-define-map": { "version": "7.10.5", "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", - "requires": { + "dependencies": { "@babel/helper-function-name": "^7.10.4", "@babel/types": "^7.10.5", "lodash": "^4.17.19" } }, - "@babel/helper-explode-assignable-expression": { + "node_modules/@babel/helper-explode-assignable-expression": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", - "requires": { + "dependencies": { "@babel/types": "^7.12.1" } }, - "@babel/helper-function-name": { + "node_modules/@babel/helper-function-name": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { + "dependencies": { "@babel/helper-get-function-arity": "^7.10.4", "@babel/template": "^7.10.4", "@babel/types": "^7.10.4" } }, - "@babel/helper-get-function-arity": { + "node_modules/@babel/helper-get-function-arity": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { + "dependencies": { "@babel/types": "^7.10.4" } }, - "@babel/helper-hoist-variables": { + "node_modules/@babel/helper-hoist-variables": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.10.4" } }, - "@babel/helper-member-expression-to-functions": { + "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", - "requires": { + "dependencies": { "@babel/types": "^7.12.1" } }, - "@babel/helper-module-imports": { + "node_modules/@babel/helper-module-imports": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", - "requires": { + "dependencies": { "@babel/types": "^7.12.1" } }, - "@babel/helper-module-transforms": { + "node_modules/@babel/helper-module-transforms": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", - "requires": { + "dependencies": { "@babel/helper-module-imports": "^7.12.1", "@babel/helper-replace-supers": "^7.12.1", "@babel/helper-simple-access": "^7.12.1", @@ -246,501 +367,520 @@ "lodash": "^4.17.19" } }, - "@babel/helper-optimise-call-expression": { + "node_modules/@babel/helper-optimise-call-expression": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "requires": { + "dependencies": { "@babel/types": "^7.10.4" } }, - "@babel/helper-plugin-utils": { + "node_modules/@babel/helper-plugin-utils": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, - "@babel/helper-regex": { + "node_modules/@babel/helper-regex": { "version": "7.10.5", "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", - "requires": { + "dependencies": { "lodash": "^4.17.19" } }, - "@babel/helper-remap-async-to-generator": { + "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", - "requires": { + "dependencies": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-wrap-function": "^7.10.4", "@babel/types": "^7.12.1" } }, - "@babel/helper-replace-supers": { + "node_modules/@babel/helper-replace-supers": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", - "requires": { + "dependencies": { "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", "@babel/traverse": "^7.12.1", "@babel/types": "^7.12.1" } }, - "@babel/helper-simple-access": { + "node_modules/@babel/helper-simple-access": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", - "requires": { + "dependencies": { "@babel/types": "^7.12.1" } }, - "@babel/helper-skip-transparent-expression-wrappers": { + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", - "requires": { + "dependencies": { "@babel/types": "^7.12.1" } }, - "@babel/helper-split-export-declaration": { + "node_modules/@babel/helper-split-export-declaration": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { + "dependencies": { "@babel/types": "^7.11.0" } }, - "@babel/helper-validator-identifier": { + "node_modules/@babel/helper-validator-identifier": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" }, - "@babel/helper-validator-option": { + "node_modules/@babel/helper-validator-option": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==", "dev": true }, - "@babel/helper-wrap-function": { + "node_modules/@babel/helper-wrap-function": { "version": "7.12.3", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", - "requires": { + "dependencies": { "@babel/helper-function-name": "^7.10.4", "@babel/template": "^7.10.4", "@babel/traverse": "^7.10.4", "@babel/types": "^7.10.4" } }, - "@babel/helpers": { + "node_modules/@babel/helpers": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.1.tgz", "integrity": "sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==", - "requires": { + "dependencies": { "@babel/template": "^7.10.4", "@babel/traverse": "^7.12.1", "@babel/types": "^7.12.1" } }, - "@babel/highlight": { + "node_modules/@babel/highlight": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { + "dependencies": { "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "@babel/parser": { + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { "version": "7.12.3", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", - "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==" + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "@babel/plugin-external-helpers": { + "node_modules/@babel/plugin-external-helpers": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.12.1.tgz", "integrity": "sha512-5VBqan0daXhDSRjrq2miABuELRwWJWFdM42Jvs/CDuhp+Es+fW+ISA5l+co8d+9oN3WLz/N3VvzyeseL3AvjxA==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-proposal-async-generator-functions": { + "node_modules/@babel/plugin-proposal-async-generator-functions": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/helper-remap-async-to-generator": "^7.12.1", "@babel/plugin-syntax-async-generators": "^7.8.0" } }, - "@babel/plugin-proposal-class-properties": { + "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", - "requires": { + "dependencies": { "@babel/helper-create-class-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-proposal-dynamic-import": { + "node_modules/@babel/plugin-proposal-dynamic-import": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, - "@babel/plugin-proposal-export-default-from": { + "node_modules/@babel/plugin-proposal-export-default-from": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.12.1.tgz", "integrity": "sha512-z5Q4Ke7j0AexQRfgUvnD+BdCSgpTEKnqQ3kskk2jWtOBulxICzd1X9BGt7kmWftxZ2W3++OZdt5gtmC8KLxdRQ==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-export-default-from": "^7.12.1" } }, - "@babel/plugin-proposal-export-namespace-from": { + "node_modules/@babel/plugin-proposal-export-namespace-from": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, - "@babel/plugin-proposal-json-strings": { + "node_modules/@babel/plugin-proposal-json-strings": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.0" } }, - "@babel/plugin-proposal-logical-assignment-operators": { + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, - "@babel/plugin-proposal-nullish-coalescing-operator": { + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" } }, - "@babel/plugin-proposal-numeric-separator": { + "node_modules/@babel/plugin-proposal-numeric-separator": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, - "@babel/plugin-proposal-object-rest-spread": { + "node_modules/@babel/plugin-proposal-object-rest-spread": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-transform-parameters": "^7.12.1" } }, - "@babel/plugin-proposal-optional-catch-binding": { + "node_modules/@babel/plugin-proposal-optional-catch-binding": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" } }, - "@babel/plugin-proposal-optional-chaining": { + "node_modules/@babel/plugin-proposal-optional-chaining": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, - "@babel/plugin-proposal-private-methods": { + "node_modules/@babel/plugin-proposal-private-methods": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-create-class-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-proposal-unicode-property-regex": { + "node_modules/@babel/plugin-proposal-unicode-property-regex": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" + }, + "engines": { + "node": ">=4" } }, - "@babel/plugin-syntax-async-generators": { + "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-bigint": { + "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-class-properties": { + "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-syntax-dynamic-import": { + "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-export-default-from": { + "node_modules/@babel/plugin-syntax-export-default-from": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.12.1.tgz", "integrity": "sha512-dP5eGg6tHEkhnRD2/vRG/KJKRSg8gtxu2i+P/8/yFPJn/CfPU5G0/7Gks2i3M6IOVAPQekmsLN9LPsmXFFL4Uw==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-syntax-export-namespace-from": { + "node_modules/@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" } }, - "@babel/plugin-syntax-flow": { + "node_modules/@babel/plugin-syntax-flow": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.1.tgz", "integrity": "sha512-1lBLLmtxrwpm4VKmtVFselI/P3pX+G63fAtUUt6b2Nzgao77KNDwyuRt90Mj2/9pKobtt68FdvjfqohZjg/FCA==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-syntax-import-meta": { + "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-syntax-json-strings": { + "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-jsx": { + "node_modules/@babel/plugin-syntax-jsx": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-syntax-logical-assignment-operators": { + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-syntax-nullish-coalescing-operator": { + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-numeric-separator": { + "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-syntax-object-rest-spread": { + "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-optional-catch-binding": { + "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-optional-chaining": { + "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-top-level-await": { + "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-syntax-typescript": { + "node_modules/@babel/plugin-syntax-typescript": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.1.tgz", "integrity": "sha512-UZNEcCY+4Dp9yYRCAHrHDU+9ZXLYaY9MgBXSRLkB9WjYFRR6quJBumfVrEkUxrePPBwFcpWfNKXqVRQQtm7mMA==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-arrow-functions": { + "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-async-to-generator": { + "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", - "requires": { + "dependencies": { "@babel/helper-module-imports": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", "@babel/helper-remap-async-to-generator": "^7.12.1" } }, - "@babel/plugin-transform-block-scoped-functions": { + "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-block-scoping": { + "node_modules/@babel/plugin-transform-block-scoping": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-classes": { + "node_modules/@babel/plugin-transform-classes": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", - "requires": { + "dependencies": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-define-map": "^7.10.4", "@babel/helper-function-name": "^7.10.4", @@ -751,120 +891,120 @@ "globals": "^11.1.0" } }, - "@babel/plugin-transform-computed-properties": { + "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-destructuring": { + "node_modules/@babel/plugin-transform-destructuring": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-dotall-regex": { + "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-duplicate-keys": { + "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-exponentiation-operator": { + "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", - "requires": { + "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-flow-strip-types": { + "node_modules/@babel/plugin-transform-flow-strip-types": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz", "integrity": "sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-flow": "^7.12.1" } }, - "@babel/plugin-transform-for-of": { + "node_modules/@babel/plugin-transform-for-of": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-function-name": { + "node_modules/@babel/plugin-transform-function-name": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", - "requires": { + "dependencies": { "@babel/helper-function-name": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-literals": { + "node_modules/@babel/plugin-transform-literals": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-member-expression-literals": { + "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-modules-amd": { + "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" } }, - "@babel/plugin-transform-modules-commonjs": { + "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", - "requires": { + "dependencies": { "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", "@babel/helper-simple-access": "^7.12.1", "babel-plugin-dynamic-import-node": "^2.3.3" } }, - "@babel/plugin-transform-modules-systemjs": { + "node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-hoist-variables": "^7.10.4", "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", @@ -872,244 +1012,31297 @@ "babel-plugin-dynamic-import-node": "^2.3.3" } }, - "@babel/plugin-transform-modules-umd": { + "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-named-capturing-groups-regex": { + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.12.1" } }, - "@babel/plugin-transform-new-target": { + "node_modules/@babel/plugin-transform-new-target": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-object-assign": { + "node_modules/@babel/plugin-transform-object-assign": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.12.1.tgz", "integrity": "sha512-geUHn4XwHznRAFiuROTy0Hr7bKbpijJCmr1Svt/VNGhpxmp0OrdxURNpWbOAf94nUbL+xj6gbxRVPHWIbRpRoA==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-object-super": { + "node_modules/@babel/plugin-transform-object-super": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/helper-replace-supers": "^7.12.1" } }, - "@babel/plugin-transform-parameters": { + "node_modules/@babel/plugin-transform-parameters": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-property-literals": { + "node_modules/@babel/plugin-transform-property-literals": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-react-constant-elements": { + "node_modules/@babel/plugin-transform-react-constant-elements": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.12.1.tgz", "integrity": "sha512-KOHd0tIRLoER+J+8f9DblZDa1fLGPwaaN1DI1TVHuQFOpjHV22C3CUB3obeC4fexHY9nx+fH0hQNvLFFfA1mxA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-react-display-name": { + "node_modules/@babel/plugin-transform-react-display-name": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-react-jsx": { + "node_modules/@babel/plugin-transform-react-jsx": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.1.tgz", "integrity": "sha512-RmKejwnT0T0QzQUzcbP5p1VWlpnP8QHtdhEtLG55ZDQnJNalbF3eeDyu3dnGKvGzFIQiBzFhBYTwvv435p9Xpw==", - "requires": { + "dependencies": { "@babel/helper-builder-react-jsx": "^7.10.4", "@babel/helper-builder-react-jsx-experimental": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-jsx": "^7.12.1" } }, - "@babel/plugin-transform-react-jsx-development": { + "node_modules/@babel/plugin-transform-react-jsx-development": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.1.tgz", "integrity": "sha512-IilcGWdN1yNgEGOrB96jbTplRh+V2Pz1EoEwsKsHfX1a/L40cUYuD71Zepa7C+ujv7kJIxnDftWeZbKNEqZjCQ==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-builder-react-jsx-experimental": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-jsx": "^7.12.1" } }, - "@babel/plugin-transform-react-jsx-self": { + "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.1.tgz", "integrity": "sha512-FbpL0ieNWiiBB5tCldX17EtXgmzeEZjFrix72rQYeq9X6nUK38HCaxexzVQrZWXanxKJPKVVIU37gFjEQYkPkA==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-react-jsx-source": { + "node_modules/@babel/plugin-transform-react-jsx-source": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.1.tgz", "integrity": "sha512-keQ5kBfjJNRc6zZN1/nVHCd6LLIHq4aUKcVnvE/2l+ZZROSbqoiGFRtT5t3Is89XJxBQaP7NLZX2jgGHdZvvFQ==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-react-pure-annotations": { + "node_modules/@babel/plugin-transform-react-pure-annotations": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-regenerator": { + "node_modules/@babel/plugin-transform-regenerator": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", - "requires": { + "dependencies": { "regenerator-transform": "^0.14.2" } }, - "@babel/plugin-transform-reserved-words": { + "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-runtime": { + "node_modules/@babel/plugin-transform-runtime": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", - "requires": { + "dependencies": { "@babel/helper-module-imports": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", "resolve": "^1.8.1", "semver": "^5.5.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, - "@babel/plugin-transform-shorthand-properties": { + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-spread": { + "node_modules/@babel/plugin-transform-spread": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, - "@babel/plugin-transform-sticky-regex": { + "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz", "integrity": "sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/helper-regex": "^7.10.4" } }, - "@babel/plugin-transform-template-literals": { + "node_modules/@babel/plugin-transform-template-literals": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-typeof-symbol": { + "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz", "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-typescript": { + "node_modules/@babel/plugin-transform-typescript": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.1.tgz", "integrity": "sha512-VrsBByqAIntM+EYMqSm59SiMEf7qkmI9dqMt6RbD/wlwueWmYcI0FFK5Fj47pP6DRZm+3teXjosKlwcZJ5lIMw==", - "requires": { + "dependencies": { "@babel/helper-create-class-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-typescript": "^7.12.1" } }, - "@babel/plugin-transform-unicode-escapes": { + "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-unicode-regex": { + "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", - "requires": { + "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/preset-env": { + "node_modules/@babel/preset-env": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", "dev": true, - "requires": { + "dependencies": { + "@babel/compat-data": "^7.12.1", + "@babel/helper-compilation-targets": "^7.12.1", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.1", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.1", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.1", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.1", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.12.1", + "core-js-compat": "^3.6.2", + "semver": "^5.5.0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/preset-flow": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.12.13.tgz", + "integrity": "sha512-gcEjiwcGHa3bo9idURBp5fmJPcyFPOszPQjztXrOjUE2wWVqc6fIVJPgWPIQksaQ5XZ2HWiRsf2s1fRGVjUtVw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-transform-flow-strip-types": "^7.12.13" + } + }, + "node_modules/@babel/preset-flow/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" + }, + "node_modules/@babel/preset-flow/node_modules/@babel/plugin-syntax-flow": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz", + "integrity": "sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "node_modules/@babel/preset-flow/node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.13.0.tgz", + "integrity": "sha512-EXAGFMJgSX8gxWD7PZtW/P6M+z74jpx3wm/+9pn+c2dOawPpBkUX7BrfyPvo6ZpXbgRIEuwgwDb/MGlKvu2pOg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-flow": "^7.12.13" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.1.tgz", + "integrity": "sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-react-display-name": "^7.12.1", + "@babel/plugin-transform-react-jsx": "^7.12.1", + "@babel/plugin-transform-react-jsx-development": "^7.12.1", + "@babel/plugin-transform-react-jsx-self": "^7.12.1", + "@babel/plugin-transform-react-jsx-source": "^7.12.1", + "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + } + }, + "node_modules/@babel/register": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.12.1.tgz", + "integrity": "sha512-XWcmseMIncOjoydKZnWvWi0/5CUCD+ZYKhRwgYlWOrA8fGZ/FjuLRpqtIhLOVD/fvR1b9DQHtZPn68VvhpYf+Q==", + "dependencies": { + "find-cache-dir": "^2.0.0", + "lodash": "^4.17.19", + "make-dir": "^2.1.0", + "pirates": "^4.0.0", + "source-map-support": "^0.5.16" + } + }, + "node_modules/@babel/runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/traverse": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dependencies": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" + } + }, + "node_modules/@develar/schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "dev": true, + "dependencies": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + } + }, + "node_modules/@egjs/hammerjs": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", + "integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==", + "dependencies": { + "@types/hammerjs": "^2.0.36" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@electron/get": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.12.2.tgz", + "integrity": "sha512-vAuHUbfvBQpYTJ5wB7uVIDq5c/Ry0fiTBMs7lnEYAo/qXXppIVcWdfBr57u6eRnKdVso7KSiH6p/LbQAG6Izrg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^9.6.0", + "progress": "^2.0.3", + "sanitize-filename": "^1.6.2", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=8.6" + }, + "optionalDependencies": { + "global-agent": "^2.0.2", + "global-tunnel-ng": "^2.7.1" + } + }, + "node_modules/@electron/get/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@electron/get/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/get/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz", + "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@eslint/eslintrc/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@formatjs/ecma402-abstract": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.6.4.tgz", + "integrity": "sha512-ukFjGD9dLsxcD9D5AEshJqQElPQeUAlTALT/lzIV6OcYojyuU81gw/uXDUOrs6XW79jtOJwQDkLqHbCJBJMOTw==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@formatjs/ecma402-abstract/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + }, + "node_modules/@formatjs/intl-getcanonicallocales": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@formatjs/intl-getcanonicallocales/-/intl-getcanonicallocales-1.5.8.tgz", + "integrity": "sha512-6GEIfCsZ+wd/K8bixP5h0Ep5aOjMgHlM51TeznlcNoiOHPP4gOrkxggh2Y2G5lnk71Ocyi93/+d0oKJI3J0jzw==", + "dependencies": { + "cldr-core": "38", + "tslib": "^2.1.0" + } + }, + "node_modules/@formatjs/intl-getcanonicallocales/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + }, + "node_modules/@formatjs/intl-locale": { + "version": "2.4.21", + "resolved": "https://registry.npmjs.org/@formatjs/intl-locale/-/intl-locale-2.4.21.tgz", + "integrity": "sha512-AH7d6XaLq1pXZ/AQ4dRNveKmA0juCCN3hFdpBvVA3XT4EMXIVkERh8PSa7xKgZThgXJwSLCZgKAeaARDzmhFRA==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.6.4", + "@formatjs/intl-getcanonicallocales": "1.5.8", + "cldr-core": "38", + "tslib": "^2.1.0" + } + }, + "node_modules/@formatjs/intl-locale/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + }, + "node_modules/@formatjs/intl-numberformat": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@formatjs/intl-numberformat/-/intl-numberformat-6.2.5.tgz", + "integrity": "sha512-OnumcFnxnrRhfcL/KMBmC54i948YUQ3eh+J4DiHjs1QRx8iattj/07UEipqMvu6iHjnqU0PRTxFBGG2L+9JWXw==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.6.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@formatjs/intl-numberformat/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + }, + "node_modules/@formatjs/intl-pluralrules": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@formatjs/intl-pluralrules/-/intl-pluralrules-4.0.13.tgz", + "integrity": "sha512-ePoC1zmSzvyxXnrhPkysAQMIWr1JO5Hbz8yRv9ARgz6rD68k+wfD743AiHY/yjlahnXaqHDTd7e07xwrbzAsgQ==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.6.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@formatjs/intl-pluralrules/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + }, + "node_modules/@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" + }, + "node_modules/@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" + }, + "node_modules/@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" + }, + "node_modules/@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "dependencies": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "node_modules/@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "dependencies": { + "@hapi/hoek": "^8.3.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dependencies": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@jest/console/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/@jest/console/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/@jest/console/node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@jest/core": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.0.tgz", + "integrity": "sha512-7wbunxosnC5zXjxrEtTQSblFjRVOT8qz1eSytw8riEeWgegy3ct91NLPEP440CDuWrmW3cOLcEGxIf9q2u6O9Q==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.0", + "@jest/reporters": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/transform": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.0", + "jest-config": "^26.6.0", + "jest-haste-map": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.0", + "jest-resolve-dependencies": "^26.6.0", + "jest-runner": "^26.6.0", + "jest-runtime": "^26.6.0", + "jest-snapshot": "^26.6.0", + "jest-util": "^26.6.0", + "jest-validate": "^26.6.0", + "jest-watcher": "^26.6.0", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/core/node_modules/@jest/console": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.0.tgz", + "integrity": "sha512-ArGcZWAEYMWmWnc/QvxLDvFmGRPvmHeulhS7FUUAlUGR5vS/SqMfArsGaYmIFEThSotCMnEihwx1h62I1eg5lg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.0", + "jest-util": "^26.6.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/core/node_modules/@jest/test-result": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.0.tgz", + "integrity": "sha512-LV6X1ry+sKjseQsIFz3e6XAZYxwidvmeJFnVF08fq98q08dF1mJYI0lDq/LmH/jas+R4s0pwnNGiz1hfC4ZUBw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/core/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/core/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@jest/core/node_modules/@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "node_modules/@jest/core/node_modules/ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "dependencies": { + "type-fest": "^0.11.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@jest/core/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/camelcase": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz", + "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/core/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/@jest/core/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@jest/core/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/core/node_modules/jest-haste-map": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.0.tgz", + "integrity": "sha512-RpNqAGMR58uG9E9vWITorX2/R7he/tSbHWldX5upt1ymEcmCaXczqXxjqI6xOtRR8Ev6ZEYDfgSA5Fy7WHUL5w==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.5.0", + "jest-util": "^26.6.0", + "jest-worker": "^26.5.0", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/@jest/core/node_modules/jest-message-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.0.tgz", + "integrity": "sha512-WPAeS38Kza29f04I0iOIQrXeiebRXjmn6cFehzI7KKJOgT0NmqYAcLgjWnIAfKs5FBmEQgje1kXab0DaLKCl2w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/core/node_modules/jest-serializer": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.5.0.tgz", + "integrity": "sha512-+h3Gf5CDRlSLdgTv7y0vPIAoLgX/SI7T4v6hy+TEXMgYbv+ztzbg5PSN6mUXAT/hXYHvZRWm+MaObVfqkhCGxA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/core/node_modules/jest-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.0.tgz", + "integrity": "sha512-/cUGqcnKeZMjvTQLfJo65nBOEZ/k0RB/8usv2JpfYya05u0XvBmKkIH5o5c4nCh9DD61B1YQjMGGqh1Ha0aXdg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/core/node_modules/jest-validate": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.0.tgz", + "integrity": "sha512-FKHNqvh1Pgs4NWas56gsTPmjcIoGAAzSVUCK1+g8euzuCGbmdEr8LRTtOEFjd29uMZUk0PhzmzKGlHPe6j3UWw==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/core/node_modules/jest-worker": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz", + "integrity": "sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/@jest/core/node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/@jest/core/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/core/node_modules/pretty-format": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.0.tgz", + "integrity": "sha512-Uumr9URVB7bm6SbaByXtx+zGlS+0loDkFMHP0kHahMjmfCtmFY03iqd++5v3Ld6iB5TocVXlBN/T+DXMn9d4BA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@jest/core/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/@jest/core/node_modules/stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/core/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@jest/core/node_modules/type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.0.tgz", + "integrity": "sha512-l+5MSdiC4rUUrz8xPdj0TwHBwuoqMcAbFnsYDTn5FkenJl8b+lvC5NdJl1tVICGHWnx0fnjdd1luRZ7u3U4xyg==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/node": "*", + "jest-mock": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/environment/node_modules/@jest/fake-timers": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.0.tgz", + "integrity": "sha512-7VQpjChrwlwvGNysS10lDBLOVLxMvMtpx0Xo6aIotzNVyojYk0NN0CR8R4T6h/eu7Zva/LB3P71jqwGdtADoag==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.0", + "jest-mock": "^26.6.0", + "jest-util": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/environment/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/environment/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@jest/environment/node_modules/@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "node_modules/@jest/environment/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/environment/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@jest/environment/node_modules/jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/environment/node_modules/jest-message-util/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/environment/node_modules/jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/environment/node_modules/jest-mock/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/environment/node_modules/jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/environment/node_modules/jest-util/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/environment/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@jest/environment/node_modules/pretty-format/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/environment/node_modules/react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", + "dev": true + }, + "node_modules/@jest/environment/node_modules/stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/environment/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "dependencies": { + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@jest/fake-timers/node_modules/@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@jest/fake-timers/node_modules/@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/globals": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.0.tgz", + "integrity": "sha512-rs3a/a8Lq8FgTx11SxbqIU2bDjsFU2PApl2oK2oUVlo84RSF76afFm2nLojW93AGssr715GHUwhq5b6mpCI5BQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.0", + "@jest/types": "^26.6.0", + "expect": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/globals/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/globals/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@jest/globals/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.0.tgz", + "integrity": "sha512-PXbvHhdci5Rj1VFloolgLb+0kkdtzswhG8MzVENKJRI3O1ndwr52G6E/2QupjwrRcYnApZOelFf4nNpf5+SDxA==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/transform": "^26.6.0", + "@jest/types": "^26.6.0", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.0", + "jest-resolve": "^26.6.0", + "jest-util": "^26.6.0", + "jest-worker": "^26.5.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^6.0.1" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "node-notifier": "^8.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@jest/console": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.0.tgz", + "integrity": "sha512-ArGcZWAEYMWmWnc/QvxLDvFmGRPvmHeulhS7FUUAlUGR5vS/SqMfArsGaYmIFEThSotCMnEihwx1h62I1eg5lg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.0", + "jest-util": "^26.6.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/reporters/node_modules/@jest/test-result": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.0.tgz", + "integrity": "sha512-LV6X1ry+sKjseQsIFz3e6XAZYxwidvmeJFnVF08fq98q08dF1mJYI0lDq/LmH/jas+R4s0pwnNGiz1hfC4ZUBw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/reporters/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/reporters/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@jest/reporters/node_modules/@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "node_modules/@jest/reporters/node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@jest/reporters/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@jest/reporters/node_modules/jest-haste-map": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.0.tgz", + "integrity": "sha512-RpNqAGMR58uG9E9vWITorX2/R7he/tSbHWldX5upt1ymEcmCaXczqXxjqI6xOtRR8Ev6ZEYDfgSA5Fy7WHUL5w==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.5.0", + "jest-util": "^26.6.0", + "jest-worker": "^26.5.0", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/@jest/reporters/node_modules/jest-message-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.0.tgz", + "integrity": "sha512-WPAeS38Kza29f04I0iOIQrXeiebRXjmn6cFehzI7KKJOgT0NmqYAcLgjWnIAfKs5FBmEQgje1kXab0DaLKCl2w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/reporters/node_modules/jest-serializer": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.5.0.tgz", + "integrity": "sha512-+h3Gf5CDRlSLdgTv7y0vPIAoLgX/SI7T4v6hy+TEXMgYbv+ztzbg5PSN6mUXAT/hXYHvZRWm+MaObVfqkhCGxA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/reporters/node_modules/jest-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.0.tgz", + "integrity": "sha512-/cUGqcnKeZMjvTQLfJo65nBOEZ/k0RB/8usv2JpfYya05u0XvBmKkIH5o5c4nCh9DD61B1YQjMGGqh1Ha0aXdg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/reporters/node_modules/jest-worker": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz", + "integrity": "sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/@jest/reporters/node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/@jest/reporters/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/reporters/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/reporters/node_modules/stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@jest/source-map/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@jest/source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dependencies": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@jest/test-result/node_modules/@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@jest/test-result/node_modules/@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.0.tgz", + "integrity": "sha512-rWPTMa+8rejvePZnJmnKkmKWh0qILFDPpN0qbSif+KNGvFxqqDGafMo4P2Y8+I9XWrZQBeXL9IxPL4ZzDgRlbw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^26.6.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.0", + "jest-runner": "^26.6.0", + "jest-runtime": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/test-sequencer/node_modules/@jest/console": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.0.tgz", + "integrity": "sha512-ArGcZWAEYMWmWnc/QvxLDvFmGRPvmHeulhS7FUUAlUGR5vS/SqMfArsGaYmIFEThSotCMnEihwx1h62I1eg5lg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.0", + "jest-util": "^26.6.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/test-sequencer/node_modules/@jest/test-result": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.0.tgz", + "integrity": "sha512-LV6X1ry+sKjseQsIFz3e6XAZYxwidvmeJFnVF08fq98q08dF1mJYI0lDq/LmH/jas+R4s0pwnNGiz1hfC4ZUBw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/test-sequencer/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/test-sequencer/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@jest/test-sequencer/node_modules/@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "node_modules/@jest/test-sequencer/node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@jest/test-sequencer/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/test-sequencer/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/test-sequencer/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/test-sequencer/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/test-sequencer/node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/jest-haste-map": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.0.tgz", + "integrity": "sha512-RpNqAGMR58uG9E9vWITorX2/R7he/tSbHWldX5upt1ymEcmCaXczqXxjqI6xOtRR8Ev6ZEYDfgSA5Fy7WHUL5w==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.5.0", + "jest-util": "^26.6.0", + "jest-worker": "^26.5.0", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/@jest/test-sequencer/node_modules/jest-message-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.0.tgz", + "integrity": "sha512-WPAeS38Kza29f04I0iOIQrXeiebRXjmn6cFehzI7KKJOgT0NmqYAcLgjWnIAfKs5FBmEQgje1kXab0DaLKCl2w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/test-sequencer/node_modules/jest-serializer": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.5.0.tgz", + "integrity": "sha512-+h3Gf5CDRlSLdgTv7y0vPIAoLgX/SI7T4v6hy+TEXMgYbv+ztzbg5PSN6mUXAT/hXYHvZRWm+MaObVfqkhCGxA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/test-sequencer/node_modules/jest-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.0.tgz", + "integrity": "sha512-/cUGqcnKeZMjvTQLfJo65nBOEZ/k0RB/8usv2JpfYya05u0XvBmKkIH5o5c4nCh9DD61B1YQjMGGqh1Ha0aXdg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/test-sequencer/node_modules/jest-worker": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz", + "integrity": "sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/@jest/test-sequencer/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/test-sequencer/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/test-sequencer/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@jest/transform": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.0.tgz", + "integrity": "sha512-NUNA1NMCyVV9g5NIQF1jzW7QutQhB/HAocteCiUyH0VhmLXnGMTfPYQu1G6IjPk+k1SWdh2PD+Zs1vMqbavWzg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.0", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.0", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.0", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/transform/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/transform/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@jest/transform/node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@jest/transform/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/transform/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/@jest/transform/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@jest/transform/node_modules/jest-haste-map": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.0.tgz", + "integrity": "sha512-RpNqAGMR58uG9E9vWITorX2/R7he/tSbHWldX5upt1ymEcmCaXczqXxjqI6xOtRR8Ev6ZEYDfgSA5Fy7WHUL5w==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.5.0", + "jest-util": "^26.6.0", + "jest-worker": "^26.5.0", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/@jest/transform/node_modules/jest-serializer": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.5.0.tgz", + "integrity": "sha512-+h3Gf5CDRlSLdgTv7y0vPIAoLgX/SI7T4v6hy+TEXMgYbv+ztzbg5PSN6mUXAT/hXYHvZRWm+MaObVfqkhCGxA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/transform/node_modules/jest-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.0.tgz", + "integrity": "sha512-/cUGqcnKeZMjvTQLfJo65nBOEZ/k0RB/8usv2JpfYya05u0XvBmKkIH5o5c4nCh9DD61B1YQjMGGqh1Ha0aXdg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/transform/node_modules/jest-worker": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz", + "integrity": "sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/@jest/transform/node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/transform/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/transform/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@jest/transform/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@lwc/eslint-plugin-lwc": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@lwc/eslint-plugin-lwc/-/eslint-plugin-lwc-0.11.0.tgz", + "integrity": "sha512-wJOD4XWOH91GaZfypMSKfEeMXqMfvKdsb2gSJ/9FEwJVlziKg1aagtRYJh2ln3DyEZV33tBC/p/dWzIeiwa1tg==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@native-html/css-processor": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@native-html/css-processor/-/css-processor-1.6.1.tgz", + "integrity": "sha512-3l4SmYU5CIwL7f8GSssypWfFd7W/FcqVrOomhDRbaWYsxKh2T0zNcIjJbkr8ZbpXJk3qKrV1EMoTJ8vt6H8M9Q==", + "dependencies": { + "css-to-react-native": "^3.0.0" + } + }, + "node_modules/@native-html/transient-render-engine": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@native-html/transient-render-engine/-/transient-render-engine-3.6.1.tgz", + "integrity": "sha512-SkII7uJt399xn9W7ciPzEWZBnRYGKb2zlo3VLMkIEL9V8O1yQPxEfHERI4D7w8zU7W8H9+7S8IYpPEhBzIlzFQ==", + "dependencies": { + "@native-html/css-processor": "1.6.1", + "@types/ramda": "^0.27.32", + "htmlparser2": "^5.0.1", + "ramda": "^0.27.1" + } + }, + "node_modules/@native-html/transient-render-engine/node_modules/dom-serializer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.1.0.tgz", + "integrity": "sha512-ox7bvGXt2n+uLWtCRLybYx60IrOlWL/aCebWJk1T0d4m3y2tzf4U3ij9wBMUb6YJZpz06HCCYuyCDveE2xXmzQ==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "entities": "^2.0.0" + } + }, + "node_modules/@native-html/transient-render-engine/node_modules/domelementtype": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", + "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==" + }, + "node_modules/@native-html/transient-render-engine/node_modules/domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "dependencies": { + "domelementtype": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@native-html/transient-render-engine/node_modules/domutils": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.4.3.tgz", + "integrity": "sha512-MDMfEjgtzHvRX7i21XQfkk/vfZbLOe0VJk8dDETkTTo3BTeH3NXz3Xvs94UQ+GzTw/GjRYKsfVKIIOheYX63fw==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0" + } + }, + "node_modules/@native-html/transient-render-engine/node_modules/domutils/node_modules/domhandler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.0.0.tgz", + "integrity": "sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA==", + "dependencies": { + "domelementtype": "^2.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@native-html/transient-render-engine/node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" + }, + "node_modules/@native-html/transient-render-engine/node_modules/htmlparser2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-5.0.1.tgz", + "integrity": "sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.3.0", + "domutils": "^2.4.2", + "entities": "^2.0.0" + } + }, + "node_modules/@native-html/transient-render-engine/node_modules/ramda": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", + "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", + "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@octokit/auth-token": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.5.tgz", + "integrity": "sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3" + } + }, + "node_modules/@octokit/core": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.3.1.tgz", + "integrity": "sha512-Dc5NNQOYjgZU5S1goN6A/E500yXOfDUFRGQB8/2Tl16AcfvS3H9PudyOe3ZNE/MaVyHPIfC0htReHMJb1tMrvw==", + "dev": true, + "dependencies": { + "@octokit/auth-token": "^2.4.4", + "@octokit/graphql": "^4.5.8", + "@octokit/request": "^5.4.12", + "@octokit/request-error": "^2.0.5", + "@octokit/types": "^6.0.3", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/endpoint": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.11.tgz", + "integrity": "sha512-fUIPpx+pZyoLW4GCs3yMnlj2LfoXTWDUVPTC4V3MUEKZm48W+XYpeWSZCv+vYF1ZABUm2CqnDVf1sFtIYrj7KQ==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/endpoint/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@octokit/graphql": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.6.1.tgz", + "integrity": "sha512-2lYlvf4YTDgZCTXTW4+OX+9WTLFtEUc6hGm4qM1nlZjzxj+arizM4aHWzBVBCxY9glh7GIs0WEuiSgbVzv8cmA==", + "dev": true, + "dependencies": { + "@octokit/request": "^5.3.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-2.2.0.tgz", + "integrity": "sha512-274lNUDonw10kT8wHg8fCcUc1ZjZHbWv0/TbAwb0ojhBQqZYc1cQ/4yqTVTtPMDeZ//g7xVEYe/s3vURkRghPg==", + "dev": true + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.7.0.tgz", + "integrity": "sha512-+zARyncLjt9b0FjqPAbJo4ss7HOlBi1nprq+cPlw5vu2+qjy7WvlXhtXFdRHQbSL1Pt+bfAKaLADEkkvg8sP8w==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.1" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz", + "integrity": "sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ==", + "dev": true + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.4.3.tgz", + "integrity": "sha512-qzGV1D8m8pRc3BLcKQIGeCMO2VfzcG5s0l5aXnmguTg6I7/x9sCAUNzhpeIOnHGrDTpF2STqB7duYJm4CxUo3Q==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.1.0", + "deprecation": "^2.3.1" + } + }, + "node_modules/@octokit/request": { + "version": "5.4.14", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.14.tgz", + "integrity": "sha512-VkmtacOIQp9daSnBmDI92xNIeLuSRDOIuplp/CJomkvzt7M18NXgG044Cx/LFKLgjKt9T2tZR6AtJayba9GTSA==", + "dev": true, + "dependencies": { + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.0.0", + "@octokit/types": "^6.7.1", + "deprecation": "^2.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.1", + "once": "^1.4.0", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/request-error": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.5.tgz", + "integrity": "sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "node_modules/@octokit/request/node_modules/@octokit/openapi-types": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-5.3.2.tgz", + "integrity": "sha512-NxF1yfYOUO92rCx3dwvA2onF30Vdlg7YUkMVXkeptqpzA3tRLplThhFleV/UKWFgh7rpKu1yYRbvNDUtzSopKA==", + "dev": true + }, + "node_modules/@octokit/request/node_modules/@octokit/types": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.12.2.tgz", + "integrity": "sha512-kCkiN8scbCmSq+gwdJV0iLgHc0O/GTPY1/cffo9kECu1MvatLPh9E+qFhfRIktKfHEA6ZYvv6S1B4Wnv3bi3pA==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^5.3.2" + } + }, + "node_modules/@octokit/request/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@octokit/rest": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.3.5.tgz", + "integrity": "sha512-ZPeRms3WhWxQBEvoIh0zzf8xdU2FX0Capa7+lTca8YHmRsO3QNJzf1H3PcuKKsfgp91/xVDRtX91sTe1kexlbw==", + "dev": true, + "dependencies": { + "@octokit/core": "^3.2.3", + "@octokit/plugin-paginate-rest": "^2.6.2", + "@octokit/plugin-request-log": "^1.0.2", + "@octokit/plugin-rest-endpoint-methods": "4.13.5" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/openapi-types": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-5.3.2.tgz", + "integrity": "sha512-NxF1yfYOUO92rCx3dwvA2onF30Vdlg7YUkMVXkeptqpzA3tRLplThhFleV/UKWFgh7rpKu1yYRbvNDUtzSopKA==", + "dev": true + }, + "node_modules/@octokit/rest/node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "4.13.5", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.13.5.tgz", + "integrity": "sha512-kYKcWkFm4Ldk8bZai2RVEP1z97k1C/Ay2FN9FNTBg7JIyKoiiJjks4OtT6cuKeZX39tqa+C3J9xeYc6G+6g8uQ==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.12.2", + "deprecation": "^2.3.1" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/types": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.12.2.tgz", + "integrity": "sha512-kCkiN8scbCmSq+gwdJV0iLgHc0O/GTPY1/cffo9kECu1MvatLPh9E+qFhfRIktKfHEA6ZYvv6S1B4Wnv3bi3pA==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^5.3.2" + } + }, + "node_modules/@octokit/types": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.2.1.tgz", + "integrity": "sha512-jHs9OECOiZxuEzxMZcXmqrEO8GYraHF+UzNVH2ACYh8e/Y7YoT+hUf9ldvVd6zIvWv4p3NdxbQ0xx3ku5BnSiA==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^2.2.0", + "@types/node": ">= 8" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.11", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.11.tgz", + "integrity": "sha512-3NsZsJIA/22P3QUyrEDNA2D133H4j224twJrdipXN38dpnIOzAbUDtOwkcJ5pXmn75w7LSQDjA4tO9dm1XlqlA==", + "dev": true + }, + "node_modules/@react-native-community/async-storage": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@react-native-community/async-storage/-/async-storage-1.12.1.tgz", + "integrity": "sha512-70WGaH3PKYASi4BThuEEKMkyAgE9k7VytBqmgPRx3MzJx9/MkspwqJGmn3QLCgHLIFUgF1pit2mWICbRJ3T3lg==", + "dependencies": { + "deep-assign": "^3.0.0" + } + }, + "node_modules/@react-native-community/cli": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-4.13.1.tgz", + "integrity": "sha512-+/TeRVToADpQPSprsPkwi9KY8x64YcuJpjzMBVISwWP+aWzsIDuWJmyMXTADlCg2EBMJqJR7bn1W/IkfzVRCWA==", + "dependencies": { + "@hapi/joi": "^15.0.3", + "@react-native-community/cli-debugger-ui": "^4.13.1", + "@react-native-community/cli-hermes": "^4.13.0", + "@react-native-community/cli-server-api": "^4.13.1", + "@react-native-community/cli-tools": "^4.13.0", + "@react-native-community/cli-types": "^4.10.1", + "chalk": "^3.0.0", + "command-exists": "^1.2.8", + "commander": "^2.19.0", + "cosmiconfig": "^5.1.0", + "deepmerge": "^3.2.0", + "envinfo": "^7.7.2", + "execa": "^1.0.0", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.3", + "graceful-fs": "^4.1.3", + "inquirer": "^3.0.6", + "leven": "^3.1.0", + "lodash": "^4.17.15", + "metro": "^0.58.0", + "metro-config": "^0.58.0", + "metro-core": "^0.58.0", + "metro-react-native-babel-transformer": "^0.58.0", + "metro-resolver": "^0.58.0", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "node-stream-zip": "^1.9.1", + "ora": "^3.4.0", + "pretty-format": "^25.2.0", + "semver": "^6.3.0", + "serve-static": "^1.13.1", + "strip-ansi": "^5.2.0", + "sudo-prompt": "^9.0.0", + "wcwidth": "^1.0.1" + }, + "bin": { + "react-native": "build/bin.js" + }, + "engines": { + "node": ">=8.3" + } + }, + "node_modules/@react-native-community/cli-debugger-ui": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-4.13.1.tgz", + "integrity": "sha512-UFnkg5RTq3s2X15fSkrWY9+5BKOFjihNSnJjTV2H5PtTUFbd55qnxxPw8CxSfK0bXb1IrSvCESprk2LEpqr5cg==", + "dependencies": { + "serve-static": "^1.13.1" + } + }, + "node_modules/@react-native-community/cli-hermes": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-4.13.0.tgz", + "integrity": "sha512-oG+w0Uby6rSGsUkJGLvMQctZ5eVRLLfhf84lLyz942OEDxFRa9U19YJxOe9FmgCKtotbYiM3P/XhK+SVCuerPQ==", + "dependencies": { + "@react-native-community/cli-platform-android": "^4.13.0", + "@react-native-community/cli-tools": "^4.13.0", + "chalk": "^3.0.0", + "hermes-profile-transformer": "^0.0.6", + "ip": "^1.1.5" + } + }, + "node_modules/@react-native-community/cli-platform-android": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-4.13.0.tgz", + "integrity": "sha512-3i8sX8GklEytUZwPnojuoFbCjIRzMugCdzDIdZ9UNmi/OhD4/8mLGO0dgXfT4sMWjZwu3qjy45sFfk2zOAgHbA==", + "dependencies": { + "@react-native-community/cli-tools": "^4.13.0", + "chalk": "^3.0.0", + "execa": "^1.0.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.3", + "jetifier": "^1.6.2", + "lodash": "^4.17.15", + "logkitty": "^0.7.1", + "slash": "^3.0.0", + "xmldoc": "^1.1.2" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@react-native-community/cli-platform-ios": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-4.13.0.tgz", + "integrity": "sha512-6THlTu8zp62efkzimfGr3VIuQJ2514o+vScZERJCV1xgEi8XtV7mb/ZKt9o6Y9WGxKKkc0E0b/aVAtgy+L27CA==", + "dependencies": { + "@react-native-community/cli-tools": "^4.13.0", + "chalk": "^3.0.0", + "glob": "^7.1.3", + "js-yaml": "^3.13.1", + "lodash": "^4.17.15", + "plist": "^3.0.1", + "xcode": "^2.0.0" + } + }, + "node_modules/@react-native-community/cli-server-api": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-4.13.1.tgz", + "integrity": "sha512-vQzsFKD9CjHthA2ehTQX8c7uIzlI9A7ejaIow1I9RlEnLraPH2QqVDmzIdbdh5Od47UPbRzamCgAP8Bnqv3qwQ==", + "dependencies": { + "@react-native-community/cli-debugger-ui": "^4.13.1", + "@react-native-community/cli-tools": "^4.13.0", + "compression": "^1.7.1", + "connect": "^3.6.5", + "errorhandler": "^1.5.0", + "nocache": "^2.1.0", + "pretty-format": "^25.1.0", + "serve-static": "^1.13.1", + "ws": "^1.1.0" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dependencies": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@react-native-community/cli-tools": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-4.13.0.tgz", + "integrity": "sha512-s4f489h5+EJksn4CfheLgv5PGOM0CDmK1UEBLw2t/ncWs3cW2VI7vXzndcd/WJHTv3GntJhXDcJMuL+Z2IAOgg==", + "dependencies": { + "chalk": "^3.0.0", + "lodash": "^4.17.15", + "mime": "^2.4.1", + "node-fetch": "^2.6.0", + "open": "^6.2.0", + "shell-quote": "1.6.1" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@react-native-community/cli-types": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-4.10.1.tgz", + "integrity": "sha512-ael2f1onoPF3vF7YqHGWy7NnafzGu+yp88BbFbP0ydoCP2xGSUzmZVw0zakPTC040Id+JQ9WeFczujMkDy6jYQ==" + }, + "node_modules/@react-native-community/cli/node_modules/@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@react-native-community/cli/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@react-native-community/cli/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/@react-native-community/cli/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/@react-native-community/cli/node_modules/jest-validate": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "dependencies": { + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@react-native-community/cli/node_modules/jest-validate/node_modules/@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@react-native-community/cli/node_modules/jest-validate/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli/node_modules/jest-validate/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@react-native-community/cli/node_modules/jest-validate/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@react-native-community/cli/node_modules/jest-validate/node_modules/pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dependencies": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@react-native-community/cli/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@react-native-community/cli/node_modules/metro-config": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.58.0.tgz", + "integrity": "sha512-4vgBliXwL56vjUlYplvGMVSNrJJpkHuLcD+O20trV3FvPxKg4ZsvuOcNSxqDSMU26FCtIEJ15ojcuCbRL7KY0w==", + "dependencies": { + "cosmiconfig": "^5.0.5", + "jest-validate": "^24.7.0", + "metro": "0.58.0", + "metro-cache": "0.58.0", + "metro-core": "0.58.0", + "pretty-format": "^24.7.0" + } + }, + "node_modules/@react-native-community/cli/node_modules/metro-config/node_modules/@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@react-native-community/cli/node_modules/metro-config/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli/node_modules/metro-config/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@react-native-community/cli/node_modules/metro-config/node_modules/pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dependencies": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@react-native-community/cli/node_modules/metro-react-native-babel-preset": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.58.0.tgz", + "integrity": "sha512-MRriNW+fF6jxABsgPphocUY6mIhmCm8idcrQZ58fT3Iti2vCdtkaK32TyCGUNUptzhUe2/cbE57j4aC+eaodAA==", + "dependencies": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-exponentiation-operator": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-assign": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "react-refresh": "^0.4.0" + } + }, + "node_modules/@react-native-community/cli/node_modules/metro-react-native-babel-transformer": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.58.0.tgz", + "integrity": "sha512-3A73+cRq1eUPQ8g+hPNGgMUMCGmtQjwqHfoG1DwinAoJ/kr4WOXWWbGZo0xHJNBe/zdHGl0uHcDCp2knPglTdQ==", + "dependencies": { + "@babel/core": "^7.0.0", + "babel-preset-fbjs": "^3.3.0", + "metro-babel-transformer": "0.58.0", + "metro-react-native-babel-preset": "0.58.0", + "metro-source-map": "0.58.0" + } + }, + "node_modules/@react-native-community/cli/node_modules/metro-source-map": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.58.0.tgz", + "integrity": "sha512-yvN1YPmejmgiiS7T1aKBiiUTHPw2Vcm3r2TZ+DY92z/9PR4alysIywrCs/fTHs8rbDcKM5VfPCKGLpkBrbKeOw==", + "dependencies": { + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.58.0", + "ob1": "0.58.0", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, + "node_modules/@react-native-community/cli/node_modules/pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dependencies": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@react-native-community/cli/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@react-native-community/cli/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@react-native-community/cli/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@react-native-community/clipboard": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@react-native-community/clipboard/-/clipboard-1.5.1.tgz", + "integrity": "sha512-AHAmrkLEH5UtPaDiRqoULERHh3oNv7Dgs0bTC0hO5Z2GdNokAMPT5w8ci8aMcRemcwbtdHjxChgtjbeA38GBdA==" + }, + "node_modules/@react-native-community/eslint-config": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@react-native-community/eslint-config/-/eslint-config-2.0.0.tgz", + "integrity": "sha512-vHaMMfvMp9BWCQQ0lNIXibOJTcXIbYUQ8dSUsMOsrXgVkeVQJj88OwrKS00rQyqwMaC4/a6HuDiFzYUkGKOpVg==", + "dev": true, + "dependencies": { + "@react-native-community/eslint-plugin": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^3.1.0", + "@typescript-eslint/parser": "^3.1.0", + "babel-eslint": "^10.1.0", + "eslint-config-prettier": "^6.10.1", + "eslint-plugin-eslint-comments": "^3.1.2", + "eslint-plugin-flowtype": "2.50.3", + "eslint-plugin-jest": "22.4.1", + "eslint-plugin-prettier": "3.1.2", + "eslint-plugin-react": "^7.20.0", + "eslint-plugin-react-hooks": "^4.0.4", + "eslint-plugin-react-native": "^3.8.1", + "prettier": "^2.0.2" + } + }, + "node_modules/@react-native-community/eslint-config/node_modules/eslint-plugin-jest": { + "version": "22.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-22.4.1.tgz", + "integrity": "sha512-gcLfn6P2PrFAVx3AobaOzlIEevpAEf9chTpFZz7bYfc7pz8XRv7vuKTIE4hxPKZSha6XWKKplDQ0x9Pq8xX2mg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/eslint-plugin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/eslint-plugin/-/eslint-plugin-1.1.0.tgz", + "integrity": "sha512-W/J0fNYVO01tioHjvYWQ9m6RgndVtbElzYozBq1ZPrHO/iCzlqoySHl4gO/fpCl9QEFjvJfjPgtPMTMlsoq5DQ==", + "dev": true + }, + "node_modules/@react-native-community/masked-view": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@react-native-community/masked-view/-/masked-view-0.1.10.tgz", + "integrity": "sha512-rk4sWFsmtOw8oyx8SD3KSvawwaK7gRBSEIy2TAwURyGt+3TizssXP1r8nx3zY+R7v2vYYHXZ+k2/GULAT/bcaQ==" + }, + "node_modules/@react-native-community/netinfo": { + "version": "5.9.10", + "resolved": "https://registry.npmjs.org/@react-native-community/netinfo/-/netinfo-5.9.10.tgz", + "integrity": "sha512-1NPlBA2Hu/KWc3EnQcDRPRX0x8Dg9tuQlQQVWVQjlg+u+PjCq7ANEtbikOFKp5yQqfF8tqzU5+84/IfDO8zpiA==" + }, + "node_modules/@react-native-community/progress-bar-android": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@react-native-community/progress-bar-android/-/progress-bar-android-1.0.4.tgz", + "integrity": "sha512-O7UCpXDXlpxIx2eusj6bc8noJ5KyXZjnad0NQig9myq6iV4D9uGVziSj6J2v46dTnMd9iTX60szBu1LvsUO6rg==" + }, + "node_modules/@react-native-community/progress-view": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@react-native-community/progress-view/-/progress-view-1.2.3.tgz", + "integrity": "sha512-CW7eOhxduIxA723aZlKMOnBEz1o5Cjo5ibMNsf81TcjNqtsamRHm8jFS98za7t5P7XdhM0MhzkbaS90cwOlN+Q==" + }, + "node_modules/@react-native-firebase/analytics": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@react-native-firebase/analytics/-/analytics-7.6.8.tgz", + "integrity": "sha512-gm4xoJva6lfPCQVprbymm6TY6FwdRsLUwVZt9GM0XY+KrvJV3yk6vhlCafvpRZCEhvVQmW8QDCf0p9VaIygv9g==" + }, + "node_modules/@react-native-firebase/app": { + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/@react-native-firebase/app/-/app-8.4.6.tgz", + "integrity": "sha512-4eZR133QuScvGs4IQQd6qMvQ5E1mtydVTy3DtuBCeiIqtvN8ZxBYoSMgcUmYGS4VafbS2nPh85g4e3BlaIJ2XA==", + "dependencies": { + "opencollective-postinstall": "^2.0.1", + "superstruct": "^0.6.2" + } + }, + "node_modules/@react-native-firebase/crashlytics": { + "version": "8.4.10", + "resolved": "https://registry.npmjs.org/@react-native-firebase/crashlytics/-/crashlytics-8.4.10.tgz", + "integrity": "sha512-nrRHkMvaz/sgQL56hZLMoIY15L6HAjJmnCe134Vw3IPn95OKHTuF4iSa17uV/ezvOIJNSngHHZHFnySBRsu+Jg==", + "dependencies": { + "stacktrace-js": "^2.0.0" + } + }, + "node_modules/@react-native-picker/picker": { + "version": "1.9.11", + "resolved": "https://registry.npmjs.org/@react-native-picker/picker/-/picker-1.9.11.tgz", + "integrity": "sha512-E7whvvMIl9Ln1sxgug7OAEVWQ69n82iV0d2OWWp5VV52+RW3azKh1IFm4rxdW5/oByMfl7FFL0eHNelGgY4BMQ==" + }, + "node_modules/@react-navigation/core": { + "version": "5.15.2", + "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-5.15.2.tgz", + "integrity": "sha512-jNSP0FMu1N6Pa1Slsy8b/JbmlTAXcVeXVwnxrEMVGWeiNqUVYl+tx1FuQAqi3q1m4cg9ygXkGsgLgRmnXAEC8g==", + "dependencies": { + "@react-navigation/routers": "^5.7.2", + "escape-string-regexp": "^4.0.0", + "nanoid": "^3.1.15", + "query-string": "^6.13.6", + "react-is": "^16.13.0" + } + }, + "node_modules/@react-navigation/core/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-navigation/drawer": { + "version": "5.12.5", + "resolved": "https://registry.npmjs.org/@react-navigation/drawer/-/drawer-5.12.5.tgz", + "integrity": "sha512-WMfz/tKg/K7QBb5rhjXW/pho4zXh3OoHXnHETk5SuVzHlDPM7r84uvAeC5l+ySp5jmipLrJn3zL+kfv9+KKHZQ==", + "dependencies": { + "color": "^3.1.3", + "react-native-iphone-x-helper": "^1.3.0" + } + }, + "node_modules/@react-navigation/native": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-5.9.2.tgz", + "integrity": "sha512-O8K+Lr6Vy25gTTyXAns9BVyFvwTkKqfFH0RpOimilYndUL6tlhV56oDSp7Hryjy8xsjx6ESWqr6eIu4sS3Z9nQ==", + "dependencies": { + "@react-navigation/core": "^5.15.1", + "escape-string-regexp": "^4.0.0", + "nanoid": "^3.1.15" + } + }, + "node_modules/@react-navigation/native/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-navigation/routers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-5.7.2.tgz", + "integrity": "sha512-BxNSMLHpU+oS37Xok0ql6rc9U7IC8aUD4+U5ZPbjDJ0pwzZxGGh0YOEBzfV4k/Ig3cbPdvVWbc1C9HHbCVr2oQ==", + "dependencies": { + "nanoid": "^3.1.15" + } + }, + "node_modules/@react-navigation/stack": { + "version": "5.14.2", + "resolved": "https://registry.npmjs.org/@react-navigation/stack/-/stack-5.14.2.tgz", + "integrity": "sha512-tt1eFn6HClyXVZiVQsPs3Q2MgoqmJdkQsyT9P4TBLxGsdib6r/oc++eVNc+G/6ws/kCquDdHq3fz1PNSCtyrJA==", + "dependencies": { + "color": "^3.1.3", + "react-native-iphone-x-helper": "^1.3.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "dev": true, + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "dev": true, + "dependencies": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/core/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/core/node_modules/cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/core/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@svgr/core/node_modules/parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@svgr/core/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@svgr/core/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.6" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast/node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@svgr/hast-util-to-babel-ast/node_modules/@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/plugin-svgo/node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@svgr/plugin-svgo/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@svgr/plugin-svgo/node_modules/parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@svgr/plugin-svgo/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@svgr/plugin-svgo/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/webpack/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz", + "integrity": "sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.10" + } + }, + "node_modules/@svgr/webpack/node_modules/@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.5" + } + }, + "node_modules/@svgr/webpack/node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.12.tgz", + "integrity": "sha512-JDWGuzGNWscYcq8oJVCtSE61a5+XAOos+V0HrxnDieUus4UMnBEosDnY1VJqU5iZ4pA04QY7l0+JvHL1hZEfsw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.12.10", + "@babel/helper-module-imports": "^7.12.5", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.12.1", + "@babel/types": "^7.12.12" + } + }, + "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.12.tgz", + "integrity": "sha512-i1AxnKxHeMxUaWVXQOSIco4tvVvvCxMSfeBMnMM06mpaJt3g+MpxYQQrDfojUQldP1xxraPSJYSMEljoWM/dCg==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.12.12" + } + }, + "node_modules/@svgr/webpack/node_modules/@babel/preset-react": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.10.tgz", + "integrity": "sha512-vtQNjaHRl4DUpp+t+g4wvTHsLQuye+n0H/wsXIZRn69oz/fvNC7gQ4IK73zGJBaxvHoxElDvnYCthMcT7uzFoQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-react-display-name": "^7.12.1", + "@babel/plugin-transform-react-jsx": "^7.12.10", + "@babel/plugin-transform-react-jsx-development": "^7.12.7", + "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + } + }, + "node_modules/@svgr/webpack/node_modules/@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@testing-library/jest-native": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@testing-library/jest-native/-/jest-native-3.4.3.tgz", + "integrity": "sha512-CzHr3FMZCda/ChKEAjt9er9CHmIhgfKRHyeDrK3QoUdQUvlaFGER+WqGLqieJRdjRjpa2ecm+eNm2/+rPSFWkw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "jest-diff": "^24.0.0", + "jest-matcher-utils": "^24.0.0", + "pretty-format": "^24.0.0", + "ramda": "^0.26.1", + "redent": "^2.0.0" + } + }, + "node_modules/@testing-library/jest-native/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@testing-library/jest-native/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@testing-library/jest-native/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@testing-library/jest-native/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@testing-library/jest-native/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@testing-library/jest-native/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@testing-library/react-native": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@testing-library/react-native/-/react-native-7.0.2.tgz", + "integrity": "sha512-mOnsEgdbIvXa2cpZz+DTWiqtgObHRICujBGVXHVc1Wr9HbD7mMXIVPiOaUZPL6Wufw23FTy1pqAUIuQydtBc1Q==", + "dev": true, + "dependencies": { + "pretty-format": "^26.0.1" + } + }, + "node_modules/@testing-library/react-native/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@testing-library/react-native/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@testing-library/react-native/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@testing-library/react-native/node_modules/pretty-format": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.0.tgz", + "integrity": "sha512-Uumr9URVB7bm6SbaByXtx+zGlS+0loDkFMHP0kHahMjmfCtmFY03iqd++5v3Ld6iB5TocVXlBN/T+DXMn9d4BA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.1.10", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.10.tgz", + "integrity": "sha512-x8OM8XzITIMyiwl5Vmo2B1cR1S1Ipkyv4mdlbJjMa1lmuKvKY9FrBbEANIaMlnWn5Rf7uO+rC/VgYabNkE17Hw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.3.tgz", + "integrity": "sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.15.tgz", + "integrity": "sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", + "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==", + "dev": true + }, + "node_modules/@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, + "node_modules/@types/fs-extra": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.2.tgz", + "integrity": "sha512-jp0RI6xfZpi5JL8v7WQwpBEQTq63RqW2kxwTZt+m27LcJqQdPVU1yGnT1ZI4EtCDynQQJtIGyQahkiCGCS7e+A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", + "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/hammerjs": { + "version": "2.0.39", + "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.39.tgz", + "integrity": "sha512-lYR2Y/tV2ujpk/WyUc7S0VLI0a9hrtVIN9EwnrNo5oSEJI2cK2/XrgwOQmXLL3eTulOESvh9qP6si9+DWM9cOA==" + }, + "node_modules/@types/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==", + "dev": true + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dependencies": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==" + }, + "node_modules/@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "14.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.10.tgz", + "integrity": "sha512-yV1nWZPlMFpoXyoknm4S56y2nlTAuFYaJuQtYRAOU7xA/FJ9RY0Xm7QOkaYMMmr8ESdHIuUb6oQgR/0+2NqlyA==" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz", + "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==", + "dev": true + }, + "node_modules/@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true + }, + "node_modules/@types/ramda": { + "version": "0.27.32", + "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.27.32.tgz", + "integrity": "sha512-vdwZcWC+hlTxB//LZQLS1+VEdArImGI4yVKUpeqB8b9mBXgDFXCuQoOt8spQbi8fTyNLOdqRv6liSm2ckxWLog==", + "dependencies": { + "ts-toolbelt": "^6.15.1" + } + }, + "node_modules/@types/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-+nVsLKlcUCeMzD2ufHEYuJ9a2ovstb6Dp52A5VsoKxDXgvE051XgHI/33I1EymwkRGQkwnA0LkhnUzituGs4EQ==" + }, + "node_modules/@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" + }, + "node_modules/@types/tapable": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz", + "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==", + "dev": true + }, + "node_modules/@types/uglify-js": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.11.0.tgz", + "integrity": "sha512-I0Yd8TUELTbgRHq2K65j8rnDPAzAP+DiaF/syLem7yXwYLsHZhPd+AM2iXsWmf9P2F2NlFCgl5erZPQx9IbM9Q==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/webpack": { + "version": "4.41.22", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.22.tgz", + "integrity": "sha512-JQDJK6pj8OMV9gWOnN1dcLCyU9Hzs6lux0wBO4lr1+gyEhIBR9U3FMrz12t2GPkg110XAxEAw2WHF6g7nZIbRQ==", + "dev": true, + "dependencies": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-sources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.0.0.tgz", + "integrity": "sha512-a5kPx98CNFRKQ+wqawroFunvFqv7GHm/3KOI52NY9xWADgc8smu4R6prt4EU/M4QfVjvgBkMqU4fBhw3QfMVkg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + } + }, + "node_modules/@types/webpack-sources/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/webpack/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz", + "integrity": "sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "3.10.1", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", + "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz", + "integrity": "sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==", + "dev": true, + "dependencies": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "3.10.1", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.5.0.tgz", + "integrity": "sha512-C0cEO0cTMPJ/w4RA/KVe4LFFkkSh9VHoFzKmyaaDWAnPYIEzVCtJ+Un8GZoJhcvq+mPFXEsXa01lcZDHDG6Www==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.5.0", + "@typescript-eslint/visitor-keys": "4.5.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + } + }, + "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.5.0.tgz", + "integrity": "sha512-n2uQoXnyWNk0Les9MtF0gCK3JiWd987JQi97dMSxBOzVoLZXCNtxFckVqt1h8xuI1ix01t+iMY4h4rFMj/303g==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + } + }, + "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/visitor-keys": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.5.0.tgz", + "integrity": "sha512-UHq4FSa55NDZqscRU//O5ROFhHa9Hqn9KWTEvJGTArtTQp5GKv9Zqf6d/Q3YXXcFv4woyBml7fJQlQ+OuqRcHA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.5.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + } + }, + "node_modules/@typescript-eslint/scope-manager/node_modules/eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", + "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", + "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/visitor-keys": "3.10.1", + "debug": "^4.1.1", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", + "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + } + }, + "node_modules/@vercel/ncc": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.27.0.tgz", + "integrity": "sha512-DllIJQapnU2YwewIhh/4dYesmMQw3h2cFtabECc/zSJHqUbNa0eJuEkRa6DXbZvh1YPWBtYQoPV17NlDpBw1Vw==", + "dev": true, + "bin": { + "ncc": "dist/ncc/cli.js" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/7zip-bin": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.0.3.tgz", + "integrity": "sha512-GLyWIFBbGvpKPGo55JyRZAo4lVbnBiD52cKlw/0Vt+wnmKvWJkpZvsjVoaIolyBXDeAQKSicRtqFNPem9w0WYA==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/absolute-path": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/absolute-path/-/absolute-path-0.0.0.tgz", + "integrity": "sha1-p4di+9rftSl76ZsV01p4Wy8JW/c=" + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dependencies": { + "acorn": "^4.0.3" + } + }, + "node_modules/acorn-dynamic-import/node_modules/acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aggregate-error/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/ajv-cli": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ajv-cli/-/ajv-cli-5.0.0.tgz", + "integrity": "sha512-LY4m6dUv44HTyhV+u2z5uX4EhPYTM38Iv1jdgDJJJCyOOuqB8KtZEGjPZ2T+sh5ZIJrXUfgErYx/j3gLd3+PlQ==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0", + "fast-json-patch": "^2.0.0", + "glob": "^7.1.0", + "js-yaml": "^3.14.0", + "json-schema-migrate": "^2.0.0", + "json5": "^2.1.3", + "minimist": "^1.2.0" + }, + "bin": { + "ajv": "dist/index.js" + } + }, + "node_modules/ajv-cli/node_modules/ajv": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.0.2.tgz", + "integrity": "sha512-V0HGxJd0PiDF0ecHYIesTOqfd1gJguwQUOYfMfAWnRsWQEXfc5ifbUFhD3Wjc+O+y7VAqL+g07prq9gHQ/JOZQ==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "node_modules/ajv-cli/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + }, + "node_modules/align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dependencies": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/align-text/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anser": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", + "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==" + }, + "node_modules/ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, + "dependencies": { + "string-width": "^3.0.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-fragments": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", + "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", + "dependencies": { + "colorette": "^1.0.7", + "slice-ansi": "^2.0.0", + "strip-ansi": "^5.0.0" + } + }, + "node_modules/ansi-fragments/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-fragments/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-fragments/node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-fragments/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ansi-fragments/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/ansi-fragments/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-fragments/node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-fragments/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/app-builder-bin": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.5.10.tgz", + "integrity": "sha512-Jd+GW68lR0NeetgZDo47PdWBEPdnD+p0jEa7XaxjRC8u6Oo/wgJsfKUkORRgr2NpkD19IFKN50P6JYy04XHFLQ==", + "dev": true + }, + "node_modules/app-builder-lib": { + "version": "22.9.1", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-22.9.1.tgz", + "integrity": "sha512-KfXim/fiNwFW2SKffsjEMdAU7RbbEXn62x5YyXle1b4j9X/wEHW9iwox8De6y0hJdR+/kCC/49lI+VgNwLhV7A==", + "dev": true, + "dependencies": { + "@develar/schema-utils": "~2.6.5", + "7zip-bin": "~5.0.3", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.9", + "builder-util": "22.9.1", + "builder-util-runtime": "8.7.2", + "chromium-pickle-js": "^0.2.0", + "debug": "^4.3.0", + "ejs": "^3.1.5", + "electron-publish": "22.9.1", + "fs-extra": "^9.0.1", + "hosted-git-info": "^3.0.5", + "is-ci": "^2.0.0", + "isbinaryfile": "^4.0.6", + "js-yaml": "^3.14.0", + "lazy-val": "^1.0.4", + "minimatch": "^3.0.4", + "normalize-package-data": "^2.5.0", + "read-config-file": "6.0.0", + "sanitize-filename": "^1.6.3", + "semver": "^7.3.2", + "temp-file": "^3.3.7" + }, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/app-builder-lib/node_modules/debug": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.0.tgz", + "integrity": "sha512-jjO6JD2rKfiZQnBoRzhRTbXjHLGLfH+UtGkWLc/UXAh/rzZMyjbgn0NcfFpqT8nd1kTtFnDiJcrIFkq4UKeJVg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/app-builder-lib/node_modules/hosted-git-info": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/app-builder-lib/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/app-builder-lib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "dev": true, + "dependencies": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-includes/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" + }, + "node_modules/array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" + }, + "node_modules/array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz", + "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array.prototype.flatmap/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "devOptional": true + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", + "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", + "dev": true + }, + "node_modules/axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true + }, + "node_modules/babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "node_modules/babel-code-frame/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "dependencies": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-jest": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.0.tgz", + "integrity": "sha512-JI66yILI7stzjHccAoQtRKcUwJrJb4oMIxLTirL3GdAjGpaUBQSjZDFi9LsPkN4gftsS4R2AThAJwOjJxadwbg==", + "dev": true, + "dependencies": { + "@jest/transform": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/babel-jest/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/babel-jest/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "dev": true, + "dependencies": { + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 6.9" + } + }, + "node_modules/babel-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/babel-loader/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + } + }, + "node_modules/babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.5.0.tgz", + "integrity": "sha512-ck17uZFD3CDfuwCLATWZxkkuGGFhMij8quP8CNhwj8ek1mqFgbFzRJ30xwC04LLscj/aKsVFfRST+b5PT7rSuw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/babel-plugin-module-resolver": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.0.0.tgz", + "integrity": "sha512-3pdEq3PXALilSJ6dnC4wMWr0AZixHRM4utpdpBR9g5QG7B7JwWyukQv7a9hVxkbGFl+nQbrHDqqQOIBtTXTP/Q==", + "dev": true, + "dependencies": { + "find-babel-config": "^1.2.0", + "glob": "^7.1.6", + "pkg-up": "^3.1.0", + "reselect": "^4.0.0", + "resolve": "^1.13.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/babel-plugin-react-native-web": { + "version": "0.13.18", + "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.13.18.tgz", + "integrity": "sha512-f8pAxyKqXBNRIh8l4Sqju055BNec+DQlItdtutByYxULU0iJ1F7evIYE3skPKAkTB/xJH17l+n3Z8dVabGIIGg==", + "dev": true + }, + "node_modules/babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "node_modules/babel-plugin-syntax-trailing-function-commas": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", + "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==" + }, + "node_modules/babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-remove-console": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz", + "integrity": "sha1-uYA2DAZzhOJLNXpYjYB9PINSd4A=" + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.4.tgz", + "integrity": "sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "node_modules/babel-preset-fbjs": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz", + "integrity": "sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw==", + "dependencies": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-syntax-class-properties": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoped-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-member-expression-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-property-literals": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.5.0.tgz", + "integrity": "sha512-F2vTluljhqkiGSJGBg/jOruA8vIIIL11YrxRcO7nviNTMbbofPSHwnm8mgP7d/wS7wRSexRoI6X1A6T74d4LQA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^26.5.0", + "babel-preset-current-node-syntax": "^0.1.3" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "node_modules/babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-traverse/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/babel-traverse/node_modules/globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-traverse/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "node_modules/babel-types/node_modules/to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true, + "bin": { + "babylon": "bin/babylon.js" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base-64": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz", + "integrity": "sha1-eAqZyE59YAJgNhURxId2E78k9rs=" + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "node_modules/before-after-hook": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.0.tgz", + "integrity": "sha512-jH6rKQIfroBbhEXVmI7XmXe3ix5S/PgJqpzdDPnR8JGLHWNYLsYZ6tK5iWOF/Ra3oqEX0NobXGlzbiylIzVphQ==", + "dev": true + }, + "node_modules/big-integer": { + "version": "1.6.48", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", + "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bluebird-lst": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", + "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5" + } + }, + "node_modules/bn.js": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==" + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/body-parser/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "node_modules/boolean": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.1.tgz", + "integrity": "sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA==", + "dev": true, + "optional": true + }, + "node_modules/boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bplist-creator": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", + "integrity": "sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==", + "dependencies": { + "stream-buffers": "~2.2.0" + } + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dependencies": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-rsa/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.14.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz", + "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001135", + "electron-to-chromium": "^1.3.571", + "escalade": "^3.1.0", + "node-releases": "^1.1.61" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "node_modules/builder-util": { + "version": "22.9.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.9.1.tgz", + "integrity": "sha512-5hN/XOaYu4ZQUS6F+5CXE6jTo+NAnVqAxDuKGSaHWb9bejfv/rluChTLoY3/nJh7RFjkoyVjvFJv7zQDB1QmHw==", + "dev": true, + "dependencies": { + "@types/debug": "^4.1.5", + "@types/fs-extra": "^9.0.1", + "7zip-bin": "~5.0.3", + "app-builder-bin": "3.5.10", + "bluebird-lst": "^1.0.9", + "builder-util-runtime": "8.7.2", + "chalk": "^4.1.0", + "debug": "^4.3.0", + "fs-extra": "^9.0.1", + "is-ci": "^2.0.0", + "js-yaml": "^3.14.0", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.3.7" + } + }, + "node_modules/builder-util-runtime": { + "version": "8.7.2", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.2.tgz", + "integrity": "sha512-xBqv+8bg6cfnzAQK1k3OGpfaHg+QkPgIgpEkXNhouZ0WiUkyZCftuRc2LYzQrLucFywpa14Xbc6+hTbpq83yRA==", + "dependencies": { + "debug": "^4.1.1", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=8.2.5" + } + }, + "node_modules/builder-util/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/builder-util/node_modules/debug": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.0.tgz", + "integrity": "sha512-jjO6JD2rKfiZQnBoRzhRTbXjHLGLfH+UtGkWLc/UXAh/rzZMyjbgn0NcfFpqT8nd1kTtFnDiJcrIFkq4UKeJVg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "node_modules/bunyan": { + "version": "1.8.14", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.14.tgz", + "integrity": "sha512-LlahJUxXzZLuw/hetUQJmRgZ1LF6+cr5TPpRj6jf327AsiIq2jhYEH4oqUUkVKTor+9w2BT3oxVwhzE5lw9tcg==", + "dev": true, + "engines": [ + "node >=0.10.0" + ], + "dependencies": { + "moment": "^2.19.3" + }, + "bin": { + "bunyan": "bin/bunyan" + }, + "optionalDependencies": { + "dtrace-provider": "~0.8", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, + "node_modules/bunyan-debug-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bunyan-debug-stream/-/bunyan-debug-stream-1.1.1.tgz", + "integrity": "sha512-jJbQ1gXUL6vMmZVdbaTFK1v1sGa7axLrSQQwkB6HU9HCPTzsw2HsKcPHm1vgXZlEck/4IvEuRwg/9+083YelCg==", + "dev": true, + "dependencies": { + "colors": "^1.0.3", + "exception-formatter": "^1.0.4" + }, + "engines": { + "node": ">=0.10.1" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "dev": true, + "dependencies": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "engines": { + "node": ">=4" + } + }, + "node_modules/camel-case": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", + "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.1", + "tslib": "^1.10.0" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001148", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001148.tgz", + "integrity": "sha512-E66qcd0KMKZHNJQt9hiLZGE3J4zuTqE1OnU53miEVtylFbwOEmeA5OsRu90noZful+XGSQOni1aT2tiqu/9yYw==", + "dev": true + }, + "node_modules/capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dependencies": { + "rsvp": "^4.8.4" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "node_modules/center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dependencies": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + }, + "node_modules/child-process-promise": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/child-process-promise/-/child-process-promise-2.2.1.tgz", + "integrity": "sha1-RzChHvYQ+tRQuPIjx50x172tgHQ=", + "dev": true, + "dependencies": { + "cross-spawn": "^4.0.2", + "node-version": "^1.0.0", + "promise-polyfill": "^6.0.1" + } + }, + "node_modules/child-process-promise/node_modules/cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "node_modules/chokidar": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "optional": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + } + }, + "node_modules/chokidar/node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "optional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/chokidar/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "optional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/chokidar/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/chokidar/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", + "dev": true + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/classnames": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0=" + }, + "node_modules/cldr-core": { + "version": "38.1.0", + "resolved": "https://registry.npmjs.org/cldr-core/-/cldr-core-38.1.0.tgz", + "integrity": "sha512-Da9xKjDp4qGGIX0VDsBqTan09iR5nuYD2a/KkfEaUyqKhu6wFVNRiCpPDXeRbpVwPBY6PgemV8WiHatMhcpy4A==" + }, + "node_modules/clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/clean-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==", + "dev": true, + "dependencies": { + "@types/webpack": "^4.4.31", + "del": "^4.1.1" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-spinners": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", + "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" + }, + "node_modules/clipboard": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.4.tgz", + "integrity": "sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==", + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "dependencies": { + "for-own": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.0", + "shallow-clone": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coa/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/coa/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/coa/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "dependencies": { + "color-convert": "^1.9.1", + "color-string": "^1.5.4" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-string": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", + "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concurrently": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.3.0.tgz", + "integrity": "sha512-8MhqOB6PWlBfA2vJ8a0bSFKATOdWlHiQlk11IfmQBPaHVP8oP2gsh2MObE6UR3hqDHqvaIvLTyceNW6obVuFHQ==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "date-fns": "^2.0.1", + "lodash": "^4.17.15", + "read-pkg": "^4.0.1", + "rxjs": "^6.5.2", + "spawn-command": "^0.0.2-1", + "supports-color": "^6.1.0", + "tree-kill": "^1.2.2", + "yargs": "^13.3.0" + }, + "bin": { + "concurrently": "bin/concurrently.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/concurrently/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/concurrently/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/concurrently/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/concurrently/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/concurrently/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/concurrently/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/concurrently/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/concurrently/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/concurrently/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/concurrently/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/concurrently/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/concurrently/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/concurrently/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/concurrently/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/concurrently/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/concurrently/node_modules/read-pkg": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "dev": true, + "dependencies": { + "normalize-package-data": "^2.3.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/concurrently/node_modules/rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/concurrently/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/concurrently/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/concurrently/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/concurrently/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/concurrently/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "dev": true, + "optional": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/configstore/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/configstore/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/configstore/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", + "dev": true + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "node_modules/contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.2.1.tgz", + "integrity": "sha512-VH2ZTMIBsx4p++Lmpg77adZ0KUyM5gFR/9cuTrbneNnJlcQXUFvsNariPqq2dq2kV3F2skHiDGPQCyKWy1+U0Q==", + "dev": true, + "dependencies": { + "cacache": "^15.0.5", + "fast-glob": "^3.2.4", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/copy-webpack-plugin/node_modules/find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/copy-webpack-plugin/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/copy-webpack-plugin/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/copy-webpack-plugin/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/copy-webpack-plugin/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + }, + "node_modules/core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "dev": true, + "dependencies": { + "browserslist": "^4.8.5", + "semver": "7.0.0" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/create-react-class": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz", + "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==", + "dependencies": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "node_modules/cross-fetch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.6.tgz", + "integrity": "sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==", + "dependencies": { + "node-fetch": "2.6.1" + } + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/crypto-js": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", + "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-in-js-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz", + "integrity": "sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==", + "dependencies": { + "hyphenate-style-name": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "node_modules/css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "dependencies": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "node_modules/css-select/node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/css-to-react-native": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz", + "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", + "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/csso/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", + "dev": true + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/date-fns": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.17.0.tgz", + "integrity": "sha512-ZEhqxUtEZeGgg9eHNSOAJ8O9xqSgiJdrL0lzSSfMF54x6KXWJiOH/xntSJ9YomJPrYH/p08t6gWjGWq1SDJlSA==", + "dev": true, + "engines": { + "node": ">=0.11" + } + }, + "node_modules/date-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", + "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", + "dev": true, + "dependencies": { + "time-zone": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dayjs": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.9.3.tgz", + "integrity": "sha512-V+1SyIvkS+HmNbN1G7A9+ERbFTV9KTXu6Oor98v2xHmzzpp52OIJhQuJSTywWuBY5pyAEmlwbCi1Me87n/SLOw==" + }, + "node_modules/debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", + "dev": true + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "node_modules/deep-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-3.0.0.tgz", + "integrity": "sha512-YX2i9XjJ7h5q/aQ/IM9PEwEnDqETAIYbggmdDB3HLTlSgo1CxPsj6pvhPG68rq6SVE0+p+6Ywsm5fTYNrYtBWw==", + "dependencies": { + "is-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/deepmerge": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", + "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, + "node_modules/denodeify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=" + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "node_modules/detox": { + "version": "17.10.2", + "resolved": "https://registry.npmjs.org/detox/-/detox-17.10.2.tgz", + "integrity": "sha512-gKJgtdJfNk4ZHobd0S93F5i0LH9WthYPZ41fsa+8uA1bEnLKknGTBV3iG+YdHXGRRa7ZkAh0A2SAuwnl0z6P+Q==", + "dev": true, + "dependencies": { + "bunyan": "^1.8.12", + "bunyan-debug-stream": "^1.1.0", + "chalk": "^2.4.2", + "child-process-promise": "^2.2.0", + "find-up": "^4.1.0", + "fs-extra": "^4.0.2", + "funpermaproxy": "^1.0.1", + "get-port": "^2.1.0", + "ini": "^1.3.4", + "lodash": "^4.17.5", + "minimist": "^1.2.0", + "proper-lockfile": "^3.0.2", + "resolve-from": "^5.0.0", + "sanitize-filename": "^1.6.1", + "shell-quote": "^1.7.2", + "signal-exit": "^3.0.3", + "tail": "^2.0.0", + "telnet-client": "1.2.8", + "tempfile": "^2.0.0", + "which": "^1.3.1", + "ws": "^3.3.1", + "yargs": "^16.0.3", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "detox": "local-cli/cli.js" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/detox/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/detox/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/detox/node_modules/cliui": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.3.tgz", + "integrity": "sha512-Gj3QHTkVMPKqwP3f7B4KPkBZRMR9r4rfi5bXFpg1a+Svvj8l7q5CnkBkVQzfxT5DFSsGk2+PascOgL0JYkL2kw==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/detox/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/detox/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/detox/node_modules/fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/detox/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/detox/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/detox/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detox/node_modules/shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true + }, + "node_modules/detox/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/detox/node_modules/ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "node_modules/detox/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/detox/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/detox/node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/detox/node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/detox/node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/detox/node_modules/ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "node_modules/detox/node_modules/y18n": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.4.tgz", + "integrity": "sha512-deLOfD+RvFgrpAmSZgfGdWYE+OKyHcVHaRQ7NphG/63scpRvTHHeQMAxGGvaLVGJ+HYVcCXlzcTK0ZehFf+eHQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/detox/node_modules/yargs": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.1.0.tgz", + "integrity": "sha512-upWFJOmDdHN0syLuESuvXDmrRcWd1QafJolHskzaw79uZa7/x53gxQKiR07W59GWY1tFhhU/Th9DrtSfpS782g==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.2", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/detox/node_modules/yargs-parser": { + "version": "20.2.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.3.tgz", + "integrity": "sha512-emOFRT9WVHw03QSvN5qor9QQT9+sw5vwxfYweivSMHTcAXPefwVae2FjO7JJjj8hCE4CzPOPeFM83VwT29HCww==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/diff-so-fancy": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/diff-so-fancy/-/diff-so-fancy-1.3.0.tgz", + "integrity": "sha512-YV7XUOmtFiWqjh+HmW0Xve7LY1KoE2pbByyyGt9KkqGjdbjlAy4DIGr6J4NqTBuYRfpu8f6mNrir5Myj9iJ85w==", + "dev": true, + "bin": { + "diff-so-fancy": "diff-so-fancy" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dir-glob/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dmg-builder": { + "version": "22.9.1", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-22.9.1.tgz", + "integrity": "sha512-jc+DAirqmQrNT6KbDHdfEp8D1kD0DBTnsLhwUR3MX+hMBun5bT134LQzpdK0GKvd22GqF8L1Cz/NOgaVjscAXQ==", + "dev": true, + "dependencies": { + "app-builder-lib": "22.9.1", + "builder-util": "22.9.1", + "fs-extra": "^9.0.1", + "iconv-lite": "^0.6.2", + "js-yaml": "^3.14.0", + "sanitize-filename": "^1.6.3" + } + }, + "node_modules/dmg-builder/node_modules/iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "node_modules/dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", + "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==" + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/dot-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz", + "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==", + "dev": true, + "dependencies": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "node_modules/dtrace-provider": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", + "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "dev": true, + "optional": true, + "dependencies": { + "nan": "^2.14.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/ejs": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.5.tgz", + "integrity": "sha512-dldq3ZfFtgVTJMLjOe+/3sROTzALlL9E34V4/sDtUd/KlBSS0s6U1/+WPE1B4sj9CXHJpL1M6rhNJnc9Wbal9w==", + "dev": true, + "dependencies": { + "jake": "^10.6.1" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/electron/-/electron-9.3.2.tgz", + "integrity": "sha512-0lleEf9msAXGDi2GukAuiGdw3VDgSTlONOnJgqDEz1fuSEVsXz5RX+hNPKDsVDerLTFg/C34RuJf4LwHvkKcBA==", + "dev": true, + "dependencies": { + "@electron/get": "^1.0.1", + "@types/node": "^12.0.12", + "extract-zip": "^1.0.3" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 8.6" + } + }, + "node_modules/electron-builder": { + "version": "22.9.1", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-22.9.1.tgz", + "integrity": "sha512-GXPt8l5Mxwm1QKYopUM6/Tdh9W3695G6Ax+IFyj5pQ51G4SD5L1uq4/RkPSsOgs3rP7jNSV6g6OfDzdtVufPdA==", + "dev": true, + "dependencies": { + "@types/yargs": "^15.0.5", + "app-builder-lib": "22.9.1", + "bluebird-lst": "^1.0.9", + "builder-util": "22.9.1", + "builder-util-runtime": "8.7.2", + "chalk": "^4.1.0", + "dmg-builder": "22.9.1", + "fs-extra": "^9.0.1", + "is-ci": "^2.0.0", + "lazy-val": "^1.0.4", + "read-config-file": "6.0.0", + "sanitize-filename": "^1.6.3", + "update-notifier": "^4.1.1", + "yargs": "^16.0.3" + }, + "bin": { + "electron-builder": "out/cli/cli.js", + "install-app-deps": "out/cli/install-app-deps.js" + }, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/electron-builder/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-builder/node_modules/cliui": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.3.tgz", + "integrity": "sha512-Gj3QHTkVMPKqwP3f7B4KPkBZRMR9r4rfi5bXFpg1a+Svvj8l7q5CnkBkVQzfxT5DFSsGk2+PascOgL0JYkL2kw==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/electron-builder/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-builder/node_modules/y18n": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.4.tgz", + "integrity": "sha512-deLOfD+RvFgrpAmSZgfGdWYE+OKyHcVHaRQ7NphG/63scpRvTHHeQMAxGGvaLVGJ+HYVcCXlzcTK0ZehFf+eHQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-builder/node_modules/yargs": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.1.0.tgz", + "integrity": "sha512-upWFJOmDdHN0syLuESuvXDmrRcWd1QafJolHskzaw79uZa7/x53gxQKiR07W59GWY1tFhhU/Th9DrtSfpS782g==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.2", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-builder/node_modules/yargs-parser": { + "version": "20.2.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.3.tgz", + "integrity": "sha512-emOFRT9WVHw03QSvN5qor9QQT9+sw5vwxfYweivSMHTcAXPefwVae2FjO7JJjj8hCE4CzPOPeFM83VwT29HCww==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-context-menu": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/electron-context-menu/-/electron-context-menu-2.3.0.tgz", + "integrity": "sha512-XYsYkNY+jvX4C5o09qMuZoKL6e9frnQzBFehZSIiKp6zK0u3XYowJYDyK3vDKKZxYsOIGiE/Gbx40jERC03Ctw==", + "dependencies": { + "cli-truncate": "^2.0.0", + "electron-dl": "^3.0.0", + "electron-is-dev": "^1.0.1" + } + }, + "node_modules/electron-dl": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/electron-dl/-/electron-dl-3.0.2.tgz", + "integrity": "sha512-pRgE9Jbhoo5z6Vk3qi+vIrfpMDlCp2oB1UeR96SMnsfz073jj0AZGQwp69EdIcEvlUlwBSGyJK8Jt6OB6JLn+g==", + "dependencies": { + "ext-name": "^5.0.0", + "pupa": "^2.0.1", + "unused-filename": "^2.1.0" + } + }, + "node_modules/electron-is-dev": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-1.2.0.tgz", + "integrity": "sha512-R1oD5gMBPS7PVU8gJwH6CtT0e6VSoD0+SzSnYpNm+dBkcijgA+K7VAMHDfnRq/lkKPZArpzplTW6jfiMYosdzw==" + }, + "node_modules/electron-log": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-4.2.4.tgz", + "integrity": "sha512-CXbDU+Iwi+TjKzugKZmTRIORIPe3uQRqgChUl19fkW/reFUn5WP7dt+cNGT3bkLV8xfPilpkPFv33HgtmLLewQ==" + }, + "node_modules/electron-notarize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-1.0.0.tgz", + "integrity": "sha512-dsib1IAquMn0onCrNMJ6gtEIZn/azG8hZMCYOuZIMVMUeRMgBYHK1s5TK9P8xAcrAjh/2aN5WYHzgVSWX314og==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-publish": { + "version": "22.9.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.9.1.tgz", + "integrity": "sha512-ducLjRJLEeU87FaTCWaUyDjCoLXHkawkltP2zqS/n2PyGke54ZIql0tBuUheht4EpR8AhFbVJ11spSn1gy8r6w==", + "dev": true, + "dependencies": { + "@types/fs-extra": "^9.0.1", + "bluebird-lst": "^1.0.9", + "builder-util": "22.9.1", + "builder-util-runtime": "8.7.2", + "chalk": "^4.1.0", + "fs-extra": "^9.0.1", + "lazy-val": "^1.0.4", + "mime": "^2.4.6" + } + }, + "node_modules/electron-publish/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-publish/node_modules/mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/electron-reloader": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/electron-reloader/-/electron-reloader-1.2.0.tgz", + "integrity": "sha512-xLExyxtf7hICsoh8o+ylWQlmNE2scfTaYvUuyOYU9bWvj/Hlk5LqAnZE4nsT0LNKF1o7mrnAgixj/TJq8RV+Zw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "chokidar": "^3.5.0", + "date-time": "^3.1.0", + "electron-is-dev": "^1.2.0", + "find-up": "^5.0.0" + } + }, + "node_modules/electron-reloader/node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/electron-reloader/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-reloader/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-reloader/node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/electron-reloader/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-reloader/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-reloader/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/electron-reloader/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/electron-reloader/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-reloader/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-reloader/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-reloader/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-reloader/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/electron-serve": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/electron-serve/-/electron-serve-1.0.0.tgz", + "integrity": "sha512-Rsm4tjj1eK7NUWKgGw6NjHkjfB+bIXZh0ztybUYzqmwCm1wzb7zv95LERbwricDZfCsKHB0V57NgVvHdi2OOAQ==" + }, + "node_modules/electron-to-chromium": { + "version": "1.3.582", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.582.tgz", + "integrity": "sha512-0nCJ7cSqnkMC+kUuPs0YgklFHraWGl/xHqtZWWtOeVtyi+YqkoAOMGuZQad43DscXCQI/yizcTa3u6B5r+BLww==", + "dev": true + }, + "node_modules/electron-updater": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-4.3.5.tgz", + "integrity": "sha512-5jjN7ebvfj1cLI0VZMdCnJk6aC4bP+dy7ryBf21vArR0JzpRVk0OZHA2QBD+H5rm6ZSeDYHOY6+8PrMEqJ4wlQ==", + "dependencies": { + "@types/semver": "^7.3.1", + "builder-util-runtime": "8.7.2", + "fs-extra": "^9.0.1", + "js-yaml": "^3.14.0", + "lazy-val": "^1.0.4", + "lodash.isequal": "^4.5.0", + "semver": "^7.3.2" + } + }, + "node_modules/electron/node_modules/@types/node": { + "version": "12.12.68", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.68.tgz", + "integrity": "sha512-3RW2s24ewB7F9dAHvgb9FRvNHn6nO9IK6Eaknbz7HTOe2a5GVne5XbUh5+YA+kcCn67glyHhClUUdFP73LWrgQ==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "dependencies": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, + "node_modules/emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/enquirer/node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/env-paths": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/envinfo": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz", + "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "dependencies": { + "stackframe": "^1.1.1" + } + }, + "node_modules/errorhandler": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", + "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", + "dependencies": { + "accepts": "~1.3.7", + "escape-html": "~1.0.3" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "optional": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.11.0.tgz", + "integrity": "sha512-G9+qtYVCHaDi1ZuWzBsOWo2wSwd70TXnU6UHA3cTYHp7gCTXZcpggWFoUVAMRarg68qtPoNfFbzPh+VdOgmwmw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.1.3", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.0", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/eslint-config-airbnb": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.0.1.tgz", + "integrity": "sha512-hLb/ccvW4grVhvd6CT83bECacc+s4Z3/AEyWQdIT2KeTsG9dR7nx1gs7Iw4tDmGKozCNHFn4yZmRm3Tgy+XxyQ==", + "dev": true, + "dependencies": { + "eslint-config-airbnb-base": "^14.0.0", + "object.assign": "^4.1.0", + "object.entries": "^1.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.0.0.tgz", + "integrity": "sha512-2IDHobw97upExLmsebhtfoD3NAKhV4H0CJWP3Uprd/uk+cHuWYOczPVxQ8PxLFUAw7o3Th1RAU8u1DoUpr+cMA==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.7", + "object.assign": "^4.1.0", + "object.entries": "^1.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/eslint-config-expensify": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/eslint-config-expensify/-/eslint-config-expensify-2.0.15.tgz", + "integrity": "sha512-wFlWvG0V9mu+PLQeUF3liSnddwC+GNHisFACgK0ATwbJP7pAtAKH4AnL3K/aABDEDw83xAnWQvnlT5EnaJ8rAA==", + "dev": true, + "dependencies": { + "@lwc/eslint-plugin-lwc": "^0.11.0", + "babel-eslint": "^10.1.0", + "eslint": "6.8.0", + "eslint-config-airbnb": "18.0.1", + "eslint-config-airbnb-base": "14.0.0", + "eslint-plugin-import": "2.20.0", + "eslint-plugin-jsx-a11y": "6.2.3", + "eslint-plugin-react": "7.18.0" + } + }, + "node_modules/eslint-config-expensify/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/eslint-config-expensify/node_modules/ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "dependencies": { + "type-fest": "^0.11.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-config-expensify/node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-config-expensify/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-config-expensify/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-config-expensify/node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/eslint-config-expensify/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-config-expensify/node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/eslint-config-expensify/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/eslint-config-expensify/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/eslint-config-expensify/node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint-config-expensify/node_modules/eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + } + }, + "node_modules/eslint-config-expensify/node_modules/eslint-plugin-react": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.18.0.tgz", + "integrity": "sha512-p+PGoGeV4SaZRDsXqdj9OWcOrOpZn8gXoGPcIQTzo2IDMbAKhNDnME9myZWqO3Ic4R3YmwAZ1lDjWl2R2hMUVQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.1", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.2.3", + "object.entries": "^1.1.1", + "object.fromentries": "^2.0.2", + "object.values": "^1.1.1", + "prop-types": "^15.7.2", + "resolve": "^1.14.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-config-expensify/node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-config-expensify/node_modules/eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-config-expensify/node_modules/espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint-config-expensify/node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-config-expensify/node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-config-expensify/node_modules/globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-config-expensify/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-config-expensify/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-expensify/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-config-expensify/node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-config-expensify/node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-config-expensify/node_modules/inquirer/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-config-expensify/node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint-config-expensify/node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint-config-expensify/node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-config-expensify/node_modules/inquirer/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-config-expensify/node_modules/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-config-expensify/node_modules/jsx-ast-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", + "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.1", + "object.assign": "^4.1.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-config-expensify/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint-config-expensify/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-config-expensify/node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/eslint-config-expensify/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-config-expensify/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint-config-expensify/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint-config-expensify/node_modules/regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true, + "engines": { + "node": ">=6.5.0" + } + }, + "node_modules/eslint-config-expensify/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-config-expensify/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-config-expensify/node_modules/rxjs": { + "version": "6.6.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.6.tgz", + "integrity": "sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/eslint-config-expensify/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-config-expensify/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-config-expensify/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-config-expensify/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-config-expensify/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-config-expensify/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint-config-expensify/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-config-prettier": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.13.0.tgz", + "integrity": "sha512-LcT0i0LSmnzqK2t764pyIt7kKH2AuuqKRTtJTdddWxOiUja9HdG5GXBVF2gmCTvVYWVsTu8J2MhJLVGRh+pj8w==", + "dev": true, + "dependencies": { + "get-stdin": "^6.0.0" + }, + "bin": { + "eslint-config-prettier-check": "bin/cli.js" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-4.0.2.tgz", + "integrity": "sha512-EDpXor6lsjtTzZpLUn7KmXs02+nIjGcgees9BYjNkWra3jVq5vVa8IoCKgzT2M7dNNeoMBtaSG83Bd40N3poLw==", + "dev": true, + "dependencies": { + "find-cache-dir": "^3.3.1", + "fs-extra": "^8.1.0", + "loader-utils": "^2.0.0", + "object-hash": "^2.0.3", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/eslint-loader/node_modules/find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-loader/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/eslint-loader/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/eslint-loader/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-loader/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + } + }, + "node_modules/eslint-loader/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-loader/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-module-utils/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-module-utils/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-detox": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-detox/-/eslint-plugin-detox-1.0.0.tgz", + "integrity": "sha1-LZwBMOjrxM7Vbvtu6vDQ9cFjOY0=", + "dev": true, + "dependencies": { + "requireindex": "~1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-eslint-comments": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", + "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5", + "ignore": "^5.0.5" + }, + "engines": { + "node": ">=6.5.0" + } + }, + "node_modules/eslint-plugin-flowtype": { + "version": "2.50.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.3.tgz", + "integrity": "sha512-X+AoKVOr7Re0ko/yEXyM5SSZ0tazc6ffdIOocp2fFUlWoDt7DV0Bz99mngOkAFLOAWjqRA5jPwqUCbrx13XoxQ==", + "dev": true, + "dependencies": { + "lodash": "^4.17.10" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.0.tgz", + "integrity": "sha512-NK42oA0mUc8Ngn4kONOPsPB1XhbUvNHqF+g307dPV28aknPoiNnKLFd9em4nkswwepdF5ouieqv5Th/63U7YJQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.1", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.12.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "dependencies": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-plugin-import/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.1.0.tgz", + "integrity": "sha512-827YJ+E8B9PvXu/0eiVSNFfxxndbKv+qE/3GSMhdorCaeaOehtqHGX2YDW9B85TEOre9n/zscledkFW/KbnyGg==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "^4.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.5.0.tgz", + "integrity": "sha512-bW9IpSAKYvkqDGRZzayBXIgPsj2xmmVHLJ+flGSoN0fF98pGoKFhbunIol0VF2Crka7z984EEhFi623Rl7e6gg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.5.0", + "@typescript-eslint/types": "4.5.0", + "@typescript-eslint/typescript-estree": "4.5.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.5.0.tgz", + "integrity": "sha512-n2uQoXnyWNk0Les9MtF0gCK3JiWd987JQi97dMSxBOzVoLZXCNtxFckVqt1h8xuI1ix01t+iMY4h4rFMj/303g==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.5.0.tgz", + "integrity": "sha512-gN1mffq3zwRAjlYWzb5DanarOPdajQwx5MEWkWCk0XvqC8JpafDTeioDoow2L4CA/RkYZu7xEsGZRhqrTsAG8w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.5.0", + "@typescript-eslint/visitor-keys": "4.5.0", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.5.0.tgz", + "integrity": "sha512-UHq4FSa55NDZqscRU//O5ROFhHa9Hqn9KWTEvJGTArtTQp5GKv9Zqf6d/Q3YXXcFv4woyBml7fJQlQ+OuqRcHA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.5.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + } + }, + "node_modules/eslint-plugin-jest/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-plugin-jest/node_modules/eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-jest/node_modules/globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", + "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.4.5", + "aria-query": "^3.0.0", + "array-includes": "^3.0.3", + "ast-types-flow": "^0.0.7", + "axobject-query": "^2.0.2", + "damerau-levenshtein": "^1.0.4", + "emoji-regex": "^7.0.2", + "has": "^1.0.3", + "jsx-ast-utils": "^2.2.1" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/jsx-ast-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", + "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.1", + "object.assign": "^4.1.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz", + "integrity": "sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.21.4.tgz", + "integrity": "sha512-uHeQ8A0hg0ltNDXFu3qSfFqTNPXm1XithH6/SY318UX76CMj7Q599qWpgmMhVQyvhq36pm7qvoN3pb6/3jsTFg==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.1", + "array.prototype.flatmap": "^1.2.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "object.entries": "^1.1.2", + "object.fromentries": "^2.0.2", + "object.values": "^1.1.1", + "prop-types": "^15.7.2", + "resolve": "^1.17.0", + "string.prototype.matchall": "^4.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.1.2.tgz", + "integrity": "sha512-ykUeqkGyUGgwTtk78C0o8UG2fzwmgJ0qxBGPp2WqRKsTwcLuVf01kTDRAtOsd4u6whX2XOC8749n2vPydP82fg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-react-native": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-native/-/eslint-plugin-react-native-3.10.0.tgz", + "integrity": "sha512-4f5+hHYYq5wFhB5eptkPEAR7FfvqbS7AzScUOANfAMZtYw5qgnCxRq45bpfBaQF+iyPMim5Q8pubcpvLv75NAg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.7.4", + "eslint-plugin-react-native-globals": "^0.1.1" + } + }, + "node_modules/eslint-plugin-react-native-globals": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz", + "integrity": "sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g==", + "dev": true + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eslint/node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/espree": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", + "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", + "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", + "dependencies": { + "duplexer": "^0.1.1", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + }, + "node_modules/eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "dependencies": { + "original": "^1.0.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/exception-formatter": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/exception-formatter/-/exception-formatter-1.0.7.tgz", + "integrity": "sha512-zV45vEsjytJrwfGq6X9qd1Ll56cW4NC2mhCO6lqwMk4ZpA1fZ6C3UiaQM/X7if+7wZFmCgss3ahp9B/uVFuLRw==", + "dev": true, + "dependencies": { + "colors": "^1.0.3" + }, + "engines": { + "node": ">=0.10.1" + } + }, + "node_modules/exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==" + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.0.tgz", + "integrity": "sha512-EzhbZ1tbwcaa5Ok39BI11flIMeIUSlg1QsnXOrleaMvltwHsvIQPBtL710l+ma+qDFLUgktCXK4YuQzmHdm7cg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-regex-util": "^26.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/expect/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/expect/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/expect/node_modules/@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "node_modules/expect/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/expect/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/expect/node_modules/diff-sequences": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.5.0.tgz", + "integrity": "sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/expect/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/expect/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/expect/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/expect/node_modules/jest-diff": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.0.tgz", + "integrity": "sha512-IH09rKsdWY8YEY7ii2BHlSq59oXyF2pK3GoK+hOK9eD/x6009eNB5Jv1shLMKgxekodPzLlV7eZP1jPFQYds8w==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.5.0", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/expect/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/expect/node_modules/jest-matcher-utils": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.0.tgz", + "integrity": "sha512-BUy/dQYb7ELGRazmK4ZVkbfPYCaNnrMtw1YljVhcKzWUxBM0xQ+bffrfnMLdRZp4wUUcT4ahaVnA3VWZtXWP9Q==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.0", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/expect/node_modules/jest-message-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.0.tgz", + "integrity": "sha512-WPAeS38Kza29f04I0iOIQrXeiebRXjmn6cFehzI7KKJOgT0NmqYAcLgjWnIAfKs5FBmEQgje1kXab0DaLKCl2w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/expect/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/expect/node_modules/pretty-format": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.0.tgz", + "integrity": "sha512-Uumr9URVB7bm6SbaByXtx+zGlS+0loDkFMHP0kHahMjmfCtmFY03iqd++5v3Ld6iB5TocVXlBN/T+DXMn9d4BA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/expect/node_modules/stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/expect/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/expensify-common": { + "version": "1.0.0", + "resolved": "git+ssh://git@github.com/Expensify/expensify-common.git#d5edd0a956ef5c12fb6e9493d1f4608289f82a0e", + "integrity": "sha512-OeaWhX2jxPKakMVZxu5iOQ8mYTwvQtGblx8UVEBI0LPJvnGLXxxS6T7sUrATVfXAuWdrPjkxdX3cTDN5/s3Dow==", + "license": "MIT", + "dependencies": { + "classnames": "2.2.5", + "clipboard": "2.0.4", + "html-entities": "^1.3.1", + "jquery": "3.3.1", + "lodash": "4.17.21", + "prop-types": "15.7.2", + "react": "16.12.0", + "react-dom": "16.12.0", + "semver": "^7.3.4", + "simply-deferred": "git+https://github.com/Expensify/simply-deferred.git#77a08a95754660c7bd6e0b6979fdf84e8e831bf5", + "underscore": "1.9.1" + } + }, + "node_modules/expensify-common/node_modules/react": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", + "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expensify-common/node_modules/react-dom": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", + "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.18.0" + } + }, + "node_modules/expensify-common/node_modules/underscore": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "node_modules/ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dependencies": { + "mime-db": "^1.28.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dependencies": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dependencies": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + } + }, + "node_modules/extract-zip/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/extract-zip/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/fast-glob/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/fast-json-patch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-2.2.1.tgz", + "integrity": "sha512-4j5uBaTnsYAV5ebkidvxiLUYOwjQ+JSFljeqfTxCrH9bDmlCQaOJFS84oDJ2rAXZq2yskmk3ORfoP9DCwqFNig==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^2.0.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fast-json-patch/node_modules/fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fastq": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", + "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fbjs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-1.0.0.tgz", + "integrity": "sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA==", + "dependencies": { + "core-js": "^2.4.1", + "fbjs-css-vars": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, + "node_modules/fbjs-scripts": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fbjs-scripts/-/fbjs-scripts-1.2.0.tgz", + "integrity": "sha512-5krZ8T0Bf8uky0abPoCLrfa7Orxd8UH4Qq8hRUF2RZYNMu+FmEOrBc7Ib3YVONmxTXTlLAvyrrdrVmksDb2OqQ==", + "dependencies": { + "@babel/core": "^7.0.0", + "ansi-colors": "^1.0.1", + "babel-preset-fbjs": "^3.2.0", + "core-js": "^2.4.1", + "cross-spawn": "^5.1.0", + "fancy-log": "^1.3.2", + "object-assign": "^4.0.1", + "plugin-error": "^0.1.2", + "semver": "^5.1.0", + "through2": "^2.0.0" + } + }, + "node_modules/fbjs-scripts/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/fbjs-scripts/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/fbjs/node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "dependencies": { + "flat-cache": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/file-loader": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", + "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "node_modules/filelist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.1.tgz", + "integrity": "sha512-8zSK6Nu0DQIC08mUC46sWGXi+q3GGpKydAG36k+JDba6VRpkevvOWUW5a/PhShij4+vHT9M+ghgG7eM+a9JDUQ==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/find-babel-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", + "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==", + "dev": true, + "dependencies": { + "json5": "^0.5.1", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-babel-config/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/find-babel-config/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "dependencies": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=" + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-extra": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/funpermaproxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/funpermaproxy/-/funpermaproxy-1.0.1.tgz", + "integrity": "sha512-9pEzs5vnNtR7ZGihly98w/mQ7blsvl68Wj30ZCDAXy7qDN4CWLLjdfjtH/P2m6whsnaJkw15hysCNHMXue+wdA==", + "dev": true, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-port": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-2.1.0.tgz", + "integrity": "sha1-h4P53OvR7qSVozThpqJR54iHqxo=", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "devOptional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/global-agent": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.1.12.tgz", + "integrity": "sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg==", + "dev": true, + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "core-js": "^3.6.5", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-agent/node_modules/core-js": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", + "dev": true, + "optional": true + }, + "node_modules/global-agent/node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/global-agent/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/global-dirs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", + "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "dev": true, + "dependencies": { + "ini": "^1.3.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-modules/node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-tunnel-ng": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", + "integrity": "sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==", + "dev": true, + "optional": true, + "dependencies": { + "encodeurl": "^1.0.2", + "lodash": "^4.17.10", + "npm-conf": "^1.1.3", + "tunnel": "^0.0.6" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.1.tgz", + "integrity": "sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw==", + "dev": true, + "optional": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "dependencies": { + "delegate": "^3.1.2" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "node_modules/growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true, + "optional": true + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hermes-engine": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/hermes-engine/-/hermes-engine-0.5.1.tgz", + "integrity": "sha512-hLwqh8dejHayjlpvZY40e1aDCDvyP98cWx/L5DhAjSJLH8g4z9Tp08D7y4+3vErDsncPOdf1bxm+zUWpx0/Fxg==" + }, + "node_modules/hermes-profile-transformer": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz", + "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==", + "dependencies": { + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hermes-profile-transformer/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/html-webpack-plugin": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", + "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==", + "dev": true, + "dependencies": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.15", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "engines": { + "node": ">=6.9" + } + }, + "node_modules/html-webpack-plugin/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/html-webpack-plugin/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/htmlparser2/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/http-proxy/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz", + "integrity": "sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA==", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/inline-style-prefixer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-5.1.2.tgz", + "integrity": "sha512-PYUF+94gDfhy+LsQxM0g3d6Hge4l1pAqOSOiZuHWzMvQEGsbRQ/ck2WioLqrY2ZkHyPgVUXxn+hrkF7D6QUGbA==", + "dependencies": { + "css-in-js-utils": "^2.0.0" + } + }, + "node_modules/inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dependencies": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "node_modules/inquirer/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", + "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", + "dev": true, + "dependencies": { + "es-abstract": "^1.17.0-next.1", + "has": "^1.0.3", + "side-channel": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internal-slot/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "devOptional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "dev": true, + "optional": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "devOptional": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "dependencies": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-installed-globally/node_modules/is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isbinaryfile": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", + "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "dependencies": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "node_modules/isomorphic-fetch/node_modules/node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "dependencies": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "dev": true, + "dependencies": { + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jake/node_modules/async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + }, + "node_modules/jake/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/jake/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", + "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==", + "dev": true, + "dependencies": { + "@jest/core": "^26.6.0", + "import-local": "^3.0.2", + "jest-cli": "^26.6.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-changed-files": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.0.tgz", + "integrity": "sha512-k8PZzlp3cRWDe0fDc/pYs+c4w36+hiWXe1PpW/pW1UJmu1TNTAcQfZUrVYleij+uEqlY6z4mPv7Iff3kY0o5SQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-changed-files/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-changed-files/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/jest-changed-files/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-changed-files/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/jest-changed-files/node_modules/execa": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-changed-files/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/jest-changed-files/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-changed-files/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-changed-files/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "node_modules/jest-changed-files/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/jest-circus": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.0.tgz", + "integrity": "sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/babel__traverse": "^7.0.4", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^26.6.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.0", + "jest-matcher-utils": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-runner": "^26.6.0", + "jest-runtime": "^26.6.0", + "jest-snapshot": "^26.6.0", + "jest-util": "^26.6.0", + "pretty-format": "^26.6.0", + "stack-utils": "^2.0.2", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-circus/node_modules/@jest/console": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.0.tgz", + "integrity": "sha512-ArGcZWAEYMWmWnc/QvxLDvFmGRPvmHeulhS7FUUAlUGR5vS/SqMfArsGaYmIFEThSotCMnEihwx1h62I1eg5lg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.0", + "jest-util": "^26.6.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-circus/node_modules/@jest/test-result": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.0.tgz", + "integrity": "sha512-LV6X1ry+sKjseQsIFz3e6XAZYxwidvmeJFnVF08fq98q08dF1mJYI0lDq/LmH/jas+R4s0pwnNGiz1hfC4ZUBw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-circus/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-circus/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/jest-circus/node_modules/@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "node_modules/jest-circus/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-circus/node_modules/diff-sequences": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.5.0.tgz", + "integrity": "sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-circus/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-circus/node_modules/jest-diff": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.0.tgz", + "integrity": "sha512-IH09rKsdWY8YEY7ii2BHlSq59oXyF2pK3GoK+hOK9eD/x6009eNB5Jv1shLMKgxekodPzLlV7eZP1jPFQYds8w==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.5.0", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-circus/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-circus/node_modules/jest-matcher-utils": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.0.tgz", + "integrity": "sha512-BUy/dQYb7ELGRazmK4ZVkbfPYCaNnrMtw1YljVhcKzWUxBM0xQ+bffrfnMLdRZp4wUUcT4ahaVnA3VWZtXWP9Q==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.0", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-circus/node_modules/jest-message-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.0.tgz", + "integrity": "sha512-WPAeS38Kza29f04I0iOIQrXeiebRXjmn6cFehzI7KKJOgT0NmqYAcLgjWnIAfKs5FBmEQgje1kXab0DaLKCl2w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-circus/node_modules/jest-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.0.tgz", + "integrity": "sha512-/cUGqcnKeZMjvTQLfJo65nBOEZ/k0RB/8usv2JpfYya05u0XvBmKkIH5o5c4nCh9DD61B1YQjMGGqh1Ha0aXdg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-circus/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/pretty-format": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.0.tgz", + "integrity": "sha512-Uumr9URVB7bm6SbaByXtx+zGlS+0loDkFMHP0kHahMjmfCtmFY03iqd++5v3Ld6iB5TocVXlBN/T+DXMn9d4BA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jest-circus/node_modules/stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-circus/node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "node_modules/jest-circus/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-cli": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.0.tgz", + "integrity": "sha512-lJAMZGpmML+y3Kfln6L5DGRTfKGQ+n1JDM1RQstojSLUhe/EaXWR8vmcx70v4CyJKvFZs7c/0QDkPX5ra/aDew==", + "dev": true, + "dependencies": { + "@jest/core": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.0", + "jest-util": "^26.6.0", + "jest-validate": "^26.6.0", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-cli/node_modules/@jest/console": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.0.tgz", + "integrity": "sha512-ArGcZWAEYMWmWnc/QvxLDvFmGRPvmHeulhS7FUUAlUGR5vS/SqMfArsGaYmIFEThSotCMnEihwx1h62I1eg5lg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.0", + "jest-util": "^26.6.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-cli/node_modules/@jest/test-result": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.0.tgz", + "integrity": "sha512-LV6X1ry+sKjseQsIFz3e6XAZYxwidvmeJFnVF08fq98q08dF1mJYI0lDq/LmH/jas+R4s0pwnNGiz1hfC4ZUBw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-cli/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-cli/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/jest-cli/node_modules/@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "node_modules/jest-cli/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/camelcase": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz", + "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-cli/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-cli/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-cli/node_modules/jest-message-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.0.tgz", + "integrity": "sha512-WPAeS38Kza29f04I0iOIQrXeiebRXjmn6cFehzI7KKJOgT0NmqYAcLgjWnIAfKs5FBmEQgje1kXab0DaLKCl2w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-cli/node_modules/jest-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.0.tgz", + "integrity": "sha512-/cUGqcnKeZMjvTQLfJo65nBOEZ/k0RB/8usv2JpfYya05u0XvBmKkIH5o5c4nCh9DD61B1YQjMGGqh1Ha0aXdg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-cli/node_modules/jest-validate": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.0.tgz", + "integrity": "sha512-FKHNqvh1Pgs4NWas56gsTPmjcIoGAAzSVUCK1+g8euzuCGbmdEr8LRTtOEFjd29uMZUk0PhzmzKGlHPe6j3UWw==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-cli/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/pretty-format": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.0.tgz", + "integrity": "sha512-Uumr9URVB7bm6SbaByXtx+zGlS+0loDkFMHP0kHahMjmfCtmFY03iqd++5v3Ld6iB5TocVXlBN/T+DXMn9d4BA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jest-cli/node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-cli/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-config": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.0.tgz", + "integrity": "sha512-RCR1Kf7MGJ5waVCvrj/k3nCAJKquWZlzs8rkskzj0KlG392hNBOaYd5FQ4cCac08j6pwfIDOwNvMcy0/FqguJg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.0", + "@jest/types": "^26.6.0", + "babel-jest": "^26.6.0", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.0", + "jest-environment-node": "^26.6.0", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.0", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.0", + "jest-util": "^26.6.0", + "jest-validate": "^26.6.0", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-config/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-config/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/jest-config/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/camelcase": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz", + "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-config/node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-config/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-config/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-config/node_modules/jest-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.0.tgz", + "integrity": "sha512-/cUGqcnKeZMjvTQLfJo65nBOEZ/k0RB/8usv2JpfYya05u0XvBmKkIH5o5c4nCh9DD61B1YQjMGGqh1Ha0aXdg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-config/node_modules/jest-validate": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.0.tgz", + "integrity": "sha512-FKHNqvh1Pgs4NWas56gsTPmjcIoGAAzSVUCK1+g8euzuCGbmdEr8LRTtOEFjd29uMZUk0PhzmzKGlHPe6j3UWw==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-config/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/pretty-format": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.0.tgz", + "integrity": "sha512-Uumr9URVB7bm6SbaByXtx+zGlS+0loDkFMHP0kHahMjmfCtmFY03iqd++5v3Ld6iB5TocVXlBN/T+DXMn9d4BA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jest-config/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.0.tgz", + "integrity": "sha512-7LzSNwNviYnm4FWK46itIE03NqD/8O8/7tVQ5rwTdTNrmPMQoQ1Z7hEFQ1uzRReluOFislpurpnQ0QsclSiDkA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.0", + "pretty-format": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/jest-each/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-each/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-each/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each/node_modules/jest-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.0.tgz", + "integrity": "sha512-/cUGqcnKeZMjvTQLfJo65nBOEZ/k0RB/8usv2JpfYya05u0XvBmKkIH5o5c4nCh9DD61B1YQjMGGqh1Ha0aXdg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/pretty-format": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.0.tgz", + "integrity": "sha512-Uumr9URVB7bm6SbaByXtx+zGlS+0loDkFMHP0kHahMjmfCtmFY03iqd++5v3Ld6iB5TocVXlBN/T+DXMn9d4BA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jest-each/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.0.tgz", + "integrity": "sha512-bXO9IG7a3YlyiHxwfKF+OWoTA+GIw4FrD+Y0pb6CC+nKs5JuSRZmR2ovEX6PWo6KY42ka3JoZOp3KEnXiFPPCg==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.0", + "@jest/fake-timers": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/node": "*", + "jest-mock": "^26.6.0", + "jest-util": "^26.6.0", + "jsdom": "^16.4.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@jest/fake-timers": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.0.tgz", + "integrity": "sha512-7VQpjChrwlwvGNysS10lDBLOVLxMvMtpx0Xo6aIotzNVyojYk0NN0CR8R4T6h/eu7Zva/LB3P71jqwGdtADoag==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.0", + "jest-mock": "^26.6.0", + "jest-util": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "node_modules/jest-environment-jsdom/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jest-message-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.0.tgz", + "integrity": "sha512-WPAeS38Kza29f04I0iOIQrXeiebRXjmn6cFehzI7KKJOgT0NmqYAcLgjWnIAfKs5FBmEQgje1kXab0DaLKCl2w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jest-mock": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.0.tgz", + "integrity": "sha512-HsNmL8vVIn1rL1GWA21Drpy9Cl+7GImwbWz/0fkWHrUXVzuaG7rP0vwLtE+/n70Mt0U8nPkz8fxioi3SC0wqhw==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jest-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.0.tgz", + "integrity": "sha512-/cUGqcnKeZMjvTQLfJo65nBOEZ/k0RB/8usv2JpfYya05u0XvBmKkIH5o5c4nCh9DD61B1YQjMGGqh1Ha0aXdg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-jsdom/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-environment-node": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.0.tgz", + "integrity": "sha512-kWU6ZD1h6fs7sIl6ufuK0sXW/3d6WLaj48iow0NxhgU6eY89d9K+0MVmE0cRcVlh53yMyxTK6b+TnhLOnlGp/A==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.0", + "@jest/fake-timers": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/node": "*", + "jest-mock": "^26.6.0", + "jest-util": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-node/node_modules/@jest/fake-timers": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.0.tgz", + "integrity": "sha512-7VQpjChrwlwvGNysS10lDBLOVLxMvMtpx0Xo6aIotzNVyojYk0NN0CR8R4T6h/eu7Zva/LB3P71jqwGdtADoag==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.0", + "jest-mock": "^26.6.0", + "jest-util": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-node/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-node/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/jest-environment-node/node_modules/@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "node_modules/jest-environment-node/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-node/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-node/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-node/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-node/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-environment-node/node_modules/jest-message-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.0.tgz", + "integrity": "sha512-WPAeS38Kza29f04I0iOIQrXeiebRXjmn6cFehzI7KKJOgT0NmqYAcLgjWnIAfKs5FBmEQgje1kXab0DaLKCl2w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-node/node_modules/jest-mock": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.0.tgz", + "integrity": "sha512-HsNmL8vVIn1rL1GWA21Drpy9Cl+7GImwbWz/0fkWHrUXVzuaG7rP0vwLtE+/n70Mt0U8nPkz8fxioi3SC0wqhw==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-node/node_modules/jest-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.0.tgz", + "integrity": "sha512-/cUGqcnKeZMjvTQLfJo65nBOEZ/k0RB/8usv2JpfYya05u0XvBmKkIH5o5c4nCh9DD61B1YQjMGGqh1Ha0aXdg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-node/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-node/node_modules/stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-node/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-haste-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "dependencies": { + "@jest/types": "^24.9.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 6" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/jest-haste-map/node_modules/@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-haste-map/node_modules/@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-jasmine2": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.0.tgz", + "integrity": "sha512-2E3c+0A9y2OIK5caw5qlcm3b4doaf8FSfXKTX3xqKTUJoR4zXh0xvERBNWxZP9xMNXEi/2Z3LVsZpR2hROgixA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.0", + "@jest/source-map": "^26.5.0", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.0", + "jest-matcher-utils": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-runtime": "^26.6.0", + "jest-snapshot": "^26.6.0", + "jest-util": "^26.6.0", + "pretty-format": "^26.6.0", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-jasmine2/node_modules/@jest/console": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.0.tgz", + "integrity": "sha512-ArGcZWAEYMWmWnc/QvxLDvFmGRPvmHeulhS7FUUAlUGR5vS/SqMfArsGaYmIFEThSotCMnEihwx1h62I1eg5lg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.0", + "jest-util": "^26.6.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-jasmine2/node_modules/@jest/source-map": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.5.0.tgz", + "integrity": "sha512-jWAw9ZwYHJMe9eZq/WrsHlwF8E3hM9gynlcDpOyCb9bR8wEd9ZNBZCi7/jZyzHxC7t3thZ10gO2IDhu0bPKS5g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-jasmine2/node_modules/@jest/test-result": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.0.tgz", + "integrity": "sha512-LV6X1ry+sKjseQsIFz3e6XAZYxwidvmeJFnVF08fq98q08dF1mJYI0lDq/LmH/jas+R4s0pwnNGiz1hfC4ZUBw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-jasmine2/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-jasmine2/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/jest-jasmine2/node_modules/@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "node_modules/jest-jasmine2/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-jasmine2/node_modules/diff-sequences": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.5.0.tgz", + "integrity": "sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-jasmine2/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-diff": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.0.tgz", + "integrity": "sha512-IH09rKsdWY8YEY7ii2BHlSq59oXyF2pK3GoK+hOK9eD/x6009eNB5Jv1shLMKgxekodPzLlV7eZP1jPFQYds8w==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.5.0", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-matcher-utils": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.0.tgz", + "integrity": "sha512-BUy/dQYb7ELGRazmK4ZVkbfPYCaNnrMtw1YljVhcKzWUxBM0xQ+bffrfnMLdRZp4wUUcT4ahaVnA3VWZtXWP9Q==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.0", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-message-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.0.tgz", + "integrity": "sha512-WPAeS38Kza29f04I0iOIQrXeiebRXjmn6cFehzI7KKJOgT0NmqYAcLgjWnIAfKs5FBmEQgje1kXab0DaLKCl2w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.0.tgz", + "integrity": "sha512-/cUGqcnKeZMjvTQLfJo65nBOEZ/k0RB/8usv2JpfYya05u0XvBmKkIH5o5c4nCh9DD61B1YQjMGGqh1Ha0aXdg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-jasmine2/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2/node_modules/pretty-format": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.0.tgz", + "integrity": "sha512-Uumr9URVB7bm6SbaByXtx+zGlS+0loDkFMHP0kHahMjmfCtmFY03iqd++5v3Ld6iB5TocVXlBN/T+DXMn9d4BA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jest-jasmine2/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-jasmine2/node_modules/stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-jasmine2/node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "node_modules/jest-jasmine2/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-leak-detector": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.0.tgz", + "integrity": "sha512-3oMv34imWTl1/nwKnmE/DxYo3QqHnZeF3nO6UzldppkhW0Za7OY2DYyWiamqVzwdUrjhoQkY5g+aF6Oc3alYEQ==", + "dev": true, + "dependencies": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-leak-detector/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-leak-detector/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/jest-leak-detector/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-leak-detector/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-leak-detector/node_modules/pretty-format": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.0.tgz", + "integrity": "sha512-Uumr9URVB7bm6SbaByXtx+zGlS+0loDkFMHP0kHahMjmfCtmFY03iqd++5v3Ld6iB5TocVXlBN/T+DXMn9d4BA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jest-matcher-utils": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-message-util/node_modules/@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-message-util/node_modules/@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-message-util/node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "dependencies": { + "@jest/types": "^24.9.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-mock/node_modules/@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-mock/node_modules/@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz", + "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.0", + "read-pkg-up": "^7.0.1", + "resolve": "^1.17.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.0.tgz", + "integrity": "sha512-4di+XUT7LwJJ8b8qFEEDQssC5+aeVjLhvRICCaS4alh/EVS9JCT1armfJ3pnSS8t4o6659WbMmKVo82H4LuUVw==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-resolve/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/jest-resolve/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-resolve/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-resolve/node_modules/jest-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.0.tgz", + "integrity": "sha512-/cUGqcnKeZMjvTQLfJo65nBOEZ/k0RB/8usv2JpfYya05u0XvBmKkIH5o5c4nCh9DD61B1YQjMGGqh1Ha0aXdg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-resolve/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.0.tgz", + "integrity": "sha512-QpeN6pje8PQvFgT+wYOlzeycKd67qAvSw5FgYBiX2cTW+QTiObTzv/k09qRvT09rcCntFxUhy9VB1mgNGFLYIA==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.0", + "@jest/environment": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.0", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.0", + "jest-leak-detector": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-resolve": "^26.6.0", + "jest-runtime": "^26.6.0", + "jest-util": "^26.6.0", + "jest-worker": "^26.5.0", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runner/node_modules/@jest/console": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.0.tgz", + "integrity": "sha512-ArGcZWAEYMWmWnc/QvxLDvFmGRPvmHeulhS7FUUAlUGR5vS/SqMfArsGaYmIFEThSotCMnEihwx1h62I1eg5lg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.0", + "jest-util": "^26.6.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runner/node_modules/@jest/test-result": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.0.tgz", + "integrity": "sha512-LV6X1ry+sKjseQsIFz3e6XAZYxwidvmeJFnVF08fq98q08dF1mJYI0lDq/LmH/jas+R4s0pwnNGiz1hfC4ZUBw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runner/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runner/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/jest-runner/node_modules/@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "node_modules/jest-runner/node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/jest-runner/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-runner/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/jest-runner/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-runner/node_modules/jest-haste-map": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.0.tgz", + "integrity": "sha512-RpNqAGMR58uG9E9vWITorX2/R7he/tSbHWldX5upt1ymEcmCaXczqXxjqI6xOtRR8Ev6ZEYDfgSA5Fy7WHUL5w==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.5.0", + "jest-util": "^26.6.0", + "jest-worker": "^26.5.0", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/jest-runner/node_modules/jest-message-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.0.tgz", + "integrity": "sha512-WPAeS38Kza29f04I0iOIQrXeiebRXjmn6cFehzI7KKJOgT0NmqYAcLgjWnIAfKs5FBmEQgje1kXab0DaLKCl2w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runner/node_modules/jest-serializer": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.5.0.tgz", + "integrity": "sha512-+h3Gf5CDRlSLdgTv7y0vPIAoLgX/SI7T4v6hy+TEXMgYbv+ztzbg5PSN6mUXAT/hXYHvZRWm+MaObVfqkhCGxA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runner/node_modules/jest-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.0.tgz", + "integrity": "sha512-/cUGqcnKeZMjvTQLfJo65nBOEZ/k0RB/8usv2JpfYya05u0XvBmKkIH5o5c4nCh9DD61B1YQjMGGqh1Ha0aXdg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runner/node_modules/jest-worker": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz", + "integrity": "sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-runner/node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/jest-runner/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runner/node_modules/stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-runner/node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "node_modules/jest-runner/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-runtime": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.0.tgz", + "integrity": "sha512-JEz4YGnybFvtN4NLID6lsZf0bcd8jccwjWcG5TRE3fYVnxoX1egTthPjnC4btIwWJ6QaaHhtOQ/E3AGn8iClAw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.0", + "@jest/environment": "^26.6.0", + "@jest/fake-timers": "^26.6.0", + "@jest/globals": "^26.6.0", + "@jest/source-map": "^26.5.0", + "@jest/test-result": "^26.6.0", + "@jest/transform": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.0", + "jest-haste-map": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-mock": "^26.6.0", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.0", + "jest-snapshot": "^26.6.0", + "jest-util": "^26.6.0", + "jest-validate": "^26.6.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/@jest/console": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.0.tgz", + "integrity": "sha512-ArGcZWAEYMWmWnc/QvxLDvFmGRPvmHeulhS7FUUAlUGR5vS/SqMfArsGaYmIFEThSotCMnEihwx1h62I1eg5lg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.0", + "jest-util": "^26.6.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/@jest/fake-timers": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.0.tgz", + "integrity": "sha512-7VQpjChrwlwvGNysS10lDBLOVLxMvMtpx0Xo6aIotzNVyojYk0NN0CR8R4T6h/eu7Zva/LB3P71jqwGdtADoag==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.0", + "jest-mock": "^26.6.0", + "jest-util": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/@jest/source-map": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.5.0.tgz", + "integrity": "sha512-jWAw9ZwYHJMe9eZq/WrsHlwF8E3hM9gynlcDpOyCb9bR8wEd9ZNBZCi7/jZyzHxC7t3thZ10gO2IDhu0bPKS5g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/@jest/test-result": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.0.tgz", + "integrity": "sha512-LV6X1ry+sKjseQsIFz3e6XAZYxwidvmeJFnVF08fq98q08dF1mJYI0lDq/LmH/jas+R4s0pwnNGiz1hfC4ZUBw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/jest-runtime/node_modules/@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/jest-runtime/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-runtime/node_modules/camelcase": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz", + "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-runtime/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/jest-runtime/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/jest-haste-map": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.0.tgz", + "integrity": "sha512-RpNqAGMR58uG9E9vWITorX2/R7he/tSbHWldX5upt1ymEcmCaXczqXxjqI6xOtRR8Ev6ZEYDfgSA5Fy7WHUL5w==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.5.0", + "jest-util": "^26.6.0", + "jest-worker": "^26.5.0", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/jest-runtime/node_modules/jest-message-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.0.tgz", + "integrity": "sha512-WPAeS38Kza29f04I0iOIQrXeiebRXjmn6cFehzI7KKJOgT0NmqYAcLgjWnIAfKs5FBmEQgje1kXab0DaLKCl2w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/jest-mock": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.0.tgz", + "integrity": "sha512-HsNmL8vVIn1rL1GWA21Drpy9Cl+7GImwbWz/0fkWHrUXVzuaG7rP0vwLtE+/n70Mt0U8nPkz8fxioi3SC0wqhw==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/jest-serializer": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.5.0.tgz", + "integrity": "sha512-+h3Gf5CDRlSLdgTv7y0vPIAoLgX/SI7T4v6hy+TEXMgYbv+ztzbg5PSN6mUXAT/hXYHvZRWm+MaObVfqkhCGxA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/jest-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.0.tgz", + "integrity": "sha512-/cUGqcnKeZMjvTQLfJo65nBOEZ/k0RB/8usv2JpfYya05u0XvBmKkIH5o5c4nCh9DD61B1YQjMGGqh1Ha0aXdg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/jest-validate": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.0.tgz", + "integrity": "sha512-FKHNqvh1Pgs4NWas56gsTPmjcIoGAAzSVUCK1+g8euzuCGbmdEr8LRTtOEFjd29uMZUk0PhzmzKGlHPe6j3UWw==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/jest-worker": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz", + "integrity": "sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-runtime/node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runtime/node_modules/pretty-format": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.0.tgz", + "integrity": "sha512-Uumr9URVB7bm6SbaByXtx+zGlS+0loDkFMHP0kHahMjmfCtmFY03iqd++5v3Ld6iB5TocVXlBN/T+DXMn9d4BA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jest-runtime/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runtime/node_modules/stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-serializer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-snapshot": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.0.tgz", + "integrity": "sha512-mcqJZeIZqxomvBcsaiIbiEe2g7K1UxnUpTwjMoHb+DX4uFGnuZoZ6m28YOYRyCfZsdU9mmq73rNBnEH2atTR4Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.0", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.0", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.0", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.0", + "jest-matcher-utils": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-resolve": "^26.6.0", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/jest-snapshot/node_modules/@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "node_modules/jest-snapshot/node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/jest-snapshot/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/diff-sequences": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.5.0.tgz", + "integrity": "sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-diff": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.0.tgz", + "integrity": "sha512-IH09rKsdWY8YEY7ii2BHlSq59oXyF2pK3GoK+hOK9eD/x6009eNB5Jv1shLMKgxekodPzLlV7eZP1jPFQYds8w==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.5.0", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/jest-haste-map": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.0.tgz", + "integrity": "sha512-RpNqAGMR58uG9E9vWITorX2/R7he/tSbHWldX5upt1ymEcmCaXczqXxjqI6xOtRR8Ev6ZEYDfgSA5Fy7WHUL5w==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.5.0", + "jest-util": "^26.6.0", + "jest-worker": "^26.5.0", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/jest-snapshot/node_modules/jest-matcher-utils": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.0.tgz", + "integrity": "sha512-BUy/dQYb7ELGRazmK4ZVkbfPYCaNnrMtw1YljVhcKzWUxBM0xQ+bffrfnMLdRZp4wUUcT4ahaVnA3VWZtXWP9Q==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.0", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/jest-message-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.0.tgz", + "integrity": "sha512-WPAeS38Kza29f04I0iOIQrXeiebRXjmn6cFehzI7KKJOgT0NmqYAcLgjWnIAfKs5FBmEQgje1kXab0DaLKCl2w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/jest-serializer": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.5.0.tgz", + "integrity": "sha512-+h3Gf5CDRlSLdgTv7y0vPIAoLgX/SI7T4v6hy+TEXMgYbv+ztzbg5PSN6mUXAT/hXYHvZRWm+MaObVfqkhCGxA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/jest-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.0.tgz", + "integrity": "sha512-/cUGqcnKeZMjvTQLfJo65nBOEZ/k0RB/8usv2JpfYya05u0XvBmKkIH5o5c4nCh9DD61B1YQjMGGqh1Ha0aXdg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/jest-worker": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz", + "integrity": "sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-snapshot/node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/jest-snapshot/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.0.tgz", + "integrity": "sha512-Uumr9URVB7bm6SbaByXtx+zGlS+0loDkFMHP0kHahMjmfCtmFY03iqd++5v3Ld6iB5TocVXlBN/T+DXMn9d4BA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jest-snapshot/node_modules/stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "dependencies": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-util/node_modules/@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-util/node_modules/@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-util/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-util/node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-util/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dependencies": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-validate/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jest-validate/node_modules/react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==" + }, + "node_modules/jest-watcher": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.0.tgz", + "integrity": "sha512-gw5BvcgPi0PKpMlNWQjUet5C5A4JOYrT7gexdP6+DR/f7mRm7wE0o1GqwPwcTsTwo0/FNf9c/kIDXTRaSAYwlw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-watcher/node_modules/@jest/console": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.0.tgz", + "integrity": "sha512-ArGcZWAEYMWmWnc/QvxLDvFmGRPvmHeulhS7FUUAlUGR5vS/SqMfArsGaYmIFEThSotCMnEihwx1h62I1eg5lg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.0", + "jest-util": "^26.6.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-watcher/node_modules/@jest/test-result": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.0.tgz", + "integrity": "sha512-LV6X1ry+sKjseQsIFz3e6XAZYxwidvmeJFnVF08fq98q08dF1mJYI0lDq/LmH/jas+R4s0pwnNGiz1hfC4ZUBw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-watcher/node_modules/@jest/types": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-watcher/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/jest-watcher/node_modules/@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "node_modules/jest-watcher/node_modules/ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "dependencies": { + "type-fest": "^0.11.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-watcher/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-watcher/node_modules/jest-message-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.0.tgz", + "integrity": "sha512-WPAeS38Kza29f04I0iOIQrXeiebRXjmn6cFehzI7KKJOgT0NmqYAcLgjWnIAfKs5FBmEQgje1kXab0DaLKCl2w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-watcher/node_modules/jest-util": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.0.tgz", + "integrity": "sha512-/cUGqcnKeZMjvTQLfJo65nBOEZ/k0RB/8usv2JpfYya05u0XvBmKkIH5o5c4nCh9DD61B1YQjMGGqh1Ha0aXdg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.0", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-watcher/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-watcher/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-watcher/node_modules/type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dependencies": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-worker/node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest/node_modules/import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jetifier": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.6.tgz", + "integrity": "sha512-JNAkmPeB/GS2tCRqUzRPsTOHpGDah7xP18vGJfIjZC+W2sxEHbxgJxetIjIqhjQ3yYbYNEELkM/spKLtwoOSUQ==", + "bin": { + "jetifier": "bin/jetify", + "jetifier-standalone": "bin/jetifier-standalone", + "jetify": "bin/jetify" + } + }, + "node_modules/jquery": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", + "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "node_modules/jsc-android": { + "version": "245459.0.0", + "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-245459.0.0.tgz", + "integrity": "sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg==" + }, + "node_modules/jsdom": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", + "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "acorn": "^7.1.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.2.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.0", + "domexception": "^2.0.1", + "escodegen": "^1.14.1", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "saxes": "^5.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsdom/node_modules/ws": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", + "dev": true, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "node_modules/json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "node_modules/json-schema-migrate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/json-schema-migrate/-/json-schema-migrate-2.0.0.tgz", + "integrity": "sha512-r38SVTtojDRp4eD6WsCqiE0eNDt4v1WalBXb9cyZYw9ai5cGtBwzRNWjHzJl38w6TxFkXAIA7h+fyX3tnrAFhQ==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + } + }, + "node_modules/json-schema-migrate/node_modules/ajv": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.0.2.tgz", + "integrity": "sha512-V0HGxJd0PiDF0ecHYIesTOqfd1gJguwQUOYfMfAWnRsWQEXfc5ifbUFhD3Wjc+O+y7VAqL+g07prq9gHQ/JOZQ==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "node_modules/json-schema-migrate/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dependencies": { + "jsonify": "~0.0.0" + } + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "node_modules/json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "dependencies": { + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" + } + }, + "node_modules/jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz", + "integrity": "sha512-d4/UOjg+mxAWxCiF0c5UTSwyqbchkbqCvK87aBovhnh8GtysTjWmgC63tY0cJx/HzGgm9qnA147jVBdpOiQ2RA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.1", + "object.assign": "^4.1.1" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dependencies": { + "graceful-fs": "^4.1.9" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lazy-val": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.4.tgz", + "integrity": "sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==" + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" + }, + "node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/logkitty": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", + "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", + "dependencies": { + "ansi-fragments": "^0.2.1", + "dayjs": "^1.8.15", + "yargs": "^15.1.0" + }, + "bin": { + "logkitty": "bin/logkitty.js" + } + }, + "node_modules/loglevel": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz", + "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", + "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "dev": true, + "dependencies": { + "tslib": "^1.10.0" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/make-cancellable-promise": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/make-cancellable-promise/-/make-cancellable-promise-1.0.0.tgz", + "integrity": "sha512-+YO6Grg2uy/z8Mv3uV90OP6yAUHIF43YGgEFbejmBrK9VWFsVO6DvzFMcopXr9wCNg3/QIltIKiSCROC7zFB2g==" + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/make-event-props": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/make-event-props/-/make-event-props-1.2.0.tgz", + "integrity": "sha512-BmWFkm/jZzVH9A0tEBdkjAARUz/eha+5IRyfOndeSMKRadkgR5DawoBHoRwLxkYmjJOI5bHkXKpaZocxj+dKgg==" + }, + "node_modules/makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dependencies": { + "tmpl": "1.0.x" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=" + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/matcher/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/merge-class-names": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/merge-class-names/-/merge-class-names-1.4.0.tgz", + "integrity": "sha512-xNdBM7s+6uD+vNZJEymqrFbMBCDGzoA8clZTcj2F1XIy1QQKF+wjFVv7iDZFfdCBnViTdt54A4Ye2lmBsXrBjQ==" + }, + "node_modules/merge-deep": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", + "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "clone-deep": "^0.2.4", + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-deep/node_modules/clone-deep": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", + "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", + "dev": true, + "dependencies": { + "for-own": "^0.1.3", + "is-plain-object": "^2.0.1", + "kind-of": "^3.0.2", + "lazy-cache": "^1.0.3", + "shallow-clone": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-deep/node_modules/for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-deep/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-deep/node_modules/shallow-clone": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", + "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.1", + "kind-of": "^2.0.1", + "lazy-cache": "^0.2.3", + "mixin-object": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-deep/node_modules/shallow-clone/node_modules/kind-of": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", + "dev": true, + "dependencies": { + "is-buffer": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-deep/node_modules/shallow-clone/node_modules/lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "node_modules/merge-refs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.0.0.tgz", + "integrity": "sha512-WZ4S5wqD9FCR9hxkLgvcHJCBxzXzy3VVE6p8W2OzxRzB+hLRlcadGE2bW9xp2KSzk10rvp4y+pwwKO6JQVguMg==" + }, + "node_modules/merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/metro": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.58.0.tgz", + "integrity": "sha512-yi/REXX+/s4r7RjzXht+E+qE6nzvFIrEXO5Q61h+70Q7RODMU8EnlpXx04JYk7DevHuMhFaX+NWhCtRINzR4zA==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/core": "^7.0.0", + "@babel/generator": "^7.5.0", + "@babel/parser": "^7.0.0", + "@babel/plugin-external-helpers": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "absolute-path": "^0.0.0", + "async": "^2.4.0", + "babel-preset-fbjs": "^3.3.0", + "buffer-crc32": "^0.2.13", + "chalk": "^2.4.1", + "ci-info": "^2.0.0", + "concat-stream": "^1.6.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "denodeify": "^1.2.1", + "eventemitter3": "^3.0.0", + "fbjs": "^1.0.0", + "fs-extra": "^1.0.0", + "graceful-fs": "^4.1.3", + "image-size": "^0.6.0", + "invariant": "^2.2.4", + "jest-haste-map": "^24.7.1", + "jest-worker": "^24.6.0", + "json-stable-stringify": "^1.0.1", + "lodash.throttle": "^4.1.1", + "merge-stream": "^1.0.1", + "metro-babel-register": "0.58.0", + "metro-babel-transformer": "0.58.0", + "metro-cache": "0.58.0", + "metro-config": "0.58.0", + "metro-core": "0.58.0", + "metro-inspector-proxy": "0.58.0", + "metro-minify-uglify": "0.58.0", + "metro-react-native-babel-preset": "0.58.0", + "metro-resolver": "0.58.0", + "metro-source-map": "0.58.0", + "metro-symbolicate": "0.58.0", + "mime-types": "2.1.11", + "mkdirp": "^0.5.1", + "node-fetch": "^2.2.0", + "nullthrows": "^1.1.1", + "resolve": "^1.5.0", + "rimraf": "^2.5.4", + "serialize-error": "^2.1.0", + "source-map": "^0.5.6", + "strip-ansi": "^4.0.0", + "temp": "0.8.3", + "throat": "^4.1.0", + "wordwrap": "^1.0.0", + "write-file-atomic": "^1.2.0", + "ws": "^1.1.5", + "xpipe": "^1.0.5", + "yargs": "^14.2.0" + }, + "bin": { + "metro": "src/cli.js" + } + }, + "node_modules/metro-babel-register": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-babel-register/-/metro-babel-register-0.59.0.tgz", + "integrity": "sha512-JtWc29erdsXO/V3loenXKw+aHUXgj7lt0QPaZKPpctLLy8kcEpI/8pfXXgVK9weXICCpCnYtYncIosAyzh0xjg==", + "dependencies": { + "@babel/core": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/register": "^7.0.0", + "escape-string-regexp": "^1.0.5" + } + }, + "node_modules/metro-babel-transformer": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.58.0.tgz", + "integrity": "sha512-yBX3BkRhw2TCNPhe+pmLSgsAEA3huMvnX08UwjFqSXXI1aiqzRQobn92uKd1U5MM1Vx8EtXVomlJb95ZHNAv6A==", + "dependencies": { + "@babel/core": "^7.0.0", + "metro-source-map": "0.58.0" + } + }, + "node_modules/metro-babel-transformer/node_modules/metro-source-map": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.58.0.tgz", + "integrity": "sha512-yvN1YPmejmgiiS7T1aKBiiUTHPw2Vcm3r2TZ+DY92z/9PR4alysIywrCs/fTHs8rbDcKM5VfPCKGLpkBrbKeOw==", + "dependencies": { + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.58.0", + "ob1": "0.58.0", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, + "node_modules/metro-cache": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.58.0.tgz", + "integrity": "sha512-jjW9zCTKxhgKcVkyQ6LHyna9Zdf4TK/45vvT1fPyyTk1RY82ZYjU1qs+84ycKEd08Ka4YcK9xcUew9SIDJYI8Q==", + "dependencies": { + "jest-serializer": "^24.4.0", + "metro-core": "0.58.0", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4" + } + }, + "node_modules/metro-cache-key": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.64.0.tgz", + "integrity": "sha512-O9B65G8L/fopck45ZhdRosyVZdMtUQuX5mBWEC1NRj02iWBIUPLmYMjrunqIe8vHipCMp3DtTCm/65IlBmO8jg==" + }, + "node_modules/metro-config": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.64.0.tgz", + "integrity": "sha512-QhM4asnX5KhlRWaugwVGNNXhX0Z85u5nK0UQ/A90bBb4xWyXqUe20e788VtdA75rkQiiI6wXTCIHWT0afbnjwQ==", + "dependencies": { + "cosmiconfig": "^5.0.5", + "jest-validate": "^26.5.2", + "metro": "0.64.0", + "metro-cache": "0.64.0", + "metro-core": "0.64.0", + "metro-runtime": "0.64.0" + } + }, + "node_modules/metro-config/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/metro-config/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/metro-config/node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/metro-config/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/metro-config/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/metro-config/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/metro-config/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/metro-config/node_modules/fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" + } + }, + "node_modules/metro-config/node_modules/fsevents": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.2.1.tgz", + "integrity": "sha512-bTLYHSeC0UH/EFXS9KqWnXuOl/wHK5Z/d+ghd5AsFMYN7wIGkUCOJyzy88+wJKkZPGON8u4Z9f6U4FdgURE9qA==", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/metro-config/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/metro-config/node_modules/jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "dependencies": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/metro-config/node_modules/jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/metro-config/node_modules/jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/metro-config/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/metro-config/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/metro-config/node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/metro-config/node_modules/metro": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.64.0.tgz", + "integrity": "sha512-G2OC08Rzfs0kqnSEuKo2yZxR+/eNUpA93Ru45c60uN0Dw3HPrDi+ZBipgFftC6iLE0l+6hu8roFFIofotWxybw==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/core": "^7.0.0", + "@babel/generator": "^7.5.0", + "@babel/parser": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "absolute-path": "^0.0.0", + "accepts": "^1.3.7", + "async": "^2.4.0", + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "denodeify": "^1.2.1", + "error-stack-parser": "^2.0.6", + "fs-extra": "^1.0.0", + "graceful-fs": "^4.1.3", + "image-size": "^0.6.0", + "invariant": "^2.2.4", + "jest-haste-map": "^26.5.2", + "jest-worker": "^26.0.0", + "lodash.throttle": "^4.1.1", + "metro-babel-register": "0.64.0", + "metro-babel-transformer": "0.64.0", + "metro-cache": "0.64.0", + "metro-cache-key": "0.64.0", + "metro-config": "0.64.0", + "metro-core": "0.64.0", + "metro-hermes-compiler": "0.64.0", + "metro-inspector-proxy": "0.64.0", + "metro-minify-uglify": "0.64.0", + "metro-react-native-babel-preset": "0.64.0", + "metro-resolver": "0.64.0", + "metro-runtime": "0.64.0", + "metro-source-map": "0.64.0", + "metro-symbolicate": "0.64.0", + "metro-transform-plugins": "0.64.0", + "metro-transform-worker": "0.64.0", + "mime-types": "^2.1.27", + "mkdirp": "^0.5.1", + "node-fetch": "^2.2.0", + "nullthrows": "^1.1.1", + "rimraf": "^2.5.4", + "serialize-error": "^2.1.0", + "source-map": "^0.5.6", + "strip-ansi": "^6.0.0", + "temp": "0.8.3", + "throat": "^5.0.0", + "ws": "^1.1.5", + "yargs": "^15.3.1" + }, + "bin": { + "metro": "src/cli.js" + } + }, + "node_modules/metro-config/node_modules/metro-babel-register": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-babel-register/-/metro-babel-register-0.64.0.tgz", + "integrity": "sha512-Kf6YvE3kIRumGnjK0Q9LqGDIdnsX9eFGtNBmBuCVDuB9wGGA/5CgX8We8W7Y44dz1RGTcHJRhfw5iGg+pwC3aQ==", + "dependencies": { + "@babel/core": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/register": "^7.0.0", + "escape-string-regexp": "^1.0.5" + } + }, + "node_modules/metro-config/node_modules/metro-babel-transformer": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.64.0.tgz", + "integrity": "sha512-itZaxKTgmKGEZWxNzbSZBc22NngrMZzoUNuU92aHSTGkYi2WH4XlvzEHsstmIKHMsRVKl75cA+mNmgk4gBFJKw==", + "dependencies": { + "@babel/core": "^7.0.0", + "metro-source-map": "0.64.0", + "nullthrows": "^1.1.1" + } + }, + "node_modules/metro-config/node_modules/metro-cache": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.64.0.tgz", + "integrity": "sha512-QvGfxe/1QQYM9XOlR8W1xqE9eHDw/AgJIgYGn/TxZxBu9Zga+Rgs1omeSZju45D8w5VWgMr83ma5kACgzvOecg==", + "dependencies": { + "metro-core": "0.64.0", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4" + } + }, + "node_modules/metro-config/node_modules/metro-core": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.64.0.tgz", + "integrity": "sha512-v8ZQ5j72EaUwamQ8pLfHlOHTyp7SbdazvHPzFGDpHnwIQqIT0Bw3Syg8R4regTlVG3ngpeSEAi005UITljmMcQ==", + "dependencies": { + "jest-haste-map": "^26.5.2", + "lodash.throttle": "^4.1.1", + "metro-resolver": "0.64.0" + } + }, + "node_modules/metro-config/node_modules/metro-inspector-proxy": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.64.0.tgz", + "integrity": "sha512-KywbH3GNSz9Iqw4UH3smgaV2dBHHYMISeN7ORntDL/G+xfgPc6vt13d+zFb907YpUcXj5N0vdoiAHI5V/0y8IA==", + "dependencies": { + "connect": "^3.6.5", + "debug": "^2.2.0", + "ws": "^1.1.5", + "yargs": "^15.3.1" + }, + "bin": { + "metro-inspector-proxy": "src/cli.js" + } + }, + "node_modules/metro-config/node_modules/metro-minify-uglify": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.64.0.tgz", + "integrity": "sha512-DRwRstqXR5qfte9Nuwoov5dRXxL7fJeVlO5fGyOajWeO3+AgPjvjXh/UcLJqftkMWTPGUFuzAD5/7JC5v5FLWw==", + "dependencies": { + "uglify-es": "^3.1.9" + } + }, + "node_modules/metro-config/node_modules/metro-react-native-babel-preset": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.64.0.tgz", + "integrity": "sha512-HcZ0RWQRuJfpPiaHyFQJzcym+/dDIVUPwUAXWoub/C4GkGu+mPjp8vqK6g0FxokCnnI2TK0gZTza2IDfiNNscQ==", + "dependencies": { + "@babel/core": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-exponentiation-operator": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-assign": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "react-refresh": "^0.4.0" + } + }, + "node_modules/metro-config/node_modules/metro-resolver": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.64.0.tgz", + "integrity": "sha512-cJ26Id8Zf+HmS/1vFwu71K3u7ep/+HeXXAJIeVDYf+niE7AWB9FijyMtAlQgbD8elWqv1leJCnQ/xHRFBfGKYA==", + "dependencies": { + "absolute-path": "^0.0.0" + } + }, + "node_modules/metro-config/node_modules/metro-source-map": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.64.0.tgz", + "integrity": "sha512-OCG2rtcp5cLEGYvAbfkl6mEc0J2FPRP4/UCEly+juBk7hawS9bCBMBfhJm/HIsvY1frk6nT2Vsl1O8YBbwyx2g==", + "dependencies": { + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.64.0", + "nullthrows": "^1.1.1", + "ob1": "0.64.0", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, + "node_modules/metro-config/node_modules/metro-symbolicate": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.64.0.tgz", + "integrity": "sha512-qIi+YRrDWnLVmydj6gwidYLPaBsakZRibGWSspuXgHAxOI3UuLwlo4dpQ73Et0gyHjI7ZvRMRY8JPiOntf9AQQ==", + "dependencies": { + "invariant": "^2.2.4", + "metro-source-map": "0.64.0", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "through2": "^2.0.1", + "vlq": "^1.0.0" + }, + "bin": { + "metro-symbolicate": "src/index.js" + }, + "engines": { + "node": ">=8.3" + } + }, + "node_modules/metro-config/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/metro-config/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/metro-config/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/metro-config/node_modules/ob1": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.64.0.tgz", + "integrity": "sha512-CO1N+5dhvy+MoAwxz8+fymEUcwsT4a+wHhrHFb02LppcJdHxgcBWviwEhUwKOD2kLMQ7ijrrzybOqpGcqEtvpQ==" + }, + "node_modules/metro-config/node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" + }, + "node_modules/metro-config/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/metro-core": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.58.0.tgz", + "integrity": "sha512-RzXUjGFmCLOyzUqcKDvr91AldGtIOxnzNZrWUIiG8uC3kerVLo0mQp4YH3+XVm6fMNiLMg6iER7HLqD+MbpUjQ==", + "dependencies": { + "jest-haste-map": "^24.7.1", + "lodash.throttle": "^4.1.1", + "metro-resolver": "0.58.0", + "wordwrap": "^1.0.0" + } + }, + "node_modules/metro-hermes-compiler": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-hermes-compiler/-/metro-hermes-compiler-0.64.0.tgz", + "integrity": "sha512-CLAjVDWGAoGhbi2ZyPHnH5YDdfrDIx6+tzFWfHGIMTZkYBXsYta9IfYXBV8lFb6BIbrXLjlXZAOoosknetMPOA==" + }, + "node_modules/metro-inspector-proxy": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.58.0.tgz", + "integrity": "sha512-oFqTyNTJdCdvcw1Ha6SKE7ITbSaoTbO4xpYownIoJR+WZ0ZfxbWpp225JkHuBJm9UcBAnG9c0CME924m3uBbaw==", + "dependencies": { + "connect": "^3.6.5", + "debug": "^2.2.0", + "rxjs": "^5.4.3", + "ws": "^1.1.5", + "yargs": "^14.2.0" + }, + "bin": { + "metro-inspector-proxy": "src/cli.js" + } + }, + "node_modules/metro-inspector-proxy/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/metro-inspector-proxy/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/metro-inspector-proxy/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/metro-inspector-proxy/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/metro-inspector-proxy/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/metro-inspector-proxy/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/metro-inspector-proxy/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/metro-inspector-proxy/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/metro-inspector-proxy/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/metro-inspector-proxy/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/metro-inspector-proxy/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/metro-inspector-proxy/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/metro-inspector-proxy/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/metro-inspector-proxy/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/metro-inspector-proxy/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/metro-inspector-proxy/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/metro-inspector-proxy/node_modules/yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dependencies": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + } + }, + "node_modules/metro-inspector-proxy/node_modules/yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/metro-minify-uglify": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.58.0.tgz", + "integrity": "sha512-vRHsA7bCi7eCn3LXLm20EfY2NoWDyYOnmWaq/N8LB0OxL2L5DXRqMYAQK+prWGJ5S1yvVnDuuNVP+peQ9851TA==", + "dependencies": { + "uglify-es": "^3.1.9" + } + }, + "node_modules/metro-react-native-babel-preset": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.61.0.tgz", + "integrity": "sha512-k0j2K70YadKFFayFOtw9sbaB38LdkkJLluwqHvyl9CRAa3m7cWQ6pZbakCPrp3OWyo7dJWbP70ybOvjoDv2jwQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-exponentiation-operator": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-assign": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "react-refresh": "^0.4.0" + } + }, + "node_modules/metro-react-native-babel-transformer": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.59.0.tgz", + "integrity": "sha512-1O3wrnMq4NcPQ1asEcl9lRDn/t+F1Oef6S9WaYVIKEhg9m/EQRGVrrTVP+R6B5Eeaj3+zNKbzM8Dx/NWy1hUbQ==", + "dependencies": { + "@babel/core": "^7.0.0", + "babel-preset-fbjs": "^3.3.0", + "metro-babel-transformer": "0.59.0", + "metro-react-native-babel-preset": "0.59.0", + "metro-source-map": "0.59.0" + } + }, + "node_modules/metro-react-native-babel-transformer/node_modules/metro-babel-transformer": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.59.0.tgz", + "integrity": "sha512-fdZJl8rs54GVFXokxRdD7ZrQ1TJjxWzOi/xSP25VR3E8tbm3nBZqS+/ylu643qSr/IueABR+jrlqAyACwGEf6w==", + "dependencies": { + "@babel/core": "^7.0.0", + "metro-source-map": "0.59.0" + } + }, + "node_modules/metro-react-native-babel-transformer/node_modules/metro-react-native-babel-preset": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.59.0.tgz", + "integrity": "sha512-BoO6ncPfceIDReIH8pQ5tQptcGo5yRWQXJGVXfANbiKLq4tfgdZB1C1e2rMUJ6iypmeJU9dzl+EhPmIFKtgREg==", + "dependencies": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-exponentiation-operator": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-assign": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "react-refresh": "^0.4.0" + } + }, + "node_modules/metro-resolver": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.58.0.tgz", + "integrity": "sha512-XFbAKvCHN2iWqKeiRARzEXn69eTDdJVJC7lu16S4dPQJ+Dy82dZBr5Es12iN+NmbJuFgrAuIHbpWrdnA9tOf6Q==", + "dependencies": { + "absolute-path": "^0.0.0" + } + }, + "node_modules/metro-runtime": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.64.0.tgz", + "integrity": "sha512-m7XbWOaIOeFX7YcxUhmnOi6Pg8EaeL89xyZ+quZyZVF1aNoTr4w8FfbKxvijpjsytKHIZtd+43m2Wt5JrqyQmQ==" + }, + "node_modules/metro-source-map": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.59.0.tgz", + "integrity": "sha512-0w5CmCM+ybSqXIjqU4RiK40t4bvANL6lafabQ2GP2XD3vSwkLY+StWzCtsb4mPuyi9R/SgoLBel+ZOXHXAH0eQ==", + "dependencies": { + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.59.0", + "ob1": "0.59.0", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, + "node_modules/metro-source-map/node_modules/metro-symbolicate": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.59.0.tgz", + "integrity": "sha512-asLaF2A7rndrToGFIknL13aiohwPJ95RKHf0NM3hP/nipiLDoMzXT6ZnQvBqDxkUKyP+51AI75DMtb+Wcyw4Bw==", + "dependencies": { + "invariant": "^2.2.4", + "metro-source-map": "0.59.0", + "source-map": "^0.5.6", + "through2": "^2.0.1", + "vlq": "^1.0.0" + }, + "bin": { + "metro-symbolicate": "src/symbolicate.js" + }, + "engines": { + "node": ">=8.3" + } + }, + "node_modules/metro-source-map/node_modules/ob1": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.59.0.tgz", + "integrity": "sha512-opXMTxyWJ9m68ZglCxwo0OPRESIC/iGmKFPXEXzMZqsVIrgoRXOHmoMDkQzz4y3irVjbyPJRAh5pI9fd0MJTFQ==" + }, + "node_modules/metro-symbolicate": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.58.0.tgz", + "integrity": "sha512-uIVxUQC1E26qOMj13dKROhwAa2FmZk5eR0NcBqej/aXmQhpr8LjJg2sondkoLKUp827Tf/Fm9+pS4icb5XiqCw==", + "dependencies": { + "invariant": "^2.2.4", + "metro-source-map": "0.58.0", + "source-map": "^0.5.6", + "through2": "^2.0.1", + "vlq": "^1.0.0" + }, + "bin": { + "metro-symbolicate": "src/symbolicate.js" + }, + "engines": { + "node": ">=8.3" + } + }, + "node_modules/metro-symbolicate/node_modules/metro-source-map": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.58.0.tgz", + "integrity": "sha512-yvN1YPmejmgiiS7T1aKBiiUTHPw2Vcm3r2TZ+DY92z/9PR4alysIywrCs/fTHs8rbDcKM5VfPCKGLpkBrbKeOw==", + "dependencies": { + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.58.0", + "ob1": "0.58.0", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, + "node_modules/metro-transform-plugins": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.64.0.tgz", + "integrity": "sha512-iTIRBD/wBI98plfxj8jAoNUUXfXLNlyvcjPtshhpGvdwu9pzQilGfnDnOaaK+vbITcOk9w5oQectXyJwAqTr1A==", + "dependencies": { + "@babel/core": "^7.0.0", + "@babel/generator": "^7.5.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "nullthrows": "^1.1.1" + } + }, + "node_modules/metro-transform-worker": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.64.0.tgz", + "integrity": "sha512-wegRtK8GyLF6IPZRBJp+zsORgA4iX0h1DRpknyAMDCtSbJ4VU2xV/AojteOgAsDvY3ucAGsvfuZLNDJHUdUNHQ==", + "dependencies": { + "@babel/core": "^7.0.0", + "@babel/generator": "^7.5.0", + "@babel/parser": "^7.0.0", + "@babel/types": "^7.0.0", + "babel-preset-fbjs": "^3.3.0", + "metro": "0.64.0", + "metro-babel-transformer": "0.64.0", + "metro-cache": "0.64.0", + "metro-cache-key": "0.64.0", + "metro-hermes-compiler": "0.64.0", + "metro-source-map": "0.64.0", + "metro-transform-plugins": "0.64.0", + "nullthrows": "^1.1.1" + } + }, + "node_modules/metro-transform-worker/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/metro-transform-worker/node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/metro-transform-worker/node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/metro-transform-worker/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/metro-transform-worker/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/metro-transform-worker/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/metro-transform-worker/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/metro-transform-worker/node_modules/fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" + } + }, + "node_modules/metro-transform-worker/node_modules/fsevents": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.2.1.tgz", + "integrity": "sha512-bTLYHSeC0UH/EFXS9KqWnXuOl/wHK5Z/d+ghd5AsFMYN7wIGkUCOJyzy88+wJKkZPGON8u4Z9f6U4FdgURE9qA==", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/metro-transform-worker/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/metro-transform-worker/node_modules/jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "dependencies": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/metro-transform-worker/node_modules/jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/metro-transform-worker/node_modules/jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/metro-transform-worker/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/metro-transform-worker/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/metro-transform-worker/node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/metro-transform-worker/node_modules/metro": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.64.0.tgz", + "integrity": "sha512-G2OC08Rzfs0kqnSEuKo2yZxR+/eNUpA93Ru45c60uN0Dw3HPrDi+ZBipgFftC6iLE0l+6hu8roFFIofotWxybw==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/core": "^7.0.0", + "@babel/generator": "^7.5.0", + "@babel/parser": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "absolute-path": "^0.0.0", + "accepts": "^1.3.7", + "async": "^2.4.0", + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "denodeify": "^1.2.1", + "error-stack-parser": "^2.0.6", + "fs-extra": "^1.0.0", + "graceful-fs": "^4.1.3", + "image-size": "^0.6.0", + "invariant": "^2.2.4", + "jest-haste-map": "^26.5.2", + "jest-worker": "^26.0.0", + "lodash.throttle": "^4.1.1", + "metro-babel-register": "0.64.0", + "metro-babel-transformer": "0.64.0", + "metro-cache": "0.64.0", + "metro-cache-key": "0.64.0", + "metro-config": "0.64.0", + "metro-core": "0.64.0", + "metro-hermes-compiler": "0.64.0", + "metro-inspector-proxy": "0.64.0", + "metro-minify-uglify": "0.64.0", + "metro-react-native-babel-preset": "0.64.0", + "metro-resolver": "0.64.0", + "metro-runtime": "0.64.0", + "metro-source-map": "0.64.0", + "metro-symbolicate": "0.64.0", + "metro-transform-plugins": "0.64.0", + "metro-transform-worker": "0.64.0", + "mime-types": "^2.1.27", + "mkdirp": "^0.5.1", + "node-fetch": "^2.2.0", + "nullthrows": "^1.1.1", + "rimraf": "^2.5.4", + "serialize-error": "^2.1.0", + "source-map": "^0.5.6", + "strip-ansi": "^6.0.0", + "temp": "0.8.3", + "throat": "^5.0.0", + "ws": "^1.1.5", + "yargs": "^15.3.1" + }, + "bin": { + "metro": "src/cli.js" + } + }, + "node_modules/metro-transform-worker/node_modules/metro-babel-register": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-babel-register/-/metro-babel-register-0.64.0.tgz", + "integrity": "sha512-Kf6YvE3kIRumGnjK0Q9LqGDIdnsX9eFGtNBmBuCVDuB9wGGA/5CgX8We8W7Y44dz1RGTcHJRhfw5iGg+pwC3aQ==", + "dependencies": { + "@babel/core": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/register": "^7.0.0", + "escape-string-regexp": "^1.0.5" + } + }, + "node_modules/metro-transform-worker/node_modules/metro-babel-transformer": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.64.0.tgz", + "integrity": "sha512-itZaxKTgmKGEZWxNzbSZBc22NngrMZzoUNuU92aHSTGkYi2WH4XlvzEHsstmIKHMsRVKl75cA+mNmgk4gBFJKw==", + "dependencies": { + "@babel/core": "^7.0.0", + "metro-source-map": "0.64.0", + "nullthrows": "^1.1.1" + } + }, + "node_modules/metro-transform-worker/node_modules/metro-cache": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.64.0.tgz", + "integrity": "sha512-QvGfxe/1QQYM9XOlR8W1xqE9eHDw/AgJIgYGn/TxZxBu9Zga+Rgs1omeSZju45D8w5VWgMr83ma5kACgzvOecg==", + "dependencies": { + "metro-core": "0.64.0", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4" + } + }, + "node_modules/metro-transform-worker/node_modules/metro-core": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.64.0.tgz", + "integrity": "sha512-v8ZQ5j72EaUwamQ8pLfHlOHTyp7SbdazvHPzFGDpHnwIQqIT0Bw3Syg8R4regTlVG3ngpeSEAi005UITljmMcQ==", + "dependencies": { + "jest-haste-map": "^26.5.2", + "lodash.throttle": "^4.1.1", + "metro-resolver": "0.64.0" + } + }, + "node_modules/metro-transform-worker/node_modules/metro-inspector-proxy": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.64.0.tgz", + "integrity": "sha512-KywbH3GNSz9Iqw4UH3smgaV2dBHHYMISeN7ORntDL/G+xfgPc6vt13d+zFb907YpUcXj5N0vdoiAHI5V/0y8IA==", + "dependencies": { + "connect": "^3.6.5", + "debug": "^2.2.0", + "ws": "^1.1.5", + "yargs": "^15.3.1" + }, + "bin": { + "metro-inspector-proxy": "src/cli.js" + } + }, + "node_modules/metro-transform-worker/node_modules/metro-minify-uglify": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.64.0.tgz", + "integrity": "sha512-DRwRstqXR5qfte9Nuwoov5dRXxL7fJeVlO5fGyOajWeO3+AgPjvjXh/UcLJqftkMWTPGUFuzAD5/7JC5v5FLWw==", + "dependencies": { + "uglify-es": "^3.1.9" + } + }, + "node_modules/metro-transform-worker/node_modules/metro-react-native-babel-preset": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.64.0.tgz", + "integrity": "sha512-HcZ0RWQRuJfpPiaHyFQJzcym+/dDIVUPwUAXWoub/C4GkGu+mPjp8vqK6g0FxokCnnI2TK0gZTza2IDfiNNscQ==", + "dependencies": { + "@babel/core": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-exponentiation-operator": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-assign": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "react-refresh": "^0.4.0" + } + }, + "node_modules/metro-transform-worker/node_modules/metro-resolver": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.64.0.tgz", + "integrity": "sha512-cJ26Id8Zf+HmS/1vFwu71K3u7ep/+HeXXAJIeVDYf+niE7AWB9FijyMtAlQgbD8elWqv1leJCnQ/xHRFBfGKYA==", + "dependencies": { + "absolute-path": "^0.0.0" + } + }, + "node_modules/metro-transform-worker/node_modules/metro-source-map": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.64.0.tgz", + "integrity": "sha512-OCG2rtcp5cLEGYvAbfkl6mEc0J2FPRP4/UCEly+juBk7hawS9bCBMBfhJm/HIsvY1frk6nT2Vsl1O8YBbwyx2g==", + "dependencies": { + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.64.0", + "nullthrows": "^1.1.1", + "ob1": "0.64.0", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, + "node_modules/metro-transform-worker/node_modules/metro-symbolicate": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.64.0.tgz", + "integrity": "sha512-qIi+YRrDWnLVmydj6gwidYLPaBsakZRibGWSspuXgHAxOI3UuLwlo4dpQ73Et0gyHjI7ZvRMRY8JPiOntf9AQQ==", + "dependencies": { + "invariant": "^2.2.4", + "metro-source-map": "0.64.0", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "through2": "^2.0.1", + "vlq": "^1.0.0" + }, + "bin": { + "metro-symbolicate": "src/index.js" + }, + "engines": { + "node": ">=8.3" + } + }, + "node_modules/metro-transform-worker/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/metro-transform-worker/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/metro-transform-worker/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/metro-transform-worker/node_modules/ob1": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.64.0.tgz", + "integrity": "sha512-CO1N+5dhvy+MoAwxz8+fymEUcwsT4a+wHhrHFb02LppcJdHxgcBWviwEhUwKOD2kLMQ7ijrrzybOqpGcqEtvpQ==" + }, + "node_modules/metro-transform-worker/node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" + }, + "node_modules/metro-transform-worker/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/metro/node_modules/@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/metro/node_modules/@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/metro/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "engines": { + "node": ">=4" + } + }, + "node_modules/metro/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/metro/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/metro/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/metro/node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/metro/node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/metro/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/metro/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/metro/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/metro/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/metro/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/metro/node_modules/fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" + } + }, + "node_modules/metro/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/metro/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/metro/node_modules/jest-validate": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "dependencies": { + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/metro/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/metro/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/metro/node_modules/metro-babel-register": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-babel-register/-/metro-babel-register-0.58.0.tgz", + "integrity": "sha512-P5+G3ufhSYL6cA3a7xkbSJzzFBvtivj/PhWvGXFXnuFssDlMAX1CTktff+0gpka5Cd6B6QLt0UAMWulUAAE4Eg==", + "dependencies": { + "@babel/core": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-transform-async-to-generator": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/register": "^7.0.0", + "core-js": "^2.2.2", + "escape-string-regexp": "^1.0.5" + } + }, + "node_modules/metro/node_modules/metro-config": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.58.0.tgz", + "integrity": "sha512-4vgBliXwL56vjUlYplvGMVSNrJJpkHuLcD+O20trV3FvPxKg4ZsvuOcNSxqDSMU26FCtIEJ15ojcuCbRL7KY0w==", + "dependencies": { + "cosmiconfig": "^5.0.5", + "jest-validate": "^24.7.0", + "metro": "0.58.0", + "metro-cache": "0.58.0", + "metro-core": "0.58.0", + "pretty-format": "^24.7.0" + } + }, + "node_modules/metro/node_modules/metro-react-native-babel-preset": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.58.0.tgz", + "integrity": "sha512-MRriNW+fF6jxABsgPphocUY6mIhmCm8idcrQZ58fT3Iti2vCdtkaK32TyCGUNUptzhUe2/cbE57j4aC+eaodAA==", + "dependencies": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-exponentiation-operator": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-assign": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "react-refresh": "^0.4.0" + } + }, + "node_modules/metro/node_modules/metro-source-map": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.58.0.tgz", + "integrity": "sha512-yvN1YPmejmgiiS7T1aKBiiUTHPw2Vcm3r2TZ+DY92z/9PR4alysIywrCs/fTHs8rbDcKM5VfPCKGLpkBrbKeOw==", + "dependencies": { + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.58.0", + "ob1": "0.58.0", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, + "node_modules/metro/node_modules/mime-db": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", + "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/metro/node_modules/mime-types": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", + "integrity": "sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw=", + "dependencies": { + "mime-db": "~1.23.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/metro/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/metro/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/metro/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/metro/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/metro/node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/metro/node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/metro/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/metro/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/metro/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/metro/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/metro/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/metro/node_modules/yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dependencies": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + } + }, + "node_modules/metro/node_modules/yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "dependencies": { + "mime-db": "1.45.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dev": true, + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/mingo": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/mingo/-/mingo-1.3.3.tgz", + "integrity": "sha1-aSLE0Ufvx3GgFCWixMj3eER4xUY=" + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dependencies": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-object/node_modules/for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mock-fs": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.13.0.tgz", + "integrity": "sha512-DD0vOdofJdoaRNtnWcrXe6RQbpHkPPmtqGq14uRX0F8ZKJ5nv89CVTYl/BZdppDxBDaV0hl75htg3abpEWlPZA==", + "dev": true + }, + "node_modules/modify-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/modify-filename/-/modify-filename-1.1.0.tgz", + "integrity": "sha1-mi3sg4Bvuy2XXyK+7IWcoms5OqE=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.31", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz", + "integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==", + "dependencies": { + "moment": ">= 2.9.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "node_modules/mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", + "dev": true, + "optional": true, + "dependencies": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/mv/node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dev": true, + "optional": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mv/node_modules/rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "dev": true, + "optional": true, + "dependencies": { + "glob": "^6.0.1" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "optional": true + }, + "node_modules/nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "dev": true, + "optional": true, + "bin": { + "ncp": "bin/ncp" + } + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node_modules/no-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.1", + "tslib": "^1.10.0" + } + }, + "node_modules/nocache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", + "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "node_modules/node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-notifier": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", + "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", + "dev": true, + "optional": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + } + }, + "node_modules/node-notifier/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "optional": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-notifier/node_modules/uuid": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", + "dev": true, + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/node-notifier/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "optional": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/node-releases": { + "version": "1.1.63", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.63.tgz", + "integrity": "sha512-ukW3iCfQaoxJkSPN+iK7KznTeqDGVJatAEuXsJERYHa9tn/KaT5lBdIyxQjLEVTzSkyjJEuQ17/vaEjrOauDkg==", + "dev": true + }, + "node_modules/node-stream-zip": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.11.3.tgz", + "integrity": "sha512-GY+9LxkQuIT3O7K8BTdHVGKFcBYBy2vAVcTBtkKpu+OlBef/NSb6VuIWSyLiVDfmLMkggHeRJZN0F3W0GWU/uw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-version": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/node-version/-/node-version-1.2.0.tgz", + "integrity": "sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/normalize-css-color": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/normalize-css-color/-/normalize-css-color-1.0.2.tgz", + "integrity": "sha1-Apkel8zOxmI/5XOvu/Deah8+n40=" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", + "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", + "dev": true, + "optional": true, + "dependencies": { + "config-chain": "^1.1.11", + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-conf/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/ob1": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.58.0.tgz", + "integrity": "sha512-uZP44cbowAfHafP1k4skpWItk5iHCoRevMfrnUvYCfyNNPPJd3rfDCyj0exklWi2gDXvjlj2ObsfiqP/bs/J7Q==" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", + "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" + }, + "node_modules/object-is": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.3.tgz", + "integrity": "sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.entries": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", + "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.entries/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", + "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/object.getownpropertydescriptors/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "bin": { + "opencollective-postinstall": "index.js" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "dependencies": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/ora/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "dependencies": { + "url-parse": "^1.4.3" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-each-series": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", + "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/param-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz", + "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", + "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", + "dev": true, + "dependencies": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "devOptional": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dependencies": { + "through": "~2.3" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/pdfjs-dist": { + "version": "2.5.207", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-2.5.207.tgz", + "integrity": "sha512-xGDUhnCYPfHy+unMXCLCJtlpZaaZ17Ew3WIL0tnSgKFUZXHAPD49GO9xScyszSsQMoutNDgRb+rfBXIaX/lJbw==" + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "engines": { + "node": ">=8.6" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dependencies": { + "node-modules-regexp": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/plist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", + "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "dependencies": { + "base64-js": "^1.2.3", + "xmlbuilder": "^9.0.7", + "xmldom": "0.1.x" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dependencies": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dependencies": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dependencies": { + "kind-of": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", + "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "node_modules/pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dependencies": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pretty-format/node_modules/@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pretty-format/node_modules/@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/pretty-format/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-format/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/pretty-format/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "node_modules/promise-polyfill": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.1.0.tgz", + "integrity": "sha1-36lpQ+qcEh/KTem1hoyznTRy4Fc=", + "dev": true + }, + "node_modules/prompts": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/proper-lockfile": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-3.2.0.tgz", + "integrity": "sha512-iMghHHXv2bsxl6NchhEaFck8tvX3F9cknEEh1SUpguUOBjN7PAAW9BLzmbc1g/mCD1gY3EE2EABBHPJfFdHFmA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true, + "optional": true + }, + "node_modules/proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "dependencies": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", + "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pusher-js": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pusher-js/-/pusher-js-7.0.0.tgz", + "integrity": "sha512-2ZSw8msMe6EKNTebQSthRInrWUK9bo3zXPmQx0bfeDFJdSnTWUROhdAhmpRQREHzqrL+l4imv/3uwgIQHUO0oQ==", + "dependencies": { + "tweetnacl": "^1.0.3" + } + }, + "node_modules/pusher-js-mock": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/pusher-js-mock/-/pusher-js-mock-0.3.3.tgz", + "integrity": "sha512-Qn8u167Qm+pU+ZhE/vTLL7msh3Zk6C4im4fXC/Vxsjv2anXRYhhBwt+eqFVTfGvhb0ZcwPtL8w5dkwKAFSiMGQ==", + "dev": true, + "engines": { + "node": ">=4.2.4" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/query-string": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", + "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", + "dependencies": { + "decode-uri-component": "^0.2.0", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/ramda": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", + "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==", + "dev": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-devtools-core": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.8.2.tgz", + "integrity": "sha512-3Lv3nI8FPAwKqUco35oOlgf+4j8mgYNnIcDv2QTfxEqg2G69q17ZJ8ScU9aBnymS28YC1OW+kTxLmdIQeTN8yg==", + "dependencies": { + "shell-quote": "^1.6.1", + "ws": "^7" + } + }, + "node_modules/react-devtools-core/node_modules/ws": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/react-dom": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + } + }, + "node_modules/react-dom/node_modules/scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/react-hot-loader": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.13.0.tgz", + "integrity": "sha512-JrLlvUPqh6wIkrK2hZDfOyq/Uh/WeVEr8nc7hkn2/3Ul0sx1Kr5y4kOGNacNRoj7RhwLNcQ3Udf1KJXrqc0ZtA==", + "dev": true, + "dependencies": { + "fast-levenshtein": "^2.0.6", + "global": "^4.3.0", + "hoist-non-react-statics": "^3.3.0", + "loader-utils": "^1.1.0", + "prop-types": "^15.6.1", + "react-lifecycles-compat": "^3.0.4", + "shallowequal": "^1.1.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/react-hot-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/react-hot-loader/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/react-hot-loader/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "dev": true + }, + "node_modules/react-native": { + "version": "0.63.3", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.63.3.tgz", + "integrity": "sha512-71wq13uNo5W8QVQnFlnzZ3AD+XgUBYGhpsxysQFW/hJ8GAt/J5o+Bvhy81FXichp6IBDJDh/JgfHH2gNji8dFA==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "@react-native-community/cli": "^4.10.0", + "@react-native-community/cli-platform-android": "^4.10.0", + "@react-native-community/cli-platform-ios": "^4.10.0", + "abort-controller": "^3.0.0", + "anser": "^1.4.9", + "base64-js": "^1.1.2", + "event-target-shim": "^5.0.1", + "fbjs": "^1.0.0", + "fbjs-scripts": "^1.1.0", + "hermes-engine": "~0.5.0", + "invariant": "^2.2.4", + "jsc-android": "^245459.0.0", + "metro-babel-register": "0.59.0", + "metro-react-native-babel-transformer": "0.59.0", + "metro-source-map": "0.59.0", + "nullthrows": "^1.1.1", + "pretty-format": "^24.9.0", + "promise": "^8.0.3", + "prop-types": "^15.7.2", + "react-devtools-core": "^4.6.0", + "react-refresh": "^0.4.0", + "regenerator-runtime": "^0.13.2", + "scheduler": "0.19.1", + "stacktrace-parser": "^0.1.3", + "use-subscription": "^1.0.0", + "whatwg-fetch": "^3.0.0" + }, + "bin": { + "react-native": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-native-animatable": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/react-native-animatable/-/react-native-animatable-1.3.3.tgz", + "integrity": "sha512-2ckIxZQAsvWn25Ho+DK3d1mXIgj7tITkrS4pYDvx96WyOttSvzzFeQnM2od0+FUMzILbdHDsDEqZvnz1DYNQ1w==", + "dependencies": { + "prop-types": "^15.7.2" + } + }, + "node_modules/react-native-config": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/react-native-config/-/react-native-config-1.4.1.tgz", + "integrity": "sha512-isK9z1ibzG0Z8HPRhCk0krmvtLknONCpEHLGSpBtf+oQ02PllAXljGMFN/XJCnq3G3MdmP1CffZh3vm4e/A50w==" + }, + "node_modules/react-native-document-picker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/react-native-document-picker/-/react-native-document-picker-4.0.0.tgz", + "integrity": "sha512-tjIOBBcyjv4j5E1MDL2OvEKNpXxQybLNkjjfpTyDUzek7grZ5eOvSlp6i/Y3EfuIGLByeaw++9R1SZtOij6R7w==" + }, + "node_modules/react-native-gesture-handler": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-1.9.0.tgz", + "integrity": "sha512-fkkNeWDBzDdwDxDcxtYbrb9T1g0PLgT1AxBs2iO/p7uEbDbC6mIoL/NzuOnKNEBHcd0lpLoJuNmIfdmucEON5g==", + "dependencies": { + "@egjs/hammerjs": "^2.0.17", + "fbjs": "^3.0.0", + "hoist-non-react-statics": "^3.3.0", + "invariant": "^2.2.4", + "prop-types": "^15.7.2" + } + }, + "node_modules/react-native-gesture-handler/node_modules/fbjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.0.tgz", + "integrity": "sha512-dJd4PiDOFuhe7vk4F80Mba83Vr2QuK86FoxtgPmzBqEJahncp+13YCmfoa53KHCo6OnlXLG7eeMWPfB5CrpVKg==", + "dependencies": { + "cross-fetch": "^3.0.4", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + }, + "node_modules/react-native-gesture-handler/node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/react-native-image-pan-zoom": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/react-native-image-pan-zoom/-/react-native-image-pan-zoom-2.1.12.tgz", + "integrity": "sha512-BF66XeP6dzuANsPmmFsJshM2Jyh/Mo1t8FsGc1L9Q9/sVP8MJULDabB1hms+eAoqgtyhMr5BuXV3E1hJ5U5H6Q==" + }, + "node_modules/react-native-image-picker": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-2.3.4.tgz", + "integrity": "sha512-4UHu+zOyDT570r5mIbjH6h1iMrKIq/qfsKiAVUEZwncVegh0usJiEYNyJw4CEVwNeehmye/ia5sLDsa+kzIE4g==" + }, + "node_modules/react-native-iphone-x-helper": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.3.1.tgz", + "integrity": "sha512-HOf0jzRnq2/aFUcdCJ9w9JGzN3gdEg0zFE4FyYlp4jtidqU03D5X7ZegGKfT1EWteR0gPBGp9ye5T5FvSWi9Yg==" + }, + "node_modules/react-native-keyboard-spacer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/react-native-keyboard-spacer/-/react-native-keyboard-spacer-0.4.1.tgz", + "integrity": "sha1-RvGKMgQyCYol6p+on1FD3SVNMy0=" + }, + "node_modules/react-native-modal": { + "version": "11.5.6", + "resolved": "https://registry.npmjs.org/react-native-modal/-/react-native-modal-11.5.6.tgz", + "integrity": "sha512-APGNfbvgC4hXbJqcSADu79GLoMKIHUmgR3fDQ7rCGZNBypkStSP8imZ4PKK/OzIZZfjGU9aP49jhMgGbhY9KHA==", + "dependencies": { + "prop-types": "^15.6.2", + "react-native-animatable": "1.3.3" + } + }, + "node_modules/react-native-onyx": { + "resolved": "git+ssh://git@github.com/Expensify/react-native-onyx.git#3635fc34f00c8c8f97500b97fd42251ab4d22ab5", + "dependencies": { + "@react-native-community/async-storage": "^1.12.1", + "expensify-common": "git+https://github.com/Expensify/expensify-common.git#3d8fc7500ddd24cd4a543e6e160d4f1ad97cc145", + "lodash": "4.17.21", + "react": "^16.13.1", + "underscore": "^1.11.0" + } + }, + "node_modules/react-native-onyx/node_modules/expensify-common": { + "resolved": "git+ssh://git@github.com/Expensify/expensify-common.git#3d8fc7500ddd24cd4a543e6e160d4f1ad97cc145", + "dependencies": { + "classnames": "2.2.5", + "clipboard": "2.0.4", + "html-entities": "^1.3.1", + "jquery": "3.3.1", + "lodash": "4.17.21", + "prop-types": "15.7.2", + "react": "16.12.0", + "react-dom": "16.12.0", + "semver": "^7.3.4", + "simply-deferred": "git+https://github.com/Expensify/simply-deferred.git#77a08a95754660c7bd6e0b6979fdf84e8e831bf5", + "underscore": "1.9.1" + } + }, + "node_modules/react-native-onyx/node_modules/expensify-common/node_modules/react": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", + "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-native-onyx/node_modules/expensify-common/node_modules/underscore": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" + }, + "node_modules/react-native-onyx/node_modules/react-dom": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", + "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.18.0" + } + }, + "node_modules/react-native-pdf": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/react-native-pdf/-/react-native-pdf-6.2.2.tgz", + "integrity": "sha512-ylRqbjf9BDSZpOV9eJpASZ+0FWZwEhEGyWJVhA6epr+HY8G2EOThr1HNXbf3nTIwL/t+Esfw4b60+w+2k614Pg==", + "dependencies": { + "@react-native-community/progress-bar-android": "^1.0.3", + "@react-native-community/progress-view": "^1.0.3", + "crypto-js": "^3.2.0", + "prop-types": "^15.7.2" + } + }, + "node_modules/react-native-picker-select": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/react-native-picker-select/-/react-native-picker-select-8.0.4.tgz", + "integrity": "sha512-orBjPIwBkV5oipyVw263YNMI56f6Kj3p/ejabZoCYYNSG3AiLVVhC2RqsxMgDA7IayyURAW+AlV+mDJyVqLBkg==", + "dependencies": { + "@react-native-picker/picker": "^1.8.3", + "lodash.isequal": "^4.5.0" + } + }, + "node_modules/react-native-reanimated": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-1.13.2.tgz", + "integrity": "sha512-O+WhgxSjOIzcVdAAvx+h2DY331Ek1knKlaq+jsNLpC1fhRy9XTdOObovgob/aF2ve9uJfPEawCx8381g/tUJZQ==", + "dependencies": { + "fbjs": "^1.0.0" + } + }, + "node_modules/react-native-render-html": { + "version": "6.0.0-alpha.10", + "resolved": "https://registry.npmjs.org/react-native-render-html/-/react-native-render-html-6.0.0-alpha.10.tgz", + "integrity": "sha512-qXc8Osb8QuEFztfGqWTXltxRi8Pg84brqZSLYRpmC3ERfCXDCE8KQpGq6SEx8zTKk5uaurkMo/QBa07sRcQB2g==", + "dependencies": { + "@native-html/transient-render-engine": "^3.6.1", + "@types/ramda": "^0.27.32", + "ramda": "^0.27.1" + } + }, + "node_modules/react-native-render-html/node_modules/ramda": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", + "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==" + }, + "node_modules/react-native-safe-area-context": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-3.1.8.tgz", + "integrity": "sha512-9gUlsDZ96QwT9AKzA6aVWM/NX5rlJgauZ9HgCDVzKbe29UQYT1740QJnnaI2GExmkFGp6o7ZLNhCXZW95eYVFA==" + }, + "node_modules/react-native-screens": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-2.17.1.tgz", + "integrity": "sha512-B4gD5e4csvlVwlhf+RNqjQZ9mHTwe/iL3rXondgZxnKz4oW0QAmtLnLRKOrYVxoaJaF9Fy7jhjo//24/472APQ==" + }, + "node_modules/react-native-svg": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-12.1.0.tgz", + "integrity": "sha512-1g9qBRci7man8QsHoXn6tP3DhCDiypGgc6+AOWq+Sy+PmP6yiyf8VmvKuoqrPam/tf5x+ZaBT2KI0gl7bptZ7w==", + "dependencies": { + "css-select": "^2.1.0", + "css-tree": "^1.0.0-alpha.39" + } + }, + "node_modules/react-native-svg-transformer": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/react-native-svg-transformer/-/react-native-svg-transformer-0.14.3.tgz", + "integrity": "sha512-agDGdMeeBAsWEgg/u7mjtR2Z3c8smGCLep/n3svwifut9dpswZCP+bSIrU8ekg6RNtxAJL+eGJbWjJ38vWxw6g==", + "dev": true, + "dependencies": { + "@svgr/core": "^4.3.3", + "@svgr/plugin-svgo": "^4.3.1", + "path-dirname": "^1.0.2", + "semver": "^5.6.0" + } + }, + "node_modules/react-native-svg-transformer/node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", + "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native-svg-transformer/node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", + "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native-svg-transformer/node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", + "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native-svg-transformer/node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", + "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native-svg-transformer/node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", + "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native-svg-transformer/node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", + "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native-svg-transformer/node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", + "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native-svg-transformer/node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", + "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native-svg-transformer/node_modules/@svgr/babel-preset": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", + "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", + "dev": true, + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", + "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3", + "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", + "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", + "@svgr/babel-plugin-transform-svg-component": "^4.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native-svg-transformer/node_modules/@svgr/core": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", + "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", + "dev": true, + "dependencies": { + "@svgr/plugin-jsx": "^4.3.3", + "camelcase": "^5.3.1", + "cosmiconfig": "^5.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native-svg-transformer/node_modules/@svgr/hast-util-to-babel-ast": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", + "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.4.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native-svg-transformer/node_modules/@svgr/plugin-jsx": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", + "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", + "dev": true, + "dependencies": { + "@babel/core": "^7.4.5", + "@svgr/babel-preset": "^4.3.3", + "@svgr/hast-util-to-babel-ast": "^4.3.2", + "svg-parser": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native-svg-transformer/node_modules/@svgr/plugin-svgo": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", + "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", + "dev": true, + "dependencies": { + "cosmiconfig": "^5.2.1", + "merge-deep": "^3.0.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native-svg-transformer/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/react-native-svg/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/react-native-svg/node_modules/css-tree": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", + "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/react-native-svg/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/react-native-svg/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/react-native-svg/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-native-web": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.14.10.tgz", + "integrity": "sha512-YTvYnUUPnOjU50GiXk90cm6atk714vF8p7HhBlqHtLtftHk9xQRwgxXzoMHiKf0Bx20Dyo2SGvv4XrPxcmEheQ==", + "dependencies": { + "array-find-index": "^1.0.2", + "create-react-class": "^15.6.2", + "deep-assign": "^3.0.0", + "fbjs": "^1.0.0", + "hyphenate-style-name": "^1.0.3", + "inline-style-prefixer": "^5.1.0", + "normalize-css-color": "^1.0.2", + "prop-types": "^15.6.0", + "react-timer-mixin": "^0.13.4" + } + }, + "node_modules/react-native/node_modules/scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/react-pdf": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-5.2.0.tgz", + "integrity": "sha512-/vl+fzurHzz1o1knGSnLzFu1lL/1yb67JSE3WSX3bC/ioL/j34q5WiJbxK2D61Og0RZe6CNy9rve6JyB+sfHCw==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "make-cancellable-promise": "^1.0.0", + "make-event-props": "^1.1.0", + "merge-class-names": "^1.1.1", + "merge-refs": "^1.0.0", + "pdfjs-dist": "2.5.207", + "prop-types": "^15.6.2", + "worker-loader": "^3.0.0" + } + }, + "node_modules/react-refresh": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", + "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-test-renderer": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.13.1.tgz", + "integrity": "sha512-Sn2VRyOK2YJJldOqoh8Tn/lWQ+ZiKhyZTPtaO0Q6yNj+QDbmRkVFap6pZPy3YQk8DScRDfyqm/KxKYP9gCMRiQ==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "react-is": "^16.8.6", + "scheduler": "^0.19.1" + } + }, + "node_modules/react-test-renderer/node_modules/scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "dev": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/react-timer-mixin": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/react-timer-mixin/-/react-timer-mixin-0.13.4.tgz", + "integrity": "sha512-4+ow23tp/Tv7hBM5Az5/Be/eKKF7DIvJ09voz5LyHGQaqqz9WV8YMs31eFvcYQs7d451LSg7kDJV70XYN/Ug/Q==" + }, + "node_modules/react-web-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/react-web-config/-/react-web-config-1.0.0.tgz", + "integrity": "sha1-U7jMEuHJL+JopJ3yYchyK4tRC2M=", + "dependencies": { + "dotenv": "^4.0.0", + "webpack": "^2.3.3" + } + }, + "node_modules/react-web-config/node_modules/ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dependencies": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "node_modules/react-web-config/node_modules/ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=" + }, + "node_modules/react-web-config/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-web-config/node_modules/big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "engines": { + "node": "*" + } + }, + "node_modules/react-web-config/node_modules/camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-web-config/node_modules/cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dependencies": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "node_modules/react-web-config/node_modules/dotenv": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", + "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=", + "engines": { + "node": ">=4.6.0" + } + }, + "node_modules/react-web-config/node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/react-web-config/node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "node_modules/react-web-config/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-web-config/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-web-config/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/react-web-config/node_modules/loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dependencies": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "node_modules/react-web-config/node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "node_modules/react-web-config/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-web-config/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-web-config/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/react-web-config/node_modules/uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dependencies": { + "source-map": "~0.5.1", + "yargs": "~3.10.0" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + }, + "optionalDependencies": { + "uglify-to-browserify": "~1.0.0" + } + }, + "node_modules/react-web-config/node_modules/uglify-js/node_modules/yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dependencies": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + }, + "node_modules/react-web-config/node_modules/webpack": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-2.7.0.tgz", + "integrity": "sha512-MjAA0ZqO1ba7ZQJRnoCdbM56mmFpipOPUv/vQpwwfSI42p5PVDdoiuK2AL2FwFUVgT859Jr43bFZXRg/LNsqvg==", + "dependencies": { + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^4.7.0", + "ajv-keywords": "^1.1.1", + "async": "^2.1.2", + "enhanced-resolve": "^3.3.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^0.2.16", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^3.1.0", + "tapable": "~0.2.5", + "uglify-js": "^2.8.27", + "watchpack": "^1.3.1", + "webpack-sources": "^1.0.1", + "yargs": "^6.0.0" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/react-web-config/node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "node_modules/react-web-config/node_modules/wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/react-web-config/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-web-config/node_modules/y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "node_modules/react-web-config/node_modules/yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dependencies": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" + } + }, + "node_modules/react-web-config/node_modules/yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dependencies": { + "camelcase": "^3.0.0" + } + }, + "node_modules/react-web-config/node_modules/yargs-parser/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-web-config/node_modules/yargs/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-web-config/node_modules/yargs/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/read-config-file": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.0.0.tgz", + "integrity": "sha512-PHjROSdpceKUmqS06wqwP92VrM46PZSTubmNIMJ5DrMwg1OgenSTSEHIkCa6TiOJ+y/J0xnG1fFwG3M+Oi1aNA==", + "dev": true, + "dependencies": { + "dotenv": "^8.2.0", + "dotenv-expand": "^5.1.0", + "js-yaml": "^3.13.1", + "json5": "^2.1.2", + "lazy-val": "^1.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "devOptional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "dependencies": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerate": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dependencies": { + "regenerate": "^1.4.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/regexp.prototype.flags/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dependencies": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", + "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + }, + "node_modules/regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "node_modules/renderkid": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.4.tgz", + "integrity": "sha512-K2eXrSOJdq+HuKzlcjOlGoOarUu5SDguDEhE7+Ah4zuOWL40j8A/oHvLlLob9PSTNvVnBd+/q0Er1QfpEuem5g==", + "dev": true, + "dependencies": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "lodash": "^4.17.20", + "strip-ansi": "^3.0.0" + } + }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/request-promise-native/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/requireindex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.1.0.tgz", + "integrity": "sha1-5UBLgVV+91225JxacgBIk/4D4WI=", + "dev": true, + "engines": { + "node": ">=0.10.5" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "node_modules/reselect": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", + "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dependencies": { + "path-parse": "^1.0.6" + } + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-dir/node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dependencies": { + "align-text": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rn-fetch-blob": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/rn-fetch-blob/-/rn-fetch-blob-0.12.0.tgz", + "integrity": "sha512-+QnR7AsJ14zqpVVUbzbtAjq0iI8c9tCg49tIoKO2ezjzRunN7YL6zFSFSWZm6d+mE/l9r+OeDM3jmb2tBb2WbA==", + "dependencies": { + "base-64": "0.1.0", + "glob": "7.0.6" + } + }, + "node_modules/rn-fetch-blob/node_modules/glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/roarr/node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true, + "optional": true + }, + "node_modules/rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "engines": { + "node": "6.* || >= 7.*" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + }, + "node_modules/rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dependencies": { + "rx-lite": "*" + } + }, + "node_modules/rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dependencies": { + "symbol-observable": "1.0.1" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "dev": true, + "optional": true + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dependencies": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "bin": { + "sane": "src/cli.js" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/save": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/save/-/save-2.4.0.tgz", + "integrity": "sha512-wd5L2uVnsKYkIUaK6i8Ie66IOHaI328gMF0MPuTJtYOjXgUolC33LSIk7Qr8WVA55QHaGwfiVS8a7EFIeGOR3w==", + "dependencies": { + "async": "^2.6.2", + "event-stream": "^4.0.1", + "lodash.assign": "^4.2.0", + "mingo": "1" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", + "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "node_modules/selfsigned": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "dev": true, + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true, + "optional": true + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shallow-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "dependencies": { + "is-extendable": "^0.1.1", + "kind-of": "^5.0.0", + "mixin-object": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shallow-clone/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dependencies": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true, + "optional": true + }, + "node_modules/side-channel": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.3.tgz", + "integrity": "sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g==", + "dev": true, + "dependencies": { + "es-abstract": "^1.18.0-next.0", + "object-inspect": "^1.8.0" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "node_modules/simple-plist": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.1.1.tgz", + "integrity": "sha512-pKMCVKvZbZTsqYR6RKgLfBHkh2cV89GXcA/0CVPje3sOiNOnXA8+rp/ciAMZ7JRaUdLzlEM6JFfUn+fS6Nt3hg==", + "dependencies": { + "bplist-creator": "0.0.8", + "bplist-parser": "0.2.0", + "plist": "^3.0.1" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/simply-deferred": { + "resolved": "git+ssh://git@github.com/Expensify/simply-deferred.git#77a08a95754660c7bd6e0b6979fdf84e8e831bf5", + "engines": { + "node": "*" + } + }, + "node_modules/sirv": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.11.tgz", + "integrity": "sha512-SR36i3/LSWja7AJNRBz4fF/Xjpn7lQFI30tZ434dIy+bitLYSP+ZEenHg36i23V2SGEz+kqjksg0uOGZ5LPiqg==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.9", + "mime": "^2.3.1", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sirv/node_modules/mime": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.0.tgz", + "integrity": "sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "engines": { + "node": "*" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/sockjs": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.10.0", + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" + } + }, + "node_modules/sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "dev": true, + "dependencies": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sockjs-client/node_modules/faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", + "dependencies": { + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "node_modules/source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "node_modules/spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", + "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sshpk/node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "node_modules/ssri": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "node_modules/stack-generator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.5.tgz", + "integrity": "sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q==", + "dependencies": { + "stackframe": "^1.1.1" + } + }, + "node_modules/stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" + }, + "node_modules/stacktrace-gps": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.0.4.tgz", + "integrity": "sha512-qIr8x41yZVSldqdqe6jciXEaSCKw1U8XTXpjDuy0ki/apyTn/r3w9hDAAQOhZdxvsC93H+WwwEu5cq5VemzYeg==", + "dependencies": { + "source-map": "0.5.6", + "stackframe": "^1.1.1" + } + }, + "node_modules/stacktrace-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", + "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "dependencies": { + "error-stack-parser": "^2.0.6", + "stack-generator": "^2.0.5", + "stacktrace-gps": "^3.0.4" + } + }, + "node_modules/stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "dependencies": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "node_modules/strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=", + "engines": { + "node": ">=4" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-length": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz", + "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "has-symbols": "^1.0.1", + "internal-slot": "^1.0.2", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.2" + } + }, + "node_modules/string.prototype.matchall/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trimend/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trimstart/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sudo-prompt": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==" + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/superstruct": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.6.2.tgz", + "integrity": "sha512-lvA97MFAJng3rfjcafT/zGTSWm6Tbpk++DP6It4Qg7oNaeM+2tdJMuVgGje21/bIpBEs6iQql1PJH6dKTjl4Ig==", + "dependencies": { + "clone-deep": "^2.0.1", + "kind-of": "^6.0.1" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/svgo/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/svgo/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "dependencies": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/table/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/table/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/table/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/table/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tail": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/tail/-/tail-2.0.4.tgz", + "integrity": "sha512-xHkZdNWIzO++g+V/rHGqVoHd2LRxz+8t8bj6FGelfb8FHBjg5yjkX7Su/8sQSBo5alIspYkRp/fU0A2SM5h+5A==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tapable": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", + "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tar": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", + "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/telnet-client": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/telnet-client/-/telnet-client-1.2.8.tgz", + "integrity": "sha512-W+w4k3QAmULVNhBVT2Fei369kGZCh/TH25M7caJAXW+hLxwoQRuw0di3cX4l0S9fgH3Mvq7u+IFMoBDpEw/eIg==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.4" + } + }, + "node_modules/temp": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", + "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "engines": [ + "node >=0.8.0" + ], + "dependencies": { + "os-tmpdir": "^1.0.0", + "rimraf": "~2.2.6" + } + }, + "node_modules/temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/temp-file": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.3.7.tgz", + "integrity": "sha512-9tBJKt7GZAQt/Rg0QzVWA8Am8c1EFl+CAv04/aBVqlx5oyfQ508sFIABshQ0xbZu6mBrFLWIUXO/bbLYghW70g==", + "dev": true, + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^8.1.0" + } + }, + "node_modules/temp-file/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/temp-file/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/temp-file/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/tempfile": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", + "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", + "dev": true, + "dependencies": { + "temp-dir": "^1.0.0", + "uuid": "^3.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", + "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/terminal-link/node_modules/ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "dependencies": { + "type-fest": "^0.11.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/terminal-link/node_modules/type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/time-zone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", + "integrity": "sha1-mcW/VZWJZq9tBtg73zgA3IL67F0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "dependencies": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "dev": true, + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/ts-toolbelt": { + "version": "6.15.5", + "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", + "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==" + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true, + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.22", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.22.tgz", + "integrity": "sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q==", + "engines": { + "node": "*" + } + }, + "node_modules/uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dependencies": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-es/node_modules/commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==" + }, + "node_modules/uglify-es/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "node_modules/ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" + }, + "node_modules/underscore": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.11.0.tgz", + "integrity": "sha512-xY96SsN3NA461qIRKZ/+qox37YXPtSBswMGfiNptr+wrt6ds4HaMw23TP612fEyGekRE6LNRiLYr/aqbHXNedw==" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true + }, + "node_modules/universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unused-filename": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unused-filename/-/unused-filename-2.1.0.tgz", + "integrity": "sha512-BMiNwJbuWmqCpAM1FqxCTD7lXF97AvfQC8Kr/DIeA6VtvhJaMDupZ82+inbjl5yVP44PcxOuCSxye1QMS0wZyg==", + "dependencies": { + "modify-filename": "^1.1.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "devOptional": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "dev": true, + "dependencies": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/urbanairship-react-native": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urbanairship-react-native/-/urbanairship-react-native-10.0.0.tgz", + "integrity": "sha512-0vJ6K+KnGeB5vJujFzfWXc7x+nFkdELj4TSOBkfW0VfxrQpojIXmOdXt0GHWOUOVTzFj2iA25qkfcSAaImQeGw==" + }, + "node_modules/uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use-subscription": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.4.1.tgz", + "integrity": "sha512-7+IIwDG/4JICrWHL/Q/ZPK5yozEnvRm6vHImu0LKwQlmWGKeiF7mbAenLlK/cTNXrTtXHU/SFASQHzB6+oSJMQ==", + "dependencies": { + "object-assign": "^4.1.1" + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", + "dev": true + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-6.0.1.tgz", + "integrity": "sha512-PzM1WlqquhBvsV+Gco6WSFeg1AGdD53ccMRkFeyHRE/KRZaVacPOmQYP3EeVgDBtKD2BJ8kgynBQ5OtKiHCH+w==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vlq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==" + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/wait-port": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-0.2.9.tgz", + "integrity": "sha512-hQ/cVKsNqGZ/UbZB/oakOGFqic00YAMM5/PEj3Bt4vKarv2jWIWzDbqlwT94qMs/exAQAsvMOq99sZblV92zxQ==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "commander": "^3.0.2", + "debug": "^4.1.1" + }, + "bin": { + "wait-port": "bin/wait-port.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wait-port/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wait-port/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wait-port/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/wait-port/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/wait-port/node_modules/commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "dev": true + }, + "node_modules/wait-port/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wait-port/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dependencies": { + "makeerror": "1.0.x" + } + }, + "node_modules/watchpack": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", + "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.0" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + }, + "engines": { + "node": "<8.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "optional": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "optional": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "optional": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.0.tgz", + "integrity": "sha512-9DhNa+aXpqdHk8LkLPTBU/dMfl84Y+WE2+KnfI6rSpNRNVKa0VGLjPd2pjFubDeqnWmulFggxmWBxhfJXZnR0g==", + "dev": true, + "dependencies": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^6.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.5.tgz", + "integrity": "sha512-v+DieK/HJkJOpFBETDJioequtc3PfxsWMaxIdIwujtF7FEV/MAyDQLlm6/zPvr7Mix07mLh6ccVwIsloceodlg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.0.2.tgz", + "integrity": "sha512-+bpA9MJsHdZ4bgfDcpk0ozQyhhVct7rzOmO0s1IIr0AGGgKBljss8n2zp11rRP2wid5VGeh04CgeKzgat5/25A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.3.tgz", + "integrity": "sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA==", + "dev": true, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/webpack-cli": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/webpack-cli/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-cli/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-cli/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-cli/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/webpack-cli/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/webpack-cli/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/webpack-cli/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/webpack-cli/node_modules/enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/webpack-cli/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-cli/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-cli/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/webpack-cli/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-cli/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/webpack-cli/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-cli/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/webpack-cli/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "dev": true, + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", + "dev": true, + "dependencies": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.20", + "sockjs-client": "1.4.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/webpack-dev-server/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-server/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-log/node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-merge": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.2.0.tgz", + "integrity": "sha512-QBglJBg5+lItm3/Lopv8KDDK01+hjdg2azEwi/4vKJ8ZmGPdtJsTpjtNNOW3a4WiqzXdCATtTudOZJngE7RKkA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-merge/node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-merge/node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-sources/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/webpack/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/webpack/node_modules/enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/webpack/node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/webpack/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/webpack/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/webpack/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + } + }, + "node_modules/webpack/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/websocket-driver": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "dev": true, + "dependencies": { + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.4.1.tgz", + "integrity": "sha512-sofZVzE1wKwO+EYPbWfiwzaKovWiZXf4coEzjGP9b2GBVgQRLQUZ2QcuPpQExGDAW5GItpEm6Tl4OU5mywnAoQ==" + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/worker-loader": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-3.0.8.tgz", + "integrity": "sha512-XQyQkIFeRVC7f7uRhFdNMe/iJOdO6zxAaR3EWbDp45v3mDhrTi+++oswKNxShUNjPC/1xUp5DB29YKLhFo129g==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + }, + "node_modules/ws": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", + "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "dependencies": { + "options": ">=0.0.5", + "ultron": "1.0.x" + } + }, + "node_modules/xcode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-2.1.0.tgz", + "integrity": "sha512-uCrmPITrqTEzhn0TtT57fJaNaw8YJs1aCzs+P/QqxsDbvPZSv7XMPPwXrKvHtD6pLjBM/NaVwraWJm8q83Y4iQ==", + "dependencies": { + "simple-plist": "^1.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/xmldoc": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.2.tgz", + "integrity": "sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ==", + "dependencies": { + "sax": "^1.2.1" + } + }, + "node_modules/xmldom": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", + "engines": { + "node": ">=0.1" + } + }, + "node_modules/xpipe": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/xpipe/-/xpipe-1.0.5.tgz", + "integrity": "sha1-jdi/Rfw/f1Xw4FS4ePQ6YmFNr98=" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "node_modules/yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz", + "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + } + } + }, + "dependencies": { + "@actions/core": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.6.tgz", + "integrity": "sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA==", + "dev": true + }, + "@actions/github": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@actions/github/-/github-4.0.0.tgz", + "integrity": "sha512-Ej/Y2E+VV6sR9X7pWL5F3VgEWrABaT292DRqRU6R4hnQjPtC/zD3nagxVdXWiRQvYDh8kHXo7IDmG42eJ/dOMA==", + "dev": true, + "requires": { + "@actions/http-client": "^1.0.8", + "@octokit/core": "^3.0.0", + "@octokit/plugin-paginate-rest": "^2.2.3", + "@octokit/plugin-rest-endpoint-methods": "^4.0.0" + } + }, + "@actions/http-client": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.9.tgz", + "integrity": "sha512-0O4SsJ7q+MK0ycvXPl2e6bMXV7dxAXOGjrXS1eTF9s2S401Tp6c/P3c3Joz04QefC1J6Gt942Wl2jbm3f4mLcg==", + "dev": true, + "requires": { + "tunnel": "0.0.6" + } + }, + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.1.tgz", + "integrity": "sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ==", + "dev": true + }, + "@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "requires": { + "@babel/types": "^7.12.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz", + "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-react-jsx-experimental": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.1.tgz", + "integrity": "sha512-82to8lR7TofZWbTd3IEZT1xNHfeU/Ef4rDm/GLXddzqDh+yQ19QuGSzqww51aNxVH8rwfRIzL0EUQsvODVhtyw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz", + "integrity": "sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.12.1", + "@babel/helper-validator-option": "^7.12.1", + "browserslist": "^4.12.0", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", + "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", + "requires": { + "lodash": "^4.17.19" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "@babel/helper-validator-option": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", + "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", + "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helpers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.1.tgz", + "integrity": "sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==", + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==" + }, + "@babel/plugin-external-helpers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.12.1.tgz", + "integrity": "sha512-5VBqan0daXhDSRjrq2miABuELRwWJWFdM42Jvs/CDuhp+Es+fW+ISA5l+co8d+9oN3WLz/N3VvzyeseL3AvjxA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", + "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-export-default-from": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.12.1.tgz", + "integrity": "sha512-z5Q4Ke7j0AexQRfgUvnD+BdCSgpTEKnqQ3kskk2jWtOBulxICzd1X9BGt7kmWftxZ2W3++OZdt5gtmC8KLxdRQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-default-from": "^7.12.1" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", + "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", + "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", + "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", + "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", + "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-default-from": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.12.1.tgz", + "integrity": "sha512-dP5eGg6tHEkhnRD2/vRG/KJKRSg8gtxu2i+P/8/yFPJn/CfPU5G0/7Gks2i3M6IOVAPQekmsLN9LPsmXFFL4Uw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-flow": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.1.tgz", + "integrity": "sha512-1lBLLmtxrwpm4VKmtVFselI/P3pX+G63fAtUUt6b2Nzgao77KNDwyuRt90Mj2/9pKobtt68FdvjfqohZjg/FCA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.1.tgz", + "integrity": "sha512-UZNEcCY+4Dp9yYRCAHrHDU+9ZXLYaY9MgBXSRLkB9WjYFRR6quJBumfVrEkUxrePPBwFcpWfNKXqVRQQtm7mMA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", + "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz", + "integrity": "sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-flow": "^7.12.1" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-identifier": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", + "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-assign": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.12.1.tgz", + "integrity": "sha512-geUHn4XwHznRAFiuROTy0Hr7bKbpijJCmr1Svt/VNGhpxmp0OrdxURNpWbOAf94nUbL+xj6gbxRVPHWIbRpRoA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", + "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.12.1.tgz", + "integrity": "sha512-KOHd0tIRLoER+J+8f9DblZDa1fLGPwaaN1DI1TVHuQFOpjHV22C3CUB3obeC4fexHY9nx+fH0hQNvLFFfA1mxA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", + "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.1.tgz", + "integrity": "sha512-RmKejwnT0T0QzQUzcbP5p1VWlpnP8QHtdhEtLG55ZDQnJNalbF3eeDyu3dnGKvGzFIQiBzFhBYTwvv435p9Xpw==", + "requires": { + "@babel/helper-builder-react-jsx": "^7.10.4", + "@babel/helper-builder-react-jsx-experimental": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.12.1" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.1.tgz", + "integrity": "sha512-IilcGWdN1yNgEGOrB96jbTplRh+V2Pz1EoEwsKsHfX1a/L40cUYuD71Zepa7C+ujv7kJIxnDftWeZbKNEqZjCQ==", + "dev": true, + "requires": { + "@babel/helper-builder-react-jsx-experimental": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.12.1" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.1.tgz", + "integrity": "sha512-FbpL0ieNWiiBB5tCldX17EtXgmzeEZjFrix72rQYeq9X6nUK38HCaxexzVQrZWXanxKJPKVVIU37gFjEQYkPkA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.1.tgz", + "integrity": "sha512-keQ5kBfjJNRc6zZN1/nVHCd6LLIHq4aUKcVnvE/2l+ZZROSbqoiGFRtT5t3Is89XJxBQaP7NLZX2jgGHdZvvFQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", + "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", + "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz", + "integrity": "sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz", + "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.1.tgz", + "integrity": "sha512-VrsBByqAIntM+EYMqSm59SiMEf7qkmI9dqMt6RbD/wlwueWmYcI0FFK5Fj47pP6DRZm+3teXjosKlwcZJ5lIMw==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-typescript": "^7.12.1" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", + "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", + "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", + "dev": true, + "requires": { "@babel/compat-data": "^7.12.1", "@babel/helper-compilation-targets": "^7.12.1", "@babel/helper-module-imports": "^7.12.1", @@ -2161,11 +33354,6 @@ "picomatch": "^2.0.5" } }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" - }, "pretty-format": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", @@ -5023,6 +36211,12 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "7zip-bin": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.0.3.tgz", + "integrity": "sha512-GLyWIFBbGvpKPGo55JyRZAo4lVbnBiD52cKlw/0Vt+wnmKvWJkpZvsjVoaIolyBXDeAQKSicRtqFNPem9w0WYA==", + "dev": true + }, "abab": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", @@ -5398,8 +36592,8 @@ "integrity": "sha512-KfXim/fiNwFW2SKffsjEMdAU7RbbEXn62x5YyXle1b4j9X/wEHW9iwox8De6y0hJdR+/kCC/49lI+VgNwLhV7A==", "dev": true, "requires": { - "7zip-bin": "~5.0.3", "@develar/schema-utils": "~2.6.5", + "7zip-bin": "~5.0.3", "async-exit-hook": "^2.0.1", "bluebird-lst": "^1.0.9", "builder-util": "22.9.1", @@ -5711,7 +36905,8 @@ "async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "devOptional": true }, "async-exit-hook": { "version": "2.0.1", @@ -6307,7 +37502,8 @@ "binary-extensions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "devOptional": true }, "bindings": { "version": "1.5.0", @@ -6659,9 +37855,9 @@ "integrity": "sha512-5hN/XOaYu4ZQUS6F+5CXE6jTo+NAnVqAxDuKGSaHWb9bejfv/rluChTLoY3/nJh7RFjkoyVjvFJv7zQDB1QmHw==", "dev": true, "requires": { - "7zip-bin": "~5.0.3", "@types/debug": "^4.1.5", "@types/fs-extra": "^9.0.1", + "7zip-bin": "~5.0.3", "app-builder-bin": "3.5.10", "bluebird-lst": "^1.0.9", "builder-util-runtime": "8.7.2", @@ -11206,8 +42402,9 @@ } }, "expensify-common": { - "version": "git+https://github.com/Expensify/expensify-common.git#679fc86cfc4f9bc701e3757d583d74057edbbe28", - "from": "git+https://github.com/Expensify/expensify-common.git#679fc86cfc4f9bc701e3757d583d74057edbbe28", + "version": "git+ssh://git@github.com/Expensify/expensify-common.git#d5edd0a956ef5c12fb6e9493d1f4608289f82a0e", + "integrity": "sha512-OeaWhX2jxPKakMVZxu5iOQ8mYTwvQtGblx8UVEBI0LPJvnGLXxxS6T7sUrATVfXAuWdrPjkxdX3cTDN5/s3Dow==", + "from": "expensify-common@git+https://github.com/Expensify/expensify-common.git#d5edd0a956ef5c12fb6e9493d1f4608289f82a0e", "requires": { "classnames": "2.2.5", "clipboard": "2.0.4", @@ -12087,6 +43284,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "devOptional": true, "requires": { "is-glob": "^4.0.1" } @@ -12989,6 +44187,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "devOptional": true, "requires": { "binary-extensions": "^2.0.0" } @@ -13071,7 +44270,8 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "devOptional": true }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -13088,6 +44288,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "devOptional": true, "requires": { "is-extglob": "^2.1.1" } @@ -20415,7 +51616,8 @@ "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "devOptional": true }, "path-exists": { "version": "4.0.0", @@ -21319,8 +52521,8 @@ } }, "react-native-onyx": { - "version": "git+https://github.com/Expensify/react-native-onyx.git#3635fc34f00c8c8f97500b97fd42251ab4d22ab5", - "from": "git+https://github.com/Expensify/react-native-onyx.git#3635fc34f00c8c8f97500b97fd42251ab4d22ab5", + "version": "git+ssh://git@github.com/Expensify/react-native-onyx.git#3635fc34f00c8c8f97500b97fd42251ab4d22ab5", + "from": "react-native-onyx@git+https://github.com/Expensify/react-native-onyx.git#3635fc34f00c8c8f97500b97fd42251ab4d22ab5", "requires": { "@react-native-community/async-storage": "^1.12.1", "expensify-common": "git+https://github.com/Expensify/expensify-common.git#3d8fc7500ddd24cd4a543e6e160d4f1ad97cc145", @@ -21330,8 +52532,8 @@ }, "dependencies": { "expensify-common": { - "version": "git+https://github.com/Expensify/expensify-common.git#3d8fc7500ddd24cd4a543e6e160d4f1ad97cc145", - "from": "git+https://github.com/Expensify/expensify-common.git#3d8fc7500ddd24cd4a543e6e160d4f1ad97cc145", + "version": "git+ssh://git@github.com/Expensify/expensify-common.git#3d8fc7500ddd24cd4a543e6e160d4f1ad97cc145", + "from": "expensify-common@git+https://github.com/Expensify/expensify-common.git#3d8fc7500ddd24cd4a543e6e160d4f1ad97cc145", "requires": { "classnames": "2.2.5", "clipboard": "2.0.4", @@ -21990,6 +53192,7 @@ "version": "3.5.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "devOptional": true, "requires": { "picomatch": "^2.2.1" } @@ -22918,8 +54121,8 @@ } }, "simply-deferred": { - "version": "git+https://github.com/Expensify/simply-deferred.git#77a08a95754660c7bd6e0b6979fdf84e8e831bf5", - "from": "git+https://github.com/Expensify/simply-deferred.git#77a08a95754660c7bd6e0b6979fdf84e8e831bf5" + "version": "git+ssh://git@github.com/Expensify/simply-deferred.git#77a08a95754660c7bd6e0b6979fdf84e8e831bf5", + "from": "simply-deferred@git+https://github.com/Expensify/simply-deferred.git#77a08a95754660c7bd6e0b6979fdf84e8e831bf5" }, "sirv": { "version": "1.0.11", @@ -23457,6 +54660,14 @@ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, "string-length": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", @@ -23570,14 +54781,6 @@ } } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -24471,7 +55674,8 @@ "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "devOptional": true }, "update-notifier": { "version": "4.1.3", diff --git a/package.json b/package.json index 9815a5516bbd..be6c25b40b4c 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "electron-log": "^4.2.4", "electron-serve": "^1.0.0", "electron-updater": "^4.3.4", - "expensify-common": "git+https://github.com/Expensify/expensify-common.git#679fc86cfc4f9bc701e3757d583d74057edbbe28", + "expensify-common": "git+https://github.com/Expensify/expensify-common.git#d5edd0a956ef5c12fb6e9493d1f4608289f82a0e", "file-loader": "^6.0.0", "html-entities": "^1.3.1", "lodash": "4.17.21", From ca841e4d84701d7ee9796cd4659b5675b4b87156 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 12 Apr 2021 15:47:35 -0600 Subject: [PATCH 240/380] Remove unused code from native picker --- .../report/EmojiPickerMenu/index.native.js | 42 +------------------ 1 file changed, 2 insertions(+), 40 deletions(-) diff --git a/src/pages/home/report/EmojiPickerMenu/index.native.js b/src/pages/home/report/EmojiPickerMenu/index.native.js index 9cec2fb4c5bd..7b8c585a042f 100644 --- a/src/pages/home/report/EmojiPickerMenu/index.native.js +++ b/src/pages/home/report/EmojiPickerMenu/index.native.js @@ -1,7 +1,6 @@ import React, {Component} from 'react'; import {View, FlatList, Text} from 'react-native'; import PropTypes from 'prop-types'; -import _ from 'underscore'; import CONST from '../../../../CONST'; import styles from '../../../../styles/styles'; import emojis from '../../../../../assets/emojis'; @@ -16,9 +15,6 @@ class EmojiPickerMenu extends Component { constructor(props) { super(props); - // Ref for the emoji search input - this.searchInput = undefined; - // This is the number of columns in each row of the picker. // Because of how flatList implements these rows, each row is an index rather than each element // For this reason to make headers work, we need to have the header be the only rendered element in its row @@ -32,40 +28,7 @@ class EmojiPickerMenu extends Component { // If this emojis are ever added to emojis.js this will need to be updated or things will break this.unfilteredHeaderIndices = [0, 34, 60, 88, 99, 121, 148]; - this.filterEmojis = _.debounce(this.filterEmojis.bind(this), 300, false); this.renderItem = this.renderItem.bind(this); - - this.state = { - filteredEmojis: emojis, - headerIndices: this.unfilteredHeaderIndices, - }; - } - - /** - * Filter the entire list of emojis to only emojis that have the search term in their keywords - * - * @param {String} searchTerm - */ - filterEmojis(searchTerm) { - const normalizedSearchTerm = searchTerm.toLowerCase(); - if (normalizedSearchTerm === '') { - // There are no headers when searching, so we need to re-make them sticky when there is no search term - this.setState({filteredEmojis: emojis, headerIndices: this.unfilteredHeaderIndices}); - return; - } - const newFilteredEmojiList = []; - _.each(emojis, (emoji) => { - if (emoji.header || emoji.code === CONST.EMOJI_SPACER) { - return; - } - - if (_.find(emoji.keywords, keyword => keyword.includes(normalizedSearchTerm))) { - newFilteredEmojiList.push(emoji); - } - }); - - // Remove sticky header indices. There are no headers while searching and we don't want to make emojis sticky - this.setState({filteredEmojis: newFilteredEmojiList, headerIndices: []}); } /** @@ -101,13 +64,12 @@ class EmojiPickerMenu extends Component { return ( (`emoji_picker_${item.code}`)} numColumns={this.numColumns} style={styles.emojiPickerList} - extraData={this.state.filteredEmojis} - stickyHeaderIndices={this.state.headerIndices} + stickyHeaderIndices={this.unfilteredHeaderIndices} /> ); From fda2bab095281de6383b4aaa6c9f07c433d0835e Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Mon, 12 Apr 2021 15:21:54 -0700 Subject: [PATCH 241/380] tweaks to default_account_data declaration and usage --- src/CONST.js | 2 +- src/Expensify.js | 2 +- src/libs/actions/Session.js | 6 +++--- src/libs/actions/User.js | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/CONST.js b/src/CONST.js index 69d6ca14446b..b9694391b8f9 100644 --- a/src/CONST.js +++ b/src/CONST.js @@ -77,7 +77,7 @@ const CONST = { TIMEZONE: 'timeZone', }, DEFAULT_TIME_ZONE: {automatic: true, selected: 'America/Los_Angeles'}, - DEFAULT_ACCOUNT_DATA: {error: '', success: ''}, + DEFAULT_ACCOUNT_DATA: {error: '', success: '', loading: false}, PRONOUNS: { HE_HIM_HIS: 'He/him', SHE_HER_HERS: 'She/her', diff --git a/src/Expensify.js b/src/Expensify.js index c3eb3369cb26..b1bd29de1661 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -22,7 +22,7 @@ Onyx.init({ // Clear any loading and error messages so they do not appear on app startup [ONYXKEYS.SESSION]: {loading: false}, - [ONYXKEYS.ACCOUNT]: {...CONST.DEFAULT_ACCOUNT_DATA, ...{loading: false}}, + [ONYXKEYS.ACCOUNT]: {...CONST.DEFAULT_ACCOUNT_DATA}, [ONYXKEYS.NETWORK]: {isOffline: false}, [ONYXKEYS.IOU]: {loading: false}, }, diff --git a/src/libs/actions/Session.js b/src/libs/actions/Session.js index 22c885ff0e01..fe01ed155a0a 100644 --- a/src/libs/actions/Session.js +++ b/src/libs/actions/Session.js @@ -77,7 +77,7 @@ function signOut() { * @param {String} login */ function fetchAccountDetails(login) { - Onyx.merge(ONYXKEYS.ACCOUNT, {...CONST.DEFAULT_ACCOUNT_DATA, ...{loading: true}}); + Onyx.merge(ONYXKEYS.ACCOUNT, {...CONST.DEFAULT_ACCOUNT_DATA, loading: true}); API.GetAccountStatus({email: login}) .then((response) => { @@ -165,7 +165,7 @@ function createTemporaryLogin(authToken, email) { * @param {String} [twoFactorAuthCode] */ function signIn(password, twoFactorAuthCode) { - Onyx.merge(ONYXKEYS.ACCOUNT, {...CONST.DEFAULT_ACCOUNT_DATA, ...{loading: true}}); + Onyx.merge(ONYXKEYS.ACCOUNT, {...CONST.DEFAULT_ACCOUNT_DATA, loading: true}); API.Authenticate({ useExpensifyLogin: true, @@ -225,7 +225,7 @@ function restartSignin() { * @param {String} accountID */ function setPassword(password, validateCode, accountID) { - Onyx.merge(ONYXKEYS.ACCOUNT, {...CONST.DEFAULT_ACCOUNT_DATA, ...{loading: true}}); + Onyx.merge(ONYXKEYS.ACCOUNT, {...CONST.DEFAULT_ACCOUNT_DATA, loading: true}); API.SetPassword({ password, diff --git a/src/libs/actions/User.js b/src/libs/actions/User.js index 99a582f096f8..911ee519098f 100644 --- a/src/libs/actions/User.js +++ b/src/libs/actions/User.js @@ -27,7 +27,7 @@ Onyx.connect({ * @returns {Promise} */ function changePassword(oldPassword, password) { - Onyx.merge(ONYXKEYS.ACCOUNT, {...CONST.DEFAULT_ACCOUNT_DATA, ...{loading: true}}); + Onyx.merge(ONYXKEYS.ACCOUNT, {...CONST.DEFAULT_ACCOUNT_DATA, loading: true}); return API.ChangePassword({oldPassword, password}) .then((response) => { @@ -107,7 +107,7 @@ function setExpensifyNewsStatus(subscribed) { * @returns {Promise} */ function setSecondaryLogin(login, password) { - Onyx.merge(ONYXKEYS.ACCOUNT, {...CONST.DEFAULT_ACCOUNT_DATA, ...{loading: true}}); + Onyx.merge(ONYXKEYS.ACCOUNT, {...CONST.DEFAULT_ACCOUNT_DATA, loading: true}); return API.User_SecondaryLogin_Send({ email: login, @@ -142,7 +142,7 @@ function setSecondaryLogin(login, password) { function validateLogin(accountID, validateCode) { const isLoggedIn = !_.isEmpty(sessionAuthToken); const redirectRoute = isLoggedIn ? ROUTES.getReportRoute(currentlyViewedReportID) : ROUTES.SIGNIN; - Onyx.merge(ONYXKEYS.ACCOUNT, {...CONST.DEFAULT_ACCOUNT_DATA, ...{loading: true}}); + Onyx.merge(ONYXKEYS.ACCOUNT, {...CONST.DEFAULT_ACCOUNT_DATA, loading: true}); API.ValidateEmail({ accountID, From 69d1cc3def34eeef7d2bf1f53630a651adecb388 Mon Sep 17 00:00:00 2001 From: Nikki Wines Date: Mon, 12 Apr 2021 15:47:30 -0700 Subject: [PATCH 242/380] dont use {...} where unnecessary --- src/Expensify.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Expensify.js b/src/Expensify.js index b1bd29de1661..1c2ea12deb7c 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -22,7 +22,7 @@ Onyx.init({ // Clear any loading and error messages so they do not appear on app startup [ONYXKEYS.SESSION]: {loading: false}, - [ONYXKEYS.ACCOUNT]: {...CONST.DEFAULT_ACCOUNT_DATA}, + [ONYXKEYS.ACCOUNT]: CONST.DEFAULT_ACCOUNT_DATA, [ONYXKEYS.NETWORK]: {isOffline: false}, [ONYXKEYS.IOU]: {loading: false}, }, From 1d25f7ad43d387b2cf35b81e1c54abef4f87601d Mon Sep 17 00:00:00 2001 From: runner Date: Mon, 12 Apr 2021 23:05:03 +0000 Subject: [PATCH 243/380] Update version to 1.0.19-1 --- android/app/build.gradle | 4 ++-- ios/ExpensifyCash/Info.plist | 2 +- ios/ExpensifyCashTests/Info.plist | 2 +- package-lock.json | 2 +- package.json | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index a7a68b22f6d4..b0fc8637ff45 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -148,8 +148,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001001900 - versionName "1.0.19-0" + versionCode 1001001901 + versionName "1.0.19-1" } splits { abi { diff --git a/ios/ExpensifyCash/Info.plist b/ios/ExpensifyCash/Info.plist index 1b6c540a3280..f0a91c7c511f 100644 --- a/ios/ExpensifyCash/Info.plist +++ b/ios/ExpensifyCash/Info.plist @@ -30,7 +30,7 @@ CFBundleVersion - 1.0.19.0 + 1.0.19.1 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/ExpensifyCashTests/Info.plist b/ios/ExpensifyCashTests/Info.plist index ebe9c3233f33..ff27fc56de09 100644 --- a/ios/ExpensifyCashTests/Info.plist +++ b/ios/ExpensifyCashTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.0.19.0 + 1.0.19.1 diff --git a/package-lock.json b/package-lock.json index ab0a46a9e07d..e7e07cc5e6b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.19-0", + "version": "1.0.19-1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 9815a5516bbd..704a8a7c414d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.19-0", + "version": "1.0.19-1", "author": "Expensify, Inc.", "homepage": "https://expensify.cash", "description": "Expensify.cash is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", From 7888a2988d1bf62fd1bfac72ed5b105978666a41 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Mon, 12 Apr 2021 23:41:30 +0000 Subject: [PATCH 244/380] Update version to 1.0.19-2 --- android/app/build.gradle | 4 ++-- ios/ExpensifyCash/Info.plist | 2 +- ios/ExpensifyCashTests/Info.plist | 2 +- package-lock.json | 2 +- package.json | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index b0fc8637ff45..e28a0f3e02a0 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -148,8 +148,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001001901 - versionName "1.0.19-1" + versionCode 1001001902 + versionName "1.0.19-2" } splits { abi { diff --git a/ios/ExpensifyCash/Info.plist b/ios/ExpensifyCash/Info.plist index f0a91c7c511f..15dfa518ba49 100644 --- a/ios/ExpensifyCash/Info.plist +++ b/ios/ExpensifyCash/Info.plist @@ -30,7 +30,7 @@ CFBundleVersion - 1.0.19.1 + 1.0.19.2 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/ExpensifyCashTests/Info.plist b/ios/ExpensifyCashTests/Info.plist index ff27fc56de09..2ef4273a5759 100644 --- a/ios/ExpensifyCashTests/Info.plist +++ b/ios/ExpensifyCashTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.0.19.1 + 1.0.19.2 diff --git a/package-lock.json b/package-lock.json index e7e07cc5e6b1..85cbe973b8ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.19-1", + "version": "1.0.19-2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 704a8a7c414d..c2c72072bc78 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.19-1", + "version": "1.0.19-2", "author": "Expensify, Inc.", "homepage": "https://expensify.cash", "description": "Expensify.cash is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", From cbe39fc676252e3c7c02134546a95b9c4323a6f9 Mon Sep 17 00:00:00 2001 From: Brandon Stites Date: Mon, 12 Apr 2021 18:37:07 -0600 Subject: [PATCH 245/380] Explain animation timing hack --- src/pages/home/report/ReportActionCompose.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js index 47bb5ab3f889..2d4c4b31edc8 100644 --- a/src/pages/home/report/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose.js @@ -345,6 +345,9 @@ class ReportActionCompose extends React.Component { isVisible={this.state.isEmojiPickerVisible} onClose={this.hideEmojiPicker} hideModalContentWhileAnimating + + // There is no way to disable animations and they are really laggy, because there are so many + // emojis. The best alternative is to set it to 1ms so it just "pops" in and out animationInTiming={1} animationOutTiming={1} anchorPosition={{ From e446fdfabec4464bb080ace1e36dd123301bf1f0 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Tue, 13 Apr 2021 08:39:18 +0800 Subject: [PATCH 246/380] Merge master --- .../createOrUpdateStagingDeploy/index.js | 2315 +---------------- .github/actions/getReleaseBody/index.js | 2315 +---------------- .../actions/isPullRequestMergeable/index.js | 2315 +---------------- .../actions/isStagingDeployLocked/index.js | 2315 +---------------- .../markPullRequestsAsDeployed/index.js | 2315 +---------------- .github/libs/GithubUtils.js | 109 +- .github/scripts/buildActions.sh | 2 + .github/scripts/verifyActions.sh | 2 +- .github/workflows/android.yml | 9 +- .github/workflows/finishReleaseCycle.yml | 31 +- .../workflows/verifyGithubActionBuilds.yml | 28 - CONTRIBUTING.md | 4 +- STYLE.md | 11 +- android/app/build.gradle | 4 +- apple-app-site-association | 3 +- fastlane/Fastfile | 2 +- ios/ExpensifyCash/Info.plist | 4 +- ios/ExpensifyCashTests/Info.plist | 4 +- package-lock.json | 236 +- package.json | 14 +- src/CONST.js | 10 +- src/Expensify.js | 3 +- src/ROUTES.js | 6 +- src/components/AttachmentPicker/index.js | 26 +- .../AttachmentPicker/index.native.js | 262 +- src/components/Checkbox.js | 8 +- src/components/FAB.js | 24 +- src/components/Icon/Expensicons.js | 4 + src/components/MenuItem.js | 40 +- src/components/TextInputFocusable/index.js | 5 + .../TextInputFocusable/index.native.js | 10 + src/libs/API.js | 96 +- .../Navigation/AppNavigator/AuthScreens.js | 60 +- .../AppNavigator/ModalStackNavigators.js | 7 +- .../Navigation/AppNavigator/PublicScreens.js | 6 + src/libs/Navigation/Navigation.js | 7 + src/libs/Navigation/linkingConfig.js | 4 + src/libs/actions/PersonalDetails.js | 55 +- src/libs/actions/Session.js | 29 +- src/libs/actions/User.js | 82 +- src/libs/hasEllipsis/index.js | 11 - src/libs/hasEllipsis/index.native.js | 1 - src/pages/DetailsPage.js | 22 +- src/pages/SetPasswordPage.js | 86 +- src/pages/home/HeaderView.js | 19 +- src/pages/home/ReportScreen.js | 117 +- src/pages/home/report/ReportActionCompose.js | 53 +- .../home/report/ReportActionContextMenu.js | 10 +- .../report/ReportActionContextMenuItem.js | 67 +- src/pages/home/report/ReportActionItem.js | 36 +- .../home/report/ReportActionItemSingle.js | 26 +- .../home/report/ReportActionPropTypes.js | 10 +- src/pages/home/report/ReportActionsView.js | 49 +- src/pages/home/report/ReportView.js | 38 +- src/pages/home/sidebar/OptionRow.js | 16 +- .../OptionRowTitle/OptionRowTitleProps.js | 37 - .../home/sidebar/OptionRowTitle/index.js | 123 - .../sidebar/OptionRowTitle/index.native.js | 20 - src/pages/settings/PasswordPage.js | 5 +- src/pages/settings/PaymentsPage.js | 4 +- src/pages/settings/PreferencesPage.js | 17 +- src/pages/settings/ProfilePage.js | 333 --- src/pages/signin/ChangeExpensifyLoginLink.js | 23 +- src/pages/signin/LoginForm.js | 8 + src/pages/signin/PasswordForm.js | 16 +- src/pages/signin/ResendValidationForm.js | 15 +- src/pages/signin/SignInPage.js | 19 +- .../SignInPageLayoutNarrow.js | 4 +- .../SignInPageLayout/SignInPageLayoutWide.js | 2 +- .../getReportActionContextMenuItemStyles.js | 88 - src/styles/styles.js | 75 +- src/styles/themes/default.js | 1 + src/styles/utilities/positioning.js | 3 + src/styles/utilities/spacing.js | 8 + tests/unit/GithubUtilsTest.js | 129 +- 75 files changed, 1335 insertions(+), 12938 deletions(-) delete mode 100644 .github/workflows/verifyGithubActionBuilds.yml delete mode 100644 src/libs/hasEllipsis/index.js delete mode 100644 src/libs/hasEllipsis/index.native.js delete mode 100644 src/pages/home/sidebar/OptionRowTitle/OptionRowTitleProps.js delete mode 100644 src/pages/home/sidebar/OptionRowTitle/index.js delete mode 100644 src/pages/home/sidebar/OptionRowTitle/index.native.js delete mode 100644 src/pages/settings/ProfilePage.js delete mode 100644 src/styles/getReportActionContextMenuItemStyles.js diff --git a/.github/actions/createOrUpdateStagingDeploy/index.js b/.github/actions/createOrUpdateStagingDeploy/index.js index e9646c7dc0c3..00be81386a33 100644 --- a/.github/actions/createOrUpdateStagingDeploy/index.js +++ b/.github/actions/createOrUpdateStagingDeploy/index.js @@ -116,8 +116,6 @@ module.exports = { const _ = __nccwpck_require__(4987); const lodashGet = __nccwpck_require__(6908); -const semverParse = __nccwpck_require__(5925); -const semverSatisfies = __nccwpck_require__(6055); const GITHUB_OWNER = 'Expensify'; const EXPENSIFY_CASH_REPO = 'Expensify.cash'; @@ -178,11 +176,6 @@ class GithubUtils { try { const versionRegex = new RegExp('([0-9]+)\\.([0-9]+)\\.([0-9]+)(?:-([0-9]+))?', 'g'); const tag = issue.body.match(versionRegex)[0].replace(/`/g, ''); - - // eslint-disable-next-line max-len - const compareURLRegex = new RegExp(`${EXPENSIFY_CASH_URL}/compare/${versionRegex.source}\\.\\.\\.${versionRegex.source}`, 'g'); - const comparisonURL = issue.body.match(compareURLRegex)[0]; - return { title: issue.title, url: issue.url, @@ -190,7 +183,6 @@ class GithubUtils { PRList: this.getStagingDeployCashPRList(issue), deployBlockers: this.getStagingDeployCashDeployBlockers(issue), tag, - comparisonURL, }; } catch (exception) { throw new Error(`Unable to find ${STAGING_DEPLOY_CASH_LABEL} issue with correct data.`); @@ -265,71 +257,6 @@ class GithubUtils { ); } - /** - * Generate a comparison URL between two versions following the semverLevel passed - * - * @param {String} repoSlug - The slug of the repository: / - * @param {String} tag - The tag to compare first the previous semverLevel - * @param {String} semverLevel - The semantic versioning MAJOR, MINOR, PATCH and BUILD - * @return {Promise} the url generated - * @throws {Error} If the request to the Github API fails. - */ - generateVersionComparisonURL(repoSlug, tag, semverLevel) { - return new Promise((resolve, reject) => { - const getComparisonURL = (previousTag, currentTag) => ( - `${EXPENSIFY_CASH_URL}/compare/${previousTag}...${currentTag}` - ); - - const [repoOwner, repoName] = repoSlug.split('/'); - const tagSemver = semverParse(tag); - - return this.octokit.repos.listTags({ - owner: repoOwner, - repo: repoName, - }) - .then(githubResponse => githubResponse.data.some(({name: repoTag}) => { - if (semverLevel === 'MAJOR' - && semverSatisfies(repoTag, `<${tagSemver.major}.x.x`, {includePrerelease: true}) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'MINOR' - && semverSatisfies( - repoTag, - `<${tagSemver.major}.${tagSemver.minor}.x`, - {includePrerelease: true}, - ) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'PATCH' - && semverSatisfies(repoTag, `<${tagSemver}`, {includePrerelease: true}) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'BUILD' - && repoTag !== tagSemver.version - && semverSatisfies( - repoTag, - `<=${tagSemver.major}.${tagSemver.minor}.${tagSemver.patch}`, - {includePrerelease: true}, - ) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - return false; - })) - .catch(githubError => reject(githubError)); - }); - } - /** * Creates a new StagingDeployCash issue. * @@ -425,22 +352,16 @@ class GithubUtils { deployBlockers = [], resolvedDeployBlockers = [], ) { - return Promise.all([ - this.generateVersionComparisonURL(`${GITHUB_OWNER}/${EXPENSIFY_CASH_REPO}`, tag, 'PATCH'), - this.octokit.pulls.list({ - owner: GITHUB_OWNER, - repo: EXPENSIFY_CASH_REPO, - per_page: 100, - }), - ]) - .then(results => ({ - comparisonURL: results[0], - automergePRs: _.map( - _.filter(results[1].data, GithubUtils.isAutomergePullRequest), + return this.octokit.pulls.list({ + owner: GITHUB_OWNER, + repo: EXPENSIFY_CASH_REPO, + per_page: 100, + }) + .then(({data}) => { + const automergePRs = _.pluck( + _.filter(data, GithubUtils.isAutomergePullRequest), 'html_url', - ), - })) - .then(({comparisonURL, automergePRs}) => { + ); const sortedPRList = _.chain(PRList) .difference(automergePRs) .unique() @@ -452,8 +373,8 @@ class GithubUtils { ); // Tag version and comparison URL - let issueBody = `**Release Version:** \`${tag}\`\r\n`; - issueBody += `**Compare Changes:** ${comparisonURL}\r\n`; + // eslint-disable-next-line max-len + let issueBody = `**Release Version:** \`${tag}\`\r\n**Compare Changes:** https://github.com/Expensify/Expensify.cash/compare/production...staging\r\n`; // PR list if (!_.isEmpty(PRList)) { @@ -474,11 +395,13 @@ class GithubUtils { } issueBody += '\r\ncc @Expensify/applauseleads\r\n'; - return issueBody; }) - // eslint-disable-next-line no-console - .catch(err => console.warn('Error generating comparison URL, continuing...', err)); + .catch(err => console.warn( + 'Error generating StagingDeployCash issue body!', + 'Automerge PRs may not be properly filtered out. Continuing...', + err, + )); } /** @@ -16501,2212 +16424,6 @@ if (!safer.constants) { module.exports = safer -/***/ }), - -/***/ 1532: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const ANY = Symbol('SemVer ANY') -// hoisted class for cyclic dependency -class Comparator { - static get ANY () { - return ANY - } - constructor (comp, options) { - options = parseOptions(options) - - if (comp instanceof Comparator) { - if (comp.loose === !!options.loose) { - return comp - } else { - comp = comp.value - } - } - - debug('comparator', comp, options) - this.options = options - this.loose = !!options.loose - this.parse(comp) - - if (this.semver === ANY) { - this.value = '' - } else { - this.value = this.operator + this.semver.version - } - - debug('comp', this) - } - - parse (comp) { - const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] - const m = comp.match(r) - - if (!m) { - throw new TypeError(`Invalid comparator: ${comp}`) - } - - this.operator = m[1] !== undefined ? m[1] : '' - if (this.operator === '=') { - this.operator = '' - } - - // if it literally is just '>' or '' then allow anything. - if (!m[2]) { - this.semver = ANY - } else { - this.semver = new SemVer(m[2], this.options.loose) - } - } - - toString () { - return this.value - } - - test (version) { - debug('Comparator.test', version, this.options.loose) - - if (this.semver === ANY || version === ANY) { - return true - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - return cmp(version, this.operator, this.semver, this.options) - } - - intersects (comp, options) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required') - } - - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - if (this.operator === '') { - if (this.value === '') { - return true - } - return new Range(comp.value, options).test(this.value) - } else if (comp.operator === '') { - if (comp.value === '') { - return true - } - return new Range(this.value, options).test(comp.semver) - } - - const sameDirectionIncreasing = - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '>=' || comp.operator === '>') - const sameDirectionDecreasing = - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '<=' || comp.operator === '<') - const sameSemVer = this.semver.version === comp.semver.version - const differentDirectionsInclusive = - (this.operator === '>=' || this.operator === '<=') && - (comp.operator === '>=' || comp.operator === '<=') - const oppositeDirectionsLessThan = - cmp(this.semver, '<', comp.semver, options) && - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '<=' || comp.operator === '<') - const oppositeDirectionsGreaterThan = - cmp(this.semver, '>', comp.semver, options) && - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '>=' || comp.operator === '>') - - return ( - sameDirectionIncreasing || - sameDirectionDecreasing || - (sameSemVer && differentDirectionsInclusive) || - oppositeDirectionsLessThan || - oppositeDirectionsGreaterThan - ) - } -} - -module.exports = Comparator - -const parseOptions = __nccwpck_require__(785) -const {re, t} = __nccwpck_require__(9523) -const cmp = __nccwpck_require__(5098) -const debug = __nccwpck_require__(427) -const SemVer = __nccwpck_require__(8088) -const Range = __nccwpck_require__(9828) - - -/***/ }), - -/***/ 9828: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -// hoisted class for cyclic dependency -class Range { - constructor (range, options) { - options = parseOptions(options) - - if (range instanceof Range) { - if ( - range.loose === !!options.loose && - range.includePrerelease === !!options.includePrerelease - ) { - return range - } else { - return new Range(range.raw, options) - } - } - - if (range instanceof Comparator) { - // just put it in the set and return - this.raw = range.value - this.set = [[range]] - this.format() - return this - } - - this.options = options - this.loose = !!options.loose - this.includePrerelease = !!options.includePrerelease - - // First, split based on boolean or || - this.raw = range - this.set = range - .split(/\s*\|\|\s*/) - // map the range to a 2d array of comparators - .map(range => this.parseRange(range.trim())) - // throw out any comparator lists that are empty - // this generally means that it was not a valid range, which is allowed - // in loose mode, but will still throw if the WHOLE range is invalid. - .filter(c => c.length) - - if (!this.set.length) { - throw new TypeError(`Invalid SemVer Range: ${range}`) - } - - // if we have any that are not the null set, throw out null sets. - if (this.set.length > 1) { - // keep the first one, in case they're all null sets - const first = this.set[0] - this.set = this.set.filter(c => !isNullSet(c[0])) - if (this.set.length === 0) - this.set = [first] - else if (this.set.length > 1) { - // if we have any that are *, then the range is just * - for (const c of this.set) { - if (c.length === 1 && isAny(c[0])) { - this.set = [c] - break - } - } - } - } - - this.format() - } - - format () { - this.range = this.set - .map((comps) => { - return comps.join(' ').trim() - }) - .join('||') - .trim() - return this.range - } - - toString () { - return this.range - } - - parseRange (range) { - range = range.trim() - - // memoize range parsing for performance. - // this is a very hot path, and fully deterministic. - const memoOpts = Object.keys(this.options).join(',') - const memoKey = `parseRange:${memoOpts}:${range}` - const cached = cache.get(memoKey) - if (cached) - return cached - - const loose = this.options.loose - // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` - const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE] - range = range.replace(hr, hyphenReplace(this.options.includePrerelease)) - debug('hyphen replace', range) - // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` - range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace) - debug('comparator trim', range, re[t.COMPARATORTRIM]) - - // `~ 1.2.3` => `~1.2.3` - range = range.replace(re[t.TILDETRIM], tildeTrimReplace) - - // `^ 1.2.3` => `^1.2.3` - range = range.replace(re[t.CARETTRIM], caretTrimReplace) - - // normalize spaces - range = range.split(/\s+/).join(' ') - - // At this point, the range is completely trimmed and - // ready to be split into comparators. - - const compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] - const rangeList = range - .split(' ') - .map(comp => parseComparator(comp, this.options)) - .join(' ') - .split(/\s+/) - // >=0.0.0 is equivalent to * - .map(comp => replaceGTE0(comp, this.options)) - // in loose mode, throw out any that are not valid comparators - .filter(this.options.loose ? comp => !!comp.match(compRe) : () => true) - .map(comp => new Comparator(comp, this.options)) - - // if any comparators are the null set, then replace with JUST null set - // if more than one comparator, remove any * comparators - // also, don't include the same comparator more than once - const l = rangeList.length - const rangeMap = new Map() - for (const comp of rangeList) { - if (isNullSet(comp)) - return [comp] - rangeMap.set(comp.value, comp) - } - if (rangeMap.size > 1 && rangeMap.has('')) - rangeMap.delete('') - - const result = [...rangeMap.values()] - cache.set(memoKey, result) - return result - } - - intersects (range, options) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required') - } - - return this.set.some((thisComparators) => { - return ( - isSatisfiable(thisComparators, options) && - range.set.some((rangeComparators) => { - return ( - isSatisfiable(rangeComparators, options) && - thisComparators.every((thisComparator) => { - return rangeComparators.every((rangeComparator) => { - return thisComparator.intersects(rangeComparator, options) - }) - }) - ) - }) - ) - }) - } - - // if ANY of the sets match ALL of its comparators, then pass - test (version) { - if (!version) { - return false - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - for (let i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version, this.options)) { - return true - } - } - return false - } -} -module.exports = Range - -const LRU = __nccwpck_require__(1196) -const cache = new LRU({ max: 1000 }) - -const parseOptions = __nccwpck_require__(785) -const Comparator = __nccwpck_require__(1532) -const debug = __nccwpck_require__(427) -const SemVer = __nccwpck_require__(8088) -const { - re, - t, - comparatorTrimReplace, - tildeTrimReplace, - caretTrimReplace -} = __nccwpck_require__(9523) - -const isNullSet = c => c.value === '<0.0.0-0' -const isAny = c => c.value === '' - -// take a set of comparators and determine whether there -// exists a version which can satisfy it -const isSatisfiable = (comparators, options) => { - let result = true - const remainingComparators = comparators.slice() - let testComparator = remainingComparators.pop() - - while (result && remainingComparators.length) { - result = remainingComparators.every((otherComparator) => { - return testComparator.intersects(otherComparator, options) - }) - - testComparator = remainingComparators.pop() - } - - return result -} - -// comprised of xranges, tildes, stars, and gtlt's at this point. -// already replaced the hyphen ranges -// turn into a set of JUST comparators. -const parseComparator = (comp, options) => { - debug('comp', comp, options) - comp = replaceCarets(comp, options) - debug('caret', comp) - comp = replaceTildes(comp, options) - debug('tildes', comp) - comp = replaceXRanges(comp, options) - debug('xrange', comp) - comp = replaceStars(comp, options) - debug('stars', comp) - return comp -} - -const isX = id => !id || id.toLowerCase() === 'x' || id === '*' - -// ~, ~> --> * (any, kinda silly) -// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0 -// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0 -// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0 -// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0 -// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0 -const replaceTildes = (comp, options) => - comp.trim().split(/\s+/).map((comp) => { - return replaceTilde(comp, options) - }).join(' ') - -const replaceTilde = (comp, options) => { - const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] - return comp.replace(r, (_, M, m, p, pr) => { - debug('tilde', comp, _, M, m, p, pr) - let ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = `>=${M}.0.0 <${+M + 1}.0.0-0` - } else if (isX(p)) { - // ~1.2 == >=1.2.0 <1.3.0-0 - ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0` - } else if (pr) { - debug('replaceTilde pr', pr) - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${+m + 1}.0-0` - } else { - // ~1.2.3 == >=1.2.3 <1.3.0-0 - ret = `>=${M}.${m}.${p - } <${M}.${+m + 1}.0-0` - } - - debug('tilde return', ret) - return ret - }) -} - -// ^ --> * (any, kinda silly) -// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0 -// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0 -// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0 -// ^1.2.3 --> >=1.2.3 <2.0.0-0 -// ^1.2.0 --> >=1.2.0 <2.0.0-0 -const replaceCarets = (comp, options) => - comp.trim().split(/\s+/).map((comp) => { - return replaceCaret(comp, options) - }).join(' ') - -const replaceCaret = (comp, options) => { - debug('caret', comp, options) - const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET] - const z = options.includePrerelease ? '-0' : '' - return comp.replace(r, (_, M, m, p, pr) => { - debug('caret', comp, _, M, m, p, pr) - let ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0` - } else if (isX(p)) { - if (M === '0') { - ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0` - } else { - ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0` - } - } else if (pr) { - debug('replaceCaret pr', pr) - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${m}.${+p + 1}-0` - } else { - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${+m + 1}.0-0` - } - } else { - ret = `>=${M}.${m}.${p}-${pr - } <${+M + 1}.0.0-0` - } - } else { - debug('no pr') - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p - }${z} <${M}.${m}.${+p + 1}-0` - } else { - ret = `>=${M}.${m}.${p - }${z} <${M}.${+m + 1}.0-0` - } - } else { - ret = `>=${M}.${m}.${p - } <${+M + 1}.0.0-0` - } - } - - debug('caret return', ret) - return ret - }) -} - -const replaceXRanges = (comp, options) => { - debug('replaceXRanges', comp, options) - return comp.split(/\s+/).map((comp) => { - return replaceXRange(comp, options) - }).join(' ') -} - -const replaceXRange = (comp, options) => { - comp = comp.trim() - const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE] - return comp.replace(r, (ret, gtlt, M, m, p, pr) => { - debug('xRange', comp, ret, gtlt, M, m, p, pr) - const xM = isX(M) - const xm = xM || isX(m) - const xp = xm || isX(p) - const anyX = xp - - if (gtlt === '=' && anyX) { - gtlt = '' - } - - // if we're including prereleases in the match, then we need - // to fix this to -0, the lowest possible prerelease value - pr = options.includePrerelease ? '-0' : '' - - if (xM) { - if (gtlt === '>' || gtlt === '<') { - // nothing is allowed - ret = '<0.0.0-0' - } else { - // nothing is forbidden - ret = '*' - } - } else if (gtlt && anyX) { - // we know patch is an x, because we have any x at all. - // replace X with 0 - if (xm) { - m = 0 - } - p = 0 - - if (gtlt === '>') { - // >1 => >=2.0.0 - // >1.2 => >=1.3.0 - gtlt = '>=' - if (xm) { - M = +M + 1 - m = 0 - p = 0 - } else { - m = +m + 1 - p = 0 - } - } else if (gtlt === '<=') { - // <=0.7.x is actually <0.8.0, since any 0.7.x should - // pass. Similarly, <=7.x is actually <8.0.0, etc. - gtlt = '<' - if (xm) { - M = +M + 1 - } else { - m = +m + 1 - } - } - - if (gtlt === '<') - pr = '-0' - - ret = `${gtlt + M}.${m}.${p}${pr}` - } else if (xm) { - ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0` - } else if (xp) { - ret = `>=${M}.${m}.0${pr - } <${M}.${+m + 1}.0-0` - } - - debug('xRange return', ret) - - return ret - }) -} - -// Because * is AND-ed with everything else in the comparator, -// and '' means "any version", just remove the *s entirely. -const replaceStars = (comp, options) => { - debug('replaceStars', comp, options) - // Looseness is ignored here. star is always as loose as it gets! - return comp.trim().replace(re[t.STAR], '') -} - -const replaceGTE0 = (comp, options) => { - debug('replaceGTE0', comp, options) - return comp.trim() - .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '') -} - -// This function is passed to string.replace(re[t.HYPHENRANGE]) -// M, m, patch, prerelease, build -// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 -// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do -// 1.2 - 3.4 => >=1.2.0 <3.5.0-0 -const hyphenReplace = incPr => ($0, - from, fM, fm, fp, fpr, fb, - to, tM, tm, tp, tpr, tb) => { - if (isX(fM)) { - from = '' - } else if (isX(fm)) { - from = `>=${fM}.0.0${incPr ? '-0' : ''}` - } else if (isX(fp)) { - from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}` - } else if (fpr) { - from = `>=${from}` - } else { - from = `>=${from}${incPr ? '-0' : ''}` - } - - if (isX(tM)) { - to = '' - } else if (isX(tm)) { - to = `<${+tM + 1}.0.0-0` - } else if (isX(tp)) { - to = `<${tM}.${+tm + 1}.0-0` - } else if (tpr) { - to = `<=${tM}.${tm}.${tp}-${tpr}` - } else if (incPr) { - to = `<${tM}.${tm}.${+tp + 1}-0` - } else { - to = `<=${to}` - } - - return (`${from} ${to}`).trim() -} - -const testSet = (set, version, options) => { - for (let i = 0; i < set.length; i++) { - if (!set[i].test(version)) { - return false - } - } - - if (version.prerelease.length && !options.includePrerelease) { - // Find the set of versions that are allowed to have prereleases - // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 - // That should allow `1.2.3-pr.2` to pass. - // However, `1.2.4-alpha.notready` should NOT be allowed, - // even though it's within the range set by the comparators. - for (let i = 0; i < set.length; i++) { - debug(set[i].semver) - if (set[i].semver === Comparator.ANY) { - continue - } - - if (set[i].semver.prerelease.length > 0) { - const allowed = set[i].semver - if (allowed.major === version.major && - allowed.minor === version.minor && - allowed.patch === version.patch) { - return true - } - } - } - - // Version has a -pre, but it's not one of the ones we like. - return false - } - - return true -} - - -/***/ }), - -/***/ 8088: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const debug = __nccwpck_require__(427) -const { MAX_LENGTH, MAX_SAFE_INTEGER } = __nccwpck_require__(2293) -const { re, t } = __nccwpck_require__(9523) - -const parseOptions = __nccwpck_require__(785) -const { compareIdentifiers } = __nccwpck_require__(2463) -class SemVer { - constructor (version, options) { - options = parseOptions(options) - - if (version instanceof SemVer) { - if (version.loose === !!options.loose && - version.includePrerelease === !!options.includePrerelease) { - return version - } else { - version = version.version - } - } else if (typeof version !== 'string') { - throw new TypeError(`Invalid Version: ${version}`) - } - - if (version.length > MAX_LENGTH) { - throw new TypeError( - `version is longer than ${MAX_LENGTH} characters` - ) - } - - debug('SemVer', version, options) - this.options = options - this.loose = !!options.loose - // this isn't actually relevant for versions, but keep it so that we - // don't run into trouble passing this.options around. - this.includePrerelease = !!options.includePrerelease - - const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]) - - if (!m) { - throw new TypeError(`Invalid Version: ${version}`) - } - - this.raw = version - - // these are actually numbers - this.major = +m[1] - this.minor = +m[2] - this.patch = +m[3] - - if (this.major > MAX_SAFE_INTEGER || this.major < 0) { - throw new TypeError('Invalid major version') - } - - if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { - throw new TypeError('Invalid minor version') - } - - if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { - throw new TypeError('Invalid patch version') - } - - // numberify any prerelease numeric ids - if (!m[4]) { - this.prerelease = [] - } else { - this.prerelease = m[4].split('.').map((id) => { - if (/^[0-9]+$/.test(id)) { - const num = +id - if (num >= 0 && num < MAX_SAFE_INTEGER) { - return num - } - } - return id - }) - } - - this.build = m[5] ? m[5].split('.') : [] - this.format() - } - - format () { - this.version = `${this.major}.${this.minor}.${this.patch}` - if (this.prerelease.length) { - this.version += `-${this.prerelease.join('.')}` - } - return this.version - } - - toString () { - return this.version - } - - compare (other) { - debug('SemVer.compare', this.version, this.options, other) - if (!(other instanceof SemVer)) { - if (typeof other === 'string' && other === this.version) { - return 0 - } - other = new SemVer(other, this.options) - } - - if (other.version === this.version) { - return 0 - } - - return this.compareMain(other) || this.comparePre(other) - } - - compareMain (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - return ( - compareIdentifiers(this.major, other.major) || - compareIdentifiers(this.minor, other.minor) || - compareIdentifiers(this.patch, other.patch) - ) - } - - comparePre (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - // NOT having a prerelease is > having one - if (this.prerelease.length && !other.prerelease.length) { - return -1 - } else if (!this.prerelease.length && other.prerelease.length) { - return 1 - } else if (!this.prerelease.length && !other.prerelease.length) { - return 0 - } - - let i = 0 - do { - const a = this.prerelease[i] - const b = other.prerelease[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - } - - compareBuild (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - let i = 0 - do { - const a = this.build[i] - const b = other.build[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - } - - // preminor will bump the version up to the next minor release, and immediately - // down to pre-release. premajor and prepatch work the same way. - inc (release, identifier) { - switch (release) { - case 'premajor': - this.prerelease.length = 0 - this.patch = 0 - this.minor = 0 - this.major++ - this.inc('pre', identifier) - break - case 'preminor': - this.prerelease.length = 0 - this.patch = 0 - this.minor++ - this.inc('pre', identifier) - break - case 'prepatch': - // If this is already a prerelease, it will bump to the next version - // drop any prereleases that might already exist, since they are not - // relevant at this point. - this.prerelease.length = 0 - this.inc('patch', identifier) - this.inc('pre', identifier) - break - // If the input is a non-prerelease version, this acts the same as - // prepatch. - case 'prerelease': - if (this.prerelease.length === 0) { - this.inc('patch', identifier) - } - this.inc('pre', identifier) - break - - case 'major': - // If this is a pre-major version, bump up to the same major version. - // Otherwise increment major. - // 1.0.0-5 bumps to 1.0.0 - // 1.1.0 bumps to 2.0.0 - if ( - this.minor !== 0 || - this.patch !== 0 || - this.prerelease.length === 0 - ) { - this.major++ - } - this.minor = 0 - this.patch = 0 - this.prerelease = [] - break - case 'minor': - // If this is a pre-minor version, bump up to the same minor version. - // Otherwise increment minor. - // 1.2.0-5 bumps to 1.2.0 - // 1.2.1 bumps to 1.3.0 - if (this.patch !== 0 || this.prerelease.length === 0) { - this.minor++ - } - this.patch = 0 - this.prerelease = [] - break - case 'patch': - // If this is not a pre-release version, it will increment the patch. - // If it is a pre-release it will bump up to the same patch version. - // 1.2.0-5 patches to 1.2.0 - // 1.2.0 patches to 1.2.1 - if (this.prerelease.length === 0) { - this.patch++ - } - this.prerelease = [] - break - // This probably shouldn't be used publicly. - // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction. - case 'pre': - if (this.prerelease.length === 0) { - this.prerelease = [0] - } else { - let i = this.prerelease.length - while (--i >= 0) { - if (typeof this.prerelease[i] === 'number') { - this.prerelease[i]++ - i = -2 - } - } - if (i === -1) { - // didn't increment anything - this.prerelease.push(0) - } - } - if (identifier) { - // 1.2.0-beta.1 bumps to 1.2.0-beta.2, - // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 - if (this.prerelease[0] === identifier) { - if (isNaN(this.prerelease[1])) { - this.prerelease = [identifier, 0] - } - } else { - this.prerelease = [identifier, 0] - } - } - break - - default: - throw new Error(`invalid increment argument: ${release}`) - } - this.format() - this.raw = this.version - return this - } -} - -module.exports = SemVer - - -/***/ }), - -/***/ 5098: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const eq = __nccwpck_require__(1898) -const neq = __nccwpck_require__(6017) -const gt = __nccwpck_require__(4123) -const gte = __nccwpck_require__(5522) -const lt = __nccwpck_require__(194) -const lte = __nccwpck_require__(7520) - -const cmp = (a, op, b, loose) => { - switch (op) { - case '===': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a === b - - case '!==': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a !== b - - case '': - case '=': - case '==': - return eq(a, b, loose) - - case '!=': - return neq(a, b, loose) - - case '>': - return gt(a, b, loose) - - case '>=': - return gte(a, b, loose) - - case '<': - return lt(a, b, loose) - - case '<=': - return lte(a, b, loose) - - default: - throw new TypeError(`Invalid operator: ${op}`) - } -} -module.exports = cmp - - -/***/ }), - -/***/ 4309: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const SemVer = __nccwpck_require__(8088) -const compare = (a, b, loose) => - new SemVer(a, loose).compare(new SemVer(b, loose)) - -module.exports = compare - - -/***/ }), - -/***/ 1898: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const eq = (a, b, loose) => compare(a, b, loose) === 0 -module.exports = eq - - -/***/ }), - -/***/ 4123: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const gt = (a, b, loose) => compare(a, b, loose) > 0 -module.exports = gt - - -/***/ }), - -/***/ 5522: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const gte = (a, b, loose) => compare(a, b, loose) >= 0 -module.exports = gte - - -/***/ }), - -/***/ 194: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const lt = (a, b, loose) => compare(a, b, loose) < 0 -module.exports = lt - - -/***/ }), - -/***/ 7520: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const lte = (a, b, loose) => compare(a, b, loose) <= 0 -module.exports = lte - - -/***/ }), - -/***/ 6017: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const neq = (a, b, loose) => compare(a, b, loose) !== 0 -module.exports = neq - - -/***/ }), - -/***/ 5925: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const {MAX_LENGTH} = __nccwpck_require__(2293) -const { re, t } = __nccwpck_require__(9523) -const SemVer = __nccwpck_require__(8088) - -const parseOptions = __nccwpck_require__(785) -const parse = (version, options) => { - options = parseOptions(options) - - if (version instanceof SemVer) { - return version - } - - if (typeof version !== 'string') { - return null - } - - if (version.length > MAX_LENGTH) { - return null - } - - const r = options.loose ? re[t.LOOSE] : re[t.FULL] - if (!r.test(version)) { - return null - } - - try { - return new SemVer(version, options) - } catch (er) { - return null - } -} - -module.exports = parse - - -/***/ }), - -/***/ 6055: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const Range = __nccwpck_require__(9828) -const satisfies = (version, range, options) => { - try { - range = new Range(range, options) - } catch (er) { - return false - } - return range.test(version) -} -module.exports = satisfies - - -/***/ }), - -/***/ 2293: -/***/ ((module) => { - -// Note: this is the semver.org version of the spec that it implements -// Not necessarily the package version of this code. -const SEMVER_SPEC_VERSION = '2.0.0' - -const MAX_LENGTH = 256 -const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || - /* istanbul ignore next */ 9007199254740991 - -// Max safe segment length for coercion. -const MAX_SAFE_COMPONENT_LENGTH = 16 - -module.exports = { - SEMVER_SPEC_VERSION, - MAX_LENGTH, - MAX_SAFE_INTEGER, - MAX_SAFE_COMPONENT_LENGTH -} - - -/***/ }), - -/***/ 427: -/***/ ((module) => { - -const debug = ( - typeof process === 'object' && - process.env && - process.env.NODE_DEBUG && - /\bsemver\b/i.test(process.env.NODE_DEBUG) -) ? (...args) => console.error('SEMVER', ...args) - : () => {} - -module.exports = debug - - -/***/ }), - -/***/ 2463: -/***/ ((module) => { - -const numeric = /^[0-9]+$/ -const compareIdentifiers = (a, b) => { - const anum = numeric.test(a) - const bnum = numeric.test(b) - - if (anum && bnum) { - a = +a - b = +b - } - - return a === b ? 0 - : (anum && !bnum) ? -1 - : (bnum && !anum) ? 1 - : a < b ? -1 - : 1 -} - -const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a) - -module.exports = { - compareIdentifiers, - rcompareIdentifiers -} - - -/***/ }), - -/***/ 785: -/***/ ((module) => { - -// parse out just the options we care about so we always get a consistent -// obj with keys in a consistent order. -const opts = ['includePrerelease', 'loose', 'rtl'] -const parseOptions = options => - !options ? {} - : typeof options !== 'object' ? { loose: true } - : opts.filter(k => options[k]).reduce((options, k) => { - options[k] = true - return options - }, {}) -module.exports = parseOptions - - -/***/ }), - -/***/ 9523: -/***/ ((module, exports, __nccwpck_require__) => { - -const { MAX_SAFE_COMPONENT_LENGTH } = __nccwpck_require__(2293) -const debug = __nccwpck_require__(427) -exports = module.exports = {} - -// The actual regexps go on exports.re -const re = exports.re = [] -const src = exports.src = [] -const t = exports.t = {} -let R = 0 - -const createToken = (name, value, isGlobal) => { - const index = R++ - debug(index, value) - t[name] = index - src[index] = value - re[index] = new RegExp(value, isGlobal ? 'g' : undefined) -} - -// The following Regular Expressions can be used for tokenizing, -// validating, and parsing SemVer version strings. - -// ## Numeric Identifier -// A single `0`, or a non-zero digit followed by zero or more digits. - -createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*') -createToken('NUMERICIDENTIFIERLOOSE', '[0-9]+') - -// ## Non-numeric Identifier -// Zero or more digits, followed by a letter or hyphen, and then zero or -// more letters, digits, or hyphens. - -createToken('NONNUMERICIDENTIFIER', '\\d*[a-zA-Z-][a-zA-Z0-9-]*') - -// ## Main Version -// Three dot-separated numeric identifiers. - -createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})`) - -createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})`) - -// ## Pre-release Version Identifier -// A numeric identifier, or a non-numeric identifier. - -createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER] -}|${src[t.NONNUMERICIDENTIFIER]})`) - -createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE] -}|${src[t.NONNUMERICIDENTIFIER]})`) - -// ## Pre-release Version -// Hyphen, followed by one or more dot-separated pre-release version -// identifiers. - -createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER] -}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`) - -createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE] -}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`) - -// ## Build Metadata Identifier -// Any combination of digits, letters, or hyphens. - -createToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+') - -// ## Build Metadata -// Plus sign, followed by one or more period-separated build metadata -// identifiers. - -createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER] -}(?:\\.${src[t.BUILDIDENTIFIER]})*))`) - -// ## Full Version String -// A main version, followed optionally by a pre-release version and -// build metadata. - -// Note that the only major, minor, patch, and pre-release sections of -// the version string are capturing groups. The build metadata is not a -// capturing group, because it should not ever be used in version -// comparison. - -createToken('FULLPLAIN', `v?${src[t.MAINVERSION] -}${src[t.PRERELEASE]}?${ - src[t.BUILD]}?`) - -createToken('FULL', `^${src[t.FULLPLAIN]}$`) - -// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. -// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty -// common in the npm registry. -createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE] -}${src[t.PRERELEASELOOSE]}?${ - src[t.BUILD]}?`) - -createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`) - -createToken('GTLT', '((?:<|>)?=?)') - -// Something like "2.*" or "1.2.x". -// Note that "x.x" is a valid xRange identifer, meaning "any version" -// Only the first item is strictly required. -createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`) -createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`) - -createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:${src[t.PRERELEASE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:${src[t.PRERELEASELOOSE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`) -createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`) - -// Coercion. -// Extract anything that could conceivably be a part of a valid semver -createToken('COERCE', `${'(^|[^\\d])' + - '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + - `(?:$|[^\\d])`) -createToken('COERCERTL', src[t.COERCE], true) - -// Tilde ranges. -// Meaning is "reasonably at or greater than" -createToken('LONETILDE', '(?:~>?)') - -createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true) -exports.tildeTrimReplace = '$1~' - -createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`) -createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`) - -// Caret ranges. -// Meaning is "at least and backwards compatible with" -createToken('LONECARET', '(?:\\^)') - -createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true) -exports.caretTrimReplace = '$1^' - -createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`) -createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`) - -// A simple gt/lt/eq thing, or just "" to indicate "any version" -createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`) -createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`) - -// An expression to strip any whitespace between the gtlt and the thing -// it modifies, so that `> 1.2.3` ==> `>1.2.3` -createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT] -}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true) -exports.comparatorTrimReplace = '$1$2$3' - -// Something like `1.2.3 - 1.2.4` -// Note that these all use the loose form, because they'll be -// checked against either the strict or loose comparator form -// later. -createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAIN]})` + - `\\s*$`) - -createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAINLOOSE]})` + - `\\s*$`) - -// Star ranges basically just allow anything at all. -createToken('STAR', '(<|>)?=?\\s*\\*') -// >=0.0.0 is like a star -createToken('GTE0', '^\\s*>=\\s*0\.0\.0\\s*$') -createToken('GTE0PRE', '^\\s*>=\\s*0\.0\.0-0\\s*$') - - -/***/ }), - -/***/ 1196: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - - -// A linked list to keep track of recently-used-ness -const Yallist = __nccwpck_require__(220) - -const MAX = Symbol('max') -const LENGTH = Symbol('length') -const LENGTH_CALCULATOR = Symbol('lengthCalculator') -const ALLOW_STALE = Symbol('allowStale') -const MAX_AGE = Symbol('maxAge') -const DISPOSE = Symbol('dispose') -const NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet') -const LRU_LIST = Symbol('lruList') -const CACHE = Symbol('cache') -const UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet') - -const naiveLength = () => 1 - -// lruList is a yallist where the head is the youngest -// item, and the tail is the oldest. the list contains the Hit -// objects as the entries. -// Each Hit object has a reference to its Yallist.Node. This -// never changes. -// -// cache is a Map (or PseudoMap) that matches the keys to -// the Yallist.Node object. -class LRUCache { - constructor (options) { - if (typeof options === 'number') - options = { max: options } - - if (!options) - options = {} - - if (options.max && (typeof options.max !== 'number' || options.max < 0)) - throw new TypeError('max must be a non-negative number') - // Kind of weird to have a default max of Infinity, but oh well. - const max = this[MAX] = options.max || Infinity - - const lc = options.length || naiveLength - this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc - this[ALLOW_STALE] = options.stale || false - if (options.maxAge && typeof options.maxAge !== 'number') - throw new TypeError('maxAge must be a number') - this[MAX_AGE] = options.maxAge || 0 - this[DISPOSE] = options.dispose - this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false - this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false - this.reset() - } - - // resize the cache when the max changes. - set max (mL) { - if (typeof mL !== 'number' || mL < 0) - throw new TypeError('max must be a non-negative number') - - this[MAX] = mL || Infinity - trim(this) - } - get max () { - return this[MAX] - } - - set allowStale (allowStale) { - this[ALLOW_STALE] = !!allowStale - } - get allowStale () { - return this[ALLOW_STALE] - } - - set maxAge (mA) { - if (typeof mA !== 'number') - throw new TypeError('maxAge must be a non-negative number') - - this[MAX_AGE] = mA - trim(this) - } - get maxAge () { - return this[MAX_AGE] - } - - // resize the cache when the lengthCalculator changes. - set lengthCalculator (lC) { - if (typeof lC !== 'function') - lC = naiveLength - - if (lC !== this[LENGTH_CALCULATOR]) { - this[LENGTH_CALCULATOR] = lC - this[LENGTH] = 0 - this[LRU_LIST].forEach(hit => { - hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key) - this[LENGTH] += hit.length - }) - } - trim(this) - } - get lengthCalculator () { return this[LENGTH_CALCULATOR] } - - get length () { return this[LENGTH] } - get itemCount () { return this[LRU_LIST].length } - - rforEach (fn, thisp) { - thisp = thisp || this - for (let walker = this[LRU_LIST].tail; walker !== null;) { - const prev = walker.prev - forEachStep(this, fn, walker, thisp) - walker = prev - } - } - - forEach (fn, thisp) { - thisp = thisp || this - for (let walker = this[LRU_LIST].head; walker !== null;) { - const next = walker.next - forEachStep(this, fn, walker, thisp) - walker = next - } - } - - keys () { - return this[LRU_LIST].toArray().map(k => k.key) - } - - values () { - return this[LRU_LIST].toArray().map(k => k.value) - } - - reset () { - if (this[DISPOSE] && - this[LRU_LIST] && - this[LRU_LIST].length) { - this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value)) - } - - this[CACHE] = new Map() // hash of items by key - this[LRU_LIST] = new Yallist() // list of items in order of use recency - this[LENGTH] = 0 // length of items in the list - } - - dump () { - return this[LRU_LIST].map(hit => - isStale(this, hit) ? false : { - k: hit.key, - v: hit.value, - e: hit.now + (hit.maxAge || 0) - }).toArray().filter(h => h) - } - - dumpLru () { - return this[LRU_LIST] - } - - set (key, value, maxAge) { - maxAge = maxAge || this[MAX_AGE] - - if (maxAge && typeof maxAge !== 'number') - throw new TypeError('maxAge must be a number') - - const now = maxAge ? Date.now() : 0 - const len = this[LENGTH_CALCULATOR](value, key) - - if (this[CACHE].has(key)) { - if (len > this[MAX]) { - del(this, this[CACHE].get(key)) - return false - } - - const node = this[CACHE].get(key) - const item = node.value - - // dispose of the old one before overwriting - // split out into 2 ifs for better coverage tracking - if (this[DISPOSE]) { - if (!this[NO_DISPOSE_ON_SET]) - this[DISPOSE](key, item.value) - } - - item.now = now - item.maxAge = maxAge - item.value = value - this[LENGTH] += len - item.length - item.length = len - this.get(key) - trim(this) - return true - } - - const hit = new Entry(key, value, len, now, maxAge) - - // oversized objects fall out of cache automatically. - if (hit.length > this[MAX]) { - if (this[DISPOSE]) - this[DISPOSE](key, value) - - return false - } - - this[LENGTH] += hit.length - this[LRU_LIST].unshift(hit) - this[CACHE].set(key, this[LRU_LIST].head) - trim(this) - return true - } - - has (key) { - if (!this[CACHE].has(key)) return false - const hit = this[CACHE].get(key).value - return !isStale(this, hit) - } - - get (key) { - return get(this, key, true) - } - - peek (key) { - return get(this, key, false) - } - - pop () { - const node = this[LRU_LIST].tail - if (!node) - return null - - del(this, node) - return node.value - } - - del (key) { - del(this, this[CACHE].get(key)) - } - - load (arr) { - // reset the cache - this.reset() - - const now = Date.now() - // A previous serialized cache has the most recent items first - for (let l = arr.length - 1; l >= 0; l--) { - const hit = arr[l] - const expiresAt = hit.e || 0 - if (expiresAt === 0) - // the item was created without expiration in a non aged cache - this.set(hit.k, hit.v) - else { - const maxAge = expiresAt - now - // dont add already expired items - if (maxAge > 0) { - this.set(hit.k, hit.v, maxAge) - } - } - } - } - - prune () { - this[CACHE].forEach((value, key) => get(this, key, false)) - } -} - -const get = (self, key, doUse) => { - const node = self[CACHE].get(key) - if (node) { - const hit = node.value - if (isStale(self, hit)) { - del(self, node) - if (!self[ALLOW_STALE]) - return undefined - } else { - if (doUse) { - if (self[UPDATE_AGE_ON_GET]) - node.value.now = Date.now() - self[LRU_LIST].unshiftNode(node) - } - } - return hit.value - } -} - -const isStale = (self, hit) => { - if (!hit || (!hit.maxAge && !self[MAX_AGE])) - return false - - const diff = Date.now() - hit.now - return hit.maxAge ? diff > hit.maxAge - : self[MAX_AGE] && (diff > self[MAX_AGE]) -} - -const trim = self => { - if (self[LENGTH] > self[MAX]) { - for (let walker = self[LRU_LIST].tail; - self[LENGTH] > self[MAX] && walker !== null;) { - // We know that we're about to delete this one, and also - // what the next least recently used key will be, so just - // go ahead and set it now. - const prev = walker.prev - del(self, walker) - walker = prev - } - } -} - -const del = (self, node) => { - if (node) { - const hit = node.value - if (self[DISPOSE]) - self[DISPOSE](hit.key, hit.value) - - self[LENGTH] -= hit.length - self[CACHE].delete(hit.key) - self[LRU_LIST].removeNode(node) - } -} - -class Entry { - constructor (key, value, length, now, maxAge) { - this.key = key - this.value = value - this.length = length - this.now = now - this.maxAge = maxAge || 0 - } -} - -const forEachStep = (self, fn, node, thisp) => { - let hit = node.value - if (isStale(self, hit)) { - del(self, node) - if (!self[ALLOW_STALE]) - hit = undefined - } - if (hit) - fn.call(thisp, hit.value, hit.key, self) -} - -module.exports = LRUCache - - -/***/ }), - -/***/ 5327: -/***/ ((module) => { - -"use strict"; - -module.exports = function (Yallist) { - Yallist.prototype[Symbol.iterator] = function* () { - for (let walker = this.head; walker; walker = walker.next) { - yield walker.value - } - } -} - - -/***/ }), - -/***/ 220: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - -module.exports = Yallist - -Yallist.Node = Node -Yallist.create = Yallist - -function Yallist (list) { - var self = this - if (!(self instanceof Yallist)) { - self = new Yallist() - } - - self.tail = null - self.head = null - self.length = 0 - - if (list && typeof list.forEach === 'function') { - list.forEach(function (item) { - self.push(item) - }) - } else if (arguments.length > 0) { - for (var i = 0, l = arguments.length; i < l; i++) { - self.push(arguments[i]) - } - } - - return self -} - -Yallist.prototype.removeNode = function (node) { - if (node.list !== this) { - throw new Error('removing node which does not belong to this list') - } - - var next = node.next - var prev = node.prev - - if (next) { - next.prev = prev - } - - if (prev) { - prev.next = next - } - - if (node === this.head) { - this.head = next - } - if (node === this.tail) { - this.tail = prev - } - - node.list.length-- - node.next = null - node.prev = null - node.list = null - - return next -} - -Yallist.prototype.unshiftNode = function (node) { - if (node === this.head) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var head = this.head - node.list = this - node.next = head - if (head) { - head.prev = node - } - - this.head = node - if (!this.tail) { - this.tail = node - } - this.length++ -} - -Yallist.prototype.pushNode = function (node) { - if (node === this.tail) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var tail = this.tail - node.list = this - node.prev = tail - if (tail) { - tail.next = node - } - - this.tail = node - if (!this.head) { - this.head = node - } - this.length++ -} - -Yallist.prototype.push = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - push(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.unshift = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - unshift(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.pop = function () { - if (!this.tail) { - return undefined - } - - var res = this.tail.value - this.tail = this.tail.prev - if (this.tail) { - this.tail.next = null - } else { - this.head = null - } - this.length-- - return res -} - -Yallist.prototype.shift = function () { - if (!this.head) { - return undefined - } - - var res = this.head.value - this.head = this.head.next - if (this.head) { - this.head.prev = null - } else { - this.tail = null - } - this.length-- - return res -} - -Yallist.prototype.forEach = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.head, i = 0; walker !== null; i++) { - fn.call(thisp, walker.value, i, this) - walker = walker.next - } -} - -Yallist.prototype.forEachReverse = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.tail, i = this.length - 1; walker !== null; i--) { - fn.call(thisp, walker.value, i, this) - walker = walker.prev - } -} - -Yallist.prototype.get = function (n) { - for (var i = 0, walker = this.head; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.next - } - if (i === n && walker !== null) { - return walker.value - } -} - -Yallist.prototype.getReverse = function (n) { - for (var i = 0, walker = this.tail; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.prev - } - if (i === n && walker !== null) { - return walker.value - } -} - -Yallist.prototype.map = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.head; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.next - } - return res -} - -Yallist.prototype.mapReverse = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.tail; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.prev - } - return res -} - -Yallist.prototype.reduce = function (fn, initial) { - var acc - var walker = this.head - if (arguments.length > 1) { - acc = initial - } else if (this.head) { - walker = this.head.next - acc = this.head.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } - - for (var i = 0; walker !== null; i++) { - acc = fn(acc, walker.value, i) - walker = walker.next - } - - return acc -} - -Yallist.prototype.reduceReverse = function (fn, initial) { - var acc - var walker = this.tail - if (arguments.length > 1) { - acc = initial - } else if (this.tail) { - walker = this.tail.prev - acc = this.tail.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } - - for (var i = this.length - 1; walker !== null; i--) { - acc = fn(acc, walker.value, i) - walker = walker.prev - } - - return acc -} - -Yallist.prototype.toArray = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.head; walker !== null; i++) { - arr[i] = walker.value - walker = walker.next - } - return arr -} - -Yallist.prototype.toArrayReverse = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.tail; walker !== null; i++) { - arr[i] = walker.value - walker = walker.prev - } - return arr -} - -Yallist.prototype.slice = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = 0, walker = this.head; walker !== null && i < from; i++) { - walker = walker.next - } - for (; walker !== null && i < to; i++, walker = walker.next) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.sliceReverse = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) { - walker = walker.prev - } - for (; walker !== null && i > from; i--, walker = walker.prev) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.splice = function (start, deleteCount, ...nodes) { - if (start > this.length) { - start = this.length - 1 - } - if (start < 0) { - start = this.length + start; - } - - for (var i = 0, walker = this.head; walker !== null && i < start; i++) { - walker = walker.next - } - - var ret = [] - for (var i = 0; walker && i < deleteCount; i++) { - ret.push(walker.value) - walker = this.removeNode(walker) - } - if (walker === null) { - walker = this.tail - } - - if (walker !== this.head && walker !== this.tail) { - walker = walker.prev - } - - for (var i = 0; i < nodes.length; i++) { - walker = insert(this, walker, nodes[i]) - } - return ret; -} - -Yallist.prototype.reverse = function () { - var head = this.head - var tail = this.tail - for (var walker = head; walker !== null; walker = walker.prev) { - var p = walker.prev - walker.prev = walker.next - walker.next = p - } - this.head = tail - this.tail = head - return this -} - -function insert (self, node, value) { - var inserted = node === self.head ? - new Node(value, null, node, self) : - new Node(value, node, node.next, self) - - if (inserted.next === null) { - self.tail = inserted - } - if (inserted.prev === null) { - self.head = inserted - } - - self.length++ - - return inserted -} - -function push (self, item) { - self.tail = new Node(item, self.tail, null, self) - if (!self.head) { - self.head = self.tail - } - self.length++ -} - -function unshift (self, item) { - self.head = new Node(item, null, self.head, self) - if (!self.tail) { - self.tail = self.head - } - self.length++ -} - -function Node (value, prev, next, list) { - if (!(this instanceof Node)) { - return new Node(value, prev, next, list) - } - - this.list = list - this.value = value - - if (prev) { - prev.next = this - this.prev = prev - } else { - this.prev = null - } - - if (next) { - next.prev = this - this.next = next - } else { - this.next = null - } -} - -try { - // add if support for Symbol.iterator is present - __nccwpck_require__(5327)(Yallist) -} catch (er) {} - - /***/ }), /***/ 4294: diff --git a/.github/actions/getReleaseBody/index.js b/.github/actions/getReleaseBody/index.js index 092f40a9ef97..0a3cb15cd7e8 100644 --- a/.github/actions/getReleaseBody/index.js +++ b/.github/actions/getReleaseBody/index.js @@ -29,8 +29,6 @@ core.setOutput('RELEASE_BODY', releaseBody); const _ = __nccwpck_require__(4987); const lodashGet = __nccwpck_require__(6908); -const semverParse = __nccwpck_require__(5925); -const semverSatisfies = __nccwpck_require__(6055); const GITHUB_OWNER = 'Expensify'; const EXPENSIFY_CASH_REPO = 'Expensify.cash'; @@ -91,11 +89,6 @@ class GithubUtils { try { const versionRegex = new RegExp('([0-9]+)\\.([0-9]+)\\.([0-9]+)(?:-([0-9]+))?', 'g'); const tag = issue.body.match(versionRegex)[0].replace(/`/g, ''); - - // eslint-disable-next-line max-len - const compareURLRegex = new RegExp(`${EXPENSIFY_CASH_URL}/compare/${versionRegex.source}\\.\\.\\.${versionRegex.source}`, 'g'); - const comparisonURL = issue.body.match(compareURLRegex)[0]; - return { title: issue.title, url: issue.url, @@ -103,7 +96,6 @@ class GithubUtils { PRList: this.getStagingDeployCashPRList(issue), deployBlockers: this.getStagingDeployCashDeployBlockers(issue), tag, - comparisonURL, }; } catch (exception) { throw new Error(`Unable to find ${STAGING_DEPLOY_CASH_LABEL} issue with correct data.`); @@ -178,71 +170,6 @@ class GithubUtils { ); } - /** - * Generate a comparison URL between two versions following the semverLevel passed - * - * @param {String} repoSlug - The slug of the repository: / - * @param {String} tag - The tag to compare first the previous semverLevel - * @param {String} semverLevel - The semantic versioning MAJOR, MINOR, PATCH and BUILD - * @return {Promise} the url generated - * @throws {Error} If the request to the Github API fails. - */ - generateVersionComparisonURL(repoSlug, tag, semverLevel) { - return new Promise((resolve, reject) => { - const getComparisonURL = (previousTag, currentTag) => ( - `${EXPENSIFY_CASH_URL}/compare/${previousTag}...${currentTag}` - ); - - const [repoOwner, repoName] = repoSlug.split('/'); - const tagSemver = semverParse(tag); - - return this.octokit.repos.listTags({ - owner: repoOwner, - repo: repoName, - }) - .then(githubResponse => githubResponse.data.some(({name: repoTag}) => { - if (semverLevel === 'MAJOR' - && semverSatisfies(repoTag, `<${tagSemver.major}.x.x`, {includePrerelease: true}) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'MINOR' - && semverSatisfies( - repoTag, - `<${tagSemver.major}.${tagSemver.minor}.x`, - {includePrerelease: true}, - ) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'PATCH' - && semverSatisfies(repoTag, `<${tagSemver}`, {includePrerelease: true}) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'BUILD' - && repoTag !== tagSemver.version - && semverSatisfies( - repoTag, - `<=${tagSemver.major}.${tagSemver.minor}.${tagSemver.patch}`, - {includePrerelease: true}, - ) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - return false; - })) - .catch(githubError => reject(githubError)); - }); - } - /** * Creates a new StagingDeployCash issue. * @@ -338,22 +265,16 @@ class GithubUtils { deployBlockers = [], resolvedDeployBlockers = [], ) { - return Promise.all([ - this.generateVersionComparisonURL(`${GITHUB_OWNER}/${EXPENSIFY_CASH_REPO}`, tag, 'PATCH'), - this.octokit.pulls.list({ - owner: GITHUB_OWNER, - repo: EXPENSIFY_CASH_REPO, - per_page: 100, - }), - ]) - .then(results => ({ - comparisonURL: results[0], - automergePRs: _.map( - _.filter(results[1].data, GithubUtils.isAutomergePullRequest), + return this.octokit.pulls.list({ + owner: GITHUB_OWNER, + repo: EXPENSIFY_CASH_REPO, + per_page: 100, + }) + .then(({data}) => { + const automergePRs = _.pluck( + _.filter(data, GithubUtils.isAutomergePullRequest), 'html_url', - ), - })) - .then(({comparisonURL, automergePRs}) => { + ); const sortedPRList = _.chain(PRList) .difference(automergePRs) .unique() @@ -365,8 +286,8 @@ class GithubUtils { ); // Tag version and comparison URL - let issueBody = `**Release Version:** \`${tag}\`\r\n`; - issueBody += `**Compare Changes:** ${comparisonURL}\r\n`; + // eslint-disable-next-line max-len + let issueBody = `**Release Version:** \`${tag}\`\r\n**Compare Changes:** https://github.com/Expensify/Expensify.cash/compare/production...staging\r\n`; // PR list if (!_.isEmpty(PRList)) { @@ -387,11 +308,13 @@ class GithubUtils { } issueBody += '\r\ncc @Expensify/applauseleads\r\n'; - return issueBody; }) - // eslint-disable-next-line no-console - .catch(err => console.warn('Error generating comparison URL, continuing...', err)); + .catch(err => console.warn( + 'Error generating StagingDeployCash issue body!', + 'Automerge PRs may not be properly filtered out. Continuing...', + err, + )); } /** @@ -2501,2212 +2424,6 @@ function toString(value) { module.exports = toString; -/***/ }), - -/***/ 1532: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const ANY = Symbol('SemVer ANY') -// hoisted class for cyclic dependency -class Comparator { - static get ANY () { - return ANY - } - constructor (comp, options) { - options = parseOptions(options) - - if (comp instanceof Comparator) { - if (comp.loose === !!options.loose) { - return comp - } else { - comp = comp.value - } - } - - debug('comparator', comp, options) - this.options = options - this.loose = !!options.loose - this.parse(comp) - - if (this.semver === ANY) { - this.value = '' - } else { - this.value = this.operator + this.semver.version - } - - debug('comp', this) - } - - parse (comp) { - const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] - const m = comp.match(r) - - if (!m) { - throw new TypeError(`Invalid comparator: ${comp}`) - } - - this.operator = m[1] !== undefined ? m[1] : '' - if (this.operator === '=') { - this.operator = '' - } - - // if it literally is just '>' or '' then allow anything. - if (!m[2]) { - this.semver = ANY - } else { - this.semver = new SemVer(m[2], this.options.loose) - } - } - - toString () { - return this.value - } - - test (version) { - debug('Comparator.test', version, this.options.loose) - - if (this.semver === ANY || version === ANY) { - return true - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - return cmp(version, this.operator, this.semver, this.options) - } - - intersects (comp, options) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required') - } - - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - if (this.operator === '') { - if (this.value === '') { - return true - } - return new Range(comp.value, options).test(this.value) - } else if (comp.operator === '') { - if (comp.value === '') { - return true - } - return new Range(this.value, options).test(comp.semver) - } - - const sameDirectionIncreasing = - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '>=' || comp.operator === '>') - const sameDirectionDecreasing = - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '<=' || comp.operator === '<') - const sameSemVer = this.semver.version === comp.semver.version - const differentDirectionsInclusive = - (this.operator === '>=' || this.operator === '<=') && - (comp.operator === '>=' || comp.operator === '<=') - const oppositeDirectionsLessThan = - cmp(this.semver, '<', comp.semver, options) && - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '<=' || comp.operator === '<') - const oppositeDirectionsGreaterThan = - cmp(this.semver, '>', comp.semver, options) && - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '>=' || comp.operator === '>') - - return ( - sameDirectionIncreasing || - sameDirectionDecreasing || - (sameSemVer && differentDirectionsInclusive) || - oppositeDirectionsLessThan || - oppositeDirectionsGreaterThan - ) - } -} - -module.exports = Comparator - -const parseOptions = __nccwpck_require__(785) -const {re, t} = __nccwpck_require__(9523) -const cmp = __nccwpck_require__(5098) -const debug = __nccwpck_require__(427) -const SemVer = __nccwpck_require__(8088) -const Range = __nccwpck_require__(9828) - - -/***/ }), - -/***/ 9828: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -// hoisted class for cyclic dependency -class Range { - constructor (range, options) { - options = parseOptions(options) - - if (range instanceof Range) { - if ( - range.loose === !!options.loose && - range.includePrerelease === !!options.includePrerelease - ) { - return range - } else { - return new Range(range.raw, options) - } - } - - if (range instanceof Comparator) { - // just put it in the set and return - this.raw = range.value - this.set = [[range]] - this.format() - return this - } - - this.options = options - this.loose = !!options.loose - this.includePrerelease = !!options.includePrerelease - - // First, split based on boolean or || - this.raw = range - this.set = range - .split(/\s*\|\|\s*/) - // map the range to a 2d array of comparators - .map(range => this.parseRange(range.trim())) - // throw out any comparator lists that are empty - // this generally means that it was not a valid range, which is allowed - // in loose mode, but will still throw if the WHOLE range is invalid. - .filter(c => c.length) - - if (!this.set.length) { - throw new TypeError(`Invalid SemVer Range: ${range}`) - } - - // if we have any that are not the null set, throw out null sets. - if (this.set.length > 1) { - // keep the first one, in case they're all null sets - const first = this.set[0] - this.set = this.set.filter(c => !isNullSet(c[0])) - if (this.set.length === 0) - this.set = [first] - else if (this.set.length > 1) { - // if we have any that are *, then the range is just * - for (const c of this.set) { - if (c.length === 1 && isAny(c[0])) { - this.set = [c] - break - } - } - } - } - - this.format() - } - - format () { - this.range = this.set - .map((comps) => { - return comps.join(' ').trim() - }) - .join('||') - .trim() - return this.range - } - - toString () { - return this.range - } - - parseRange (range) { - range = range.trim() - - // memoize range parsing for performance. - // this is a very hot path, and fully deterministic. - const memoOpts = Object.keys(this.options).join(',') - const memoKey = `parseRange:${memoOpts}:${range}` - const cached = cache.get(memoKey) - if (cached) - return cached - - const loose = this.options.loose - // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` - const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE] - range = range.replace(hr, hyphenReplace(this.options.includePrerelease)) - debug('hyphen replace', range) - // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` - range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace) - debug('comparator trim', range, re[t.COMPARATORTRIM]) - - // `~ 1.2.3` => `~1.2.3` - range = range.replace(re[t.TILDETRIM], tildeTrimReplace) - - // `^ 1.2.3` => `^1.2.3` - range = range.replace(re[t.CARETTRIM], caretTrimReplace) - - // normalize spaces - range = range.split(/\s+/).join(' ') - - // At this point, the range is completely trimmed and - // ready to be split into comparators. - - const compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] - const rangeList = range - .split(' ') - .map(comp => parseComparator(comp, this.options)) - .join(' ') - .split(/\s+/) - // >=0.0.0 is equivalent to * - .map(comp => replaceGTE0(comp, this.options)) - // in loose mode, throw out any that are not valid comparators - .filter(this.options.loose ? comp => !!comp.match(compRe) : () => true) - .map(comp => new Comparator(comp, this.options)) - - // if any comparators are the null set, then replace with JUST null set - // if more than one comparator, remove any * comparators - // also, don't include the same comparator more than once - const l = rangeList.length - const rangeMap = new Map() - for (const comp of rangeList) { - if (isNullSet(comp)) - return [comp] - rangeMap.set(comp.value, comp) - } - if (rangeMap.size > 1 && rangeMap.has('')) - rangeMap.delete('') - - const result = [...rangeMap.values()] - cache.set(memoKey, result) - return result - } - - intersects (range, options) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required') - } - - return this.set.some((thisComparators) => { - return ( - isSatisfiable(thisComparators, options) && - range.set.some((rangeComparators) => { - return ( - isSatisfiable(rangeComparators, options) && - thisComparators.every((thisComparator) => { - return rangeComparators.every((rangeComparator) => { - return thisComparator.intersects(rangeComparator, options) - }) - }) - ) - }) - ) - }) - } - - // if ANY of the sets match ALL of its comparators, then pass - test (version) { - if (!version) { - return false - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - for (let i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version, this.options)) { - return true - } - } - return false - } -} -module.exports = Range - -const LRU = __nccwpck_require__(1196) -const cache = new LRU({ max: 1000 }) - -const parseOptions = __nccwpck_require__(785) -const Comparator = __nccwpck_require__(1532) -const debug = __nccwpck_require__(427) -const SemVer = __nccwpck_require__(8088) -const { - re, - t, - comparatorTrimReplace, - tildeTrimReplace, - caretTrimReplace -} = __nccwpck_require__(9523) - -const isNullSet = c => c.value === '<0.0.0-0' -const isAny = c => c.value === '' - -// take a set of comparators and determine whether there -// exists a version which can satisfy it -const isSatisfiable = (comparators, options) => { - let result = true - const remainingComparators = comparators.slice() - let testComparator = remainingComparators.pop() - - while (result && remainingComparators.length) { - result = remainingComparators.every((otherComparator) => { - return testComparator.intersects(otherComparator, options) - }) - - testComparator = remainingComparators.pop() - } - - return result -} - -// comprised of xranges, tildes, stars, and gtlt's at this point. -// already replaced the hyphen ranges -// turn into a set of JUST comparators. -const parseComparator = (comp, options) => { - debug('comp', comp, options) - comp = replaceCarets(comp, options) - debug('caret', comp) - comp = replaceTildes(comp, options) - debug('tildes', comp) - comp = replaceXRanges(comp, options) - debug('xrange', comp) - comp = replaceStars(comp, options) - debug('stars', comp) - return comp -} - -const isX = id => !id || id.toLowerCase() === 'x' || id === '*' - -// ~, ~> --> * (any, kinda silly) -// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0 -// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0 -// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0 -// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0 -// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0 -const replaceTildes = (comp, options) => - comp.trim().split(/\s+/).map((comp) => { - return replaceTilde(comp, options) - }).join(' ') - -const replaceTilde = (comp, options) => { - const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] - return comp.replace(r, (_, M, m, p, pr) => { - debug('tilde', comp, _, M, m, p, pr) - let ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = `>=${M}.0.0 <${+M + 1}.0.0-0` - } else if (isX(p)) { - // ~1.2 == >=1.2.0 <1.3.0-0 - ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0` - } else if (pr) { - debug('replaceTilde pr', pr) - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${+m + 1}.0-0` - } else { - // ~1.2.3 == >=1.2.3 <1.3.0-0 - ret = `>=${M}.${m}.${p - } <${M}.${+m + 1}.0-0` - } - - debug('tilde return', ret) - return ret - }) -} - -// ^ --> * (any, kinda silly) -// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0 -// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0 -// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0 -// ^1.2.3 --> >=1.2.3 <2.0.0-0 -// ^1.2.0 --> >=1.2.0 <2.0.0-0 -const replaceCarets = (comp, options) => - comp.trim().split(/\s+/).map((comp) => { - return replaceCaret(comp, options) - }).join(' ') - -const replaceCaret = (comp, options) => { - debug('caret', comp, options) - const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET] - const z = options.includePrerelease ? '-0' : '' - return comp.replace(r, (_, M, m, p, pr) => { - debug('caret', comp, _, M, m, p, pr) - let ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0` - } else if (isX(p)) { - if (M === '0') { - ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0` - } else { - ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0` - } - } else if (pr) { - debug('replaceCaret pr', pr) - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${m}.${+p + 1}-0` - } else { - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${+m + 1}.0-0` - } - } else { - ret = `>=${M}.${m}.${p}-${pr - } <${+M + 1}.0.0-0` - } - } else { - debug('no pr') - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p - }${z} <${M}.${m}.${+p + 1}-0` - } else { - ret = `>=${M}.${m}.${p - }${z} <${M}.${+m + 1}.0-0` - } - } else { - ret = `>=${M}.${m}.${p - } <${+M + 1}.0.0-0` - } - } - - debug('caret return', ret) - return ret - }) -} - -const replaceXRanges = (comp, options) => { - debug('replaceXRanges', comp, options) - return comp.split(/\s+/).map((comp) => { - return replaceXRange(comp, options) - }).join(' ') -} - -const replaceXRange = (comp, options) => { - comp = comp.trim() - const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE] - return comp.replace(r, (ret, gtlt, M, m, p, pr) => { - debug('xRange', comp, ret, gtlt, M, m, p, pr) - const xM = isX(M) - const xm = xM || isX(m) - const xp = xm || isX(p) - const anyX = xp - - if (gtlt === '=' && anyX) { - gtlt = '' - } - - // if we're including prereleases in the match, then we need - // to fix this to -0, the lowest possible prerelease value - pr = options.includePrerelease ? '-0' : '' - - if (xM) { - if (gtlt === '>' || gtlt === '<') { - // nothing is allowed - ret = '<0.0.0-0' - } else { - // nothing is forbidden - ret = '*' - } - } else if (gtlt && anyX) { - // we know patch is an x, because we have any x at all. - // replace X with 0 - if (xm) { - m = 0 - } - p = 0 - - if (gtlt === '>') { - // >1 => >=2.0.0 - // >1.2 => >=1.3.0 - gtlt = '>=' - if (xm) { - M = +M + 1 - m = 0 - p = 0 - } else { - m = +m + 1 - p = 0 - } - } else if (gtlt === '<=') { - // <=0.7.x is actually <0.8.0, since any 0.7.x should - // pass. Similarly, <=7.x is actually <8.0.0, etc. - gtlt = '<' - if (xm) { - M = +M + 1 - } else { - m = +m + 1 - } - } - - if (gtlt === '<') - pr = '-0' - - ret = `${gtlt + M}.${m}.${p}${pr}` - } else if (xm) { - ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0` - } else if (xp) { - ret = `>=${M}.${m}.0${pr - } <${M}.${+m + 1}.0-0` - } - - debug('xRange return', ret) - - return ret - }) -} - -// Because * is AND-ed with everything else in the comparator, -// and '' means "any version", just remove the *s entirely. -const replaceStars = (comp, options) => { - debug('replaceStars', comp, options) - // Looseness is ignored here. star is always as loose as it gets! - return comp.trim().replace(re[t.STAR], '') -} - -const replaceGTE0 = (comp, options) => { - debug('replaceGTE0', comp, options) - return comp.trim() - .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '') -} - -// This function is passed to string.replace(re[t.HYPHENRANGE]) -// M, m, patch, prerelease, build -// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 -// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do -// 1.2 - 3.4 => >=1.2.0 <3.5.0-0 -const hyphenReplace = incPr => ($0, - from, fM, fm, fp, fpr, fb, - to, tM, tm, tp, tpr, tb) => { - if (isX(fM)) { - from = '' - } else if (isX(fm)) { - from = `>=${fM}.0.0${incPr ? '-0' : ''}` - } else if (isX(fp)) { - from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}` - } else if (fpr) { - from = `>=${from}` - } else { - from = `>=${from}${incPr ? '-0' : ''}` - } - - if (isX(tM)) { - to = '' - } else if (isX(tm)) { - to = `<${+tM + 1}.0.0-0` - } else if (isX(tp)) { - to = `<${tM}.${+tm + 1}.0-0` - } else if (tpr) { - to = `<=${tM}.${tm}.${tp}-${tpr}` - } else if (incPr) { - to = `<${tM}.${tm}.${+tp + 1}-0` - } else { - to = `<=${to}` - } - - return (`${from} ${to}`).trim() -} - -const testSet = (set, version, options) => { - for (let i = 0; i < set.length; i++) { - if (!set[i].test(version)) { - return false - } - } - - if (version.prerelease.length && !options.includePrerelease) { - // Find the set of versions that are allowed to have prereleases - // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 - // That should allow `1.2.3-pr.2` to pass. - // However, `1.2.4-alpha.notready` should NOT be allowed, - // even though it's within the range set by the comparators. - for (let i = 0; i < set.length; i++) { - debug(set[i].semver) - if (set[i].semver === Comparator.ANY) { - continue - } - - if (set[i].semver.prerelease.length > 0) { - const allowed = set[i].semver - if (allowed.major === version.major && - allowed.minor === version.minor && - allowed.patch === version.patch) { - return true - } - } - } - - // Version has a -pre, but it's not one of the ones we like. - return false - } - - return true -} - - -/***/ }), - -/***/ 8088: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const debug = __nccwpck_require__(427) -const { MAX_LENGTH, MAX_SAFE_INTEGER } = __nccwpck_require__(2293) -const { re, t } = __nccwpck_require__(9523) - -const parseOptions = __nccwpck_require__(785) -const { compareIdentifiers } = __nccwpck_require__(2463) -class SemVer { - constructor (version, options) { - options = parseOptions(options) - - if (version instanceof SemVer) { - if (version.loose === !!options.loose && - version.includePrerelease === !!options.includePrerelease) { - return version - } else { - version = version.version - } - } else if (typeof version !== 'string') { - throw new TypeError(`Invalid Version: ${version}`) - } - - if (version.length > MAX_LENGTH) { - throw new TypeError( - `version is longer than ${MAX_LENGTH} characters` - ) - } - - debug('SemVer', version, options) - this.options = options - this.loose = !!options.loose - // this isn't actually relevant for versions, but keep it so that we - // don't run into trouble passing this.options around. - this.includePrerelease = !!options.includePrerelease - - const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]) - - if (!m) { - throw new TypeError(`Invalid Version: ${version}`) - } - - this.raw = version - - // these are actually numbers - this.major = +m[1] - this.minor = +m[2] - this.patch = +m[3] - - if (this.major > MAX_SAFE_INTEGER || this.major < 0) { - throw new TypeError('Invalid major version') - } - - if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { - throw new TypeError('Invalid minor version') - } - - if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { - throw new TypeError('Invalid patch version') - } - - // numberify any prerelease numeric ids - if (!m[4]) { - this.prerelease = [] - } else { - this.prerelease = m[4].split('.').map((id) => { - if (/^[0-9]+$/.test(id)) { - const num = +id - if (num >= 0 && num < MAX_SAFE_INTEGER) { - return num - } - } - return id - }) - } - - this.build = m[5] ? m[5].split('.') : [] - this.format() - } - - format () { - this.version = `${this.major}.${this.minor}.${this.patch}` - if (this.prerelease.length) { - this.version += `-${this.prerelease.join('.')}` - } - return this.version - } - - toString () { - return this.version - } - - compare (other) { - debug('SemVer.compare', this.version, this.options, other) - if (!(other instanceof SemVer)) { - if (typeof other === 'string' && other === this.version) { - return 0 - } - other = new SemVer(other, this.options) - } - - if (other.version === this.version) { - return 0 - } - - return this.compareMain(other) || this.comparePre(other) - } - - compareMain (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - return ( - compareIdentifiers(this.major, other.major) || - compareIdentifiers(this.minor, other.minor) || - compareIdentifiers(this.patch, other.patch) - ) - } - - comparePre (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - // NOT having a prerelease is > having one - if (this.prerelease.length && !other.prerelease.length) { - return -1 - } else if (!this.prerelease.length && other.prerelease.length) { - return 1 - } else if (!this.prerelease.length && !other.prerelease.length) { - return 0 - } - - let i = 0 - do { - const a = this.prerelease[i] - const b = other.prerelease[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - } - - compareBuild (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - let i = 0 - do { - const a = this.build[i] - const b = other.build[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - } - - // preminor will bump the version up to the next minor release, and immediately - // down to pre-release. premajor and prepatch work the same way. - inc (release, identifier) { - switch (release) { - case 'premajor': - this.prerelease.length = 0 - this.patch = 0 - this.minor = 0 - this.major++ - this.inc('pre', identifier) - break - case 'preminor': - this.prerelease.length = 0 - this.patch = 0 - this.minor++ - this.inc('pre', identifier) - break - case 'prepatch': - // If this is already a prerelease, it will bump to the next version - // drop any prereleases that might already exist, since they are not - // relevant at this point. - this.prerelease.length = 0 - this.inc('patch', identifier) - this.inc('pre', identifier) - break - // If the input is a non-prerelease version, this acts the same as - // prepatch. - case 'prerelease': - if (this.prerelease.length === 0) { - this.inc('patch', identifier) - } - this.inc('pre', identifier) - break - - case 'major': - // If this is a pre-major version, bump up to the same major version. - // Otherwise increment major. - // 1.0.0-5 bumps to 1.0.0 - // 1.1.0 bumps to 2.0.0 - if ( - this.minor !== 0 || - this.patch !== 0 || - this.prerelease.length === 0 - ) { - this.major++ - } - this.minor = 0 - this.patch = 0 - this.prerelease = [] - break - case 'minor': - // If this is a pre-minor version, bump up to the same minor version. - // Otherwise increment minor. - // 1.2.0-5 bumps to 1.2.0 - // 1.2.1 bumps to 1.3.0 - if (this.patch !== 0 || this.prerelease.length === 0) { - this.minor++ - } - this.patch = 0 - this.prerelease = [] - break - case 'patch': - // If this is not a pre-release version, it will increment the patch. - // If it is a pre-release it will bump up to the same patch version. - // 1.2.0-5 patches to 1.2.0 - // 1.2.0 patches to 1.2.1 - if (this.prerelease.length === 0) { - this.patch++ - } - this.prerelease = [] - break - // This probably shouldn't be used publicly. - // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction. - case 'pre': - if (this.prerelease.length === 0) { - this.prerelease = [0] - } else { - let i = this.prerelease.length - while (--i >= 0) { - if (typeof this.prerelease[i] === 'number') { - this.prerelease[i]++ - i = -2 - } - } - if (i === -1) { - // didn't increment anything - this.prerelease.push(0) - } - } - if (identifier) { - // 1.2.0-beta.1 bumps to 1.2.0-beta.2, - // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 - if (this.prerelease[0] === identifier) { - if (isNaN(this.prerelease[1])) { - this.prerelease = [identifier, 0] - } - } else { - this.prerelease = [identifier, 0] - } - } - break - - default: - throw new Error(`invalid increment argument: ${release}`) - } - this.format() - this.raw = this.version - return this - } -} - -module.exports = SemVer - - -/***/ }), - -/***/ 5098: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const eq = __nccwpck_require__(1898) -const neq = __nccwpck_require__(6017) -const gt = __nccwpck_require__(4123) -const gte = __nccwpck_require__(5522) -const lt = __nccwpck_require__(194) -const lte = __nccwpck_require__(7520) - -const cmp = (a, op, b, loose) => { - switch (op) { - case '===': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a === b - - case '!==': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a !== b - - case '': - case '=': - case '==': - return eq(a, b, loose) - - case '!=': - return neq(a, b, loose) - - case '>': - return gt(a, b, loose) - - case '>=': - return gte(a, b, loose) - - case '<': - return lt(a, b, loose) - - case '<=': - return lte(a, b, loose) - - default: - throw new TypeError(`Invalid operator: ${op}`) - } -} -module.exports = cmp - - -/***/ }), - -/***/ 4309: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const SemVer = __nccwpck_require__(8088) -const compare = (a, b, loose) => - new SemVer(a, loose).compare(new SemVer(b, loose)) - -module.exports = compare - - -/***/ }), - -/***/ 1898: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const eq = (a, b, loose) => compare(a, b, loose) === 0 -module.exports = eq - - -/***/ }), - -/***/ 4123: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const gt = (a, b, loose) => compare(a, b, loose) > 0 -module.exports = gt - - -/***/ }), - -/***/ 5522: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const gte = (a, b, loose) => compare(a, b, loose) >= 0 -module.exports = gte - - -/***/ }), - -/***/ 194: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const lt = (a, b, loose) => compare(a, b, loose) < 0 -module.exports = lt - - -/***/ }), - -/***/ 7520: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const lte = (a, b, loose) => compare(a, b, loose) <= 0 -module.exports = lte - - -/***/ }), - -/***/ 6017: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const neq = (a, b, loose) => compare(a, b, loose) !== 0 -module.exports = neq - - -/***/ }), - -/***/ 5925: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const {MAX_LENGTH} = __nccwpck_require__(2293) -const { re, t } = __nccwpck_require__(9523) -const SemVer = __nccwpck_require__(8088) - -const parseOptions = __nccwpck_require__(785) -const parse = (version, options) => { - options = parseOptions(options) - - if (version instanceof SemVer) { - return version - } - - if (typeof version !== 'string') { - return null - } - - if (version.length > MAX_LENGTH) { - return null - } - - const r = options.loose ? re[t.LOOSE] : re[t.FULL] - if (!r.test(version)) { - return null - } - - try { - return new SemVer(version, options) - } catch (er) { - return null - } -} - -module.exports = parse - - -/***/ }), - -/***/ 6055: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const Range = __nccwpck_require__(9828) -const satisfies = (version, range, options) => { - try { - range = new Range(range, options) - } catch (er) { - return false - } - return range.test(version) -} -module.exports = satisfies - - -/***/ }), - -/***/ 2293: -/***/ ((module) => { - -// Note: this is the semver.org version of the spec that it implements -// Not necessarily the package version of this code. -const SEMVER_SPEC_VERSION = '2.0.0' - -const MAX_LENGTH = 256 -const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || - /* istanbul ignore next */ 9007199254740991 - -// Max safe segment length for coercion. -const MAX_SAFE_COMPONENT_LENGTH = 16 - -module.exports = { - SEMVER_SPEC_VERSION, - MAX_LENGTH, - MAX_SAFE_INTEGER, - MAX_SAFE_COMPONENT_LENGTH -} - - -/***/ }), - -/***/ 427: -/***/ ((module) => { - -const debug = ( - typeof process === 'object' && - process.env && - process.env.NODE_DEBUG && - /\bsemver\b/i.test(process.env.NODE_DEBUG) -) ? (...args) => console.error('SEMVER', ...args) - : () => {} - -module.exports = debug - - -/***/ }), - -/***/ 2463: -/***/ ((module) => { - -const numeric = /^[0-9]+$/ -const compareIdentifiers = (a, b) => { - const anum = numeric.test(a) - const bnum = numeric.test(b) - - if (anum && bnum) { - a = +a - b = +b - } - - return a === b ? 0 - : (anum && !bnum) ? -1 - : (bnum && !anum) ? 1 - : a < b ? -1 - : 1 -} - -const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a) - -module.exports = { - compareIdentifiers, - rcompareIdentifiers -} - - -/***/ }), - -/***/ 785: -/***/ ((module) => { - -// parse out just the options we care about so we always get a consistent -// obj with keys in a consistent order. -const opts = ['includePrerelease', 'loose', 'rtl'] -const parseOptions = options => - !options ? {} - : typeof options !== 'object' ? { loose: true } - : opts.filter(k => options[k]).reduce((options, k) => { - options[k] = true - return options - }, {}) -module.exports = parseOptions - - -/***/ }), - -/***/ 9523: -/***/ ((module, exports, __nccwpck_require__) => { - -const { MAX_SAFE_COMPONENT_LENGTH } = __nccwpck_require__(2293) -const debug = __nccwpck_require__(427) -exports = module.exports = {} - -// The actual regexps go on exports.re -const re = exports.re = [] -const src = exports.src = [] -const t = exports.t = {} -let R = 0 - -const createToken = (name, value, isGlobal) => { - const index = R++ - debug(index, value) - t[name] = index - src[index] = value - re[index] = new RegExp(value, isGlobal ? 'g' : undefined) -} - -// The following Regular Expressions can be used for tokenizing, -// validating, and parsing SemVer version strings. - -// ## Numeric Identifier -// A single `0`, or a non-zero digit followed by zero or more digits. - -createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*') -createToken('NUMERICIDENTIFIERLOOSE', '[0-9]+') - -// ## Non-numeric Identifier -// Zero or more digits, followed by a letter or hyphen, and then zero or -// more letters, digits, or hyphens. - -createToken('NONNUMERICIDENTIFIER', '\\d*[a-zA-Z-][a-zA-Z0-9-]*') - -// ## Main Version -// Three dot-separated numeric identifiers. - -createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})`) - -createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})`) - -// ## Pre-release Version Identifier -// A numeric identifier, or a non-numeric identifier. - -createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER] -}|${src[t.NONNUMERICIDENTIFIER]})`) - -createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE] -}|${src[t.NONNUMERICIDENTIFIER]})`) - -// ## Pre-release Version -// Hyphen, followed by one or more dot-separated pre-release version -// identifiers. - -createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER] -}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`) - -createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE] -}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`) - -// ## Build Metadata Identifier -// Any combination of digits, letters, or hyphens. - -createToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+') - -// ## Build Metadata -// Plus sign, followed by one or more period-separated build metadata -// identifiers. - -createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER] -}(?:\\.${src[t.BUILDIDENTIFIER]})*))`) - -// ## Full Version String -// A main version, followed optionally by a pre-release version and -// build metadata. - -// Note that the only major, minor, patch, and pre-release sections of -// the version string are capturing groups. The build metadata is not a -// capturing group, because it should not ever be used in version -// comparison. - -createToken('FULLPLAIN', `v?${src[t.MAINVERSION] -}${src[t.PRERELEASE]}?${ - src[t.BUILD]}?`) - -createToken('FULL', `^${src[t.FULLPLAIN]}$`) - -// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. -// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty -// common in the npm registry. -createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE] -}${src[t.PRERELEASELOOSE]}?${ - src[t.BUILD]}?`) - -createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`) - -createToken('GTLT', '((?:<|>)?=?)') - -// Something like "2.*" or "1.2.x". -// Note that "x.x" is a valid xRange identifer, meaning "any version" -// Only the first item is strictly required. -createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`) -createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`) - -createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:${src[t.PRERELEASE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:${src[t.PRERELEASELOOSE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`) -createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`) - -// Coercion. -// Extract anything that could conceivably be a part of a valid semver -createToken('COERCE', `${'(^|[^\\d])' + - '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + - `(?:$|[^\\d])`) -createToken('COERCERTL', src[t.COERCE], true) - -// Tilde ranges. -// Meaning is "reasonably at or greater than" -createToken('LONETILDE', '(?:~>?)') - -createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true) -exports.tildeTrimReplace = '$1~' - -createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`) -createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`) - -// Caret ranges. -// Meaning is "at least and backwards compatible with" -createToken('LONECARET', '(?:\\^)') - -createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true) -exports.caretTrimReplace = '$1^' - -createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`) -createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`) - -// A simple gt/lt/eq thing, or just "" to indicate "any version" -createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`) -createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`) - -// An expression to strip any whitespace between the gtlt and the thing -// it modifies, so that `> 1.2.3` ==> `>1.2.3` -createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT] -}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true) -exports.comparatorTrimReplace = '$1$2$3' - -// Something like `1.2.3 - 1.2.4` -// Note that these all use the loose form, because they'll be -// checked against either the strict or loose comparator form -// later. -createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAIN]})` + - `\\s*$`) - -createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAINLOOSE]})` + - `\\s*$`) - -// Star ranges basically just allow anything at all. -createToken('STAR', '(<|>)?=?\\s*\\*') -// >=0.0.0 is like a star -createToken('GTE0', '^\\s*>=\\s*0\.0\.0\\s*$') -createToken('GTE0PRE', '^\\s*>=\\s*0\.0\.0-0\\s*$') - - -/***/ }), - -/***/ 1196: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - - -// A linked list to keep track of recently-used-ness -const Yallist = __nccwpck_require__(220) - -const MAX = Symbol('max') -const LENGTH = Symbol('length') -const LENGTH_CALCULATOR = Symbol('lengthCalculator') -const ALLOW_STALE = Symbol('allowStale') -const MAX_AGE = Symbol('maxAge') -const DISPOSE = Symbol('dispose') -const NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet') -const LRU_LIST = Symbol('lruList') -const CACHE = Symbol('cache') -const UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet') - -const naiveLength = () => 1 - -// lruList is a yallist where the head is the youngest -// item, and the tail is the oldest. the list contains the Hit -// objects as the entries. -// Each Hit object has a reference to its Yallist.Node. This -// never changes. -// -// cache is a Map (or PseudoMap) that matches the keys to -// the Yallist.Node object. -class LRUCache { - constructor (options) { - if (typeof options === 'number') - options = { max: options } - - if (!options) - options = {} - - if (options.max && (typeof options.max !== 'number' || options.max < 0)) - throw new TypeError('max must be a non-negative number') - // Kind of weird to have a default max of Infinity, but oh well. - const max = this[MAX] = options.max || Infinity - - const lc = options.length || naiveLength - this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc - this[ALLOW_STALE] = options.stale || false - if (options.maxAge && typeof options.maxAge !== 'number') - throw new TypeError('maxAge must be a number') - this[MAX_AGE] = options.maxAge || 0 - this[DISPOSE] = options.dispose - this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false - this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false - this.reset() - } - - // resize the cache when the max changes. - set max (mL) { - if (typeof mL !== 'number' || mL < 0) - throw new TypeError('max must be a non-negative number') - - this[MAX] = mL || Infinity - trim(this) - } - get max () { - return this[MAX] - } - - set allowStale (allowStale) { - this[ALLOW_STALE] = !!allowStale - } - get allowStale () { - return this[ALLOW_STALE] - } - - set maxAge (mA) { - if (typeof mA !== 'number') - throw new TypeError('maxAge must be a non-negative number') - - this[MAX_AGE] = mA - trim(this) - } - get maxAge () { - return this[MAX_AGE] - } - - // resize the cache when the lengthCalculator changes. - set lengthCalculator (lC) { - if (typeof lC !== 'function') - lC = naiveLength - - if (lC !== this[LENGTH_CALCULATOR]) { - this[LENGTH_CALCULATOR] = lC - this[LENGTH] = 0 - this[LRU_LIST].forEach(hit => { - hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key) - this[LENGTH] += hit.length - }) - } - trim(this) - } - get lengthCalculator () { return this[LENGTH_CALCULATOR] } - - get length () { return this[LENGTH] } - get itemCount () { return this[LRU_LIST].length } - - rforEach (fn, thisp) { - thisp = thisp || this - for (let walker = this[LRU_LIST].tail; walker !== null;) { - const prev = walker.prev - forEachStep(this, fn, walker, thisp) - walker = prev - } - } - - forEach (fn, thisp) { - thisp = thisp || this - for (let walker = this[LRU_LIST].head; walker !== null;) { - const next = walker.next - forEachStep(this, fn, walker, thisp) - walker = next - } - } - - keys () { - return this[LRU_LIST].toArray().map(k => k.key) - } - - values () { - return this[LRU_LIST].toArray().map(k => k.value) - } - - reset () { - if (this[DISPOSE] && - this[LRU_LIST] && - this[LRU_LIST].length) { - this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value)) - } - - this[CACHE] = new Map() // hash of items by key - this[LRU_LIST] = new Yallist() // list of items in order of use recency - this[LENGTH] = 0 // length of items in the list - } - - dump () { - return this[LRU_LIST].map(hit => - isStale(this, hit) ? false : { - k: hit.key, - v: hit.value, - e: hit.now + (hit.maxAge || 0) - }).toArray().filter(h => h) - } - - dumpLru () { - return this[LRU_LIST] - } - - set (key, value, maxAge) { - maxAge = maxAge || this[MAX_AGE] - - if (maxAge && typeof maxAge !== 'number') - throw new TypeError('maxAge must be a number') - - const now = maxAge ? Date.now() : 0 - const len = this[LENGTH_CALCULATOR](value, key) - - if (this[CACHE].has(key)) { - if (len > this[MAX]) { - del(this, this[CACHE].get(key)) - return false - } - - const node = this[CACHE].get(key) - const item = node.value - - // dispose of the old one before overwriting - // split out into 2 ifs for better coverage tracking - if (this[DISPOSE]) { - if (!this[NO_DISPOSE_ON_SET]) - this[DISPOSE](key, item.value) - } - - item.now = now - item.maxAge = maxAge - item.value = value - this[LENGTH] += len - item.length - item.length = len - this.get(key) - trim(this) - return true - } - - const hit = new Entry(key, value, len, now, maxAge) - - // oversized objects fall out of cache automatically. - if (hit.length > this[MAX]) { - if (this[DISPOSE]) - this[DISPOSE](key, value) - - return false - } - - this[LENGTH] += hit.length - this[LRU_LIST].unshift(hit) - this[CACHE].set(key, this[LRU_LIST].head) - trim(this) - return true - } - - has (key) { - if (!this[CACHE].has(key)) return false - const hit = this[CACHE].get(key).value - return !isStale(this, hit) - } - - get (key) { - return get(this, key, true) - } - - peek (key) { - return get(this, key, false) - } - - pop () { - const node = this[LRU_LIST].tail - if (!node) - return null - - del(this, node) - return node.value - } - - del (key) { - del(this, this[CACHE].get(key)) - } - - load (arr) { - // reset the cache - this.reset() - - const now = Date.now() - // A previous serialized cache has the most recent items first - for (let l = arr.length - 1; l >= 0; l--) { - const hit = arr[l] - const expiresAt = hit.e || 0 - if (expiresAt === 0) - // the item was created without expiration in a non aged cache - this.set(hit.k, hit.v) - else { - const maxAge = expiresAt - now - // dont add already expired items - if (maxAge > 0) { - this.set(hit.k, hit.v, maxAge) - } - } - } - } - - prune () { - this[CACHE].forEach((value, key) => get(this, key, false)) - } -} - -const get = (self, key, doUse) => { - const node = self[CACHE].get(key) - if (node) { - const hit = node.value - if (isStale(self, hit)) { - del(self, node) - if (!self[ALLOW_STALE]) - return undefined - } else { - if (doUse) { - if (self[UPDATE_AGE_ON_GET]) - node.value.now = Date.now() - self[LRU_LIST].unshiftNode(node) - } - } - return hit.value - } -} - -const isStale = (self, hit) => { - if (!hit || (!hit.maxAge && !self[MAX_AGE])) - return false - - const diff = Date.now() - hit.now - return hit.maxAge ? diff > hit.maxAge - : self[MAX_AGE] && (diff > self[MAX_AGE]) -} - -const trim = self => { - if (self[LENGTH] > self[MAX]) { - for (let walker = self[LRU_LIST].tail; - self[LENGTH] > self[MAX] && walker !== null;) { - // We know that we're about to delete this one, and also - // what the next least recently used key will be, so just - // go ahead and set it now. - const prev = walker.prev - del(self, walker) - walker = prev - } - } -} - -const del = (self, node) => { - if (node) { - const hit = node.value - if (self[DISPOSE]) - self[DISPOSE](hit.key, hit.value) - - self[LENGTH] -= hit.length - self[CACHE].delete(hit.key) - self[LRU_LIST].removeNode(node) - } -} - -class Entry { - constructor (key, value, length, now, maxAge) { - this.key = key - this.value = value - this.length = length - this.now = now - this.maxAge = maxAge || 0 - } -} - -const forEachStep = (self, fn, node, thisp) => { - let hit = node.value - if (isStale(self, hit)) { - del(self, node) - if (!self[ALLOW_STALE]) - hit = undefined - } - if (hit) - fn.call(thisp, hit.value, hit.key, self) -} - -module.exports = LRUCache - - -/***/ }), - -/***/ 5327: -/***/ ((module) => { - -"use strict"; - -module.exports = function (Yallist) { - Yallist.prototype[Symbol.iterator] = function* () { - for (let walker = this.head; walker; walker = walker.next) { - yield walker.value - } - } -} - - -/***/ }), - -/***/ 220: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - -module.exports = Yallist - -Yallist.Node = Node -Yallist.create = Yallist - -function Yallist (list) { - var self = this - if (!(self instanceof Yallist)) { - self = new Yallist() - } - - self.tail = null - self.head = null - self.length = 0 - - if (list && typeof list.forEach === 'function') { - list.forEach(function (item) { - self.push(item) - }) - } else if (arguments.length > 0) { - for (var i = 0, l = arguments.length; i < l; i++) { - self.push(arguments[i]) - } - } - - return self -} - -Yallist.prototype.removeNode = function (node) { - if (node.list !== this) { - throw new Error('removing node which does not belong to this list') - } - - var next = node.next - var prev = node.prev - - if (next) { - next.prev = prev - } - - if (prev) { - prev.next = next - } - - if (node === this.head) { - this.head = next - } - if (node === this.tail) { - this.tail = prev - } - - node.list.length-- - node.next = null - node.prev = null - node.list = null - - return next -} - -Yallist.prototype.unshiftNode = function (node) { - if (node === this.head) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var head = this.head - node.list = this - node.next = head - if (head) { - head.prev = node - } - - this.head = node - if (!this.tail) { - this.tail = node - } - this.length++ -} - -Yallist.prototype.pushNode = function (node) { - if (node === this.tail) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var tail = this.tail - node.list = this - node.prev = tail - if (tail) { - tail.next = node - } - - this.tail = node - if (!this.head) { - this.head = node - } - this.length++ -} - -Yallist.prototype.push = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - push(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.unshift = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - unshift(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.pop = function () { - if (!this.tail) { - return undefined - } - - var res = this.tail.value - this.tail = this.tail.prev - if (this.tail) { - this.tail.next = null - } else { - this.head = null - } - this.length-- - return res -} - -Yallist.prototype.shift = function () { - if (!this.head) { - return undefined - } - - var res = this.head.value - this.head = this.head.next - if (this.head) { - this.head.prev = null - } else { - this.tail = null - } - this.length-- - return res -} - -Yallist.prototype.forEach = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.head, i = 0; walker !== null; i++) { - fn.call(thisp, walker.value, i, this) - walker = walker.next - } -} - -Yallist.prototype.forEachReverse = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.tail, i = this.length - 1; walker !== null; i--) { - fn.call(thisp, walker.value, i, this) - walker = walker.prev - } -} - -Yallist.prototype.get = function (n) { - for (var i = 0, walker = this.head; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.next - } - if (i === n && walker !== null) { - return walker.value - } -} - -Yallist.prototype.getReverse = function (n) { - for (var i = 0, walker = this.tail; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.prev - } - if (i === n && walker !== null) { - return walker.value - } -} - -Yallist.prototype.map = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.head; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.next - } - return res -} - -Yallist.prototype.mapReverse = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.tail; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.prev - } - return res -} - -Yallist.prototype.reduce = function (fn, initial) { - var acc - var walker = this.head - if (arguments.length > 1) { - acc = initial - } else if (this.head) { - walker = this.head.next - acc = this.head.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } - - for (var i = 0; walker !== null; i++) { - acc = fn(acc, walker.value, i) - walker = walker.next - } - - return acc -} - -Yallist.prototype.reduceReverse = function (fn, initial) { - var acc - var walker = this.tail - if (arguments.length > 1) { - acc = initial - } else if (this.tail) { - walker = this.tail.prev - acc = this.tail.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } - - for (var i = this.length - 1; walker !== null; i--) { - acc = fn(acc, walker.value, i) - walker = walker.prev - } - - return acc -} - -Yallist.prototype.toArray = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.head; walker !== null; i++) { - arr[i] = walker.value - walker = walker.next - } - return arr -} - -Yallist.prototype.toArrayReverse = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.tail; walker !== null; i++) { - arr[i] = walker.value - walker = walker.prev - } - return arr -} - -Yallist.prototype.slice = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = 0, walker = this.head; walker !== null && i < from; i++) { - walker = walker.next - } - for (; walker !== null && i < to; i++, walker = walker.next) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.sliceReverse = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) { - walker = walker.prev - } - for (; walker !== null && i > from; i--, walker = walker.prev) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.splice = function (start, deleteCount, ...nodes) { - if (start > this.length) { - start = this.length - 1 - } - if (start < 0) { - start = this.length + start; - } - - for (var i = 0, walker = this.head; walker !== null && i < start; i++) { - walker = walker.next - } - - var ret = [] - for (var i = 0; walker && i < deleteCount; i++) { - ret.push(walker.value) - walker = this.removeNode(walker) - } - if (walker === null) { - walker = this.tail - } - - if (walker !== this.head && walker !== this.tail) { - walker = walker.prev - } - - for (var i = 0; i < nodes.length; i++) { - walker = insert(this, walker, nodes[i]) - } - return ret; -} - -Yallist.prototype.reverse = function () { - var head = this.head - var tail = this.tail - for (var walker = head; walker !== null; walker = walker.prev) { - var p = walker.prev - walker.prev = walker.next - walker.next = p - } - this.head = tail - this.tail = head - return this -} - -function insert (self, node, value) { - var inserted = node === self.head ? - new Node(value, null, node, self) : - new Node(value, node, node.next, self) - - if (inserted.next === null) { - self.tail = inserted - } - if (inserted.prev === null) { - self.head = inserted - } - - self.length++ - - return inserted -} - -function push (self, item) { - self.tail = new Node(item, self.tail, null, self) - if (!self.head) { - self.head = self.tail - } - self.length++ -} - -function unshift (self, item) { - self.head = new Node(item, null, self.head, self) - if (!self.tail) { - self.tail = self.head - } - self.length++ -} - -function Node (value, prev, next, list) { - if (!(this instanceof Node)) { - return new Node(value, prev, next, list) - } - - this.list = list - this.value = value - - if (prev) { - prev.next = this - this.prev = prev - } else { - this.prev = null - } - - if (next) { - next.prev = this - this.next = next - } else { - this.next = null - } -} - -try { - // add if support for Symbol.iterator is present - __nccwpck_require__(5327)(Yallist) -} catch (er) {} - - /***/ }), /***/ 4987: diff --git a/.github/actions/isPullRequestMergeable/index.js b/.github/actions/isPullRequestMergeable/index.js index 66817ec965c2..58042983cfde 100644 --- a/.github/actions/isPullRequestMergeable/index.js +++ b/.github/actions/isPullRequestMergeable/index.js @@ -64,8 +64,6 @@ module.exports = run; const _ = __nccwpck_require__(4987); const lodashGet = __nccwpck_require__(6908); -const semverParse = __nccwpck_require__(5925); -const semverSatisfies = __nccwpck_require__(6055); const GITHUB_OWNER = 'Expensify'; const EXPENSIFY_CASH_REPO = 'Expensify.cash'; @@ -126,11 +124,6 @@ class GithubUtils { try { const versionRegex = new RegExp('([0-9]+)\\.([0-9]+)\\.([0-9]+)(?:-([0-9]+))?', 'g'); const tag = issue.body.match(versionRegex)[0].replace(/`/g, ''); - - // eslint-disable-next-line max-len - const compareURLRegex = new RegExp(`${EXPENSIFY_CASH_URL}/compare/${versionRegex.source}\\.\\.\\.${versionRegex.source}`, 'g'); - const comparisonURL = issue.body.match(compareURLRegex)[0]; - return { title: issue.title, url: issue.url, @@ -138,7 +131,6 @@ class GithubUtils { PRList: this.getStagingDeployCashPRList(issue), deployBlockers: this.getStagingDeployCashDeployBlockers(issue), tag, - comparisonURL, }; } catch (exception) { throw new Error(`Unable to find ${STAGING_DEPLOY_CASH_LABEL} issue with correct data.`); @@ -213,71 +205,6 @@ class GithubUtils { ); } - /** - * Generate a comparison URL between two versions following the semverLevel passed - * - * @param {String} repoSlug - The slug of the repository: / - * @param {String} tag - The tag to compare first the previous semverLevel - * @param {String} semverLevel - The semantic versioning MAJOR, MINOR, PATCH and BUILD - * @return {Promise} the url generated - * @throws {Error} If the request to the Github API fails. - */ - generateVersionComparisonURL(repoSlug, tag, semverLevel) { - return new Promise((resolve, reject) => { - const getComparisonURL = (previousTag, currentTag) => ( - `${EXPENSIFY_CASH_URL}/compare/${previousTag}...${currentTag}` - ); - - const [repoOwner, repoName] = repoSlug.split('/'); - const tagSemver = semverParse(tag); - - return this.octokit.repos.listTags({ - owner: repoOwner, - repo: repoName, - }) - .then(githubResponse => githubResponse.data.some(({name: repoTag}) => { - if (semverLevel === 'MAJOR' - && semverSatisfies(repoTag, `<${tagSemver.major}.x.x`, {includePrerelease: true}) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'MINOR' - && semverSatisfies( - repoTag, - `<${tagSemver.major}.${tagSemver.minor}.x`, - {includePrerelease: true}, - ) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'PATCH' - && semverSatisfies(repoTag, `<${tagSemver}`, {includePrerelease: true}) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'BUILD' - && repoTag !== tagSemver.version - && semverSatisfies( - repoTag, - `<=${tagSemver.major}.${tagSemver.minor}.${tagSemver.patch}`, - {includePrerelease: true}, - ) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - return false; - })) - .catch(githubError => reject(githubError)); - }); - } - /** * Creates a new StagingDeployCash issue. * @@ -373,22 +300,16 @@ class GithubUtils { deployBlockers = [], resolvedDeployBlockers = [], ) { - return Promise.all([ - this.generateVersionComparisonURL(`${GITHUB_OWNER}/${EXPENSIFY_CASH_REPO}`, tag, 'PATCH'), - this.octokit.pulls.list({ - owner: GITHUB_OWNER, - repo: EXPENSIFY_CASH_REPO, - per_page: 100, - }), - ]) - .then(results => ({ - comparisonURL: results[0], - automergePRs: _.map( - _.filter(results[1].data, GithubUtils.isAutomergePullRequest), + return this.octokit.pulls.list({ + owner: GITHUB_OWNER, + repo: EXPENSIFY_CASH_REPO, + per_page: 100, + }) + .then(({data}) => { + const automergePRs = _.pluck( + _.filter(data, GithubUtils.isAutomergePullRequest), 'html_url', - ), - })) - .then(({comparisonURL, automergePRs}) => { + ); const sortedPRList = _.chain(PRList) .difference(automergePRs) .unique() @@ -400,8 +321,8 @@ class GithubUtils { ); // Tag version and comparison URL - let issueBody = `**Release Version:** \`${tag}\`\r\n`; - issueBody += `**Compare Changes:** ${comparisonURL}\r\n`; + // eslint-disable-next-line max-len + let issueBody = `**Release Version:** \`${tag}\`\r\n**Compare Changes:** https://github.com/Expensify/Expensify.cash/compare/production...staging\r\n`; // PR list if (!_.isEmpty(PRList)) { @@ -422,11 +343,13 @@ class GithubUtils { } issueBody += '\r\ncc @Expensify/applauseleads\r\n'; - return issueBody; }) - // eslint-disable-next-line no-console - .catch(err => console.warn('Error generating comparison URL, continuing...', err)); + .catch(err => console.warn( + 'Error generating StagingDeployCash issue body!', + 'Automerge PRs may not be properly filtered out. Continuing...', + err, + )); } /** @@ -10802,2212 +10725,6 @@ if (!safer.constants) { module.exports = safer -/***/ }), - -/***/ 1532: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const ANY = Symbol('SemVer ANY') -// hoisted class for cyclic dependency -class Comparator { - static get ANY () { - return ANY - } - constructor (comp, options) { - options = parseOptions(options) - - if (comp instanceof Comparator) { - if (comp.loose === !!options.loose) { - return comp - } else { - comp = comp.value - } - } - - debug('comparator', comp, options) - this.options = options - this.loose = !!options.loose - this.parse(comp) - - if (this.semver === ANY) { - this.value = '' - } else { - this.value = this.operator + this.semver.version - } - - debug('comp', this) - } - - parse (comp) { - const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] - const m = comp.match(r) - - if (!m) { - throw new TypeError(`Invalid comparator: ${comp}`) - } - - this.operator = m[1] !== undefined ? m[1] : '' - if (this.operator === '=') { - this.operator = '' - } - - // if it literally is just '>' or '' then allow anything. - if (!m[2]) { - this.semver = ANY - } else { - this.semver = new SemVer(m[2], this.options.loose) - } - } - - toString () { - return this.value - } - - test (version) { - debug('Comparator.test', version, this.options.loose) - - if (this.semver === ANY || version === ANY) { - return true - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - return cmp(version, this.operator, this.semver, this.options) - } - - intersects (comp, options) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required') - } - - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - if (this.operator === '') { - if (this.value === '') { - return true - } - return new Range(comp.value, options).test(this.value) - } else if (comp.operator === '') { - if (comp.value === '') { - return true - } - return new Range(this.value, options).test(comp.semver) - } - - const sameDirectionIncreasing = - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '>=' || comp.operator === '>') - const sameDirectionDecreasing = - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '<=' || comp.operator === '<') - const sameSemVer = this.semver.version === comp.semver.version - const differentDirectionsInclusive = - (this.operator === '>=' || this.operator === '<=') && - (comp.operator === '>=' || comp.operator === '<=') - const oppositeDirectionsLessThan = - cmp(this.semver, '<', comp.semver, options) && - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '<=' || comp.operator === '<') - const oppositeDirectionsGreaterThan = - cmp(this.semver, '>', comp.semver, options) && - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '>=' || comp.operator === '>') - - return ( - sameDirectionIncreasing || - sameDirectionDecreasing || - (sameSemVer && differentDirectionsInclusive) || - oppositeDirectionsLessThan || - oppositeDirectionsGreaterThan - ) - } -} - -module.exports = Comparator - -const parseOptions = __nccwpck_require__(785) -const {re, t} = __nccwpck_require__(9523) -const cmp = __nccwpck_require__(5098) -const debug = __nccwpck_require__(427) -const SemVer = __nccwpck_require__(8088) -const Range = __nccwpck_require__(9828) - - -/***/ }), - -/***/ 9828: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -// hoisted class for cyclic dependency -class Range { - constructor (range, options) { - options = parseOptions(options) - - if (range instanceof Range) { - if ( - range.loose === !!options.loose && - range.includePrerelease === !!options.includePrerelease - ) { - return range - } else { - return new Range(range.raw, options) - } - } - - if (range instanceof Comparator) { - // just put it in the set and return - this.raw = range.value - this.set = [[range]] - this.format() - return this - } - - this.options = options - this.loose = !!options.loose - this.includePrerelease = !!options.includePrerelease - - // First, split based on boolean or || - this.raw = range - this.set = range - .split(/\s*\|\|\s*/) - // map the range to a 2d array of comparators - .map(range => this.parseRange(range.trim())) - // throw out any comparator lists that are empty - // this generally means that it was not a valid range, which is allowed - // in loose mode, but will still throw if the WHOLE range is invalid. - .filter(c => c.length) - - if (!this.set.length) { - throw new TypeError(`Invalid SemVer Range: ${range}`) - } - - // if we have any that are not the null set, throw out null sets. - if (this.set.length > 1) { - // keep the first one, in case they're all null sets - const first = this.set[0] - this.set = this.set.filter(c => !isNullSet(c[0])) - if (this.set.length === 0) - this.set = [first] - else if (this.set.length > 1) { - // if we have any that are *, then the range is just * - for (const c of this.set) { - if (c.length === 1 && isAny(c[0])) { - this.set = [c] - break - } - } - } - } - - this.format() - } - - format () { - this.range = this.set - .map((comps) => { - return comps.join(' ').trim() - }) - .join('||') - .trim() - return this.range - } - - toString () { - return this.range - } - - parseRange (range) { - range = range.trim() - - // memoize range parsing for performance. - // this is a very hot path, and fully deterministic. - const memoOpts = Object.keys(this.options).join(',') - const memoKey = `parseRange:${memoOpts}:${range}` - const cached = cache.get(memoKey) - if (cached) - return cached - - const loose = this.options.loose - // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` - const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE] - range = range.replace(hr, hyphenReplace(this.options.includePrerelease)) - debug('hyphen replace', range) - // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` - range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace) - debug('comparator trim', range, re[t.COMPARATORTRIM]) - - // `~ 1.2.3` => `~1.2.3` - range = range.replace(re[t.TILDETRIM], tildeTrimReplace) - - // `^ 1.2.3` => `^1.2.3` - range = range.replace(re[t.CARETTRIM], caretTrimReplace) - - // normalize spaces - range = range.split(/\s+/).join(' ') - - // At this point, the range is completely trimmed and - // ready to be split into comparators. - - const compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] - const rangeList = range - .split(' ') - .map(comp => parseComparator(comp, this.options)) - .join(' ') - .split(/\s+/) - // >=0.0.0 is equivalent to * - .map(comp => replaceGTE0(comp, this.options)) - // in loose mode, throw out any that are not valid comparators - .filter(this.options.loose ? comp => !!comp.match(compRe) : () => true) - .map(comp => new Comparator(comp, this.options)) - - // if any comparators are the null set, then replace with JUST null set - // if more than one comparator, remove any * comparators - // also, don't include the same comparator more than once - const l = rangeList.length - const rangeMap = new Map() - for (const comp of rangeList) { - if (isNullSet(comp)) - return [comp] - rangeMap.set(comp.value, comp) - } - if (rangeMap.size > 1 && rangeMap.has('')) - rangeMap.delete('') - - const result = [...rangeMap.values()] - cache.set(memoKey, result) - return result - } - - intersects (range, options) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required') - } - - return this.set.some((thisComparators) => { - return ( - isSatisfiable(thisComparators, options) && - range.set.some((rangeComparators) => { - return ( - isSatisfiable(rangeComparators, options) && - thisComparators.every((thisComparator) => { - return rangeComparators.every((rangeComparator) => { - return thisComparator.intersects(rangeComparator, options) - }) - }) - ) - }) - ) - }) - } - - // if ANY of the sets match ALL of its comparators, then pass - test (version) { - if (!version) { - return false - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - for (let i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version, this.options)) { - return true - } - } - return false - } -} -module.exports = Range - -const LRU = __nccwpck_require__(1196) -const cache = new LRU({ max: 1000 }) - -const parseOptions = __nccwpck_require__(785) -const Comparator = __nccwpck_require__(1532) -const debug = __nccwpck_require__(427) -const SemVer = __nccwpck_require__(8088) -const { - re, - t, - comparatorTrimReplace, - tildeTrimReplace, - caretTrimReplace -} = __nccwpck_require__(9523) - -const isNullSet = c => c.value === '<0.0.0-0' -const isAny = c => c.value === '' - -// take a set of comparators and determine whether there -// exists a version which can satisfy it -const isSatisfiable = (comparators, options) => { - let result = true - const remainingComparators = comparators.slice() - let testComparator = remainingComparators.pop() - - while (result && remainingComparators.length) { - result = remainingComparators.every((otherComparator) => { - return testComparator.intersects(otherComparator, options) - }) - - testComparator = remainingComparators.pop() - } - - return result -} - -// comprised of xranges, tildes, stars, and gtlt's at this point. -// already replaced the hyphen ranges -// turn into a set of JUST comparators. -const parseComparator = (comp, options) => { - debug('comp', comp, options) - comp = replaceCarets(comp, options) - debug('caret', comp) - comp = replaceTildes(comp, options) - debug('tildes', comp) - comp = replaceXRanges(comp, options) - debug('xrange', comp) - comp = replaceStars(comp, options) - debug('stars', comp) - return comp -} - -const isX = id => !id || id.toLowerCase() === 'x' || id === '*' - -// ~, ~> --> * (any, kinda silly) -// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0 -// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0 -// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0 -// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0 -// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0 -const replaceTildes = (comp, options) => - comp.trim().split(/\s+/).map((comp) => { - return replaceTilde(comp, options) - }).join(' ') - -const replaceTilde = (comp, options) => { - const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] - return comp.replace(r, (_, M, m, p, pr) => { - debug('tilde', comp, _, M, m, p, pr) - let ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = `>=${M}.0.0 <${+M + 1}.0.0-0` - } else if (isX(p)) { - // ~1.2 == >=1.2.0 <1.3.0-0 - ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0` - } else if (pr) { - debug('replaceTilde pr', pr) - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${+m + 1}.0-0` - } else { - // ~1.2.3 == >=1.2.3 <1.3.0-0 - ret = `>=${M}.${m}.${p - } <${M}.${+m + 1}.0-0` - } - - debug('tilde return', ret) - return ret - }) -} - -// ^ --> * (any, kinda silly) -// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0 -// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0 -// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0 -// ^1.2.3 --> >=1.2.3 <2.0.0-0 -// ^1.2.0 --> >=1.2.0 <2.0.0-0 -const replaceCarets = (comp, options) => - comp.trim().split(/\s+/).map((comp) => { - return replaceCaret(comp, options) - }).join(' ') - -const replaceCaret = (comp, options) => { - debug('caret', comp, options) - const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET] - const z = options.includePrerelease ? '-0' : '' - return comp.replace(r, (_, M, m, p, pr) => { - debug('caret', comp, _, M, m, p, pr) - let ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0` - } else if (isX(p)) { - if (M === '0') { - ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0` - } else { - ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0` - } - } else if (pr) { - debug('replaceCaret pr', pr) - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${m}.${+p + 1}-0` - } else { - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${+m + 1}.0-0` - } - } else { - ret = `>=${M}.${m}.${p}-${pr - } <${+M + 1}.0.0-0` - } - } else { - debug('no pr') - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p - }${z} <${M}.${m}.${+p + 1}-0` - } else { - ret = `>=${M}.${m}.${p - }${z} <${M}.${+m + 1}.0-0` - } - } else { - ret = `>=${M}.${m}.${p - } <${+M + 1}.0.0-0` - } - } - - debug('caret return', ret) - return ret - }) -} - -const replaceXRanges = (comp, options) => { - debug('replaceXRanges', comp, options) - return comp.split(/\s+/).map((comp) => { - return replaceXRange(comp, options) - }).join(' ') -} - -const replaceXRange = (comp, options) => { - comp = comp.trim() - const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE] - return comp.replace(r, (ret, gtlt, M, m, p, pr) => { - debug('xRange', comp, ret, gtlt, M, m, p, pr) - const xM = isX(M) - const xm = xM || isX(m) - const xp = xm || isX(p) - const anyX = xp - - if (gtlt === '=' && anyX) { - gtlt = '' - } - - // if we're including prereleases in the match, then we need - // to fix this to -0, the lowest possible prerelease value - pr = options.includePrerelease ? '-0' : '' - - if (xM) { - if (gtlt === '>' || gtlt === '<') { - // nothing is allowed - ret = '<0.0.0-0' - } else { - // nothing is forbidden - ret = '*' - } - } else if (gtlt && anyX) { - // we know patch is an x, because we have any x at all. - // replace X with 0 - if (xm) { - m = 0 - } - p = 0 - - if (gtlt === '>') { - // >1 => >=2.0.0 - // >1.2 => >=1.3.0 - gtlt = '>=' - if (xm) { - M = +M + 1 - m = 0 - p = 0 - } else { - m = +m + 1 - p = 0 - } - } else if (gtlt === '<=') { - // <=0.7.x is actually <0.8.0, since any 0.7.x should - // pass. Similarly, <=7.x is actually <8.0.0, etc. - gtlt = '<' - if (xm) { - M = +M + 1 - } else { - m = +m + 1 - } - } - - if (gtlt === '<') - pr = '-0' - - ret = `${gtlt + M}.${m}.${p}${pr}` - } else if (xm) { - ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0` - } else if (xp) { - ret = `>=${M}.${m}.0${pr - } <${M}.${+m + 1}.0-0` - } - - debug('xRange return', ret) - - return ret - }) -} - -// Because * is AND-ed with everything else in the comparator, -// and '' means "any version", just remove the *s entirely. -const replaceStars = (comp, options) => { - debug('replaceStars', comp, options) - // Looseness is ignored here. star is always as loose as it gets! - return comp.trim().replace(re[t.STAR], '') -} - -const replaceGTE0 = (comp, options) => { - debug('replaceGTE0', comp, options) - return comp.trim() - .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '') -} - -// This function is passed to string.replace(re[t.HYPHENRANGE]) -// M, m, patch, prerelease, build -// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 -// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do -// 1.2 - 3.4 => >=1.2.0 <3.5.0-0 -const hyphenReplace = incPr => ($0, - from, fM, fm, fp, fpr, fb, - to, tM, tm, tp, tpr, tb) => { - if (isX(fM)) { - from = '' - } else if (isX(fm)) { - from = `>=${fM}.0.0${incPr ? '-0' : ''}` - } else if (isX(fp)) { - from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}` - } else if (fpr) { - from = `>=${from}` - } else { - from = `>=${from}${incPr ? '-0' : ''}` - } - - if (isX(tM)) { - to = '' - } else if (isX(tm)) { - to = `<${+tM + 1}.0.0-0` - } else if (isX(tp)) { - to = `<${tM}.${+tm + 1}.0-0` - } else if (tpr) { - to = `<=${tM}.${tm}.${tp}-${tpr}` - } else if (incPr) { - to = `<${tM}.${tm}.${+tp + 1}-0` - } else { - to = `<=${to}` - } - - return (`${from} ${to}`).trim() -} - -const testSet = (set, version, options) => { - for (let i = 0; i < set.length; i++) { - if (!set[i].test(version)) { - return false - } - } - - if (version.prerelease.length && !options.includePrerelease) { - // Find the set of versions that are allowed to have prereleases - // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 - // That should allow `1.2.3-pr.2` to pass. - // However, `1.2.4-alpha.notready` should NOT be allowed, - // even though it's within the range set by the comparators. - for (let i = 0; i < set.length; i++) { - debug(set[i].semver) - if (set[i].semver === Comparator.ANY) { - continue - } - - if (set[i].semver.prerelease.length > 0) { - const allowed = set[i].semver - if (allowed.major === version.major && - allowed.minor === version.minor && - allowed.patch === version.patch) { - return true - } - } - } - - // Version has a -pre, but it's not one of the ones we like. - return false - } - - return true -} - - -/***/ }), - -/***/ 8088: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const debug = __nccwpck_require__(427) -const { MAX_LENGTH, MAX_SAFE_INTEGER } = __nccwpck_require__(2293) -const { re, t } = __nccwpck_require__(9523) - -const parseOptions = __nccwpck_require__(785) -const { compareIdentifiers } = __nccwpck_require__(2463) -class SemVer { - constructor (version, options) { - options = parseOptions(options) - - if (version instanceof SemVer) { - if (version.loose === !!options.loose && - version.includePrerelease === !!options.includePrerelease) { - return version - } else { - version = version.version - } - } else if (typeof version !== 'string') { - throw new TypeError(`Invalid Version: ${version}`) - } - - if (version.length > MAX_LENGTH) { - throw new TypeError( - `version is longer than ${MAX_LENGTH} characters` - ) - } - - debug('SemVer', version, options) - this.options = options - this.loose = !!options.loose - // this isn't actually relevant for versions, but keep it so that we - // don't run into trouble passing this.options around. - this.includePrerelease = !!options.includePrerelease - - const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]) - - if (!m) { - throw new TypeError(`Invalid Version: ${version}`) - } - - this.raw = version - - // these are actually numbers - this.major = +m[1] - this.minor = +m[2] - this.patch = +m[3] - - if (this.major > MAX_SAFE_INTEGER || this.major < 0) { - throw new TypeError('Invalid major version') - } - - if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { - throw new TypeError('Invalid minor version') - } - - if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { - throw new TypeError('Invalid patch version') - } - - // numberify any prerelease numeric ids - if (!m[4]) { - this.prerelease = [] - } else { - this.prerelease = m[4].split('.').map((id) => { - if (/^[0-9]+$/.test(id)) { - const num = +id - if (num >= 0 && num < MAX_SAFE_INTEGER) { - return num - } - } - return id - }) - } - - this.build = m[5] ? m[5].split('.') : [] - this.format() - } - - format () { - this.version = `${this.major}.${this.minor}.${this.patch}` - if (this.prerelease.length) { - this.version += `-${this.prerelease.join('.')}` - } - return this.version - } - - toString () { - return this.version - } - - compare (other) { - debug('SemVer.compare', this.version, this.options, other) - if (!(other instanceof SemVer)) { - if (typeof other === 'string' && other === this.version) { - return 0 - } - other = new SemVer(other, this.options) - } - - if (other.version === this.version) { - return 0 - } - - return this.compareMain(other) || this.comparePre(other) - } - - compareMain (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - return ( - compareIdentifiers(this.major, other.major) || - compareIdentifiers(this.minor, other.minor) || - compareIdentifiers(this.patch, other.patch) - ) - } - - comparePre (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - // NOT having a prerelease is > having one - if (this.prerelease.length && !other.prerelease.length) { - return -1 - } else if (!this.prerelease.length && other.prerelease.length) { - return 1 - } else if (!this.prerelease.length && !other.prerelease.length) { - return 0 - } - - let i = 0 - do { - const a = this.prerelease[i] - const b = other.prerelease[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - } - - compareBuild (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - let i = 0 - do { - const a = this.build[i] - const b = other.build[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - } - - // preminor will bump the version up to the next minor release, and immediately - // down to pre-release. premajor and prepatch work the same way. - inc (release, identifier) { - switch (release) { - case 'premajor': - this.prerelease.length = 0 - this.patch = 0 - this.minor = 0 - this.major++ - this.inc('pre', identifier) - break - case 'preminor': - this.prerelease.length = 0 - this.patch = 0 - this.minor++ - this.inc('pre', identifier) - break - case 'prepatch': - // If this is already a prerelease, it will bump to the next version - // drop any prereleases that might already exist, since they are not - // relevant at this point. - this.prerelease.length = 0 - this.inc('patch', identifier) - this.inc('pre', identifier) - break - // If the input is a non-prerelease version, this acts the same as - // prepatch. - case 'prerelease': - if (this.prerelease.length === 0) { - this.inc('patch', identifier) - } - this.inc('pre', identifier) - break - - case 'major': - // If this is a pre-major version, bump up to the same major version. - // Otherwise increment major. - // 1.0.0-5 bumps to 1.0.0 - // 1.1.0 bumps to 2.0.0 - if ( - this.minor !== 0 || - this.patch !== 0 || - this.prerelease.length === 0 - ) { - this.major++ - } - this.minor = 0 - this.patch = 0 - this.prerelease = [] - break - case 'minor': - // If this is a pre-minor version, bump up to the same minor version. - // Otherwise increment minor. - // 1.2.0-5 bumps to 1.2.0 - // 1.2.1 bumps to 1.3.0 - if (this.patch !== 0 || this.prerelease.length === 0) { - this.minor++ - } - this.patch = 0 - this.prerelease = [] - break - case 'patch': - // If this is not a pre-release version, it will increment the patch. - // If it is a pre-release it will bump up to the same patch version. - // 1.2.0-5 patches to 1.2.0 - // 1.2.0 patches to 1.2.1 - if (this.prerelease.length === 0) { - this.patch++ - } - this.prerelease = [] - break - // This probably shouldn't be used publicly. - // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction. - case 'pre': - if (this.prerelease.length === 0) { - this.prerelease = [0] - } else { - let i = this.prerelease.length - while (--i >= 0) { - if (typeof this.prerelease[i] === 'number') { - this.prerelease[i]++ - i = -2 - } - } - if (i === -1) { - // didn't increment anything - this.prerelease.push(0) - } - } - if (identifier) { - // 1.2.0-beta.1 bumps to 1.2.0-beta.2, - // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 - if (this.prerelease[0] === identifier) { - if (isNaN(this.prerelease[1])) { - this.prerelease = [identifier, 0] - } - } else { - this.prerelease = [identifier, 0] - } - } - break - - default: - throw new Error(`invalid increment argument: ${release}`) - } - this.format() - this.raw = this.version - return this - } -} - -module.exports = SemVer - - -/***/ }), - -/***/ 5098: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const eq = __nccwpck_require__(1898) -const neq = __nccwpck_require__(6017) -const gt = __nccwpck_require__(4123) -const gte = __nccwpck_require__(5522) -const lt = __nccwpck_require__(194) -const lte = __nccwpck_require__(7520) - -const cmp = (a, op, b, loose) => { - switch (op) { - case '===': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a === b - - case '!==': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a !== b - - case '': - case '=': - case '==': - return eq(a, b, loose) - - case '!=': - return neq(a, b, loose) - - case '>': - return gt(a, b, loose) - - case '>=': - return gte(a, b, loose) - - case '<': - return lt(a, b, loose) - - case '<=': - return lte(a, b, loose) - - default: - throw new TypeError(`Invalid operator: ${op}`) - } -} -module.exports = cmp - - -/***/ }), - -/***/ 4309: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const SemVer = __nccwpck_require__(8088) -const compare = (a, b, loose) => - new SemVer(a, loose).compare(new SemVer(b, loose)) - -module.exports = compare - - -/***/ }), - -/***/ 1898: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const eq = (a, b, loose) => compare(a, b, loose) === 0 -module.exports = eq - - -/***/ }), - -/***/ 4123: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const gt = (a, b, loose) => compare(a, b, loose) > 0 -module.exports = gt - - -/***/ }), - -/***/ 5522: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const gte = (a, b, loose) => compare(a, b, loose) >= 0 -module.exports = gte - - -/***/ }), - -/***/ 194: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const lt = (a, b, loose) => compare(a, b, loose) < 0 -module.exports = lt - - -/***/ }), - -/***/ 7520: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const lte = (a, b, loose) => compare(a, b, loose) <= 0 -module.exports = lte - - -/***/ }), - -/***/ 6017: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const neq = (a, b, loose) => compare(a, b, loose) !== 0 -module.exports = neq - - -/***/ }), - -/***/ 5925: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const {MAX_LENGTH} = __nccwpck_require__(2293) -const { re, t } = __nccwpck_require__(9523) -const SemVer = __nccwpck_require__(8088) - -const parseOptions = __nccwpck_require__(785) -const parse = (version, options) => { - options = parseOptions(options) - - if (version instanceof SemVer) { - return version - } - - if (typeof version !== 'string') { - return null - } - - if (version.length > MAX_LENGTH) { - return null - } - - const r = options.loose ? re[t.LOOSE] : re[t.FULL] - if (!r.test(version)) { - return null - } - - try { - return new SemVer(version, options) - } catch (er) { - return null - } -} - -module.exports = parse - - -/***/ }), - -/***/ 6055: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const Range = __nccwpck_require__(9828) -const satisfies = (version, range, options) => { - try { - range = new Range(range, options) - } catch (er) { - return false - } - return range.test(version) -} -module.exports = satisfies - - -/***/ }), - -/***/ 2293: -/***/ ((module) => { - -// Note: this is the semver.org version of the spec that it implements -// Not necessarily the package version of this code. -const SEMVER_SPEC_VERSION = '2.0.0' - -const MAX_LENGTH = 256 -const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || - /* istanbul ignore next */ 9007199254740991 - -// Max safe segment length for coercion. -const MAX_SAFE_COMPONENT_LENGTH = 16 - -module.exports = { - SEMVER_SPEC_VERSION, - MAX_LENGTH, - MAX_SAFE_INTEGER, - MAX_SAFE_COMPONENT_LENGTH -} - - -/***/ }), - -/***/ 427: -/***/ ((module) => { - -const debug = ( - typeof process === 'object' && - process.env && - process.env.NODE_DEBUG && - /\bsemver\b/i.test(process.env.NODE_DEBUG) -) ? (...args) => console.error('SEMVER', ...args) - : () => {} - -module.exports = debug - - -/***/ }), - -/***/ 2463: -/***/ ((module) => { - -const numeric = /^[0-9]+$/ -const compareIdentifiers = (a, b) => { - const anum = numeric.test(a) - const bnum = numeric.test(b) - - if (anum && bnum) { - a = +a - b = +b - } - - return a === b ? 0 - : (anum && !bnum) ? -1 - : (bnum && !anum) ? 1 - : a < b ? -1 - : 1 -} - -const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a) - -module.exports = { - compareIdentifiers, - rcompareIdentifiers -} - - -/***/ }), - -/***/ 785: -/***/ ((module) => { - -// parse out just the options we care about so we always get a consistent -// obj with keys in a consistent order. -const opts = ['includePrerelease', 'loose', 'rtl'] -const parseOptions = options => - !options ? {} - : typeof options !== 'object' ? { loose: true } - : opts.filter(k => options[k]).reduce((options, k) => { - options[k] = true - return options - }, {}) -module.exports = parseOptions - - -/***/ }), - -/***/ 9523: -/***/ ((module, exports, __nccwpck_require__) => { - -const { MAX_SAFE_COMPONENT_LENGTH } = __nccwpck_require__(2293) -const debug = __nccwpck_require__(427) -exports = module.exports = {} - -// The actual regexps go on exports.re -const re = exports.re = [] -const src = exports.src = [] -const t = exports.t = {} -let R = 0 - -const createToken = (name, value, isGlobal) => { - const index = R++ - debug(index, value) - t[name] = index - src[index] = value - re[index] = new RegExp(value, isGlobal ? 'g' : undefined) -} - -// The following Regular Expressions can be used for tokenizing, -// validating, and parsing SemVer version strings. - -// ## Numeric Identifier -// A single `0`, or a non-zero digit followed by zero or more digits. - -createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*') -createToken('NUMERICIDENTIFIERLOOSE', '[0-9]+') - -// ## Non-numeric Identifier -// Zero or more digits, followed by a letter or hyphen, and then zero or -// more letters, digits, or hyphens. - -createToken('NONNUMERICIDENTIFIER', '\\d*[a-zA-Z-][a-zA-Z0-9-]*') - -// ## Main Version -// Three dot-separated numeric identifiers. - -createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})`) - -createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})`) - -// ## Pre-release Version Identifier -// A numeric identifier, or a non-numeric identifier. - -createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER] -}|${src[t.NONNUMERICIDENTIFIER]})`) - -createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE] -}|${src[t.NONNUMERICIDENTIFIER]})`) - -// ## Pre-release Version -// Hyphen, followed by one or more dot-separated pre-release version -// identifiers. - -createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER] -}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`) - -createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE] -}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`) - -// ## Build Metadata Identifier -// Any combination of digits, letters, or hyphens. - -createToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+') - -// ## Build Metadata -// Plus sign, followed by one or more period-separated build metadata -// identifiers. - -createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER] -}(?:\\.${src[t.BUILDIDENTIFIER]})*))`) - -// ## Full Version String -// A main version, followed optionally by a pre-release version and -// build metadata. - -// Note that the only major, minor, patch, and pre-release sections of -// the version string are capturing groups. The build metadata is not a -// capturing group, because it should not ever be used in version -// comparison. - -createToken('FULLPLAIN', `v?${src[t.MAINVERSION] -}${src[t.PRERELEASE]}?${ - src[t.BUILD]}?`) - -createToken('FULL', `^${src[t.FULLPLAIN]}$`) - -// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. -// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty -// common in the npm registry. -createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE] -}${src[t.PRERELEASELOOSE]}?${ - src[t.BUILD]}?`) - -createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`) - -createToken('GTLT', '((?:<|>)?=?)') - -// Something like "2.*" or "1.2.x". -// Note that "x.x" is a valid xRange identifer, meaning "any version" -// Only the first item is strictly required. -createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`) -createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`) - -createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:${src[t.PRERELEASE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:${src[t.PRERELEASELOOSE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`) -createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`) - -// Coercion. -// Extract anything that could conceivably be a part of a valid semver -createToken('COERCE', `${'(^|[^\\d])' + - '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + - `(?:$|[^\\d])`) -createToken('COERCERTL', src[t.COERCE], true) - -// Tilde ranges. -// Meaning is "reasonably at or greater than" -createToken('LONETILDE', '(?:~>?)') - -createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true) -exports.tildeTrimReplace = '$1~' - -createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`) -createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`) - -// Caret ranges. -// Meaning is "at least and backwards compatible with" -createToken('LONECARET', '(?:\\^)') - -createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true) -exports.caretTrimReplace = '$1^' - -createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`) -createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`) - -// A simple gt/lt/eq thing, or just "" to indicate "any version" -createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`) -createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`) - -// An expression to strip any whitespace between the gtlt and the thing -// it modifies, so that `> 1.2.3` ==> `>1.2.3` -createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT] -}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true) -exports.comparatorTrimReplace = '$1$2$3' - -// Something like `1.2.3 - 1.2.4` -// Note that these all use the loose form, because they'll be -// checked against either the strict or loose comparator form -// later. -createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAIN]})` + - `\\s*$`) - -createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAINLOOSE]})` + - `\\s*$`) - -// Star ranges basically just allow anything at all. -createToken('STAR', '(<|>)?=?\\s*\\*') -// >=0.0.0 is like a star -createToken('GTE0', '^\\s*>=\\s*0\.0\.0\\s*$') -createToken('GTE0PRE', '^\\s*>=\\s*0\.0\.0-0\\s*$') - - -/***/ }), - -/***/ 1196: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - - -// A linked list to keep track of recently-used-ness -const Yallist = __nccwpck_require__(220) - -const MAX = Symbol('max') -const LENGTH = Symbol('length') -const LENGTH_CALCULATOR = Symbol('lengthCalculator') -const ALLOW_STALE = Symbol('allowStale') -const MAX_AGE = Symbol('maxAge') -const DISPOSE = Symbol('dispose') -const NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet') -const LRU_LIST = Symbol('lruList') -const CACHE = Symbol('cache') -const UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet') - -const naiveLength = () => 1 - -// lruList is a yallist where the head is the youngest -// item, and the tail is the oldest. the list contains the Hit -// objects as the entries. -// Each Hit object has a reference to its Yallist.Node. This -// never changes. -// -// cache is a Map (or PseudoMap) that matches the keys to -// the Yallist.Node object. -class LRUCache { - constructor (options) { - if (typeof options === 'number') - options = { max: options } - - if (!options) - options = {} - - if (options.max && (typeof options.max !== 'number' || options.max < 0)) - throw new TypeError('max must be a non-negative number') - // Kind of weird to have a default max of Infinity, but oh well. - const max = this[MAX] = options.max || Infinity - - const lc = options.length || naiveLength - this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc - this[ALLOW_STALE] = options.stale || false - if (options.maxAge && typeof options.maxAge !== 'number') - throw new TypeError('maxAge must be a number') - this[MAX_AGE] = options.maxAge || 0 - this[DISPOSE] = options.dispose - this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false - this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false - this.reset() - } - - // resize the cache when the max changes. - set max (mL) { - if (typeof mL !== 'number' || mL < 0) - throw new TypeError('max must be a non-negative number') - - this[MAX] = mL || Infinity - trim(this) - } - get max () { - return this[MAX] - } - - set allowStale (allowStale) { - this[ALLOW_STALE] = !!allowStale - } - get allowStale () { - return this[ALLOW_STALE] - } - - set maxAge (mA) { - if (typeof mA !== 'number') - throw new TypeError('maxAge must be a non-negative number') - - this[MAX_AGE] = mA - trim(this) - } - get maxAge () { - return this[MAX_AGE] - } - - // resize the cache when the lengthCalculator changes. - set lengthCalculator (lC) { - if (typeof lC !== 'function') - lC = naiveLength - - if (lC !== this[LENGTH_CALCULATOR]) { - this[LENGTH_CALCULATOR] = lC - this[LENGTH] = 0 - this[LRU_LIST].forEach(hit => { - hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key) - this[LENGTH] += hit.length - }) - } - trim(this) - } - get lengthCalculator () { return this[LENGTH_CALCULATOR] } - - get length () { return this[LENGTH] } - get itemCount () { return this[LRU_LIST].length } - - rforEach (fn, thisp) { - thisp = thisp || this - for (let walker = this[LRU_LIST].tail; walker !== null;) { - const prev = walker.prev - forEachStep(this, fn, walker, thisp) - walker = prev - } - } - - forEach (fn, thisp) { - thisp = thisp || this - for (let walker = this[LRU_LIST].head; walker !== null;) { - const next = walker.next - forEachStep(this, fn, walker, thisp) - walker = next - } - } - - keys () { - return this[LRU_LIST].toArray().map(k => k.key) - } - - values () { - return this[LRU_LIST].toArray().map(k => k.value) - } - - reset () { - if (this[DISPOSE] && - this[LRU_LIST] && - this[LRU_LIST].length) { - this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value)) - } - - this[CACHE] = new Map() // hash of items by key - this[LRU_LIST] = new Yallist() // list of items in order of use recency - this[LENGTH] = 0 // length of items in the list - } - - dump () { - return this[LRU_LIST].map(hit => - isStale(this, hit) ? false : { - k: hit.key, - v: hit.value, - e: hit.now + (hit.maxAge || 0) - }).toArray().filter(h => h) - } - - dumpLru () { - return this[LRU_LIST] - } - - set (key, value, maxAge) { - maxAge = maxAge || this[MAX_AGE] - - if (maxAge && typeof maxAge !== 'number') - throw new TypeError('maxAge must be a number') - - const now = maxAge ? Date.now() : 0 - const len = this[LENGTH_CALCULATOR](value, key) - - if (this[CACHE].has(key)) { - if (len > this[MAX]) { - del(this, this[CACHE].get(key)) - return false - } - - const node = this[CACHE].get(key) - const item = node.value - - // dispose of the old one before overwriting - // split out into 2 ifs for better coverage tracking - if (this[DISPOSE]) { - if (!this[NO_DISPOSE_ON_SET]) - this[DISPOSE](key, item.value) - } - - item.now = now - item.maxAge = maxAge - item.value = value - this[LENGTH] += len - item.length - item.length = len - this.get(key) - trim(this) - return true - } - - const hit = new Entry(key, value, len, now, maxAge) - - // oversized objects fall out of cache automatically. - if (hit.length > this[MAX]) { - if (this[DISPOSE]) - this[DISPOSE](key, value) - - return false - } - - this[LENGTH] += hit.length - this[LRU_LIST].unshift(hit) - this[CACHE].set(key, this[LRU_LIST].head) - trim(this) - return true - } - - has (key) { - if (!this[CACHE].has(key)) return false - const hit = this[CACHE].get(key).value - return !isStale(this, hit) - } - - get (key) { - return get(this, key, true) - } - - peek (key) { - return get(this, key, false) - } - - pop () { - const node = this[LRU_LIST].tail - if (!node) - return null - - del(this, node) - return node.value - } - - del (key) { - del(this, this[CACHE].get(key)) - } - - load (arr) { - // reset the cache - this.reset() - - const now = Date.now() - // A previous serialized cache has the most recent items first - for (let l = arr.length - 1; l >= 0; l--) { - const hit = arr[l] - const expiresAt = hit.e || 0 - if (expiresAt === 0) - // the item was created without expiration in a non aged cache - this.set(hit.k, hit.v) - else { - const maxAge = expiresAt - now - // dont add already expired items - if (maxAge > 0) { - this.set(hit.k, hit.v, maxAge) - } - } - } - } - - prune () { - this[CACHE].forEach((value, key) => get(this, key, false)) - } -} - -const get = (self, key, doUse) => { - const node = self[CACHE].get(key) - if (node) { - const hit = node.value - if (isStale(self, hit)) { - del(self, node) - if (!self[ALLOW_STALE]) - return undefined - } else { - if (doUse) { - if (self[UPDATE_AGE_ON_GET]) - node.value.now = Date.now() - self[LRU_LIST].unshiftNode(node) - } - } - return hit.value - } -} - -const isStale = (self, hit) => { - if (!hit || (!hit.maxAge && !self[MAX_AGE])) - return false - - const diff = Date.now() - hit.now - return hit.maxAge ? diff > hit.maxAge - : self[MAX_AGE] && (diff > self[MAX_AGE]) -} - -const trim = self => { - if (self[LENGTH] > self[MAX]) { - for (let walker = self[LRU_LIST].tail; - self[LENGTH] > self[MAX] && walker !== null;) { - // We know that we're about to delete this one, and also - // what the next least recently used key will be, so just - // go ahead and set it now. - const prev = walker.prev - del(self, walker) - walker = prev - } - } -} - -const del = (self, node) => { - if (node) { - const hit = node.value - if (self[DISPOSE]) - self[DISPOSE](hit.key, hit.value) - - self[LENGTH] -= hit.length - self[CACHE].delete(hit.key) - self[LRU_LIST].removeNode(node) - } -} - -class Entry { - constructor (key, value, length, now, maxAge) { - this.key = key - this.value = value - this.length = length - this.now = now - this.maxAge = maxAge || 0 - } -} - -const forEachStep = (self, fn, node, thisp) => { - let hit = node.value - if (isStale(self, hit)) { - del(self, node) - if (!self[ALLOW_STALE]) - hit = undefined - } - if (hit) - fn.call(thisp, hit.value, hit.key, self) -} - -module.exports = LRUCache - - -/***/ }), - -/***/ 5327: -/***/ ((module) => { - -"use strict"; - -module.exports = function (Yallist) { - Yallist.prototype[Symbol.iterator] = function* () { - for (let walker = this.head; walker; walker = walker.next) { - yield walker.value - } - } -} - - -/***/ }), - -/***/ 220: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - -module.exports = Yallist - -Yallist.Node = Node -Yallist.create = Yallist - -function Yallist (list) { - var self = this - if (!(self instanceof Yallist)) { - self = new Yallist() - } - - self.tail = null - self.head = null - self.length = 0 - - if (list && typeof list.forEach === 'function') { - list.forEach(function (item) { - self.push(item) - }) - } else if (arguments.length > 0) { - for (var i = 0, l = arguments.length; i < l; i++) { - self.push(arguments[i]) - } - } - - return self -} - -Yallist.prototype.removeNode = function (node) { - if (node.list !== this) { - throw new Error('removing node which does not belong to this list') - } - - var next = node.next - var prev = node.prev - - if (next) { - next.prev = prev - } - - if (prev) { - prev.next = next - } - - if (node === this.head) { - this.head = next - } - if (node === this.tail) { - this.tail = prev - } - - node.list.length-- - node.next = null - node.prev = null - node.list = null - - return next -} - -Yallist.prototype.unshiftNode = function (node) { - if (node === this.head) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var head = this.head - node.list = this - node.next = head - if (head) { - head.prev = node - } - - this.head = node - if (!this.tail) { - this.tail = node - } - this.length++ -} - -Yallist.prototype.pushNode = function (node) { - if (node === this.tail) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var tail = this.tail - node.list = this - node.prev = tail - if (tail) { - tail.next = node - } - - this.tail = node - if (!this.head) { - this.head = node - } - this.length++ -} - -Yallist.prototype.push = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - push(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.unshift = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - unshift(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.pop = function () { - if (!this.tail) { - return undefined - } - - var res = this.tail.value - this.tail = this.tail.prev - if (this.tail) { - this.tail.next = null - } else { - this.head = null - } - this.length-- - return res -} - -Yallist.prototype.shift = function () { - if (!this.head) { - return undefined - } - - var res = this.head.value - this.head = this.head.next - if (this.head) { - this.head.prev = null - } else { - this.tail = null - } - this.length-- - return res -} - -Yallist.prototype.forEach = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.head, i = 0; walker !== null; i++) { - fn.call(thisp, walker.value, i, this) - walker = walker.next - } -} - -Yallist.prototype.forEachReverse = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.tail, i = this.length - 1; walker !== null; i--) { - fn.call(thisp, walker.value, i, this) - walker = walker.prev - } -} - -Yallist.prototype.get = function (n) { - for (var i = 0, walker = this.head; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.next - } - if (i === n && walker !== null) { - return walker.value - } -} - -Yallist.prototype.getReverse = function (n) { - for (var i = 0, walker = this.tail; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.prev - } - if (i === n && walker !== null) { - return walker.value - } -} - -Yallist.prototype.map = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.head; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.next - } - return res -} - -Yallist.prototype.mapReverse = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.tail; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.prev - } - return res -} - -Yallist.prototype.reduce = function (fn, initial) { - var acc - var walker = this.head - if (arguments.length > 1) { - acc = initial - } else if (this.head) { - walker = this.head.next - acc = this.head.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } - - for (var i = 0; walker !== null; i++) { - acc = fn(acc, walker.value, i) - walker = walker.next - } - - return acc -} - -Yallist.prototype.reduceReverse = function (fn, initial) { - var acc - var walker = this.tail - if (arguments.length > 1) { - acc = initial - } else if (this.tail) { - walker = this.tail.prev - acc = this.tail.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } - - for (var i = this.length - 1; walker !== null; i--) { - acc = fn(acc, walker.value, i) - walker = walker.prev - } - - return acc -} - -Yallist.prototype.toArray = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.head; walker !== null; i++) { - arr[i] = walker.value - walker = walker.next - } - return arr -} - -Yallist.prototype.toArrayReverse = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.tail; walker !== null; i++) { - arr[i] = walker.value - walker = walker.prev - } - return arr -} - -Yallist.prototype.slice = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = 0, walker = this.head; walker !== null && i < from; i++) { - walker = walker.next - } - for (; walker !== null && i < to; i++, walker = walker.next) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.sliceReverse = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) { - walker = walker.prev - } - for (; walker !== null && i > from; i--, walker = walker.prev) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.splice = function (start, deleteCount, ...nodes) { - if (start > this.length) { - start = this.length - 1 - } - if (start < 0) { - start = this.length + start; - } - - for (var i = 0, walker = this.head; walker !== null && i < start; i++) { - walker = walker.next - } - - var ret = [] - for (var i = 0; walker && i < deleteCount; i++) { - ret.push(walker.value) - walker = this.removeNode(walker) - } - if (walker === null) { - walker = this.tail - } - - if (walker !== this.head && walker !== this.tail) { - walker = walker.prev - } - - for (var i = 0; i < nodes.length; i++) { - walker = insert(this, walker, nodes[i]) - } - return ret; -} - -Yallist.prototype.reverse = function () { - var head = this.head - var tail = this.tail - for (var walker = head; walker !== null; walker = walker.prev) { - var p = walker.prev - walker.prev = walker.next - walker.next = p - } - this.head = tail - this.tail = head - return this -} - -function insert (self, node, value) { - var inserted = node === self.head ? - new Node(value, null, node, self) : - new Node(value, node, node.next, self) - - if (inserted.next === null) { - self.tail = inserted - } - if (inserted.prev === null) { - self.head = inserted - } - - self.length++ - - return inserted -} - -function push (self, item) { - self.tail = new Node(item, self.tail, null, self) - if (!self.head) { - self.head = self.tail - } - self.length++ -} - -function unshift (self, item) { - self.head = new Node(item, null, self.head, self) - if (!self.tail) { - self.tail = self.head - } - self.length++ -} - -function Node (value, prev, next, list) { - if (!(this instanceof Node)) { - return new Node(value, prev, next, list) - } - - this.list = list - this.value = value - - if (prev) { - prev.next = this - this.prev = prev - } else { - this.prev = null - } - - if (next) { - next.prev = this - this.next = next - } else { - this.next = null - } -} - -try { - // add if support for Symbol.iterator is present - __nccwpck_require__(5327)(Yallist) -} catch (er) {} - - /***/ }), /***/ 4294: diff --git a/.github/actions/isStagingDeployLocked/index.js b/.github/actions/isStagingDeployLocked/index.js index 1d69f1088302..d3e79e56dacf 100644 --- a/.github/actions/isStagingDeployLocked/index.js +++ b/.github/actions/isStagingDeployLocked/index.js @@ -42,8 +42,6 @@ module.exports = run; const _ = __nccwpck_require__(4987); const lodashGet = __nccwpck_require__(6908); -const semverParse = __nccwpck_require__(5925); -const semverSatisfies = __nccwpck_require__(6055); const GITHUB_OWNER = 'Expensify'; const EXPENSIFY_CASH_REPO = 'Expensify.cash'; @@ -104,11 +102,6 @@ class GithubUtils { try { const versionRegex = new RegExp('([0-9]+)\\.([0-9]+)\\.([0-9]+)(?:-([0-9]+))?', 'g'); const tag = issue.body.match(versionRegex)[0].replace(/`/g, ''); - - // eslint-disable-next-line max-len - const compareURLRegex = new RegExp(`${EXPENSIFY_CASH_URL}/compare/${versionRegex.source}\\.\\.\\.${versionRegex.source}`, 'g'); - const comparisonURL = issue.body.match(compareURLRegex)[0]; - return { title: issue.title, url: issue.url, @@ -116,7 +109,6 @@ class GithubUtils { PRList: this.getStagingDeployCashPRList(issue), deployBlockers: this.getStagingDeployCashDeployBlockers(issue), tag, - comparisonURL, }; } catch (exception) { throw new Error(`Unable to find ${STAGING_DEPLOY_CASH_LABEL} issue with correct data.`); @@ -191,71 +183,6 @@ class GithubUtils { ); } - /** - * Generate a comparison URL between two versions following the semverLevel passed - * - * @param {String} repoSlug - The slug of the repository: / - * @param {String} tag - The tag to compare first the previous semverLevel - * @param {String} semverLevel - The semantic versioning MAJOR, MINOR, PATCH and BUILD - * @return {Promise} the url generated - * @throws {Error} If the request to the Github API fails. - */ - generateVersionComparisonURL(repoSlug, tag, semverLevel) { - return new Promise((resolve, reject) => { - const getComparisonURL = (previousTag, currentTag) => ( - `${EXPENSIFY_CASH_URL}/compare/${previousTag}...${currentTag}` - ); - - const [repoOwner, repoName] = repoSlug.split('/'); - const tagSemver = semverParse(tag); - - return this.octokit.repos.listTags({ - owner: repoOwner, - repo: repoName, - }) - .then(githubResponse => githubResponse.data.some(({name: repoTag}) => { - if (semverLevel === 'MAJOR' - && semverSatisfies(repoTag, `<${tagSemver.major}.x.x`, {includePrerelease: true}) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'MINOR' - && semverSatisfies( - repoTag, - `<${tagSemver.major}.${tagSemver.minor}.x`, - {includePrerelease: true}, - ) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'PATCH' - && semverSatisfies(repoTag, `<${tagSemver}`, {includePrerelease: true}) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'BUILD' - && repoTag !== tagSemver.version - && semverSatisfies( - repoTag, - `<=${tagSemver.major}.${tagSemver.minor}.${tagSemver.patch}`, - {includePrerelease: true}, - ) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - return false; - })) - .catch(githubError => reject(githubError)); - }); - } - /** * Creates a new StagingDeployCash issue. * @@ -351,22 +278,16 @@ class GithubUtils { deployBlockers = [], resolvedDeployBlockers = [], ) { - return Promise.all([ - this.generateVersionComparisonURL(`${GITHUB_OWNER}/${EXPENSIFY_CASH_REPO}`, tag, 'PATCH'), - this.octokit.pulls.list({ - owner: GITHUB_OWNER, - repo: EXPENSIFY_CASH_REPO, - per_page: 100, - }), - ]) - .then(results => ({ - comparisonURL: results[0], - automergePRs: _.map( - _.filter(results[1].data, GithubUtils.isAutomergePullRequest), + return this.octokit.pulls.list({ + owner: GITHUB_OWNER, + repo: EXPENSIFY_CASH_REPO, + per_page: 100, + }) + .then(({data}) => { + const automergePRs = _.pluck( + _.filter(data, GithubUtils.isAutomergePullRequest), 'html_url', - ), - })) - .then(({comparisonURL, automergePRs}) => { + ); const sortedPRList = _.chain(PRList) .difference(automergePRs) .unique() @@ -378,8 +299,8 @@ class GithubUtils { ); // Tag version and comparison URL - let issueBody = `**Release Version:** \`${tag}\`\r\n`; - issueBody += `**Compare Changes:** ${comparisonURL}\r\n`; + // eslint-disable-next-line max-len + let issueBody = `**Release Version:** \`${tag}\`\r\n**Compare Changes:** https://github.com/Expensify/Expensify.cash/compare/production...staging\r\n`; // PR list if (!_.isEmpty(PRList)) { @@ -400,11 +321,13 @@ class GithubUtils { } issueBody += '\r\ncc @Expensify/applauseleads\r\n'; - return issueBody; }) - // eslint-disable-next-line no-console - .catch(err => console.warn('Error generating comparison URL, continuing...', err)); + .catch(err => console.warn( + 'Error generating StagingDeployCash issue body!', + 'Automerge PRs may not be properly filtered out. Continuing...', + err, + )); } /** @@ -10750,2212 +10673,6 @@ if (!safer.constants) { module.exports = safer -/***/ }), - -/***/ 1532: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const ANY = Symbol('SemVer ANY') -// hoisted class for cyclic dependency -class Comparator { - static get ANY () { - return ANY - } - constructor (comp, options) { - options = parseOptions(options) - - if (comp instanceof Comparator) { - if (comp.loose === !!options.loose) { - return comp - } else { - comp = comp.value - } - } - - debug('comparator', comp, options) - this.options = options - this.loose = !!options.loose - this.parse(comp) - - if (this.semver === ANY) { - this.value = '' - } else { - this.value = this.operator + this.semver.version - } - - debug('comp', this) - } - - parse (comp) { - const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] - const m = comp.match(r) - - if (!m) { - throw new TypeError(`Invalid comparator: ${comp}`) - } - - this.operator = m[1] !== undefined ? m[1] : '' - if (this.operator === '=') { - this.operator = '' - } - - // if it literally is just '>' or '' then allow anything. - if (!m[2]) { - this.semver = ANY - } else { - this.semver = new SemVer(m[2], this.options.loose) - } - } - - toString () { - return this.value - } - - test (version) { - debug('Comparator.test', version, this.options.loose) - - if (this.semver === ANY || version === ANY) { - return true - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - return cmp(version, this.operator, this.semver, this.options) - } - - intersects (comp, options) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required') - } - - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - if (this.operator === '') { - if (this.value === '') { - return true - } - return new Range(comp.value, options).test(this.value) - } else if (comp.operator === '') { - if (comp.value === '') { - return true - } - return new Range(this.value, options).test(comp.semver) - } - - const sameDirectionIncreasing = - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '>=' || comp.operator === '>') - const sameDirectionDecreasing = - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '<=' || comp.operator === '<') - const sameSemVer = this.semver.version === comp.semver.version - const differentDirectionsInclusive = - (this.operator === '>=' || this.operator === '<=') && - (comp.operator === '>=' || comp.operator === '<=') - const oppositeDirectionsLessThan = - cmp(this.semver, '<', comp.semver, options) && - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '<=' || comp.operator === '<') - const oppositeDirectionsGreaterThan = - cmp(this.semver, '>', comp.semver, options) && - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '>=' || comp.operator === '>') - - return ( - sameDirectionIncreasing || - sameDirectionDecreasing || - (sameSemVer && differentDirectionsInclusive) || - oppositeDirectionsLessThan || - oppositeDirectionsGreaterThan - ) - } -} - -module.exports = Comparator - -const parseOptions = __nccwpck_require__(785) -const {re, t} = __nccwpck_require__(9523) -const cmp = __nccwpck_require__(5098) -const debug = __nccwpck_require__(427) -const SemVer = __nccwpck_require__(8088) -const Range = __nccwpck_require__(9828) - - -/***/ }), - -/***/ 9828: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -// hoisted class for cyclic dependency -class Range { - constructor (range, options) { - options = parseOptions(options) - - if (range instanceof Range) { - if ( - range.loose === !!options.loose && - range.includePrerelease === !!options.includePrerelease - ) { - return range - } else { - return new Range(range.raw, options) - } - } - - if (range instanceof Comparator) { - // just put it in the set and return - this.raw = range.value - this.set = [[range]] - this.format() - return this - } - - this.options = options - this.loose = !!options.loose - this.includePrerelease = !!options.includePrerelease - - // First, split based on boolean or || - this.raw = range - this.set = range - .split(/\s*\|\|\s*/) - // map the range to a 2d array of comparators - .map(range => this.parseRange(range.trim())) - // throw out any comparator lists that are empty - // this generally means that it was not a valid range, which is allowed - // in loose mode, but will still throw if the WHOLE range is invalid. - .filter(c => c.length) - - if (!this.set.length) { - throw new TypeError(`Invalid SemVer Range: ${range}`) - } - - // if we have any that are not the null set, throw out null sets. - if (this.set.length > 1) { - // keep the first one, in case they're all null sets - const first = this.set[0] - this.set = this.set.filter(c => !isNullSet(c[0])) - if (this.set.length === 0) - this.set = [first] - else if (this.set.length > 1) { - // if we have any that are *, then the range is just * - for (const c of this.set) { - if (c.length === 1 && isAny(c[0])) { - this.set = [c] - break - } - } - } - } - - this.format() - } - - format () { - this.range = this.set - .map((comps) => { - return comps.join(' ').trim() - }) - .join('||') - .trim() - return this.range - } - - toString () { - return this.range - } - - parseRange (range) { - range = range.trim() - - // memoize range parsing for performance. - // this is a very hot path, and fully deterministic. - const memoOpts = Object.keys(this.options).join(',') - const memoKey = `parseRange:${memoOpts}:${range}` - const cached = cache.get(memoKey) - if (cached) - return cached - - const loose = this.options.loose - // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` - const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE] - range = range.replace(hr, hyphenReplace(this.options.includePrerelease)) - debug('hyphen replace', range) - // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` - range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace) - debug('comparator trim', range, re[t.COMPARATORTRIM]) - - // `~ 1.2.3` => `~1.2.3` - range = range.replace(re[t.TILDETRIM], tildeTrimReplace) - - // `^ 1.2.3` => `^1.2.3` - range = range.replace(re[t.CARETTRIM], caretTrimReplace) - - // normalize spaces - range = range.split(/\s+/).join(' ') - - // At this point, the range is completely trimmed and - // ready to be split into comparators. - - const compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] - const rangeList = range - .split(' ') - .map(comp => parseComparator(comp, this.options)) - .join(' ') - .split(/\s+/) - // >=0.0.0 is equivalent to * - .map(comp => replaceGTE0(comp, this.options)) - // in loose mode, throw out any that are not valid comparators - .filter(this.options.loose ? comp => !!comp.match(compRe) : () => true) - .map(comp => new Comparator(comp, this.options)) - - // if any comparators are the null set, then replace with JUST null set - // if more than one comparator, remove any * comparators - // also, don't include the same comparator more than once - const l = rangeList.length - const rangeMap = new Map() - for (const comp of rangeList) { - if (isNullSet(comp)) - return [comp] - rangeMap.set(comp.value, comp) - } - if (rangeMap.size > 1 && rangeMap.has('')) - rangeMap.delete('') - - const result = [...rangeMap.values()] - cache.set(memoKey, result) - return result - } - - intersects (range, options) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required') - } - - return this.set.some((thisComparators) => { - return ( - isSatisfiable(thisComparators, options) && - range.set.some((rangeComparators) => { - return ( - isSatisfiable(rangeComparators, options) && - thisComparators.every((thisComparator) => { - return rangeComparators.every((rangeComparator) => { - return thisComparator.intersects(rangeComparator, options) - }) - }) - ) - }) - ) - }) - } - - // if ANY of the sets match ALL of its comparators, then pass - test (version) { - if (!version) { - return false - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - for (let i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version, this.options)) { - return true - } - } - return false - } -} -module.exports = Range - -const LRU = __nccwpck_require__(1196) -const cache = new LRU({ max: 1000 }) - -const parseOptions = __nccwpck_require__(785) -const Comparator = __nccwpck_require__(1532) -const debug = __nccwpck_require__(427) -const SemVer = __nccwpck_require__(8088) -const { - re, - t, - comparatorTrimReplace, - tildeTrimReplace, - caretTrimReplace -} = __nccwpck_require__(9523) - -const isNullSet = c => c.value === '<0.0.0-0' -const isAny = c => c.value === '' - -// take a set of comparators and determine whether there -// exists a version which can satisfy it -const isSatisfiable = (comparators, options) => { - let result = true - const remainingComparators = comparators.slice() - let testComparator = remainingComparators.pop() - - while (result && remainingComparators.length) { - result = remainingComparators.every((otherComparator) => { - return testComparator.intersects(otherComparator, options) - }) - - testComparator = remainingComparators.pop() - } - - return result -} - -// comprised of xranges, tildes, stars, and gtlt's at this point. -// already replaced the hyphen ranges -// turn into a set of JUST comparators. -const parseComparator = (comp, options) => { - debug('comp', comp, options) - comp = replaceCarets(comp, options) - debug('caret', comp) - comp = replaceTildes(comp, options) - debug('tildes', comp) - comp = replaceXRanges(comp, options) - debug('xrange', comp) - comp = replaceStars(comp, options) - debug('stars', comp) - return comp -} - -const isX = id => !id || id.toLowerCase() === 'x' || id === '*' - -// ~, ~> --> * (any, kinda silly) -// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0 -// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0 -// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0 -// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0 -// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0 -const replaceTildes = (comp, options) => - comp.trim().split(/\s+/).map((comp) => { - return replaceTilde(comp, options) - }).join(' ') - -const replaceTilde = (comp, options) => { - const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] - return comp.replace(r, (_, M, m, p, pr) => { - debug('tilde', comp, _, M, m, p, pr) - let ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = `>=${M}.0.0 <${+M + 1}.0.0-0` - } else if (isX(p)) { - // ~1.2 == >=1.2.0 <1.3.0-0 - ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0` - } else if (pr) { - debug('replaceTilde pr', pr) - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${+m + 1}.0-0` - } else { - // ~1.2.3 == >=1.2.3 <1.3.0-0 - ret = `>=${M}.${m}.${p - } <${M}.${+m + 1}.0-0` - } - - debug('tilde return', ret) - return ret - }) -} - -// ^ --> * (any, kinda silly) -// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0 -// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0 -// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0 -// ^1.2.3 --> >=1.2.3 <2.0.0-0 -// ^1.2.0 --> >=1.2.0 <2.0.0-0 -const replaceCarets = (comp, options) => - comp.trim().split(/\s+/).map((comp) => { - return replaceCaret(comp, options) - }).join(' ') - -const replaceCaret = (comp, options) => { - debug('caret', comp, options) - const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET] - const z = options.includePrerelease ? '-0' : '' - return comp.replace(r, (_, M, m, p, pr) => { - debug('caret', comp, _, M, m, p, pr) - let ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0` - } else if (isX(p)) { - if (M === '0') { - ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0` - } else { - ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0` - } - } else if (pr) { - debug('replaceCaret pr', pr) - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${m}.${+p + 1}-0` - } else { - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${+m + 1}.0-0` - } - } else { - ret = `>=${M}.${m}.${p}-${pr - } <${+M + 1}.0.0-0` - } - } else { - debug('no pr') - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p - }${z} <${M}.${m}.${+p + 1}-0` - } else { - ret = `>=${M}.${m}.${p - }${z} <${M}.${+m + 1}.0-0` - } - } else { - ret = `>=${M}.${m}.${p - } <${+M + 1}.0.0-0` - } - } - - debug('caret return', ret) - return ret - }) -} - -const replaceXRanges = (comp, options) => { - debug('replaceXRanges', comp, options) - return comp.split(/\s+/).map((comp) => { - return replaceXRange(comp, options) - }).join(' ') -} - -const replaceXRange = (comp, options) => { - comp = comp.trim() - const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE] - return comp.replace(r, (ret, gtlt, M, m, p, pr) => { - debug('xRange', comp, ret, gtlt, M, m, p, pr) - const xM = isX(M) - const xm = xM || isX(m) - const xp = xm || isX(p) - const anyX = xp - - if (gtlt === '=' && anyX) { - gtlt = '' - } - - // if we're including prereleases in the match, then we need - // to fix this to -0, the lowest possible prerelease value - pr = options.includePrerelease ? '-0' : '' - - if (xM) { - if (gtlt === '>' || gtlt === '<') { - // nothing is allowed - ret = '<0.0.0-0' - } else { - // nothing is forbidden - ret = '*' - } - } else if (gtlt && anyX) { - // we know patch is an x, because we have any x at all. - // replace X with 0 - if (xm) { - m = 0 - } - p = 0 - - if (gtlt === '>') { - // >1 => >=2.0.0 - // >1.2 => >=1.3.0 - gtlt = '>=' - if (xm) { - M = +M + 1 - m = 0 - p = 0 - } else { - m = +m + 1 - p = 0 - } - } else if (gtlt === '<=') { - // <=0.7.x is actually <0.8.0, since any 0.7.x should - // pass. Similarly, <=7.x is actually <8.0.0, etc. - gtlt = '<' - if (xm) { - M = +M + 1 - } else { - m = +m + 1 - } - } - - if (gtlt === '<') - pr = '-0' - - ret = `${gtlt + M}.${m}.${p}${pr}` - } else if (xm) { - ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0` - } else if (xp) { - ret = `>=${M}.${m}.0${pr - } <${M}.${+m + 1}.0-0` - } - - debug('xRange return', ret) - - return ret - }) -} - -// Because * is AND-ed with everything else in the comparator, -// and '' means "any version", just remove the *s entirely. -const replaceStars = (comp, options) => { - debug('replaceStars', comp, options) - // Looseness is ignored here. star is always as loose as it gets! - return comp.trim().replace(re[t.STAR], '') -} - -const replaceGTE0 = (comp, options) => { - debug('replaceGTE0', comp, options) - return comp.trim() - .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '') -} - -// This function is passed to string.replace(re[t.HYPHENRANGE]) -// M, m, patch, prerelease, build -// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 -// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do -// 1.2 - 3.4 => >=1.2.0 <3.5.0-0 -const hyphenReplace = incPr => ($0, - from, fM, fm, fp, fpr, fb, - to, tM, tm, tp, tpr, tb) => { - if (isX(fM)) { - from = '' - } else if (isX(fm)) { - from = `>=${fM}.0.0${incPr ? '-0' : ''}` - } else if (isX(fp)) { - from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}` - } else if (fpr) { - from = `>=${from}` - } else { - from = `>=${from}${incPr ? '-0' : ''}` - } - - if (isX(tM)) { - to = '' - } else if (isX(tm)) { - to = `<${+tM + 1}.0.0-0` - } else if (isX(tp)) { - to = `<${tM}.${+tm + 1}.0-0` - } else if (tpr) { - to = `<=${tM}.${tm}.${tp}-${tpr}` - } else if (incPr) { - to = `<${tM}.${tm}.${+tp + 1}-0` - } else { - to = `<=${to}` - } - - return (`${from} ${to}`).trim() -} - -const testSet = (set, version, options) => { - for (let i = 0; i < set.length; i++) { - if (!set[i].test(version)) { - return false - } - } - - if (version.prerelease.length && !options.includePrerelease) { - // Find the set of versions that are allowed to have prereleases - // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 - // That should allow `1.2.3-pr.2` to pass. - // However, `1.2.4-alpha.notready` should NOT be allowed, - // even though it's within the range set by the comparators. - for (let i = 0; i < set.length; i++) { - debug(set[i].semver) - if (set[i].semver === Comparator.ANY) { - continue - } - - if (set[i].semver.prerelease.length > 0) { - const allowed = set[i].semver - if (allowed.major === version.major && - allowed.minor === version.minor && - allowed.patch === version.patch) { - return true - } - } - } - - // Version has a -pre, but it's not one of the ones we like. - return false - } - - return true -} - - -/***/ }), - -/***/ 8088: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const debug = __nccwpck_require__(427) -const { MAX_LENGTH, MAX_SAFE_INTEGER } = __nccwpck_require__(2293) -const { re, t } = __nccwpck_require__(9523) - -const parseOptions = __nccwpck_require__(785) -const { compareIdentifiers } = __nccwpck_require__(2463) -class SemVer { - constructor (version, options) { - options = parseOptions(options) - - if (version instanceof SemVer) { - if (version.loose === !!options.loose && - version.includePrerelease === !!options.includePrerelease) { - return version - } else { - version = version.version - } - } else if (typeof version !== 'string') { - throw new TypeError(`Invalid Version: ${version}`) - } - - if (version.length > MAX_LENGTH) { - throw new TypeError( - `version is longer than ${MAX_LENGTH} characters` - ) - } - - debug('SemVer', version, options) - this.options = options - this.loose = !!options.loose - // this isn't actually relevant for versions, but keep it so that we - // don't run into trouble passing this.options around. - this.includePrerelease = !!options.includePrerelease - - const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]) - - if (!m) { - throw new TypeError(`Invalid Version: ${version}`) - } - - this.raw = version - - // these are actually numbers - this.major = +m[1] - this.minor = +m[2] - this.patch = +m[3] - - if (this.major > MAX_SAFE_INTEGER || this.major < 0) { - throw new TypeError('Invalid major version') - } - - if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { - throw new TypeError('Invalid minor version') - } - - if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { - throw new TypeError('Invalid patch version') - } - - // numberify any prerelease numeric ids - if (!m[4]) { - this.prerelease = [] - } else { - this.prerelease = m[4].split('.').map((id) => { - if (/^[0-9]+$/.test(id)) { - const num = +id - if (num >= 0 && num < MAX_SAFE_INTEGER) { - return num - } - } - return id - }) - } - - this.build = m[5] ? m[5].split('.') : [] - this.format() - } - - format () { - this.version = `${this.major}.${this.minor}.${this.patch}` - if (this.prerelease.length) { - this.version += `-${this.prerelease.join('.')}` - } - return this.version - } - - toString () { - return this.version - } - - compare (other) { - debug('SemVer.compare', this.version, this.options, other) - if (!(other instanceof SemVer)) { - if (typeof other === 'string' && other === this.version) { - return 0 - } - other = new SemVer(other, this.options) - } - - if (other.version === this.version) { - return 0 - } - - return this.compareMain(other) || this.comparePre(other) - } - - compareMain (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - return ( - compareIdentifiers(this.major, other.major) || - compareIdentifiers(this.minor, other.minor) || - compareIdentifiers(this.patch, other.patch) - ) - } - - comparePre (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - // NOT having a prerelease is > having one - if (this.prerelease.length && !other.prerelease.length) { - return -1 - } else if (!this.prerelease.length && other.prerelease.length) { - return 1 - } else if (!this.prerelease.length && !other.prerelease.length) { - return 0 - } - - let i = 0 - do { - const a = this.prerelease[i] - const b = other.prerelease[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - } - - compareBuild (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - let i = 0 - do { - const a = this.build[i] - const b = other.build[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - } - - // preminor will bump the version up to the next minor release, and immediately - // down to pre-release. premajor and prepatch work the same way. - inc (release, identifier) { - switch (release) { - case 'premajor': - this.prerelease.length = 0 - this.patch = 0 - this.minor = 0 - this.major++ - this.inc('pre', identifier) - break - case 'preminor': - this.prerelease.length = 0 - this.patch = 0 - this.minor++ - this.inc('pre', identifier) - break - case 'prepatch': - // If this is already a prerelease, it will bump to the next version - // drop any prereleases that might already exist, since they are not - // relevant at this point. - this.prerelease.length = 0 - this.inc('patch', identifier) - this.inc('pre', identifier) - break - // If the input is a non-prerelease version, this acts the same as - // prepatch. - case 'prerelease': - if (this.prerelease.length === 0) { - this.inc('patch', identifier) - } - this.inc('pre', identifier) - break - - case 'major': - // If this is a pre-major version, bump up to the same major version. - // Otherwise increment major. - // 1.0.0-5 bumps to 1.0.0 - // 1.1.0 bumps to 2.0.0 - if ( - this.minor !== 0 || - this.patch !== 0 || - this.prerelease.length === 0 - ) { - this.major++ - } - this.minor = 0 - this.patch = 0 - this.prerelease = [] - break - case 'minor': - // If this is a pre-minor version, bump up to the same minor version. - // Otherwise increment minor. - // 1.2.0-5 bumps to 1.2.0 - // 1.2.1 bumps to 1.3.0 - if (this.patch !== 0 || this.prerelease.length === 0) { - this.minor++ - } - this.patch = 0 - this.prerelease = [] - break - case 'patch': - // If this is not a pre-release version, it will increment the patch. - // If it is a pre-release it will bump up to the same patch version. - // 1.2.0-5 patches to 1.2.0 - // 1.2.0 patches to 1.2.1 - if (this.prerelease.length === 0) { - this.patch++ - } - this.prerelease = [] - break - // This probably shouldn't be used publicly. - // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction. - case 'pre': - if (this.prerelease.length === 0) { - this.prerelease = [0] - } else { - let i = this.prerelease.length - while (--i >= 0) { - if (typeof this.prerelease[i] === 'number') { - this.prerelease[i]++ - i = -2 - } - } - if (i === -1) { - // didn't increment anything - this.prerelease.push(0) - } - } - if (identifier) { - // 1.2.0-beta.1 bumps to 1.2.0-beta.2, - // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 - if (this.prerelease[0] === identifier) { - if (isNaN(this.prerelease[1])) { - this.prerelease = [identifier, 0] - } - } else { - this.prerelease = [identifier, 0] - } - } - break - - default: - throw new Error(`invalid increment argument: ${release}`) - } - this.format() - this.raw = this.version - return this - } -} - -module.exports = SemVer - - -/***/ }), - -/***/ 5098: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const eq = __nccwpck_require__(1898) -const neq = __nccwpck_require__(6017) -const gt = __nccwpck_require__(4123) -const gte = __nccwpck_require__(5522) -const lt = __nccwpck_require__(194) -const lte = __nccwpck_require__(7520) - -const cmp = (a, op, b, loose) => { - switch (op) { - case '===': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a === b - - case '!==': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a !== b - - case '': - case '=': - case '==': - return eq(a, b, loose) - - case '!=': - return neq(a, b, loose) - - case '>': - return gt(a, b, loose) - - case '>=': - return gte(a, b, loose) - - case '<': - return lt(a, b, loose) - - case '<=': - return lte(a, b, loose) - - default: - throw new TypeError(`Invalid operator: ${op}`) - } -} -module.exports = cmp - - -/***/ }), - -/***/ 4309: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const SemVer = __nccwpck_require__(8088) -const compare = (a, b, loose) => - new SemVer(a, loose).compare(new SemVer(b, loose)) - -module.exports = compare - - -/***/ }), - -/***/ 1898: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const eq = (a, b, loose) => compare(a, b, loose) === 0 -module.exports = eq - - -/***/ }), - -/***/ 4123: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const gt = (a, b, loose) => compare(a, b, loose) > 0 -module.exports = gt - - -/***/ }), - -/***/ 5522: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const gte = (a, b, loose) => compare(a, b, loose) >= 0 -module.exports = gte - - -/***/ }), - -/***/ 194: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const lt = (a, b, loose) => compare(a, b, loose) < 0 -module.exports = lt - - -/***/ }), - -/***/ 7520: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const lte = (a, b, loose) => compare(a, b, loose) <= 0 -module.exports = lte - - -/***/ }), - -/***/ 6017: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const neq = (a, b, loose) => compare(a, b, loose) !== 0 -module.exports = neq - - -/***/ }), - -/***/ 5925: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const {MAX_LENGTH} = __nccwpck_require__(2293) -const { re, t } = __nccwpck_require__(9523) -const SemVer = __nccwpck_require__(8088) - -const parseOptions = __nccwpck_require__(785) -const parse = (version, options) => { - options = parseOptions(options) - - if (version instanceof SemVer) { - return version - } - - if (typeof version !== 'string') { - return null - } - - if (version.length > MAX_LENGTH) { - return null - } - - const r = options.loose ? re[t.LOOSE] : re[t.FULL] - if (!r.test(version)) { - return null - } - - try { - return new SemVer(version, options) - } catch (er) { - return null - } -} - -module.exports = parse - - -/***/ }), - -/***/ 6055: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const Range = __nccwpck_require__(9828) -const satisfies = (version, range, options) => { - try { - range = new Range(range, options) - } catch (er) { - return false - } - return range.test(version) -} -module.exports = satisfies - - -/***/ }), - -/***/ 2293: -/***/ ((module) => { - -// Note: this is the semver.org version of the spec that it implements -// Not necessarily the package version of this code. -const SEMVER_SPEC_VERSION = '2.0.0' - -const MAX_LENGTH = 256 -const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || - /* istanbul ignore next */ 9007199254740991 - -// Max safe segment length for coercion. -const MAX_SAFE_COMPONENT_LENGTH = 16 - -module.exports = { - SEMVER_SPEC_VERSION, - MAX_LENGTH, - MAX_SAFE_INTEGER, - MAX_SAFE_COMPONENT_LENGTH -} - - -/***/ }), - -/***/ 427: -/***/ ((module) => { - -const debug = ( - typeof process === 'object' && - process.env && - process.env.NODE_DEBUG && - /\bsemver\b/i.test(process.env.NODE_DEBUG) -) ? (...args) => console.error('SEMVER', ...args) - : () => {} - -module.exports = debug - - -/***/ }), - -/***/ 2463: -/***/ ((module) => { - -const numeric = /^[0-9]+$/ -const compareIdentifiers = (a, b) => { - const anum = numeric.test(a) - const bnum = numeric.test(b) - - if (anum && bnum) { - a = +a - b = +b - } - - return a === b ? 0 - : (anum && !bnum) ? -1 - : (bnum && !anum) ? 1 - : a < b ? -1 - : 1 -} - -const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a) - -module.exports = { - compareIdentifiers, - rcompareIdentifiers -} - - -/***/ }), - -/***/ 785: -/***/ ((module) => { - -// parse out just the options we care about so we always get a consistent -// obj with keys in a consistent order. -const opts = ['includePrerelease', 'loose', 'rtl'] -const parseOptions = options => - !options ? {} - : typeof options !== 'object' ? { loose: true } - : opts.filter(k => options[k]).reduce((options, k) => { - options[k] = true - return options - }, {}) -module.exports = parseOptions - - -/***/ }), - -/***/ 9523: -/***/ ((module, exports, __nccwpck_require__) => { - -const { MAX_SAFE_COMPONENT_LENGTH } = __nccwpck_require__(2293) -const debug = __nccwpck_require__(427) -exports = module.exports = {} - -// The actual regexps go on exports.re -const re = exports.re = [] -const src = exports.src = [] -const t = exports.t = {} -let R = 0 - -const createToken = (name, value, isGlobal) => { - const index = R++ - debug(index, value) - t[name] = index - src[index] = value - re[index] = new RegExp(value, isGlobal ? 'g' : undefined) -} - -// The following Regular Expressions can be used for tokenizing, -// validating, and parsing SemVer version strings. - -// ## Numeric Identifier -// A single `0`, or a non-zero digit followed by zero or more digits. - -createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*') -createToken('NUMERICIDENTIFIERLOOSE', '[0-9]+') - -// ## Non-numeric Identifier -// Zero or more digits, followed by a letter or hyphen, and then zero or -// more letters, digits, or hyphens. - -createToken('NONNUMERICIDENTIFIER', '\\d*[a-zA-Z-][a-zA-Z0-9-]*') - -// ## Main Version -// Three dot-separated numeric identifiers. - -createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})`) - -createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})`) - -// ## Pre-release Version Identifier -// A numeric identifier, or a non-numeric identifier. - -createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER] -}|${src[t.NONNUMERICIDENTIFIER]})`) - -createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE] -}|${src[t.NONNUMERICIDENTIFIER]})`) - -// ## Pre-release Version -// Hyphen, followed by one or more dot-separated pre-release version -// identifiers. - -createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER] -}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`) - -createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE] -}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`) - -// ## Build Metadata Identifier -// Any combination of digits, letters, or hyphens. - -createToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+') - -// ## Build Metadata -// Plus sign, followed by one or more period-separated build metadata -// identifiers. - -createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER] -}(?:\\.${src[t.BUILDIDENTIFIER]})*))`) - -// ## Full Version String -// A main version, followed optionally by a pre-release version and -// build metadata. - -// Note that the only major, minor, patch, and pre-release sections of -// the version string are capturing groups. The build metadata is not a -// capturing group, because it should not ever be used in version -// comparison. - -createToken('FULLPLAIN', `v?${src[t.MAINVERSION] -}${src[t.PRERELEASE]}?${ - src[t.BUILD]}?`) - -createToken('FULL', `^${src[t.FULLPLAIN]}$`) - -// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. -// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty -// common in the npm registry. -createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE] -}${src[t.PRERELEASELOOSE]}?${ - src[t.BUILD]}?`) - -createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`) - -createToken('GTLT', '((?:<|>)?=?)') - -// Something like "2.*" or "1.2.x". -// Note that "x.x" is a valid xRange identifer, meaning "any version" -// Only the first item is strictly required. -createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`) -createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`) - -createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:${src[t.PRERELEASE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:${src[t.PRERELEASELOOSE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`) -createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`) - -// Coercion. -// Extract anything that could conceivably be a part of a valid semver -createToken('COERCE', `${'(^|[^\\d])' + - '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + - `(?:$|[^\\d])`) -createToken('COERCERTL', src[t.COERCE], true) - -// Tilde ranges. -// Meaning is "reasonably at or greater than" -createToken('LONETILDE', '(?:~>?)') - -createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true) -exports.tildeTrimReplace = '$1~' - -createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`) -createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`) - -// Caret ranges. -// Meaning is "at least and backwards compatible with" -createToken('LONECARET', '(?:\\^)') - -createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true) -exports.caretTrimReplace = '$1^' - -createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`) -createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`) - -// A simple gt/lt/eq thing, or just "" to indicate "any version" -createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`) -createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`) - -// An expression to strip any whitespace between the gtlt and the thing -// it modifies, so that `> 1.2.3` ==> `>1.2.3` -createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT] -}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true) -exports.comparatorTrimReplace = '$1$2$3' - -// Something like `1.2.3 - 1.2.4` -// Note that these all use the loose form, because they'll be -// checked against either the strict or loose comparator form -// later. -createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAIN]})` + - `\\s*$`) - -createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAINLOOSE]})` + - `\\s*$`) - -// Star ranges basically just allow anything at all. -createToken('STAR', '(<|>)?=?\\s*\\*') -// >=0.0.0 is like a star -createToken('GTE0', '^\\s*>=\\s*0\.0\.0\\s*$') -createToken('GTE0PRE', '^\\s*>=\\s*0\.0\.0-0\\s*$') - - -/***/ }), - -/***/ 1196: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - - -// A linked list to keep track of recently-used-ness -const Yallist = __nccwpck_require__(220) - -const MAX = Symbol('max') -const LENGTH = Symbol('length') -const LENGTH_CALCULATOR = Symbol('lengthCalculator') -const ALLOW_STALE = Symbol('allowStale') -const MAX_AGE = Symbol('maxAge') -const DISPOSE = Symbol('dispose') -const NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet') -const LRU_LIST = Symbol('lruList') -const CACHE = Symbol('cache') -const UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet') - -const naiveLength = () => 1 - -// lruList is a yallist where the head is the youngest -// item, and the tail is the oldest. the list contains the Hit -// objects as the entries. -// Each Hit object has a reference to its Yallist.Node. This -// never changes. -// -// cache is a Map (or PseudoMap) that matches the keys to -// the Yallist.Node object. -class LRUCache { - constructor (options) { - if (typeof options === 'number') - options = { max: options } - - if (!options) - options = {} - - if (options.max && (typeof options.max !== 'number' || options.max < 0)) - throw new TypeError('max must be a non-negative number') - // Kind of weird to have a default max of Infinity, but oh well. - const max = this[MAX] = options.max || Infinity - - const lc = options.length || naiveLength - this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc - this[ALLOW_STALE] = options.stale || false - if (options.maxAge && typeof options.maxAge !== 'number') - throw new TypeError('maxAge must be a number') - this[MAX_AGE] = options.maxAge || 0 - this[DISPOSE] = options.dispose - this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false - this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false - this.reset() - } - - // resize the cache when the max changes. - set max (mL) { - if (typeof mL !== 'number' || mL < 0) - throw new TypeError('max must be a non-negative number') - - this[MAX] = mL || Infinity - trim(this) - } - get max () { - return this[MAX] - } - - set allowStale (allowStale) { - this[ALLOW_STALE] = !!allowStale - } - get allowStale () { - return this[ALLOW_STALE] - } - - set maxAge (mA) { - if (typeof mA !== 'number') - throw new TypeError('maxAge must be a non-negative number') - - this[MAX_AGE] = mA - trim(this) - } - get maxAge () { - return this[MAX_AGE] - } - - // resize the cache when the lengthCalculator changes. - set lengthCalculator (lC) { - if (typeof lC !== 'function') - lC = naiveLength - - if (lC !== this[LENGTH_CALCULATOR]) { - this[LENGTH_CALCULATOR] = lC - this[LENGTH] = 0 - this[LRU_LIST].forEach(hit => { - hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key) - this[LENGTH] += hit.length - }) - } - trim(this) - } - get lengthCalculator () { return this[LENGTH_CALCULATOR] } - - get length () { return this[LENGTH] } - get itemCount () { return this[LRU_LIST].length } - - rforEach (fn, thisp) { - thisp = thisp || this - for (let walker = this[LRU_LIST].tail; walker !== null;) { - const prev = walker.prev - forEachStep(this, fn, walker, thisp) - walker = prev - } - } - - forEach (fn, thisp) { - thisp = thisp || this - for (let walker = this[LRU_LIST].head; walker !== null;) { - const next = walker.next - forEachStep(this, fn, walker, thisp) - walker = next - } - } - - keys () { - return this[LRU_LIST].toArray().map(k => k.key) - } - - values () { - return this[LRU_LIST].toArray().map(k => k.value) - } - - reset () { - if (this[DISPOSE] && - this[LRU_LIST] && - this[LRU_LIST].length) { - this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value)) - } - - this[CACHE] = new Map() // hash of items by key - this[LRU_LIST] = new Yallist() // list of items in order of use recency - this[LENGTH] = 0 // length of items in the list - } - - dump () { - return this[LRU_LIST].map(hit => - isStale(this, hit) ? false : { - k: hit.key, - v: hit.value, - e: hit.now + (hit.maxAge || 0) - }).toArray().filter(h => h) - } - - dumpLru () { - return this[LRU_LIST] - } - - set (key, value, maxAge) { - maxAge = maxAge || this[MAX_AGE] - - if (maxAge && typeof maxAge !== 'number') - throw new TypeError('maxAge must be a number') - - const now = maxAge ? Date.now() : 0 - const len = this[LENGTH_CALCULATOR](value, key) - - if (this[CACHE].has(key)) { - if (len > this[MAX]) { - del(this, this[CACHE].get(key)) - return false - } - - const node = this[CACHE].get(key) - const item = node.value - - // dispose of the old one before overwriting - // split out into 2 ifs for better coverage tracking - if (this[DISPOSE]) { - if (!this[NO_DISPOSE_ON_SET]) - this[DISPOSE](key, item.value) - } - - item.now = now - item.maxAge = maxAge - item.value = value - this[LENGTH] += len - item.length - item.length = len - this.get(key) - trim(this) - return true - } - - const hit = new Entry(key, value, len, now, maxAge) - - // oversized objects fall out of cache automatically. - if (hit.length > this[MAX]) { - if (this[DISPOSE]) - this[DISPOSE](key, value) - - return false - } - - this[LENGTH] += hit.length - this[LRU_LIST].unshift(hit) - this[CACHE].set(key, this[LRU_LIST].head) - trim(this) - return true - } - - has (key) { - if (!this[CACHE].has(key)) return false - const hit = this[CACHE].get(key).value - return !isStale(this, hit) - } - - get (key) { - return get(this, key, true) - } - - peek (key) { - return get(this, key, false) - } - - pop () { - const node = this[LRU_LIST].tail - if (!node) - return null - - del(this, node) - return node.value - } - - del (key) { - del(this, this[CACHE].get(key)) - } - - load (arr) { - // reset the cache - this.reset() - - const now = Date.now() - // A previous serialized cache has the most recent items first - for (let l = arr.length - 1; l >= 0; l--) { - const hit = arr[l] - const expiresAt = hit.e || 0 - if (expiresAt === 0) - // the item was created without expiration in a non aged cache - this.set(hit.k, hit.v) - else { - const maxAge = expiresAt - now - // dont add already expired items - if (maxAge > 0) { - this.set(hit.k, hit.v, maxAge) - } - } - } - } - - prune () { - this[CACHE].forEach((value, key) => get(this, key, false)) - } -} - -const get = (self, key, doUse) => { - const node = self[CACHE].get(key) - if (node) { - const hit = node.value - if (isStale(self, hit)) { - del(self, node) - if (!self[ALLOW_STALE]) - return undefined - } else { - if (doUse) { - if (self[UPDATE_AGE_ON_GET]) - node.value.now = Date.now() - self[LRU_LIST].unshiftNode(node) - } - } - return hit.value - } -} - -const isStale = (self, hit) => { - if (!hit || (!hit.maxAge && !self[MAX_AGE])) - return false - - const diff = Date.now() - hit.now - return hit.maxAge ? diff > hit.maxAge - : self[MAX_AGE] && (diff > self[MAX_AGE]) -} - -const trim = self => { - if (self[LENGTH] > self[MAX]) { - for (let walker = self[LRU_LIST].tail; - self[LENGTH] > self[MAX] && walker !== null;) { - // We know that we're about to delete this one, and also - // what the next least recently used key will be, so just - // go ahead and set it now. - const prev = walker.prev - del(self, walker) - walker = prev - } - } -} - -const del = (self, node) => { - if (node) { - const hit = node.value - if (self[DISPOSE]) - self[DISPOSE](hit.key, hit.value) - - self[LENGTH] -= hit.length - self[CACHE].delete(hit.key) - self[LRU_LIST].removeNode(node) - } -} - -class Entry { - constructor (key, value, length, now, maxAge) { - this.key = key - this.value = value - this.length = length - this.now = now - this.maxAge = maxAge || 0 - } -} - -const forEachStep = (self, fn, node, thisp) => { - let hit = node.value - if (isStale(self, hit)) { - del(self, node) - if (!self[ALLOW_STALE]) - hit = undefined - } - if (hit) - fn.call(thisp, hit.value, hit.key, self) -} - -module.exports = LRUCache - - -/***/ }), - -/***/ 5327: -/***/ ((module) => { - -"use strict"; - -module.exports = function (Yallist) { - Yallist.prototype[Symbol.iterator] = function* () { - for (let walker = this.head; walker; walker = walker.next) { - yield walker.value - } - } -} - - -/***/ }), - -/***/ 220: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - -module.exports = Yallist - -Yallist.Node = Node -Yallist.create = Yallist - -function Yallist (list) { - var self = this - if (!(self instanceof Yallist)) { - self = new Yallist() - } - - self.tail = null - self.head = null - self.length = 0 - - if (list && typeof list.forEach === 'function') { - list.forEach(function (item) { - self.push(item) - }) - } else if (arguments.length > 0) { - for (var i = 0, l = arguments.length; i < l; i++) { - self.push(arguments[i]) - } - } - - return self -} - -Yallist.prototype.removeNode = function (node) { - if (node.list !== this) { - throw new Error('removing node which does not belong to this list') - } - - var next = node.next - var prev = node.prev - - if (next) { - next.prev = prev - } - - if (prev) { - prev.next = next - } - - if (node === this.head) { - this.head = next - } - if (node === this.tail) { - this.tail = prev - } - - node.list.length-- - node.next = null - node.prev = null - node.list = null - - return next -} - -Yallist.prototype.unshiftNode = function (node) { - if (node === this.head) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var head = this.head - node.list = this - node.next = head - if (head) { - head.prev = node - } - - this.head = node - if (!this.tail) { - this.tail = node - } - this.length++ -} - -Yallist.prototype.pushNode = function (node) { - if (node === this.tail) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var tail = this.tail - node.list = this - node.prev = tail - if (tail) { - tail.next = node - } - - this.tail = node - if (!this.head) { - this.head = node - } - this.length++ -} - -Yallist.prototype.push = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - push(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.unshift = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - unshift(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.pop = function () { - if (!this.tail) { - return undefined - } - - var res = this.tail.value - this.tail = this.tail.prev - if (this.tail) { - this.tail.next = null - } else { - this.head = null - } - this.length-- - return res -} - -Yallist.prototype.shift = function () { - if (!this.head) { - return undefined - } - - var res = this.head.value - this.head = this.head.next - if (this.head) { - this.head.prev = null - } else { - this.tail = null - } - this.length-- - return res -} - -Yallist.prototype.forEach = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.head, i = 0; walker !== null; i++) { - fn.call(thisp, walker.value, i, this) - walker = walker.next - } -} - -Yallist.prototype.forEachReverse = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.tail, i = this.length - 1; walker !== null; i--) { - fn.call(thisp, walker.value, i, this) - walker = walker.prev - } -} - -Yallist.prototype.get = function (n) { - for (var i = 0, walker = this.head; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.next - } - if (i === n && walker !== null) { - return walker.value - } -} - -Yallist.prototype.getReverse = function (n) { - for (var i = 0, walker = this.tail; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.prev - } - if (i === n && walker !== null) { - return walker.value - } -} - -Yallist.prototype.map = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.head; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.next - } - return res -} - -Yallist.prototype.mapReverse = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.tail; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.prev - } - return res -} - -Yallist.prototype.reduce = function (fn, initial) { - var acc - var walker = this.head - if (arguments.length > 1) { - acc = initial - } else if (this.head) { - walker = this.head.next - acc = this.head.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } - - for (var i = 0; walker !== null; i++) { - acc = fn(acc, walker.value, i) - walker = walker.next - } - - return acc -} - -Yallist.prototype.reduceReverse = function (fn, initial) { - var acc - var walker = this.tail - if (arguments.length > 1) { - acc = initial - } else if (this.tail) { - walker = this.tail.prev - acc = this.tail.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } - - for (var i = this.length - 1; walker !== null; i--) { - acc = fn(acc, walker.value, i) - walker = walker.prev - } - - return acc -} - -Yallist.prototype.toArray = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.head; walker !== null; i++) { - arr[i] = walker.value - walker = walker.next - } - return arr -} - -Yallist.prototype.toArrayReverse = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.tail; walker !== null; i++) { - arr[i] = walker.value - walker = walker.prev - } - return arr -} - -Yallist.prototype.slice = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = 0, walker = this.head; walker !== null && i < from; i++) { - walker = walker.next - } - for (; walker !== null && i < to; i++, walker = walker.next) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.sliceReverse = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) { - walker = walker.prev - } - for (; walker !== null && i > from; i--, walker = walker.prev) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.splice = function (start, deleteCount, ...nodes) { - if (start > this.length) { - start = this.length - 1 - } - if (start < 0) { - start = this.length + start; - } - - for (var i = 0, walker = this.head; walker !== null && i < start; i++) { - walker = walker.next - } - - var ret = [] - for (var i = 0; walker && i < deleteCount; i++) { - ret.push(walker.value) - walker = this.removeNode(walker) - } - if (walker === null) { - walker = this.tail - } - - if (walker !== this.head && walker !== this.tail) { - walker = walker.prev - } - - for (var i = 0; i < nodes.length; i++) { - walker = insert(this, walker, nodes[i]) - } - return ret; -} - -Yallist.prototype.reverse = function () { - var head = this.head - var tail = this.tail - for (var walker = head; walker !== null; walker = walker.prev) { - var p = walker.prev - walker.prev = walker.next - walker.next = p - } - this.head = tail - this.tail = head - return this -} - -function insert (self, node, value) { - var inserted = node === self.head ? - new Node(value, null, node, self) : - new Node(value, node, node.next, self) - - if (inserted.next === null) { - self.tail = inserted - } - if (inserted.prev === null) { - self.head = inserted - } - - self.length++ - - return inserted -} - -function push (self, item) { - self.tail = new Node(item, self.tail, null, self) - if (!self.head) { - self.head = self.tail - } - self.length++ -} - -function unshift (self, item) { - self.head = new Node(item, null, self.head, self) - if (!self.tail) { - self.tail = self.head - } - self.length++ -} - -function Node (value, prev, next, list) { - if (!(this instanceof Node)) { - return new Node(value, prev, next, list) - } - - this.list = list - this.value = value - - if (prev) { - prev.next = this - this.prev = prev - } else { - this.prev = null - } - - if (next) { - next.prev = this - this.next = next - } else { - this.next = null - } -} - -try { - // add if support for Symbol.iterator is present - __nccwpck_require__(5327)(Yallist) -} catch (er) {} - - /***/ }), /***/ 4294: diff --git a/.github/actions/markPullRequestsAsDeployed/index.js b/.github/actions/markPullRequestsAsDeployed/index.js index cddafb0f0145..8cd33824e803 100644 --- a/.github/actions/markPullRequestsAsDeployed/index.js +++ b/.github/actions/markPullRequestsAsDeployed/index.js @@ -47,8 +47,6 @@ prList.forEach((pr) => { const _ = __nccwpck_require__(4987); const lodashGet = __nccwpck_require__(6908); -const semverParse = __nccwpck_require__(5925); -const semverSatisfies = __nccwpck_require__(6055); const GITHUB_OWNER = 'Expensify'; const EXPENSIFY_CASH_REPO = 'Expensify.cash'; @@ -109,11 +107,6 @@ class GithubUtils { try { const versionRegex = new RegExp('([0-9]+)\\.([0-9]+)\\.([0-9]+)(?:-([0-9]+))?', 'g'); const tag = issue.body.match(versionRegex)[0].replace(/`/g, ''); - - // eslint-disable-next-line max-len - const compareURLRegex = new RegExp(`${EXPENSIFY_CASH_URL}/compare/${versionRegex.source}\\.\\.\\.${versionRegex.source}`, 'g'); - const comparisonURL = issue.body.match(compareURLRegex)[0]; - return { title: issue.title, url: issue.url, @@ -121,7 +114,6 @@ class GithubUtils { PRList: this.getStagingDeployCashPRList(issue), deployBlockers: this.getStagingDeployCashDeployBlockers(issue), tag, - comparisonURL, }; } catch (exception) { throw new Error(`Unable to find ${STAGING_DEPLOY_CASH_LABEL} issue with correct data.`); @@ -196,71 +188,6 @@ class GithubUtils { ); } - /** - * Generate a comparison URL between two versions following the semverLevel passed - * - * @param {String} repoSlug - The slug of the repository: / - * @param {String} tag - The tag to compare first the previous semverLevel - * @param {String} semverLevel - The semantic versioning MAJOR, MINOR, PATCH and BUILD - * @return {Promise} the url generated - * @throws {Error} If the request to the Github API fails. - */ - generateVersionComparisonURL(repoSlug, tag, semverLevel) { - return new Promise((resolve, reject) => { - const getComparisonURL = (previousTag, currentTag) => ( - `${EXPENSIFY_CASH_URL}/compare/${previousTag}...${currentTag}` - ); - - const [repoOwner, repoName] = repoSlug.split('/'); - const tagSemver = semverParse(tag); - - return this.octokit.repos.listTags({ - owner: repoOwner, - repo: repoName, - }) - .then(githubResponse => githubResponse.data.some(({name: repoTag}) => { - if (semverLevel === 'MAJOR' - && semverSatisfies(repoTag, `<${tagSemver.major}.x.x`, {includePrerelease: true}) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'MINOR' - && semverSatisfies( - repoTag, - `<${tagSemver.major}.${tagSemver.minor}.x`, - {includePrerelease: true}, - ) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'PATCH' - && semverSatisfies(repoTag, `<${tagSemver}`, {includePrerelease: true}) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'BUILD' - && repoTag !== tagSemver.version - && semverSatisfies( - repoTag, - `<=${tagSemver.major}.${tagSemver.minor}.${tagSemver.patch}`, - {includePrerelease: true}, - ) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - return false; - })) - .catch(githubError => reject(githubError)); - }); - } - /** * Creates a new StagingDeployCash issue. * @@ -356,22 +283,16 @@ class GithubUtils { deployBlockers = [], resolvedDeployBlockers = [], ) { - return Promise.all([ - this.generateVersionComparisonURL(`${GITHUB_OWNER}/${EXPENSIFY_CASH_REPO}`, tag, 'PATCH'), - this.octokit.pulls.list({ - owner: GITHUB_OWNER, - repo: EXPENSIFY_CASH_REPO, - per_page: 100, - }), - ]) - .then(results => ({ - comparisonURL: results[0], - automergePRs: _.map( - _.filter(results[1].data, GithubUtils.isAutomergePullRequest), + return this.octokit.pulls.list({ + owner: GITHUB_OWNER, + repo: EXPENSIFY_CASH_REPO, + per_page: 100, + }) + .then(({data}) => { + const automergePRs = _.pluck( + _.filter(data, GithubUtils.isAutomergePullRequest), 'html_url', - ), - })) - .then(({comparisonURL, automergePRs}) => { + ); const sortedPRList = _.chain(PRList) .difference(automergePRs) .unique() @@ -383,8 +304,8 @@ class GithubUtils { ); // Tag version and comparison URL - let issueBody = `**Release Version:** \`${tag}\`\r\n`; - issueBody += `**Compare Changes:** ${comparisonURL}\r\n`; + // eslint-disable-next-line max-len + let issueBody = `**Release Version:** \`${tag}\`\r\n**Compare Changes:** https://github.com/Expensify/Expensify.cash/compare/production...staging\r\n`; // PR list if (!_.isEmpty(PRList)) { @@ -405,11 +326,13 @@ class GithubUtils { } issueBody += '\r\ncc @Expensify/applauseleads\r\n'; - return issueBody; }) - // eslint-disable-next-line no-console - .catch(err => console.warn('Error generating comparison URL, continuing...', err)); + .catch(err => console.warn( + 'Error generating StagingDeployCash issue body!', + 'Automerge PRs may not be properly filtered out. Continuing...', + err, + )); } /** @@ -10755,2212 +10678,6 @@ if (!safer.constants) { module.exports = safer -/***/ }), - -/***/ 1532: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const ANY = Symbol('SemVer ANY') -// hoisted class for cyclic dependency -class Comparator { - static get ANY () { - return ANY - } - constructor (comp, options) { - options = parseOptions(options) - - if (comp instanceof Comparator) { - if (comp.loose === !!options.loose) { - return comp - } else { - comp = comp.value - } - } - - debug('comparator', comp, options) - this.options = options - this.loose = !!options.loose - this.parse(comp) - - if (this.semver === ANY) { - this.value = '' - } else { - this.value = this.operator + this.semver.version - } - - debug('comp', this) - } - - parse (comp) { - const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] - const m = comp.match(r) - - if (!m) { - throw new TypeError(`Invalid comparator: ${comp}`) - } - - this.operator = m[1] !== undefined ? m[1] : '' - if (this.operator === '=') { - this.operator = '' - } - - // if it literally is just '>' or '' then allow anything. - if (!m[2]) { - this.semver = ANY - } else { - this.semver = new SemVer(m[2], this.options.loose) - } - } - - toString () { - return this.value - } - - test (version) { - debug('Comparator.test', version, this.options.loose) - - if (this.semver === ANY || version === ANY) { - return true - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - return cmp(version, this.operator, this.semver, this.options) - } - - intersects (comp, options) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required') - } - - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - if (this.operator === '') { - if (this.value === '') { - return true - } - return new Range(comp.value, options).test(this.value) - } else if (comp.operator === '') { - if (comp.value === '') { - return true - } - return new Range(this.value, options).test(comp.semver) - } - - const sameDirectionIncreasing = - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '>=' || comp.operator === '>') - const sameDirectionDecreasing = - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '<=' || comp.operator === '<') - const sameSemVer = this.semver.version === comp.semver.version - const differentDirectionsInclusive = - (this.operator === '>=' || this.operator === '<=') && - (comp.operator === '>=' || comp.operator === '<=') - const oppositeDirectionsLessThan = - cmp(this.semver, '<', comp.semver, options) && - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '<=' || comp.operator === '<') - const oppositeDirectionsGreaterThan = - cmp(this.semver, '>', comp.semver, options) && - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '>=' || comp.operator === '>') - - return ( - sameDirectionIncreasing || - sameDirectionDecreasing || - (sameSemVer && differentDirectionsInclusive) || - oppositeDirectionsLessThan || - oppositeDirectionsGreaterThan - ) - } -} - -module.exports = Comparator - -const parseOptions = __nccwpck_require__(785) -const {re, t} = __nccwpck_require__(9523) -const cmp = __nccwpck_require__(5098) -const debug = __nccwpck_require__(427) -const SemVer = __nccwpck_require__(8088) -const Range = __nccwpck_require__(9828) - - -/***/ }), - -/***/ 9828: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -// hoisted class for cyclic dependency -class Range { - constructor (range, options) { - options = parseOptions(options) - - if (range instanceof Range) { - if ( - range.loose === !!options.loose && - range.includePrerelease === !!options.includePrerelease - ) { - return range - } else { - return new Range(range.raw, options) - } - } - - if (range instanceof Comparator) { - // just put it in the set and return - this.raw = range.value - this.set = [[range]] - this.format() - return this - } - - this.options = options - this.loose = !!options.loose - this.includePrerelease = !!options.includePrerelease - - // First, split based on boolean or || - this.raw = range - this.set = range - .split(/\s*\|\|\s*/) - // map the range to a 2d array of comparators - .map(range => this.parseRange(range.trim())) - // throw out any comparator lists that are empty - // this generally means that it was not a valid range, which is allowed - // in loose mode, but will still throw if the WHOLE range is invalid. - .filter(c => c.length) - - if (!this.set.length) { - throw new TypeError(`Invalid SemVer Range: ${range}`) - } - - // if we have any that are not the null set, throw out null sets. - if (this.set.length > 1) { - // keep the first one, in case they're all null sets - const first = this.set[0] - this.set = this.set.filter(c => !isNullSet(c[0])) - if (this.set.length === 0) - this.set = [first] - else if (this.set.length > 1) { - // if we have any that are *, then the range is just * - for (const c of this.set) { - if (c.length === 1 && isAny(c[0])) { - this.set = [c] - break - } - } - } - } - - this.format() - } - - format () { - this.range = this.set - .map((comps) => { - return comps.join(' ').trim() - }) - .join('||') - .trim() - return this.range - } - - toString () { - return this.range - } - - parseRange (range) { - range = range.trim() - - // memoize range parsing for performance. - // this is a very hot path, and fully deterministic. - const memoOpts = Object.keys(this.options).join(',') - const memoKey = `parseRange:${memoOpts}:${range}` - const cached = cache.get(memoKey) - if (cached) - return cached - - const loose = this.options.loose - // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` - const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE] - range = range.replace(hr, hyphenReplace(this.options.includePrerelease)) - debug('hyphen replace', range) - // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` - range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace) - debug('comparator trim', range, re[t.COMPARATORTRIM]) - - // `~ 1.2.3` => `~1.2.3` - range = range.replace(re[t.TILDETRIM], tildeTrimReplace) - - // `^ 1.2.3` => `^1.2.3` - range = range.replace(re[t.CARETTRIM], caretTrimReplace) - - // normalize spaces - range = range.split(/\s+/).join(' ') - - // At this point, the range is completely trimmed and - // ready to be split into comparators. - - const compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] - const rangeList = range - .split(' ') - .map(comp => parseComparator(comp, this.options)) - .join(' ') - .split(/\s+/) - // >=0.0.0 is equivalent to * - .map(comp => replaceGTE0(comp, this.options)) - // in loose mode, throw out any that are not valid comparators - .filter(this.options.loose ? comp => !!comp.match(compRe) : () => true) - .map(comp => new Comparator(comp, this.options)) - - // if any comparators are the null set, then replace with JUST null set - // if more than one comparator, remove any * comparators - // also, don't include the same comparator more than once - const l = rangeList.length - const rangeMap = new Map() - for (const comp of rangeList) { - if (isNullSet(comp)) - return [comp] - rangeMap.set(comp.value, comp) - } - if (rangeMap.size > 1 && rangeMap.has('')) - rangeMap.delete('') - - const result = [...rangeMap.values()] - cache.set(memoKey, result) - return result - } - - intersects (range, options) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required') - } - - return this.set.some((thisComparators) => { - return ( - isSatisfiable(thisComparators, options) && - range.set.some((rangeComparators) => { - return ( - isSatisfiable(rangeComparators, options) && - thisComparators.every((thisComparator) => { - return rangeComparators.every((rangeComparator) => { - return thisComparator.intersects(rangeComparator, options) - }) - }) - ) - }) - ) - }) - } - - // if ANY of the sets match ALL of its comparators, then pass - test (version) { - if (!version) { - return false - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - for (let i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version, this.options)) { - return true - } - } - return false - } -} -module.exports = Range - -const LRU = __nccwpck_require__(1196) -const cache = new LRU({ max: 1000 }) - -const parseOptions = __nccwpck_require__(785) -const Comparator = __nccwpck_require__(1532) -const debug = __nccwpck_require__(427) -const SemVer = __nccwpck_require__(8088) -const { - re, - t, - comparatorTrimReplace, - tildeTrimReplace, - caretTrimReplace -} = __nccwpck_require__(9523) - -const isNullSet = c => c.value === '<0.0.0-0' -const isAny = c => c.value === '' - -// take a set of comparators and determine whether there -// exists a version which can satisfy it -const isSatisfiable = (comparators, options) => { - let result = true - const remainingComparators = comparators.slice() - let testComparator = remainingComparators.pop() - - while (result && remainingComparators.length) { - result = remainingComparators.every((otherComparator) => { - return testComparator.intersects(otherComparator, options) - }) - - testComparator = remainingComparators.pop() - } - - return result -} - -// comprised of xranges, tildes, stars, and gtlt's at this point. -// already replaced the hyphen ranges -// turn into a set of JUST comparators. -const parseComparator = (comp, options) => { - debug('comp', comp, options) - comp = replaceCarets(comp, options) - debug('caret', comp) - comp = replaceTildes(comp, options) - debug('tildes', comp) - comp = replaceXRanges(comp, options) - debug('xrange', comp) - comp = replaceStars(comp, options) - debug('stars', comp) - return comp -} - -const isX = id => !id || id.toLowerCase() === 'x' || id === '*' - -// ~, ~> --> * (any, kinda silly) -// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0 -// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0 -// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0 -// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0 -// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0 -const replaceTildes = (comp, options) => - comp.trim().split(/\s+/).map((comp) => { - return replaceTilde(comp, options) - }).join(' ') - -const replaceTilde = (comp, options) => { - const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] - return comp.replace(r, (_, M, m, p, pr) => { - debug('tilde', comp, _, M, m, p, pr) - let ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = `>=${M}.0.0 <${+M + 1}.0.0-0` - } else if (isX(p)) { - // ~1.2 == >=1.2.0 <1.3.0-0 - ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0` - } else if (pr) { - debug('replaceTilde pr', pr) - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${+m + 1}.0-0` - } else { - // ~1.2.3 == >=1.2.3 <1.3.0-0 - ret = `>=${M}.${m}.${p - } <${M}.${+m + 1}.0-0` - } - - debug('tilde return', ret) - return ret - }) -} - -// ^ --> * (any, kinda silly) -// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0 -// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0 -// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0 -// ^1.2.3 --> >=1.2.3 <2.0.0-0 -// ^1.2.0 --> >=1.2.0 <2.0.0-0 -const replaceCarets = (comp, options) => - comp.trim().split(/\s+/).map((comp) => { - return replaceCaret(comp, options) - }).join(' ') - -const replaceCaret = (comp, options) => { - debug('caret', comp, options) - const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET] - const z = options.includePrerelease ? '-0' : '' - return comp.replace(r, (_, M, m, p, pr) => { - debug('caret', comp, _, M, m, p, pr) - let ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0` - } else if (isX(p)) { - if (M === '0') { - ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0` - } else { - ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0` - } - } else if (pr) { - debug('replaceCaret pr', pr) - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${m}.${+p + 1}-0` - } else { - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${+m + 1}.0-0` - } - } else { - ret = `>=${M}.${m}.${p}-${pr - } <${+M + 1}.0.0-0` - } - } else { - debug('no pr') - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p - }${z} <${M}.${m}.${+p + 1}-0` - } else { - ret = `>=${M}.${m}.${p - }${z} <${M}.${+m + 1}.0-0` - } - } else { - ret = `>=${M}.${m}.${p - } <${+M + 1}.0.0-0` - } - } - - debug('caret return', ret) - return ret - }) -} - -const replaceXRanges = (comp, options) => { - debug('replaceXRanges', comp, options) - return comp.split(/\s+/).map((comp) => { - return replaceXRange(comp, options) - }).join(' ') -} - -const replaceXRange = (comp, options) => { - comp = comp.trim() - const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE] - return comp.replace(r, (ret, gtlt, M, m, p, pr) => { - debug('xRange', comp, ret, gtlt, M, m, p, pr) - const xM = isX(M) - const xm = xM || isX(m) - const xp = xm || isX(p) - const anyX = xp - - if (gtlt === '=' && anyX) { - gtlt = '' - } - - // if we're including prereleases in the match, then we need - // to fix this to -0, the lowest possible prerelease value - pr = options.includePrerelease ? '-0' : '' - - if (xM) { - if (gtlt === '>' || gtlt === '<') { - // nothing is allowed - ret = '<0.0.0-0' - } else { - // nothing is forbidden - ret = '*' - } - } else if (gtlt && anyX) { - // we know patch is an x, because we have any x at all. - // replace X with 0 - if (xm) { - m = 0 - } - p = 0 - - if (gtlt === '>') { - // >1 => >=2.0.0 - // >1.2 => >=1.3.0 - gtlt = '>=' - if (xm) { - M = +M + 1 - m = 0 - p = 0 - } else { - m = +m + 1 - p = 0 - } - } else if (gtlt === '<=') { - // <=0.7.x is actually <0.8.0, since any 0.7.x should - // pass. Similarly, <=7.x is actually <8.0.0, etc. - gtlt = '<' - if (xm) { - M = +M + 1 - } else { - m = +m + 1 - } - } - - if (gtlt === '<') - pr = '-0' - - ret = `${gtlt + M}.${m}.${p}${pr}` - } else if (xm) { - ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0` - } else if (xp) { - ret = `>=${M}.${m}.0${pr - } <${M}.${+m + 1}.0-0` - } - - debug('xRange return', ret) - - return ret - }) -} - -// Because * is AND-ed with everything else in the comparator, -// and '' means "any version", just remove the *s entirely. -const replaceStars = (comp, options) => { - debug('replaceStars', comp, options) - // Looseness is ignored here. star is always as loose as it gets! - return comp.trim().replace(re[t.STAR], '') -} - -const replaceGTE0 = (comp, options) => { - debug('replaceGTE0', comp, options) - return comp.trim() - .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '') -} - -// This function is passed to string.replace(re[t.HYPHENRANGE]) -// M, m, patch, prerelease, build -// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 -// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do -// 1.2 - 3.4 => >=1.2.0 <3.5.0-0 -const hyphenReplace = incPr => ($0, - from, fM, fm, fp, fpr, fb, - to, tM, tm, tp, tpr, tb) => { - if (isX(fM)) { - from = '' - } else if (isX(fm)) { - from = `>=${fM}.0.0${incPr ? '-0' : ''}` - } else if (isX(fp)) { - from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}` - } else if (fpr) { - from = `>=${from}` - } else { - from = `>=${from}${incPr ? '-0' : ''}` - } - - if (isX(tM)) { - to = '' - } else if (isX(tm)) { - to = `<${+tM + 1}.0.0-0` - } else if (isX(tp)) { - to = `<${tM}.${+tm + 1}.0-0` - } else if (tpr) { - to = `<=${tM}.${tm}.${tp}-${tpr}` - } else if (incPr) { - to = `<${tM}.${tm}.${+tp + 1}-0` - } else { - to = `<=${to}` - } - - return (`${from} ${to}`).trim() -} - -const testSet = (set, version, options) => { - for (let i = 0; i < set.length; i++) { - if (!set[i].test(version)) { - return false - } - } - - if (version.prerelease.length && !options.includePrerelease) { - // Find the set of versions that are allowed to have prereleases - // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 - // That should allow `1.2.3-pr.2` to pass. - // However, `1.2.4-alpha.notready` should NOT be allowed, - // even though it's within the range set by the comparators. - for (let i = 0; i < set.length; i++) { - debug(set[i].semver) - if (set[i].semver === Comparator.ANY) { - continue - } - - if (set[i].semver.prerelease.length > 0) { - const allowed = set[i].semver - if (allowed.major === version.major && - allowed.minor === version.minor && - allowed.patch === version.patch) { - return true - } - } - } - - // Version has a -pre, but it's not one of the ones we like. - return false - } - - return true -} - - -/***/ }), - -/***/ 8088: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const debug = __nccwpck_require__(427) -const { MAX_LENGTH, MAX_SAFE_INTEGER } = __nccwpck_require__(2293) -const { re, t } = __nccwpck_require__(9523) - -const parseOptions = __nccwpck_require__(785) -const { compareIdentifiers } = __nccwpck_require__(2463) -class SemVer { - constructor (version, options) { - options = parseOptions(options) - - if (version instanceof SemVer) { - if (version.loose === !!options.loose && - version.includePrerelease === !!options.includePrerelease) { - return version - } else { - version = version.version - } - } else if (typeof version !== 'string') { - throw new TypeError(`Invalid Version: ${version}`) - } - - if (version.length > MAX_LENGTH) { - throw new TypeError( - `version is longer than ${MAX_LENGTH} characters` - ) - } - - debug('SemVer', version, options) - this.options = options - this.loose = !!options.loose - // this isn't actually relevant for versions, but keep it so that we - // don't run into trouble passing this.options around. - this.includePrerelease = !!options.includePrerelease - - const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]) - - if (!m) { - throw new TypeError(`Invalid Version: ${version}`) - } - - this.raw = version - - // these are actually numbers - this.major = +m[1] - this.minor = +m[2] - this.patch = +m[3] - - if (this.major > MAX_SAFE_INTEGER || this.major < 0) { - throw new TypeError('Invalid major version') - } - - if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { - throw new TypeError('Invalid minor version') - } - - if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { - throw new TypeError('Invalid patch version') - } - - // numberify any prerelease numeric ids - if (!m[4]) { - this.prerelease = [] - } else { - this.prerelease = m[4].split('.').map((id) => { - if (/^[0-9]+$/.test(id)) { - const num = +id - if (num >= 0 && num < MAX_SAFE_INTEGER) { - return num - } - } - return id - }) - } - - this.build = m[5] ? m[5].split('.') : [] - this.format() - } - - format () { - this.version = `${this.major}.${this.minor}.${this.patch}` - if (this.prerelease.length) { - this.version += `-${this.prerelease.join('.')}` - } - return this.version - } - - toString () { - return this.version - } - - compare (other) { - debug('SemVer.compare', this.version, this.options, other) - if (!(other instanceof SemVer)) { - if (typeof other === 'string' && other === this.version) { - return 0 - } - other = new SemVer(other, this.options) - } - - if (other.version === this.version) { - return 0 - } - - return this.compareMain(other) || this.comparePre(other) - } - - compareMain (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - return ( - compareIdentifiers(this.major, other.major) || - compareIdentifiers(this.minor, other.minor) || - compareIdentifiers(this.patch, other.patch) - ) - } - - comparePre (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - // NOT having a prerelease is > having one - if (this.prerelease.length && !other.prerelease.length) { - return -1 - } else if (!this.prerelease.length && other.prerelease.length) { - return 1 - } else if (!this.prerelease.length && !other.prerelease.length) { - return 0 - } - - let i = 0 - do { - const a = this.prerelease[i] - const b = other.prerelease[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - } - - compareBuild (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - let i = 0 - do { - const a = this.build[i] - const b = other.build[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - } - - // preminor will bump the version up to the next minor release, and immediately - // down to pre-release. premajor and prepatch work the same way. - inc (release, identifier) { - switch (release) { - case 'premajor': - this.prerelease.length = 0 - this.patch = 0 - this.minor = 0 - this.major++ - this.inc('pre', identifier) - break - case 'preminor': - this.prerelease.length = 0 - this.patch = 0 - this.minor++ - this.inc('pre', identifier) - break - case 'prepatch': - // If this is already a prerelease, it will bump to the next version - // drop any prereleases that might already exist, since they are not - // relevant at this point. - this.prerelease.length = 0 - this.inc('patch', identifier) - this.inc('pre', identifier) - break - // If the input is a non-prerelease version, this acts the same as - // prepatch. - case 'prerelease': - if (this.prerelease.length === 0) { - this.inc('patch', identifier) - } - this.inc('pre', identifier) - break - - case 'major': - // If this is a pre-major version, bump up to the same major version. - // Otherwise increment major. - // 1.0.0-5 bumps to 1.0.0 - // 1.1.0 bumps to 2.0.0 - if ( - this.minor !== 0 || - this.patch !== 0 || - this.prerelease.length === 0 - ) { - this.major++ - } - this.minor = 0 - this.patch = 0 - this.prerelease = [] - break - case 'minor': - // If this is a pre-minor version, bump up to the same minor version. - // Otherwise increment minor. - // 1.2.0-5 bumps to 1.2.0 - // 1.2.1 bumps to 1.3.0 - if (this.patch !== 0 || this.prerelease.length === 0) { - this.minor++ - } - this.patch = 0 - this.prerelease = [] - break - case 'patch': - // If this is not a pre-release version, it will increment the patch. - // If it is a pre-release it will bump up to the same patch version. - // 1.2.0-5 patches to 1.2.0 - // 1.2.0 patches to 1.2.1 - if (this.prerelease.length === 0) { - this.patch++ - } - this.prerelease = [] - break - // This probably shouldn't be used publicly. - // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction. - case 'pre': - if (this.prerelease.length === 0) { - this.prerelease = [0] - } else { - let i = this.prerelease.length - while (--i >= 0) { - if (typeof this.prerelease[i] === 'number') { - this.prerelease[i]++ - i = -2 - } - } - if (i === -1) { - // didn't increment anything - this.prerelease.push(0) - } - } - if (identifier) { - // 1.2.0-beta.1 bumps to 1.2.0-beta.2, - // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 - if (this.prerelease[0] === identifier) { - if (isNaN(this.prerelease[1])) { - this.prerelease = [identifier, 0] - } - } else { - this.prerelease = [identifier, 0] - } - } - break - - default: - throw new Error(`invalid increment argument: ${release}`) - } - this.format() - this.raw = this.version - return this - } -} - -module.exports = SemVer - - -/***/ }), - -/***/ 5098: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const eq = __nccwpck_require__(1898) -const neq = __nccwpck_require__(6017) -const gt = __nccwpck_require__(4123) -const gte = __nccwpck_require__(5522) -const lt = __nccwpck_require__(194) -const lte = __nccwpck_require__(7520) - -const cmp = (a, op, b, loose) => { - switch (op) { - case '===': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a === b - - case '!==': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a !== b - - case '': - case '=': - case '==': - return eq(a, b, loose) - - case '!=': - return neq(a, b, loose) - - case '>': - return gt(a, b, loose) - - case '>=': - return gte(a, b, loose) - - case '<': - return lt(a, b, loose) - - case '<=': - return lte(a, b, loose) - - default: - throw new TypeError(`Invalid operator: ${op}`) - } -} -module.exports = cmp - - -/***/ }), - -/***/ 4309: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const SemVer = __nccwpck_require__(8088) -const compare = (a, b, loose) => - new SemVer(a, loose).compare(new SemVer(b, loose)) - -module.exports = compare - - -/***/ }), - -/***/ 1898: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const eq = (a, b, loose) => compare(a, b, loose) === 0 -module.exports = eq - - -/***/ }), - -/***/ 4123: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const gt = (a, b, loose) => compare(a, b, loose) > 0 -module.exports = gt - - -/***/ }), - -/***/ 5522: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const gte = (a, b, loose) => compare(a, b, loose) >= 0 -module.exports = gte - - -/***/ }), - -/***/ 194: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const lt = (a, b, loose) => compare(a, b, loose) < 0 -module.exports = lt - - -/***/ }), - -/***/ 7520: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const lte = (a, b, loose) => compare(a, b, loose) <= 0 -module.exports = lte - - -/***/ }), - -/***/ 6017: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const compare = __nccwpck_require__(4309) -const neq = (a, b, loose) => compare(a, b, loose) !== 0 -module.exports = neq - - -/***/ }), - -/***/ 5925: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const {MAX_LENGTH} = __nccwpck_require__(2293) -const { re, t } = __nccwpck_require__(9523) -const SemVer = __nccwpck_require__(8088) - -const parseOptions = __nccwpck_require__(785) -const parse = (version, options) => { - options = parseOptions(options) - - if (version instanceof SemVer) { - return version - } - - if (typeof version !== 'string') { - return null - } - - if (version.length > MAX_LENGTH) { - return null - } - - const r = options.loose ? re[t.LOOSE] : re[t.FULL] - if (!r.test(version)) { - return null - } - - try { - return new SemVer(version, options) - } catch (er) { - return null - } -} - -module.exports = parse - - -/***/ }), - -/***/ 6055: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const Range = __nccwpck_require__(9828) -const satisfies = (version, range, options) => { - try { - range = new Range(range, options) - } catch (er) { - return false - } - return range.test(version) -} -module.exports = satisfies - - -/***/ }), - -/***/ 2293: -/***/ ((module) => { - -// Note: this is the semver.org version of the spec that it implements -// Not necessarily the package version of this code. -const SEMVER_SPEC_VERSION = '2.0.0' - -const MAX_LENGTH = 256 -const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || - /* istanbul ignore next */ 9007199254740991 - -// Max safe segment length for coercion. -const MAX_SAFE_COMPONENT_LENGTH = 16 - -module.exports = { - SEMVER_SPEC_VERSION, - MAX_LENGTH, - MAX_SAFE_INTEGER, - MAX_SAFE_COMPONENT_LENGTH -} - - -/***/ }), - -/***/ 427: -/***/ ((module) => { - -const debug = ( - typeof process === 'object' && - process.env && - process.env.NODE_DEBUG && - /\bsemver\b/i.test(process.env.NODE_DEBUG) -) ? (...args) => console.error('SEMVER', ...args) - : () => {} - -module.exports = debug - - -/***/ }), - -/***/ 2463: -/***/ ((module) => { - -const numeric = /^[0-9]+$/ -const compareIdentifiers = (a, b) => { - const anum = numeric.test(a) - const bnum = numeric.test(b) - - if (anum && bnum) { - a = +a - b = +b - } - - return a === b ? 0 - : (anum && !bnum) ? -1 - : (bnum && !anum) ? 1 - : a < b ? -1 - : 1 -} - -const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a) - -module.exports = { - compareIdentifiers, - rcompareIdentifiers -} - - -/***/ }), - -/***/ 785: -/***/ ((module) => { - -// parse out just the options we care about so we always get a consistent -// obj with keys in a consistent order. -const opts = ['includePrerelease', 'loose', 'rtl'] -const parseOptions = options => - !options ? {} - : typeof options !== 'object' ? { loose: true } - : opts.filter(k => options[k]).reduce((options, k) => { - options[k] = true - return options - }, {}) -module.exports = parseOptions - - -/***/ }), - -/***/ 9523: -/***/ ((module, exports, __nccwpck_require__) => { - -const { MAX_SAFE_COMPONENT_LENGTH } = __nccwpck_require__(2293) -const debug = __nccwpck_require__(427) -exports = module.exports = {} - -// The actual regexps go on exports.re -const re = exports.re = [] -const src = exports.src = [] -const t = exports.t = {} -let R = 0 - -const createToken = (name, value, isGlobal) => { - const index = R++ - debug(index, value) - t[name] = index - src[index] = value - re[index] = new RegExp(value, isGlobal ? 'g' : undefined) -} - -// The following Regular Expressions can be used for tokenizing, -// validating, and parsing SemVer version strings. - -// ## Numeric Identifier -// A single `0`, or a non-zero digit followed by zero or more digits. - -createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*') -createToken('NUMERICIDENTIFIERLOOSE', '[0-9]+') - -// ## Non-numeric Identifier -// Zero or more digits, followed by a letter or hyphen, and then zero or -// more letters, digits, or hyphens. - -createToken('NONNUMERICIDENTIFIER', '\\d*[a-zA-Z-][a-zA-Z0-9-]*') - -// ## Main Version -// Three dot-separated numeric identifiers. - -createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})`) - -createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})`) - -// ## Pre-release Version Identifier -// A numeric identifier, or a non-numeric identifier. - -createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER] -}|${src[t.NONNUMERICIDENTIFIER]})`) - -createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE] -}|${src[t.NONNUMERICIDENTIFIER]})`) - -// ## Pre-release Version -// Hyphen, followed by one or more dot-separated pre-release version -// identifiers. - -createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER] -}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`) - -createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE] -}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`) - -// ## Build Metadata Identifier -// Any combination of digits, letters, or hyphens. - -createToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+') - -// ## Build Metadata -// Plus sign, followed by one or more period-separated build metadata -// identifiers. - -createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER] -}(?:\\.${src[t.BUILDIDENTIFIER]})*))`) - -// ## Full Version String -// A main version, followed optionally by a pre-release version and -// build metadata. - -// Note that the only major, minor, patch, and pre-release sections of -// the version string are capturing groups. The build metadata is not a -// capturing group, because it should not ever be used in version -// comparison. - -createToken('FULLPLAIN', `v?${src[t.MAINVERSION] -}${src[t.PRERELEASE]}?${ - src[t.BUILD]}?`) - -createToken('FULL', `^${src[t.FULLPLAIN]}$`) - -// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. -// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty -// common in the npm registry. -createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE] -}${src[t.PRERELEASELOOSE]}?${ - src[t.BUILD]}?`) - -createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`) - -createToken('GTLT', '((?:<|>)?=?)') - -// Something like "2.*" or "1.2.x". -// Note that "x.x" is a valid xRange identifer, meaning "any version" -// Only the first item is strictly required. -createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`) -createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`) - -createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:${src[t.PRERELEASE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:${src[t.PRERELEASELOOSE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`) -createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`) - -// Coercion. -// Extract anything that could conceivably be a part of a valid semver -createToken('COERCE', `${'(^|[^\\d])' + - '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + - `(?:$|[^\\d])`) -createToken('COERCERTL', src[t.COERCE], true) - -// Tilde ranges. -// Meaning is "reasonably at or greater than" -createToken('LONETILDE', '(?:~>?)') - -createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true) -exports.tildeTrimReplace = '$1~' - -createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`) -createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`) - -// Caret ranges. -// Meaning is "at least and backwards compatible with" -createToken('LONECARET', '(?:\\^)') - -createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true) -exports.caretTrimReplace = '$1^' - -createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`) -createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`) - -// A simple gt/lt/eq thing, or just "" to indicate "any version" -createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`) -createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`) - -// An expression to strip any whitespace between the gtlt and the thing -// it modifies, so that `> 1.2.3` ==> `>1.2.3` -createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT] -}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true) -exports.comparatorTrimReplace = '$1$2$3' - -// Something like `1.2.3 - 1.2.4` -// Note that these all use the loose form, because they'll be -// checked against either the strict or loose comparator form -// later. -createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAIN]})` + - `\\s*$`) - -createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAINLOOSE]})` + - `\\s*$`) - -// Star ranges basically just allow anything at all. -createToken('STAR', '(<|>)?=?\\s*\\*') -// >=0.0.0 is like a star -createToken('GTE0', '^\\s*>=\\s*0\.0\.0\\s*$') -createToken('GTE0PRE', '^\\s*>=\\s*0\.0\.0-0\\s*$') - - -/***/ }), - -/***/ 1196: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - - -// A linked list to keep track of recently-used-ness -const Yallist = __nccwpck_require__(220) - -const MAX = Symbol('max') -const LENGTH = Symbol('length') -const LENGTH_CALCULATOR = Symbol('lengthCalculator') -const ALLOW_STALE = Symbol('allowStale') -const MAX_AGE = Symbol('maxAge') -const DISPOSE = Symbol('dispose') -const NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet') -const LRU_LIST = Symbol('lruList') -const CACHE = Symbol('cache') -const UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet') - -const naiveLength = () => 1 - -// lruList is a yallist where the head is the youngest -// item, and the tail is the oldest. the list contains the Hit -// objects as the entries. -// Each Hit object has a reference to its Yallist.Node. This -// never changes. -// -// cache is a Map (or PseudoMap) that matches the keys to -// the Yallist.Node object. -class LRUCache { - constructor (options) { - if (typeof options === 'number') - options = { max: options } - - if (!options) - options = {} - - if (options.max && (typeof options.max !== 'number' || options.max < 0)) - throw new TypeError('max must be a non-negative number') - // Kind of weird to have a default max of Infinity, but oh well. - const max = this[MAX] = options.max || Infinity - - const lc = options.length || naiveLength - this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc - this[ALLOW_STALE] = options.stale || false - if (options.maxAge && typeof options.maxAge !== 'number') - throw new TypeError('maxAge must be a number') - this[MAX_AGE] = options.maxAge || 0 - this[DISPOSE] = options.dispose - this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false - this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false - this.reset() - } - - // resize the cache when the max changes. - set max (mL) { - if (typeof mL !== 'number' || mL < 0) - throw new TypeError('max must be a non-negative number') - - this[MAX] = mL || Infinity - trim(this) - } - get max () { - return this[MAX] - } - - set allowStale (allowStale) { - this[ALLOW_STALE] = !!allowStale - } - get allowStale () { - return this[ALLOW_STALE] - } - - set maxAge (mA) { - if (typeof mA !== 'number') - throw new TypeError('maxAge must be a non-negative number') - - this[MAX_AGE] = mA - trim(this) - } - get maxAge () { - return this[MAX_AGE] - } - - // resize the cache when the lengthCalculator changes. - set lengthCalculator (lC) { - if (typeof lC !== 'function') - lC = naiveLength - - if (lC !== this[LENGTH_CALCULATOR]) { - this[LENGTH_CALCULATOR] = lC - this[LENGTH] = 0 - this[LRU_LIST].forEach(hit => { - hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key) - this[LENGTH] += hit.length - }) - } - trim(this) - } - get lengthCalculator () { return this[LENGTH_CALCULATOR] } - - get length () { return this[LENGTH] } - get itemCount () { return this[LRU_LIST].length } - - rforEach (fn, thisp) { - thisp = thisp || this - for (let walker = this[LRU_LIST].tail; walker !== null;) { - const prev = walker.prev - forEachStep(this, fn, walker, thisp) - walker = prev - } - } - - forEach (fn, thisp) { - thisp = thisp || this - for (let walker = this[LRU_LIST].head; walker !== null;) { - const next = walker.next - forEachStep(this, fn, walker, thisp) - walker = next - } - } - - keys () { - return this[LRU_LIST].toArray().map(k => k.key) - } - - values () { - return this[LRU_LIST].toArray().map(k => k.value) - } - - reset () { - if (this[DISPOSE] && - this[LRU_LIST] && - this[LRU_LIST].length) { - this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value)) - } - - this[CACHE] = new Map() // hash of items by key - this[LRU_LIST] = new Yallist() // list of items in order of use recency - this[LENGTH] = 0 // length of items in the list - } - - dump () { - return this[LRU_LIST].map(hit => - isStale(this, hit) ? false : { - k: hit.key, - v: hit.value, - e: hit.now + (hit.maxAge || 0) - }).toArray().filter(h => h) - } - - dumpLru () { - return this[LRU_LIST] - } - - set (key, value, maxAge) { - maxAge = maxAge || this[MAX_AGE] - - if (maxAge && typeof maxAge !== 'number') - throw new TypeError('maxAge must be a number') - - const now = maxAge ? Date.now() : 0 - const len = this[LENGTH_CALCULATOR](value, key) - - if (this[CACHE].has(key)) { - if (len > this[MAX]) { - del(this, this[CACHE].get(key)) - return false - } - - const node = this[CACHE].get(key) - const item = node.value - - // dispose of the old one before overwriting - // split out into 2 ifs for better coverage tracking - if (this[DISPOSE]) { - if (!this[NO_DISPOSE_ON_SET]) - this[DISPOSE](key, item.value) - } - - item.now = now - item.maxAge = maxAge - item.value = value - this[LENGTH] += len - item.length - item.length = len - this.get(key) - trim(this) - return true - } - - const hit = new Entry(key, value, len, now, maxAge) - - // oversized objects fall out of cache automatically. - if (hit.length > this[MAX]) { - if (this[DISPOSE]) - this[DISPOSE](key, value) - - return false - } - - this[LENGTH] += hit.length - this[LRU_LIST].unshift(hit) - this[CACHE].set(key, this[LRU_LIST].head) - trim(this) - return true - } - - has (key) { - if (!this[CACHE].has(key)) return false - const hit = this[CACHE].get(key).value - return !isStale(this, hit) - } - - get (key) { - return get(this, key, true) - } - - peek (key) { - return get(this, key, false) - } - - pop () { - const node = this[LRU_LIST].tail - if (!node) - return null - - del(this, node) - return node.value - } - - del (key) { - del(this, this[CACHE].get(key)) - } - - load (arr) { - // reset the cache - this.reset() - - const now = Date.now() - // A previous serialized cache has the most recent items first - for (let l = arr.length - 1; l >= 0; l--) { - const hit = arr[l] - const expiresAt = hit.e || 0 - if (expiresAt === 0) - // the item was created without expiration in a non aged cache - this.set(hit.k, hit.v) - else { - const maxAge = expiresAt - now - // dont add already expired items - if (maxAge > 0) { - this.set(hit.k, hit.v, maxAge) - } - } - } - } - - prune () { - this[CACHE].forEach((value, key) => get(this, key, false)) - } -} - -const get = (self, key, doUse) => { - const node = self[CACHE].get(key) - if (node) { - const hit = node.value - if (isStale(self, hit)) { - del(self, node) - if (!self[ALLOW_STALE]) - return undefined - } else { - if (doUse) { - if (self[UPDATE_AGE_ON_GET]) - node.value.now = Date.now() - self[LRU_LIST].unshiftNode(node) - } - } - return hit.value - } -} - -const isStale = (self, hit) => { - if (!hit || (!hit.maxAge && !self[MAX_AGE])) - return false - - const diff = Date.now() - hit.now - return hit.maxAge ? diff > hit.maxAge - : self[MAX_AGE] && (diff > self[MAX_AGE]) -} - -const trim = self => { - if (self[LENGTH] > self[MAX]) { - for (let walker = self[LRU_LIST].tail; - self[LENGTH] > self[MAX] && walker !== null;) { - // We know that we're about to delete this one, and also - // what the next least recently used key will be, so just - // go ahead and set it now. - const prev = walker.prev - del(self, walker) - walker = prev - } - } -} - -const del = (self, node) => { - if (node) { - const hit = node.value - if (self[DISPOSE]) - self[DISPOSE](hit.key, hit.value) - - self[LENGTH] -= hit.length - self[CACHE].delete(hit.key) - self[LRU_LIST].removeNode(node) - } -} - -class Entry { - constructor (key, value, length, now, maxAge) { - this.key = key - this.value = value - this.length = length - this.now = now - this.maxAge = maxAge || 0 - } -} - -const forEachStep = (self, fn, node, thisp) => { - let hit = node.value - if (isStale(self, hit)) { - del(self, node) - if (!self[ALLOW_STALE]) - hit = undefined - } - if (hit) - fn.call(thisp, hit.value, hit.key, self) -} - -module.exports = LRUCache - - -/***/ }), - -/***/ 5327: -/***/ ((module) => { - -"use strict"; - -module.exports = function (Yallist) { - Yallist.prototype[Symbol.iterator] = function* () { - for (let walker = this.head; walker; walker = walker.next) { - yield walker.value - } - } -} - - -/***/ }), - -/***/ 220: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - -module.exports = Yallist - -Yallist.Node = Node -Yallist.create = Yallist - -function Yallist (list) { - var self = this - if (!(self instanceof Yallist)) { - self = new Yallist() - } - - self.tail = null - self.head = null - self.length = 0 - - if (list && typeof list.forEach === 'function') { - list.forEach(function (item) { - self.push(item) - }) - } else if (arguments.length > 0) { - for (var i = 0, l = arguments.length; i < l; i++) { - self.push(arguments[i]) - } - } - - return self -} - -Yallist.prototype.removeNode = function (node) { - if (node.list !== this) { - throw new Error('removing node which does not belong to this list') - } - - var next = node.next - var prev = node.prev - - if (next) { - next.prev = prev - } - - if (prev) { - prev.next = next - } - - if (node === this.head) { - this.head = next - } - if (node === this.tail) { - this.tail = prev - } - - node.list.length-- - node.next = null - node.prev = null - node.list = null - - return next -} - -Yallist.prototype.unshiftNode = function (node) { - if (node === this.head) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var head = this.head - node.list = this - node.next = head - if (head) { - head.prev = node - } - - this.head = node - if (!this.tail) { - this.tail = node - } - this.length++ -} - -Yallist.prototype.pushNode = function (node) { - if (node === this.tail) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var tail = this.tail - node.list = this - node.prev = tail - if (tail) { - tail.next = node - } - - this.tail = node - if (!this.head) { - this.head = node - } - this.length++ -} - -Yallist.prototype.push = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - push(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.unshift = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - unshift(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.pop = function () { - if (!this.tail) { - return undefined - } - - var res = this.tail.value - this.tail = this.tail.prev - if (this.tail) { - this.tail.next = null - } else { - this.head = null - } - this.length-- - return res -} - -Yallist.prototype.shift = function () { - if (!this.head) { - return undefined - } - - var res = this.head.value - this.head = this.head.next - if (this.head) { - this.head.prev = null - } else { - this.tail = null - } - this.length-- - return res -} - -Yallist.prototype.forEach = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.head, i = 0; walker !== null; i++) { - fn.call(thisp, walker.value, i, this) - walker = walker.next - } -} - -Yallist.prototype.forEachReverse = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.tail, i = this.length - 1; walker !== null; i--) { - fn.call(thisp, walker.value, i, this) - walker = walker.prev - } -} - -Yallist.prototype.get = function (n) { - for (var i = 0, walker = this.head; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.next - } - if (i === n && walker !== null) { - return walker.value - } -} - -Yallist.prototype.getReverse = function (n) { - for (var i = 0, walker = this.tail; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.prev - } - if (i === n && walker !== null) { - return walker.value - } -} - -Yallist.prototype.map = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.head; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.next - } - return res -} - -Yallist.prototype.mapReverse = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.tail; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.prev - } - return res -} - -Yallist.prototype.reduce = function (fn, initial) { - var acc - var walker = this.head - if (arguments.length > 1) { - acc = initial - } else if (this.head) { - walker = this.head.next - acc = this.head.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } - - for (var i = 0; walker !== null; i++) { - acc = fn(acc, walker.value, i) - walker = walker.next - } - - return acc -} - -Yallist.prototype.reduceReverse = function (fn, initial) { - var acc - var walker = this.tail - if (arguments.length > 1) { - acc = initial - } else if (this.tail) { - walker = this.tail.prev - acc = this.tail.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } - - for (var i = this.length - 1; walker !== null; i--) { - acc = fn(acc, walker.value, i) - walker = walker.prev - } - - return acc -} - -Yallist.prototype.toArray = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.head; walker !== null; i++) { - arr[i] = walker.value - walker = walker.next - } - return arr -} - -Yallist.prototype.toArrayReverse = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.tail; walker !== null; i++) { - arr[i] = walker.value - walker = walker.prev - } - return arr -} - -Yallist.prototype.slice = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = 0, walker = this.head; walker !== null && i < from; i++) { - walker = walker.next - } - for (; walker !== null && i < to; i++, walker = walker.next) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.sliceReverse = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) { - walker = walker.prev - } - for (; walker !== null && i > from; i--, walker = walker.prev) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.splice = function (start, deleteCount, ...nodes) { - if (start > this.length) { - start = this.length - 1 - } - if (start < 0) { - start = this.length + start; - } - - for (var i = 0, walker = this.head; walker !== null && i < start; i++) { - walker = walker.next - } - - var ret = [] - for (var i = 0; walker && i < deleteCount; i++) { - ret.push(walker.value) - walker = this.removeNode(walker) - } - if (walker === null) { - walker = this.tail - } - - if (walker !== this.head && walker !== this.tail) { - walker = walker.prev - } - - for (var i = 0; i < nodes.length; i++) { - walker = insert(this, walker, nodes[i]) - } - return ret; -} - -Yallist.prototype.reverse = function () { - var head = this.head - var tail = this.tail - for (var walker = head; walker !== null; walker = walker.prev) { - var p = walker.prev - walker.prev = walker.next - walker.next = p - } - this.head = tail - this.tail = head - return this -} - -function insert (self, node, value) { - var inserted = node === self.head ? - new Node(value, null, node, self) : - new Node(value, node, node.next, self) - - if (inserted.next === null) { - self.tail = inserted - } - if (inserted.prev === null) { - self.head = inserted - } - - self.length++ - - return inserted -} - -function push (self, item) { - self.tail = new Node(item, self.tail, null, self) - if (!self.head) { - self.head = self.tail - } - self.length++ -} - -function unshift (self, item) { - self.head = new Node(item, null, self.head, self) - if (!self.tail) { - self.tail = self.head - } - self.length++ -} - -function Node (value, prev, next, list) { - if (!(this instanceof Node)) { - return new Node(value, prev, next, list) - } - - this.list = list - this.value = value - - if (prev) { - prev.next = this - this.prev = prev - } else { - this.prev = null - } - - if (next) { - next.prev = this - this.next = next - } else { - this.next = null - } -} - -try { - // add if support for Symbol.iterator is present - __nccwpck_require__(5327)(Yallist) -} catch (er) {} - - /***/ }), /***/ 4294: diff --git a/.github/libs/GithubUtils.js b/.github/libs/GithubUtils.js index 3dc8d9aefcca..8930cfa00f5b 100644 --- a/.github/libs/GithubUtils.js +++ b/.github/libs/GithubUtils.js @@ -1,7 +1,5 @@ const _ = require('underscore'); const lodashGet = require('lodash/get'); -const semverParse = require('semver/functions/parse'); -const semverSatisfies = require('semver/functions/satisfies'); const GITHUB_OWNER = 'Expensify'; const EXPENSIFY_CASH_REPO = 'Expensify.cash'; @@ -62,11 +60,6 @@ class GithubUtils { try { const versionRegex = new RegExp('([0-9]+)\\.([0-9]+)\\.([0-9]+)(?:-([0-9]+))?', 'g'); const tag = issue.body.match(versionRegex)[0].replace(/`/g, ''); - - // eslint-disable-next-line max-len - const compareURLRegex = new RegExp(`${EXPENSIFY_CASH_URL}/compare/${versionRegex.source}\\.\\.\\.${versionRegex.source}`, 'g'); - const comparisonURL = issue.body.match(compareURLRegex)[0]; - return { title: issue.title, url: issue.url, @@ -74,7 +67,6 @@ class GithubUtils { PRList: this.getStagingDeployCashPRList(issue), deployBlockers: this.getStagingDeployCashDeployBlockers(issue), tag, - comparisonURL, }; } catch (exception) { throw new Error(`Unable to find ${STAGING_DEPLOY_CASH_LABEL} issue with correct data.`); @@ -149,71 +141,6 @@ class GithubUtils { ); } - /** - * Generate a comparison URL between two versions following the semverLevel passed - * - * @param {String} repoSlug - The slug of the repository: / - * @param {String} tag - The tag to compare first the previous semverLevel - * @param {String} semverLevel - The semantic versioning MAJOR, MINOR, PATCH and BUILD - * @return {Promise} the url generated - * @throws {Error} If the request to the Github API fails. - */ - generateVersionComparisonURL(repoSlug, tag, semverLevel) { - return new Promise((resolve, reject) => { - const getComparisonURL = (previousTag, currentTag) => ( - `${EXPENSIFY_CASH_URL}/compare/${previousTag}...${currentTag}` - ); - - const [repoOwner, repoName] = repoSlug.split('/'); - const tagSemver = semverParse(tag); - - return this.octokit.repos.listTags({ - owner: repoOwner, - repo: repoName, - }) - .then(githubResponse => githubResponse.data.some(({name: repoTag}) => { - if (semverLevel === 'MAJOR' - && semverSatisfies(repoTag, `<${tagSemver.major}.x.x`, {includePrerelease: true}) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'MINOR' - && semverSatisfies( - repoTag, - `<${tagSemver.major}.${tagSemver.minor}.x`, - {includePrerelease: true}, - ) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'PATCH' - && semverSatisfies(repoTag, `<${tagSemver}`, {includePrerelease: true}) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - - if (semverLevel === 'BUILD' - && repoTag !== tagSemver.version - && semverSatisfies( - repoTag, - `<=${tagSemver.major}.${tagSemver.minor}.${tagSemver.patch}`, - {includePrerelease: true}, - ) - ) { - resolve(getComparisonURL(repoTag, tagSemver)); - return true; - } - return false; - })) - .catch(githubError => reject(githubError)); - }); - } - /** * Creates a new StagingDeployCash issue. * @@ -309,22 +236,16 @@ class GithubUtils { deployBlockers = [], resolvedDeployBlockers = [], ) { - return Promise.all([ - this.generateVersionComparisonURL(`${GITHUB_OWNER}/${EXPENSIFY_CASH_REPO}`, tag, 'PATCH'), - this.octokit.pulls.list({ - owner: GITHUB_OWNER, - repo: EXPENSIFY_CASH_REPO, - per_page: 100, - }), - ]) - .then(results => ({ - comparisonURL: results[0], - automergePRs: _.map( - _.filter(results[1].data, GithubUtils.isAutomergePullRequest), + return this.octokit.pulls.list({ + owner: GITHUB_OWNER, + repo: EXPENSIFY_CASH_REPO, + per_page: 100, + }) + .then(({data}) => { + const automergePRs = _.pluck( + _.filter(data, GithubUtils.isAutomergePullRequest), 'html_url', - ), - })) - .then(({comparisonURL, automergePRs}) => { + ); const sortedPRList = _.chain(PRList) .difference(automergePRs) .unique() @@ -336,8 +257,8 @@ class GithubUtils { ); // Tag version and comparison URL - let issueBody = `**Release Version:** \`${tag}\`\r\n`; - issueBody += `**Compare Changes:** ${comparisonURL}\r\n`; + // eslint-disable-next-line max-len + let issueBody = `**Release Version:** \`${tag}\`\r\n**Compare Changes:** https://github.com/Expensify/Expensify.cash/compare/production...staging\r\n`; // PR list if (!_.isEmpty(PRList)) { @@ -358,11 +279,13 @@ class GithubUtils { } issueBody += '\r\ncc @Expensify/applauseleads\r\n'; - return issueBody; }) - // eslint-disable-next-line no-console - .catch(err => console.warn('Error generating comparison URL, continuing...', err)); + .catch(err => console.warn( + 'Error generating StagingDeployCash issue body!', + 'Automerge PRs may not be properly filtered out. Continuing...', + err, + )); } /** diff --git a/.github/scripts/buildActions.sh b/.github/scripts/buildActions.sh index bdcff5ab7882..bf43372e5da0 100755 --- a/.github/scripts/buildActions.sh +++ b/.github/scripts/buildActions.sh @@ -10,12 +10,14 @@ ACTIONS_DIR="$(dirname "$(dirname "$0")")/actions" # List of paths to all JS files that implement our GH Actions declare -r GITHUB_ACTIONS=( "$ACTIONS_DIR/bumpVersion/bumpVersion.js" + "$ACTIONS_DIR/checkDeployBlockers/checkDeployBlockers.js" "$ACTIONS_DIR/createOrUpdateStagingDeploy/createOrUpdateStagingDeploy.js" "$ACTIONS_DIR/getReleaseBody/getReleaseBody.js" "$ACTIONS_DIR/getReleasePullRequestList/getReleasePullRequestList.js" "$ACTIONS_DIR/isPullRequestMergeable/isPullRequestMergeable.js" "$ACTIONS_DIR/isStagingDeployLocked/isStagingDeployLocked.js" "$ACTIONS_DIR/markPullRequestsAsDeployed/markPullRequestsAsDeployed.js" + "$ACTIONS_DIR/reopenIssueWithComment/reopenIssueWithComment.js" ) # This will be inserted at the top of all compiled files as a warning to devs. diff --git a/.github/scripts/verifyActions.sh b/.github/scripts/verifyActions.sh index baf32e364d43..945e5d151a0d 100755 --- a/.github/scripts/verifyActions.sh +++ b/.github/scripts/verifyActions.sh @@ -22,7 +22,7 @@ if [[ EXIT_CODE -eq 0 ]]; then echo -e "${GREEN}Github Actions are up to date!${NC}" exit 0 else - echo -e "${RED}Error: Diff found when Github Actions were rebuilt. Did you forget to run \`npm run gh-actions-build\`?${NC}" + echo -e "${RED}Error: Diff found when Github Actions were rebuilt. Did you forget to run \`npm run gh-actions-build\`? Do you need to merge master?${NC}" echo "$DIFF_OUTPUT" | $LIB_PATH/diff-so-fancy | less --tabs=4 -RFX exit 1 fi diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index e145258219d6..c9ff3c65ee9e 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -44,6 +44,9 @@ jobs: env: LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} + - name: Set version in ENV + run: echo "VERSION_CODE=$(grep -o 'versionCode\s\+\d\+' android/app/build.gradle | awk '{ print $2 }')" >> $GITHUB_ENV + - name: Run Fastlane beta if: ${{ env.SHOULD_DEPLOY_PRODUCTION == 'false' }} run: bundle exec fastlane android beta @@ -52,7 +55,7 @@ jobs: if: ${{ env.SHOULD_DEPLOY_PRODUCTION == 'true' }} run: bundle exec fastlane android production env: - VERSION: ${{ env.VERSION }} + VERSION: ${{ env.VERSION_CODE }} # These Slack steps are duplicated in all workflows, if you make a change to this step, make sure to update all # the other workflows with the same changes @@ -74,7 +77,3 @@ jobs: env: GITHUB_TOKEN: ${{ github.token }} SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} - - - name: Set version in ENV - if: ${{ success() }} - run: echo "VERSION=$(npm run print-version --silent)" >> $GITHUB_ENV diff --git a/.github/workflows/finishReleaseCycle.yml b/.github/workflows/finishReleaseCycle.yml index afa5496bb2d5..58b608aacb46 100644 --- a/.github/workflows/finishReleaseCycle.yml +++ b/.github/workflows/finishReleaseCycle.yml @@ -6,12 +6,38 @@ on: # The updateProduction and createNewStagingDeployCash jobs are executed when a StagingDeployCash is closed. jobs: + checkDeployBlockers: + runs-on: ubuntu-latest + if: contains(github.event.issue.labels.*.name, 'StagingDeployCash') + + outputs: + hasDeployBlockers: ${{ steps.checkDeployBlockers.outputs.HAS_DEPLOY_BLOCKERS }} + + steps: + - name: Check for any deploy blockers + id: checkDeployBlockers + uses: Expensify/Expensify.cash/.github/actions/checkDeployBlockers@master + with: + GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }} + ISSUE_NUMBER: ${{ github.event.issue.number }} + + - name: Reopen and comment on issue + if: ${{ steps.checkDeployBlockers.outputs.HAS_DEPLOY_BLOCKERS == 'true' }} + uses: Expensify/Expensify.cash/.github/actions/reopenIssueWithComment@master + with: + GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }} + ISSUE_NUMBER: ${{ github.event.issue.number }} + COMMENT: | + This issue either has unchecked QA steps or has not yet been marked with the `:shipit:` emoji of approval. + Reopening! + # Update the production branch to trigger the production deploy. updateProduction: runs-on: ubuntu-latest # Note: Anyone with Triage access to the Expensify.cash repo can trigger a production deploy - if: contains(github.event.issue.labels.*.name, 'StagingDeployCash') + needs: checkDeployBlockers + if: ${{ needs.checkDeployBlockers.outputs.hasDeployBlockers == 'false' }} steps: - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f with: @@ -60,7 +86,8 @@ jobs: # Deploy deferred PRs to staging and create a new StagingDeployCash for the next release cycle. createNewStagingDeployCash: runs-on: macos-latest - if: contains(github.event.issue.labels.*.name, 'StagingDeployCash') + needs: checkDeployBlockers + if: ${{ needs.checkDeployBlockers.outputs.hasDeployBlockers == 'false' }} steps: # Version: 2.3.4 - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f diff --git a/.github/workflows/verifyGithubActionBuilds.yml b/.github/workflows/verifyGithubActionBuilds.yml deleted file mode 100644 index 21fa3213259b..000000000000 --- a/.github/workflows/verifyGithubActionBuilds.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: Verify Github Action Builds - -on: - pull_request: - types: [opened, synchronize] - branches-ignore: [staging, production] - -jobs: - verify: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - name: Use Node.js - uses: actions/setup-node@v1 - with: - node-version: '14.x' - - - name: Install node packages - uses: nick-invision/retry@7c68161adf97a48beb850a595b8784ec57a98cbb - with: - timeout_minutes: 10 - max_attempts: 5 - command: npm ci - - # Rebuild all the actions on this branch and check for a diff. Fail if there is one, - # because that would be a sign that the PR author did not rebuild the Github Actions - - run: ./.github/scripts/verifyActions.sh diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e5c164c7df84..bd6b1fd5792d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,7 +11,7 @@ You can create as many accounts as needed in order to test your changes directly This project and everyone participating in it is governed by the Expensify [Code of Conduct](https://github.com/Expensify/Expensify.cash/blob/master/CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to [contributors@expensify.com](mailto:contributors@expensify.com). ## Asking Questions -If you have any general questions, please ask in the #expensify-contributors Slack channel. To request an invite to the channel, just email contributors@expensify.com with the subject `Slack Channel Invite` and we'll send you an invite! The Expensify team will not be able to respond to direct messages in Slack. +If you have any general questions, please ask in the #expensify-open-source Slack channel. To request an invite to the channel, just email contributors@expensify.com with the subject `Slack Channel Invite` and we'll send you an invite! The Expensify team will not be able to respond to direct messages in Slack. If you are hired for an Upwork job and have any job-specific questions, please ask in the GitHub issue or pull request. This will ensure that the person addressing your question has as much context as possible. @@ -82,7 +82,7 @@ In this scenario, itā€™s possible that you found a bug or enhancement that we ha #### Timeline expectations and asking for help along the way - If you have made a change to your pull request and are ready for another review, leave a comment that says "Updated" on the pull request itself. - Please keep the conversation in GitHub, and do not ping individual reviewers in Slack or Upwork to get their attention. -- Pull Request reviews can sometimes take a few days. If your pull request has not been addressed after four days please let us know via the #expensify-contributors Slack channel. +- Pull Request reviews can sometimes take a few days. If your pull request has not been addressed after four days please let us know via the #expensify-open-source Slack channel. #### Important note about JavaScript Style - Read our official [JavaScript and React style guide](STYLE.md). Please refer to our Style Guide before asking for a review. diff --git a/STYLE.md b/STYLE.md index 3850c5463239..f1eaedfdab47 100644 --- a/STYLE.md +++ b/STYLE.md @@ -580,7 +580,7 @@ if (type.prototype && type.prototype.isPureReactComponent) { Always extend from `React.Component` and use a class component when: - A component needs some data passed to it from a parent holding the data in `this.state`. A class component would hold this data in state and pass it down to the child via props. - If you need to perform some kind of side-effect after the component mounts (`componentDidMount()`) or tweak a component's rendering performance. -- A final case where you might need to use a class component is if you need to use a `ref`. We have not yet adopted hooks like `useRef()` so if you need a `ref` use a class component. +- A final case where you might need to use a class component is if you need to use a `ref`. We have not yet adopted built-in React hooks like `useRef()` so if you need a `ref` use a class component. ```javascript // Bad @@ -655,10 +655,10 @@ In addition, all refs should be declared in the constructor, rather than inline. class BadRefComponent extends Component { constructor(props) { super(props); - + // Bad: Ref is declared inline instead of in the constructor } - + render() { return this.myRef = el} />; } @@ -668,7 +668,7 @@ class BadRefComponent extends Component { class GoodRefComponent extends Component { constructor(props) { super(props); - + // Good: Ref is declared in the constructor this.myRef = undefined; } @@ -684,6 +684,7 @@ class GoodRefComponent extends Component { We love React and learning about all the new features that are regularly being added to the API. However, we try to keep our organization's usage of React limited to a very strict and stable set of features that React offers. We do this mainly for **consistency** and so our engineers don't have to spend extra time trying to figure out how everything is working. Participation in our React driven codebases shouldn't mean everyone is required to keep up to date on the latest and greatest features. So with that in mind, here are a few things we would ask you to not use: -- Hooks - Use a class `Component` and relevant lifecycle methods instead of hooks +- Hooks - Use a class `Component` and relevant lifecycle methods instead of hooks. One exception here is if a 3rd party library offers some functionality via hooks (and only hooks). - `createRef()` - Use a callback ref instead - Class properties - Use an anonymous arrow function when calling a method or bind your method in the `constructor()` +- Static getters and setters - Use props directly or create a method that computes some value diff --git a/android/app/build.gradle b/android/app/build.gradle index 329661226a4a..e28a0f3e02a0 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -148,8 +148,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001001002 - versionName "1.0.10-2" + versionCode 1001001902 + versionName "1.0.19-2" } splits { abi { diff --git a/apple-app-site-association b/apple-app-site-association index 4e6aeb8f4a3a..0c14fa69c1e6 100644 --- a/apple-app-site-association +++ b/apple-app-site-association @@ -8,7 +8,8 @@ "/r/*", "/settings/*", "/setpassword/*", - "/details/*" + "/details/*", + "/v/*", ] } ] diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 82fc1811ebc9..16b6c9417946 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -55,7 +55,7 @@ platform :android do upload_to_play_store( package_name: "com.expensify.chat", json_key: './android/app/android-fastlane-json-key.json', - version_code: ENV["VERSION"], + version_code: ENV["VERSION_CODE"].to_i, track: 'internal', track_promote_to: 'production', rollout: '1.0', diff --git a/ios/ExpensifyCash/Info.plist b/ios/ExpensifyCash/Info.plist index b158052454db..15dfa518ba49 100644 --- a/ios/ExpensifyCash/Info.plist +++ b/ios/ExpensifyCash/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0.10 + 1.0.19 CFBundleSignature ???? CFBundleURLTypes @@ -30,7 +30,7 @@ CFBundleVersion - 1.0.10.2 + 1.0.19.2 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/ExpensifyCashTests/Info.plist b/ios/ExpensifyCashTests/Info.plist index 929c25e9d984..2ef4273a5759 100644 --- a/ios/ExpensifyCashTests/Info.plist +++ b/ios/ExpensifyCashTests/Info.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 1.0.10 + 1.0.19 CFBundleSignature ???? CFBundleVersion - 1.0.10.2 + 1.0.19.2 diff --git a/package-lock.json b/package-lock.json index 94348b0cf3bf..85cbe973b8ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.10-2", + "version": "1.0.19-2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1444,6 +1444,87 @@ } } }, + "@formatjs/ecma402-abstract": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.6.4.tgz", + "integrity": "sha512-ukFjGD9dLsxcD9D5AEshJqQElPQeUAlTALT/lzIV6OcYojyuU81gw/uXDUOrs6XW79jtOJwQDkLqHbCJBJMOTw==", + "requires": { + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + } + } + }, + "@formatjs/intl-getcanonicallocales": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@formatjs/intl-getcanonicallocales/-/intl-getcanonicallocales-1.5.8.tgz", + "integrity": "sha512-6GEIfCsZ+wd/K8bixP5h0Ep5aOjMgHlM51TeznlcNoiOHPP4gOrkxggh2Y2G5lnk71Ocyi93/+d0oKJI3J0jzw==", + "requires": { + "cldr-core": "38", + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + } + } + }, + "@formatjs/intl-locale": { + "version": "2.4.21", + "resolved": "https://registry.npmjs.org/@formatjs/intl-locale/-/intl-locale-2.4.21.tgz", + "integrity": "sha512-AH7d6XaLq1pXZ/AQ4dRNveKmA0juCCN3hFdpBvVA3XT4EMXIVkERh8PSa7xKgZThgXJwSLCZgKAeaARDzmhFRA==", + "requires": { + "@formatjs/ecma402-abstract": "1.6.4", + "@formatjs/intl-getcanonicallocales": "1.5.8", + "cldr-core": "38", + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + } + } + }, + "@formatjs/intl-numberformat": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@formatjs/intl-numberformat/-/intl-numberformat-6.2.5.tgz", + "integrity": "sha512-OnumcFnxnrRhfcL/KMBmC54i948YUQ3eh+J4DiHjs1QRx8iattj/07UEipqMvu6iHjnqU0PRTxFBGG2L+9JWXw==", + "requires": { + "@formatjs/ecma402-abstract": "1.6.4", + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + } + } + }, + "@formatjs/intl-pluralrules": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@formatjs/intl-pluralrules/-/intl-pluralrules-4.0.13.tgz", + "integrity": "sha512-ePoC1zmSzvyxXnrhPkysAQMIWr1JO5Hbz8yRv9ARgz6rD68k+wfD743AiHY/yjlahnXaqHDTd7e07xwrbzAsgQ==", + "requires": { + "@formatjs/ecma402-abstract": "1.6.4", + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + } + } + }, "@hapi/address": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", @@ -3864,9 +3945,9 @@ } }, "@react-navigation/drawer": { - "version": "5.12.3", - "resolved": "https://registry.npmjs.org/@react-navigation/drawer/-/drawer-5.12.3.tgz", - "integrity": "sha512-I0aR/ULjFZcGick0u724YWxR0shTNhqctXdQnP7YFbOWML645EBS1LCtKgStfd9qd3sojHRSHIc7fReYa8bHfA==", + "version": "5.12.5", + "resolved": "https://registry.npmjs.org/@react-navigation/drawer/-/drawer-5.12.5.tgz", + "integrity": "sha512-WMfz/tKg/K7QBb5rhjXW/pho4zXh3OoHXnHETk5SuVzHlDPM7r84uvAeC5l+ySp5jmipLrJn3zL+kfv9+KKHZQ==", "requires": { "color": "^3.1.3", "react-native-iphone-x-helper": "^1.3.0" @@ -5049,6 +5130,41 @@ "uri-js": "^4.2.2" } }, + "ajv-cli": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ajv-cli/-/ajv-cli-5.0.0.tgz", + "integrity": "sha512-LY4m6dUv44HTyhV+u2z5uX4EhPYTM38Iv1jdgDJJJCyOOuqB8KtZEGjPZ2T+sh5ZIJrXUfgErYx/j3gLd3+PlQ==", + "dev": true, + "requires": { + "ajv": "^8.0.0", + "fast-json-patch": "^2.0.0", + "glob": "^7.1.0", + "js-yaml": "^3.14.0", + "json-schema-migrate": "^2.0.0", + "json5": "^2.1.3", + "minimist": "^1.2.0" + }, + "dependencies": { + "ajv": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.0.2.tgz", + "integrity": "sha512-V0HGxJd0PiDF0ecHYIesTOqfd1gJguwQUOYfMfAWnRsWQEXfc5ifbUFhD3Wjc+O+y7VAqL+g07prq9gHQ/JOZQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, "ajv-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", @@ -6992,6 +7108,11 @@ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0=" }, + "cldr-core": { + "version": "38.1.0", + "resolved": "https://registry.npmjs.org/cldr-core/-/cldr-core-38.1.0.tgz", + "integrity": "sha512-Da9xKjDp4qGGIX0VDsBqTan09iR5nuYD2a/KkfEaUyqKhu6wFVNRiCpPDXeRbpVwPBY6PgemV8WiHatMhcpy4A==" + }, "clean-css": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", @@ -11085,8 +11206,8 @@ } }, "expensify-common": { - "version": "git+https://github.com/Expensify/expensify-common.git#3d8fc7500ddd24cd4a543e6e160d4f1ad97cc145", - "from": "git+https://github.com/Expensify/expensify-common.git#3d8fc7500ddd24cd4a543e6e160d4f1ad97cc145", + "version": "git+https://github.com/Expensify/expensify-common.git#679fc86cfc4f9bc701e3757d583d74057edbbe28", + "from": "git+https://github.com/Expensify/expensify-common.git#679fc86cfc4f9bc701e3757d583d74057edbbe28", "requires": { "classnames": "2.2.5", "clipboard": "2.0.4", @@ -11423,6 +11544,23 @@ } } }, + "fast-json-patch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-2.2.1.tgz", + "integrity": "sha512-4j5uBaTnsYAV5ebkidvxiLUYOwjQ+JSFljeqfTxCrH9bDmlCQaOJFS84oDJ2rAXZq2yskmk3ORfoP9DCwqFNig==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1" + }, + "dependencies": { + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + } + } + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -16813,6 +16951,35 @@ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, + "json-schema-migrate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/json-schema-migrate/-/json-schema-migrate-2.0.0.tgz", + "integrity": "sha512-r38SVTtojDRp4eD6WsCqiE0eNDt4v1WalBXb9cyZYw9ai5cGtBwzRNWjHzJl38w6TxFkXAIA7h+fyX3tnrAFhQ==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.0.2.tgz", + "integrity": "sha512-V0HGxJd0PiDF0ecHYIesTOqfd1gJguwQUOYfMfAWnRsWQEXfc5ifbUFhD3Wjc+O+y7VAqL+g07prq9gHQ/JOZQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -21152,14 +21319,61 @@ } }, "react-native-onyx": { - "version": "git+https://github.com/Expensify/react-native-onyx.git#aa36bdb7b5cd2319c34b9ee1b4c73cb73e89f4a5", - "from": "git+https://github.com/Expensify/react-native-onyx.git#aa36bdb7b5cd2319c34b9ee1b4c73cb73e89f4a5", + "version": "git+https://github.com/Expensify/react-native-onyx.git#3635fc34f00c8c8f97500b97fd42251ab4d22ab5", + "from": "git+https://github.com/Expensify/react-native-onyx.git#3635fc34f00c8c8f97500b97fd42251ab4d22ab5", "requires": { "@react-native-community/async-storage": "^1.12.1", "expensify-common": "git+https://github.com/Expensify/expensify-common.git#3d8fc7500ddd24cd4a543e6e160d4f1ad97cc145", "lodash": "4.17.21", "react": "^16.13.1", "underscore": "^1.11.0" + }, + "dependencies": { + "expensify-common": { + "version": "git+https://github.com/Expensify/expensify-common.git#3d8fc7500ddd24cd4a543e6e160d4f1ad97cc145", + "from": "git+https://github.com/Expensify/expensify-common.git#3d8fc7500ddd24cd4a543e6e160d4f1ad97cc145", + "requires": { + "classnames": "2.2.5", + "clipboard": "2.0.4", + "html-entities": "^1.3.1", + "jquery": "3.3.1", + "lodash": "4.17.21", + "prop-types": "15.7.2", + "react": "16.12.0", + "react-dom": "16.12.0", + "semver": "^7.3.4", + "simply-deferred": "git+https://github.com/Expensify/simply-deferred.git#77a08a95754660c7bd6e0b6979fdf84e8e831bf5", + "underscore": "1.9.1" + }, + "dependencies": { + "react": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", + "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "underscore": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" + } + } + }, + "react-dom": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", + "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.18.0" + } + } } }, "react-native-pdf": { @@ -22047,6 +22261,12 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", diff --git a/package.json b/package.json index 328e20e55f76..c2c72072bc78 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "expensify.cash", - "version": "1.0.10-2", + "version": "1.0.19-2", "author": "Expensify, Inc.", "homepage": "https://expensify.cash", "description": "Expensify.cash is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", @@ -25,11 +25,16 @@ "detox-build": "detox build --configuration ios.sim.debug", "detox-test": "detox test --configuration ios.sim.debug", "gh-actions-build": "./.github/scripts/buildActions.sh", + "gh-actions-validate": "./.github/scripts/validateActionsAndWorkflows.sh", "analyze-packages": "ANALYZE_BUNDLE=true webpack --config config/webpack/webpack.prod.js" }, "dependencies": { "@babel/plugin-proposal-class-properties": "^7.12.1", "@babel/preset-flow": "^7.12.13", + "@formatjs/intl-getcanonicallocales": "^1.5.8", + "@formatjs/intl-locale": "^2.4.21", + "@formatjs/intl-numberformat": "^6.2.5", + "@formatjs/intl-pluralrules": "^4.0.13", "@react-native-community/async-storage": "^1.11.0", "@react-native-community/cli": "4.13.1", "@react-native-community/clipboard": "^1.5.1", @@ -41,7 +46,7 @@ "@react-native-firebase/app": "^8.4.5", "@react-native-firebase/crashlytics": "^8.4.9", "@react-native-picker/picker": "^1.9.11", - "@react-navigation/drawer": "5.12.3", + "@react-navigation/drawer": "5.12.5", "@react-navigation/native": "5.9.2", "@react-navigation/stack": "5.14.2", "babel-plugin-transform-remove-console": "^6.9.4", @@ -50,7 +55,7 @@ "electron-log": "^4.2.4", "electron-serve": "^1.0.0", "electron-updater": "^4.3.4", - "expensify-common": "git+https://github.com/Expensify/expensify-common.git#3d8fc7500ddd24cd4a543e6e160d4f1ad97cc145", + "expensify-common": "git+https://github.com/Expensify/expensify-common.git#679fc86cfc4f9bc701e3757d583d74057edbbe28", "file-loader": "^6.0.0", "html-entities": "^1.3.1", "lodash": "4.17.21", @@ -69,7 +74,7 @@ "react-native-image-picker": "^2.3.3", "react-native-keyboard-spacer": "^0.4.1", "react-native-modal": "^11.5.6", - "react-native-onyx": "git+https://github.com/Expensify/react-native-onyx.git#aa36bdb7b5cd2319c34b9ee1b4c73cb73e89f4a5", + "react-native-onyx": "git+https://github.com/Expensify/react-native-onyx.git#3635fc34f00c8c8f97500b97fd42251ab4d22ab5", "react-native-pdf": "^6.2.2", "react-native-picker-select": "8.0.4", "react-native-reanimated": "1.13.2", @@ -100,6 +105,7 @@ "@testing-library/jest-native": "^3.4.2", "@testing-library/react-native": "^7.0.2", "@vercel/ncc": "^0.27.0", + "ajv-cli": "^5.0.0", "babel-eslint": "^10.1.0", "babel-jest": "^26.2.2", "babel-loader": "^8.1.0", diff --git a/src/CONST.js b/src/CONST.js index ce39818a791d..b9694391b8f9 100644 --- a/src/CONST.js +++ b/src/CONST.js @@ -3,7 +3,6 @@ const CLOUDFRONT_URL = 'https://d2k5nsl2zxldvw.cloudfront.net'; const CONST = { BETAS: { ALL: 'all', - REPORT_ACTION_CONTEXT_MENU: 'reportActionContextMenu', }, BUTTON_STATES: { DEFAULT: 'default', @@ -78,6 +77,7 @@ const CONST = { TIMEZONE: 'timeZone', }, DEFAULT_TIME_ZONE: {automatic: true, selected: 'America/Los_Angeles'}, + DEFAULT_ACCOUNT_DATA: {error: '', success: '', loading: false}, PRONOUNS: { HE_HIM_HIS: 'He/him', SHE_HER_HERS: 'She/her', @@ -94,6 +94,14 @@ const CONST = { // at least 8 characters, 1 capital letter, 1 lowercase number, 1 number PASSWORD_COMPLEXITY_REGEX_STRING: '^(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z]).{8,}$', + LOGIN_TYPE: { + PHONE: 'phone', + EMAIL: 'email', + }, + KEYBOARD_TYPE: { + NUMERIC: 'numeric', + PHONE_PAD: 'phone-pad', + }, }; export default CONST; diff --git a/src/Expensify.js b/src/Expensify.js index 0e4fb91fbee2..1c2ea12deb7c 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -6,6 +6,7 @@ import Onyx, {withOnyx} from 'react-native-onyx'; import listenToStorageEvents from './libs/listenToStorageEvents'; import * as ActiveClientManager from './libs/ActiveClientManager'; import ONYXKEYS from './ONYXKEYS'; +import CONST from './CONST'; import NavigationRoot from './libs/Navigation/NavigationRoot'; import Log from './libs/Log'; import migrateOnyx from './libs/migrateOnyx'; @@ -21,7 +22,7 @@ Onyx.init({ // Clear any loading and error messages so they do not appear on app startup [ONYXKEYS.SESSION]: {loading: false}, - [ONYXKEYS.ACCOUNT]: {loading: false, error: ''}, + [ONYXKEYS.ACCOUNT]: CONST.DEFAULT_ACCOUNT_DATA, [ONYXKEYS.NETWORK]: {isOffline: false}, [ONYXKEYS.IOU]: {loading: false}, }, diff --git a/src/ROUTES.js b/src/ROUTES.js index 0fe51bf894f1..6b8c522933f7 100644 --- a/src/ROUTES.js +++ b/src/ROUTES.js @@ -8,6 +8,8 @@ export default { SETTINGS_PREFERENCES: 'settings/preferences', SETTINGS_PASSWORD: 'settings/password', SETTINGS_PAYMENTS: 'settings/payments', + SETTINGS_ADD_LOGIN: 'settings/addlogin/:type', + getSettingsAddLoginRoute: type => `settings/addlogin/${type}`, NEW_GROUP: 'new/group', NEW_CHAT: 'new/chat', REPORT: 'r', @@ -17,8 +19,10 @@ export default { IOU_BILL: 'iou/split', SEARCH: 'search', SIGNIN: 'signin', - SET_PASSWORD_WITH_VALIDATE_CODE: 'setpassword/:validateCode', + SET_PASSWORD_WITH_VALIDATE_CODE: 'setpassword/:accountID/:validateCode', DETAILS: 'details', DETAILS_WITH_LOGIN: 'details/:login', getDetailsRoute: login => `details/${login}`, + VALIDATE_LOGIN: 'v', + VALIDATE_LOGIN_WITH_VALIDATE_CODE: 'v/:accountID/:validateCode', }; diff --git a/src/components/AttachmentPicker/index.js b/src/components/AttachmentPicker/index.js index 3f2b648f57ef..425e04d9ca72 100644 --- a/src/components/AttachmentPicker/index.js +++ b/src/components/AttachmentPicker/index.js @@ -1,32 +1,12 @@ import React from 'react'; -import PropTypes from 'prop-types'; - -const propTypes = { - children: PropTypes.func.isRequired, -}; +import propTypes from './AttachmentPickerPropTypes'; /** * This component renders a function as a child and * returns a "show attachment picker" method that takes * a callback. This is the web/mWeb/desktop version since - * on iOS Safari we must append a hidden input to the DOM - * and listen to onChange event. When the show method is - * called an attachment - * - * @example - * - * {({openPicker}) => ( - *