From e7ef12751438dac962b8c4917acdd4a8f0dff03d Mon Sep 17 00:00:00 2001
From: Bernhard Owen Josephus <bernhard.josephus@gmail.com>
Date: Wed, 12 Oct 2022 00:13:26 -0700
Subject: [PATCH 1/7] Add TextPill next to DisplayNames

---
 src/components/LHNOptionsList/OptionRowLHN.js | 33 +++++++++++------
 src/components/TextPill.js                    | 35 +++++++++++++++++++
 src/styles/styles.js                          | 11 ++++++
 src/styles/themes/default.js                  |  1 +
 4 files changed, 69 insertions(+), 11 deletions(-)
 create mode 100644 src/components/TextPill.js

diff --git a/src/components/LHNOptionsList/OptionRowLHN.js b/src/components/LHNOptionsList/OptionRowLHN.js
index 4091d88ee0d7..4c6510812efa 100644
--- a/src/components/LHNOptionsList/OptionRowLHN.js
+++ b/src/components/LHNOptionsList/OptionRowLHN.js
@@ -22,6 +22,7 @@ import CONST from '../../CONST';
 import variables from '../../styles/variables';
 import themeColors from '../../styles/themes/default';
 import SidebarUtils from '../../libs/SidebarUtils';
+import TextPill from '../TextPill';
 
 const propTypes = {
     /** Style for hovered state */
@@ -66,10 +67,13 @@ const OptionRowLHN = (props) => {
     const textUnreadStyle = optionItem.isUnread
         ? [textStyle, styles.sidebarLinkTextUnread] : [textStyle];
     const displayNameStyle = StyleUtils.combineStyles(props.viewMode === CONST.OPTION_MODE.COMPACT
-        ? [styles.optionDisplayName, ...textUnreadStyle, styles.optionDisplayNameCompact, styles.mr2]
+        ? [styles.optionDisplayName, ...textUnreadStyle, styles.optionDisplayNameCompact]
         : [styles.optionDisplayName, ...textUnreadStyle], props.style);
+    const textPillStyle = props.isFocused
+        ? [styles.ml2, StyleUtils.getBackgroundColorStyle(themeColors.iconLight)]
+        : [styles.ml2];
     const alternateTextStyle = StyleUtils.combineStyles(props.viewMode === CONST.OPTION_MODE.COMPACT
-        ? [textStyle, styles.optionAlternateText, styles.textLabelSupporting, styles.optionAlternateTextCompact]
+        ? [textStyle, styles.optionAlternateText, styles.textLabelSupporting, styles.optionAlternateTextCompact, styles.ml2]
         : [textStyle, styles.optionAlternateText, styles.textLabelSupporting], props.style);
     const contentContainerStyles = props.viewMode === CONST.OPTION_MODE.COMPACT
         ? [styles.flex1, styles.flexRow, styles.overflowHidden, styles.alignItemsCenter]
@@ -155,15 +159,22 @@ const OptionRowLHN = (props) => {
                                 )
                             }
                             <View style={contentContainerStyles}>
-                                <DisplayNames
-                                    accessibilityLabel="Chat user display names"
-                                    fullTitle={optionItem.text}
-                                    displayNamesWithTooltips={optionItem.displayNamesWithTooltips}
-                                    tooltipEnabled
-                                    numberOfLines={1}
-                                    textStyles={displayNameStyle}
-                                    shouldUseFullTitle={optionItem.isChatRoom || optionItem.isPolicyExpenseChat}
-                                />
+                                <View style={[styles.flexRow, styles.alignItemsCenter]}>
+                                    <DisplayNames
+                                        accessibilityLabel="Chat user display names"
+                                        fullTitle={optionItem.text}
+                                        displayNamesWithTooltips={optionItem.displayNamesWithTooltips}
+                                        tooltipEnabled
+                                        numberOfLines={1}
+                                        textStyles={displayNameStyle}
+                                        shouldUseFullTitle={optionItem.isChatRoom || optionItem.isPolicyExpenseChat}
+                                    />
+                                    {optionItem.isChatRoom && (
+                                        <TextPill style={textPillStyle} accessibilityLabel="Chat room name">
+                                            {optionItem.subtitle}
+                                        </TextPill>
+                                    )}
+                                </View>
                                 {optionItem.alternateText ? (
                                     <Text
                                         style={alternateTextStyle}
diff --git a/src/components/TextPill.js b/src/components/TextPill.js
new file mode 100644
index 000000000000..28c81bf1303a
--- /dev/null
+++ b/src/components/TextPill.js
@@ -0,0 +1,35 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import _ from 'underscore';
+import Text from './Text';
+import styles from '../styles/styles';
+import stylePropTypes from '../styles/stylePropTypes';
+
+const propTypes = {
+    /** Text to show */
+    children: PropTypes.string,
+
+    /** Text additional style */
+    style: stylePropTypes,
+};
+
+const defaultProps = {
+    children: '',
+    style: [],
+};
+
+const TextPill = (props) => {
+    const mergedStyles = !_.isArray(props.style) ? props.style : _.reduce(props.style, (finalStyles, s) => ({
+        ...finalStyles,
+        ...s,
+    }), {});
+
+    // eslint-disable-next-line react/jsx-props-no-spreading
+    return <Text {...props} style={[styles.textPill, mergedStyles]} numberOfLines={1}>{props.children}</Text>;
+};
+
+TextPill.propTypes = propTypes;
+TextPill.defaultProps = defaultProps;
+TextPill.displayName = 'TextPill';
+
+export default TextPill;
diff --git a/src/styles/styles.js b/src/styles/styles.js
index 018ded168f60..dc3b4047d413 100644
--- a/src/styles/styles.js
+++ b/src/styles/styles.js
@@ -2696,6 +2696,17 @@ const styles = {
         maxWidth: 450,
         alignSelf: 'center',
     },
+
+    textPill: {
+        ellipsizeMode: 'end',
+        backgroundColor: colors.gray2,
+        borderRadius: 10,
+        overflow: 'hidden',
+        paddingVertical: 2,
+        flexShrink: 1,
+        fontSize: variables.fontSizeLabel,
+        ...spacing.ph2,
+    },
 };
 
 export default styles;
diff --git a/src/styles/themes/default.js b/src/styles/themes/default.js
index b5cf7a058ca4..2f1dc8caaa49 100644
--- a/src/styles/themes/default.js
+++ b/src/styles/themes/default.js
@@ -14,6 +14,7 @@ export default {
     border: colors.gray2,
     borderFocus: colors.blue,
     icon: colors.gray3,
+    iconLight: 'rgba(198, 201, 202, 0.5)',
     iconHovered: colors.dark,
     iconSuccessFill: colors.green,
     iconReversed: colors.white,

From e181e00335e5ae18984cd73f7175ff6842ec0f94 Mon Sep 17 00:00:00 2001
From: Bernhard Owen Josephus <bernhard.josephus@gmail.com>
Date: Wed, 12 Oct 2022 03:54:06 -0700
Subject: [PATCH 2/7] simplify logic

---
 src/components/TextPill.js | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/src/components/TextPill.js b/src/components/TextPill.js
index 28c81bf1303a..0971f5dc4698 100644
--- a/src/components/TextPill.js
+++ b/src/components/TextPill.js
@@ -19,13 +19,10 @@ const defaultProps = {
 };
 
 const TextPill = (props) => {
-    const mergedStyles = !_.isArray(props.style) ? props.style : _.reduce(props.style, (finalStyles, s) => ({
-        ...finalStyles,
-        ...s,
-    }), {});
+    const propsStyle = _.isArray(props.style) ? props.style : [props.style];
 
     // eslint-disable-next-line react/jsx-props-no-spreading
-    return <Text {...props} style={[styles.textPill, mergedStyles]} numberOfLines={1}>{props.children}</Text>;
+    return <Text {...props} style={[styles.textPill, ...propsStyle]} numberOfLines={1}>{props.children}</Text>;
 };
 
 TextPill.propTypes = propTypes;

From 445fc78f6b8a24f132a35e609faea83d6c12ec96 Mon Sep 17 00:00:00 2001
From: Bernhard Owen Josephus <bernhard.josephus@gmail.com>
Date: Fri, 14 Oct 2022 06:02:39 -0700
Subject: [PATCH 3/7] Changes styling a bit

---
 src/components/LHNOptionsList/OptionRowLHN.js | 4 ++--
 src/styles/styles.js                          | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/components/LHNOptionsList/OptionRowLHN.js b/src/components/LHNOptionsList/OptionRowLHN.js
index 4c6510812efa..3207a8d88456 100644
--- a/src/components/LHNOptionsList/OptionRowLHN.js
+++ b/src/components/LHNOptionsList/OptionRowLHN.js
@@ -70,8 +70,8 @@ const OptionRowLHN = (props) => {
         ? [styles.optionDisplayName, ...textUnreadStyle, styles.optionDisplayNameCompact]
         : [styles.optionDisplayName, ...textUnreadStyle], props.style);
     const textPillStyle = props.isFocused
-        ? [styles.ml2, StyleUtils.getBackgroundColorStyle(themeColors.iconLight)]
-        : [styles.ml2];
+        ? [styles.ml1, StyleUtils.getBackgroundColorStyle(themeColors.iconLight)]
+        : [styles.ml1];
     const alternateTextStyle = StyleUtils.combineStyles(props.viewMode === CONST.OPTION_MODE.COMPACT
         ? [textStyle, styles.optionAlternateText, styles.textLabelSupporting, styles.optionAlternateTextCompact, styles.ml2]
         : [textStyle, styles.optionAlternateText, styles.textLabelSupporting], props.style);
diff --git a/src/styles/styles.js b/src/styles/styles.js
index dc3b4047d413..ecb7e265930e 100644
--- a/src/styles/styles.js
+++ b/src/styles/styles.js
@@ -2704,7 +2704,7 @@ const styles = {
         overflow: 'hidden',
         paddingVertical: 2,
         flexShrink: 1,
-        fontSize: variables.fontSizeLabel,
+        fontSize: variables.fontSizeSmall,
         ...spacing.ph2,
     },
 };

From 4444b2a4f2fda06294e6de23d0de99c1368201f6 Mon Sep 17 00:00:00 2001
From: Bernhard Owen Josephus <bernhard.josephus@gmail.com>
Date: Sat, 15 Oct 2022 08:39:51 -0700
Subject: [PATCH 4/7] Change props

---
 src/components/TextPill.js | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/src/components/TextPill.js b/src/components/TextPill.js
index 0971f5dc4698..457585bbf2f8 100644
--- a/src/components/TextPill.js
+++ b/src/components/TextPill.js
@@ -6,15 +6,13 @@ import styles from '../styles/styles';
 import stylePropTypes from '../styles/stylePropTypes';
 
 const propTypes = {
-    /** Text to show */
-    children: PropTypes.string,
+    text: PropTypes.string.isRequired,
 
     /** Text additional style */
     style: stylePropTypes,
 };
 
 const defaultProps = {
-    children: '',
     style: [],
 };
 
@@ -22,7 +20,7 @@ const TextPill = (props) => {
     const propsStyle = _.isArray(props.style) ? props.style : [props.style];
 
     // eslint-disable-next-line react/jsx-props-no-spreading
-    return <Text {...props} style={[styles.textPill, ...propsStyle]} numberOfLines={1}>{props.children}</Text>;
+    return <Text {...props} style={[styles.textPill, ...propsStyle]} numberOfLines={1}>{props.text}</Text>;
 };
 
 TextPill.propTypes = propTypes;

From 6360062346210c691fce10157c81ce2d57db975c Mon Sep 17 00:00:00 2001
From: Bernhard Owen Josephus <bernhard.josephus@gmail.com>
Date: Sat, 15 Oct 2022 08:40:03 -0700
Subject: [PATCH 5/7] Fix styling

---
 src/components/LHNOptionsList/OptionRowLHN.js | 14 +++++++-------
 src/styles/styles.js                          |  5 +----
 2 files changed, 8 insertions(+), 11 deletions(-)

diff --git a/src/components/LHNOptionsList/OptionRowLHN.js b/src/components/LHNOptionsList/OptionRowLHN.js
index 3207a8d88456..f6ffde9aa23a 100644
--- a/src/components/LHNOptionsList/OptionRowLHN.js
+++ b/src/components/LHNOptionsList/OptionRowLHN.js
@@ -66,9 +66,7 @@ const OptionRowLHN = (props) => {
         : styles.sidebarLinkText;
     const textUnreadStyle = optionItem.isUnread
         ? [textStyle, styles.sidebarLinkTextUnread] : [textStyle];
-    const displayNameStyle = StyleUtils.combineStyles(props.viewMode === CONST.OPTION_MODE.COMPACT
-        ? [styles.optionDisplayName, ...textUnreadStyle, styles.optionDisplayNameCompact]
-        : [styles.optionDisplayName, ...textUnreadStyle], props.style);
+    const displayNameStyle = StyleUtils.combineStyles([styles.optionDisplayName, ...textUnreadStyle], props.style);
     const textPillStyle = props.isFocused
         ? [styles.ml1, StyleUtils.getBackgroundColorStyle(themeColors.iconLight)]
         : [styles.ml1];
@@ -159,7 +157,7 @@ const OptionRowLHN = (props) => {
                                 )
                             }
                             <View style={contentContainerStyles}>
-                                <View style={[styles.flexRow, styles.alignItemsCenter]}>
+                                <View style={[styles.flexRow, styles.alignItemsCenter, styles.mw100, styles.overflowHidden]}>
                                     <DisplayNames
                                         accessibilityLabel="Chat user display names"
                                         fullTitle={optionItem.text}
@@ -170,9 +168,11 @@ const OptionRowLHN = (props) => {
                                         shouldUseFullTitle={optionItem.isChatRoom || optionItem.isPolicyExpenseChat}
                                     />
                                     {optionItem.isChatRoom && (
-                                        <TextPill style={textPillStyle} accessibilityLabel="Chat room name">
-                                            {optionItem.subtitle}
-                                        </TextPill>
+                                        <TextPill
+                                            style={textPillStyle}
+                                            accessibilityLabel="Chat room name"
+                                            text={optionItem.subtitle}
+                                        />
                                     )}
                                 </View>
                                 {optionItem.alternateText ? (
diff --git a/src/styles/styles.js b/src/styles/styles.js
index ecb7e265930e..26755fb199fe 100644
--- a/src/styles/styles.js
+++ b/src/styles/styles.js
@@ -1186,14 +1186,11 @@ const styles = {
         fontFamily: fontFamily.GTA,
         height: 20,
         lineHeight: 20,
-        ...whiteSpace.noWrap,
-    },
-
-    optionDisplayNameCompact: {
         minWidth: 'auto',
         flexBasis: 'auto',
         flexGrow: 0,
         flexShrink: 0,
+        ...whiteSpace.noWrap,
     },
 
     displayNameTooltipEllipsis: {

From 1731e7432e1fd2b64cbef49c4d0efa3302235ed7 Mon Sep 17 00:00:00 2001
From: Bernhard Owen Josephus <bernhard.josephus@gmail.com>
Date: Wed, 19 Oct 2022 00:18:32 -0700
Subject: [PATCH 6/7] Fix styling

---
 src/components/LHNOptionsList/OptionRowLHN.js |  6 +++---
 src/components/TextPill.js                    |  4 ++--
 src/styles/StyleUtils.js                      | 21 +++++++++++++++++++
 src/styles/styles.js                          |  5 ++++-
 src/styles/themes/default.js                  |  1 -
 5 files changed, 30 insertions(+), 7 deletions(-)

diff --git a/src/components/LHNOptionsList/OptionRowLHN.js b/src/components/LHNOptionsList/OptionRowLHN.js
index f6ffde9aa23a..f04f29e5d4a1 100644
--- a/src/components/LHNOptionsList/OptionRowLHN.js
+++ b/src/components/LHNOptionsList/OptionRowLHN.js
@@ -66,9 +66,9 @@ const OptionRowLHN = (props) => {
         : styles.sidebarLinkText;
     const textUnreadStyle = optionItem.isUnread
         ? [textStyle, styles.sidebarLinkTextUnread] : [textStyle];
-    const displayNameStyle = StyleUtils.combineStyles([styles.optionDisplayName, ...textUnreadStyle], props.style);
+    const displayNameStyle = StyleUtils.combineStyles([styles.optionDisplayName, styles.optionDisplayNameCompact, ...textUnreadStyle], props.style);
     const textPillStyle = props.isFocused
-        ? [styles.ml1, StyleUtils.getBackgroundColorStyle(themeColors.iconLight)]
+        ? [styles.ml1, StyleUtils.getBackgroundColorWithOpacityStyle(themeColors.icon, 0.5)]
         : [styles.ml1];
     const alternateTextStyle = StyleUtils.combineStyles(props.viewMode === CONST.OPTION_MODE.COMPACT
         ? [textStyle, styles.optionAlternateText, styles.textLabelSupporting, styles.optionAlternateTextCompact, styles.ml2]
@@ -170,7 +170,7 @@ const OptionRowLHN = (props) => {
                                     {optionItem.isChatRoom && (
                                         <TextPill
                                             style={textPillStyle}
-                                            accessibilityLabel="Chat room name"
+                                            accessibilityLabel="Workspace name"
                                             text={optionItem.subtitle}
                                         />
                                     )}
diff --git a/src/components/TextPill.js b/src/components/TextPill.js
index 457585bbf2f8..4b13dee19fa6 100644
--- a/src/components/TextPill.js
+++ b/src/components/TextPill.js
@@ -1,9 +1,9 @@
 import React from 'react';
 import PropTypes from 'prop-types';
-import _ from 'underscore';
 import Text from './Text';
 import styles from '../styles/styles';
 import stylePropTypes from '../styles/stylePropTypes';
+import * as StyleUtils from '../styles/StyleUtils';
 
 const propTypes = {
     text: PropTypes.string.isRequired,
@@ -17,7 +17,7 @@ const defaultProps = {
 };
 
 const TextPill = (props) => {
-    const propsStyle = _.isArray(props.style) ? props.style : [props.style];
+    const propsStyle = StyleUtils.parseStyleAsArray(props.style);
 
     // eslint-disable-next-line react/jsx-props-no-spreading
     return <Text {...props} style={[styles.textPill, ...propsStyle]} numberOfLines={1}>{props.text}</Text>;
diff --git a/src/styles/StyleUtils.js b/src/styles/StyleUtils.js
index 0f892538b202..f14a50c0b0b9 100644
--- a/src/styles/StyleUtils.js
+++ b/src/styles/StyleUtils.js
@@ -212,6 +212,26 @@ function getBackgroundColorStyle(backgroundColor) {
     };
 }
 
+/**
+ * Returns a background color with opacity style
+ *
+ * @param {String} backgroundColor
+ * @param {number} opacity
+ * @returns {Object}
+ */
+function getBackgroundColorWithOpacityStyle(backgroundColor, opacity) {
+    const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(backgroundColor);
+    if (result !== null) {
+        const r = parseInt(result[1], 16);
+        const g = parseInt(result[2], 16);
+        const b = parseInt(result[3], 16);
+        return {
+            backgroundColor: `rgba(${r}, ${g}, ${b}, ${opacity})`,
+        };
+    }
+    return {};
+}
+
 /**
  * Generate a style for the background color of the Badge
  *
@@ -519,6 +539,7 @@ export {
     getAutoGrowTextInputStyle,
     getBackgroundAndBorderStyle,
     getBackgroundColorStyle,
+    getBackgroundColorWithOpacityStyle,
     getBadgeColorStyle,
     getButtonBackgroundColorStyle,
     getIconFillColor,
diff --git a/src/styles/styles.js b/src/styles/styles.js
index 26755fb199fe..ecb7e265930e 100644
--- a/src/styles/styles.js
+++ b/src/styles/styles.js
@@ -1186,11 +1186,14 @@ const styles = {
         fontFamily: fontFamily.GTA,
         height: 20,
         lineHeight: 20,
+        ...whiteSpace.noWrap,
+    },
+
+    optionDisplayNameCompact: {
         minWidth: 'auto',
         flexBasis: 'auto',
         flexGrow: 0,
         flexShrink: 0,
-        ...whiteSpace.noWrap,
     },
 
     displayNameTooltipEllipsis: {
diff --git a/src/styles/themes/default.js b/src/styles/themes/default.js
index 2f1dc8caaa49..b5cf7a058ca4 100644
--- a/src/styles/themes/default.js
+++ b/src/styles/themes/default.js
@@ -14,7 +14,6 @@ export default {
     border: colors.gray2,
     borderFocus: colors.blue,
     icon: colors.gray3,
-    iconLight: 'rgba(198, 201, 202, 0.5)',
     iconHovered: colors.dark,
     iconSuccessFill: colors.green,
     iconReversed: colors.white,

From ca9bc6bca376aab974a5c2271666b0db4b1fa095 Mon Sep 17 00:00:00 2001
From: Bernhard Owen Josephus <bernhard.josephus@gmail.com>
Date: Wed, 26 Oct 2022 00:52:09 -0700
Subject: [PATCH 7/7] Merge with main branch

---
 .github/PULL_REQUEST_TEMPLATE.md              |    4 +-
 .../actions/composite/setupNode/action.yml    |    5 +-
 .../updateProtectedBranch/action.yml          |    4 +-
 .../javascript/awaitStagingDeploys/index.js   |   63 +-
 .../actions/javascript/bumpVersion/index.js   |   57 +-
 .../checkBundleVersionStringMatch/index.js    |   57 +-
 .../javascript/checkDeployBlockers/index.js   |   63 +-
 .../contributorChecklist.js                   |    4 +-
 .../javascript/contributorChecklist/index.js  |   72 +-
 .../createOrUpdateStagingDeploy/index.js      |   63 +-
 .../getDeployPullRequestList/index.js         |   68 +-
 .../javascript/getPullRequestDetails/index.js |   63 +-
 .../javascript/getReleaseBody/index.js        |   63 +-
 .../isPullRequestMergeable/index.js           |   63 +-
 .../javascript/isStagingDeployLocked/index.js |   63 +-
 .../markPullRequestsAsDeployed/index.js       |   68 +-
 .../reopenIssueWithComment/index.js           |   63 +-
 .../triggerWorkflowAndWait/index.js           |   63 +-
 .../javascript/verifySignedCommits/index.js   |   68 +-
 .github/workflows/cherryPick.yml              |    8 +-
 .github/workflows/createNewVersion.yml        |    4 +-
 .github/workflows/deploy.yml                  |    6 +-
 .github/workflows/deployBlocker.yml           |    2 +-
 .../e2ePerformanceRegressionTests.yml         |    4 +-
 .github/workflows/lockDeploys.yml             |    4 +-
 .github/workflows/platformDeploy.yml          |   12 +-
 .github/workflows/preDeploy.yml               |   12 +-
 Gemfile.lock                                  |  119 +-
 android/app/build.gradle                      |    4 +-
 .../com/expensify/chat/MainApplication.java   |    8 -
 android/build.gradle                          |    1 -
 assets/emojis.js                              | 1363 +++++++++++++++++
 contributingGuides/FORMS.md                   |   32 +
 docs/Gemfile                                  |    2 +
 docs/Gemfile.lock                             |    1 +
 docs/README.md                                |   16 +
 docs/TEMPLATE.md                              |    2 +
 docs/_config.yml                              |   10 +
 docs/_layouts/default.html                    |    3 +
 docs/_sass/_main.scss                         |   29 +-
 docs/articles/request-money/SmartScan.md      |    2 +
 docs/articles/send-money/The-Free-Plan.md     |   73 +
 .../images/chat-with-concierge-setup.png      |  Bin 0 -> 377914 bytes
 .../images/chat-with-setup-specialist.png     |  Bin 0 -> 342514 bytes
 docs/assets/images/new-workspace.png          |  Bin 0 -> 242032 bytes
 docs/assets/images/profile-settings.png       |  Bin 0 -> 404236 bytes
 docs/assets/images/workspace-settings.png     |  Bin 0 -> 447765 bytes
 docs/assets/js/main.js                        |    5 +
 docs/hubs/request-money.html                  |    1 +
 docs/hubs/send-money.html                     |    1 +
 docs/main.html                                |    3 +-
 ios/NewExpensify/Info.plist                   |    4 +-
 ios/NewExpensifyTests/Info.plist              |    4 +-
 ios/Podfile                                   |    8 +
 ios/Podfile.lock                              |  462 +++---
 jest/setup.js                                 |    2 +-
 package-lock.json                             |   89 +-
 package.json                                  |   16 +-
 .../react-native-reanimated+3.0.0-rc.3.patch  |   64 +
 src/CONST.js                                  |    3 +
 src/ONYXKEYS.js                               |    4 +-
 src/components/AttachmentModal.js             |   15 +-
 .../EmojiPicker/EmojiPickerButton.js          |    5 +
 src/components/ExceededCommentLength.js       |    2 +-
 src/components/Form.js                        |   14 +
 src/components/FormAlertWithSubmitButton.js   |    6 +-
 src/components/FormAlertWrapper.js            |    6 +-
 src/components/KeyboardShortcutsModal.js      |    3 +-
 src/components/LHNOptionsList/OptionRowLHN.js |  190 +--
 src/components/MenuItem.js                    |    2 +-
 src/components/OfflineWithFeedback.js         |   12 +-
 src/components/OptionRow.js                   |  186 ++-
 src/components/ReportWelcomeText.js           |    2 +-
 src/languages/en.js                           |   10 +-
 src/languages/es.js                           |   12 +-
 src/libs/EmojiTrie.js                         |   35 +
 src/libs/EmojiUtils.js                        |   56 +
 src/libs/OptionsListUtils.js                  |   41 +-
 src/libs/ReportUtils.js                       |   28 +-
 src/libs/SelectionScraper/index.js            |    2 +-
 src/libs/SidebarUtils.js                      |    6 +-
 src/libs/Trie/TrieNode.js                     |    9 +
 src/libs/Trie/index.js                        |  115 ++
 src/libs/actions/BankAccounts.js              |   24 +-
 src/libs/actions/Policy.js                    |   55 -
 src/libs/actions/Report.js                    |   84 +-
 src/libs/actions/Welcome.js                   |   14 +-
 src/pages/AddPersonalBankAccountPage.js       |    2 +-
 src/pages/DetailsPage.js                      |   10 +-
 .../EnablePayments/AdditionalDetailsStep.js   |   54 +-
 src/pages/NewChatPage.js                      |   27 +-
 src/pages/ReimbursementAccount/AddressForm.js |   56 +-
 .../ReimbursementAccount/BankAccountStep.js   |    6 +
 src/pages/ReimbursementAccount/CompanyStep.js |   11 +
 .../ReimbursementAccount/IdentityForm.js      |    1 +
 .../ReimbursementAccountDraftPropTypes.js     |    2 +-
 .../RequestorOnfidoStep.js                    |   93 ++
 .../ReimbursementAccount/RequestorStep.js     |   61 +-
 src/pages/ReportSettingsPage.js               |    2 +-
 src/pages/RequestCallPage.js                  |   43 +-
 src/pages/home/ReportScreen.js                |   16 +-
 src/pages/home/report/ReportActionCompose.js  |    6 +-
 .../home/report/ReportActionItemCreated.js    |    6 +-
 .../report/ReportActionItemMessageEdit.js     |   22 +-
 src/pages/home/report/ReportActionsView.js    |   18 +-
 src/pages/home/report/ReportFooter.js         |   18 +-
 .../home/report/ReportTypingIndicator.js      |    2 +-
 src/pages/settings/InitialSettingsPage.js     |    1 +
 src/pages/workspace/WorkspaceMembersPage.js   |    3 +-
 .../workspace/WorkspacePageWithSections.js    |   28 +-
 src/pages/workspace/WorkspaceSettingsPage.js  |   63 +-
 .../workspace/bills/WorkspaceBillsPage.js     |    1 +
 src/pages/workspace/card/WorkspaceCardPage.js |    1 +
 .../invoices/WorkspaceInvoicesPage.js         |    1 +
 .../reimburse/WorkspaceReimbursePage.js       |    1 +
 .../workspace/travel/WorkspaceTravelPage.js   |    1 +
 src/styles/StyleUtils.js                      |   14 +
 src/styles/styles.js                          |   12 +-
 src/styles/utilities/sizing.js                |    4 +
 src/styles/utilities/spacing.js               |    4 +
 tests/unit/EmojiCodeTest.js                   |   19 +
 tests/unit/LHNFilterTest.js                   |    4 +
 tests/unit/LHNOrderTest.js                    |    4 +
 tests/unit/TrieTest.js                        |   77 +
 tests/utils/LHNTestUtils.js                   |   11 +-
 125 files changed, 3717 insertions(+), 1279 deletions(-)
 create mode 100644 docs/articles/send-money/The-Free-Plan.md
 create mode 100644 docs/assets/images/chat-with-concierge-setup.png
 create mode 100644 docs/assets/images/chat-with-setup-specialist.png
 create mode 100644 docs/assets/images/new-workspace.png
 create mode 100644 docs/assets/images/profile-settings.png
 create mode 100644 docs/assets/images/workspace-settings.png
 create mode 100644 patches/react-native-reanimated+3.0.0-rc.3.patch
 create mode 100644 src/libs/EmojiTrie.js
 create mode 100644 src/libs/Trie/TrieNode.js
 create mode 100644 src/libs/Trie/index.js
 create mode 100644 src/pages/ReimbursementAccount/RequestorOnfidoStep.js
 create mode 100644 tests/unit/EmojiCodeTest.js
 create mode 100644 tests/unit/TrieTest.js

diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index c463fc559bd7..e9c61c6ca5bf 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -75,7 +75,7 @@ This is a checklist for PR authors & reviewers. Please make sure to complete all
     - [ ] I verified that comments were added to code that is not self explanatory
     - [ ] I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
     - [ ] I verified any copy / text shown in the product was added in all `src/languages/*` files
-    - [ ] I verified any copy / text that was added to the app is correct English and approved by marketing by tagging the marketing team on the original GH to get the correct copy.
+    - [ ] I verified any copy / text that was added to the app is correct English and approved by marketing by adding the `Waiting for Copy` label for a copy review on the original GH to get the correct copy.
     - [ ] I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
     - [ ] I verified the JSDocs style guidelines (in [`STYLE.md`](https://github.com/Expensify/App/blob/main/contributingGuides/STYLE.md#jsdocs)) were followed
 - [ ] If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
@@ -128,7 +128,7 @@ The reviewer will copy/paste it into a new comment and complete it after the aut
     - [ ] I verified that comments were added to code that is not self explanatory
     - [ ] I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
     - [ ] I verified any copy / text shown in the product was added in all `src/languages/*` files
-    - [ ] I verified any copy / text that was added to the app is correct English and approved by marketing by tagging the marketing team on the original GH to get the correct copy.
+    - [ ] I verified any copy / text that was added to the app is correct English and approved by marketing by adding the `Waiting for Copy` label for a copy review on the original GH to get the correct copy.
     - [ ] I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
     - [ ] I verified the JSDocs style guidelines (in [`STYLE.md`](https://github.com/Expensify/App/blob/main/contributingGuides/STYLE.md#jsdocs)) were followed
 - [ ] If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
diff --git a/.github/actions/composite/setupNode/action.yml b/.github/actions/composite/setupNode/action.yml
index 369d1c52f8cd..2e92ac26d667 100644
--- a/.github/actions/composite/setupNode/action.yml
+++ b/.github/actions/composite/setupNode/action.yml
@@ -4,12 +4,11 @@ description: Set up Node
 runs:
   using: composite
   steps:
-    # Version: 3.0.2
-    - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
+    - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
       with:
         fetch-depth: 0
 
-    - uses: actions/setup-node@09ba51f18e18a3756fea1f54d09c6745c064491d
+    - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516
       with:
         node-version-file: '.nvmrc'
         cache: npm
diff --git a/.github/actions/composite/updateProtectedBranch/action.yml b/.github/actions/composite/updateProtectedBranch/action.yml
index 292bba0f782c..e272a3282e3b 100644
--- a/.github/actions/composite/updateProtectedBranch/action.yml
+++ b/.github/actions/composite/updateProtectedBranch/action.yml
@@ -48,7 +48,7 @@ runs:
         fi
 
     # Version: 3.0.2
-    - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
+    - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
       with:
         ref: ${{ env.SOURCE_BRANCH }}
         fetch-depth: 0
@@ -92,7 +92,7 @@ runs:
           --label "automerge" \
           --base ${{ inputs.TARGET_BRANCH }}
         sleep 5
-        echo "::set-output name=PR_NUMBER::$(gh pr view --json 'number' --jq '.number')"
+        echo "PR_NUMBER=$(gh pr view --json 'number' --jq '.number')" >> "$GITHUB_OUTPUT"
       env:
         GITHUB_TOKEN: ${{ inputs.OS_BOTIFY_TOKEN }}
 
diff --git a/.github/actions/javascript/awaitStagingDeploys/index.js b/.github/actions/javascript/awaitStagingDeploys/index.js
index 17cf036dcd3b..710671b90526 100644
--- a/.github/actions/javascript/awaitStagingDeploys/index.js
+++ b/.github/actions/javascript/awaitStagingDeploys/index.js
@@ -815,7 +815,6 @@ const file_command_1 = __nccwpck_require__(717);
 const utils_1 = __nccwpck_require__(5278);
 const os = __importStar(__nccwpck_require__(2087));
 const path = __importStar(__nccwpck_require__(5622));
-const uuid_1 = __nccwpck_require__(9521);
 const oidc_utils_1 = __nccwpck_require__(8041);
 /**
  * The code to exit an action
@@ -845,20 +844,9 @@ function exportVariable(name, val) {
     process.env[name] = convertedVal;
     const filePath = process.env['GITHUB_ENV'] || '';
     if (filePath) {
-        const delimiter = `ghadelimiter_${uuid_1.v4()}`;
-        // These should realistically never happen, but just in case someone finds a way to exploit uuid generation let's not allow keys or values that contain the delimiter.
-        if (name.includes(delimiter)) {
-            throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
-        }
-        if (convertedVal.includes(delimiter)) {
-            throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
-        }
-        const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;
-        file_command_1.issueCommand('ENV', commandValue);
-    }
-    else {
-        command_1.issueCommand('set-env', { name }, convertedVal);
+        return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));
     }
+    command_1.issueCommand('set-env', { name }, convertedVal);
 }
 exports.exportVariable = exportVariable;
 /**
@@ -876,7 +864,7 @@ exports.setSecret = setSecret;
 function addPath(inputPath) {
     const filePath = process.env['GITHUB_PATH'] || '';
     if (filePath) {
-        file_command_1.issueCommand('PATH', inputPath);
+        file_command_1.issueFileCommand('PATH', inputPath);
     }
     else {
         command_1.issueCommand('add-path', {}, inputPath);
@@ -916,7 +904,10 @@ function getMultilineInput(name, options) {
     const inputs = getInput(name, options)
         .split('\n')
         .filter(x => x !== '');
-    return inputs;
+    if (options && options.trimWhitespace === false) {
+        return inputs;
+    }
+    return inputs.map(input => input.trim());
 }
 exports.getMultilineInput = getMultilineInput;
 /**
@@ -949,8 +940,12 @@ exports.getBooleanInput = getBooleanInput;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function setOutput(name, value) {
+    const filePath = process.env['GITHUB_OUTPUT'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));
+    }
     process.stdout.write(os.EOL);
-    command_1.issueCommand('set-output', { name }, value);
+    command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));
 }
 exports.setOutput = setOutput;
 /**
@@ -1079,7 +1074,11 @@ exports.group = group;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function saveState(name, value) {
-    command_1.issueCommand('save-state', { name }, value);
+    const filePath = process.env['GITHUB_STATE'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));
+    }
+    command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));
 }
 exports.saveState = saveState;
 /**
@@ -1145,13 +1144,14 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.issueCommand = void 0;
+exports.prepareKeyValueMessage = exports.issueFileCommand = void 0;
 // We use any as a valid input type
 /* eslint-disable @typescript-eslint/no-explicit-any */
 const fs = __importStar(__nccwpck_require__(5747));
 const os = __importStar(__nccwpck_require__(2087));
+const uuid_1 = __nccwpck_require__(9521);
 const utils_1 = __nccwpck_require__(5278);
-function issueCommand(command, message) {
+function issueFileCommand(command, message) {
     const filePath = process.env[`GITHUB_${command}`];
     if (!filePath) {
         throw new Error(`Unable to find environment variable for file command ${command}`);
@@ -1163,7 +1163,22 @@ function issueCommand(command, message) {
         encoding: 'utf8'
     });
 }
-exports.issueCommand = issueCommand;
+exports.issueFileCommand = issueFileCommand;
+function prepareKeyValueMessage(key, value) {
+    const delimiter = `ghadelimiter_${uuid_1.v4()}`;
+    const convertedValue = utils_1.toCommandValue(value);
+    // These should realistically never happen, but just in case someone finds a
+    // way to exploit uuid generation let's not allow keys or values that contain
+    // the delimiter.
+    if (key.includes(delimiter)) {
+        throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
+    }
+    if (convertedValue.includes(delimiter)) {
+        throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
+    }
+    return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;
+}
+exports.prepareKeyValueMessage = prepareKeyValueMessage;
 //# sourceMappingURL=file-command.js.map
 
 /***/ }),
@@ -1790,7 +1805,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.getOctokitOptions = exports.GitHub = exports.context = void 0;
+exports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0;
 const Context = __importStar(__nccwpck_require__(4087));
 const Utils = __importStar(__nccwpck_require__(7914));
 // octokit + plugins
@@ -1799,13 +1814,13 @@ const plugin_rest_endpoint_methods_1 = __nccwpck_require__(3044);
 const plugin_paginate_rest_1 = __nccwpck_require__(8945);
 exports.context = new Context.Context();
 const baseUrl = Utils.getApiBaseUrl();
-const defaults = {
+exports.defaults = {
     baseUrl,
     request: {
         agent: Utils.getProxyAgent(baseUrl)
     }
 };
-exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(defaults);
+exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults);
 /**
  * Convience function to correctly format Octokit Options to pass into the constructor.
  *
diff --git a/.github/actions/javascript/bumpVersion/index.js b/.github/actions/javascript/bumpVersion/index.js
index abfc67210af9..b12ad2a1bea2 100644
--- a/.github/actions/javascript/bumpVersion/index.js
+++ b/.github/actions/javascript/bumpVersion/index.js
@@ -430,7 +430,6 @@ const file_command_1 = __nccwpck_require__(717);
 const utils_1 = __nccwpck_require__(278);
 const os = __importStar(__nccwpck_require__(87));
 const path = __importStar(__nccwpck_require__(622));
-const uuid_1 = __nccwpck_require__(521);
 const oidc_utils_1 = __nccwpck_require__(41);
 /**
  * The code to exit an action
@@ -460,20 +459,9 @@ function exportVariable(name, val) {
     process.env[name] = convertedVal;
     const filePath = process.env['GITHUB_ENV'] || '';
     if (filePath) {
-        const delimiter = `ghadelimiter_${uuid_1.v4()}`;
-        // These should realistically never happen, but just in case someone finds a way to exploit uuid generation let's not allow keys or values that contain the delimiter.
-        if (name.includes(delimiter)) {
-            throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
-        }
-        if (convertedVal.includes(delimiter)) {
-            throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
-        }
-        const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;
-        file_command_1.issueCommand('ENV', commandValue);
-    }
-    else {
-        command_1.issueCommand('set-env', { name }, convertedVal);
+        return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));
     }
+    command_1.issueCommand('set-env', { name }, convertedVal);
 }
 exports.exportVariable = exportVariable;
 /**
@@ -491,7 +479,7 @@ exports.setSecret = setSecret;
 function addPath(inputPath) {
     const filePath = process.env['GITHUB_PATH'] || '';
     if (filePath) {
-        file_command_1.issueCommand('PATH', inputPath);
+        file_command_1.issueFileCommand('PATH', inputPath);
     }
     else {
         command_1.issueCommand('add-path', {}, inputPath);
@@ -531,7 +519,10 @@ function getMultilineInput(name, options) {
     const inputs = getInput(name, options)
         .split('\n')
         .filter(x => x !== '');
-    return inputs;
+    if (options && options.trimWhitespace === false) {
+        return inputs;
+    }
+    return inputs.map(input => input.trim());
 }
 exports.getMultilineInput = getMultilineInput;
 /**
@@ -564,8 +555,12 @@ exports.getBooleanInput = getBooleanInput;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function setOutput(name, value) {
+    const filePath = process.env['GITHUB_OUTPUT'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));
+    }
     process.stdout.write(os.EOL);
-    command_1.issueCommand('set-output', { name }, value);
+    command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));
 }
 exports.setOutput = setOutput;
 /**
@@ -694,7 +689,11 @@ exports.group = group;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function saveState(name, value) {
-    command_1.issueCommand('save-state', { name }, value);
+    const filePath = process.env['GITHUB_STATE'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));
+    }
+    command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));
 }
 exports.saveState = saveState;
 /**
@@ -760,13 +759,14 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.issueCommand = void 0;
+exports.prepareKeyValueMessage = exports.issueFileCommand = void 0;
 // We use any as a valid input type
 /* eslint-disable @typescript-eslint/no-explicit-any */
 const fs = __importStar(__nccwpck_require__(747));
 const os = __importStar(__nccwpck_require__(87));
+const uuid_1 = __nccwpck_require__(521);
 const utils_1 = __nccwpck_require__(278);
-function issueCommand(command, message) {
+function issueFileCommand(command, message) {
     const filePath = process.env[`GITHUB_${command}`];
     if (!filePath) {
         throw new Error(`Unable to find environment variable for file command ${command}`);
@@ -778,7 +778,22 @@ function issueCommand(command, message) {
         encoding: 'utf8'
     });
 }
-exports.issueCommand = issueCommand;
+exports.issueFileCommand = issueFileCommand;
+function prepareKeyValueMessage(key, value) {
+    const delimiter = `ghadelimiter_${uuid_1.v4()}`;
+    const convertedValue = utils_1.toCommandValue(value);
+    // These should realistically never happen, but just in case someone finds a
+    // way to exploit uuid generation let's not allow keys or values that contain
+    // the delimiter.
+    if (key.includes(delimiter)) {
+        throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
+    }
+    if (convertedValue.includes(delimiter)) {
+        throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
+    }
+    return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;
+}
+exports.prepareKeyValueMessage = prepareKeyValueMessage;
 //# sourceMappingURL=file-command.js.map
 
 /***/ }),
diff --git a/.github/actions/javascript/checkBundleVersionStringMatch/index.js b/.github/actions/javascript/checkBundleVersionStringMatch/index.js
index 436d6ee4c50a..2b07b84c75fe 100644
--- a/.github/actions/javascript/checkBundleVersionStringMatch/index.js
+++ b/.github/actions/javascript/checkBundleVersionStringMatch/index.js
@@ -269,7 +269,6 @@ const file_command_1 = __nccwpck_require__(717);
 const utils_1 = __nccwpck_require__(278);
 const os = __importStar(__nccwpck_require__(87));
 const path = __importStar(__nccwpck_require__(622));
-const uuid_1 = __nccwpck_require__(521);
 const oidc_utils_1 = __nccwpck_require__(41);
 /**
  * The code to exit an action
@@ -299,20 +298,9 @@ function exportVariable(name, val) {
     process.env[name] = convertedVal;
     const filePath = process.env['GITHUB_ENV'] || '';
     if (filePath) {
-        const delimiter = `ghadelimiter_${uuid_1.v4()}`;
-        // These should realistically never happen, but just in case someone finds a way to exploit uuid generation let's not allow keys or values that contain the delimiter.
-        if (name.includes(delimiter)) {
-            throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
-        }
-        if (convertedVal.includes(delimiter)) {
-            throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
-        }
-        const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;
-        file_command_1.issueCommand('ENV', commandValue);
-    }
-    else {
-        command_1.issueCommand('set-env', { name }, convertedVal);
+        return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));
     }
+    command_1.issueCommand('set-env', { name }, convertedVal);
 }
 exports.exportVariable = exportVariable;
 /**
@@ -330,7 +318,7 @@ exports.setSecret = setSecret;
 function addPath(inputPath) {
     const filePath = process.env['GITHUB_PATH'] || '';
     if (filePath) {
-        file_command_1.issueCommand('PATH', inputPath);
+        file_command_1.issueFileCommand('PATH', inputPath);
     }
     else {
         command_1.issueCommand('add-path', {}, inputPath);
@@ -370,7 +358,10 @@ function getMultilineInput(name, options) {
     const inputs = getInput(name, options)
         .split('\n')
         .filter(x => x !== '');
-    return inputs;
+    if (options && options.trimWhitespace === false) {
+        return inputs;
+    }
+    return inputs.map(input => input.trim());
 }
 exports.getMultilineInput = getMultilineInput;
 /**
@@ -403,8 +394,12 @@ exports.getBooleanInput = getBooleanInput;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function setOutput(name, value) {
+    const filePath = process.env['GITHUB_OUTPUT'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));
+    }
     process.stdout.write(os.EOL);
-    command_1.issueCommand('set-output', { name }, value);
+    command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));
 }
 exports.setOutput = setOutput;
 /**
@@ -533,7 +528,11 @@ exports.group = group;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function saveState(name, value) {
-    command_1.issueCommand('save-state', { name }, value);
+    const filePath = process.env['GITHUB_STATE'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));
+    }
+    command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));
 }
 exports.saveState = saveState;
 /**
@@ -599,13 +598,14 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.issueCommand = void 0;
+exports.prepareKeyValueMessage = exports.issueFileCommand = void 0;
 // We use any as a valid input type
 /* eslint-disable @typescript-eslint/no-explicit-any */
 const fs = __importStar(__nccwpck_require__(747));
 const os = __importStar(__nccwpck_require__(87));
+const uuid_1 = __nccwpck_require__(521);
 const utils_1 = __nccwpck_require__(278);
-function issueCommand(command, message) {
+function issueFileCommand(command, message) {
     const filePath = process.env[`GITHUB_${command}`];
     if (!filePath) {
         throw new Error(`Unable to find environment variable for file command ${command}`);
@@ -617,7 +617,22 @@ function issueCommand(command, message) {
         encoding: 'utf8'
     });
 }
-exports.issueCommand = issueCommand;
+exports.issueFileCommand = issueFileCommand;
+function prepareKeyValueMessage(key, value) {
+    const delimiter = `ghadelimiter_${uuid_1.v4()}`;
+    const convertedValue = utils_1.toCommandValue(value);
+    // These should realistically never happen, but just in case someone finds a
+    // way to exploit uuid generation let's not allow keys or values that contain
+    // the delimiter.
+    if (key.includes(delimiter)) {
+        throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
+    }
+    if (convertedValue.includes(delimiter)) {
+        throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
+    }
+    return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;
+}
+exports.prepareKeyValueMessage = prepareKeyValueMessage;
 //# sourceMappingURL=file-command.js.map
 
 /***/ }),
diff --git a/.github/actions/javascript/checkDeployBlockers/index.js b/.github/actions/javascript/checkDeployBlockers/index.js
index 04d49c425b2f..10548dd37d78 100644
--- a/.github/actions/javascript/checkDeployBlockers/index.js
+++ b/.github/actions/javascript/checkDeployBlockers/index.js
@@ -736,7 +736,6 @@ const file_command_1 = __nccwpck_require__(717);
 const utils_1 = __nccwpck_require__(5278);
 const os = __importStar(__nccwpck_require__(2087));
 const path = __importStar(__nccwpck_require__(5622));
-const uuid_1 = __nccwpck_require__(9521);
 const oidc_utils_1 = __nccwpck_require__(8041);
 /**
  * The code to exit an action
@@ -766,20 +765,9 @@ function exportVariable(name, val) {
     process.env[name] = convertedVal;
     const filePath = process.env['GITHUB_ENV'] || '';
     if (filePath) {
-        const delimiter = `ghadelimiter_${uuid_1.v4()}`;
-        // These should realistically never happen, but just in case someone finds a way to exploit uuid generation let's not allow keys or values that contain the delimiter.
-        if (name.includes(delimiter)) {
-            throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
-        }
-        if (convertedVal.includes(delimiter)) {
-            throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
-        }
-        const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;
-        file_command_1.issueCommand('ENV', commandValue);
-    }
-    else {
-        command_1.issueCommand('set-env', { name }, convertedVal);
+        return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));
     }
+    command_1.issueCommand('set-env', { name }, convertedVal);
 }
 exports.exportVariable = exportVariable;
 /**
@@ -797,7 +785,7 @@ exports.setSecret = setSecret;
 function addPath(inputPath) {
     const filePath = process.env['GITHUB_PATH'] || '';
     if (filePath) {
-        file_command_1.issueCommand('PATH', inputPath);
+        file_command_1.issueFileCommand('PATH', inputPath);
     }
     else {
         command_1.issueCommand('add-path', {}, inputPath);
@@ -837,7 +825,10 @@ function getMultilineInput(name, options) {
     const inputs = getInput(name, options)
         .split('\n')
         .filter(x => x !== '');
-    return inputs;
+    if (options && options.trimWhitespace === false) {
+        return inputs;
+    }
+    return inputs.map(input => input.trim());
 }
 exports.getMultilineInput = getMultilineInput;
 /**
@@ -870,8 +861,12 @@ exports.getBooleanInput = getBooleanInput;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function setOutput(name, value) {
+    const filePath = process.env['GITHUB_OUTPUT'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));
+    }
     process.stdout.write(os.EOL);
-    command_1.issueCommand('set-output', { name }, value);
+    command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));
 }
 exports.setOutput = setOutput;
 /**
@@ -1000,7 +995,11 @@ exports.group = group;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function saveState(name, value) {
-    command_1.issueCommand('save-state', { name }, value);
+    const filePath = process.env['GITHUB_STATE'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));
+    }
+    command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));
 }
 exports.saveState = saveState;
 /**
@@ -1066,13 +1065,14 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.issueCommand = void 0;
+exports.prepareKeyValueMessage = exports.issueFileCommand = void 0;
 // We use any as a valid input type
 /* eslint-disable @typescript-eslint/no-explicit-any */
 const fs = __importStar(__nccwpck_require__(5747));
 const os = __importStar(__nccwpck_require__(2087));
+const uuid_1 = __nccwpck_require__(9521);
 const utils_1 = __nccwpck_require__(5278);
-function issueCommand(command, message) {
+function issueFileCommand(command, message) {
     const filePath = process.env[`GITHUB_${command}`];
     if (!filePath) {
         throw new Error(`Unable to find environment variable for file command ${command}`);
@@ -1084,7 +1084,22 @@ function issueCommand(command, message) {
         encoding: 'utf8'
     });
 }
-exports.issueCommand = issueCommand;
+exports.issueFileCommand = issueFileCommand;
+function prepareKeyValueMessage(key, value) {
+    const delimiter = `ghadelimiter_${uuid_1.v4()}`;
+    const convertedValue = utils_1.toCommandValue(value);
+    // These should realistically never happen, but just in case someone finds a
+    // way to exploit uuid generation let's not allow keys or values that contain
+    // the delimiter.
+    if (key.includes(delimiter)) {
+        throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
+    }
+    if (convertedValue.includes(delimiter)) {
+        throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
+    }
+    return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;
+}
+exports.prepareKeyValueMessage = prepareKeyValueMessage;
 //# sourceMappingURL=file-command.js.map
 
 /***/ }),
@@ -1711,7 +1726,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.getOctokitOptions = exports.GitHub = exports.context = void 0;
+exports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0;
 const Context = __importStar(__nccwpck_require__(4087));
 const Utils = __importStar(__nccwpck_require__(7914));
 // octokit + plugins
@@ -1720,13 +1735,13 @@ const plugin_rest_endpoint_methods_1 = __nccwpck_require__(3044);
 const plugin_paginate_rest_1 = __nccwpck_require__(8945);
 exports.context = new Context.Context();
 const baseUrl = Utils.getApiBaseUrl();
-const defaults = {
+exports.defaults = {
     baseUrl,
     request: {
         agent: Utils.getProxyAgent(baseUrl)
     }
 };
-exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(defaults);
+exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults);
 /**
  * Convience function to correctly format Octokit Options to pass into the constructor.
  *
diff --git a/.github/actions/javascript/contributorChecklist/contributorChecklist.js b/.github/actions/javascript/contributorChecklist/contributorChecklist.js
index e9e740623d49..7411fbf88bd7 100644
--- a/.github/actions/javascript/contributorChecklist/contributorChecklist.js
+++ b/.github/actions/javascript/contributorChecklist/contributorChecklist.js
@@ -24,7 +24,7 @@ const completedAuthorChecklist = `- [x] I linked the correct issue in the \`###
     - [x] I verified that comments were added to code that is not self explanatory
     - [x] I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
     - [x] I verified any copy / text shown in the product was added in all \`src/languages/*\` files
-    - [x] I verified any copy / text that was added to the app is correct English and approved by marketing by tagging the marketing team on the original GH to get the correct copy.
+    - [x] I verified any copy / text that was added to the app is correct English and approved by marketing by adding the \`Waiting for Copy\` label for a copy review on the original GH to get the correct copy.
     - [x] I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
     - [x] I verified the JSDocs style guidelines (in [\`STYLE.md\`](https://github.com/Expensify/App/blob/main/contributingGuides/STYLE.md#jsdocs)) were followed
 - [x] If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
@@ -71,7 +71,7 @@ const completedReviewerChecklist = `- [x] I have verified the author checklist i
     - [x] I verified that comments were added to code that is not self explanatory
     - [x] I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
     - [x] I verified any copy / text shown in the product was added in all \`src/languages/*\` files
-    - [x] I verified any copy / text that was added to the app is correct English and approved by marketing by tagging the marketing team on the original GH to get the correct copy.
+    - [x] I verified any copy / text that was added to the app is correct English and approved by marketing by adding the \`Waiting for Copy\` label for a copy review on the original GH to get the correct copy.
     - [x] I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
     - [x] I verified the JSDocs style guidelines (in [\`STYLE.md\`](https://github.com/Expensify/App/blob/main/contributingGuides/STYLE.md#jsdocs)) were followed
 - [x] If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
diff --git a/.github/actions/javascript/contributorChecklist/index.js b/.github/actions/javascript/contributorChecklist/index.js
index 225704c5d109..ecf8f6ecd625 100644
--- a/.github/actions/javascript/contributorChecklist/index.js
+++ b/.github/actions/javascript/contributorChecklist/index.js
@@ -34,7 +34,7 @@ const completedAuthorChecklist = `- [x] I linked the correct issue in the \`###
     - [x] I verified that comments were added to code that is not self explanatory
     - [x] I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
     - [x] I verified any copy / text shown in the product was added in all \`src/languages/*\` files
-    - [x] I verified any copy / text that was added to the app is correct English and approved by marketing by tagging the marketing team on the original GH to get the correct copy.
+    - [x] I verified any copy / text that was added to the app is correct English and approved by marketing by adding the \`Waiting for Copy\` label for a copy review on the original GH to get the correct copy.
     - [x] I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
     - [x] I verified the JSDocs style guidelines (in [\`STYLE.md\`](https://github.com/Expensify/App/blob/main/contributingGuides/STYLE.md#jsdocs)) were followed
 - [x] If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
@@ -81,7 +81,7 @@ const completedReviewerChecklist = `- [x] I have verified the author checklist i
     - [x] I verified that comments were added to code that is not self explanatory
     - [x] I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
     - [x] I verified any copy / text shown in the product was added in all \`src/languages/*\` files
-    - [x] I verified any copy / text that was added to the app is correct English and approved by marketing by tagging the marketing team on the original GH to get the correct copy.
+    - [x] I verified any copy / text that was added to the app is correct English and approved by marketing by adding the \`Waiting for Copy\` label for a copy review on the original GH to get the correct copy.
     - [x] I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
     - [x] I verified the JSDocs style guidelines (in [\`STYLE.md\`](https://github.com/Expensify/App/blob/main/contributingGuides/STYLE.md#jsdocs)) were followed
 - [x] If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
@@ -833,7 +833,6 @@ const file_command_1 = __nccwpck_require__(717);
 const utils_1 = __nccwpck_require__(5278);
 const os = __importStar(__nccwpck_require__(2087));
 const path = __importStar(__nccwpck_require__(5622));
-const uuid_1 = __nccwpck_require__(9521);
 const oidc_utils_1 = __nccwpck_require__(8041);
 /**
  * The code to exit an action
@@ -863,20 +862,9 @@ function exportVariable(name, val) {
     process.env[name] = convertedVal;
     const filePath = process.env['GITHUB_ENV'] || '';
     if (filePath) {
-        const delimiter = `ghadelimiter_${uuid_1.v4()}`;
-        // These should realistically never happen, but just in case someone finds a way to exploit uuid generation let's not allow keys or values that contain the delimiter.
-        if (name.includes(delimiter)) {
-            throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
-        }
-        if (convertedVal.includes(delimiter)) {
-            throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
-        }
-        const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;
-        file_command_1.issueCommand('ENV', commandValue);
-    }
-    else {
-        command_1.issueCommand('set-env', { name }, convertedVal);
+        return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));
     }
+    command_1.issueCommand('set-env', { name }, convertedVal);
 }
 exports.exportVariable = exportVariable;
 /**
@@ -894,7 +882,7 @@ exports.setSecret = setSecret;
 function addPath(inputPath) {
     const filePath = process.env['GITHUB_PATH'] || '';
     if (filePath) {
-        file_command_1.issueCommand('PATH', inputPath);
+        file_command_1.issueFileCommand('PATH', inputPath);
     }
     else {
         command_1.issueCommand('add-path', {}, inputPath);
@@ -934,7 +922,10 @@ function getMultilineInput(name, options) {
     const inputs = getInput(name, options)
         .split('\n')
         .filter(x => x !== '');
-    return inputs;
+    if (options && options.trimWhitespace === false) {
+        return inputs;
+    }
+    return inputs.map(input => input.trim());
 }
 exports.getMultilineInput = getMultilineInput;
 /**
@@ -967,8 +958,12 @@ exports.getBooleanInput = getBooleanInput;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function setOutput(name, value) {
+    const filePath = process.env['GITHUB_OUTPUT'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));
+    }
     process.stdout.write(os.EOL);
-    command_1.issueCommand('set-output', { name }, value);
+    command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));
 }
 exports.setOutput = setOutput;
 /**
@@ -1097,7 +1092,11 @@ exports.group = group;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function saveState(name, value) {
-    command_1.issueCommand('save-state', { name }, value);
+    const filePath = process.env['GITHUB_STATE'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));
+    }
+    command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));
 }
 exports.saveState = saveState;
 /**
@@ -1163,13 +1162,14 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.issueCommand = void 0;
+exports.prepareKeyValueMessage = exports.issueFileCommand = void 0;
 // We use any as a valid input type
 /* eslint-disable @typescript-eslint/no-explicit-any */
 const fs = __importStar(__nccwpck_require__(5747));
 const os = __importStar(__nccwpck_require__(2087));
+const uuid_1 = __nccwpck_require__(9521);
 const utils_1 = __nccwpck_require__(5278);
-function issueCommand(command, message) {
+function issueFileCommand(command, message) {
     const filePath = process.env[`GITHUB_${command}`];
     if (!filePath) {
         throw new Error(`Unable to find environment variable for file command ${command}`);
@@ -1181,7 +1181,22 @@ function issueCommand(command, message) {
         encoding: 'utf8'
     });
 }
-exports.issueCommand = issueCommand;
+exports.issueFileCommand = issueFileCommand;
+function prepareKeyValueMessage(key, value) {
+    const delimiter = `ghadelimiter_${uuid_1.v4()}`;
+    const convertedValue = utils_1.toCommandValue(value);
+    // These should realistically never happen, but just in case someone finds a
+    // way to exploit uuid generation let's not allow keys or values that contain
+    // the delimiter.
+    if (key.includes(delimiter)) {
+        throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
+    }
+    if (convertedValue.includes(delimiter)) {
+        throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
+    }
+    return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;
+}
+exports.prepareKeyValueMessage = prepareKeyValueMessage;
 //# sourceMappingURL=file-command.js.map
 
 /***/ }),
@@ -1768,8 +1783,9 @@ exports.context = new Context.Context();
  * @param     token    the repo PAT or GITHUB_TOKEN
  * @param     options  other options to set
  */
-function getOctokit(token, options) {
-    return new utils_1.GitHub(utils_1.getOctokitOptions(token, options));
+function getOctokit(token, options, ...additionalPlugins) {
+    const GitHubWithPlugins = utils_1.GitHub.plugin(...additionalPlugins);
+    return new GitHubWithPlugins(utils_1.getOctokitOptions(token, options));
 }
 exports.getOctokit = getOctokit;
 //# sourceMappingURL=github.js.map
@@ -1851,7 +1867,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.getOctokitOptions = exports.GitHub = exports.context = void 0;
+exports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0;
 const Context = __importStar(__nccwpck_require__(4087));
 const Utils = __importStar(__nccwpck_require__(7914));
 // octokit + plugins
@@ -1860,13 +1876,13 @@ const plugin_rest_endpoint_methods_1 = __nccwpck_require__(3044);
 const plugin_paginate_rest_1 = __nccwpck_require__(8945);
 exports.context = new Context.Context();
 const baseUrl = Utils.getApiBaseUrl();
-const defaults = {
+exports.defaults = {
     baseUrl,
     request: {
         agent: Utils.getProxyAgent(baseUrl)
     }
 };
-exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(defaults);
+exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults);
 /**
  * Convience function to correctly format Octokit Options to pass into the constructor.
  *
diff --git a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js
index aa043797e971..aa6de92484ac 100644
--- a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js
+++ b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js
@@ -963,7 +963,6 @@ const file_command_1 = __nccwpck_require__(717);
 const utils_1 = __nccwpck_require__(5278);
 const os = __importStar(__nccwpck_require__(2087));
 const path = __importStar(__nccwpck_require__(5622));
-const uuid_1 = __nccwpck_require__(9521);
 const oidc_utils_1 = __nccwpck_require__(8041);
 /**
  * The code to exit an action
@@ -993,20 +992,9 @@ function exportVariable(name, val) {
     process.env[name] = convertedVal;
     const filePath = process.env['GITHUB_ENV'] || '';
     if (filePath) {
-        const delimiter = `ghadelimiter_${uuid_1.v4()}`;
-        // These should realistically never happen, but just in case someone finds a way to exploit uuid generation let's not allow keys or values that contain the delimiter.
-        if (name.includes(delimiter)) {
-            throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
-        }
-        if (convertedVal.includes(delimiter)) {
-            throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
-        }
-        const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;
-        file_command_1.issueCommand('ENV', commandValue);
-    }
-    else {
-        command_1.issueCommand('set-env', { name }, convertedVal);
+        return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));
     }
+    command_1.issueCommand('set-env', { name }, convertedVal);
 }
 exports.exportVariable = exportVariable;
 /**
@@ -1024,7 +1012,7 @@ exports.setSecret = setSecret;
 function addPath(inputPath) {
     const filePath = process.env['GITHUB_PATH'] || '';
     if (filePath) {
-        file_command_1.issueCommand('PATH', inputPath);
+        file_command_1.issueFileCommand('PATH', inputPath);
     }
     else {
         command_1.issueCommand('add-path', {}, inputPath);
@@ -1064,7 +1052,10 @@ function getMultilineInput(name, options) {
     const inputs = getInput(name, options)
         .split('\n')
         .filter(x => x !== '');
-    return inputs;
+    if (options && options.trimWhitespace === false) {
+        return inputs;
+    }
+    return inputs.map(input => input.trim());
 }
 exports.getMultilineInput = getMultilineInput;
 /**
@@ -1097,8 +1088,12 @@ exports.getBooleanInput = getBooleanInput;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function setOutput(name, value) {
+    const filePath = process.env['GITHUB_OUTPUT'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));
+    }
     process.stdout.write(os.EOL);
-    command_1.issueCommand('set-output', { name }, value);
+    command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));
 }
 exports.setOutput = setOutput;
 /**
@@ -1227,7 +1222,11 @@ exports.group = group;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function saveState(name, value) {
-    command_1.issueCommand('save-state', { name }, value);
+    const filePath = process.env['GITHUB_STATE'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));
+    }
+    command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));
 }
 exports.saveState = saveState;
 /**
@@ -1293,13 +1292,14 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.issueCommand = void 0;
+exports.prepareKeyValueMessage = exports.issueFileCommand = void 0;
 // We use any as a valid input type
 /* eslint-disable @typescript-eslint/no-explicit-any */
 const fs = __importStar(__nccwpck_require__(5747));
 const os = __importStar(__nccwpck_require__(2087));
+const uuid_1 = __nccwpck_require__(9521);
 const utils_1 = __nccwpck_require__(5278);
-function issueCommand(command, message) {
+function issueFileCommand(command, message) {
     const filePath = process.env[`GITHUB_${command}`];
     if (!filePath) {
         throw new Error(`Unable to find environment variable for file command ${command}`);
@@ -1311,7 +1311,22 @@ function issueCommand(command, message) {
         encoding: 'utf8'
     });
 }
-exports.issueCommand = issueCommand;
+exports.issueFileCommand = issueFileCommand;
+function prepareKeyValueMessage(key, value) {
+    const delimiter = `ghadelimiter_${uuid_1.v4()}`;
+    const convertedValue = utils_1.toCommandValue(value);
+    // These should realistically never happen, but just in case someone finds a
+    // way to exploit uuid generation let's not allow keys or values that contain
+    // the delimiter.
+    if (key.includes(delimiter)) {
+        throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
+    }
+    if (convertedValue.includes(delimiter)) {
+        throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
+    }
+    return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;
+}
+exports.prepareKeyValueMessage = prepareKeyValueMessage;
 //# sourceMappingURL=file-command.js.map
 
 /***/ }),
@@ -1938,7 +1953,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.getOctokitOptions = exports.GitHub = exports.context = void 0;
+exports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0;
 const Context = __importStar(__nccwpck_require__(4087));
 const Utils = __importStar(__nccwpck_require__(7914));
 // octokit + plugins
@@ -1947,13 +1962,13 @@ const plugin_rest_endpoint_methods_1 = __nccwpck_require__(3044);
 const plugin_paginate_rest_1 = __nccwpck_require__(8945);
 exports.context = new Context.Context();
 const baseUrl = Utils.getApiBaseUrl();
-const defaults = {
+exports.defaults = {
     baseUrl,
     request: {
         agent: Utils.getProxyAgent(baseUrl)
     }
 };
-exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(defaults);
+exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults);
 /**
  * Convience function to correctly format Octokit Options to pass into the constructor.
  *
diff --git a/.github/actions/javascript/getDeployPullRequestList/index.js b/.github/actions/javascript/getDeployPullRequestList/index.js
index d2c6e2ba2ff0..517d48b73e35 100644
--- a/.github/actions/javascript/getDeployPullRequestList/index.js
+++ b/.github/actions/javascript/getDeployPullRequestList/index.js
@@ -896,7 +896,6 @@ const file_command_1 = __nccwpck_require__(717);
 const utils_1 = __nccwpck_require__(5278);
 const os = __importStar(__nccwpck_require__(2087));
 const path = __importStar(__nccwpck_require__(5622));
-const uuid_1 = __nccwpck_require__(9521);
 const oidc_utils_1 = __nccwpck_require__(8041);
 /**
  * The code to exit an action
@@ -926,20 +925,9 @@ function exportVariable(name, val) {
     process.env[name] = convertedVal;
     const filePath = process.env['GITHUB_ENV'] || '';
     if (filePath) {
-        const delimiter = `ghadelimiter_${uuid_1.v4()}`;
-        // These should realistically never happen, but just in case someone finds a way to exploit uuid generation let's not allow keys or values that contain the delimiter.
-        if (name.includes(delimiter)) {
-            throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
-        }
-        if (convertedVal.includes(delimiter)) {
-            throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
-        }
-        const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;
-        file_command_1.issueCommand('ENV', commandValue);
-    }
-    else {
-        command_1.issueCommand('set-env', { name }, convertedVal);
+        return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));
     }
+    command_1.issueCommand('set-env', { name }, convertedVal);
 }
 exports.exportVariable = exportVariable;
 /**
@@ -957,7 +945,7 @@ exports.setSecret = setSecret;
 function addPath(inputPath) {
     const filePath = process.env['GITHUB_PATH'] || '';
     if (filePath) {
-        file_command_1.issueCommand('PATH', inputPath);
+        file_command_1.issueFileCommand('PATH', inputPath);
     }
     else {
         command_1.issueCommand('add-path', {}, inputPath);
@@ -997,7 +985,10 @@ function getMultilineInput(name, options) {
     const inputs = getInput(name, options)
         .split('\n')
         .filter(x => x !== '');
-    return inputs;
+    if (options && options.trimWhitespace === false) {
+        return inputs;
+    }
+    return inputs.map(input => input.trim());
 }
 exports.getMultilineInput = getMultilineInput;
 /**
@@ -1030,8 +1021,12 @@ exports.getBooleanInput = getBooleanInput;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function setOutput(name, value) {
+    const filePath = process.env['GITHUB_OUTPUT'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));
+    }
     process.stdout.write(os.EOL);
-    command_1.issueCommand('set-output', { name }, value);
+    command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));
 }
 exports.setOutput = setOutput;
 /**
@@ -1160,7 +1155,11 @@ exports.group = group;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function saveState(name, value) {
-    command_1.issueCommand('save-state', { name }, value);
+    const filePath = process.env['GITHUB_STATE'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));
+    }
+    command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));
 }
 exports.saveState = saveState;
 /**
@@ -1226,13 +1225,14 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.issueCommand = void 0;
+exports.prepareKeyValueMessage = exports.issueFileCommand = void 0;
 // We use any as a valid input type
 /* eslint-disable @typescript-eslint/no-explicit-any */
 const fs = __importStar(__nccwpck_require__(5747));
 const os = __importStar(__nccwpck_require__(2087));
+const uuid_1 = __nccwpck_require__(9521);
 const utils_1 = __nccwpck_require__(5278);
-function issueCommand(command, message) {
+function issueFileCommand(command, message) {
     const filePath = process.env[`GITHUB_${command}`];
     if (!filePath) {
         throw new Error(`Unable to find environment variable for file command ${command}`);
@@ -1244,7 +1244,22 @@ function issueCommand(command, message) {
         encoding: 'utf8'
     });
 }
-exports.issueCommand = issueCommand;
+exports.issueFileCommand = issueFileCommand;
+function prepareKeyValueMessage(key, value) {
+    const delimiter = `ghadelimiter_${uuid_1.v4()}`;
+    const convertedValue = utils_1.toCommandValue(value);
+    // These should realistically never happen, but just in case someone finds a
+    // way to exploit uuid generation let's not allow keys or values that contain
+    // the delimiter.
+    if (key.includes(delimiter)) {
+        throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
+    }
+    if (convertedValue.includes(delimiter)) {
+        throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
+    }
+    return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;
+}
+exports.prepareKeyValueMessage = prepareKeyValueMessage;
 //# sourceMappingURL=file-command.js.map
 
 /***/ }),
@@ -1831,8 +1846,9 @@ exports.context = new Context.Context();
  * @param     token    the repo PAT or GITHUB_TOKEN
  * @param     options  other options to set
  */
-function getOctokit(token, options) {
-    return new utils_1.GitHub(utils_1.getOctokitOptions(token, options));
+function getOctokit(token, options, ...additionalPlugins) {
+    const GitHubWithPlugins = utils_1.GitHub.plugin(...additionalPlugins);
+    return new GitHubWithPlugins(utils_1.getOctokitOptions(token, options));
 }
 exports.getOctokit = getOctokit;
 //# sourceMappingURL=github.js.map
@@ -1914,7 +1930,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.getOctokitOptions = exports.GitHub = exports.context = void 0;
+exports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0;
 const Context = __importStar(__nccwpck_require__(4087));
 const Utils = __importStar(__nccwpck_require__(7914));
 // octokit + plugins
@@ -1923,13 +1939,13 @@ const plugin_rest_endpoint_methods_1 = __nccwpck_require__(3044);
 const plugin_paginate_rest_1 = __nccwpck_require__(8945);
 exports.context = new Context.Context();
 const baseUrl = Utils.getApiBaseUrl();
-const defaults = {
+exports.defaults = {
     baseUrl,
     request: {
         agent: Utils.getProxyAgent(baseUrl)
     }
 };
-exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(defaults);
+exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults);
 /**
  * Convience function to correctly format Octokit Options to pass into the constructor.
  *
diff --git a/.github/actions/javascript/getPullRequestDetails/index.js b/.github/actions/javascript/getPullRequestDetails/index.js
index 1dc611325fc3..c159e063b733 100644
--- a/.github/actions/javascript/getPullRequestDetails/index.js
+++ b/.github/actions/javascript/getPullRequestDetails/index.js
@@ -811,7 +811,6 @@ const file_command_1 = __nccwpck_require__(717);
 const utils_1 = __nccwpck_require__(5278);
 const os = __importStar(__nccwpck_require__(2087));
 const path = __importStar(__nccwpck_require__(5622));
-const uuid_1 = __nccwpck_require__(9521);
 const oidc_utils_1 = __nccwpck_require__(8041);
 /**
  * The code to exit an action
@@ -841,20 +840,9 @@ function exportVariable(name, val) {
     process.env[name] = convertedVal;
     const filePath = process.env['GITHUB_ENV'] || '';
     if (filePath) {
-        const delimiter = `ghadelimiter_${uuid_1.v4()}`;
-        // These should realistically never happen, but just in case someone finds a way to exploit uuid generation let's not allow keys or values that contain the delimiter.
-        if (name.includes(delimiter)) {
-            throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
-        }
-        if (convertedVal.includes(delimiter)) {
-            throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
-        }
-        const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;
-        file_command_1.issueCommand('ENV', commandValue);
-    }
-    else {
-        command_1.issueCommand('set-env', { name }, convertedVal);
+        return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));
     }
+    command_1.issueCommand('set-env', { name }, convertedVal);
 }
 exports.exportVariable = exportVariable;
 /**
@@ -872,7 +860,7 @@ exports.setSecret = setSecret;
 function addPath(inputPath) {
     const filePath = process.env['GITHUB_PATH'] || '';
     if (filePath) {
-        file_command_1.issueCommand('PATH', inputPath);
+        file_command_1.issueFileCommand('PATH', inputPath);
     }
     else {
         command_1.issueCommand('add-path', {}, inputPath);
@@ -912,7 +900,10 @@ function getMultilineInput(name, options) {
     const inputs = getInput(name, options)
         .split('\n')
         .filter(x => x !== '');
-    return inputs;
+    if (options && options.trimWhitespace === false) {
+        return inputs;
+    }
+    return inputs.map(input => input.trim());
 }
 exports.getMultilineInput = getMultilineInput;
 /**
@@ -945,8 +936,12 @@ exports.getBooleanInput = getBooleanInput;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function setOutput(name, value) {
+    const filePath = process.env['GITHUB_OUTPUT'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));
+    }
     process.stdout.write(os.EOL);
-    command_1.issueCommand('set-output', { name }, value);
+    command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));
 }
 exports.setOutput = setOutput;
 /**
@@ -1075,7 +1070,11 @@ exports.group = group;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function saveState(name, value) {
-    command_1.issueCommand('save-state', { name }, value);
+    const filePath = process.env['GITHUB_STATE'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));
+    }
+    command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));
 }
 exports.saveState = saveState;
 /**
@@ -1141,13 +1140,14 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.issueCommand = void 0;
+exports.prepareKeyValueMessage = exports.issueFileCommand = void 0;
 // We use any as a valid input type
 /* eslint-disable @typescript-eslint/no-explicit-any */
 const fs = __importStar(__nccwpck_require__(5747));
 const os = __importStar(__nccwpck_require__(2087));
+const uuid_1 = __nccwpck_require__(9521);
 const utils_1 = __nccwpck_require__(5278);
-function issueCommand(command, message) {
+function issueFileCommand(command, message) {
     const filePath = process.env[`GITHUB_${command}`];
     if (!filePath) {
         throw new Error(`Unable to find environment variable for file command ${command}`);
@@ -1159,7 +1159,22 @@ function issueCommand(command, message) {
         encoding: 'utf8'
     });
 }
-exports.issueCommand = issueCommand;
+exports.issueFileCommand = issueFileCommand;
+function prepareKeyValueMessage(key, value) {
+    const delimiter = `ghadelimiter_${uuid_1.v4()}`;
+    const convertedValue = utils_1.toCommandValue(value);
+    // These should realistically never happen, but just in case someone finds a
+    // way to exploit uuid generation let's not allow keys or values that contain
+    // the delimiter.
+    if (key.includes(delimiter)) {
+        throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
+    }
+    if (convertedValue.includes(delimiter)) {
+        throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
+    }
+    return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;
+}
+exports.prepareKeyValueMessage = prepareKeyValueMessage;
 //# sourceMappingURL=file-command.js.map
 
 /***/ }),
@@ -1786,7 +1801,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.getOctokitOptions = exports.GitHub = exports.context = void 0;
+exports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0;
 const Context = __importStar(__nccwpck_require__(4087));
 const Utils = __importStar(__nccwpck_require__(7914));
 // octokit + plugins
@@ -1795,13 +1810,13 @@ const plugin_rest_endpoint_methods_1 = __nccwpck_require__(3044);
 const plugin_paginate_rest_1 = __nccwpck_require__(8945);
 exports.context = new Context.Context();
 const baseUrl = Utils.getApiBaseUrl();
-const defaults = {
+exports.defaults = {
     baseUrl,
     request: {
         agent: Utils.getProxyAgent(baseUrl)
     }
 };
-exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(defaults);
+exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults);
 /**
  * Convience function to correctly format Octokit Options to pass into the constructor.
  *
diff --git a/.github/actions/javascript/getReleaseBody/index.js b/.github/actions/javascript/getReleaseBody/index.js
index 7fc7a77bafcc..3a05454cb898 100644
--- a/.github/actions/javascript/getReleaseBody/index.js
+++ b/.github/actions/javascript/getReleaseBody/index.js
@@ -725,7 +725,6 @@ const file_command_1 = __nccwpck_require__(717);
 const utils_1 = __nccwpck_require__(5278);
 const os = __importStar(__nccwpck_require__(2087));
 const path = __importStar(__nccwpck_require__(5622));
-const uuid_1 = __nccwpck_require__(9521);
 const oidc_utils_1 = __nccwpck_require__(8041);
 /**
  * The code to exit an action
@@ -755,20 +754,9 @@ function exportVariable(name, val) {
     process.env[name] = convertedVal;
     const filePath = process.env['GITHUB_ENV'] || '';
     if (filePath) {
-        const delimiter = `ghadelimiter_${uuid_1.v4()}`;
-        // These should realistically never happen, but just in case someone finds a way to exploit uuid generation let's not allow keys or values that contain the delimiter.
-        if (name.includes(delimiter)) {
-            throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
-        }
-        if (convertedVal.includes(delimiter)) {
-            throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
-        }
-        const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;
-        file_command_1.issueCommand('ENV', commandValue);
-    }
-    else {
-        command_1.issueCommand('set-env', { name }, convertedVal);
+        return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));
     }
+    command_1.issueCommand('set-env', { name }, convertedVal);
 }
 exports.exportVariable = exportVariable;
 /**
@@ -786,7 +774,7 @@ exports.setSecret = setSecret;
 function addPath(inputPath) {
     const filePath = process.env['GITHUB_PATH'] || '';
     if (filePath) {
-        file_command_1.issueCommand('PATH', inputPath);
+        file_command_1.issueFileCommand('PATH', inputPath);
     }
     else {
         command_1.issueCommand('add-path', {}, inputPath);
@@ -826,7 +814,10 @@ function getMultilineInput(name, options) {
     const inputs = getInput(name, options)
         .split('\n')
         .filter(x => x !== '');
-    return inputs;
+    if (options && options.trimWhitespace === false) {
+        return inputs;
+    }
+    return inputs.map(input => input.trim());
 }
 exports.getMultilineInput = getMultilineInput;
 /**
@@ -859,8 +850,12 @@ exports.getBooleanInput = getBooleanInput;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function setOutput(name, value) {
+    const filePath = process.env['GITHUB_OUTPUT'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));
+    }
     process.stdout.write(os.EOL);
-    command_1.issueCommand('set-output', { name }, value);
+    command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));
 }
 exports.setOutput = setOutput;
 /**
@@ -989,7 +984,11 @@ exports.group = group;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function saveState(name, value) {
-    command_1.issueCommand('save-state', { name }, value);
+    const filePath = process.env['GITHUB_STATE'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));
+    }
+    command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));
 }
 exports.saveState = saveState;
 /**
@@ -1055,13 +1054,14 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.issueCommand = void 0;
+exports.prepareKeyValueMessage = exports.issueFileCommand = void 0;
 // We use any as a valid input type
 /* eslint-disable @typescript-eslint/no-explicit-any */
 const fs = __importStar(__nccwpck_require__(5747));
 const os = __importStar(__nccwpck_require__(2087));
+const uuid_1 = __nccwpck_require__(9521);
 const utils_1 = __nccwpck_require__(5278);
-function issueCommand(command, message) {
+function issueFileCommand(command, message) {
     const filePath = process.env[`GITHUB_${command}`];
     if (!filePath) {
         throw new Error(`Unable to find environment variable for file command ${command}`);
@@ -1073,7 +1073,22 @@ function issueCommand(command, message) {
         encoding: 'utf8'
     });
 }
-exports.issueCommand = issueCommand;
+exports.issueFileCommand = issueFileCommand;
+function prepareKeyValueMessage(key, value) {
+    const delimiter = `ghadelimiter_${uuid_1.v4()}`;
+    const convertedValue = utils_1.toCommandValue(value);
+    // These should realistically never happen, but just in case someone finds a
+    // way to exploit uuid generation let's not allow keys or values that contain
+    // the delimiter.
+    if (key.includes(delimiter)) {
+        throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
+    }
+    if (convertedValue.includes(delimiter)) {
+        throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
+    }
+    return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;
+}
+exports.prepareKeyValueMessage = prepareKeyValueMessage;
 //# sourceMappingURL=file-command.js.map
 
 /***/ }),
@@ -1700,7 +1715,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.getOctokitOptions = exports.GitHub = exports.context = void 0;
+exports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0;
 const Context = __importStar(__nccwpck_require__(4087));
 const Utils = __importStar(__nccwpck_require__(7914));
 // octokit + plugins
@@ -1709,13 +1724,13 @@ const plugin_rest_endpoint_methods_1 = __nccwpck_require__(3044);
 const plugin_paginate_rest_1 = __nccwpck_require__(8945);
 exports.context = new Context.Context();
 const baseUrl = Utils.getApiBaseUrl();
-const defaults = {
+exports.defaults = {
     baseUrl,
     request: {
         agent: Utils.getProxyAgent(baseUrl)
     }
 };
-exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(defaults);
+exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults);
 /**
  * Convience function to correctly format Octokit Options to pass into the constructor.
  *
diff --git a/.github/actions/javascript/isPullRequestMergeable/index.js b/.github/actions/javascript/isPullRequestMergeable/index.js
index 0063c0e29166..682516bbf726 100644
--- a/.github/actions/javascript/isPullRequestMergeable/index.js
+++ b/.github/actions/javascript/isPullRequestMergeable/index.js
@@ -806,7 +806,6 @@ const file_command_1 = __nccwpck_require__(717);
 const utils_1 = __nccwpck_require__(5278);
 const os = __importStar(__nccwpck_require__(2087));
 const path = __importStar(__nccwpck_require__(5622));
-const uuid_1 = __nccwpck_require__(9521);
 const oidc_utils_1 = __nccwpck_require__(8041);
 /**
  * The code to exit an action
@@ -836,20 +835,9 @@ function exportVariable(name, val) {
     process.env[name] = convertedVal;
     const filePath = process.env['GITHUB_ENV'] || '';
     if (filePath) {
-        const delimiter = `ghadelimiter_${uuid_1.v4()}`;
-        // These should realistically never happen, but just in case someone finds a way to exploit uuid generation let's not allow keys or values that contain the delimiter.
-        if (name.includes(delimiter)) {
-            throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
-        }
-        if (convertedVal.includes(delimiter)) {
-            throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
-        }
-        const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;
-        file_command_1.issueCommand('ENV', commandValue);
-    }
-    else {
-        command_1.issueCommand('set-env', { name }, convertedVal);
+        return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));
     }
+    command_1.issueCommand('set-env', { name }, convertedVal);
 }
 exports.exportVariable = exportVariable;
 /**
@@ -867,7 +855,7 @@ exports.setSecret = setSecret;
 function addPath(inputPath) {
     const filePath = process.env['GITHUB_PATH'] || '';
     if (filePath) {
-        file_command_1.issueCommand('PATH', inputPath);
+        file_command_1.issueFileCommand('PATH', inputPath);
     }
     else {
         command_1.issueCommand('add-path', {}, inputPath);
@@ -907,7 +895,10 @@ function getMultilineInput(name, options) {
     const inputs = getInput(name, options)
         .split('\n')
         .filter(x => x !== '');
-    return inputs;
+    if (options && options.trimWhitespace === false) {
+        return inputs;
+    }
+    return inputs.map(input => input.trim());
 }
 exports.getMultilineInput = getMultilineInput;
 /**
@@ -940,8 +931,12 @@ exports.getBooleanInput = getBooleanInput;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function setOutput(name, value) {
+    const filePath = process.env['GITHUB_OUTPUT'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));
+    }
     process.stdout.write(os.EOL);
-    command_1.issueCommand('set-output', { name }, value);
+    command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));
 }
 exports.setOutput = setOutput;
 /**
@@ -1070,7 +1065,11 @@ exports.group = group;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function saveState(name, value) {
-    command_1.issueCommand('save-state', { name }, value);
+    const filePath = process.env['GITHUB_STATE'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));
+    }
+    command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));
 }
 exports.saveState = saveState;
 /**
@@ -1136,13 +1135,14 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.issueCommand = void 0;
+exports.prepareKeyValueMessage = exports.issueFileCommand = void 0;
 // We use any as a valid input type
 /* eslint-disable @typescript-eslint/no-explicit-any */
 const fs = __importStar(__nccwpck_require__(5747));
 const os = __importStar(__nccwpck_require__(2087));
+const uuid_1 = __nccwpck_require__(9521);
 const utils_1 = __nccwpck_require__(5278);
-function issueCommand(command, message) {
+function issueFileCommand(command, message) {
     const filePath = process.env[`GITHUB_${command}`];
     if (!filePath) {
         throw new Error(`Unable to find environment variable for file command ${command}`);
@@ -1154,7 +1154,22 @@ function issueCommand(command, message) {
         encoding: 'utf8'
     });
 }
-exports.issueCommand = issueCommand;
+exports.issueFileCommand = issueFileCommand;
+function prepareKeyValueMessage(key, value) {
+    const delimiter = `ghadelimiter_${uuid_1.v4()}`;
+    const convertedValue = utils_1.toCommandValue(value);
+    // These should realistically never happen, but just in case someone finds a
+    // way to exploit uuid generation let's not allow keys or values that contain
+    // the delimiter.
+    if (key.includes(delimiter)) {
+        throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
+    }
+    if (convertedValue.includes(delimiter)) {
+        throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
+    }
+    return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;
+}
+exports.prepareKeyValueMessage = prepareKeyValueMessage;
 //# sourceMappingURL=file-command.js.map
 
 /***/ }),
@@ -1781,7 +1796,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.getOctokitOptions = exports.GitHub = exports.context = void 0;
+exports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0;
 const Context = __importStar(__nccwpck_require__(4087));
 const Utils = __importStar(__nccwpck_require__(7914));
 // octokit + plugins
@@ -1790,13 +1805,13 @@ const plugin_rest_endpoint_methods_1 = __nccwpck_require__(3044);
 const plugin_paginate_rest_1 = __nccwpck_require__(8945);
 exports.context = new Context.Context();
 const baseUrl = Utils.getApiBaseUrl();
-const defaults = {
+exports.defaults = {
     baseUrl,
     request: {
         agent: Utils.getProxyAgent(baseUrl)
     }
 };
-exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(defaults);
+exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults);
 /**
  * Convience function to correctly format Octokit Options to pass into the constructor.
  *
diff --git a/.github/actions/javascript/isStagingDeployLocked/index.js b/.github/actions/javascript/isStagingDeployLocked/index.js
index 5d48a817d4d7..7c2f2ffe3476 100644
--- a/.github/actions/javascript/isStagingDeployLocked/index.js
+++ b/.github/actions/javascript/isStagingDeployLocked/index.js
@@ -689,7 +689,6 @@ const file_command_1 = __nccwpck_require__(717);
 const utils_1 = __nccwpck_require__(5278);
 const os = __importStar(__nccwpck_require__(2087));
 const path = __importStar(__nccwpck_require__(5622));
-const uuid_1 = __nccwpck_require__(9521);
 const oidc_utils_1 = __nccwpck_require__(8041);
 /**
  * The code to exit an action
@@ -719,20 +718,9 @@ function exportVariable(name, val) {
     process.env[name] = convertedVal;
     const filePath = process.env['GITHUB_ENV'] || '';
     if (filePath) {
-        const delimiter = `ghadelimiter_${uuid_1.v4()}`;
-        // These should realistically never happen, but just in case someone finds a way to exploit uuid generation let's not allow keys or values that contain the delimiter.
-        if (name.includes(delimiter)) {
-            throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
-        }
-        if (convertedVal.includes(delimiter)) {
-            throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
-        }
-        const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;
-        file_command_1.issueCommand('ENV', commandValue);
-    }
-    else {
-        command_1.issueCommand('set-env', { name }, convertedVal);
+        return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));
     }
+    command_1.issueCommand('set-env', { name }, convertedVal);
 }
 exports.exportVariable = exportVariable;
 /**
@@ -750,7 +738,7 @@ exports.setSecret = setSecret;
 function addPath(inputPath) {
     const filePath = process.env['GITHUB_PATH'] || '';
     if (filePath) {
-        file_command_1.issueCommand('PATH', inputPath);
+        file_command_1.issueFileCommand('PATH', inputPath);
     }
     else {
         command_1.issueCommand('add-path', {}, inputPath);
@@ -790,7 +778,10 @@ function getMultilineInput(name, options) {
     const inputs = getInput(name, options)
         .split('\n')
         .filter(x => x !== '');
-    return inputs;
+    if (options && options.trimWhitespace === false) {
+        return inputs;
+    }
+    return inputs.map(input => input.trim());
 }
 exports.getMultilineInput = getMultilineInput;
 /**
@@ -823,8 +814,12 @@ exports.getBooleanInput = getBooleanInput;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function setOutput(name, value) {
+    const filePath = process.env['GITHUB_OUTPUT'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));
+    }
     process.stdout.write(os.EOL);
-    command_1.issueCommand('set-output', { name }, value);
+    command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));
 }
 exports.setOutput = setOutput;
 /**
@@ -953,7 +948,11 @@ exports.group = group;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function saveState(name, value) {
-    command_1.issueCommand('save-state', { name }, value);
+    const filePath = process.env['GITHUB_STATE'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));
+    }
+    command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));
 }
 exports.saveState = saveState;
 /**
@@ -1019,13 +1018,14 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.issueCommand = void 0;
+exports.prepareKeyValueMessage = exports.issueFileCommand = void 0;
 // We use any as a valid input type
 /* eslint-disable @typescript-eslint/no-explicit-any */
 const fs = __importStar(__nccwpck_require__(5747));
 const os = __importStar(__nccwpck_require__(2087));
+const uuid_1 = __nccwpck_require__(9521);
 const utils_1 = __nccwpck_require__(5278);
-function issueCommand(command, message) {
+function issueFileCommand(command, message) {
     const filePath = process.env[`GITHUB_${command}`];
     if (!filePath) {
         throw new Error(`Unable to find environment variable for file command ${command}`);
@@ -1037,7 +1037,22 @@ function issueCommand(command, message) {
         encoding: 'utf8'
     });
 }
-exports.issueCommand = issueCommand;
+exports.issueFileCommand = issueFileCommand;
+function prepareKeyValueMessage(key, value) {
+    const delimiter = `ghadelimiter_${uuid_1.v4()}`;
+    const convertedValue = utils_1.toCommandValue(value);
+    // These should realistically never happen, but just in case someone finds a
+    // way to exploit uuid generation let's not allow keys or values that contain
+    // the delimiter.
+    if (key.includes(delimiter)) {
+        throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
+    }
+    if (convertedValue.includes(delimiter)) {
+        throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
+    }
+    return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;
+}
+exports.prepareKeyValueMessage = prepareKeyValueMessage;
 //# sourceMappingURL=file-command.js.map
 
 /***/ }),
@@ -1664,7 +1679,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.getOctokitOptions = exports.GitHub = exports.context = void 0;
+exports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0;
 const Context = __importStar(__nccwpck_require__(4087));
 const Utils = __importStar(__nccwpck_require__(7914));
 // octokit + plugins
@@ -1673,13 +1688,13 @@ const plugin_rest_endpoint_methods_1 = __nccwpck_require__(3044);
 const plugin_paginate_rest_1 = __nccwpck_require__(8945);
 exports.context = new Context.Context();
 const baseUrl = Utils.getApiBaseUrl();
-const defaults = {
+exports.defaults = {
     baseUrl,
     request: {
         agent: Utils.getProxyAgent(baseUrl)
     }
 };
-exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(defaults);
+exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults);
 /**
  * Convience function to correctly format Octokit Options to pass into the constructor.
  *
diff --git a/.github/actions/javascript/markPullRequestsAsDeployed/index.js b/.github/actions/javascript/markPullRequestsAsDeployed/index.js
index 9b5bf1bb74c9..ca1c88ed8f21 100644
--- a/.github/actions/javascript/markPullRequestsAsDeployed/index.js
+++ b/.github/actions/javascript/markPullRequestsAsDeployed/index.js
@@ -858,7 +858,6 @@ const file_command_1 = __nccwpck_require__(717);
 const utils_1 = __nccwpck_require__(5278);
 const os = __importStar(__nccwpck_require__(2087));
 const path = __importStar(__nccwpck_require__(5622));
-const uuid_1 = __nccwpck_require__(9521);
 const oidc_utils_1 = __nccwpck_require__(8041);
 /**
  * The code to exit an action
@@ -888,20 +887,9 @@ function exportVariable(name, val) {
     process.env[name] = convertedVal;
     const filePath = process.env['GITHUB_ENV'] || '';
     if (filePath) {
-        const delimiter = `ghadelimiter_${uuid_1.v4()}`;
-        // These should realistically never happen, but just in case someone finds a way to exploit uuid generation let's not allow keys or values that contain the delimiter.
-        if (name.includes(delimiter)) {
-            throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
-        }
-        if (convertedVal.includes(delimiter)) {
-            throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
-        }
-        const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;
-        file_command_1.issueCommand('ENV', commandValue);
-    }
-    else {
-        command_1.issueCommand('set-env', { name }, convertedVal);
+        return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));
     }
+    command_1.issueCommand('set-env', { name }, convertedVal);
 }
 exports.exportVariable = exportVariable;
 /**
@@ -919,7 +907,7 @@ exports.setSecret = setSecret;
 function addPath(inputPath) {
     const filePath = process.env['GITHUB_PATH'] || '';
     if (filePath) {
-        file_command_1.issueCommand('PATH', inputPath);
+        file_command_1.issueFileCommand('PATH', inputPath);
     }
     else {
         command_1.issueCommand('add-path', {}, inputPath);
@@ -959,7 +947,10 @@ function getMultilineInput(name, options) {
     const inputs = getInput(name, options)
         .split('\n')
         .filter(x => x !== '');
-    return inputs;
+    if (options && options.trimWhitespace === false) {
+        return inputs;
+    }
+    return inputs.map(input => input.trim());
 }
 exports.getMultilineInput = getMultilineInput;
 /**
@@ -992,8 +983,12 @@ exports.getBooleanInput = getBooleanInput;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function setOutput(name, value) {
+    const filePath = process.env['GITHUB_OUTPUT'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));
+    }
     process.stdout.write(os.EOL);
-    command_1.issueCommand('set-output', { name }, value);
+    command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));
 }
 exports.setOutput = setOutput;
 /**
@@ -1122,7 +1117,11 @@ exports.group = group;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function saveState(name, value) {
-    command_1.issueCommand('save-state', { name }, value);
+    const filePath = process.env['GITHUB_STATE'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));
+    }
+    command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));
 }
 exports.saveState = saveState;
 /**
@@ -1188,13 +1187,14 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.issueCommand = void 0;
+exports.prepareKeyValueMessage = exports.issueFileCommand = void 0;
 // We use any as a valid input type
 /* eslint-disable @typescript-eslint/no-explicit-any */
 const fs = __importStar(__nccwpck_require__(5747));
 const os = __importStar(__nccwpck_require__(2087));
+const uuid_1 = __nccwpck_require__(9521);
 const utils_1 = __nccwpck_require__(5278);
-function issueCommand(command, message) {
+function issueFileCommand(command, message) {
     const filePath = process.env[`GITHUB_${command}`];
     if (!filePath) {
         throw new Error(`Unable to find environment variable for file command ${command}`);
@@ -1206,7 +1206,22 @@ function issueCommand(command, message) {
         encoding: 'utf8'
     });
 }
-exports.issueCommand = issueCommand;
+exports.issueFileCommand = issueFileCommand;
+function prepareKeyValueMessage(key, value) {
+    const delimiter = `ghadelimiter_${uuid_1.v4()}`;
+    const convertedValue = utils_1.toCommandValue(value);
+    // These should realistically never happen, but just in case someone finds a
+    // way to exploit uuid generation let's not allow keys or values that contain
+    // the delimiter.
+    if (key.includes(delimiter)) {
+        throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
+    }
+    if (convertedValue.includes(delimiter)) {
+        throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
+    }
+    return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;
+}
+exports.prepareKeyValueMessage = prepareKeyValueMessage;
 //# sourceMappingURL=file-command.js.map
 
 /***/ }),
@@ -1793,8 +1808,9 @@ exports.context = new Context.Context();
  * @param     token    the repo PAT or GITHUB_TOKEN
  * @param     options  other options to set
  */
-function getOctokit(token, options) {
-    return new utils_1.GitHub(utils_1.getOctokitOptions(token, options));
+function getOctokit(token, options, ...additionalPlugins) {
+    const GitHubWithPlugins = utils_1.GitHub.plugin(...additionalPlugins);
+    return new GitHubWithPlugins(utils_1.getOctokitOptions(token, options));
 }
 exports.getOctokit = getOctokit;
 //# sourceMappingURL=github.js.map
@@ -1876,7 +1892,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.getOctokitOptions = exports.GitHub = exports.context = void 0;
+exports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0;
 const Context = __importStar(__nccwpck_require__(4087));
 const Utils = __importStar(__nccwpck_require__(7914));
 // octokit + plugins
@@ -1885,13 +1901,13 @@ const plugin_rest_endpoint_methods_1 = __nccwpck_require__(3044);
 const plugin_paginate_rest_1 = __nccwpck_require__(8945);
 exports.context = new Context.Context();
 const baseUrl = Utils.getApiBaseUrl();
-const defaults = {
+exports.defaults = {
     baseUrl,
     request: {
         agent: Utils.getProxyAgent(baseUrl)
     }
 };
-exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(defaults);
+exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults);
 /**
  * Convience function to correctly format Octokit Options to pass into the constructor.
  *
diff --git a/.github/actions/javascript/reopenIssueWithComment/index.js b/.github/actions/javascript/reopenIssueWithComment/index.js
index 8a20d9a5b37b..0a457834e098 100644
--- a/.github/actions/javascript/reopenIssueWithComment/index.js
+++ b/.github/actions/javascript/reopenIssueWithComment/index.js
@@ -700,7 +700,6 @@ const file_command_1 = __nccwpck_require__(717);
 const utils_1 = __nccwpck_require__(5278);
 const os = __importStar(__nccwpck_require__(2087));
 const path = __importStar(__nccwpck_require__(5622));
-const uuid_1 = __nccwpck_require__(9521);
 const oidc_utils_1 = __nccwpck_require__(8041);
 /**
  * The code to exit an action
@@ -730,20 +729,9 @@ function exportVariable(name, val) {
     process.env[name] = convertedVal;
     const filePath = process.env['GITHUB_ENV'] || '';
     if (filePath) {
-        const delimiter = `ghadelimiter_${uuid_1.v4()}`;
-        // These should realistically never happen, but just in case someone finds a way to exploit uuid generation let's not allow keys or values that contain the delimiter.
-        if (name.includes(delimiter)) {
-            throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
-        }
-        if (convertedVal.includes(delimiter)) {
-            throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
-        }
-        const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;
-        file_command_1.issueCommand('ENV', commandValue);
-    }
-    else {
-        command_1.issueCommand('set-env', { name }, convertedVal);
+        return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));
     }
+    command_1.issueCommand('set-env', { name }, convertedVal);
 }
 exports.exportVariable = exportVariable;
 /**
@@ -761,7 +749,7 @@ exports.setSecret = setSecret;
 function addPath(inputPath) {
     const filePath = process.env['GITHUB_PATH'] || '';
     if (filePath) {
-        file_command_1.issueCommand('PATH', inputPath);
+        file_command_1.issueFileCommand('PATH', inputPath);
     }
     else {
         command_1.issueCommand('add-path', {}, inputPath);
@@ -801,7 +789,10 @@ function getMultilineInput(name, options) {
     const inputs = getInput(name, options)
         .split('\n')
         .filter(x => x !== '');
-    return inputs;
+    if (options && options.trimWhitespace === false) {
+        return inputs;
+    }
+    return inputs.map(input => input.trim());
 }
 exports.getMultilineInput = getMultilineInput;
 /**
@@ -834,8 +825,12 @@ exports.getBooleanInput = getBooleanInput;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function setOutput(name, value) {
+    const filePath = process.env['GITHUB_OUTPUT'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));
+    }
     process.stdout.write(os.EOL);
-    command_1.issueCommand('set-output', { name }, value);
+    command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));
 }
 exports.setOutput = setOutput;
 /**
@@ -964,7 +959,11 @@ exports.group = group;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function saveState(name, value) {
-    command_1.issueCommand('save-state', { name }, value);
+    const filePath = process.env['GITHUB_STATE'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));
+    }
+    command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));
 }
 exports.saveState = saveState;
 /**
@@ -1030,13 +1029,14 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.issueCommand = void 0;
+exports.prepareKeyValueMessage = exports.issueFileCommand = void 0;
 // We use any as a valid input type
 /* eslint-disable @typescript-eslint/no-explicit-any */
 const fs = __importStar(__nccwpck_require__(5747));
 const os = __importStar(__nccwpck_require__(2087));
+const uuid_1 = __nccwpck_require__(9521);
 const utils_1 = __nccwpck_require__(5278);
-function issueCommand(command, message) {
+function issueFileCommand(command, message) {
     const filePath = process.env[`GITHUB_${command}`];
     if (!filePath) {
         throw new Error(`Unable to find environment variable for file command ${command}`);
@@ -1048,7 +1048,22 @@ function issueCommand(command, message) {
         encoding: 'utf8'
     });
 }
-exports.issueCommand = issueCommand;
+exports.issueFileCommand = issueFileCommand;
+function prepareKeyValueMessage(key, value) {
+    const delimiter = `ghadelimiter_${uuid_1.v4()}`;
+    const convertedValue = utils_1.toCommandValue(value);
+    // These should realistically never happen, but just in case someone finds a
+    // way to exploit uuid generation let's not allow keys or values that contain
+    // the delimiter.
+    if (key.includes(delimiter)) {
+        throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
+    }
+    if (convertedValue.includes(delimiter)) {
+        throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
+    }
+    return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;
+}
+exports.prepareKeyValueMessage = prepareKeyValueMessage;
 //# sourceMappingURL=file-command.js.map
 
 /***/ }),
@@ -1675,7 +1690,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.getOctokitOptions = exports.GitHub = exports.context = void 0;
+exports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0;
 const Context = __importStar(__nccwpck_require__(4087));
 const Utils = __importStar(__nccwpck_require__(7914));
 // octokit + plugins
@@ -1684,13 +1699,13 @@ const plugin_rest_endpoint_methods_1 = __nccwpck_require__(3044);
 const plugin_paginate_rest_1 = __nccwpck_require__(8945);
 exports.context = new Context.Context();
 const baseUrl = Utils.getApiBaseUrl();
-const defaults = {
+exports.defaults = {
     baseUrl,
     request: {
         agent: Utils.getProxyAgent(baseUrl)
     }
 };
-exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(defaults);
+exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults);
 /**
  * Convience function to correctly format Octokit Options to pass into the constructor.
  *
diff --git a/.github/actions/javascript/triggerWorkflowAndWait/index.js b/.github/actions/javascript/triggerWorkflowAndWait/index.js
index 29184c7dd5da..1895468a595c 100644
--- a/.github/actions/javascript/triggerWorkflowAndWait/index.js
+++ b/.github/actions/javascript/triggerWorkflowAndWait/index.js
@@ -918,7 +918,6 @@ const file_command_1 = __nccwpck_require__(717);
 const utils_1 = __nccwpck_require__(5278);
 const os = __importStar(__nccwpck_require__(2087));
 const path = __importStar(__nccwpck_require__(5622));
-const uuid_1 = __nccwpck_require__(9521);
 const oidc_utils_1 = __nccwpck_require__(8041);
 /**
  * The code to exit an action
@@ -948,20 +947,9 @@ function exportVariable(name, val) {
     process.env[name] = convertedVal;
     const filePath = process.env['GITHUB_ENV'] || '';
     if (filePath) {
-        const delimiter = `ghadelimiter_${uuid_1.v4()}`;
-        // These should realistically never happen, but just in case someone finds a way to exploit uuid generation let's not allow keys or values that contain the delimiter.
-        if (name.includes(delimiter)) {
-            throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
-        }
-        if (convertedVal.includes(delimiter)) {
-            throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
-        }
-        const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;
-        file_command_1.issueCommand('ENV', commandValue);
-    }
-    else {
-        command_1.issueCommand('set-env', { name }, convertedVal);
+        return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));
     }
+    command_1.issueCommand('set-env', { name }, convertedVal);
 }
 exports.exportVariable = exportVariable;
 /**
@@ -979,7 +967,7 @@ exports.setSecret = setSecret;
 function addPath(inputPath) {
     const filePath = process.env['GITHUB_PATH'] || '';
     if (filePath) {
-        file_command_1.issueCommand('PATH', inputPath);
+        file_command_1.issueFileCommand('PATH', inputPath);
     }
     else {
         command_1.issueCommand('add-path', {}, inputPath);
@@ -1019,7 +1007,10 @@ function getMultilineInput(name, options) {
     const inputs = getInput(name, options)
         .split('\n')
         .filter(x => x !== '');
-    return inputs;
+    if (options && options.trimWhitespace === false) {
+        return inputs;
+    }
+    return inputs.map(input => input.trim());
 }
 exports.getMultilineInput = getMultilineInput;
 /**
@@ -1052,8 +1043,12 @@ exports.getBooleanInput = getBooleanInput;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function setOutput(name, value) {
+    const filePath = process.env['GITHUB_OUTPUT'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));
+    }
     process.stdout.write(os.EOL);
-    command_1.issueCommand('set-output', { name }, value);
+    command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));
 }
 exports.setOutput = setOutput;
 /**
@@ -1182,7 +1177,11 @@ exports.group = group;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function saveState(name, value) {
-    command_1.issueCommand('save-state', { name }, value);
+    const filePath = process.env['GITHUB_STATE'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));
+    }
+    command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));
 }
 exports.saveState = saveState;
 /**
@@ -1248,13 +1247,14 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.issueCommand = void 0;
+exports.prepareKeyValueMessage = exports.issueFileCommand = void 0;
 // We use any as a valid input type
 /* eslint-disable @typescript-eslint/no-explicit-any */
 const fs = __importStar(__nccwpck_require__(5747));
 const os = __importStar(__nccwpck_require__(2087));
+const uuid_1 = __nccwpck_require__(9521);
 const utils_1 = __nccwpck_require__(5278);
-function issueCommand(command, message) {
+function issueFileCommand(command, message) {
     const filePath = process.env[`GITHUB_${command}`];
     if (!filePath) {
         throw new Error(`Unable to find environment variable for file command ${command}`);
@@ -1266,7 +1266,22 @@ function issueCommand(command, message) {
         encoding: 'utf8'
     });
 }
-exports.issueCommand = issueCommand;
+exports.issueFileCommand = issueFileCommand;
+function prepareKeyValueMessage(key, value) {
+    const delimiter = `ghadelimiter_${uuid_1.v4()}`;
+    const convertedValue = utils_1.toCommandValue(value);
+    // These should realistically never happen, but just in case someone finds a
+    // way to exploit uuid generation let's not allow keys or values that contain
+    // the delimiter.
+    if (key.includes(delimiter)) {
+        throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
+    }
+    if (convertedValue.includes(delimiter)) {
+        throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
+    }
+    return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;
+}
+exports.prepareKeyValueMessage = prepareKeyValueMessage;
 //# sourceMappingURL=file-command.js.map
 
 /***/ }),
@@ -1893,7 +1908,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.getOctokitOptions = exports.GitHub = exports.context = void 0;
+exports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0;
 const Context = __importStar(__nccwpck_require__(4087));
 const Utils = __importStar(__nccwpck_require__(7914));
 // octokit + plugins
@@ -1902,13 +1917,13 @@ const plugin_rest_endpoint_methods_1 = __nccwpck_require__(3044);
 const plugin_paginate_rest_1 = __nccwpck_require__(8945);
 exports.context = new Context.Context();
 const baseUrl = Utils.getApiBaseUrl();
-const defaults = {
+exports.defaults = {
     baseUrl,
     request: {
         agent: Utils.getProxyAgent(baseUrl)
     }
 };
-exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(defaults);
+exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults);
 /**
  * Convience function to correctly format Octokit Options to pass into the constructor.
  *
diff --git a/.github/actions/javascript/verifySignedCommits/index.js b/.github/actions/javascript/verifySignedCommits/index.js
index 959adb1373d4..062cc94e4298 100644
--- a/.github/actions/javascript/verifySignedCommits/index.js
+++ b/.github/actions/javascript/verifySignedCommits/index.js
@@ -689,7 +689,6 @@ const file_command_1 = __nccwpck_require__(717);
 const utils_1 = __nccwpck_require__(5278);
 const os = __importStar(__nccwpck_require__(2087));
 const path = __importStar(__nccwpck_require__(5622));
-const uuid_1 = __nccwpck_require__(9521);
 const oidc_utils_1 = __nccwpck_require__(8041);
 /**
  * The code to exit an action
@@ -719,20 +718,9 @@ function exportVariable(name, val) {
     process.env[name] = convertedVal;
     const filePath = process.env['GITHUB_ENV'] || '';
     if (filePath) {
-        const delimiter = `ghadelimiter_${uuid_1.v4()}`;
-        // These should realistically never happen, but just in case someone finds a way to exploit uuid generation let's not allow keys or values that contain the delimiter.
-        if (name.includes(delimiter)) {
-            throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
-        }
-        if (convertedVal.includes(delimiter)) {
-            throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
-        }
-        const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;
-        file_command_1.issueCommand('ENV', commandValue);
-    }
-    else {
-        command_1.issueCommand('set-env', { name }, convertedVal);
+        return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));
     }
+    command_1.issueCommand('set-env', { name }, convertedVal);
 }
 exports.exportVariable = exportVariable;
 /**
@@ -750,7 +738,7 @@ exports.setSecret = setSecret;
 function addPath(inputPath) {
     const filePath = process.env['GITHUB_PATH'] || '';
     if (filePath) {
-        file_command_1.issueCommand('PATH', inputPath);
+        file_command_1.issueFileCommand('PATH', inputPath);
     }
     else {
         command_1.issueCommand('add-path', {}, inputPath);
@@ -790,7 +778,10 @@ function getMultilineInput(name, options) {
     const inputs = getInput(name, options)
         .split('\n')
         .filter(x => x !== '');
-    return inputs;
+    if (options && options.trimWhitespace === false) {
+        return inputs;
+    }
+    return inputs.map(input => input.trim());
 }
 exports.getMultilineInput = getMultilineInput;
 /**
@@ -823,8 +814,12 @@ exports.getBooleanInput = getBooleanInput;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function setOutput(name, value) {
+    const filePath = process.env['GITHUB_OUTPUT'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));
+    }
     process.stdout.write(os.EOL);
-    command_1.issueCommand('set-output', { name }, value);
+    command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));
 }
 exports.setOutput = setOutput;
 /**
@@ -953,7 +948,11 @@ exports.group = group;
  */
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function saveState(name, value) {
-    command_1.issueCommand('save-state', { name }, value);
+    const filePath = process.env['GITHUB_STATE'] || '';
+    if (filePath) {
+        return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));
+    }
+    command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));
 }
 exports.saveState = saveState;
 /**
@@ -1019,13 +1018,14 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.issueCommand = void 0;
+exports.prepareKeyValueMessage = exports.issueFileCommand = void 0;
 // We use any as a valid input type
 /* eslint-disable @typescript-eslint/no-explicit-any */
 const fs = __importStar(__nccwpck_require__(5747));
 const os = __importStar(__nccwpck_require__(2087));
+const uuid_1 = __nccwpck_require__(9521);
 const utils_1 = __nccwpck_require__(5278);
-function issueCommand(command, message) {
+function issueFileCommand(command, message) {
     const filePath = process.env[`GITHUB_${command}`];
     if (!filePath) {
         throw new Error(`Unable to find environment variable for file command ${command}`);
@@ -1037,7 +1037,22 @@ function issueCommand(command, message) {
         encoding: 'utf8'
     });
 }
-exports.issueCommand = issueCommand;
+exports.issueFileCommand = issueFileCommand;
+function prepareKeyValueMessage(key, value) {
+    const delimiter = `ghadelimiter_${uuid_1.v4()}`;
+    const convertedValue = utils_1.toCommandValue(value);
+    // These should realistically never happen, but just in case someone finds a
+    // way to exploit uuid generation let's not allow keys or values that contain
+    // the delimiter.
+    if (key.includes(delimiter)) {
+        throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
+    }
+    if (convertedValue.includes(delimiter)) {
+        throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
+    }
+    return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;
+}
+exports.prepareKeyValueMessage = prepareKeyValueMessage;
 //# sourceMappingURL=file-command.js.map
 
 /***/ }),
@@ -1624,8 +1639,9 @@ exports.context = new Context.Context();
  * @param     token    the repo PAT or GITHUB_TOKEN
  * @param     options  other options to set
  */
-function getOctokit(token, options) {
-    return new utils_1.GitHub(utils_1.getOctokitOptions(token, options));
+function getOctokit(token, options, ...additionalPlugins) {
+    const GitHubWithPlugins = utils_1.GitHub.plugin(...additionalPlugins);
+    return new GitHubWithPlugins(utils_1.getOctokitOptions(token, options));
 }
 exports.getOctokit = getOctokit;
 //# sourceMappingURL=github.js.map
@@ -1707,7 +1723,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.getOctokitOptions = exports.GitHub = exports.context = void 0;
+exports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0;
 const Context = __importStar(__nccwpck_require__(4087));
 const Utils = __importStar(__nccwpck_require__(7914));
 // octokit + plugins
@@ -1716,13 +1732,13 @@ const plugin_rest_endpoint_methods_1 = __nccwpck_require__(3044);
 const plugin_paginate_rest_1 = __nccwpck_require__(8945);
 exports.context = new Context.Context();
 const baseUrl = Utils.getApiBaseUrl();
-const defaults = {
+exports.defaults = {
     baseUrl,
     request: {
         agent: Utils.getProxyAgent(baseUrl)
     }
 };
-exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(defaults);
+exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults);
 /**
  * Convience function to correctly format Octokit Options to pass into the constructor.
  *
diff --git a/.github/workflows/cherryPick.yml b/.github/workflows/cherryPick.yml
index b0945f4e0920..baaa8015eefd 100644
--- a/.github/workflows/cherryPick.yml
+++ b/.github/workflows/cherryPick.yml
@@ -37,7 +37,7 @@ jobs:
     steps:
       # Version: 2.3.4
       - name: Checkout staging branch
-        uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f
+        uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
         with:
           ref: staging
           token: ${{ secrets.OS_BOTIFY_TOKEN }}
@@ -90,13 +90,13 @@ jobs:
           echo "Attempting to cherry-pick ${{ steps.getCPMergeCommit.outputs.MERGE_COMMIT_SHA }}"
           if git cherry-pick -S -x --mainline 1 ${{ steps.getCPMergeCommit.outputs.MERGE_COMMIT_SHA }}; then
             echo "🎉 No conflicts! CP was a success, PR can be automerged 🎉"
-            echo "::set-output name=SHOULD_AUTOMERGE::true"
+            echo "SHOULD_AUTOMERGE=true" >> "$GITHUB_OUTPUT"
           else
             echo "😞 PR can't be automerged, there are merge conflicts in the following files:"
             git --no-pager diff --name-only --diff-filter=U
             git add .
             GIT_MERGE_AUTOEDIT=no git cherry-pick --continue
-            echo "::set-output name=SHOULD_AUTOMERGE::false"
+            echo "SHOULD_AUTOMERGE=false" >> "$GITHUB_OUTPUT"
           fi
 
       - name: Push changes to CP branch
@@ -111,7 +111,7 @@ jobs:
             --label "automerge" \
             --base "staging"
           sleep 5
-          echo "::set-output name=PR_NUMBER::$(gh pr view --json 'number' --jq '.number')"
+          echo "PR_NUMBER=$(gh pr view --json 'number' --jq '.number')" >> "$GITHUB_OUTPUT"
         env:
           GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }}
 
diff --git a/.github/workflows/createNewVersion.yml b/.github/workflows/createNewVersion.yml
index 5c31a0bb125c..bff08e73a313 100644
--- a/.github/workflows/createNewVersion.yml
+++ b/.github/workflows/createNewVersion.yml
@@ -33,7 +33,7 @@ jobs:
     steps:
       - name: Get user permissions
         id: getUserPermissions
-        run: echo "::set-output name=PERMISSION::$(gh api /repos/${{ github.repository }}/collaborators/${{ github.actor }}/permission | jq -r '.permission')"
+        run: echo "PERMISSION=$(gh api /repos/${{ github.repository }}/collaborators/${{ github.actor }}/permission | jq -r '.permission')" >> "$GITHUB_OUTPUT"
         env:
           GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }}
 
@@ -47,7 +47,7 @@ jobs:
 
     steps:
       # Version: 3.0.2
-      - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
+      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
         with:
           fetch-depth: 0
 
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index a370083d2a86..606393ca5c12 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -20,7 +20,7 @@ jobs:
 
       - name: Check if merged pull request was an automatic version bump PR
         id: isAutomatedPullRequest
-        run: echo "::set-output name=IS_AUTOMERGE_PR::${{ steps.getMergedPullRequest.outputs.author == 'OSBotify' }}"
+        run: echo "IS_AUTOMERGE_PR=${{ steps.getMergedPullRequest.outputs.author == 'OSBotify' }}" >> "$GITHUB_OUTPUT"
 
   deployStaging:
     runs-on: ubuntu-latest
@@ -29,7 +29,7 @@ jobs:
 
     steps:
       - name: Checkout staging branch
-        uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f
+        uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
         with:
           ref: staging
           token: ${{ secrets.OS_BOTIFY_TOKEN }}
@@ -50,7 +50,7 @@ jobs:
     if: ${{ fromJSON(needs.validate.outputs.isAutomatedPullRequest) && github.ref == 'refs/heads/production' }}
 
     steps:
-      - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f
+      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
         with:
           fetch-depth: 0
           token: ${{ secrets.OS_BOTIFY_TOKEN }}
diff --git a/.github/workflows/deployBlocker.yml b/.github/workflows/deployBlocker.yml
index b074b271a883..30e937722596 100644
--- a/.github/workflows/deployBlocker.yml
+++ b/.github/workflows/deployBlocker.yml
@@ -11,7 +11,7 @@ jobs:
     if: ${{ github.event.label.name == 'DeployBlockerCash' }}
 
     steps:
-      - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f
+      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
         with:
           fetch-depth: 0
           token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/e2ePerformanceRegressionTests.yml b/.github/workflows/e2ePerformanceRegressionTests.yml
index 6b3b0edf537c..a59eb8c0dbff 100644
--- a/.github/workflows/e2ePerformanceRegressionTests.yml
+++ b/.github/workflows/e2ePerformanceRegressionTests.yml
@@ -9,11 +9,11 @@ jobs:
     if: ${{ github.event.label.name == 'e2e' }}
     name: "Run e2e performance regression tests"
     # Although the tests will run on an android emulator, using macOS as its more performant
-    runs-on: macos-11
+    runs-on: macos-12
     steps:
       - uses: Expensify/App/.github/actions/composite/setupNode@main
 
-      - uses: ruby/setup-ruby@08245253a76fa4d1e459b7809579c62bd9eb718a
+      - uses: ruby/setup-ruby@eae47962baca661befdfd24e4d6c34ade04858f7
         with:
           ruby-version: '2.7'
           bundler-cache: true
diff --git a/.github/workflows/lockDeploys.yml b/.github/workflows/lockDeploys.yml
index f1365223eaf8..38764561ed59 100644
--- a/.github/workflows/lockDeploys.yml
+++ b/.github/workflows/lockDeploys.yml
@@ -7,10 +7,10 @@ on:
 jobs:
   lockStagingDeploys:
     if: ${{ github.event.label.name == '🔐 LockCashDeploys 🔐' && contains(github.event.issue.labels.*.name, 'StagingDeployCash') && github.actor != 'OSBotify' }}
-    runs-on: macos-11
+    runs-on: macos-12
     steps:
       # Version: 2.3.4
-      - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f
+      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
         with:
           ref: main
           fetch-depth: 0
diff --git a/.github/workflows/platformDeploy.yml b/.github/workflows/platformDeploy.yml
index 20608c66a0b6..a57dc69e3554 100644
--- a/.github/workflows/platformDeploy.yml
+++ b/.github/workflows/platformDeploy.yml
@@ -10,7 +10,7 @@ on:
 
 env:
   SHOULD_DEPLOY_PRODUCTION: ${{ github.event_name == 'release' }}
-  DEVELOPER_DIR: /Applications/Xcode_13.2.1.app/Contents/Developer
+  DEVELOPER_DIR: /Applications/Xcode_14.0.1.app/Contents/Developer
 
 jobs:
   validateActor:
@@ -33,7 +33,7 @@ jobs:
     steps:
       - uses: Expensify/App/.github/actions/composite/setupNode@main
 
-      - uses: ruby/setup-ruby@08245253a76fa4d1e459b7809579c62bd9eb718a
+      - uses: ruby/setup-ruby@eae47962baca661befdfd24e4d6c34ade04858f7
         with:
           ruby-version: '2.7'
           bundler-cache: true
@@ -93,7 +93,7 @@ jobs:
     name: Build and deploy Desktop
     needs: validateActor
     if: ${{ fromJSON(needs.validateActor.outputs.IS_DEPLOYER) }}
-    runs-on: macos-11
+    runs-on: macos-12
     steps:
       - uses: Expensify/App/.github/actions/composite/setupNode@main
 
@@ -128,11 +128,11 @@ jobs:
     name: Build and deploy iOS
     needs: validateActor
     if: ${{ fromJSON(needs.validateActor.outputs.IS_DEPLOYER) }}
-    runs-on: macos-11
+    runs-on: macos-12
     steps:
       - uses: Expensify/App/.github/actions/composite/setupNode@main
 
-      - uses: ruby/setup-ruby@08245253a76fa4d1e459b7809579c62bd9eb718a
+      - uses: ruby/setup-ruby@eae47962baca661befdfd24e4d6c34ade04858f7
         with:
           ruby-version: '2.7'
           bundler-cache: true
@@ -269,7 +269,7 @@ jobs:
     if: ${{ success() }}
     needs: [android, desktop, iOS, web]
     steps:
-      - uses: actions/checkout@v2
+      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
 
       - name: Set version
         run: echo "VERSION=$(npm run print-version --silent)" >> "$GITHUB_ENV"
diff --git a/.github/workflows/preDeploy.yml b/.github/workflows/preDeploy.yml
index b3bdd40c703d..521889fdd636 100644
--- a/.github/workflows/preDeploy.yml
+++ b/.github/workflows/preDeploy.yml
@@ -49,15 +49,15 @@ jobs:
 
       - name: Check if merged pull request was an automated PR
         id: isAutomatedPullRequest
-        run: echo "::set-output name=IS_AUTOMATED_PR::${{ github.actor == 'OSBotify' }}"
+        run: echo "IS_AUTOMATED_PR=${{ github.actor == 'OSBotify' }}" >> "$GITHUB_OUTPUT"
 
       - name: Check if merged pull request has `CP Staging` label
         id: hasCherryPickLabel
-        run: echo "::set-output name=HAS_CP_LABEL::${{ contains(steps.getMergedPullRequest.outputs.labels, 'CP Staging') }}"
+        run: echo "HAS_CP_LABEL=${{ contains(steps.getMergedPullRequest.outputs.labels, 'CP Staging') }}" >> "$GITHUB_OUTPUT"
 
       - name: Check if merged pull request should trigger a deploy
         id: shouldDeploy
-        run: echo "::set-output name=SHOULD_DEPLOY::${{ fromJSON(steps.hasCherryPickLabel.outputs.HAS_CP_LABEL) || (!fromJSON(steps.isStagingDeployLocked.outputs.IS_LOCKED) && !fromJSON(steps.isAutomatedPullRequest.outputs.IS_AUTOMATED_PR)) }}"
+        run: echo "SHOULD_DEPLOY=${{ fromJSON(steps.hasCherryPickLabel.outputs.HAS_CP_LABEL) || (!fromJSON(steps.isStagingDeployLocked.outputs.IS_LOCKED) && !fromJSON(steps.isAutomatedPullRequest.outputs.IS_AUTOMATED_PR)) }}" >> "$GITHUB_OUTPUT"
 
   skipDeploy:
     runs-on: ubuntu-latest
@@ -105,7 +105,7 @@ jobs:
           INPUTS: '{ "PULL_REQUEST_NUMBER": "${{ needs.chooseDeployActions.outputs.MERGED_PR }}", "NEW_VERSION": "${{ needs.createNewVersion.outputs.NEW_VERSION }}" }'
 
       # Version: 3.0.2
-      - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
+      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
         with:
           ref: staging
           fetch-depth: 0
@@ -125,7 +125,7 @@ jobs:
 
       - name: Find open StagingDeployCash
         id: getStagingDeployCash
-        run: echo "::set-output name=STAGING_DEPLOY_CASH::$(gh issue list --label StagingDeployCash --json number --jq '.[0].number')"
+        run: echo "STAGING_DEPLOY_CASH=$(gh issue list --label StagingDeployCash --json number --jq '.[0].number')" >> "$GITHUB_OUTPUT"
         env:
           GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }}
 
@@ -189,7 +189,7 @@ jobs:
     if: ${{ github.actor != 'OSBotify' && !fromJSON(needs.isExpensifyEmployee.outputs.IS_EXPENSIFY_EMPLOYEE) }}
     steps:
       # Version: 2.3.4
-      - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f
+      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
         with:
           token: ${{ secrets.OS_BOTIFY_TOKEN }}
 
diff --git a/Gemfile.lock b/Gemfile.lock
index ac75d801e73b..5ac763189187 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,38 +1,39 @@
 GEM
   remote: https://rubygems.org/
   specs:
-    CFPropertyList (3.0.3)
+    CFPropertyList (3.0.5)
+      rexml
     activesupport (6.1.6)
       concurrent-ruby (~> 1.0, >= 1.0.2)
       i18n (>= 1.6, < 2)
       minitest (>= 5.1)
       tzinfo (~> 2.0)
       zeitwerk (~> 2.3)
-    addressable (2.8.0)
-      public_suffix (>= 2.0.2, < 5.0)
+    addressable (2.8.1)
+      public_suffix (>= 2.0.2, < 6.0)
     algoliasearch (1.27.5)
       httpclient (~> 2.8, >= 2.8.3)
       json (>= 1.5.1)
     artifactory (3.0.15)
     atomos (0.1.3)
     aws-eventstream (1.2.0)
-    aws-partitions (1.495.0)
-    aws-sdk-core (3.121.0)
+    aws-partitions (1.646.0)
+    aws-sdk-core (3.160.0)
       aws-eventstream (~> 1, >= 1.0.2)
-      aws-partitions (~> 1, >= 1.239.0)
+      aws-partitions (~> 1, >= 1.525.0)
       aws-sigv4 (~> 1.1)
-      jmespath (~> 1.0)
-    aws-sdk-kms (1.48.0)
-      aws-sdk-core (~> 3, >= 3.120.0)
+      jmespath (~> 1, >= 1.6.1)
+    aws-sdk-kms (1.58.0)
+      aws-sdk-core (~> 3, >= 3.127.0)
       aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.102.0)
-      aws-sdk-core (~> 3, >= 3.120.0)
+    aws-sdk-s3 (1.114.0)
+      aws-sdk-core (~> 3, >= 3.127.0)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.4)
-    aws-sigv4 (1.4.0)
+    aws-sigv4 (1.5.2)
       aws-eventstream (~> 1, >= 1.0.2)
     babosa (1.0.4)
-    claide (1.0.3)
+    claide (1.1.0)
     cocoapods (1.11.3)
       addressable (~> 2.8)
       claide (>= 1.0.2, < 2.0)
@@ -80,22 +81,23 @@ GEM
       rake (>= 12.0.0, < 14.0.0)
     domain_name (0.5.20190701)
       unf (>= 0.0.5, < 1.0.0)
-    dotenv (2.7.6)
-    emoji_regex (3.2.2)
+    dotenv (2.8.1)
+    emoji_regex (3.2.3)
     escape (0.0.4)
     ethon (0.15.0)
       ffi (>= 1.15.0)
-    excon (0.85.0)
-    faraday (1.7.1)
+    excon (0.93.0)
+    faraday (1.10.2)
       faraday-em_http (~> 1.0)
       faraday-em_synchrony (~> 1.0)
       faraday-excon (~> 1.1)
-      faraday-httpclient (~> 1.0.1)
+      faraday-httpclient (~> 1.0)
+      faraday-multipart (~> 1.0)
       faraday-net_http (~> 1.0)
-      faraday-net_http_persistent (~> 1.1)
+      faraday-net_http_persistent (~> 1.0)
       faraday-patron (~> 1.0)
       faraday-rack (~> 1.0)
-      multipart-post (>= 1.2, < 3)
+      faraday-retry (~> 1.0)
       ruby2_keywords (>= 0.0.4)
     faraday-cookie_jar (0.0.7)
       faraday (>= 0.8.0)
@@ -104,14 +106,17 @@ GEM
     faraday-em_synchrony (1.0.0)
     faraday-excon (1.1.0)
     faraday-httpclient (1.0.1)
+    faraday-multipart (1.0.4)
+      multipart-post (~> 2)
     faraday-net_http (1.0.1)
     faraday-net_http_persistent (1.2.0)
     faraday-patron (1.0.0)
     faraday-rack (1.0.0)
-    faraday_middleware (1.1.0)
+    faraday-retry (1.0.3)
+    faraday_middleware (1.2.0)
       faraday (~> 1.0)
-    fastimage (2.2.5)
-    fastlane (2.206.2)
+    fastimage (2.2.6)
+    fastlane (2.210.1)
       CFPropertyList (>= 2.3, < 4.0.0)
       addressable (>= 2.8, < 3.0.0)
       artifactory (~> 3.0)
@@ -154,9 +159,9 @@ GEM
     fourflusher (2.3.1)
     fuzzy_match (2.0.4)
     gh_inspector (1.1.3)
-    google-apis-androidpublisher_v3 (0.10.0)
-      google-apis-core (>= 0.4, < 2.a)
-    google-apis-core (0.4.1)
+    google-apis-androidpublisher_v3 (0.29.0)
+      google-apis-core (>= 0.9.0, < 2.a)
+    google-apis-core (0.9.0)
       addressable (~> 2.5, >= 2.5.1)
       googleauth (>= 0.16.2, < 2.a)
       httpclient (>= 2.8.1, < 3.a)
@@ -165,45 +170,45 @@ GEM
       retriable (>= 2.0, < 4.a)
       rexml
       webrick
-    google-apis-iamcredentials_v1 (0.7.0)
-      google-apis-core (>= 0.4, < 2.a)
-    google-apis-playcustomapp_v1 (0.5.0)
-      google-apis-core (>= 0.4, < 2.a)
-    google-apis-storage_v1 (0.6.0)
-      google-apis-core (>= 0.4, < 2.a)
+    google-apis-iamcredentials_v1 (0.15.0)
+      google-apis-core (>= 0.9.0, < 2.a)
+    google-apis-playcustomapp_v1 (0.11.0)
+      google-apis-core (>= 0.9.0, < 2.a)
+    google-apis-storage_v1 (0.19.0)
+      google-apis-core (>= 0.9.0, < 2.a)
     google-cloud-core (1.6.0)
       google-cloud-env (~> 1.0)
       google-cloud-errors (~> 1.0)
-    google-cloud-env (1.5.0)
-      faraday (>= 0.17.3, < 2.0)
-    google-cloud-errors (1.1.0)
-    google-cloud-storage (1.34.1)
-      addressable (~> 2.5)
+    google-cloud-env (1.6.0)
+      faraday (>= 0.17.3, < 3.0)
+    google-cloud-errors (1.3.0)
+    google-cloud-storage (1.43.0)
+      addressable (~> 2.8)
       digest-crc (~> 0.4)
       google-apis-iamcredentials_v1 (~> 0.1)
-      google-apis-storage_v1 (~> 0.1)
+      google-apis-storage_v1 (~> 0.19.0)
       google-cloud-core (~> 1.6)
       googleauth (>= 0.16.2, < 2.a)
       mini_mime (~> 1.0)
-    googleauth (0.17.1)
-      faraday (>= 0.17.3, < 2.0)
+    googleauth (1.2.0)
+      faraday (>= 0.17.3, < 3.a)
       jwt (>= 1.4, < 3.0)
       memoist (~> 0.16)
       multi_json (~> 1.11)
       os (>= 0.9, < 2.0)
-      signet (~> 0.15)
+      signet (>= 0.16, < 2.a)
     highline (2.0.3)
-    http-cookie (1.0.4)
+    http-cookie (1.0.5)
       domain_name (~> 0.5)
     httpclient (2.8.3)
     i18n (1.10.0)
       concurrent-ruby (~> 1.0)
-    jmespath (1.4.0)
-    json (2.5.1)
-    jwt (2.2.3)
+    jmespath (1.6.1)
+    json (2.6.2)
+    jwt (2.5.0)
     memoist (0.16.2)
     mini_magick (4.11.0)
-    mini_mime (1.1.1)
+    mini_mime (1.1.2)
     minitest (5.16.2)
     molinillo (0.8.0)
     multi_json (1.15.0)
@@ -213,11 +218,11 @@ GEM
     naturally (2.2.1)
     netrc (0.11.0)
     optparse (0.1.1)
-    os (1.1.1)
+    os (1.1.4)
     plist (3.6.0)
-    public_suffix (4.0.6)
+    public_suffix (4.0.7)
     rake (13.0.6)
-    representable (3.1.1)
+    representable (3.2.0)
       declarative (< 0.1.0)
       trailblazer-option (>= 0.1.1, < 0.2.0)
       uber (< 0.2.0)
@@ -228,9 +233,9 @@ GEM
     ruby2_keywords (0.0.5)
     rubyzip (2.3.2)
     security (0.1.3)
-    signet (0.15.0)
-      addressable (~> 2.3)
-      faraday (>= 0.17.3, < 2.0)
+    signet (0.17.0)
+      addressable (~> 2.8)
+      faraday (>= 0.17.5, < 3.a)
       jwt (>= 1.5, < 3.0)
       multi_json (~> 1.10)
     simctl (1.6.8)
@@ -239,7 +244,7 @@ GEM
     terminal-notifier (2.0.0)
     terminal-table (1.8.0)
       unicode-display_width (~> 1.1, >= 1.1.1)
-    trailblazer-option (0.1.1)
+    trailblazer-option (0.1.2)
     tty-cursor (0.7.1)
     tty-screen (0.8.1)
     tty-spinner (0.9.3)
@@ -251,11 +256,11 @@ GEM
     uber (0.1.0)
     unf (0.1.4)
       unf_ext
-    unf_ext (0.0.7.7)
-    unicode-display_width (1.7.0)
+    unf_ext (0.0.8.2)
+    unicode-display_width (1.8.0)
     webrick (1.7.0)
     word_wrap (1.0.0)
-    xcodeproj (1.21.0)
+    xcodeproj (1.22.0)
       CFPropertyList (>= 2.3.3, < 4.0)
       atomos (~> 0.1.3)
       claide (>= 1.0.2, < 2.0)
@@ -281,4 +286,4 @@ DEPENDENCIES
   xcpretty (~> 0)
 
 BUNDLED WITH
-   2.3.9
+   2.3.24
diff --git a/android/app/build.gradle b/android/app/build.gradle
index bee6495f2362..f32016ad3d95 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -156,8 +156,8 @@ android {
         minSdkVersion rootProject.ext.minSdkVersion
         targetSdkVersion rootProject.ext.targetSdkVersion
         multiDexEnabled rootProject.ext.multiDexEnabled
-        versionCode 1001021704
-        versionName "1.2.17-4"
+        versionCode 1001021902
+        versionName "1.2.19-2"
         buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
 
         if (isNewArchitectureEnabled()) {
diff --git a/android/app/src/main/java/com/expensify/chat/MainApplication.java b/android/app/src/main/java/com/expensify/chat/MainApplication.java
index 68c2cb67d0e1..7156979a6c68 100644
--- a/android/app/src/main/java/com/expensify/chat/MainApplication.java
+++ b/android/app/src/main/java/com/expensify/chat/MainApplication.java
@@ -21,9 +21,6 @@
 import java.util.List;
 import com.facebook.react.modules.i18nmanager.I18nUtil;
 
-import com.facebook.react.bridge.JSIModulePackage;
-import com.swmansion.reanimated.ReanimatedJSIModulePackage;
-
 public class MainApplication extends MultiDexApplication implements ReactApplication {
 
   private final ReactNativeHost mReactNativeHost =
@@ -49,11 +46,6 @@ protected List<ReactPackage> getPackages() {
         protected String getJSMainModuleName() {
           return "index";
         }
-
-        @Override
-        protected JSIModulePackage getJSIModulePackage() {
-          return new ReanimatedJSIModulePackage();
-        }
       };
 
   // TODO: Use this to enable new architecture.
diff --git a/android/build.gradle b/android/build.gradle
index bf4d0debde60..49fa013fac6b 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -2,7 +2,6 @@
 
 buildscript {
     ext {
-        buildToolsVersion = "31.0.0"
         minSdkVersion = 21
         compileSdkVersion = 31
         targetSdkVersion = 31
diff --git a/assets/emojis.js b/assets/emojis.js
index 9ab216df6347..8add4a0dbdc5 100644
--- a/assets/emojis.js
+++ b/assets/emojis.js
@@ -58,6 +58,7 @@ const emojis = [
             'face',
             'grin',
         ],
+        name: 'grinning',
     },
     {
         code: '😁',
@@ -67,6 +68,7 @@ const emojis = [
             'grin',
             'smile',
         ],
+        name: 'grin',
     },
     {
         code: '😂',
@@ -76,6 +78,7 @@ const emojis = [
             'laugh',
             'tear',
         ],
+        name: 'joy',
     },
     {
         code: '🤣',
@@ -87,6 +90,7 @@ const emojis = [
             'rofl',
             'rolling',
         ],
+        name: 'rofl',
     },
     {
         code: '😃',
@@ -96,6 +100,7 @@ const emojis = [
             'open',
             'smile',
         ],
+        name: 'smiley',
     },
     {
         code: '😄',
@@ -106,6 +111,7 @@ const emojis = [
             'open',
             'smile',
         ],
+        name: 'smile',
     },
     {
         code: '😅',
@@ -116,6 +122,7 @@ const emojis = [
             'smile',
             'sweat',
         ],
+        name: 'sweat_smile',
     },
     {
         code: '😆',
@@ -127,6 +134,7 @@ const emojis = [
             'satisfied',
             'smile',
         ],
+        name: 'laughing',
     },
     {
         code: '😉',
@@ -134,6 +142,7 @@ const emojis = [
             'face',
             'wink',
         ],
+        name: 'wink',
     },
     {
         code: '😊',
@@ -143,6 +152,7 @@ const emojis = [
             'face',
             'smile',
         ],
+        name: 'blush',
     },
     {
         code: '😋',
@@ -154,6 +164,7 @@ const emojis = [
             'um',
             'yum',
         ],
+        name: 'yum',
     },
     {
         code: '😎',
@@ -169,6 +180,7 @@ const emojis = [
             'sunglasses',
             'weather',
         ],
+        name: 'sunglasses',
     },
     {
         code: '😍',
@@ -179,6 +191,7 @@ const emojis = [
             'love',
             'smile',
         ],
+        name: 'heart_eyes',
     },
     {
         code: '😘',
@@ -187,6 +200,7 @@ const emojis = [
             'heart',
             'kiss',
         ],
+        name: 'kissing_heart',
     },
     {
         code: '😗',
@@ -194,6 +208,7 @@ const emojis = [
             'face',
             'kiss',
         ],
+        name: 'kissing',
     },
     {
         code: '😙',
@@ -203,6 +218,7 @@ const emojis = [
             'kiss',
             'smile',
         ],
+        name: 'kissing_smiling_eyes',
     },
     {
         code: '😚',
@@ -212,6 +228,7 @@ const emojis = [
             'face',
             'kiss',
         ],
+        name: 'kissing_closed_eyes',
     },
     {
         code: '🙂',
@@ -219,6 +236,7 @@ const emojis = [
             'face',
             'smile',
         ],
+        name: 'slightly_smiling_face',
     },
     {
         code: '🤗',
@@ -227,6 +245,7 @@ const emojis = [
             'hug',
             'hugging',
         ],
+        name: 'hugs',
     },
     {
         code: '🤔',
@@ -234,6 +253,7 @@ const emojis = [
             'face',
             'thinking',
         ],
+        name: 'thinking',
     },
     {
         code: '😐',
@@ -242,6 +262,7 @@ const emojis = [
             'face',
             'neutral',
         ],
+        name: 'neutral_face',
     },
     {
         code: '😑',
@@ -251,6 +272,7 @@ const emojis = [
             'inexpressive',
             'unexpressive',
         ],
+        name: 'expressionless',
     },
     {
         code: '😶',
@@ -260,6 +282,7 @@ const emojis = [
             'quiet',
             'silent',
         ],
+        name: 'no_mouth',
     },
     {
         code: '🙄',
@@ -268,6 +291,7 @@ const emojis = [
             'face',
             'rolling',
         ],
+        name: 'roll_eyes',
     },
     {
         code: '😏',
@@ -275,6 +299,7 @@ const emojis = [
             'face',
             'smirk',
         ],
+        name: 'smirk',
     },
     {
         code: '😣',
@@ -282,6 +307,7 @@ const emojis = [
             'face',
             'persevere',
         ],
+        name: 'persevere',
     },
     {
         code: '😥',
@@ -291,6 +317,7 @@ const emojis = [
             'relieved',
             'whew',
         ],
+        name: 'disappointed_relieved',
     },
     {
         code: '😮',
@@ -300,6 +327,7 @@ const emojis = [
             'open',
             'sympathy',
         ],
+        name: 'open_mouth',
     },
     {
         code: '🤐',
@@ -308,6 +336,7 @@ const emojis = [
             'mouth',
             'zipper',
         ],
+        name: 'zipper_mouth_face',
     },
     {
         code: '😯',
@@ -317,6 +346,7 @@ const emojis = [
             'stunned',
             'surprised',
         ],
+        name: 'hushed',
     },
     {
         code: '😪',
@@ -324,6 +354,7 @@ const emojis = [
             'face',
             'sleep',
         ],
+        name: 'sleepy',
     },
     {
         code: '😫',
@@ -331,6 +362,7 @@ const emojis = [
             'face',
             'tired',
         ],
+        name: 'tired_face',
     },
     {
         code: '😴',
@@ -339,6 +371,7 @@ const emojis = [
             'sleep',
             'zzz',
         ],
+        name: 'sleeping',
     },
     {
         code: '😌',
@@ -346,6 +379,7 @@ const emojis = [
             'face',
             'relieved',
         ],
+        name: 'relieved',
     },
     {
         code: '🤓',
@@ -354,6 +388,7 @@ const emojis = [
             'geek',
             'nerd',
         ],
+        name: 'nerd_face',
     },
     {
         code: '😛',
@@ -361,6 +396,7 @@ const emojis = [
             'face',
             'tongue',
         ],
+        name: 'stuck_out_tongue',
     },
     {
         code: '😜',
@@ -371,6 +407,7 @@ const emojis = [
             'tongue',
             'wink',
         ],
+        name: 'stuck_out_tongue_winking_eye',
     },
     {
         code: '😝',
@@ -381,6 +418,7 @@ const emojis = [
             'taste',
             'tongue',
         ],
+        name: 'stuck_out_tongue_closed_eyes',
     },
     {
         code: '🤤',
@@ -388,6 +426,7 @@ const emojis = [
             'drooling',
             'face',
         ],
+        name: 'drooling_face',
     },
     {
         code: '😒',
@@ -396,6 +435,7 @@ const emojis = [
             'unamused',
             'unhappy',
         ],
+        name: 'unamused',
     },
     {
         code: '😓',
@@ -404,6 +444,7 @@ const emojis = [
             'face',
             'sweat',
         ],
+        name: 'sweat',
     },
     {
         code: '😔',
@@ -412,6 +453,7 @@ const emojis = [
             'face',
             'pensive',
         ],
+        name: 'pensive',
     },
     {
         code: '😕',
@@ -419,6 +461,7 @@ const emojis = [
             'confused',
             'face',
         ],
+        name: 'confused',
     },
     {
         code: '🙃',
@@ -426,6 +469,7 @@ const emojis = [
             'face',
             'upside-down',
         ],
+        name: 'upside_down_face',
     },
     {
         code: '🤑',
@@ -434,6 +478,7 @@ const emojis = [
             'money',
             'mouth',
         ],
+        name: 'money_mouth_face',
     },
     {
         code: '😲',
@@ -443,6 +488,7 @@ const emojis = [
             'shocked',
             'totally',
         ],
+        name: 'astonished',
     },
     {
         code: '🙁',
@@ -450,6 +496,7 @@ const emojis = [
             'face',
             'frown',
         ],
+        name: 'slightly_frowning_face',
     },
     {
         code: '😖',
@@ -457,6 +504,7 @@ const emojis = [
             'confounded',
             'face',
         ],
+        name: 'confounded',
     },
     {
         code: '😞',
@@ -464,6 +512,7 @@ const emojis = [
             'disappointed',
             'face',
         ],
+        name: 'disappointed',
     },
     {
         code: '😟',
@@ -471,6 +520,7 @@ const emojis = [
             'face',
             'worried',
         ],
+        name: 'worried',
     },
     {
         code: '😤',
@@ -479,6 +529,7 @@ const emojis = [
             'triumph',
             'won',
         ],
+        name: 'triumph',
     },
     {
         code: '😢',
@@ -488,6 +539,7 @@ const emojis = [
             'sad',
             'tear',
         ],
+        name: 'cry',
     },
     {
         code: '😭',
@@ -498,6 +550,7 @@ const emojis = [
             'sob',
             'tear',
         ],
+        name: 'sob',
     },
     {
         code: '😦',
@@ -507,6 +560,7 @@ const emojis = [
             'mouth',
             'open',
         ],
+        name: 'frowning',
     },
     {
         code: '😧',
@@ -514,6 +568,7 @@ const emojis = [
             'anguished',
             'face',
         ],
+        name: 'anguished',
     },
     {
         code: '😨',
@@ -523,6 +578,7 @@ const emojis = [
             'fearful',
             'scared',
         ],
+        name: 'fearful',
     },
     {
         code: '😩',
@@ -531,6 +587,7 @@ const emojis = [
             'tired',
             'weary',
         ],
+        name: 'weary',
     },
     {
         code: '😬',
@@ -538,6 +595,7 @@ const emojis = [
             'face',
             'grimace',
         ],
+        name: 'grimacing',
     },
     {
         code: '😰',
@@ -550,6 +608,7 @@ const emojis = [
             'rushed',
             'sweat',
         ],
+        name: 'cold_sweat',
     },
     {
         code: '😱',
@@ -561,6 +620,7 @@ const emojis = [
             'scared',
             'scream',
         ],
+        name: 'scream',
     },
     {
         code: '😳',
@@ -569,6 +629,7 @@ const emojis = [
             'face',
             'flushed',
         ],
+        name: 'flushed',
     },
     {
         code: '😵',
@@ -576,6 +637,7 @@ const emojis = [
             'dizzy',
             'face',
         ],
+        name: 'dizzy_face',
     },
     {
         code: '😡',
@@ -587,6 +649,7 @@ const emojis = [
             'rage',
             'red',
         ],
+        name: 'rage',
     },
     {
         code: '😠',
@@ -595,6 +658,7 @@ const emojis = [
             'face',
             'mad',
         ],
+        name: 'angry',
     },
     {
         code: '😇',
@@ -607,6 +671,7 @@ const emojis = [
             'innocent',
             'smile',
         ],
+        name: 'innocent',
     },
     {
         code: '🤠',
@@ -616,6 +681,7 @@ const emojis = [
             'face',
             'hat',
         ],
+        name: 'cowboy_hat_face',
     },
     {
         code: '🤡',
@@ -623,6 +689,7 @@ const emojis = [
             'clown',
             'face',
         ],
+        name: 'clown_face',
     },
     {
         code: '🤥',
@@ -631,6 +698,7 @@ const emojis = [
             'lie',
             'pinocchio',
         ],
+        name: 'lying_face',
     },
     {
         code: '😷',
@@ -642,6 +710,7 @@ const emojis = [
             'medicine',
             'sick',
         ],
+        name: 'mask',
     },
     {
         code: '🤒',
@@ -651,6 +720,7 @@ const emojis = [
             'sick',
             'thermometer',
         ],
+        name: 'face_with_thermometer',
     },
     {
         code: '🤕',
@@ -660,6 +730,7 @@ const emojis = [
             'hurt',
             'injury',
         ],
+        name: 'face_with_head_bandage',
     },
     {
         code: '🤢',
@@ -668,6 +739,7 @@ const emojis = [
             'nauseated',
             'vomit',
         ],
+        name: 'nauseated_face',
     },
     {
         code: '🤧',
@@ -676,6 +748,7 @@ const emojis = [
             'gesundheit',
             'sneeze',
         ],
+        name: 'sneezing_face',
     },
     {
         code: '😈',
@@ -686,6 +759,7 @@ const emojis = [
             'horns',
             'smile',
         ],
+        name: 'smiling_imp',
     },
     {
         code: '👿',
@@ -697,6 +771,7 @@ const emojis = [
             'fantasy',
             'imp',
         ],
+        name: 'imp',
     },
     {
         code: '👹',
@@ -709,6 +784,7 @@ const emojis = [
             'monster',
             'ogre',
         ],
+        name: 'japanese_ogre',
     },
     {
         code: '👺',
@@ -721,6 +797,7 @@ const emojis = [
             'japanese',
             'monster',
         ],
+        name: 'japanese_goblin',
     },
     {
         code: '💀',
@@ -732,6 +809,7 @@ const emojis = [
             'monster',
             'skull',
         ],
+        name: 'skull',
     },
     {
         code: '☠️',
@@ -743,6 +821,7 @@ const emojis = [
             'monster',
             'skull',
         ],
+        name: 'skull_and_crossbones',
     },
     {
         code: '👻',
@@ -754,6 +833,7 @@ const emojis = [
             'ghost',
             'monster',
         ],
+        name: 'ghost',
     },
     {
         code: '👽',
@@ -768,6 +848,7 @@ const emojis = [
             'space',
             'ufo',
         ],
+        name: 'alien',
     },
     {
         code: '👾',
@@ -782,6 +863,7 @@ const emojis = [
             'space',
             'ufo',
         ],
+        name: 'space_invader',
     },
     {
         code: '🤖',
@@ -790,6 +872,7 @@ const emojis = [
             'monster',
             'robot',
         ],
+        name: 'robot',
     },
     {
         code: '💩',
@@ -801,6 +884,7 @@ const emojis = [
             'poo',
             'poop',
         ],
+        name: 'hankey',
     },
     {
         code: '😺',
@@ -811,6 +895,7 @@ const emojis = [
             'open',
             'smile',
         ],
+        name: 'smiley_cat',
     },
     {
         code: '😸',
@@ -821,6 +906,7 @@ const emojis = [
             'grin',
             'smile',
         ],
+        name: 'smile_cat',
     },
     {
         code: '😹',
@@ -830,6 +916,7 @@ const emojis = [
             'joy',
             'tear',
         ],
+        name: 'joy_cat',
     },
     {
         code: '😻',
@@ -841,6 +928,7 @@ const emojis = [
             'love',
             'smile',
         ],
+        name: 'heart_eyes_cat',
     },
     {
         code: '😼',
@@ -851,6 +939,7 @@ const emojis = [
             'smile',
             'wry',
         ],
+        name: 'smirk_cat',
     },
     {
         code: '😽',
@@ -860,6 +949,7 @@ const emojis = [
             'face',
             'kiss',
         ],
+        name: 'kissing_cat',
     },
     {
         code: '🙀',
@@ -870,6 +960,7 @@ const emojis = [
             'surprised',
             'weary',
         ],
+        name: 'scream_cat',
     },
     {
         code: '😿',
@@ -880,6 +971,7 @@ const emojis = [
             'sad',
             'tear',
         ],
+        name: 'crying_cat_face',
     },
     {
         code: '😾',
@@ -888,6 +980,7 @@ const emojis = [
             'face',
             'pouting',
         ],
+        name: 'pouting_cat',
     },
     {
         code: '🙈',
@@ -902,6 +995,7 @@ const emojis = [
             'prohibited',
             'see',
         ],
+        name: 'see_no_evil',
     },
     {
         code: '🙉',
@@ -916,6 +1010,7 @@ const emojis = [
             'not',
             'prohibited',
         ],
+        name: 'hear_no_evil',
     },
     {
         code: '🙊',
@@ -930,6 +1025,7 @@ const emojis = [
             'prohibited',
             'speak',
         ],
+        name: 'speak_no_evil',
     },
     {
         code: '👦',
@@ -943,6 +1039,7 @@ const emojis = [
             '👦🏼',
             '👦🏻',
         ],
+        name: 'boy',
     },
     {
         code: '👧',
@@ -960,6 +1057,7 @@ const emojis = [
             '👧🏼',
             '👧🏻',
         ],
+        name: 'girl',
     },
     {
         code: '👨',
@@ -973,6 +1071,7 @@ const emojis = [
             '👨🏼',
             '👨🏻',
         ],
+        name: 'man',
     },
     {
         code: '👩',
@@ -986,6 +1085,7 @@ const emojis = [
             '👩🏼',
             '👩🏻',
         ],
+        name: 'woman',
     },
     {
         code: '👴',
@@ -1000,6 +1100,7 @@ const emojis = [
             '👴🏼',
             '👴🏻',
         ],
+        name: 'older_man',
     },
     {
         code: '👵',
@@ -1014,6 +1115,7 @@ const emojis = [
             '👵🏼',
             '👵🏻',
         ],
+        name: 'older_woman',
     },
     {
         code: '👶',
@@ -1027,6 +1129,7 @@ const emojis = [
             '👶🏼',
             '👶🏻',
         ],
+        name: 'baby',
     },
     {
         code: '👼',
@@ -1044,6 +1147,7 @@ const emojis = [
             '👼🏼',
             '👼🏻',
         ],
+        name: 'angel',
     },
     {
         code: '👱',
@@ -1057,6 +1161,7 @@ const emojis = [
             '👱🏼',
             '👱🏻',
         ],
+        name: 'blond_haired_person',
     },
     {
         code: '👮',
@@ -1072,6 +1177,7 @@ const emojis = [
             '👮🏼',
             '👮🏻',
         ],
+        name: 'police_officer',
     },
     {
         code: '👲',
@@ -1087,6 +1193,7 @@ const emojis = [
             '👲🏼',
             '👲🏻',
         ],
+        name: 'man_with_gua_pi_mao',
     },
     {
         code: '👳',
@@ -1101,6 +1208,7 @@ const emojis = [
             '👳🏼',
             '👳🏻',
         ],
+        name: 'person_with_turban',
     },
     {
         code: '👷',
@@ -1116,6 +1224,7 @@ const emojis = [
             '👷🏼',
             '👷🏻',
         ],
+        name: 'construction_worker',
     },
     {
         code: '👸',
@@ -1131,6 +1240,7 @@ const emojis = [
             '👸🏼',
             '👸🏻',
         ],
+        name: 'princess',
     },
     {
         code: '🤴',
@@ -1144,6 +1254,7 @@ const emojis = [
             '🤴🏼',
             '🤴🏻',
         ],
+        name: 'prince',
     },
     {
         code: '💂',
@@ -1158,6 +1269,7 @@ const emojis = [
             '💂🏼',
             '💂🏻',
         ],
+        name: 'guard',
     },
     {
         code: '🕵',
@@ -1173,6 +1285,7 @@ const emojis = [
             '🕵🏼',
             '🕵🏻',
         ],
+        name: 'detective',
     },
     {
         code: '🎅',
@@ -1192,6 +1305,7 @@ const emojis = [
             '🎅🏼',
             '🎅🏻',
         ],
+        name: 'santa',
     },
     {
         code: '🤶',
@@ -1207,6 +1321,7 @@ const emojis = [
             '🤶🏼',
             '🤶🏻',
         ],
+        name: 'mrs_claus',
     },
     {
         code: '👰',
@@ -1222,6 +1337,7 @@ const emojis = [
             '👰🏼',
             '👰🏻',
         ],
+        name: 'person_with_veil',
     },
     {
         code: '🤵',
@@ -1237,6 +1353,7 @@ const emojis = [
             '🤵🏼',
             '🤵🏻',
         ],
+        name: 'person_in_tuxedo',
     },
     {
         code: '💆',
@@ -1251,6 +1368,7 @@ const emojis = [
             '💆🏼',
             '💆🏻',
         ],
+        name: 'massage',
     },
     {
         code: '💇',
@@ -1267,6 +1385,7 @@ const emojis = [
             '💇🏼',
             '💇🏻',
         ],
+        name: 'haircut',
     },
     {
         code: '🙍',
@@ -1281,6 +1400,7 @@ const emojis = [
             '🙍🏼',
             '🙍🏻',
         ],
+        name: 'frowning_person',
     },
     {
         code: '🙎',
@@ -1295,6 +1415,7 @@ const emojis = [
             '🙎🏼',
             '🙎🏻',
         ],
+        name: 'pouting_face',
     },
     {
         code: '🙅',
@@ -1313,6 +1434,7 @@ const emojis = [
             '🙅🏼',
             '🙅🏻',
         ],
+        name: 'no_good',
     },
     {
         code: '🙆',
@@ -1328,6 +1450,7 @@ const emojis = [
             '🙆🏼',
             '🙆🏻',
         ],
+        name: 'ok_person',
     },
     {
         code: '💁',
@@ -1344,6 +1467,7 @@ const emojis = [
             '💁🏼',
             '💁🏻',
         ],
+        name: 'tipping_hand_person',
     },
     {
         code: '🤷',
@@ -1360,6 +1484,7 @@ const emojis = [
             '🤷🏼',
             '🤷🏻',
         ],
+        name: 'shrug',
     },
     {
         code: '🙋',
@@ -1376,6 +1501,7 @@ const emojis = [
             '🙋🏼',
             '🙋🏻',
         ],
+        name: 'raising_hand',
     },
     {
         code: '🤦',
@@ -1392,6 +1518,7 @@ const emojis = [
             '🤦🏼',
             '🤦🏻',
         ],
+        name: 'facepalm',
     },
     {
         code: '🙇',
@@ -1408,6 +1535,7 @@ const emojis = [
             '🙇🏼',
             '🙇🏻',
         ],
+        name: 'bow',
     },
     {
         code: '🚶',
@@ -1424,6 +1552,7 @@ const emojis = [
             '🚶🏼',
             '🚶🏻',
         ],
+        name: 'walking',
     },
     {
         code: '🏃',
@@ -1439,6 +1568,7 @@ const emojis = [
             '🏃🏼',
             '🏃🏻',
         ],
+        name: 'runner',
     },
     {
         code: '💃',
@@ -1452,6 +1582,7 @@ const emojis = [
             '💃🏼',
             '💃🏻',
         ],
+        name: 'woman_dancing',
     },
     {
         code: '🕺',
@@ -1466,6 +1597,7 @@ const emojis = [
             '🕺🏼',
             '🕺🏻',
         ],
+        name: 'man_dancing',
     },
     {
         code: '🤰',
@@ -1480,6 +1612,7 @@ const emojis = [
             '🤰🏼',
             '🤰🏻',
         ],
+        name: 'pregnant_woman',
     },
     {
         code: '👯',
@@ -1490,6 +1623,7 @@ const emojis = [
             'girl',
             'woman',
         ],
+        name: 'dancers',
     },
     {
         code: '🕴',
@@ -1498,6 +1632,7 @@ const emojis = [
             'man',
             'suit',
         ],
+        name: 'business_suit_levitating',
     },
     {
         code: '🗣',
@@ -1508,6 +1643,7 @@ const emojis = [
             'speak',
             'speaking',
         ],
+        name: 'speaking_head',
     },
     {
         code: '👤',
@@ -1515,6 +1651,7 @@ const emojis = [
             'bust',
             'silhouette',
         ],
+        name: 'bust_in_silhouette',
     },
     {
         code: '👥',
@@ -1522,6 +1659,7 @@ const emojis = [
             'bust',
             'silhouette',
         ],
+        name: 'busts_in_silhouette',
     },
     {
         code: '👫',
@@ -1532,6 +1670,7 @@ const emojis = [
             'man',
             'woman',
         ],
+        name: 'couple',
     },
     {
         code: '👬',
@@ -1544,6 +1683,7 @@ const emojis = [
             'twins',
             'zodiac',
         ],
+        name: 'two_men_holding_hands',
     },
     {
         code: '👭',
@@ -1553,6 +1693,7 @@ const emojis = [
             'hold',
             'woman',
         ],
+        name: 'two_women_holding_hands',
     },
     {
         code: '💏',
@@ -1561,6 +1702,7 @@ const emojis = [
             'kiss',
             'romance',
         ],
+        name: 'couplekiss',
     },
     {
         code: '💑',
@@ -1570,6 +1712,7 @@ const emojis = [
             'love',
             'romance',
         ],
+        name: 'couple_with_heart',
     },
     {
         code: '👪',
@@ -1579,6 +1722,7 @@ const emojis = [
             'father',
             'mother',
         ],
+        name: 'family',
     },
     {
         code: '👨‍👩‍👦',
@@ -1588,6 +1732,7 @@ const emojis = [
             'man',
             'woman',
         ],
+        name: 'family_man_woman_boy',
     },
     {
         code: '👨‍👩‍👧',
@@ -1597,6 +1742,7 @@ const emojis = [
             'man',
             'woman',
         ],
+        name: 'family_man_woman_girl',
     },
     {
         code: '👨‍👩‍👧‍👦',
@@ -1607,6 +1753,7 @@ const emojis = [
             'man',
             'woman',
         ],
+        name: 'family_man_woman_girl_boy',
     },
     {
         code: '👨‍👩‍👦‍👦',
@@ -1616,6 +1763,7 @@ const emojis = [
             'man',
             'woman',
         ],
+        name: 'family_man_woman_boy_boy',
     },
     {
         code: '👨‍👩‍👧‍👧',
@@ -1625,6 +1773,7 @@ const emojis = [
             'man',
             'woman',
         ],
+        name: 'family_man_woman_girl_girl',
     },
     {
         code: '👨‍👨‍👦',
@@ -1633,6 +1782,7 @@ const emojis = [
             'family',
             'man',
         ],
+        name: 'family_man_man_boy',
     },
     {
         code: '👨‍👨‍👧',
@@ -1641,6 +1791,7 @@ const emojis = [
             'girl',
             'man',
         ],
+        name: 'family_man_man_girl',
     },
     {
         code: '👨‍👨‍👧‍👦',
@@ -1650,6 +1801,7 @@ const emojis = [
             'girl',
             'man',
         ],
+        name: 'family_man_man_girl_boy',
     },
     {
         code: '👨‍👨‍👦‍👦',
@@ -1658,6 +1810,7 @@ const emojis = [
             'family',
             'man',
         ],
+        name: 'family_man_man_boy_boy',
     },
     {
         code: '👨‍👨‍👧‍👧',
@@ -1666,6 +1819,7 @@ const emojis = [
             'girl',
             'man',
         ],
+        name: 'family_man_man_girl_girl',
     },
     {
         code: '👩‍👩‍👦',
@@ -1674,6 +1828,7 @@ const emojis = [
             'family',
             'woman',
         ],
+        name: 'family_woman_woman_boy',
     },
     {
         code: '👩‍👩‍👧',
@@ -1682,6 +1837,7 @@ const emojis = [
             'girl',
             'woman',
         ],
+        name: 'family_woman_woman_girl',
     },
     {
         code: '👩‍👩‍👧‍👦',
@@ -1691,6 +1847,7 @@ const emojis = [
             'girl',
             'woman',
         ],
+        name: 'family_woman_woman_girl_boy',
     },
     {
         code: '👩‍👩‍👦‍👦',
@@ -1699,6 +1856,7 @@ const emojis = [
             'family',
             'woman',
         ],
+        name: 'family_woman_woman_boy_boy',
     },
     {
         code: '👩‍👩‍👧‍👧',
@@ -1707,6 +1865,7 @@ const emojis = [
             'girl',
             'woman',
         ],
+        name: 'family_woman_woman_girl_girl',
     },
     {
         code: '💪',
@@ -1724,6 +1883,7 @@ const emojis = [
             '💪🏼',
             '💪🏻',
         ],
+        name: 'muscle',
     },
     {
         code: '🤳',
@@ -1739,6 +1899,7 @@ const emojis = [
             '🤳🏼',
             '🤳🏻',
         ],
+        name: 'selfie',
     },
     {
         code: '👈',
@@ -1757,6 +1918,7 @@ const emojis = [
             '👈🏼',
             '👈🏻',
         ],
+        name: 'point_left',
     },
     {
         code: '👉',
@@ -1775,6 +1937,7 @@ const emojis = [
             '👉🏼',
             '👉🏻',
         ],
+        name: 'point_right',
     },
     {
         code: '☝',
@@ -1793,6 +1956,7 @@ const emojis = [
             '☝🏼',
             '☝🏻',
         ],
+        name: 'point_up',
     },
     {
         code: '👆',
@@ -1812,6 +1976,7 @@ const emojis = [
             '👆🏼',
             '👆🏻',
         ],
+        name: 'point_up_2',
     },
     {
         code: '🖕',
@@ -1828,6 +1993,7 @@ const emojis = [
             '🖕🏼',
             '🖕🏻',
         ],
+        name: 'middle_finger',
     },
     {
         code: '👇',
@@ -1847,6 +2013,7 @@ const emojis = [
             '👇🏼',
             '👇🏻',
         ],
+        name: 'point_down',
     },
     {
         code: '✌',
@@ -1863,6 +2030,7 @@ const emojis = [
             '✌🏼',
             '✌🏻',
         ],
+        name: 'v',
     },
     {
         code: '🤞',
@@ -1879,6 +2047,7 @@ const emojis = [
             '🤞🏼',
             '🤞🏻',
         ],
+        name: 'crossed_fingers',
     },
     {
         code: '🖖',
@@ -1896,6 +2065,7 @@ const emojis = [
             '🖖🏼',
             '🖖🏻',
         ],
+        name: 'vulcan_salute',
     },
     {
         code: '🤘',
@@ -1913,6 +2083,7 @@ const emojis = [
             '🤘🏼',
             '🤘🏻',
         ],
+        name: 'metal',
     },
     {
         code: '🤙',
@@ -1927,6 +2098,7 @@ const emojis = [
             '🤙🏼',
             '🤙🏻',
         ],
+        name: 'call_me_hand',
     },
     {
         code: '🖐',
@@ -1943,6 +2115,7 @@ const emojis = [
             '🖐🏼',
             '🖐🏻',
         ],
+        name: 'raised_hand_with_fingers_splayed',
     },
     {
         code: '✋',
@@ -1957,6 +2130,7 @@ const emojis = [
             '✋🏼',
             '✋🏻',
         ],
+        name: 'hand',
     },
     {
         code: '👌',
@@ -1972,6 +2146,7 @@ const emojis = [
             '👌🏼',
             '👌🏻',
         ],
+        name: 'ok_hand',
     },
     {
         code: '👍',
@@ -1990,6 +2165,7 @@ const emojis = [
             '👍🏼',
             '👍🏻',
         ],
+        name: '+1',
     },
     {
         code: '👎',
@@ -2008,6 +2184,7 @@ const emojis = [
             '👎🏼',
             '👎🏻',
         ],
+        name: '-1',
     },
     {
         code: '✊',
@@ -2025,6 +2202,7 @@ const emojis = [
             '✊🏼',
             '✊🏻',
         ],
+        name: 'fist_raised',
     },
     {
         code: '👊',
@@ -2042,6 +2220,7 @@ const emojis = [
             '👊🏼',
             '👊🏻',
         ],
+        name: 'fist_oncoming',
     },
     {
         code: '🤛',
@@ -2056,6 +2235,7 @@ const emojis = [
             '🤛🏼',
             '🤛🏻',
         ],
+        name: 'fist_left',
     },
     {
         code: '🤜',
@@ -2070,6 +2250,7 @@ const emojis = [
             '🤜🏼',
             '🤜🏻',
         ],
+        name: 'fist_right',
     },
     {
         code: '🤚',
@@ -2084,6 +2265,7 @@ const emojis = [
             '🤚🏼',
             '🤚🏻',
         ],
+        name: 'raised_back_of_hand',
     },
     {
         code: '👋',
@@ -2100,6 +2282,7 @@ const emojis = [
             '👋🏼',
             '👋🏻',
         ],
+        name: 'wave',
     },
     {
         code: '👏',
@@ -2115,6 +2298,7 @@ const emojis = [
             '👏🏼',
             '👏🏻',
         ],
+        name: 'clap',
     },
     {
         code: '✍',
@@ -2130,6 +2314,7 @@ const emojis = [
             '✍🏼',
             '✍🏻',
         ],
+        name: 'writing_hand',
     },
     {
         code: '👐',
@@ -2145,6 +2330,7 @@ const emojis = [
             '👐🏼',
             '👐🏻',
         ],
+        name: 'open_hands',
     },
     {
         code: '🙌',
@@ -2163,6 +2349,7 @@ const emojis = [
             '🙌🏼',
             '🙌🏻',
         ],
+        name: 'raised_hands',
     },
     {
         code: '🙏',
@@ -2184,6 +2371,7 @@ const emojis = [
             '🙏🏼',
             '🙏🏻',
         ],
+        name: 'pray',
     },
     {
         code: '🤝',
@@ -2201,6 +2389,7 @@ const emojis = [
             '🤝🏼',
             '🤝🏻',
         ],
+        name: 'handshake',
     },
     {
         code: '💅',
@@ -2219,6 +2408,7 @@ const emojis = [
             '💅🏼',
             '💅🏻',
         ],
+        name: 'nail_care',
     },
     {
         code: '👂',
@@ -2233,6 +2423,7 @@ const emojis = [
             '👂🏼',
             '👂🏻',
         ],
+        name: 'ear',
     },
     {
         code: '👃',
@@ -2247,6 +2438,7 @@ const emojis = [
             '👃🏼',
             '👃🏻',
         ],
+        name: 'nose',
     },
     {
         code: '👣',
@@ -2256,6 +2448,7 @@ const emojis = [
             'footprint',
             'print',
         ],
+        name: 'footprints',
     },
     {
         code: '👀',
@@ -2264,6 +2457,7 @@ const emojis = [
             'eye',
             'face',
         ],
+        name: 'eyes',
     },
     {
         code: '👁',
@@ -2271,6 +2465,7 @@ const emojis = [
             'body',
             'eye',
         ],
+        name: 'eye',
     },
     {
         code: '👁‍🗨',
@@ -2280,6 +2475,7 @@ const emojis = [
             'speech',
             'witness',
         ],
+        name: 'eye_speech_bubble',
     },
     {
         code: '👅',
@@ -2287,6 +2483,7 @@ const emojis = [
             'body',
             'tongue',
         ],
+        name: 'tongue',
     },
     {
         code: '👄',
@@ -2295,6 +2492,7 @@ const emojis = [
             'lips',
             'mouth',
         ],
+        name: 'lips',
     },
     {
         code: '💋',
@@ -2305,6 +2503,7 @@ const emojis = [
             'mark',
             'romance',
         ],
+        name: 'kiss',
     },
     {
         code: '💘',
@@ -2314,12 +2513,14 @@ const emojis = [
             'heart',
             'romance',
         ],
+        name: 'cupid',
     },
     {
         code: '❤️',
         keywords: [
             'heart',
         ],
+        name: 'heart',
     },
     {
         code: '💓',
@@ -2329,6 +2530,7 @@ const emojis = [
             'heartbeat',
             'pulsating',
         ],
+        name: 'heartbeat',
     },
     {
         code: '💔',
@@ -2337,6 +2539,7 @@ const emojis = [
             'broken',
             'heart',
         ],
+        name: 'broken_heart',
     },
     {
         code: '💕',
@@ -2344,6 +2547,7 @@ const emojis = [
             'heart',
             'love',
         ],
+        name: 'two_hearts',
     },
     {
         code: '💖',
@@ -2352,6 +2556,7 @@ const emojis = [
             'heart',
             'sparkle',
         ],
+        name: 'sparkling_heart',
     },
     {
         code: '💗',
@@ -2362,6 +2567,7 @@ const emojis = [
             'heartpulse',
             'nervous',
         ],
+        name: 'heartpulse',
     },
     {
         code: '💙',
@@ -2369,6 +2575,7 @@ const emojis = [
             'blue',
             'heart',
         ],
+        name: 'blue_heart',
     },
     {
         code: '💚',
@@ -2376,6 +2583,7 @@ const emojis = [
             'green',
             'heart',
         ],
+        name: 'green_heart',
     },
     {
         code: '💛',
@@ -2383,6 +2591,7 @@ const emojis = [
             'heart',
             'yellow',
         ],
+        name: 'yellow_heart',
     },
     {
         code: '💜',
@@ -2390,6 +2599,7 @@ const emojis = [
             'heart',
             'purple',
         ],
+        name: 'purple_heart',
     },
     {
         code: '🖤',
@@ -2399,6 +2609,7 @@ const emojis = [
             'heart',
             'wicked',
         ],
+        name: 'black_heart',
     },
     {
         code: '💝',
@@ -2407,6 +2618,7 @@ const emojis = [
             'ribbon',
             'valentine',
         ],
+        name: 'gift_heart',
     },
     {
         code: '💞',
@@ -2414,12 +2626,14 @@ const emojis = [
             'heart',
             'revolving',
         ],
+        name: 'revolving_hearts',
     },
     {
         code: '💟',
         keywords: [
             'heart',
         ],
+        name: 'heart_decoration',
     },
     {
         code: '❣️',
@@ -2429,6 +2643,7 @@ const emojis = [
             'mark',
             'punctuation',
         ],
+        name: 'heavy_heart_exclamation',
     },
     {
         code: '💌',
@@ -2439,6 +2654,7 @@ const emojis = [
             'mail',
             'romance',
         ],
+        name: 'love_letter',
     },
     {
         code: '💤',
@@ -2447,6 +2663,7 @@ const emojis = [
             'sleep',
             'zzz',
         ],
+        name: 'zzz',
     },
     {
         code: '💢',
@@ -2455,6 +2672,7 @@ const emojis = [
             'comic',
             'mad',
         ],
+        name: 'anger',
     },
     {
         code: '💣',
@@ -2462,6 +2680,7 @@ const emojis = [
             'bomb',
             'comic',
         ],
+        name: 'bomb',
     },
     {
         code: '💥',
@@ -2470,6 +2689,7 @@ const emojis = [
             'collision',
             'comic',
         ],
+        name: 'boom',
     },
     {
         code: '💦',
@@ -2478,6 +2698,7 @@ const emojis = [
             'splashing',
             'sweat',
         ],
+        name: 'sweat_drops',
     },
     {
         code: '💨',
@@ -2486,6 +2707,7 @@ const emojis = [
             'dash',
             'running',
         ],
+        name: 'dash',
     },
     {
         code: '💫',
@@ -2494,6 +2716,7 @@ const emojis = [
             'dizzy',
             'star',
         ],
+        name: 'dizzy',
     },
     {
         code: '💬',
@@ -2504,6 +2727,7 @@ const emojis = [
             'dialog',
             'speech',
         ],
+        name: 'speech_balloon',
     },
     {
         code: '🗨',
@@ -2511,6 +2735,7 @@ const emojis = [
             'dialog',
             'speech',
         ],
+        name: 'left_speech_bubble',
     },
     {
         code: '🗯',
@@ -2520,6 +2745,7 @@ const emojis = [
             'bubble',
             'mad',
         ],
+        name: 'right_anger_bubble',
     },
     {
         code: '💭',
@@ -2529,12 +2755,14 @@ const emojis = [
             'comic',
             'thought',
         ],
+        name: 'thought_balloon',
     },
     {
         code: '🕳',
         keywords: [
             'hole',
         ],
+        name: 'hole',
     },
     {
         code: '👓',
@@ -2545,6 +2773,7 @@ const emojis = [
             'eyewear',
             'glasses',
         ],
+        name: 'eyeglasses',
     },
     {
         code: '🕶',
@@ -2555,6 +2784,7 @@ const emojis = [
             'glasses',
             'sunglasses',
         ],
+        name: 'dark_sunglasses',
     },
     {
         code: '👔',
@@ -2562,6 +2792,7 @@ const emojis = [
             'clothing',
             'necktie',
         ],
+        name: 'necktie',
     },
     {
         code: '👕',
@@ -2570,6 +2801,7 @@ const emojis = [
             'shirt',
             'tshirt',
         ],
+        name: 'shirt',
     },
     {
         code: '👖',
@@ -2579,6 +2811,7 @@ const emojis = [
             'pants',
             'trousers',
         ],
+        name: 'jeans',
     },
     {
         code: '👗',
@@ -2586,6 +2819,7 @@ const emojis = [
             'clothing',
             'dress',
         ],
+        name: 'dress',
     },
     {
         code: '👘',
@@ -2593,6 +2827,7 @@ const emojis = [
             'clothing',
             'kimono',
         ],
+        name: 'kimono',
     },
     {
         code: '👙',
@@ -2601,6 +2836,7 @@ const emojis = [
             'clothing',
             'swim',
         ],
+        name: 'bikini',
     },
     {
         code: '👚',
@@ -2608,6 +2844,7 @@ const emojis = [
             'clothing',
             'woman',
         ],
+        name: 'womans_clothes',
     },
     {
         code: '👛',
@@ -2616,6 +2853,7 @@ const emojis = [
             'coin',
             'purse',
         ],
+        name: 'purse',
     },
     {
         code: '👜',
@@ -2624,6 +2862,7 @@ const emojis = [
             'clothing',
             'handbag',
         ],
+        name: 'handbag',
     },
     {
         code: '👝',
@@ -2632,6 +2871,7 @@ const emojis = [
             'clothing',
             'pouch',
         ],
+        name: 'pouch',
     },
     {
         code: '🛍',
@@ -2640,6 +2880,7 @@ const emojis = [
             'hotel',
             'shopping',
         ],
+        name: 'shopping',
     },
     {
         code: '🎒',
@@ -2649,6 +2890,7 @@ const emojis = [
             'satchel',
             'school',
         ],
+        name: 'school_satchel',
     },
     {
         code: '👞',
@@ -2657,6 +2899,7 @@ const emojis = [
             'man',
             'shoe',
         ],
+        name: 'mans_shoe',
     },
     {
         code: '👟',
@@ -2666,6 +2909,7 @@ const emojis = [
             'shoe',
             'sneaker',
         ],
+        name: 'athletic_shoe',
     },
     {
         code: '👠',
@@ -2675,6 +2919,7 @@ const emojis = [
             'shoe',
             'woman',
         ],
+        name: 'high_heel',
     },
     {
         code: '👡',
@@ -2684,6 +2929,7 @@ const emojis = [
             'shoe',
             'woman',
         ],
+        name: 'sandal',
     },
     {
         code: '👢',
@@ -2693,6 +2939,7 @@ const emojis = [
             'shoe',
             'woman',
         ],
+        name: 'boot',
     },
     {
         code: '👑',
@@ -2702,6 +2949,7 @@ const emojis = [
             'king',
             'queen',
         ],
+        name: 'crown',
     },
     {
         code: '👒',
@@ -2710,6 +2958,7 @@ const emojis = [
             'hat',
             'woman',
         ],
+        name: 'womans_hat',
     },
     {
         code: '🎩',
@@ -2721,6 +2970,7 @@ const emojis = [
             'top',
             'tophat',
         ],
+        name: 'tophat',
     },
     {
         code: '🎓',
@@ -2732,6 +2982,7 @@ const emojis = [
             'graduation',
             'hat',
         ],
+        name: 'mortar_board',
     },
     {
         code: '⛑',
@@ -2742,6 +2993,7 @@ const emojis = [
             'hat',
             'helmet',
         ],
+        name: 'rescue_worker_helmet',
     },
     {
         code: '📿',
@@ -2752,6 +3004,7 @@ const emojis = [
             'prayer',
             'religion',
         ],
+        name: 'prayer_beads',
     },
     {
         code: '💄',
@@ -2760,6 +3013,7 @@ const emojis = [
             'lipstick',
             'makeup',
         ],
+        name: 'lipstick',
     },
     {
         code: '💍',
@@ -2768,6 +3022,7 @@ const emojis = [
             'ring',
             'romance',
         ],
+        name: 'ring',
     },
     {
         code: '💎',
@@ -2777,6 +3032,7 @@ const emojis = [
             'jewel',
             'romance',
         ],
+        name: 'gem',
     },
     {
         code: 'animalsAndNature',
@@ -2788,18 +3044,21 @@ const emojis = [
             'face',
             'monkey',
         ],
+        name: 'monkey_face',
     },
     {
         code: '🐒',
         keywords: [
             'monkey',
         ],
+        name: 'monkey',
     },
     {
         code: '🦍',
         keywords: [
             'gorilla',
         ],
+        name: 'gorilla',
     },
     {
         code: '🐶',
@@ -2808,6 +3067,7 @@ const emojis = [
             'face',
             'pet',
         ],
+        name: 'dog',
     },
     {
         code: '🐕',
@@ -2815,6 +3075,7 @@ const emojis = [
             'dog',
             'pet',
         ],
+        name: 'dog2',
     },
     {
         code: '🐩',
@@ -2822,6 +3083,7 @@ const emojis = [
             'dog',
             'poodle',
         ],
+        name: 'poodle',
     },
     {
         code: '🐺',
@@ -2829,6 +3091,7 @@ const emojis = [
             'face',
             'wolf',
         ],
+        name: 'wolf',
     },
     {
         code: '🦊',
@@ -2836,6 +3099,7 @@ const emojis = [
             'face',
             'fox',
         ],
+        name: 'fox_face',
     },
     {
         code: '🐱',
@@ -2844,6 +3108,7 @@ const emojis = [
             'face',
             'pet',
         ],
+        name: 'cat',
     },
     {
         code: '🐈',
@@ -2851,6 +3116,7 @@ const emojis = [
             'cat',
             'pet',
         ],
+        name: 'cat2',
     },
     {
         code: '🦁',
@@ -2860,6 +3126,7 @@ const emojis = [
             'lion',
             'zodiac',
         ],
+        name: 'lion',
     },
     {
         code: '🐯',
@@ -2867,18 +3134,21 @@ const emojis = [
             'face',
             'tiger',
         ],
+        name: 'tiger',
     },
     {
         code: '🐅',
         keywords: [
             'tiger',
         ],
+        name: 'tiger2',
     },
     {
         code: '🐆',
         keywords: [
             'leopard',
         ],
+        name: 'leopard',
     },
     {
         code: '🐴',
@@ -2886,6 +3156,7 @@ const emojis = [
             'face',
             'horse',
         ],
+        name: 'horse',
     },
     {
         code: '🐎',
@@ -2894,12 +3165,14 @@ const emojis = [
             'racehorse',
             'racing',
         ],
+        name: 'racehorse',
     },
     {
         code: '🦌',
         keywords: [
             'deer',
         ],
+        name: 'deer',
     },
     {
         code: '🦄',
@@ -2907,6 +3180,7 @@ const emojis = [
             'face',
             'unicorn',
         ],
+        name: 'unicorn',
     },
     {
         code: '🐮',
@@ -2914,6 +3188,7 @@ const emojis = [
             'cow',
             'face',
         ],
+        name: 'cow',
     },
     {
         code: '🐂',
@@ -2923,6 +3198,7 @@ const emojis = [
             'taurus',
             'zodiac',
         ],
+        name: 'ox',
     },
     {
         code: '🐃',
@@ -2930,12 +3206,14 @@ const emojis = [
             'buffalo',
             'water',
         ],
+        name: 'water_buffalo',
     },
     {
         code: '🐄',
         keywords: [
             'cow',
         ],
+        name: 'cow2',
     },
     {
         code: '🐷',
@@ -2943,6 +3221,7 @@ const emojis = [
             'face',
             'pig',
         ],
+        name: 'pig',
     },
     {
         code: '🐖',
@@ -2950,6 +3229,7 @@ const emojis = [
             'pig',
             'sow',
         ],
+        name: 'pig2',
     },
     {
         code: '🐗',
@@ -2957,6 +3237,7 @@ const emojis = [
             'boar',
             'pig',
         ],
+        name: 'boar',
     },
     {
         code: '🐽',
@@ -2965,6 +3246,7 @@ const emojis = [
             'nose',
             'pig',
         ],
+        name: 'pig_nose',
     },
     {
         code: '🐏',
@@ -2974,6 +3256,7 @@ const emojis = [
             'sheep',
             'zodiac',
         ],
+        name: 'ram',
     },
     {
         code: '🐑',
@@ -2981,6 +3264,7 @@ const emojis = [
             'ewe',
             'sheep',
         ],
+        name: 'sheep',
     },
     {
         code: '🐐',
@@ -2989,6 +3273,7 @@ const emojis = [
             'goat',
             'zodiac',
         ],
+        name: 'goat',
     },
     {
         code: '🐪',
@@ -2997,6 +3282,7 @@ const emojis = [
             'dromedary',
             'hump',
         ],
+        name: 'dromedary_camel',
     },
     {
         code: '🐫',
@@ -3005,18 +3291,21 @@ const emojis = [
             'camel',
             'hump',
         ],
+        name: 'camel',
     },
     {
         code: '🐘',
         keywords: [
             'elephant',
         ],
+        name: 'elephant',
     },
     {
         code: '🦏',
         keywords: [
             'rhinoceros',
         ],
+        name: 'rhinoceros',
     },
     {
         code: '🐭',
@@ -3024,18 +3313,21 @@ const emojis = [
             'face',
             'mouse',
         ],
+        name: 'mouse',
     },
     {
         code: '🐁',
         keywords: [
             'mouse',
         ],
+        name: 'mouse2',
     },
     {
         code: '🐀',
         keywords: [
             'rat',
         ],
+        name: 'rat',
     },
     {
         code: '🐹',
@@ -3044,6 +3336,7 @@ const emojis = [
             'hamster',
             'pet',
         ],
+        name: 'hamster',
     },
     {
         code: '🐰',
@@ -3053,6 +3346,7 @@ const emojis = [
             'pet',
             'rabbit',
         ],
+        name: 'rabbit',
     },
     {
         code: '🐇',
@@ -3061,12 +3355,14 @@ const emojis = [
             'pet',
             'rabbit',
         ],
+        name: 'rabbit2',
     },
     {
         code: '🐿',
         keywords: [
             'chipmunk',
         ],
+        name: 'chipmunk',
     },
     {
         code: '🦇',
@@ -3074,6 +3370,7 @@ const emojis = [
             'bat',
             'vampire',
         ],
+        name: 'bat',
     },
     {
         code: '🐻',
@@ -3081,6 +3378,7 @@ const emojis = [
             'bear',
             'face',
         ],
+        name: 'bear',
     },
     {
         code: '🐨',
@@ -3088,6 +3386,7 @@ const emojis = [
             'bear',
             'koala',
         ],
+        name: 'koala',
     },
     {
         code: '🐼',
@@ -3095,6 +3394,7 @@ const emojis = [
             'face',
             'panda',
         ],
+        name: 'panda_face',
     },
     {
         code: '🐾',
@@ -3103,24 +3403,28 @@ const emojis = [
             'paw',
             'print',
         ],
+        name: 'feet',
     },
     {
         code: '🦃',
         keywords: [
             'turkey',
         ],
+        name: 'turkey',
     },
     {
         code: '🐔',
         keywords: [
             'chicken',
         ],
+        name: 'chicken',
     },
     {
         code: '🐓',
         keywords: [
             'rooster',
         ],
+        name: 'rooster',
     },
     {
         code: '🐣',
@@ -3129,6 +3433,7 @@ const emojis = [
             'chick',
             'hatching',
         ],
+        name: 'hatching_chick',
     },
     {
         code: '🐤',
@@ -3136,6 +3441,7 @@ const emojis = [
             'baby',
             'chick',
         ],
+        name: 'baby_chick',
     },
     {
         code: '🐥',
@@ -3143,18 +3449,21 @@ const emojis = [
             'baby',
             'chick',
         ],
+        name: 'hatched_chick',
     },
     {
         code: '🐦',
         keywords: [
             'bird',
         ],
+        name: 'bird',
     },
     {
         code: '🐧',
         keywords: [
             'penguin',
         ],
+        name: 'penguin',
     },
     {
         code: '🕊',
@@ -3164,6 +3473,7 @@ const emojis = [
             'fly',
             'peace',
         ],
+        name: 'dove',
     },
     {
         code: '🦅',
@@ -3171,6 +3481,7 @@ const emojis = [
             'bird',
             'eagle',
         ],
+        name: 'eagle',
     },
     {
         code: '🦆',
@@ -3178,6 +3489,7 @@ const emojis = [
             'bird',
             'duck',
         ],
+        name: 'duck',
     },
     {
         code: '🦉',
@@ -3186,6 +3498,7 @@ const emojis = [
             'owl',
             'wise',
         ],
+        name: 'owl',
     },
     {
         code: '🐸',
@@ -3193,18 +3506,21 @@ const emojis = [
             'face',
             'frog',
         ],
+        name: 'frog',
     },
     {
         code: '🐊',
         keywords: [
             'crocodile',
         ],
+        name: 'crocodile',
     },
     {
         code: '🐢',
         keywords: [
             'turtle',
         ],
+        name: 'turtle',
     },
     {
         code: '🦎',
@@ -3212,6 +3528,7 @@ const emojis = [
             'lizard',
             'reptile',
         ],
+        name: 'lizard',
     },
     {
         code: '🐍',
@@ -3222,6 +3539,7 @@ const emojis = [
             'snake',
             'zodiac',
         ],
+        name: 'snake',
     },
     {
         code: '🐲',
@@ -3230,6 +3548,7 @@ const emojis = [
             'face',
             'fairy tale',
         ],
+        name: 'dragon_face',
     },
     {
         code: '🐉',
@@ -3237,6 +3556,7 @@ const emojis = [
             'dragon',
             'fairy tale',
         ],
+        name: 'dragon',
     },
     {
         code: '🐳',
@@ -3245,12 +3565,14 @@ const emojis = [
             'spouting',
             'whale',
         ],
+        name: 'whale',
     },
     {
         code: '🐋',
         keywords: [
             'whale',
         ],
+        name: 'whale2',
     },
     {
         code: '🐬',
@@ -3258,6 +3580,7 @@ const emojis = [
             'dolphin',
             'flipper',
         ],
+        name: 'dolphin',
     },
     {
         code: '🐟',
@@ -3266,6 +3589,7 @@ const emojis = [
             'pisces',
             'zodiac',
         ],
+        name: 'fish',
     },
     {
         code: '🐠',
@@ -3273,6 +3597,7 @@ const emojis = [
             'fish',
             'tropical',
         ],
+        name: 'tropical_fish',
     },
     {
         code: '🐡',
@@ -3280,6 +3605,7 @@ const emojis = [
             'blowfish',
             'fish',
         ],
+        name: 'blowfish',
     },
     {
         code: '🦈',
@@ -3287,12 +3613,14 @@ const emojis = [
             'fish',
             'shark',
         ],
+        name: 'shark',
     },
     {
         code: '🐙',
         keywords: [
             'octopus',
         ],
+        name: 'octopus',
     },
     {
         code: '🐚',
@@ -3300,6 +3628,7 @@ const emojis = [
             'shell',
             'spiral',
         ],
+        name: 'shell',
     },
     {
         code: '🦀',
@@ -3308,6 +3637,7 @@ const emojis = [
             'crab',
             'zodiac',
         ],
+        name: 'crab',
     },
     {
         code: '🦐',
@@ -3316,6 +3646,7 @@ const emojis = [
             'shrimp',
             'small',
         ],
+        name: 'shrimp',
     },
     {
         code: '🦑',
@@ -3323,6 +3654,7 @@ const emojis = [
             'molusc',
             'squid',
         ],
+        name: 'squid',
     },
     {
         code: '🦋',
@@ -3331,12 +3663,14 @@ const emojis = [
             'insect',
             'pretty',
         ],
+        name: 'butterfly',
     },
     {
         code: '🐌',
         keywords: [
             'snail',
         ],
+        name: 'snail',
     },
     {
         code: '🐛',
@@ -3344,6 +3678,7 @@ const emojis = [
             'bug',
             'insect',
         ],
+        name: 'bug',
     },
     {
         code: '🐜',
@@ -3351,6 +3686,7 @@ const emojis = [
             'ant',
             'insect',
         ],
+        name: 'ant',
     },
     {
         code: '🐝',
@@ -3359,6 +3695,7 @@ const emojis = [
             'honeybee',
             'insect',
         ],
+        name: 'bee',
     },
     {
         code: '🐞',
@@ -3369,6 +3706,7 @@ const emojis = [
             'ladybird',
             'ladybug',
         ],
+        name: 'lady_beetle',
     },
     {
         code: '🕷',
@@ -3376,6 +3714,7 @@ const emojis = [
             'insect',
             'spider',
         ],
+        name: 'spider',
     },
     {
         code: '🕸',
@@ -3383,6 +3722,7 @@ const emojis = [
             'spider',
             'web',
         ],
+        name: 'spider_web',
     },
     {
         code: '🦂',
@@ -3392,6 +3732,7 @@ const emojis = [
             'scorpius',
             'zodiac',
         ],
+        name: 'scorpion',
     },
     {
         code: '💐',
@@ -3401,6 +3742,7 @@ const emojis = [
             'plant',
             'romance',
         ],
+        name: 'bouquet',
     },
     {
         code: '🌸',
@@ -3410,12 +3752,14 @@ const emojis = [
             'flower',
             'plant',
         ],
+        name: 'cherry_blossom',
     },
     {
         code: '💮',
         keywords: [
             'flower',
         ],
+        name: 'white_flower',
     },
     {
         code: '🏵',
@@ -3423,6 +3767,7 @@ const emojis = [
             'plant',
             'rosette',
         ],
+        name: 'rosette',
     },
     {
         code: '🌹',
@@ -3431,6 +3776,7 @@ const emojis = [
             'plant',
             'rose',
         ],
+        name: 'rose',
     },
     {
         code: '🥀',
@@ -3438,6 +3784,7 @@ const emojis = [
             'flower',
             'wilted',
         ],
+        name: 'wilted_flower',
     },
     {
         code: '🌺',
@@ -3446,6 +3793,7 @@ const emojis = [
             'hibiscus',
             'plant',
         ],
+        name: 'hibiscus',
     },
     {
         code: '🌻',
@@ -3455,6 +3803,7 @@ const emojis = [
             'sun',
             'sunflower',
         ],
+        name: 'sunflower',
     },
     {
         code: '🌼',
@@ -3463,6 +3812,7 @@ const emojis = [
             'flower',
             'plant',
         ],
+        name: 'blossom',
     },
     {
         code: '🌷',
@@ -3471,6 +3821,7 @@ const emojis = [
             'plant',
             'tulip',
         ],
+        name: 'tulip',
     },
     {
         code: '🌱',
@@ -3479,6 +3830,7 @@ const emojis = [
             'seedling',
             'young',
         ],
+        name: 'seedling',
     },
     {
         code: '🌲',
@@ -3487,6 +3839,7 @@ const emojis = [
             'plant',
             'tree',
         ],
+        name: 'evergreen_tree',
     },
     {
         code: '🌳',
@@ -3496,6 +3849,7 @@ const emojis = [
             'shedding',
             'tree',
         ],
+        name: 'deciduous_tree',
     },
     {
         code: '🌴',
@@ -3504,6 +3858,7 @@ const emojis = [
             'plant',
             'tree',
         ],
+        name: 'palm_tree',
     },
     {
         code: '🌵',
@@ -3511,6 +3866,7 @@ const emojis = [
             'cactus',
             'plant',
         ],
+        name: 'cactus',
     },
     {
         code: '🌾',
@@ -3519,6 +3875,7 @@ const emojis = [
             'plant',
             'rice',
         ],
+        name: 'ear_of_rice',
     },
     {
         code: '🌿',
@@ -3527,6 +3884,7 @@ const emojis = [
             'leaf',
             'plant',
         ],
+        name: 'herb',
     },
     {
         code: '☘️',
@@ -3534,6 +3892,7 @@ const emojis = [
             'plant',
             'shamrock',
         ],
+        name: 'shamrock',
     },
     {
         code: '🍀',
@@ -3544,6 +3903,7 @@ const emojis = [
             'leaf',
             'plant',
         ],
+        name: 'four_leaf_clover',
     },
     {
         code: '🍁',
@@ -3553,6 +3913,7 @@ const emojis = [
             'maple',
             'plant',
         ],
+        name: 'maple_leaf',
     },
     {
         code: '🍂',
@@ -3561,6 +3922,7 @@ const emojis = [
             'leaf',
             'plant',
         ],
+        name: 'fallen_leaf',
     },
     {
         code: '🍃',
@@ -3571,6 +3933,7 @@ const emojis = [
             'plant',
             'wind',
         ],
+        name: 'leaves',
     },
     {
         code: 'foodAndDrinks',
@@ -3583,6 +3946,7 @@ const emojis = [
             'grape',
             'plant',
         ],
+        name: 'grapes',
     },
     {
         code: '🍈',
@@ -3591,6 +3955,7 @@ const emojis = [
             'melon',
             'plant',
         ],
+        name: 'melon',
     },
     {
         code: '🍉',
@@ -3599,6 +3964,7 @@ const emojis = [
             'plant',
             'watermelon',
         ],
+        name: 'watermelon',
     },
     {
         code: '🍊',
@@ -3608,6 +3974,7 @@ const emojis = [
             'plant',
             'tangerine',
         ],
+        name: 'tangerine',
     },
     {
         code: '🍋',
@@ -3617,6 +3984,7 @@ const emojis = [
             'lemon',
             'plant',
         ],
+        name: 'lemon',
     },
     {
         code: '🍌',
@@ -3625,6 +3993,7 @@ const emojis = [
             'fruit',
             'plant',
         ],
+        name: 'banana',
     },
     {
         code: '🍍',
@@ -3633,6 +4002,7 @@ const emojis = [
             'pineapple',
             'plant',
         ],
+        name: 'pineapple',
     },
     {
         code: '🍎',
@@ -3642,6 +4012,7 @@ const emojis = [
             'plant',
             'red',
         ],
+        name: 'apple',
     },
     {
         code: '🍏',
@@ -3651,6 +4022,7 @@ const emojis = [
             'green',
             'plant',
         ],
+        name: 'green_apple',
     },
     {
         code: '🍐',
@@ -3659,6 +4031,7 @@ const emojis = [
             'pear',
             'plant',
         ],
+        name: 'pear',
     },
     {
         code: '🍑',
@@ -3667,6 +4040,7 @@ const emojis = [
             'peach',
             'plant',
         ],
+        name: 'peach',
     },
     {
         code: '🍒',
@@ -3675,6 +4049,7 @@ const emojis = [
             'fruit',
             'plant',
         ],
+        name: 'cherries',
     },
     {
         code: '🍓',
@@ -3684,6 +4059,7 @@ const emojis = [
             'plant',
             'strawberry',
         ],
+        name: 'strawberry',
     },
     {
         code: '🍅',
@@ -3692,6 +4068,7 @@ const emojis = [
             'tomato',
             'vegetable',
         ],
+        name: 'tomato',
     },
     {
         code: '🥝',
@@ -3699,6 +4076,7 @@ const emojis = [
             'fruit',
             'kiwi',
         ],
+        name: 'kiwi_fruit',
     },
     {
         code: '🥑',
@@ -3706,6 +4084,7 @@ const emojis = [
             'avocado',
             'fruit',
         ],
+        name: 'avocado',
     },
     {
         code: '🍆',
@@ -3715,6 +4094,7 @@ const emojis = [
             'plant',
             'vegetable',
         ],
+        name: 'eggplant',
     },
     {
         code: '🥔',
@@ -3722,6 +4102,7 @@ const emojis = [
             'potato',
             'vegetable',
         ],
+        name: 'potato',
     },
     {
         code: '🥕',
@@ -3729,6 +4110,7 @@ const emojis = [
             'carrot',
             'vegetable',
         ],
+        name: 'carrot',
     },
     {
         code: '🌽',
@@ -3739,6 +4121,7 @@ const emojis = [
             'maze',
             'plant',
         ],
+        name: 'corn',
     },
     {
         code: '🌶',
@@ -3747,6 +4130,7 @@ const emojis = [
             'pepper',
             'plant',
         ],
+        name: 'hot_pepper',
     },
     {
         code: '🥒',
@@ -3755,6 +4139,7 @@ const emojis = [
             'pickle',
             'vegetable',
         ],
+        name: 'cucumber',
     },
     {
         code: '🍄',
@@ -3762,6 +4147,7 @@ const emojis = [
             'mushroom',
             'plant',
         ],
+        name: 'mushroom',
     },
     {
         code: '🥜',
@@ -3770,6 +4156,7 @@ const emojis = [
             'peanut',
             'vegetable',
         ],
+        name: 'peanuts',
     },
     {
         code: '🌰',
@@ -3777,6 +4164,7 @@ const emojis = [
             'chestnut',
             'plant',
         ],
+        name: 'chestnut',
     },
     {
         code: '🍞',
@@ -3784,6 +4172,7 @@ const emojis = [
             'bread',
             'loaf',
         ],
+        name: 'bread',
     },
     {
         code: '🥐',
@@ -3793,6 +4182,7 @@ const emojis = [
             'croissant',
             'french',
         ],
+        name: 'croissant',
     },
     {
         code: '🥖',
@@ -3801,6 +4191,7 @@ const emojis = [
             'bread',
             'french',
         ],
+        name: 'baguette_bread',
     },
     {
         code: '🥞',
@@ -3809,12 +4200,14 @@ const emojis = [
             'hotcake',
             'pancake',
         ],
+        name: 'pancakes',
     },
     {
         code: '🧀',
         keywords: [
             'cheese',
         ],
+        name: 'cheese',
     },
     {
         code: '🍖',
@@ -3822,6 +4215,7 @@ const emojis = [
             'bone',
             'meat',
         ],
+        name: 'meat_on_bone',
     },
     {
         code: '🍗',
@@ -3831,6 +4225,7 @@ const emojis = [
             'leg',
             'poultry',
         ],
+        name: 'poultry_leg',
     },
     {
         code: '🥓',
@@ -3838,6 +4233,7 @@ const emojis = [
             'bacon',
             'meat',
         ],
+        name: 'bacon',
     },
     {
         code: '🍔',
@@ -3845,6 +4241,7 @@ const emojis = [
             'burger',
             'hamburger',
         ],
+        name: 'hamburger',
     },
     {
         code: '🍟',
@@ -3852,6 +4249,7 @@ const emojis = [
             'french',
             'fries',
         ],
+        name: 'fries',
     },
     {
         code: '🍕',
@@ -3860,6 +4258,7 @@ const emojis = [
             'pizza',
             'slice',
         ],
+        name: 'pizza',
     },
     {
         code: '🌭',
@@ -3869,6 +4268,7 @@ const emojis = [
             'hotdog',
             'sausage',
         ],
+        name: 'hotdog',
     },
     {
         code: '🌮',
@@ -3876,6 +4276,7 @@ const emojis = [
             'mexican',
             'taco',
         ],
+        name: 'taco',
     },
     {
         code: '🌯',
@@ -3883,6 +4284,7 @@ const emojis = [
             'burrito',
             'mexican',
         ],
+        name: 'burrito',
     },
     {
         code: '🥙',
@@ -3893,12 +4295,14 @@ const emojis = [
             'kebab',
             'stuffed',
         ],
+        name: 'stuffed_flatbread',
     },
     {
         code: '🥚',
         keywords: [
             'egg',
         ],
+        name: 'egg',
     },
     {
         code: '🍳',
@@ -3908,6 +4312,7 @@ const emojis = [
             'frying',
             'pan',
         ],
+        name: 'fried_egg',
     },
     {
         code: '🥘',
@@ -3917,6 +4322,7 @@ const emojis = [
             'pan',
             'shallow',
         ],
+        name: 'shallow_pan_of_food',
     },
     {
         code: '🍲',
@@ -3924,6 +4330,7 @@ const emojis = [
             'pot',
             'stew',
         ],
+        name: 'stew',
     },
     {
         code: '🥗',
@@ -3931,12 +4338,14 @@ const emojis = [
             'green',
             'salad',
         ],
+        name: 'green_salad',
     },
     {
         code: '🍿',
         keywords: [
             'popcorn',
         ],
+        name: 'popcorn',
     },
     {
         code: '🍱',
@@ -3944,6 +4353,7 @@ const emojis = [
             'bento',
             'box',
         ],
+        name: 'bento',
     },
     {
         code: '🍘',
@@ -3951,6 +4361,7 @@ const emojis = [
             'cracker',
             'rice',
         ],
+        name: 'rice_cracker',
     },
     {
         code: '🍙',
@@ -3959,6 +4370,7 @@ const emojis = [
             'japanese',
             'rice',
         ],
+        name: 'rice_ball',
     },
     {
         code: '🍚',
@@ -3966,6 +4378,7 @@ const emojis = [
             'cooked',
             'rice',
         ],
+        name: 'rice',
     },
     {
         code: '🍛',
@@ -3973,6 +4386,7 @@ const emojis = [
             'curry',
             'rice',
         ],
+        name: 'curry',
     },
     {
         code: '🍜',
@@ -3982,6 +4396,7 @@ const emojis = [
             'ramen',
             'steaming',
         ],
+        name: 'ramen',
     },
     {
         code: '🍝',
@@ -3989,6 +4404,7 @@ const emojis = [
             'pasta',
             'spaghetti',
         ],
+        name: 'spaghetti',
     },
     {
         code: '🍠',
@@ -3997,6 +4413,7 @@ const emojis = [
             'roasted',
             'sweet',
         ],
+        name: 'sweet_potato',
     },
     {
         code: '🍢',
@@ -4007,12 +4424,14 @@ const emojis = [
             'skewer',
             'stick',
         ],
+        name: 'oden',
     },
     {
         code: '🍣',
         keywords: [
             'sushi',
         ],
+        name: 'sushi',
     },
     {
         code: '🍤',
@@ -4022,6 +4441,7 @@ const emojis = [
             'shrimp',
             'tempura',
         ],
+        name: 'fried_shrimp',
     },
     {
         code: '🍥',
@@ -4031,6 +4451,7 @@ const emojis = [
             'pastry',
             'swirl',
         ],
+        name: 'fish_cake',
     },
     {
         code: '🍡',
@@ -4042,6 +4463,7 @@ const emojis = [
             'stick',
             'sweet',
         ],
+        name: 'dango',
     },
     {
         code: '🍦',
@@ -4053,6 +4475,7 @@ const emojis = [
             'soft',
             'sweet',
         ],
+        name: 'icecream',
     },
     {
         code: '🍧',
@@ -4062,6 +4485,7 @@ const emojis = [
             'shaved',
             'sweet',
         ],
+        name: 'shaved_ice',
     },
     {
         code: '🍨',
@@ -4071,6 +4495,7 @@ const emojis = [
             'ice',
             'sweet',
         ],
+        name: 'ice_cream',
     },
     {
         code: '🍩',
@@ -4080,6 +4505,7 @@ const emojis = [
             'doughnut',
             'sweet',
         ],
+        name: 'doughnut',
     },
     {
         code: '🍪',
@@ -4088,6 +4514,7 @@ const emojis = [
             'dessert',
             'sweet',
         ],
+        name: 'cookie',
     },
     {
         code: '🎂',
@@ -4099,6 +4526,7 @@ const emojis = [
             'pastry',
             'sweet',
         ],
+        name: 'birthday',
     },
     {
         code: '🍰',
@@ -4110,6 +4538,7 @@ const emojis = [
             'slice',
             'sweet',
         ],
+        name: 'cake',
     },
     {
         code: '🍫',
@@ -4119,6 +4548,7 @@ const emojis = [
             'dessert',
             'sweet',
         ],
+        name: 'chocolate_bar',
     },
     {
         code: '🍬',
@@ -4127,6 +4557,7 @@ const emojis = [
             'dessert',
             'sweet',
         ],
+        name: 'candy',
     },
     {
         code: '🍭',
@@ -4136,6 +4567,7 @@ const emojis = [
             'lollipop',
             'sweet',
         ],
+        name: 'lollipop',
     },
     {
         code: '🍮',
@@ -4145,6 +4577,7 @@ const emojis = [
             'pudding',
             'sweet',
         ],
+        name: 'custard',
     },
     {
         code: '🍯',
@@ -4154,6 +4587,7 @@ const emojis = [
             'pot',
             'sweet',
         ],
+        name: 'honey_pot',
     },
     {
         code: '🍼',
@@ -4163,6 +4597,7 @@ const emojis = [
             'drink',
             'milk',
         ],
+        name: 'baby_bottle',
     },
     {
         code: '🥛',
@@ -4171,6 +4606,7 @@ const emojis = [
             'glass',
             'milk',
         ],
+        name: 'milk_glass',
     },
     {
         code: '☕',
@@ -4182,6 +4618,7 @@ const emojis = [
             'steaming',
             'tea',
         ],
+        name: 'coffee',
     },
     {
         code: '🍵',
@@ -4192,6 +4629,7 @@ const emojis = [
             'tea',
             'teacup',
         ],
+        name: 'tea',
     },
     {
         code: '🍶',
@@ -4203,6 +4641,7 @@ const emojis = [
             'drink',
             'sake',
         ],
+        name: 'sake',
     },
     {
         code: '🍾',
@@ -4213,6 +4652,7 @@ const emojis = [
             'drink',
             'popping',
         ],
+        name: 'champagne',
     },
     {
         code: '🍷',
@@ -4223,6 +4663,7 @@ const emojis = [
             'glass',
             'wine',
         ],
+        name: 'wine_glass',
     },
     {
         code: '🍸',
@@ -4232,6 +4673,7 @@ const emojis = [
             'drink',
             'glass',
         ],
+        name: 'cocktail',
     },
     {
         code: '🍹',
@@ -4240,6 +4682,7 @@ const emojis = [
             'drink',
             'tropical',
         ],
+        name: 'tropical_drink',
     },
     {
         code: '🍺',
@@ -4249,6 +4692,7 @@ const emojis = [
             'drink',
             'mug',
         ],
+        name: 'beer',
     },
     {
         code: '🍻',
@@ -4259,6 +4703,7 @@ const emojis = [
             'drink',
             'mug',
         ],
+        name: 'beers',
     },
     {
         code: '🥂',
@@ -4268,6 +4713,7 @@ const emojis = [
             'drink',
             'glass',
         ],
+        name: 'clinking_glasses',
     },
     {
         code: '🥃',
@@ -4278,6 +4724,7 @@ const emojis = [
             'tumbler',
             'whisky',
         ],
+        name: 'tumbler_glass',
     },
     {
         code: '🍽',
@@ -4287,6 +4734,7 @@ const emojis = [
             'knife',
             'plate',
         ],
+        name: 'plate_with_cutlery',
     },
     {
         code: '🍴',
@@ -4295,6 +4743,7 @@ const emojis = [
             'fork',
             'knife',
         ],
+        name: 'fork_and_knife',
     },
     {
         code: '🥄',
@@ -4302,6 +4751,7 @@ const emojis = [
             'spoon',
             'tableware',
         ],
+        name: 'spoon',
     },
     {
         code: '🔪',
@@ -4312,6 +4762,7 @@ const emojis = [
             'tool',
             'weapon',
         ],
+        name: 'hocho',
     },
     {
         code: '🏺',
@@ -4325,6 +4776,7 @@ const emojis = [
             'weapon',
             'zodiac',
         ],
+        name: 'amphora',
     },
     {
         code: 'travelAndPlaces',
@@ -4339,6 +4791,7 @@ const emojis = [
             'globe',
             'world',
         ],
+        name: 'earth_africa',
     },
     {
         code: '🌎',
@@ -4348,6 +4801,7 @@ const emojis = [
             'globe',
             'world',
         ],
+        name: 'earth_americas',
     },
     {
         code: '🌏',
@@ -4358,6 +4812,7 @@ const emojis = [
             'globe',
             'world',
         ],
+        name: 'earth_asia',
     },
     {
         code: '🌐',
@@ -4367,6 +4822,7 @@ const emojis = [
             'meridians',
             'world',
         ],
+        name: 'globe_with_meridians',
     },
     {
         code: '🗺',
@@ -4374,6 +4830,7 @@ const emojis = [
             'map',
             'world',
         ],
+        name: 'world_map',
     },
     {
         code: '🗾',
@@ -4381,6 +4838,7 @@ const emojis = [
             'japan',
             'map',
         ],
+        name: 'japan',
     },
     {
         code: '🏔',
@@ -4389,12 +4847,14 @@ const emojis = [
             'mountain',
             'snow',
         ],
+        name: 'mountain_snow',
     },
     {
         code: '⛰',
         keywords: [
             'mountain',
         ],
+        name: 'mountain',
     },
     {
         code: '🌋',
@@ -4404,6 +4864,7 @@ const emojis = [
             'volcano',
             'weather',
         ],
+        name: 'volcano',
     },
     {
         code: '🗻',
@@ -4411,12 +4872,14 @@ const emojis = [
             'fuji',
             'mountain',
         ],
+        name: 'mount_fuji',
     },
     {
         code: '🏕',
         keywords: [
             'camping',
         ],
+        name: 'camping',
     },
     {
         code: '🏖',
@@ -4424,12 +4887,14 @@ const emojis = [
             'beach',
             'umbrella',
         ],
+        name: 'beach_umbrella',
     },
     {
         code: '🏜',
         keywords: [
             'desert',
         ],
+        name: 'desert',
     },
     {
         code: '🏝',
@@ -4437,6 +4902,7 @@ const emojis = [
             'desert',
             'island',
         ],
+        name: 'desert_island',
     },
     {
         code: '🏞',
@@ -4444,12 +4910,14 @@ const emojis = [
             'national park',
             'park',
         ],
+        name: 'national_park',
     },
     {
         code: '🏟',
         keywords: [
             'stadium',
         ],
+        name: 'stadium',
     },
     {
         code: '🏛',
@@ -4457,6 +4925,7 @@ const emojis = [
             'building',
             'classical',
         ],
+        name: 'classical_building',
     },
     {
         code: '🏗',
@@ -4464,6 +4933,7 @@ const emojis = [
             'building',
             'construction',
         ],
+        name: 'building_construction',
     },
     {
         code: '🏘',
@@ -4471,6 +4941,7 @@ const emojis = [
             'building',
             'house',
         ],
+        name: 'houses',
     },
     {
         code: '🏙',
@@ -4478,6 +4949,7 @@ const emojis = [
             'building',
             'city',
         ],
+        name: 'cityscape',
     },
     {
         code: '🏚',
@@ -4486,6 +4958,7 @@ const emojis = [
             'derelict',
             'house',
         ],
+        name: 'derelict_house',
     },
     {
         code: '🏠',
@@ -4494,6 +4967,7 @@ const emojis = [
             'home',
             'house',
         ],
+        name: 'house',
     },
     {
         code: '🏡',
@@ -4503,12 +4977,14 @@ const emojis = [
             'home',
             'house',
         ],
+        name: 'house_with_garden',
     },
     {
         code: '🏢',
         keywords: [
             'building',
         ],
+        name: 'office',
     },
     {
         code: '🏣',
@@ -4517,6 +4993,7 @@ const emojis = [
             'japanese',
             'post',
         ],
+        name: 'post_office',
     },
     {
         code: '🏤',
@@ -4525,6 +5002,7 @@ const emojis = [
             'european',
             'post',
         ],
+        name: 'european_post_office',
     },
     {
         code: '🏥',
@@ -4534,6 +5012,7 @@ const emojis = [
             'hospital',
             'medicine',
         ],
+        name: 'hospital',
     },
     {
         code: '🏦',
@@ -4541,6 +5020,7 @@ const emojis = [
             'bank',
             'building',
         ],
+        name: 'bank',
     },
     {
         code: '🏨',
@@ -4548,6 +5028,7 @@ const emojis = [
             'building',
             'hotel',
         ],
+        name: 'hotel',
     },
     {
         code: '🏩',
@@ -4556,6 +5037,7 @@ const emojis = [
             'hotel',
             'love',
         ],
+        name: 'love_hotel',
     },
     {
         code: '🏪',
@@ -4564,6 +5046,7 @@ const emojis = [
             'convenience',
             'store',
         ],
+        name: 'convenience_store',
     },
     {
         code: '🏫',
@@ -4571,6 +5054,7 @@ const emojis = [
             'building',
             'school',
         ],
+        name: 'school',
     },
     {
         code: '🏬',
@@ -4579,6 +5063,7 @@ const emojis = [
             'department',
             'store',
         ],
+        name: 'department_store',
     },
     {
         code: '🏭',
@@ -4586,6 +5071,7 @@ const emojis = [
             'building',
             'factory',
         ],
+        name: 'factory',
     },
     {
         code: '🏯',
@@ -4594,6 +5080,7 @@ const emojis = [
             'castle',
             'japanese',
         ],
+        name: 'japanese_castle',
     },
     {
         code: '🏰',
@@ -4602,6 +5089,7 @@ const emojis = [
             'castle',
             'european',
         ],
+        name: 'european_castle',
     },
     {
         code: '💒',
@@ -4611,6 +5099,7 @@ const emojis = [
             'romance',
             'wedding',
         ],
+        name: 'wedding',
     },
     {
         code: '🗼',
@@ -4618,6 +5107,7 @@ const emojis = [
             'tokyo',
             'tower',
         ],
+        name: 'tokyo_tower',
     },
     {
         code: '🗽',
@@ -4625,6 +5115,7 @@ const emojis = [
             'liberty',
             'statue',
         ],
+        name: 'statue_of_liberty',
     },
     {
         code: '⛪',
@@ -4635,6 +5126,7 @@ const emojis = [
             'cross',
             'religion',
         ],
+        name: 'church',
     },
     {
         code: '🕌',
@@ -4644,6 +5136,7 @@ const emojis = [
             'muslim',
             'religion',
         ],
+        name: 'mosque',
     },
     {
         code: '🕍',
@@ -4654,6 +5147,7 @@ const emojis = [
             'synagogue',
             'temple',
         ],
+        name: 'synagogue',
     },
     {
         code: '⛩',
@@ -4662,6 +5156,7 @@ const emojis = [
             'shinto',
             'shrine',
         ],
+        name: 'shinto_shrine',
     },
     {
         code: '🕋',
@@ -4671,12 +5166,14 @@ const emojis = [
             'muslim',
             'religion',
         ],
+        name: 'kaaba',
     },
     {
         code: '⛲',
         keywords: [
             'fountain',
         ],
+        name: 'fountain',
     },
     {
         code: '⛺',
@@ -4684,6 +5181,7 @@ const emojis = [
             'camping',
             'tent',
         ],
+        name: 'tent',
     },
     {
         code: '🌁',
@@ -4691,6 +5189,7 @@ const emojis = [
             'fog',
             'weather',
         ],
+        name: 'foggy',
     },
     {
         code: '🌃',
@@ -4699,6 +5198,7 @@ const emojis = [
             'star',
             'weather',
         ],
+        name: 'night_with_stars',
     },
     {
         code: '🌄',
@@ -4709,6 +5209,7 @@ const emojis = [
             'sunrise',
             'weather',
         ],
+        name: 'sunrise_over_mountains',
     },
     {
         code: '🌅',
@@ -4718,6 +5219,7 @@ const emojis = [
             'sunrise',
             'weather',
         ],
+        name: 'sunrise',
     },
     {
         code: '🌆',
@@ -4731,6 +5233,7 @@ const emojis = [
             'sunset',
             'weather',
         ],
+        name: 'city_sunset',
     },
     {
         code: '🌇',
@@ -4741,6 +5244,7 @@ const emojis = [
             'sunset',
             'weather',
         ],
+        name: 'city_sunrise',
     },
     {
         code: '🌉',
@@ -4749,6 +5253,7 @@ const emojis = [
             'night',
             'weather',
         ],
+        name: 'bridge_at_night',
     },
     {
         code: '♨️',
@@ -4758,6 +5263,7 @@ const emojis = [
             'springs',
             'steaming',
         ],
+        name: 'hotsprings',
     },
     {
         code: '🌌',
@@ -4766,6 +5272,7 @@ const emojis = [
             'space',
             'weather',
         ],
+        name: 'milky_way',
     },
     {
         code: '🎠',
@@ -4775,6 +5282,7 @@ const emojis = [
             'entertainment',
             'horse',
         ],
+        name: 'carousel_horse',
     },
     {
         code: '🎡',
@@ -4785,6 +5293,7 @@ const emojis = [
             'ferris',
             'wheel',
         ],
+        name: 'ferris_wheel',
     },
     {
         code: '🎢',
@@ -4795,6 +5304,7 @@ const emojis = [
             'entertainment',
             'roller',
         ],
+        name: 'roller_coaster',
     },
     {
         code: '💈',
@@ -4803,6 +5313,7 @@ const emojis = [
             'haircut',
             'pole',
         ],
+        name: 'barber',
     },
     {
         code: '🎪',
@@ -4812,6 +5323,7 @@ const emojis = [
             'entertainment',
             'tent',
         ],
+        name: 'circus_tent',
     },
     {
         code: '🎭',
@@ -4824,6 +5336,7 @@ const emojis = [
             'theater',
             'theatre',
         ],
+        name: 'performing_arts',
     },
     {
         code: '🖼',
@@ -4834,6 +5347,7 @@ const emojis = [
             'painting',
             'picture',
         ],
+        name: 'framed_picture',
     },
     {
         code: '🎨',
@@ -4845,6 +5359,7 @@ const emojis = [
             'painting',
             'palette',
         ],
+        name: 'art',
     },
     {
         code: '🎰',
@@ -4853,6 +5368,7 @@ const emojis = [
             'game',
             'slot',
         ],
+        name: 'slot_machine',
     },
     {
         code: '🚂',
@@ -4864,6 +5380,7 @@ const emojis = [
             'train',
             'vehicle',
         ],
+        name: 'steam_locomotive',
     },
     {
         code: '🚃',
@@ -4876,6 +5393,7 @@ const emojis = [
             'trolleybus',
             'vehicle',
         ],
+        name: 'railway_car',
     },
     {
         code: '🚄',
@@ -4886,6 +5404,7 @@ const emojis = [
             'train',
             'vehicle',
         ],
+        name: 'bullettrain_side',
     },
     {
         code: '🚅',
@@ -4897,6 +5416,7 @@ const emojis = [
             'train',
             'vehicle',
         ],
+        name: 'bullettrain_front',
     },
     {
         code: '🚆',
@@ -4905,6 +5425,7 @@ const emojis = [
             'train',
             'vehicle',
         ],
+        name: 'train2',
     },
     {
         code: '🚇',
@@ -4913,6 +5434,7 @@ const emojis = [
             'subway',
             'vehicle',
         ],
+        name: 'metro',
     },
     {
         code: '🚈',
@@ -4920,6 +5442,7 @@ const emojis = [
             'railway',
             'vehicle',
         ],
+        name: 'light_rail',
     },
     {
         code: '🚉',
@@ -4929,6 +5452,7 @@ const emojis = [
             'train',
             'vehicle',
         ],
+        name: 'station',
     },
     {
         code: '🚊',
@@ -4937,6 +5461,7 @@ const emojis = [
             'trolleybus',
             'vehicle',
         ],
+        name: 'tram',
     },
     {
         code: '🚝',
@@ -4944,6 +5469,7 @@ const emojis = [
             'monorail',
             'vehicle',
         ],
+        name: 'monorail',
     },
     {
         code: '🚞',
@@ -4953,6 +5479,7 @@ const emojis = [
             'railway',
             'vehicle',
         ],
+        name: 'mountain_railway',
     },
     {
         code: '🚋',
@@ -4962,6 +5489,7 @@ const emojis = [
             'trolleybus',
             'vehicle',
         ],
+        name: 'train',
     },
     {
         code: '🚌',
@@ -4969,6 +5497,7 @@ const emojis = [
             'bus',
             'vehicle',
         ],
+        name: 'bus',
     },
     {
         code: '🚍',
@@ -4977,6 +5506,7 @@ const emojis = [
             'oncoming',
             'vehicle',
         ],
+        name: 'oncoming_bus',
     },
     {
         code: '🚎',
@@ -4987,6 +5517,7 @@ const emojis = [
             'trolleybus',
             'vehicle',
         ],
+        name: 'trolleybus',
     },
     {
         code: '🚏',
@@ -4995,6 +5526,7 @@ const emojis = [
             'busstop',
             'stop',
         ],
+        name: 'busstop',
     },
     {
         code: '🚐',
@@ -5003,6 +5535,7 @@ const emojis = [
             'minibus',
             'vehicle',
         ],
+        name: 'minibus',
     },
     {
         code: '🚑',
@@ -5010,6 +5543,7 @@ const emojis = [
             'ambulance',
             'vehicle',
         ],
+        name: 'ambulance',
     },
     {
         code: '🚒',
@@ -5019,6 +5553,7 @@ const emojis = [
             'truck',
             'vehicle',
         ],
+        name: 'fire_engine',
     },
     {
         code: '🚓',
@@ -5028,6 +5563,7 @@ const emojis = [
             'police',
             'vehicle',
         ],
+        name: 'police_car',
     },
     {
         code: '🚔',
@@ -5037,6 +5573,7 @@ const emojis = [
             'police',
             'vehicle',
         ],
+        name: 'oncoming_police_car',
     },
     {
         code: '🚕',
@@ -5044,6 +5581,7 @@ const emojis = [
             'taxi',
             'vehicle',
         ],
+        name: 'taxi',
     },
     {
         code: '🚖',
@@ -5052,6 +5590,7 @@ const emojis = [
             'taxi',
             'vehicle',
         ],
+        name: 'oncoming_taxi',
     },
     {
         code: '🚗',
@@ -5060,6 +5599,7 @@ const emojis = [
             'car',
             'vehicle',
         ],
+        name: 'car',
     },
     {
         code: '🚘',
@@ -5069,6 +5609,7 @@ const emojis = [
             'oncoming',
             'vehicle',
         ],
+        name: 'oncoming_automobile',
     },
     {
         code: '🚙',
@@ -5077,6 +5618,7 @@ const emojis = [
             'rv',
             'vehicle',
         ],
+        name: 'blue_car',
     },
     {
         code: '🚚',
@@ -5085,6 +5627,7 @@ const emojis = [
             'truck',
             'vehicle',
         ],
+        name: 'truck',
     },
     {
         code: '🚛',
@@ -5094,6 +5637,7 @@ const emojis = [
             'truck',
             'vehicle',
         ],
+        name: 'articulated_lorry',
     },
     {
         code: '🚜',
@@ -5101,6 +5645,7 @@ const emojis = [
             'tractor',
             'vehicle',
         ],
+        name: 'tractor',
     },
     {
         code: '🚲',
@@ -5109,6 +5654,7 @@ const emojis = [
             'bike',
             'vehicle',
         ],
+        name: 'bike',
     },
     {
         code: '⛽',
@@ -5119,6 +5665,7 @@ const emojis = [
             'pump',
             'station',
         ],
+        name: 'fuelpump',
     },
     {
         code: '🛣',
@@ -5127,6 +5674,7 @@ const emojis = [
             'motorway',
             'road',
         ],
+        name: 'motorway',
     },
     {
         code: '🛤',
@@ -5134,6 +5682,7 @@ const emojis = [
             'railway',
             'train',
         ],
+        name: 'railway_track',
     },
     {
         code: '🚨',
@@ -5145,6 +5694,7 @@ const emojis = [
             'revolving',
             'vehicle',
         ],
+        name: 'rotating_light',
     },
     {
         code: '🚥',
@@ -5153,6 +5703,7 @@ const emojis = [
             'signal',
             'traffic',
         ],
+        name: 'traffic_light',
     },
     {
         code: '🚦',
@@ -5161,6 +5712,7 @@ const emojis = [
             'signal',
             'traffic',
         ],
+        name: 'vertical_traffic_light',
     },
     {
         code: '🚧',
@@ -5168,6 +5720,7 @@ const emojis = [
             'barrier',
             'construction',
         ],
+        name: 'construction',
     },
     {
         code: '🛑',
@@ -5175,6 +5728,7 @@ const emojis = [
             'octagonal',
             'stop',
         ],
+        name: 'stop_sign',
     },
     {
         code: '🛴',
@@ -5182,6 +5736,7 @@ const emojis = [
             'kick',
             'scooter',
         ],
+        name: 'kick_scooter',
     },
     {
         code: '🛵',
@@ -5189,6 +5744,7 @@ const emojis = [
             'motor',
             'scooter',
         ],
+        name: 'motor_scooter',
     },
     {
         code: '⚓',
@@ -5197,6 +5753,7 @@ const emojis = [
             'ship',
             'tool',
         ],
+        name: 'anchor',
     },
     {
         code: '⛵',
@@ -5208,6 +5765,7 @@ const emojis = [
             'vehicle',
             'yacht',
         ],
+        name: 'boat',
     },
     {
         code: '🚣',
@@ -5223,6 +5781,7 @@ const emojis = [
             '🚣🏼',
             '🚣🏻',
         ],
+        name: 'rowboat',
     },
     {
         code: '🛶',
@@ -5230,6 +5789,7 @@ const emojis = [
             'boat',
             'canoe',
         ],
+        name: 'canoe',
     },
     {
         code: '🚤',
@@ -5238,6 +5798,7 @@ const emojis = [
             'speedboat',
             'vehicle',
         ],
+        name: 'speedboat',
     },
     {
         code: '🛳',
@@ -5246,6 +5807,7 @@ const emojis = [
             'ship',
             'vehicle',
         ],
+        name: 'passenger_ship',
     },
     {
         code: '⛴',
@@ -5253,6 +5815,7 @@ const emojis = [
             'boat',
             'ferry',
         ],
+        name: 'ferry',
     },
     {
         code: '🛥',
@@ -5261,6 +5824,7 @@ const emojis = [
             'motorboat',
             'vehicle',
         ],
+        name: 'motor_boat',
     },
     {
         code: '🚢',
@@ -5268,6 +5832,7 @@ const emojis = [
             'ship',
             'vehicle',
         ],
+        name: 'ship',
     },
     {
         code: '✈️',
@@ -5275,6 +5840,7 @@ const emojis = [
             'airplane',
             'vehicle',
         ],
+        name: 'airplane',
     },
     {
         code: '🛩',
@@ -5282,6 +5848,7 @@ const emojis = [
             'airplane',
             'vehicle',
         ],
+        name: 'small_airplane',
     },
     {
         code: '🛫',
@@ -5292,6 +5859,7 @@ const emojis = [
             'departures',
             'vehicle',
         ],
+        name: 'flight_departure',
     },
     {
         code: '🛬',
@@ -5302,6 +5870,7 @@ const emojis = [
             'landing',
             'vehicle',
         ],
+        name: 'flight_arrival',
     },
     {
         code: '💺',
@@ -5309,6 +5878,7 @@ const emojis = [
             'chair',
             'seat',
         ],
+        name: 'seat',
     },
     {
         code: '🚁',
@@ -5316,6 +5886,7 @@ const emojis = [
             'helicopter',
             'vehicle',
         ],
+        name: 'helicopter',
     },
     {
         code: '🚟',
@@ -5324,6 +5895,7 @@ const emojis = [
             'suspension',
             'vehicle',
         ],
+        name: 'suspension_railway',
     },
     {
         code: '🚠',
@@ -5333,6 +5905,7 @@ const emojis = [
             'mountain',
             'vehicle',
         ],
+        name: 'mountain_cableway',
     },
     {
         code: '🚡',
@@ -5345,6 +5918,7 @@ const emojis = [
             'tramway',
             'vehicle',
         ],
+        name: 'aerial_tramway',
     },
     {
         code: '🚀',
@@ -5353,6 +5927,7 @@ const emojis = [
             'space',
             'vehicle',
         ],
+        name: 'rocket',
     },
     {
         code: '🛰',
@@ -5361,6 +5936,7 @@ const emojis = [
             'space',
             'vehicle',
         ],
+        name: 'artificial_satellite',
     },
     {
         code: '🛎',
@@ -5369,12 +5945,14 @@ const emojis = [
             'bellhop',
             'hotel',
         ],
+        name: 'bellhop_bell',
     },
     {
         code: '🚪',
         keywords: [
             'door',
         ],
+        name: 'door',
     },
     {
         code: '🛌',
@@ -5382,6 +5960,7 @@ const emojis = [
             'hotel',
             'sleep',
         ],
+        name: 'sleeping_bed',
     },
     {
         code: '🛏',
@@ -5390,6 +5969,7 @@ const emojis = [
             'hotel',
             'sleep',
         ],
+        name: 'bed',
     },
     {
         code: '🛋',
@@ -5398,12 +5978,14 @@ const emojis = [
             'hotel',
             'lamp',
         ],
+        name: 'couch_and_lamp',
     },
     {
         code: '🚽',
         keywords: [
             'toilet',
         ],
+        name: 'toilet',
     },
     {
         code: '🚿',
@@ -5411,6 +5993,7 @@ const emojis = [
             'shower',
             'water',
         ],
+        name: 'shower',
     },
     {
         code: '🛀',
@@ -5425,6 +6008,7 @@ const emojis = [
             '🛀🏼',
             '🛀🏻',
         ],
+        name: 'bath',
     },
     {
         code: '🛁',
@@ -5432,6 +6016,7 @@ const emojis = [
             'bath',
             'bathtub',
         ],
+        name: 'bathtub',
     },
     {
         code: '⌛',
@@ -5440,6 +6025,7 @@ const emojis = [
             'sand',
             'timer',
         ],
+        name: 'hourglass',
     },
     {
         code: '⏳',
@@ -5448,6 +6034,7 @@ const emojis = [
             'sand',
             'timer',
         ],
+        name: 'hourglass_flowing_sand',
     },
     {
         code: '⌚',
@@ -5455,6 +6042,7 @@ const emojis = [
             'clock',
             'watch',
         ],
+        name: 'watch',
     },
     {
         code: '⏰',
@@ -5462,6 +6050,7 @@ const emojis = [
             'alarm',
             'clock',
         ],
+        name: 'alarm_clock',
     },
     {
         code: '⏱',
@@ -5469,6 +6058,7 @@ const emojis = [
             'clock',
             'stopwatch',
         ],
+        name: 'stopwatch',
     },
     {
         code: '⏲',
@@ -5476,12 +6066,14 @@ const emojis = [
             'clock',
             'timer',
         ],
+        name: 'timer_clock',
     },
     {
         code: '🕰',
         keywords: [
             'clock',
         ],
+        name: 'mantelpiece_clock',
     },
     {
         code: '🕛',
@@ -5493,6 +6085,7 @@ const emojis = [
             'o’clock',
             'twelve',
         ],
+        name: 'clock12',
     },
     {
         code: '🕧',
@@ -5504,6 +6097,7 @@ const emojis = [
             'thirty',
             'twelve',
         ],
+        name: 'clock1230',
     },
     {
         code: '🕐',
@@ -5515,6 +6109,7 @@ const emojis = [
             'o’clock',
             'one',
         ],
+        name: 'clock1',
     },
     {
         code: '🕜',
@@ -5526,6 +6121,7 @@ const emojis = [
             'one',
             'thirty',
         ],
+        name: 'clock130',
     },
     {
         code: '🕑',
@@ -5537,6 +6133,7 @@ const emojis = [
             'o’clock',
             'two',
         ],
+        name: 'clock2',
     },
     {
         code: '🕝',
@@ -5548,6 +6145,7 @@ const emojis = [
             'thirty',
             'two',
         ],
+        name: 'clock230',
     },
     {
         code: '🕒',
@@ -5559,6 +6157,7 @@ const emojis = [
             'o’clock',
             'three',
         ],
+        name: 'clock3',
     },
     {
         code: '🕞',
@@ -5570,6 +6169,7 @@ const emojis = [
             'thirty',
             'three',
         ],
+        name: 'clock330',
     },
     {
         code: '🕓',
@@ -5581,6 +6181,7 @@ const emojis = [
             'four',
             'o’clock',
         ],
+        name: 'clock4',
     },
     {
         code: '🕟',
@@ -5592,6 +6193,7 @@ const emojis = [
             'four',
             'thirty',
         ],
+        name: 'clock430',
     },
     {
         code: '🕔',
@@ -5603,6 +6205,7 @@ const emojis = [
             'five',
             'o’clock',
         ],
+        name: 'clock5',
     },
     {
         code: '🕠',
@@ -5614,6 +6217,7 @@ const emojis = [
             'five',
             'thirty',
         ],
+        name: 'clock530',
     },
     {
         code: '🕕',
@@ -5625,6 +6229,7 @@ const emojis = [
             'o’clock',
             'six',
         ],
+        name: 'clock6',
     },
     {
         code: '🕡',
@@ -5636,6 +6241,7 @@ const emojis = [
             'six',
             'thirty',
         ],
+        name: 'clock630',
     },
     {
         code: '🕖',
@@ -5647,6 +6253,7 @@ const emojis = [
             'o’clock',
             'seven',
         ],
+        name: 'clock7',
     },
     {
         code: '🕢',
@@ -5658,6 +6265,7 @@ const emojis = [
             'seven',
             'thirty',
         ],
+        name: 'clock730',
     },
     {
         code: '🕗',
@@ -5669,6 +6277,7 @@ const emojis = [
             'eight',
             'o’clock',
         ],
+        name: 'clock8',
     },
     {
         code: '🕣',
@@ -5680,6 +6289,7 @@ const emojis = [
             'eight',
             'thirty',
         ],
+        name: 'clock830',
     },
     {
         code: '🕘',
@@ -5691,6 +6301,7 @@ const emojis = [
             'nine',
             'o’clock',
         ],
+        name: 'clock9',
     },
     {
         code: '🕤',
@@ -5702,6 +6313,7 @@ const emojis = [
             'nine',
             'thirty',
         ],
+        name: 'clock930',
     },
     {
         code: '🕙',
@@ -5713,6 +6325,7 @@ const emojis = [
             'o’clock',
             'ten',
         ],
+        name: 'clock10',
     },
     {
         code: '🕥',
@@ -5724,6 +6337,7 @@ const emojis = [
             'ten',
             'thirty',
         ],
+        name: 'clock1030',
     },
     {
         code: '🕚',
@@ -5735,6 +6349,7 @@ const emojis = [
             'eleven',
             'o’clock',
         ],
+        name: 'clock11',
     },
     {
         code: '🕦',
@@ -5746,6 +6361,7 @@ const emojis = [
             'eleven',
             'thirty',
         ],
+        name: 'clock1130',
     },
     {
         code: '🌑',
@@ -5755,6 +6371,7 @@ const emojis = [
             'space',
             'weather',
         ],
+        name: 'new_moon',
     },
     {
         code: '🌒',
@@ -5765,6 +6382,7 @@ const emojis = [
             'waxing',
             'weather',
         ],
+        name: 'waxing_crescent_moon',
     },
     {
         code: '🌓',
@@ -5774,6 +6392,7 @@ const emojis = [
             'space',
             'weather',
         ],
+        name: 'first_quarter_moon',
     },
     {
         code: '🌔',
@@ -5784,6 +6403,7 @@ const emojis = [
             'waxing',
             'weather',
         ],
+        name: 'moon',
     },
     {
         code: '🌕',
@@ -5793,6 +6413,7 @@ const emojis = [
             'space',
             'weather',
         ],
+        name: 'full_moon',
     },
     {
         code: '🌖',
@@ -5803,6 +6424,7 @@ const emojis = [
             'waning',
             'weather',
         ],
+        name: 'waning_gibbous_moon',
     },
     {
         code: '🌗',
@@ -5812,6 +6434,7 @@ const emojis = [
             'space',
             'weather',
         ],
+        name: 'last_quarter_moon',
     },
     {
         code: '🌘',
@@ -5822,6 +6445,7 @@ const emojis = [
             'waning',
             'weather',
         ],
+        name: 'waning_crescent_moon',
     },
     {
         code: '🌙',
@@ -5831,6 +6455,7 @@ const emojis = [
             'space',
             'weather',
         ],
+        name: 'crescent_moon',
     },
     {
         code: '🌚',
@@ -5840,6 +6465,7 @@ const emojis = [
             'space',
             'weather',
         ],
+        name: 'new_moon_with_face',
     },
     {
         code: '🌛',
@@ -5850,6 +6476,7 @@ const emojis = [
             'space',
             'weather',
         ],
+        name: 'first_quarter_moon_with_face',
     },
     {
         code: '🌜',
@@ -5860,6 +6487,7 @@ const emojis = [
             'space',
             'weather',
         ],
+        name: 'last_quarter_moon_with_face',
     },
     {
         code: '🌡',
@@ -5867,6 +6495,7 @@ const emojis = [
             'thermometer',
             'weather',
         ],
+        name: 'thermometer',
     },
     {
         code: '☀️',
@@ -5878,6 +6507,7 @@ const emojis = [
             'sunny',
             'weather',
         ],
+        name: 'sunny',
     },
     {
         code: '🌝',
@@ -5889,6 +6519,7 @@ const emojis = [
             'space',
             'weather',
         ],
+        name: 'full_moon_with_face',
     },
     {
         code: '🌞',
@@ -5899,12 +6530,14 @@ const emojis = [
             'sun',
             'weather',
         ],
+        name: 'sun_with_face',
     },
     {
         code: '⭐',
         keywords: [
             'star',
         ],
+        name: 'star',
     },
     {
         code: '🌟',
@@ -5915,6 +6548,7 @@ const emojis = [
             'sparkle',
             'star',
         ],
+        name: 'star2',
     },
     {
         code: '🌠',
@@ -5925,6 +6559,7 @@ const emojis = [
             'space',
             'star',
         ],
+        name: 'stars',
     },
     {
         code: '☁️',
@@ -5932,6 +6567,7 @@ const emojis = [
             'cloud',
             'weather',
         ],
+        name: 'cloud',
     },
     {
         code: '⛅',
@@ -5940,6 +6576,7 @@ const emojis = [
             'sun',
             'weather',
         ],
+        name: 'partly_sunny',
     },
     {
         code: '⛈',
@@ -5949,6 +6586,7 @@ const emojis = [
             'thunder',
             'weather',
         ],
+        name: 'cloud_with_lightning_and_rain',
     },
     {
         code: '🌤',
@@ -5957,6 +6595,7 @@ const emojis = [
             'sun',
             'weather',
         ],
+        name: 'sun_behind_small_cloud',
     },
     {
         code: '🌥',
@@ -5965,6 +6604,7 @@ const emojis = [
             'sun',
             'weather',
         ],
+        name: 'sun_behind_large_cloud',
     },
     {
         code: '🌦',
@@ -5974,6 +6614,7 @@ const emojis = [
             'sun',
             'weather',
         ],
+        name: 'sun_behind_rain_cloud',
     },
     {
         code: '🌧',
@@ -5982,6 +6623,7 @@ const emojis = [
             'rain',
             'weather',
         ],
+        name: 'cloud_with_rain',
     },
     {
         code: '🌨',
@@ -5991,6 +6633,7 @@ const emojis = [
             'snow',
             'weather',
         ],
+        name: 'cloud_with_snow',
     },
     {
         code: '🌩',
@@ -5999,6 +6642,7 @@ const emojis = [
             'lightning',
             'weather',
         ],
+        name: 'cloud_with_lightning',
     },
     {
         code: '🌪',
@@ -6008,6 +6652,7 @@ const emojis = [
             'weather',
             'whirlwind',
         ],
+        name: 'tornado',
     },
     {
         code: '🌫',
@@ -6016,6 +6661,7 @@ const emojis = [
             'fog',
             'weather',
         ],
+        name: 'fog',
     },
     {
         code: '🌬',
@@ -6026,6 +6672,7 @@ const emojis = [
             'weather',
             'wind',
         ],
+        name: 'wind_face',
     },
     {
         code: '🌀',
@@ -6036,6 +6683,7 @@ const emojis = [
             'typhoon',
             'weather',
         ],
+        name: 'cyclone',
     },
     {
         code: '🌈',
@@ -6044,6 +6692,7 @@ const emojis = [
             'rainbow',
             'weather',
         ],
+        name: 'rainbow',
     },
     {
         code: '🌂',
@@ -6053,6 +6702,7 @@ const emojis = [
             'umbrella',
             'weather',
         ],
+        name: 'closed_umbrella',
     },
     {
         code: '☂️',
@@ -6062,6 +6712,7 @@ const emojis = [
             'umbrella',
             'weather',
         ],
+        name: 'open_umbrella',
     },
     {
         code: '☔',
@@ -6072,6 +6723,7 @@ const emojis = [
             'umbrella',
             'weather',
         ],
+        name: 'umbrella',
     },
     {
         code: '⛱',
@@ -6081,6 +6733,7 @@ const emojis = [
             'umbrella',
             'weather',
         ],
+        name: 'parasol_on_ground',
     },
     {
         code: '⚡',
@@ -6092,6 +6745,7 @@ const emojis = [
             'voltage',
             'zap',
         ],
+        name: 'zap',
     },
     {
         code: '❄️',
@@ -6101,6 +6755,7 @@ const emojis = [
             'snowflake',
             'weather',
         ],
+        name: 'snowflake',
     },
     {
         code: '☃️',
@@ -6110,6 +6765,7 @@ const emojis = [
             'snowman',
             'weather',
         ],
+        name: 'snowman_with_snow',
     },
     {
         code: '⛄',
@@ -6119,6 +6775,7 @@ const emojis = [
             'snowman',
             'weather',
         ],
+        name: 'snowman',
     },
     {
         code: '☄️',
@@ -6126,6 +6783,7 @@ const emojis = [
             'comet',
             'space',
         ],
+        name: 'comet',
     },
     {
         code: '🔥',
@@ -6134,6 +6792,7 @@ const emojis = [
             'flame',
             'tool',
         ],
+        name: 'fire',
     },
     {
         code: '💧',
@@ -6144,6 +6803,7 @@ const emojis = [
             'sweat',
             'weather',
         ],
+        name: 'droplet',
     },
     {
         code: '🌊',
@@ -6153,6 +6813,7 @@ const emojis = [
             'wave',
             'weather',
         ],
+        name: 'ocean',
     },
     {
         code: 'activities',
@@ -6168,6 +6829,7 @@ const emojis = [
             'jack',
             'lantern',
         ],
+        name: 'jack_o_lantern',
     },
     {
         code: '🎄',
@@ -6178,6 +6840,7 @@ const emojis = [
             'entertainment',
             'tree',
         ],
+        name: 'christmas_tree',
     },
     {
         code: '🎆',
@@ -6187,6 +6850,7 @@ const emojis = [
             'entertainment',
             'fireworks',
         ],
+        name: 'fireworks',
     },
     {
         code: '🎇',
@@ -6197,6 +6861,7 @@ const emojis = [
             'fireworks',
             'sparkle',
         ],
+        name: 'sparkler',
     },
     {
         code: '✨',
@@ -6205,6 +6870,7 @@ const emojis = [
             'sparkle',
             'star',
         ],
+        name: 'sparkles',
     },
     {
         code: '🎈',
@@ -6214,6 +6880,7 @@ const emojis = [
             'celebration',
             'entertainment',
         ],
+        name: 'balloon',
     },
     {
         code: '🎉',
@@ -6225,6 +6892,7 @@ const emojis = [
             'popper',
             'tada',
         ],
+        name: 'tada',
     },
     {
         code: '🎊',
@@ -6235,6 +6903,7 @@ const emojis = [
             'confetti',
             'entertainment',
         ],
+        name: 'confetti_ball',
     },
     {
         code: '🎋',
@@ -6246,6 +6915,7 @@ const emojis = [
             'japanese',
             'tree',
         ],
+        name: 'tanabata_tree',
     },
     {
         code: '🎍',
@@ -6257,6 +6927,7 @@ const emojis = [
             'pine',
             'plant',
         ],
+        name: 'bamboo',
     },
     {
         code: '🎎',
@@ -6268,6 +6939,7 @@ const emojis = [
             'festival',
             'japanese',
         ],
+        name: 'dolls',
     },
     {
         code: '🎏',
@@ -6279,6 +6951,7 @@ const emojis = [
             'flag',
             'streamer',
         ],
+        name: 'flags',
     },
     {
         code: '🎐',
@@ -6290,6 +6963,7 @@ const emojis = [
             'entertainment',
             'wind',
         ],
+        name: 'wind_chime',
     },
     {
         code: '🎑',
@@ -6300,6 +6974,7 @@ const emojis = [
             'entertainment',
             'moon',
         ],
+        name: 'rice_scene',
     },
     {
         code: '🎀',
@@ -6307,6 +6982,7 @@ const emojis = [
             'celebration',
             'ribbon',
         ],
+        name: 'ribbon',
     },
     {
         code: '🎁',
@@ -6318,6 +6994,7 @@ const emojis = [
             'present',
             'wrapped',
         ],
+        name: 'gift',
     },
     {
         code: '🎗',
@@ -6326,6 +7003,7 @@ const emojis = [
             'reminder',
             'ribbon',
         ],
+        name: 'reminder_ribbon',
     },
     {
         code: '🎟',
@@ -6334,6 +7012,7 @@ const emojis = [
             'entertainment',
             'ticket',
         ],
+        name: 'tickets',
     },
     {
         code: '🎫',
@@ -6343,6 +7022,7 @@ const emojis = [
             'entertainment',
             'ticket',
         ],
+        name: 'ticket',
     },
     {
         code: '🎖',
@@ -6351,6 +7031,7 @@ const emojis = [
             'medal',
             'military',
         ],
+        name: 'medal_military',
     },
     {
         code: '🏆',
@@ -6358,12 +7039,14 @@ const emojis = [
             'prize',
             'trophy',
         ],
+        name: 'trophy',
     },
     {
         code: '🏅',
         keywords: [
             'medal',
         ],
+        name: 'medal_sports',
     },
     {
         code: '🥇',
@@ -6372,6 +7055,7 @@ const emojis = [
             'gold',
             'medal',
         ],
+        name: '1st_place_medal',
     },
     {
         code: '🥈',
@@ -6380,6 +7064,7 @@ const emojis = [
             'second',
             'silver',
         ],
+        name: '2nd_place_medal',
     },
     {
         code: '🥉',
@@ -6388,6 +7073,7 @@ const emojis = [
             'medal',
             'third',
         ],
+        name: '3rd_place_medal',
     },
     {
         code: '⚽',
@@ -6395,6 +7081,7 @@ const emojis = [
             'ball',
             'soccer',
         ],
+        name: 'soccer',
     },
     {
         code: '⚾',
@@ -6402,6 +7089,7 @@ const emojis = [
             'ball',
             'baseball',
         ],
+        name: 'baseball',
     },
     {
         code: '🏀',
@@ -6410,6 +7098,7 @@ const emojis = [
             'basketball',
             'hoop',
         ],
+        name: 'basketball',
     },
     {
         code: '🏐',
@@ -6418,6 +7107,7 @@ const emojis = [
             'game',
             'volleyball',
         ],
+        name: 'volleyball',
     },
     {
         code: '🏈',
@@ -6426,6 +7116,7 @@ const emojis = [
             'ball',
             'football',
         ],
+        name: 'football',
     },
     {
         code: '🏉',
@@ -6434,6 +7125,7 @@ const emojis = [
             'football',
             'rugby',
         ],
+        name: 'rugby_football',
     },
     {
         code: '🎾',
@@ -6442,6 +7134,7 @@ const emojis = [
             'racquet',
             'tennis',
         ],
+        name: 'tennis',
     },
     {
         code: '🎱',
@@ -6453,6 +7146,7 @@ const emojis = [
             'eight',
             'game',
         ],
+        name: '8ball',
     },
     {
         code: '🎳',
@@ -6461,6 +7155,7 @@ const emojis = [
             'bowling',
             'game',
         ],
+        name: 'bowling',
     },
     {
         code: '🏏',
@@ -6470,6 +7165,7 @@ const emojis = [
             'cricket',
             'game',
         ],
+        name: 'cricket_game',
     },
     {
         code: '🏑',
@@ -6480,6 +7176,7 @@ const emojis = [
             'hockey',
             'stick',
         ],
+        name: 'field_hockey',
     },
     {
         code: '🏒',
@@ -6490,6 +7187,7 @@ const emojis = [
             'puck',
             'stick',
         ],
+        name: 'ice_hockey',
     },
     {
         code: '🏓',
@@ -6500,6 +7198,7 @@ const emojis = [
             'paddle',
             'table tennis',
         ],
+        name: 'ping_pong',
     },
     {
         code: '🏸',
@@ -6510,6 +7209,7 @@ const emojis = [
             'racquet',
             'shuttlecock',
         ],
+        name: 'badminton',
     },
     {
         code: '🥊',
@@ -6517,6 +7217,7 @@ const emojis = [
             'boxing',
             'glove',
         ],
+        name: 'boxing_glove',
     },
     {
         code: '🥋',
@@ -6527,6 +7228,7 @@ const emojis = [
             'taekwondo',
             'uniform',
         ],
+        name: 'martial_arts_uniform',
     },
     {
         code: '⛳',
@@ -6535,6 +7237,7 @@ const emojis = [
             'golf',
             'hole',
         ],
+        name: 'golf',
     },
     {
         code: '🏌',
@@ -6542,6 +7245,7 @@ const emojis = [
             'ball',
             'golf',
         ],
+        name: 'golfing',
     },
     {
         code: '⛸',
@@ -6549,6 +7253,7 @@ const emojis = [
             'ice',
             'skate',
         ],
+        name: 'ice_skate',
     },
     {
         code: '🎣',
@@ -6557,6 +7262,7 @@ const emojis = [
             'fish',
             'pole',
         ],
+        name: 'fishing_pole_and_fish',
     },
     {
         code: '🎽',
@@ -6565,6 +7271,7 @@ const emojis = [
             'sash',
             'shirt',
         ],
+        name: 'running_shirt_with_sash',
     },
     {
         code: '🎿',
@@ -6572,6 +7279,7 @@ const emojis = [
             'ski',
             'snow',
         ],
+        name: 'ski',
     },
     {
         code: '⛷',
@@ -6579,6 +7287,7 @@ const emojis = [
             'ski',
             'snow',
         ],
+        name: 'skier',
     },
     {
         code: '🏂',
@@ -6587,6 +7296,7 @@ const emojis = [
             'snow',
             'snowboard',
         ],
+        name: 'snowboarder',
     },
     {
         code: '🏄',
@@ -6601,6 +7311,7 @@ const emojis = [
             '🏄🏼',
             '🏄🏻',
         ],
+        name: 'surfer',
     },
     {
         code: '🏇',
@@ -6610,6 +7321,7 @@ const emojis = [
             'racehorse',
             'racing',
         ],
+        name: 'horse_racing',
     },
     {
         code: '🏊',
@@ -6624,6 +7336,7 @@ const emojis = [
             '🏊🏼',
             '🏊🏻',
         ],
+        name: 'swimmer',
     },
     {
         code: '⛹',
@@ -6637,6 +7350,7 @@ const emojis = [
             '⛹🏼',
             '⛹🏻',
         ],
+        name: 'bouncing_ball_person',
     },
     {
         code: '🏋',
@@ -6651,6 +7365,7 @@ const emojis = [
             '🏋🏼',
             '🏋🏻',
         ],
+        name: 'weight_lifting',
     },
     {
         code: '🚴',
@@ -6667,6 +7382,7 @@ const emojis = [
             '🚴🏼',
             '🚴🏻',
         ],
+        name: 'bicyclist',
     },
     {
         code: '🚵',
@@ -6684,6 +7400,7 @@ const emojis = [
             '🚵🏼',
             '🚵🏻',
         ],
+        name: 'mountain_bicyclist',
     },
     {
         code: '🏎',
@@ -6691,6 +7408,7 @@ const emojis = [
             'car',
             'racing',
         ],
+        name: 'racing_car',
     },
     {
         code: '🏍',
@@ -6698,6 +7416,7 @@ const emojis = [
             'motorcycle',
             'racing',
         ],
+        name: 'motorcycle',
     },
     {
         code: '🤸',
@@ -6712,6 +7431,7 @@ const emojis = [
             '🤸🏼',
             '🤸🏻',
         ],
+        name: 'cartwheeling',
     },
     {
         code: '🤼',
@@ -6726,6 +7446,7 @@ const emojis = [
             '🤼🏼',
             '🤼🏻',
         ],
+        name: 'wrestling',
     },
     {
         code: '🤽',
@@ -6740,6 +7461,7 @@ const emojis = [
             '🤽🏼',
             '🤽🏻',
         ],
+        name: 'water_polo',
     },
     {
         code: '🤾',
@@ -6754,6 +7476,7 @@ const emojis = [
             '🤾🏼',
             '🤾🏻',
         ],
+        name: 'handball_person',
     },
     {
         code: '🤺',
@@ -6762,6 +7485,7 @@ const emojis = [
             'fencing',
             'sword',
         ],
+        name: 'person_fencing',
     },
     {
         code: '🥅',
@@ -6769,6 +7493,7 @@ const emojis = [
             'goal',
             'net',
         ],
+        name: 'goal_net',
     },
     {
         code: '🤹',
@@ -6785,6 +7510,7 @@ const emojis = [
             '🤹🏼',
             '🤹🏻',
         ],
+        name: 'juggling_person',
     },
     {
         code: '🎯',
@@ -6799,6 +7525,7 @@ const emojis = [
             'hit',
             'target',
         ],
+        name: 'dart',
     },
     {
         code: '🎮',
@@ -6808,6 +7535,7 @@ const emojis = [
             'game',
             'video game',
         ],
+        name: 'video_game',
     },
     {
         code: '🕹',
@@ -6817,6 +7545,7 @@ const emojis = [
             'joystick',
             'video game',
         ],
+        name: 'joystick',
     },
     {
         code: '🎲',
@@ -6826,6 +7555,7 @@ const emojis = [
             'entertainment',
             'game',
         ],
+        name: 'game_die',
     },
     {
         code: '♠️',
@@ -6835,6 +7565,7 @@ const emojis = [
             'spade',
             'suit',
         ],
+        name: 'spades',
     },
     {
         code: '♥️',
@@ -6845,6 +7576,7 @@ const emojis = [
             'hearts',
             'suit',
         ],
+        name: 'hearts',
     },
     {
         code: '♦️',
@@ -6855,6 +7587,7 @@ const emojis = [
             'game',
             'suit',
         ],
+        name: 'diamonds',
     },
     {
         code: '♣️',
@@ -6865,6 +7598,7 @@ const emojis = [
             'game',
             'suit',
         ],
+        name: 'clubs',
     },
     {
         code: '🃏',
@@ -6875,6 +7609,7 @@ const emojis = [
             'joker',
             'playing',
         ],
+        name: 'black_joker',
     },
     {
         code: '🀄',
@@ -6883,6 +7618,7 @@ const emojis = [
             'mahjong',
             'red',
         ],
+        name: 'mahjong',
     },
     {
         code: '🎴',
@@ -6895,6 +7631,7 @@ const emojis = [
             'japanese',
             'playing',
         ],
+        name: 'flower_playing_cards',
     },
     {
         code: 'objects',
@@ -6909,6 +7646,7 @@ const emojis = [
             'speaker',
             'volume',
         ],
+        name: 'mute',
     },
     {
         code: '🔈',
@@ -6916,6 +7654,7 @@ const emojis = [
             'speaker',
             'volume',
         ],
+        name: 'speaker',
     },
     {
         code: '🔉',
@@ -6925,6 +7664,7 @@ const emojis = [
             'volume',
             'wave',
         ],
+        name: 'sound',
     },
     {
         code: '🔊',
@@ -6937,6 +7677,7 @@ const emojis = [
             'three',
             'volume',
         ],
+        name: 'loud_sound',
     },
     {
         code: '📢',
@@ -6946,6 +7687,7 @@ const emojis = [
             'loudspeaker',
             'public address',
         ],
+        name: 'loudspeaker',
     },
     {
         code: '📣',
@@ -6954,6 +7696,7 @@ const emojis = [
             'communication',
             'megaphone',
         ],
+        name: 'mega',
     },
     {
         code: '📯',
@@ -6964,12 +7707,14 @@ const emojis = [
             'post',
             'postal',
         ],
+        name: 'postal_horn',
     },
     {
         code: '🔔',
         keywords: [
             'bell',
         ],
+        name: 'bell',
     },
     {
         code: '🔕',
@@ -6983,6 +7728,7 @@ const emojis = [
             'quiet',
             'silent',
         ],
+        name: 'no_bell',
     },
     {
         code: '🎼',
@@ -6992,6 +7738,7 @@ const emojis = [
             'music',
             'score',
         ],
+        name: 'musical_score',
     },
     {
         code: '🎵',
@@ -7001,6 +7748,7 @@ const emojis = [
             'music',
             'note',
         ],
+        name: 'musical_note',
     },
     {
         code: '🎶',
@@ -7011,6 +7759,7 @@ const emojis = [
             'note',
             'notes',
         ],
+        name: 'notes',
     },
     {
         code: '🎙',
@@ -7020,6 +7769,7 @@ const emojis = [
             'music',
             'studio',
         ],
+        name: 'studio_microphone',
     },
     {
         code: '🎚',
@@ -7028,6 +7778,7 @@ const emojis = [
             'music',
             'slider',
         ],
+        name: 'level_slider',
     },
     {
         code: '🎛',
@@ -7036,6 +7787,7 @@ const emojis = [
             'knobs',
             'music',
         ],
+        name: 'control_knobs',
     },
     {
         code: '🎤',
@@ -7046,6 +7798,7 @@ const emojis = [
             'mic',
             'microphone',
         ],
+        name: 'microphone',
     },
     {
         code: '🎧',
@@ -7055,6 +7808,7 @@ const emojis = [
             'entertainment',
             'headphone',
         ],
+        name: 'headphones',
     },
     {
         code: '📻',
@@ -7063,6 +7817,7 @@ const emojis = [
             'radio',
             'video',
         ],
+        name: 'radio',
     },
     {
         code: '🎷',
@@ -7074,6 +7829,7 @@ const emojis = [
             'sax',
             'saxophone',
         ],
+        name: 'saxophone',
     },
     {
         code: '🎸',
@@ -7084,6 +7840,7 @@ const emojis = [
             'instrument',
             'music',
         ],
+        name: 'guitar',
     },
     {
         code: '🎹',
@@ -7095,6 +7852,7 @@ const emojis = [
             'music',
             'piano',
         ],
+        name: 'musical_keyboard',
     },
     {
         code: '🎺',
@@ -7105,6 +7863,7 @@ const emojis = [
             'music',
             'trumpet',
         ],
+        name: 'trumpet',
     },
     {
         code: '🎻',
@@ -7115,6 +7874,7 @@ const emojis = [
             'music',
             'violin',
         ],
+        name: 'violin',
     },
     {
         code: '🥁',
@@ -7123,6 +7883,7 @@ const emojis = [
             'drumsticks',
             'music',
         ],
+        name: 'drum',
     },
     {
         code: '📱',
@@ -7133,6 +7894,7 @@ const emojis = [
             'phone',
             'telephone',
         ],
+        name: 'iphone',
     },
     {
         code: '📲',
@@ -7146,6 +7908,7 @@ const emojis = [
             'receive',
             'telephone',
         ],
+        name: 'calling',
     },
     {
         code: '☎',
@@ -7153,6 +7916,7 @@ const emojis = [
             'phone',
             'telephone',
         ],
+        name: 'phone',
     },
     {
         code: '📞',
@@ -7162,6 +7926,7 @@ const emojis = [
             'receiver',
             'telephone',
         ],
+        name: 'telephone_receiver',
     },
     {
         code: '📟',
@@ -7169,6 +7934,7 @@ const emojis = [
             'communication',
             'pager',
         ],
+        name: 'pager',
     },
     {
         code: '📠',
@@ -7176,12 +7942,14 @@ const emojis = [
             'communication',
             'fax',
         ],
+        name: 'fax',
     },
     {
         code: '🔋',
         keywords: [
             'battery',
         ],
+        name: 'battery',
     },
     {
         code: '🔌',
@@ -7190,6 +7958,7 @@ const emojis = [
             'electricity',
             'plug',
         ],
+        name: 'electric_plug',
     },
     {
         code: '💻',
@@ -7198,6 +7967,7 @@ const emojis = [
             'pc',
             'personal',
         ],
+        name: 'computer',
     },
     {
         code: '🖥',
@@ -7205,6 +7975,7 @@ const emojis = [
             'computer',
             'desktop',
         ],
+        name: 'desktop_computer',
     },
     {
         code: '🖨',
@@ -7212,6 +7983,7 @@ const emojis = [
             'computer',
             'printer',
         ],
+        name: 'printer',
     },
     {
         code: '⌨️',
@@ -7219,6 +7991,7 @@ const emojis = [
             'computer',
             'keyboard',
         ],
+        name: 'keyboard',
     },
     {
         code: '🖱',
@@ -7229,6 +8002,7 @@ const emojis = [
             'mouse',
             'three',
         ],
+        name: 'computer_mouse',
     },
     {
         code: '🖲',
@@ -7236,6 +8010,7 @@ const emojis = [
             'computer',
             'trackball',
         ],
+        name: 'trackball',
     },
     {
         code: '💽',
@@ -7246,6 +8021,7 @@ const emojis = [
             'minidisk',
             'optical',
         ],
+        name: 'minidisc',
     },
     {
         code: '💾',
@@ -7254,6 +8030,7 @@ const emojis = [
             'disk',
             'floppy',
         ],
+        name: 'floppy_disk',
     },
     {
         code: '💿',
@@ -7265,6 +8042,7 @@ const emojis = [
             'dvd',
             'optical',
         ],
+        name: 'cd',
     },
     {
         code: '📀',
@@ -7277,6 +8055,7 @@ const emojis = [
             'entertainment',
             'optical',
         ],
+        name: 'dvd',
     },
     {
         code: '🎥',
@@ -7287,6 +8066,7 @@ const emojis = [
             'entertainment',
             'movie',
         ],
+        name: 'movie_camera',
     },
     {
         code: '🎞',
@@ -7297,6 +8077,7 @@ const emojis = [
             'frames',
             'movie',
         ],
+        name: 'film_strip',
     },
     {
         code: '📽',
@@ -7308,6 +8089,7 @@ const emojis = [
             'projector',
             'video',
         ],
+        name: 'film_projector',
     },
     {
         code: '🎬',
@@ -7317,6 +8099,7 @@ const emojis = [
             'entertainment',
             'movie',
         ],
+        name: 'clapper',
     },
     {
         code: '📺',
@@ -7326,6 +8109,7 @@ const emojis = [
             'tv',
             'video',
         ],
+        name: 'tv',
     },
     {
         code: '📷',
@@ -7334,6 +8118,7 @@ const emojis = [
             'entertainment',
             'video',
         ],
+        name: 'camera',
     },
     {
         code: '📸',
@@ -7342,6 +8127,7 @@ const emojis = [
             'flash',
             'video',
         ],
+        name: 'camera_flash',
     },
     {
         code: '📹',
@@ -7350,6 +8136,7 @@ const emojis = [
             'entertainment',
             'video',
         ],
+        name: 'video_camera',
     },
     {
         code: '📼',
@@ -7360,6 +8147,7 @@ const emojis = [
             'video',
             'videocassette',
         ],
+        name: 'vhs',
     },
     {
         code: '🔍',
@@ -7369,6 +8157,7 @@ const emojis = [
             'search',
             'tool',
         ],
+        name: 'mag',
     },
     {
         code: '🔎',
@@ -7378,6 +8167,7 @@ const emojis = [
             'search',
             'tool',
         ],
+        name: 'mag_right',
     },
     {
         code: '🔬',
@@ -7385,6 +8175,7 @@ const emojis = [
             'microscope',
             'tool',
         ],
+        name: 'microscope',
     },
     {
         code: '🔭',
@@ -7392,6 +8183,7 @@ const emojis = [
             'telescope',
             'tool',
         ],
+        name: 'telescope',
     },
     {
         code: '📡',
@@ -7401,6 +8193,7 @@ const emojis = [
             'dish',
             'satellite',
         ],
+        name: 'satellite',
     },
     {
         code: '🕯',
@@ -7408,6 +8201,7 @@ const emojis = [
             'candle',
             'light',
         ],
+        name: 'candle',
     },
     {
         code: '💡',
@@ -7418,6 +8212,7 @@ const emojis = [
             'idea',
             'light',
         ],
+        name: 'bulb',
     },
     {
         code: '🔦',
@@ -7428,6 +8223,7 @@ const emojis = [
             'tool',
             'torch',
         ],
+        name: 'flashlight',
     },
     {
         code: '🏮',
@@ -7438,6 +8234,7 @@ const emojis = [
             'light',
             'red',
         ],
+        name: 'izakaya_lantern',
     },
     {
         code: '📔',
@@ -7447,6 +8244,7 @@ const emojis = [
             'decorated',
             'notebook',
         ],
+        name: 'notebook_with_decorative_cover',
     },
     {
         code: '📕',
@@ -7454,6 +8252,7 @@ const emojis = [
             'book',
             'closed',
         ],
+        name: 'closed_book',
     },
     {
         code: '📖',
@@ -7461,6 +8260,7 @@ const emojis = [
             'book',
             'open',
         ],
+        name: 'book',
     },
     {
         code: '📗',
@@ -7468,6 +8268,7 @@ const emojis = [
             'book',
             'green',
         ],
+        name: 'green_book',
     },
     {
         code: '📘',
@@ -7475,6 +8276,7 @@ const emojis = [
             'blue',
             'book',
         ],
+        name: 'blue_book',
     },
     {
         code: '📙',
@@ -7482,6 +8284,7 @@ const emojis = [
             'book',
             'orange',
         ],
+        name: 'orange_book',
     },
     {
         code: '📚',
@@ -7489,12 +8292,14 @@ const emojis = [
             'book',
             'books',
         ],
+        name: 'books',
     },
     {
         code: '📓',
         keywords: [
             'notebook',
         ],
+        name: 'notebook',
     },
     {
         code: '📒',
@@ -7502,6 +8307,7 @@ const emojis = [
             'ledger',
             'notebook',
         ],
+        name: 'ledger',
     },
     {
         code: '📃',
@@ -7510,6 +8316,7 @@ const emojis = [
             'document',
             'page',
         ],
+        name: 'page_with_curl',
     },
     {
         code: '📜',
@@ -7517,6 +8324,7 @@ const emojis = [
             'paper',
             'scroll',
         ],
+        name: 'scroll',
     },
     {
         code: '📄',
@@ -7524,6 +8332,7 @@ const emojis = [
             'document',
             'page',
         ],
+        name: 'page_facing_up',
     },
     {
         code: '📰',
@@ -7533,6 +8342,7 @@ const emojis = [
             'newspaper',
             'paper',
         ],
+        name: 'newspaper',
     },
     {
         code: '🗞',
@@ -7542,6 +8352,7 @@ const emojis = [
             'paper',
             'rolled',
         ],
+        name: 'newspaper_roll',
     },
     {
         code: '📑',
@@ -7551,6 +8362,7 @@ const emojis = [
             'marker',
             'tabs',
         ],
+        name: 'bookmark_tabs',
     },
     {
         code: '🔖',
@@ -7558,12 +8370,14 @@ const emojis = [
             'bookmark',
             'mark',
         ],
+        name: 'bookmark',
     },
     {
         code: '🏷',
         keywords: [
             'label',
         ],
+        name: 'label',
     },
     {
         code: '💰',
@@ -7573,6 +8387,7 @@ const emojis = [
             'money',
             'moneybag',
         ],
+        name: 'moneybag',
     },
     {
         code: '💴',
@@ -7585,6 +8400,7 @@ const emojis = [
             'note',
             'yen',
         ],
+        name: 'yen',
     },
     {
         code: '💵',
@@ -7597,6 +8413,7 @@ const emojis = [
             'money',
             'note',
         ],
+        name: 'dollar',
     },
     {
         code: '💶',
@@ -7609,6 +8426,7 @@ const emojis = [
             'money',
             'note',
         ],
+        name: 'euro',
     },
     {
         code: '💷',
@@ -7621,6 +8439,7 @@ const emojis = [
             'note',
             'pound',
         ],
+        name: 'pound',
     },
     {
         code: '💸',
@@ -7634,6 +8453,7 @@ const emojis = [
             'note',
             'wings',
         ],
+        name: 'money_with_wings',
     },
     {
         code: '💳',
@@ -7643,6 +8463,7 @@ const emojis = [
             'credit',
             'money',
         ],
+        name: 'credit_card',
     },
     {
         code: '💹',
@@ -7659,6 +8480,7 @@ const emojis = [
             'upward',
             'yen',
         ],
+        name: 'chart',
     },
     {
         code: '💱',
@@ -7668,6 +8490,7 @@ const emojis = [
             'exchange',
             'money',
         ],
+        name: 'currency_exchange',
     },
     {
         code: '💲',
@@ -7676,6 +8499,7 @@ const emojis = [
             'dollar',
             'money',
         ],
+        name: 'heavy_dollar_sign',
     },
     {
         code: '✉️',
@@ -7684,6 +8508,7 @@ const emojis = [
             'email',
             'envelope',
         ],
+        name: 'envelope',
     },
     {
         code: '📧',
@@ -7694,6 +8519,7 @@ const emojis = [
             'letter',
             'mail',
         ],
+        name: 'email',
     },
     {
         code: '📨',
@@ -7707,6 +8533,7 @@ const emojis = [
             'mail',
             'receive',
         ],
+        name: 'incoming_envelope',
     },
     {
         code: '📩',
@@ -7722,6 +8549,7 @@ const emojis = [
             'outgoing',
             'sent',
         ],
+        name: 'envelope_with_arrow',
     },
     {
         code: '📤',
@@ -7734,6 +8562,7 @@ const emojis = [
             'sent',
             'tray',
         ],
+        name: 'outbox_tray',
     },
     {
         code: '📥',
@@ -7746,6 +8575,7 @@ const emojis = [
             'receive',
             'tray',
         ],
+        name: 'inbox_tray',
     },
     {
         code: '📦',
@@ -7755,6 +8585,7 @@ const emojis = [
             'package',
             'parcel',
         ],
+        name: 'package',
     },
     {
         code: '📫',
@@ -7766,6 +8597,7 @@ const emojis = [
             'mailbox',
             'postbox',
         ],
+        name: 'mailbox',
     },
     {
         code: '📪',
@@ -7778,6 +8610,7 @@ const emojis = [
             'mailbox',
             'postbox',
         ],
+        name: 'mailbox_closed',
     },
     {
         code: '📬',
@@ -7789,6 +8622,7 @@ const emojis = [
             'open',
             'postbox',
         ],
+        name: 'mailbox_with_mail',
     },
     {
         code: '📭',
@@ -7801,6 +8635,7 @@ const emojis = [
             'open',
             'postbox',
         ],
+        name: 'mailbox_with_no_mail',
     },
     {
         code: '📮',
@@ -7810,6 +8645,7 @@ const emojis = [
             'mailbox',
             'postbox',
         ],
+        name: 'postbox',
     },
     {
         code: '🗳',
@@ -7817,12 +8653,14 @@ const emojis = [
             'ballot',
             'box',
         ],
+        name: 'ballot_box',
     },
     {
         code: '✏',
         keywords: [
             'pencil',
         ],
+        name: 'pencil2',
     },
     {
         code: '✒️',
@@ -7830,6 +8668,7 @@ const emojis = [
             'nib',
             'pen',
         ],
+        name: 'black_nib',
     },
     {
         code: '🖋',
@@ -7838,6 +8677,7 @@ const emojis = [
             'fountain',
             'pen',
         ],
+        name: 'fountain_pen',
     },
     {
         code: '🖊',
@@ -7846,6 +8686,7 @@ const emojis = [
             'communication',
             'pen',
         ],
+        name: 'pen',
     },
     {
         code: '🖌',
@@ -7854,6 +8695,7 @@ const emojis = [
             'paintbrush',
             'painting',
         ],
+        name: 'paintbrush',
     },
     {
         code: '🖍',
@@ -7861,6 +8703,7 @@ const emojis = [
             'communication',
             'crayon',
         ],
+        name: 'crayon',
     },
     {
         code: '📝',
@@ -7869,12 +8712,14 @@ const emojis = [
             'memo',
             'pencil',
         ],
+        name: 'memo',
     },
     {
         code: '💼',
         keywords: [
             'briefcase',
         ],
+        name: 'briefcase',
     },
     {
         code: '📁',
@@ -7882,6 +8727,7 @@ const emojis = [
             'file',
             'folder',
         ],
+        name: 'file_folder',
     },
     {
         code: '📂',
@@ -7890,6 +8736,7 @@ const emojis = [
             'folder',
             'open',
         ],
+        name: 'open_file_folder',
     },
     {
         code: '🗂',
@@ -7898,6 +8745,7 @@ const emojis = [
             'dividers',
             'index',
         ],
+        name: 'card_index_dividers',
     },
     {
         code: '📅',
@@ -7905,12 +8753,14 @@ const emojis = [
             'calendar',
             'date',
         ],
+        name: 'date',
     },
     {
         code: '📆',
         keywords: [
             'calendar',
         ],
+        name: 'calendar',
     },
     {
         code: '🗒',
@@ -7919,6 +8769,7 @@ const emojis = [
             'pad',
             'spiral',
         ],
+        name: 'spiral_notepad',
     },
     {
         code: '🗓',
@@ -7927,6 +8778,7 @@ const emojis = [
             'pad',
             'spiral',
         ],
+        name: 'spiral_calendar',
     },
     {
         code: '📇',
@@ -7935,6 +8787,7 @@ const emojis = [
             'index',
             'rolodex',
         ],
+        name: 'card_index',
     },
     {
         code: '📈',
@@ -7945,6 +8798,7 @@ const emojis = [
             'trend',
             'upward',
         ],
+        name: 'chart_with_upwards_trend',
     },
     {
         code: '📉',
@@ -7954,6 +8808,7 @@ const emojis = [
             'graph',
             'trend',
         ],
+        name: 'chart_with_downwards_trend',
     },
     {
         code: '📊',
@@ -7962,12 +8817,14 @@ const emojis = [
             'chart',
             'graph',
         ],
+        name: 'bar_chart',
     },
     {
         code: '📋',
         keywords: [
             'clipboard',
         ],
+        name: 'clipboard',
     },
     {
         code: '📌',
@@ -7975,6 +8832,7 @@ const emojis = [
             'pin',
             'pushpin',
         ],
+        name: 'pushpin',
     },
     {
         code: '📍',
@@ -7982,12 +8840,14 @@ const emojis = [
             'pin',
             'pushpin',
         ],
+        name: 'round_pushpin',
     },
     {
         code: '📎',
         keywords: [
             'paperclip',
         ],
+        name: 'paperclip',
     },
     {
         code: '🖇',
@@ -7996,6 +8856,7 @@ const emojis = [
             'link',
             'paperclip',
         ],
+        name: 'paperclips',
     },
     {
         code: '📏',
@@ -8003,6 +8864,7 @@ const emojis = [
             'ruler',
             'straight edge',
         ],
+        name: 'straight_ruler',
     },
     {
         code: '📐',
@@ -8011,6 +8873,7 @@ const emojis = [
             'set',
             'triangle',
         ],
+        name: 'triangular_ruler',
     },
     {
         code: '✂️',
@@ -8018,6 +8881,7 @@ const emojis = [
             'scissors',
             'tool',
         ],
+        name: 'scissors',
     },
     {
         code: '🗃',
@@ -8026,6 +8890,7 @@ const emojis = [
             'card',
             'file',
         ],
+        name: 'card_file_box',
     },
     {
         code: '🗄',
@@ -8033,12 +8898,14 @@ const emojis = [
             'cabinet',
             'file',
         ],
+        name: 'file_cabinet',
     },
     {
         code: '🗑',
         keywords: [
             'wastebasket',
         ],
+        name: 'wastebasket',
     },
     {
         code: '🔒',
@@ -8046,6 +8913,7 @@ const emojis = [
             'closed',
             'lock',
         ],
+        name: 'lock',
     },
     {
         code: '🔓',
@@ -8054,6 +8922,7 @@ const emojis = [
             'open',
             'unlock',
         ],
+        name: 'unlock',
     },
     {
         code: '🔏',
@@ -8064,6 +8933,7 @@ const emojis = [
             'pen',
             'privacy',
         ],
+        name: 'lock_with_ink_pen',
     },
     {
         code: '🔐',
@@ -8073,6 +8943,7 @@ const emojis = [
             'lock',
             'secure',
         ],
+        name: 'closed_lock_with_key',
     },
     {
         code: '🔑',
@@ -8081,6 +8952,7 @@ const emojis = [
             'lock',
             'password',
         ],
+        name: 'key',
     },
     {
         code: '🗝',
@@ -8090,6 +8962,7 @@ const emojis = [
             'lock',
             'old',
         ],
+        name: 'old_key',
     },
     {
         code: '🔨',
@@ -8097,6 +8970,7 @@ const emojis = [
             'hammer',
             'tool',
         ],
+        name: 'hammer',
     },
     {
         code: '⛏',
@@ -8105,6 +8979,7 @@ const emojis = [
             'pick',
             'tool',
         ],
+        name: 'pick',
     },
     {
         code: '⚒️',
@@ -8113,6 +8988,7 @@ const emojis = [
             'pick',
             'tool',
         ],
+        name: 'hammer_and_pick',
     },
     {
         code: '🛠',
@@ -8121,6 +8997,7 @@ const emojis = [
             'tool',
             'wrench',
         ],
+        name: 'hammer_and_wrench',
     },
     {
         code: '🗡',
@@ -8129,6 +9006,7 @@ const emojis = [
             'knife',
             'weapon',
         ],
+        name: 'dagger',
     },
     {
         code: '⚔️',
@@ -8137,6 +9015,7 @@ const emojis = [
             'swords',
             'weapon',
         ],
+        name: 'crossed_swords',
     },
     {
         code: '🔫',
@@ -8148,6 +9027,7 @@ const emojis = [
             'tool',
             'weapon',
         ],
+        name: 'gun',
     },
     {
         code: '🏹',
@@ -8160,6 +9040,7 @@ const emojis = [
             'weapon',
             'zodiac',
         ],
+        name: 'bow_and_arrow',
     },
     {
         code: '🛡',
@@ -8167,6 +9048,7 @@ const emojis = [
             'shield',
             'weapon',
         ],
+        name: 'shield',
     },
     {
         code: '🔧',
@@ -8174,6 +9056,7 @@ const emojis = [
             'tool',
             'wrench',
         ],
+        name: 'wrench',
     },
     {
         code: '🔩',
@@ -8182,6 +9065,7 @@ const emojis = [
             'nut',
             'tool',
         ],
+        name: 'nut_and_bolt',
     },
     {
         code: '⚙️',
@@ -8189,6 +9073,7 @@ const emojis = [
             'gear',
             'tool',
         ],
+        name: 'gear',
     },
     {
         code: '🗜',
@@ -8197,6 +9082,7 @@ const emojis = [
             'tool',
             'vice',
         ],
+        name: 'clamp',
     },
     {
         code: '⚗️',
@@ -8205,6 +9091,7 @@ const emojis = [
             'chemistry',
             'tool',
         ],
+        name: 'alembic',
     },
     {
         code: '⚖️',
@@ -8217,18 +9104,21 @@ const emojis = [
             'weight',
             'zodiac',
         ],
+        name: 'balance_scale',
     },
     {
         code: '🔗',
         keywords: [
             'link',
         ],
+        name: 'link',
     },
     {
         code: '⛓',
         keywords: [
             'chain',
         ],
+        name: 'chains',
     },
     {
         code: '💉',
@@ -8241,6 +9131,7 @@ const emojis = [
             'syringe',
             'tool',
         ],
+        name: 'syringe',
     },
     {
         code: '💊',
@@ -8250,6 +9141,7 @@ const emojis = [
             'pill',
             'sick',
         ],
+        name: 'pill',
     },
     {
         code: '🚬',
@@ -8257,6 +9149,7 @@ const emojis = [
             'activity',
             'smoking',
         ],
+        name: 'smoking',
     },
     {
         code: '⚰',
@@ -8264,6 +9157,7 @@ const emojis = [
             'coffin',
             'death',
         ],
+        name: 'coffin',
     },
     {
         code: '⚱',
@@ -8272,6 +9166,7 @@ const emojis = [
             'funeral',
             'urn',
         ],
+        name: 'funeral_urn',
     },
     {
         code: '🗿',
@@ -8280,6 +9175,7 @@ const emojis = [
             'moyai',
             'statue',
         ],
+        name: 'moyai',
     },
     {
         code: '🛢',
@@ -8287,6 +9183,7 @@ const emojis = [
             'drum',
             'oil',
         ],
+        name: 'oil_drum',
     },
     {
         code: '🔮',
@@ -8298,6 +9195,7 @@ const emojis = [
             'fortune',
             'tool',
         ],
+        name: 'crystal_ball',
     },
     {
         code: '🛒',
@@ -8306,6 +9204,7 @@ const emojis = [
             'shopping',
             'trolley',
         ],
+        name: 'shopping_cart',
     },
     {
         code: 'symbols',
@@ -8319,6 +9218,7 @@ const emojis = [
             'bank',
             'teller',
         ],
+        name: 'atm',
     },
     {
         code: '🚮',
@@ -8326,6 +9226,7 @@ const emojis = [
             'litter',
             'litterbox',
         ],
+        name: 'put_litter_in_its_place',
     },
     {
         code: '🚰',
@@ -8334,6 +9235,7 @@ const emojis = [
             'potable',
             'water',
         ],
+        name: 'potable_water',
     },
     {
         code: '♿',
@@ -8341,6 +9243,7 @@ const emojis = [
             'access',
             'wheelchair',
         ],
+        name: 'wheelchair',
     },
     {
         code: '🚹',
@@ -8350,6 +9253,7 @@ const emojis = [
             'restroom',
             'wc',
         ],
+        name: 'mens',
     },
     {
         code: '🚺',
@@ -8359,6 +9263,7 @@ const emojis = [
             'wc',
             'woman',
         ],
+        name: 'womens',
     },
     {
         code: '🚻',
@@ -8367,6 +9272,7 @@ const emojis = [
             'restroom',
             'wc',
         ],
+        name: 'restroom',
     },
     {
         code: '🚼',
@@ -8374,6 +9280,7 @@ const emojis = [
             'baby',
             'changing',
         ],
+        name: 'baby_symbol',
     },
     {
         code: '🚾',
@@ -8384,6 +9291,7 @@ const emojis = [
             'water',
             'wc',
         ],
+        name: 'wc',
     },
     {
         code: '🛂',
@@ -8391,12 +9299,14 @@ const emojis = [
             'control',
             'passport',
         ],
+        name: 'passport_control',
     },
     {
         code: '🛃',
         keywords: [
             'customs',
         ],
+        name: 'customs',
     },
     {
         code: '🛄',
@@ -8404,6 +9314,7 @@ const emojis = [
             'baggage',
             'claim',
         ],
+        name: 'baggage_claim',
     },
     {
         code: '🛅',
@@ -8413,12 +9324,14 @@ const emojis = [
             'locker',
             'luggage',
         ],
+        name: 'left_luggage',
     },
     {
         code: '⚠',
         keywords: [
             'warning',
         ],
+        name: 'warning',
     },
     {
         code: '🚸',
@@ -8428,6 +9341,7 @@ const emojis = [
             'pedestrian',
             'traffic',
         ],
+        name: 'children_crossing',
     },
     {
         code: '⛔',
@@ -8439,6 +9353,7 @@ const emojis = [
             'prohibited',
             'traffic',
         ],
+        name: 'no_entry',
     },
     {
         code: '🚫',
@@ -8449,6 +9364,7 @@ const emojis = [
             'not',
             'prohibited',
         ],
+        name: 'no_entry_sign',
     },
     {
         code: '🚳',
@@ -8461,6 +9377,7 @@ const emojis = [
             'prohibited',
             'vehicle',
         ],
+        name: 'no_bicycles',
     },
     {
         code: '🚭',
@@ -8471,6 +9388,7 @@ const emojis = [
             'prohibited',
             'smoking',
         ],
+        name: 'no_smoking',
     },
     {
         code: '🚯',
@@ -8481,6 +9399,7 @@ const emojis = [
             'not',
             'prohibited',
         ],
+        name: 'do_not_litter',
     },
     {
         code: '🚱',
@@ -8493,6 +9412,7 @@ const emojis = [
             'prohibited',
             'water',
         ],
+        name: 'non',
     },
     {
         code: '🚷',
@@ -8503,6 +9423,7 @@ const emojis = [
             'pedestrian',
             'prohibited',
         ],
+        name: 'no_pedestrians',
     },
     {
         code: '📵',
@@ -8517,6 +9438,7 @@ const emojis = [
             'prohibited',
             'telephone',
         ],
+        name: 'no_mobile_phones',
     },
     {
         code: '🔞',
@@ -8530,18 +9452,21 @@ const emojis = [
             'prohibited',
             'underage',
         ],
+        name: 'underage',
     },
     {
         code: '☢️',
         keywords: [
             'radioactive',
         ],
+        name: 'radioactive',
     },
     {
         code: '☣️',
         keywords: [
             'biohazard',
         ],
+        name: 'biohazard',
     },
     {
         code: '⬆',
@@ -8551,6 +9476,7 @@ const emojis = [
             'direction',
             'north',
         ],
+        name: 'arrow_up',
     },
     {
         code: '↗️',
@@ -8560,6 +9486,7 @@ const emojis = [
             'intercardinal',
             'northeast',
         ],
+        name: 'arrow_upper_right',
     },
     {
         code: '➡',
@@ -8569,6 +9496,7 @@ const emojis = [
             'direction',
             'east',
         ],
+        name: 'arrow_right',
     },
     {
         code: '↘️',
@@ -8578,6 +9506,7 @@ const emojis = [
             'intercardinal',
             'southeast',
         ],
+        name: 'arrow_lower_right',
     },
     {
         code: '⬇',
@@ -8588,6 +9517,7 @@ const emojis = [
             'down',
             'south',
         ],
+        name: 'arrow_down',
     },
     {
         code: '↙️',
@@ -8597,6 +9527,7 @@ const emojis = [
             'intercardinal',
             'southwest',
         ],
+        name: 'arrow_lower_left',
     },
     {
         code: '⬅',
@@ -8606,6 +9537,7 @@ const emojis = [
             'direction',
             'west',
         ],
+        name: 'arrow_left',
     },
     {
         code: '↖️',
@@ -8615,30 +9547,35 @@ const emojis = [
             'intercardinal',
             'northwest',
         ],
+        name: 'arrow_upper_left',
     },
     {
         code: '↕️',
         keywords: [
             'arrow',
         ],
+        name: 'arrow_up_down',
     },
     {
         code: '↔️',
         keywords: [
             'arrow',
         ],
+        name: 'left_right_arrow',
     },
     {
         code: '↩',
         keywords: [
             'arrow',
         ],
+        name: 'leftwards_arrow_with_hook',
     },
     {
         code: '↪',
         keywords: [
             'arrow',
         ],
+        name: 'arrow_right_hook',
     },
     {
         code: '⤴️',
@@ -8646,6 +9583,7 @@ const emojis = [
             'arrow',
             'up',
         ],
+        name: 'arrow_heading_up',
     },
     {
         code: '⤵️',
@@ -8653,6 +9591,7 @@ const emojis = [
             'arrow',
             'down',
         ],
+        name: 'arrow_heading_down',
     },
     {
         code: '🔃',
@@ -8661,6 +9600,7 @@ const emojis = [
             'clockwise',
             'reload',
         ],
+        name: 'arrows_clockwise',
     },
     {
         code: '🔄',
@@ -8670,6 +9610,7 @@ const emojis = [
             'counterclockwise',
             'withershins',
         ],
+        name: 'arrows_counterclockwise',
     },
     {
         code: '🔙',
@@ -8677,6 +9618,7 @@ const emojis = [
             'arrow',
             'back',
         ],
+        name: 'back',
     },
     {
         code: '🔚',
@@ -8684,6 +9626,7 @@ const emojis = [
             'arrow',
             'end',
         ],
+        name: 'end',
     },
     {
         code: '🔛',
@@ -8692,6 +9635,7 @@ const emojis = [
             'mark',
             'on',
         ],
+        name: 'on',
     },
     {
         code: '🔜',
@@ -8699,6 +9643,7 @@ const emojis = [
             'arrow',
             'soon',
         ],
+        name: 'soon',
     },
     {
         code: '🔝',
@@ -8707,6 +9652,7 @@ const emojis = [
             'top',
             'up',
         ],
+        name: 'top',
     },
     {
         code: '🛐',
@@ -8714,6 +9660,7 @@ const emojis = [
             'religion',
             'worship',
         ],
+        name: 'place_of_worship',
     },
     {
         code: '⚛',
@@ -8721,6 +9668,7 @@ const emojis = [
             'atheist',
             'atom',
         ],
+        name: 'atom_symbol',
     },
     {
         code: '🕉',
@@ -8729,6 +9677,7 @@ const emojis = [
             'om',
             'religion',
         ],
+        name: 'om',
     },
     {
         code: '✡️',
@@ -8739,6 +9688,7 @@ const emojis = [
             'religion',
             'star',
         ],
+        name: 'star_of_david',
     },
     {
         code: '☸️',
@@ -8748,6 +9698,7 @@ const emojis = [
             'religion',
             'wheel',
         ],
+        name: 'wheel_of_dharma',
     },
     {
         code: '☯',
@@ -8758,6 +9709,7 @@ const emojis = [
             'yang',
             'yin',
         ],
+        name: 'yin_yang',
     },
     {
         code: '☦️',
@@ -8766,6 +9718,7 @@ const emojis = [
             'cross',
             'religion',
         ],
+        name: 'orthodox_cross',
     },
     {
         code: '☦',
@@ -8774,6 +9727,7 @@ const emojis = [
             'cross',
             'religion',
         ],
+        name: 'latin_cross',
     },
     {
         code: '☪',
@@ -8782,12 +9736,14 @@ const emojis = [
             'muslim',
             'religion',
         ],
+        name: 'star_and_crescent',
     },
     {
         code: '☮',
         keywords: [
             'peace',
         ],
+        name: 'peace_symbol',
     },
     {
         code: '🕎',
@@ -8797,6 +9753,7 @@ const emojis = [
             'menorah',
             'religion',
         ],
+        name: 'menorah',
     },
     {
         code: '🔯',
@@ -8804,12 +9761,14 @@ const emojis = [
             'fortune',
             'star',
         ],
+        name: 'six_pointed_star',
     },
     {
         code: '♻',
         keywords: [
             'recycle',
         ],
+        name: 'recycle',
     },
     {
         code: '📛',
@@ -8817,12 +9776,14 @@ const emojis = [
             'badge',
             'name',
         ],
+        name: 'name_badge',
     },
     {
         code: '⚜',
         keywords: [
             'fleur-de-lis',
         ],
+        name: 'fleur_de_lis',
     },
     {
         code: '🔰',
@@ -8835,6 +9796,7 @@ const emojis = [
             'tool',
             'yellow',
         ],
+        name: 'beginner',
     },
     {
         code: '🔱',
@@ -8845,6 +9807,7 @@ const emojis = [
             'tool',
             'trident',
         ],
+        name: 'trident',
     },
     {
         code: '⭕',
@@ -8852,6 +9815,7 @@ const emojis = [
             'circle',
             'o',
         ],
+        name: 'o',
     },
     {
         code: '✅',
@@ -8859,6 +9823,7 @@ const emojis = [
             'check',
             'mark',
         ],
+        name: 'white_check_mark',
     },
     {
         code: '☑️',
@@ -8867,6 +9832,7 @@ const emojis = [
             'box',
             'check',
         ],
+        name: 'ballot_box_with_check',
     },
     {
         code: '✔️',
@@ -8874,6 +9840,7 @@ const emojis = [
             'check',
             'mark',
         ],
+        name: 'heavy_check_mark',
     },
     {
         code: '✖️',
@@ -8883,6 +9850,7 @@ const emojis = [
             'multiply',
             'x',
         ],
+        name: 'heavy_multiplication_x',
     },
     {
         code: '❌',
@@ -8893,6 +9861,7 @@ const emojis = [
             'multiply',
             'x',
         ],
+        name: 'x',
     },
     {
         code: '❎',
@@ -8900,6 +9869,7 @@ const emojis = [
             'mark',
             'square',
         ],
+        name: 'negative_squared_cross_mark',
     },
     {
         code: '➕',
@@ -8907,6 +9877,7 @@ const emojis = [
             'math',
             'plus',
         ],
+        name: 'heavy_plus_sign',
     },
     {
         code: '➖',
@@ -8914,6 +9885,7 @@ const emojis = [
             'math',
             'minus',
         ],
+        name: 'heavy_minus_sign',
     },
     {
         code: '➗',
@@ -8921,6 +9893,7 @@ const emojis = [
             'division',
             'math',
         ],
+        name: 'heavy_division_sign',
     },
     {
         code: '➰',
@@ -8928,6 +9901,7 @@ const emojis = [
             'curl',
             'loop',
         ],
+        name: 'curly_loop',
     },
     {
         code: '➿',
@@ -8936,6 +9910,7 @@ const emojis = [
             'double',
             'loop',
         ],
+        name: 'loop',
     },
     {
         code: '〽',
@@ -8943,24 +9918,28 @@ const emojis = [
             'mark',
             'part',
         ],
+        name: 'part_alternation_mark',
     },
     {
         code: '✳️',
         keywords: [
             'asterisk',
         ],
+        name: 'eight_spoked_asterisk',
     },
     {
         code: '✴️',
         keywords: [
             'star',
         ],
+        name: 'eight_pointed_black_star',
     },
     {
         code: '❇️',
         keywords: [
             'sparkle',
         ],
+        name: 'sparkle',
     },
     {
         code: '‼',
@@ -8970,6 +9949,7 @@ const emojis = [
             'mark',
             'punctuation',
         ],
+        name: 'bangbang',
     },
     {
         code: '⁉️',
@@ -8980,6 +9960,7 @@ const emojis = [
             'punctuation',
             'question',
         ],
+        name: 'interrobang',
     },
     {
         code: '❓',
@@ -8988,6 +9969,7 @@ const emojis = [
             'punctuation',
             'question',
         ],
+        name: 'question',
     },
     {
         code: '❔',
@@ -8997,6 +9979,7 @@ const emojis = [
             'punctuation',
             'question',
         ],
+        name: 'grey_question',
     },
     {
         code: '❕',
@@ -9006,6 +9989,7 @@ const emojis = [
             'outlined',
             'punctuation',
         ],
+        name: 'grey_exclamation',
     },
     {
         code: '❗',
@@ -9014,6 +9998,7 @@ const emojis = [
             'mark',
             'punctuation',
         ],
+        name: 'exclamation',
     },
     {
         code: '〰️',
@@ -9022,18 +10007,21 @@ const emojis = [
             'punctuation',
             'wavy',
         ],
+        name: 'wavy_dash',
     },
     {
         code: '©',
         keywords: [
             'copyright',
         ],
+        name: 'copyright',
     },
     {
         code: '®',
         keywords: [
             'registered',
         ],
+        name: 'registered',
     },
     {
         code: '™️',
@@ -9042,6 +10030,7 @@ const emojis = [
             'tm',
             'trademark',
         ],
+        name: 'tm',
     },
     {
         code: '♈',
@@ -9050,6 +10039,7 @@ const emojis = [
             'ram',
             'zodiac',
         ],
+        name: 'aries',
     },
     {
         code: '♉',
@@ -9059,6 +10049,7 @@ const emojis = [
             'taurus',
             'zodiac',
         ],
+        name: 'taurus',
     },
     {
         code: '♊',
@@ -9067,6 +10058,7 @@ const emojis = [
             'twins',
             'zodiac',
         ],
+        name: 'gemini',
     },
     {
         code: '♋',
@@ -9075,6 +10067,7 @@ const emojis = [
             'crab',
             'zodiac',
         ],
+        name: 'cancer',
     },
     {
         code: '♌',
@@ -9083,6 +10076,7 @@ const emojis = [
             'lion',
             'zodiac',
         ],
+        name: 'leo',
     },
     {
         code: '♍',
@@ -9092,6 +10086,7 @@ const emojis = [
             'virgo',
             'zodiac',
         ],
+        name: 'virgo',
     },
     {
         code: '♎',
@@ -9102,6 +10097,7 @@ const emojis = [
             'scales',
             'zodiac',
         ],
+        name: 'libra',
     },
     {
         code: '♏',
@@ -9111,6 +10107,7 @@ const emojis = [
             'scorpius',
             'zodiac',
         ],
+        name: 'scorpius',
     },
     {
         code: '♐',
@@ -9119,6 +10116,7 @@ const emojis = [
             'sagittarius',
             'zodiac',
         ],
+        name: 'sagittarius',
     },
     {
         code: '♑',
@@ -9127,6 +10125,7 @@ const emojis = [
             'goat',
             'zodiac',
         ],
+        name: 'capricorn',
     },
     {
         code: '♒',
@@ -9136,6 +10135,7 @@ const emojis = [
             'water',
             'zodiac',
         ],
+        name: 'aquarius',
     },
     {
         code: '♓',
@@ -9144,6 +10144,7 @@ const emojis = [
             'pisces',
             'zodiac',
         ],
+        name: 'pisces',
     },
     {
         code: '⛎',
@@ -9154,6 +10155,7 @@ const emojis = [
             'snake',
             'zodiac',
         ],
+        name: 'ophiuchus',
     },
     {
         code: '🔀',
@@ -9161,6 +10163,7 @@ const emojis = [
             'arrow',
             'crossed',
         ],
+        name: 'twisted_rightwards_arrows',
     },
     {
         code: '🔁',
@@ -9169,6 +10172,7 @@ const emojis = [
             'clockwise',
             'repeat',
         ],
+        name: 'repeat',
     },
     {
         code: '🔂',
@@ -9177,6 +10181,7 @@ const emojis = [
             'clockwise',
             'once',
         ],
+        name: 'repeat_one',
     },
     {
         code: '▶',
@@ -9186,6 +10191,7 @@ const emojis = [
             'right',
             'triangle',
         ],
+        name: 'arrow_forward',
     },
     {
         code: '⏩',
@@ -9195,6 +10201,7 @@ const emojis = [
             'fast',
             'forward',
         ],
+        name: 'fast_forward',
     },
     {
         code: '⏭',
@@ -9204,6 +10211,7 @@ const emojis = [
             'next track',
             'triangle',
         ],
+        name: 'next_track_button',
     },
     {
         code: '⏯',
@@ -9214,6 +10222,7 @@ const emojis = [
             'right',
             'triangle',
         ],
+        name: 'play_or_pause_button',
     },
     {
         code: '◀',
@@ -9223,6 +10232,7 @@ const emojis = [
             'reverse',
             'triangle',
         ],
+        name: 'arrow_backward',
     },
     {
         code: '⏪',
@@ -9231,6 +10241,7 @@ const emojis = [
             'double',
             'rewind',
         ],
+        name: 'rewind',
     },
     {
         code: '⏮',
@@ -9240,6 +10251,7 @@ const emojis = [
             'previous track',
             'triangle',
         ],
+        name: 'previous_track_button',
     },
     {
         code: '🔼',
@@ -9248,6 +10260,7 @@ const emojis = [
             'button',
             'red',
         ],
+        name: 'arrow_up_small',
     },
     {
         code: '⏫',
@@ -9255,6 +10268,7 @@ const emojis = [
             'arrow',
             'double',
         ],
+        name: 'arrow_double_up',
     },
     {
         code: '🔽',
@@ -9264,6 +10278,7 @@ const emojis = [
             'down',
             'red',
         ],
+        name: 'arrow_down_small',
     },
     {
         code: '⏬',
@@ -9272,6 +10287,7 @@ const emojis = [
             'double',
             'down',
         ],
+        name: 'arrow_double_down',
     },
     {
         code: '⏸',
@@ -9281,6 +10297,7 @@ const emojis = [
             'pause',
             'vertical',
         ],
+        name: 'pause_button',
     },
     {
         code: '⏹',
@@ -9288,6 +10305,7 @@ const emojis = [
             'square',
             'stop',
         ],
+        name: 'stop_button',
     },
     {
         code: '⏺',
@@ -9295,12 +10313,14 @@ const emojis = [
             'circle',
             'record',
         ],
+        name: 'record_button',
     },
     {
         code: '⏏',
         keywords: [
             'eject',
         ],
+        name: 'eject_button',
     },
     {
         code: '🎦',
@@ -9312,6 +10332,7 @@ const emojis = [
             'film',
             'movie',
         ],
+        name: 'cinema',
     },
     {
         code: '🔅',
@@ -9320,6 +10341,7 @@ const emojis = [
             'dim',
             'low',
         ],
+        name: 'low_brightness',
     },
     {
         code: '🔆',
@@ -9327,6 +10349,7 @@ const emojis = [
             'bright',
             'brightness',
         ],
+        name: 'high_brightness',
     },
     {
         code: '📶',
@@ -9340,6 +10363,7 @@ const emojis = [
             'signal',
             'telephone',
         ],
+        name: 'signal_strength',
     },
     {
         code: '📳',
@@ -9352,6 +10376,7 @@ const emojis = [
             'telephone',
             'vibration',
         ],
+        name: 'vibration_mode',
     },
     {
         code: '📴',
@@ -9363,6 +10388,7 @@ const emojis = [
             'phone',
             'telephone',
         ],
+        name: 'mobile_phone_off',
     },
     {
         code: '#️⃣',
@@ -9371,6 +10397,7 @@ const emojis = [
             'keycap',
             'pound',
         ],
+        name: 'hash',
     },
     {
         code: '*️⃣',
@@ -9379,6 +10406,7 @@ const emojis = [
             'keycap',
             'star',
         ],
+        name: 'asterisk',
     },
     {
         code: '0️⃣',
@@ -9387,6 +10415,7 @@ const emojis = [
             'keycap',
             'zero',
         ],
+        name: 'zero',
     },
     {
         code: '1️⃣',
@@ -9395,6 +10424,7 @@ const emojis = [
             'keycap',
             'one',
         ],
+        name: 'one',
     },
     {
         code: '2️⃣',
@@ -9403,6 +10433,7 @@ const emojis = [
             'keycap',
             'two',
         ],
+        name: 'two',
     },
     {
         code: '3️⃣',
@@ -9411,6 +10442,7 @@ const emojis = [
             'keycap',
             'three',
         ],
+        name: 'three',
     },
     {
         code: '4️⃣',
@@ -9419,6 +10451,7 @@ const emojis = [
             'four',
             'keycap',
         ],
+        name: 'four',
     },
     {
         code: '5️⃣',
@@ -9427,6 +10460,7 @@ const emojis = [
             'five',
             'keycap',
         ],
+        name: 'five',
     },
     {
         code: '6️⃣',
@@ -9435,6 +10469,7 @@ const emojis = [
             'keycap',
             'six',
         ],
+        name: 'six',
     },
     {
         code: '7️⃣',
@@ -9443,6 +10478,7 @@ const emojis = [
             'keycap',
             'seven',
         ],
+        name: 'seven',
     },
     {
         code: '8️⃣',
@@ -9451,6 +10487,7 @@ const emojis = [
             'eight',
             'keycap',
         ],
+        name: 'eight',
     },
     {
         code: '9️⃣',
@@ -9459,6 +10496,7 @@ const emojis = [
             'keycap',
             'nine',
         ],
+        name: 'nine',
     },
     {
         code: '🔟',
@@ -9467,6 +10505,7 @@ const emojis = [
             'keycap',
             'ten',
         ],
+        name: 'keycap_ten',
     },
     {
         code: '💯',
@@ -9476,6 +10515,7 @@ const emojis = [
             'hundred',
             'score',
         ],
+        name: '100',
     },
     {
         code: '🔠',
@@ -9485,6 +10525,7 @@ const emojis = [
             'letters',
             'uppercase',
         ],
+        name: 'capital_abcd',
     },
     {
         code: '🔡',
@@ -9495,6 +10536,7 @@ const emojis = [
             'letters',
             'lowercase',
         ],
+        name: 'abcd',
     },
     {
         code: '🔢',
@@ -9503,12 +10545,14 @@ const emojis = [
             'input',
             'numbers',
         ],
+        name: '1234',
     },
     {
         code: '🔣',
         keywords: [
             'input',
         ],
+        name: 'symbols',
     },
     {
         code: '🔤',
@@ -9519,6 +10563,7 @@ const emojis = [
             'latin',
             'letters',
         ],
+        name: 'abc',
     },
     {
         code: '🅰',
@@ -9526,6 +10571,7 @@ const emojis = [
             'a',
             'blood',
         ],
+        name: 'a',
     },
     {
         code: '🆎',
@@ -9533,6 +10579,7 @@ const emojis = [
             'ab',
             'blood',
         ],
+        name: 'ab',
     },
     {
         code: '🅱',
@@ -9540,24 +10587,28 @@ const emojis = [
             'b',
             'blood',
         ],
+        name: 'b',
     },
     {
         code: '🆑',
         keywords: [
             'cl',
         ],
+        name: 'cl',
     },
     {
         code: '🆒',
         keywords: [
             'cool',
         ],
+        name: 'cool',
     },
     {
         code: '🆓',
         keywords: [
             'free',
         ],
+        name: 'free',
     },
     {
         code: 'ℹ️',
@@ -9565,6 +10616,7 @@ const emojis = [
             'i',
             'information',
         ],
+        name: 'information_source',
     },
     {
         code: '🆔',
@@ -9572,6 +10624,7 @@ const emojis = [
             'id',
             'identity',
         ],
+        name: 'id',
     },
     {
         code: 'Ⓜ',
@@ -9579,18 +10632,21 @@ const emojis = [
             'circle',
             'm',
         ],
+        name: 'm',
     },
     {
         code: '🆕',
         keywords: [
             'new',
         ],
+        name: 'new',
     },
     {
         code: '🆖',
         keywords: [
             'ng',
         ],
+        name: 'ng',
     },
     {
         code: '🅾',
@@ -9598,18 +10654,21 @@ const emojis = [
             'blood',
             'o',
         ],
+        name: 'o2',
     },
     {
         code: '🆗',
         keywords: [
             'ok',
         ],
+        name: 'ok',
     },
     {
         code: '🅿',
         keywords: [
             'parking',
         ],
+        name: 'parking',
     },
     {
         code: '🆘',
@@ -9617,6 +10676,7 @@ const emojis = [
             'help',
             'sos',
         ],
+        name: 'sos',
     },
     {
         code: '🆙',
@@ -9624,6 +10684,7 @@ const emojis = [
             'mark',
             'up',
         ],
+        name: 'up',
     },
     {
         code: '🆚',
@@ -9631,84 +10692,98 @@ const emojis = [
             'versus',
             'vs',
         ],
+        name: 'vs',
     },
     {
         code: '🈁',
         keywords: [
             'japanese',
         ],
+        name: 'koko',
     },
     {
         code: '🈂',
         keywords: [
             'japanese',
         ],
+        name: 'sa',
     },
     {
         code: '🈷',
         keywords: [
             'japanese',
         ],
+        name: 'u6708',
     },
     {
         code: '🈶',
         keywords: [
             'japanese',
         ],
+        name: 'u6709',
     },
     {
         code: '🈯',
         keywords: [
             'japanese',
         ],
+        name: 'u6307',
     },
     {
         code: '🉐',
         keywords: [
             'japanese',
         ],
+        name: 'ideograph_advantage',
     },
     {
         code: '🈹',
         keywords: [
             'japanese',
         ],
+        name: 'u5272',
     },
     {
         code: '🈚',
         keywords: [
             'japanese',
         ],
+        name: 'u7121',
     },
     {
         code: '🈲',
         keywords: [
             'japanese',
         ],
+        name: 'u7981',
     },
     {
         code: '🉑',
         keywords: [
             'chinese',
         ],
+        name: 'accept',
     },
     {
         code: '🈸',
         keywords: [
             'chinese',
         ],
+        name: 'u7533',
     },
     {
         code: '🈴',
         keywords: [
             'chinese',
         ],
+        name: 'u5408',
     },
     {
         code: '🈳',
         keywords: [
             'chinese',
         ],
+        name: 'u7a7a',
     },
     {
         code: '㊗️',
@@ -9718,6 +10793,7 @@ const emojis = [
             'congratulations',
             'ideograph',
         ],
+        name: 'congratulations',
     },
     {
         code: '㊙️',
@@ -9726,18 +10802,21 @@ const emojis = [
             'ideograph',
             'secret',
         ],
+        name: 'secret',
     },
     {
         code: '🈺',
         keywords: [
             'chinese',
         ],
+        name: 'u55b6',
     },
     {
         code: '🈵',
         keywords: [
             'chinese',
         ],
+        name: 'u6e80',
     },
     {
         code: '▪',
@@ -9745,6 +10824,7 @@ const emojis = [
             'geometric',
             'square',
         ],
+        name: 'black_small_square',
     },
     {
         code: '▫',
@@ -9752,6 +10832,7 @@ const emojis = [
             'geometric',
             'square',
         ],
+        name: 'white_small_square',
     },
     {
         code: '◻',
@@ -9759,6 +10840,7 @@ const emojis = [
             'geometric',
             'square',
         ],
+        name: 'white_medium_square',
     },
     {
         code: '◼',
@@ -9766,6 +10848,7 @@ const emojis = [
             'geometric',
             'square',
         ],
+        name: 'black_medium_square',
     },
     {
         code: '◽',
@@ -9773,6 +10856,7 @@ const emojis = [
             'geometric',
             'square',
         ],
+        name: 'white_medium_small_square',
     },
     {
         code: '◾',
@@ -9780,6 +10864,7 @@ const emojis = [
             'geometric',
             'square',
         ],
+        name: 'black_medium_small_square',
     },
     {
         code: '⬛',
@@ -9787,6 +10872,7 @@ const emojis = [
             'geometric',
             'square',
         ],
+        name: 'black_large_square',
     },
     {
         code: '⬜',
@@ -9794,6 +10880,7 @@ const emojis = [
             'geometric',
             'square',
         ],
+        name: 'white_large_square',
     },
     {
         code: '🔶',
@@ -9802,6 +10889,7 @@ const emojis = [
             'geometric',
             'orange',
         ],
+        name: 'large_orange_diamond',
     },
     {
         code: '🔷',
@@ -9810,6 +10898,7 @@ const emojis = [
             'diamond',
             'geometric',
         ],
+        name: 'large_blue_diamond',
     },
     {
         code: '🔸',
@@ -9818,6 +10907,7 @@ const emojis = [
             'geometric',
             'orange',
         ],
+        name: 'small_orange_diamond',
     },
     {
         code: '🔹',
@@ -9826,6 +10916,7 @@ const emojis = [
             'diamond',
             'geometric',
         ],
+        name: 'small_blue_diamond',
     },
     {
         code: '🔺',
@@ -9833,6 +10924,7 @@ const emojis = [
             'geometric',
             'red',
         ],
+        name: 'small_red_triangle',
     },
     {
         code: '🔻',
@@ -9841,6 +10933,7 @@ const emojis = [
             'geometric',
             'red',
         ],
+        name: 'small_red_triangle_down',
     },
     {
         code: '💠',
@@ -9850,6 +10943,7 @@ const emojis = [
             'geometric',
             'inside',
         ],
+        name: 'diamond_shape_with_a_dot_inside',
     },
     {
         code: '🔘',
@@ -9858,6 +10952,7 @@ const emojis = [
             'geometric',
             'radio',
         ],
+        name: 'radio_button',
     },
     {
         code: '🔲',
@@ -9866,6 +10961,7 @@ const emojis = [
             'geometric',
             'square',
         ],
+        name: 'black_square_button',
     },
     {
         code: '🔳',
@@ -9875,6 +10971,7 @@ const emojis = [
             'outlined',
             'square',
         ],
+        name: 'white_square_button',
     },
     {
         code: '⚪',
@@ -9882,6 +10979,7 @@ const emojis = [
             'circle',
             'geometric',
         ],
+        name: 'white_circle',
     },
     {
         code: '⚫',
@@ -9889,6 +10987,7 @@ const emojis = [
             'circle',
             'geometric',
         ],
+        name: 'black_circle',
     },
     {
         code: '🔴',
@@ -9897,6 +10996,7 @@ const emojis = [
             'geometric',
             'red',
         ],
+        name: 'red_circle',
     },
     {
         code: '🔵',
@@ -9905,6 +11005,7 @@ const emojis = [
             'circle',
             'geometric',
         ],
+        name: 'large_blue_circle',
     },
     {
         code: 'flags',
@@ -9918,6 +11019,7 @@ const emojis = [
             'flag',
             'racing',
         ],
+        name: 'checkered_flag',
     },
     {
         code: '🚩',
@@ -9925,6 +11027,7 @@ const emojis = [
             'flag',
             'post',
         ],
+        name: 'triangular_flag_on_post',
     },
     {
         code: '🎌',
@@ -9936,6 +11039,7 @@ const emojis = [
             'flag',
             'japanese',
         ],
+        name: 'crossed_flags',
     },
     {
         code: '🏴',
@@ -9943,6 +11047,7 @@ const emojis = [
             'flag',
             'waving',
         ],
+        name: 'black_flag',
     },
     {
         code: '🏳',
@@ -9950,6 +11055,7 @@ const emojis = [
             'flag',
             'waving',
         ],
+        name: 'white_flag',
     },
     {
         code: '🇦🇨',
@@ -9958,6 +11064,7 @@ const emojis = [
             'flag',
             'island',
         ],
+        name: 'ascension_island',
     },
     {
         code: '🇦🇩',
@@ -9965,6 +11072,7 @@ const emojis = [
             'andorra',
             'flag',
         ],
+        name: 'andorra',
     },
     {
         code: '🇦🇪',
@@ -9974,6 +11082,7 @@ const emojis = [
             'uae',
             'united',
         ],
+        name: 'united_arab_emirates',
     },
     {
         code: '🇦🇫',
@@ -9981,6 +11090,7 @@ const emojis = [
             'afghanistan',
             'flag',
         ],
+        name: 'afghanistan',
     },
     {
         code: '🇦🇬',
@@ -9989,6 +11099,7 @@ const emojis = [
             'barbuda',
             'flag',
         ],
+        name: 'antigua_barbuda',
     },
     {
         code: '🇦🇮',
@@ -9996,6 +11107,7 @@ const emojis = [
             'anguilla',
             'flag',
         ],
+        name: 'anguilla',
     },
     {
         code: '🇦🇱',
@@ -10003,6 +11115,7 @@ const emojis = [
             'albania',
             'flag',
         ],
+        name: 'albania',
     },
     {
         code: '🇦🇲',
@@ -10010,6 +11123,7 @@ const emojis = [
             'armenia',
             'flag',
         ],
+        name: 'armenia',
     },
     {
         code: '🇦🇴',
@@ -10017,6 +11131,7 @@ const emojis = [
             'angola',
             'flag',
         ],
+        name: 'angola',
     },
     {
         code: '🇦🇶',
@@ -10024,6 +11139,7 @@ const emojis = [
             'antarctica',
             'flag',
         ],
+        name: 'antarctica',
     },
     {
         code: '🇦🇷',
@@ -10031,6 +11147,7 @@ const emojis = [
             'argentina',
             'flag',
         ],
+        name: 'argentina',
     },
     {
         code: '🇦🇸',
@@ -10039,6 +11156,7 @@ const emojis = [
             'flag',
             'samoa',
         ],
+        name: 'american_samoa',
     },
     {
         code: '🇦🇹',
@@ -10046,6 +11164,7 @@ const emojis = [
             'austria',
             'flag',
         ],
+        name: 'austria',
     },
     {
         code: '🇦🇺',
@@ -10053,6 +11172,7 @@ const emojis = [
             'australia',
             'flag',
         ],
+        name: 'australia',
     },
     {
         code: '🇦🇼',
@@ -10060,6 +11180,7 @@ const emojis = [
             'aruba',
             'flag',
         ],
+        name: 'aruba',
     },
     {
         code: '🇦🇽',
@@ -10067,6 +11188,7 @@ const emojis = [
             'åland',
             'flag',
         ],
+        name: 'aland_islands',
     },
     {
         code: '🇦🇿',
@@ -10074,6 +11196,7 @@ const emojis = [
             'azerbaijan',
             'flag',
         ],
+        name: 'azerbaijan',
     },
     {
         code: '🇧🇦',
@@ -10082,6 +11205,7 @@ const emojis = [
             'flag',
             'herzegovina',
         ],
+        name: 'bosnia_herzegovina',
     },
     {
         code: '🇧🇧',
@@ -10089,6 +11213,7 @@ const emojis = [
             'barbados',
             'flag',
         ],
+        name: 'barbados',
     },
     {
         code: '🇧🇩',
@@ -10096,6 +11221,7 @@ const emojis = [
             'bangladesh',
             'flag',
         ],
+        name: 'bangladesh',
     },
     {
         code: '🇧🇪',
@@ -10103,6 +11229,7 @@ const emojis = [
             'belgium',
             'flag',
         ],
+        name: 'belgium',
     },
     {
         code: '🇧🇫',
@@ -10110,6 +11237,7 @@ const emojis = [
             'burkina faso',
             'flag',
         ],
+        name: 'burkina_faso',
     },
     {
         code: '🇧🇬',
@@ -10117,6 +11245,7 @@ const emojis = [
             'bulgaria',
             'flag',
         ],
+        name: 'bulgaria',
     },
     {
         code: '🇧🇭',
@@ -10124,6 +11253,7 @@ const emojis = [
             'bahrain',
             'flag',
         ],
+        name: 'bahrain',
     },
     {
         code: '🇧🇮',
@@ -10131,6 +11261,7 @@ const emojis = [
             'burundi',
             'flag',
         ],
+        name: 'burundi',
     },
     {
         code: '🇧🇯',
@@ -10138,6 +11269,7 @@ const emojis = [
             'benin',
             'flag',
         ],
+        name: 'benin',
     },
     {
         code: '🇧🇱',
@@ -10147,6 +11279,7 @@ const emojis = [
             'flag',
             'saint',
         ],
+        name: 'st_barthelemy',
     },
     {
         code: '🇧🇲',
@@ -10154,6 +11287,7 @@ const emojis = [
             'bermuda',
             'flag',
         ],
+        name: 'bermuda',
     },
     {
         code: '🇧🇳',
@@ -10162,6 +11296,7 @@ const emojis = [
             'darussalam',
             'flag',
         ],
+        name: 'brunei',
     },
     {
         code: '🇧🇴',
@@ -10169,6 +11304,7 @@ const emojis = [
             'bolivia',
             'flag',
         ],
+        name: 'bolivia',
     },
     {
         code: '🇧🇶',
@@ -10181,6 +11317,7 @@ const emojis = [
             'saba',
             'sint',
         ],
+        name: 'caribbean_netherlands',
     },
     {
         code: '🇧🇷',
@@ -10188,6 +11325,7 @@ const emojis = [
             'brazil',
             'flag',
         ],
+        name: 'brazil',
     },
     {
         code: '🇧🇸',
@@ -10195,6 +11333,7 @@ const emojis = [
             'bahamas',
             'flag',
         ],
+        name: 'bahamas',
     },
     {
         code: '🇧🇹',
@@ -10202,6 +11341,7 @@ const emojis = [
             'bhutan',
             'flag',
         ],
+        name: 'bhutan',
     },
     {
         code: '🇧🇻',
@@ -10210,6 +11350,7 @@ const emojis = [
             'flag',
             'island',
         ],
+        name: 'bouvet_island',
     },
     {
         code: '🇧🇼',
@@ -10217,6 +11358,7 @@ const emojis = [
             'botswana',
             'flag',
         ],
+        name: 'botswana',
     },
     {
         code: '🇧🇾',
@@ -10224,6 +11366,7 @@ const emojis = [
             'belarus',
             'flag',
         ],
+        name: 'belarus',
     },
     {
         code: '🇧🇿',
@@ -10231,6 +11374,7 @@ const emojis = [
             'belize',
             'flag',
         ],
+        name: 'belize',
     },
     {
         code: '🇨🇦',
@@ -10238,6 +11382,7 @@ const emojis = [
             'canada',
             'flag',
         ],
+        name: 'canada',
     },
     {
         code: '🇨🇨',
@@ -10247,6 +11392,7 @@ const emojis = [
             'island',
             'keeling',
         ],
+        name: 'cocos_islands',
     },
     {
         code: '🇨🇩',
@@ -10259,6 +11405,7 @@ const emojis = [
             'kinshasa',
             'republic',
         ],
+        name: 'congo_kinshasa',
     },
     {
         code: '🇨🇫',
@@ -10267,6 +11414,7 @@ const emojis = [
             'flag',
             'republic',
         ],
+        name: 'central_african_republic',
     },
     {
         code: '🇨🇬',
@@ -10279,6 +11427,7 @@ const emojis = [
             'republic',
             'republic of the congo',
         ],
+        name: 'congo_brazzaville',
     },
     {
         code: '🇨🇭',
@@ -10286,6 +11435,7 @@ const emojis = [
             'flag',
             'switzerland',
         ],
+        name: 'switzerland',
     },
     {
         code: '🇨🇮',
@@ -10295,6 +11445,7 @@ const emojis = [
             'flag',
             'ivory coast',
         ],
+        name: 'cote_divoire',
     },
     {
         code: '🇨🇰',
@@ -10303,6 +11454,7 @@ const emojis = [
             'flag',
             'island',
         ],
+        name: 'cook_islands',
     },
     {
         code: '🇨🇱',
@@ -10310,6 +11462,7 @@ const emojis = [
             'chile',
             'flag',
         ],
+        name: 'chile',
     },
     {
         code: '🇨🇲',
@@ -10317,6 +11470,7 @@ const emojis = [
             'cameroon',
             'flag',
         ],
+        name: 'cameroon',
     },
     {
         code: '🇨🇳',
@@ -10324,6 +11478,7 @@ const emojis = [
             'china',
             'flag',
         ],
+        name: 'cn',
     },
     {
         code: '🇨🇴',
@@ -10331,6 +11486,7 @@ const emojis = [
             'colombia',
             'flag',
         ],
+        name: 'colombia',
     },
     {
         code: '🇨🇵',
@@ -10339,6 +11495,7 @@ const emojis = [
             'flag',
             'island',
         ],
+        name: 'clipperton_island',
     },
     {
         code: '🇨🇷',
@@ -10346,6 +11503,7 @@ const emojis = [
             'costa rica',
             'flag',
         ],
+        name: 'costa_rica',
     },
     {
         code: '🇨🇺',
@@ -10353,6 +11511,7 @@ const emojis = [
             'cuba',
             'flag',
         ],
+        name: 'cuba',
     },
     {
         code: '🇨🇻',
@@ -10362,6 +11521,7 @@ const emojis = [
             'flag',
             'verde',
         ],
+        name: 'cape_verde',
     },
     {
         code: '🇨🇼',
@@ -10371,6 +11531,7 @@ const emojis = [
             'curaçao',
             'flag',
         ],
+        name: 'curacao',
     },
     {
         code: '🇨🇽',
@@ -10379,6 +11540,7 @@ const emojis = [
             'flag',
             'island',
         ],
+        name: 'christmas_island',
     },
     {
         code: '🇨🇾',
@@ -10386,6 +11548,7 @@ const emojis = [
             'cyprus',
             'flag',
         ],
+        name: 'cyprus',
     },
     {
         code: '🇨🇿',
@@ -10393,6 +11556,7 @@ const emojis = [
             'czech republic',
             'flag',
         ],
+        name: 'czech_republic',
     },
     {
         code: '🇩🇪',
@@ -10400,6 +11564,7 @@ const emojis = [
             'flag',
             'germany',
         ],
+        name: 'de',
     },
     {
         code: '🇩🇬',
@@ -10407,6 +11572,7 @@ const emojis = [
             'diego garcia',
             'flag',
         ],
+        name: 'diego_garcia',
     },
     {
         code: '🇩🇯',
@@ -10414,6 +11580,7 @@ const emojis = [
             'djibouti',
             'flag',
         ],
+        name: 'djibouti',
     },
     {
         code: '🇩🇰',
@@ -10421,6 +11588,7 @@ const emojis = [
             'denmark',
             'flag',
         ],
+        name: 'denmark',
     },
     {
         code: '🇩🇲',
@@ -10428,6 +11596,7 @@ const emojis = [
             'dominica',
             'flag',
         ],
+        name: 'dominica',
     },
     {
         code: '🇩🇴',
@@ -10435,6 +11604,7 @@ const emojis = [
             'dominican republic',
             'flag',
         ],
+        name: 'dominican_republic',
     },
     {
         code: '🇩🇿',
@@ -10442,6 +11612,7 @@ const emojis = [
             'algeria',
             'flag',
         ],
+        name: 'algeria',
     },
     {
         code: '🇪🇦',
@@ -10450,6 +11621,7 @@ const emojis = [
             'flag',
             'melilla',
         ],
+        name: 'ceuta_melilla',
     },
     {
         code: '🇪🇨',
@@ -10457,6 +11629,7 @@ const emojis = [
             'ecuador',
             'flag',
         ],
+        name: 'ecuador',
     },
     {
         code: '🇪🇪',
@@ -10464,6 +11637,7 @@ const emojis = [
             'estonia',
             'flag',
         ],
+        name: 'estonia',
     },
     {
         code: '🇪🇬',
@@ -10471,6 +11645,7 @@ const emojis = [
             'egypt',
             'flag',
         ],
+        name: 'egypt',
     },
     {
         code: '🇪🇭',
@@ -10480,6 +11655,7 @@ const emojis = [
             'west',
             'western sahara',
         ],
+        name: 'western_sahara',
     },
     {
         code: '🇪🇷',
@@ -10487,6 +11663,7 @@ const emojis = [
             'eritrea',
             'flag',
         ],
+        name: 'eritrea',
     },
     {
         code: '🇪🇸',
@@ -10494,6 +11671,7 @@ const emojis = [
             'flag',
             'spain',
         ],
+        name: 'es',
     },
     {
         code: '🇪🇹',
@@ -10501,6 +11679,7 @@ const emojis = [
             'ethiopia',
             'flag',
         ],
+        name: 'ethiopia',
     },
     {
         code: '🇪🇺',
@@ -10508,6 +11687,7 @@ const emojis = [
             'european union',
             'flag',
         ],
+        name: 'eu',
     },
     {
         code: '🇫🇮',
@@ -10515,6 +11695,7 @@ const emojis = [
             'finland',
             'flag',
         ],
+        name: 'finland',
     },
     {
         code: '🇫🇯',
@@ -10522,6 +11703,7 @@ const emojis = [
             'fiji',
             'flag',
         ],
+        name: 'fiji',
     },
     {
         code: '🇫🇰',
@@ -10533,6 +11715,7 @@ const emojis = [
             'islas',
             'malvinas',
         ],
+        name: 'falkland_islands',
     },
     {
         code: '🇫🇲',
@@ -10540,6 +11723,7 @@ const emojis = [
             'flag',
             'micronesia',
         ],
+        name: 'micronesia',
     },
     {
         code: '🇫🇴',
@@ -10548,6 +11732,7 @@ const emojis = [
             'flag',
             'island',
         ],
+        name: 'faroe_islands',
     },
     {
         code: '🇫🇷',
@@ -10555,6 +11740,7 @@ const emojis = [
             'flag',
             'france',
         ],
+        name: 'fr',
     },
     {
         code: '🇬🇦',
@@ -10562,6 +11748,7 @@ const emojis = [
             'flag',
             'gabon',
         ],
+        name: 'gabon',
     },
     {
         code: '🇬🇧',
@@ -10581,6 +11768,7 @@ const emojis = [
             'united kingdom',
             'wales',
         ],
+        name: 'gb',
     },
     {
         code: '🇬🇩',
@@ -10588,6 +11776,7 @@ const emojis = [
             'flag',
             'grenada',
         ],
+        name: 'grenada',
     },
     {
         code: '🇬🇪',
@@ -10595,6 +11784,7 @@ const emojis = [
             'flag',
             'georgia',
         ],
+        name: 'georgia',
     },
     {
         code: '🇬🇫',
@@ -10603,6 +11793,7 @@ const emojis = [
             'french',
             'guiana',
         ],
+        name: 'french_guiana',
     },
     {
         code: '🇬🇬',
@@ -10610,6 +11801,7 @@ const emojis = [
             'flag',
             'guernsey',
         ],
+        name: 'guernsey',
     },
     {
         code: '🇬🇭',
@@ -10617,6 +11809,7 @@ const emojis = [
             'flag',
             'ghana',
         ],
+        name: 'ghana',
     },
     {
         code: '🇬🇮',
@@ -10624,6 +11817,7 @@ const emojis = [
             'flag',
             'gibraltar',
         ],
+        name: 'gibraltar',
     },
     {
         code: '🇬🇱',
@@ -10631,6 +11825,7 @@ const emojis = [
             'flag',
             'greenland',
         ],
+        name: 'greenland',
     },
     {
         code: '🇬🇲',
@@ -10638,6 +11833,7 @@ const emojis = [
             'flag',
             'gambia',
         ],
+        name: 'gambia',
     },
     {
         code: '🇬🇳',
@@ -10645,6 +11841,7 @@ const emojis = [
             'flag',
             'guinea',
         ],
+        name: 'guinea',
     },
     {
         code: '🇬🇵',
@@ -10652,6 +11849,7 @@ const emojis = [
             'flag',
             'guadeloupe',
         ],
+        name: 'guadeloupe',
     },
     {
         code: '🇬🇶',
@@ -10660,6 +11858,7 @@ const emojis = [
             'flag',
             'guinea',
         ],
+        name: 'equatorial_guinea',
     },
     {
         code: '🇬🇷',
@@ -10667,6 +11866,7 @@ const emojis = [
             'flag',
             'greece',
         ],
+        name: 'greece',
     },
     {
         code: '🇬🇸',
@@ -10678,6 +11878,7 @@ const emojis = [
             'south georgia',
             'south sandwich',
         ],
+        name: 'south_georgia_south_sandwich_islands',
     },
     {
         code: '🇬🇹',
@@ -10685,6 +11886,7 @@ const emojis = [
             'flag',
             'guatemala',
         ],
+        name: 'guatemala',
     },
     {
         code: '🇬🇺',
@@ -10692,6 +11894,7 @@ const emojis = [
             'flag',
             'guam',
         ],
+        name: 'guam',
     },
     {
         code: '🇬🇼',
@@ -10700,6 +11903,7 @@ const emojis = [
             'flag',
             'guinea',
         ],
+        name: 'guinea_bissau',
     },
     {
         code: '🇬🇾',
@@ -10707,6 +11911,7 @@ const emojis = [
             'flag',
             'guyana',
         ],
+        name: 'guyana',
     },
     {
         code: '🇭🇰',
@@ -10715,6 +11920,7 @@ const emojis = [
             'flag',
             'hong kong',
         ],
+        name: 'hong_kong',
     },
     {
         code: '🇭🇲',
@@ -10724,6 +11930,7 @@ const emojis = [
             'island',
             'mcdonald',
         ],
+        name: 'heard_mcdonald_islands',
     },
     {
         code: '🇭🇳',
@@ -10731,6 +11938,7 @@ const emojis = [
             'flag',
             'honduras',
         ],
+        name: 'honduras',
     },
     {
         code: '🇭🇷',
@@ -10738,6 +11946,7 @@ const emojis = [
             'croatia',
             'flag',
         ],
+        name: 'croatia',
     },
     {
         code: '🇭🇹',
@@ -10745,6 +11954,7 @@ const emojis = [
             'flag',
             'haiti',
         ],
+        name: 'haiti',
     },
     {
         code: '🇭🇺',
@@ -10752,6 +11962,7 @@ const emojis = [
             'flag',
             'hungary',
         ],
+        name: 'hungary',
     },
     {
         code: '🇮🇨',
@@ -10760,6 +11971,7 @@ const emojis = [
             'flag',
             'island',
         ],
+        name: 'canary_islands',
     },
     {
         code: '🇮🇩',
@@ -10767,6 +11979,7 @@ const emojis = [
             'flag',
             'indonesia',
         ],
+        name: 'indonesia',
     },
     {
         code: '🇮🇪',
@@ -10774,6 +11987,7 @@ const emojis = [
             'flag',
             'ireland',
         ],
+        name: 'ireland',
     },
     {
         code: '🇮🇱',
@@ -10781,6 +11995,7 @@ const emojis = [
             'flag',
             'israel',
         ],
+        name: 'israel',
     },
     {
         code: '🇮🇲',
@@ -10788,6 +12003,7 @@ const emojis = [
             'flag',
             'isle of man',
         ],
+        name: 'isle_of_man',
     },
     {
         code: '🇮🇳',
@@ -10795,6 +12011,7 @@ const emojis = [
             'flag',
             'india',
         ],
+        name: 'india',
     },
     {
         code: '🇮🇴',
@@ -10805,6 +12022,7 @@ const emojis = [
             'indian ocean',
             'island',
         ],
+        name: 'british_indian_ocean_territory',
     },
     {
         code: '🇮🇶',
@@ -10812,6 +12030,7 @@ const emojis = [
             'flag',
             'iraq',
         ],
+        name: 'iraq',
     },
     {
         code: '🇮🇷',
@@ -10819,6 +12038,7 @@ const emojis = [
             'flag',
             'iran',
         ],
+        name: 'iran',
     },
     {
         code: '🇮🇸',
@@ -10826,6 +12046,7 @@ const emojis = [
             'flag',
             'iceland',
         ],
+        name: 'iceland',
     },
     {
         code: '🇮🇹',
@@ -10833,6 +12054,7 @@ const emojis = [
             'flag',
             'italy',
         ],
+        name: 'it',
     },
     {
         code: '🇯🇪',
@@ -10840,6 +12062,7 @@ const emojis = [
             'flag',
             'jersey',
         ],
+        name: 'jersey',
     },
     {
         code: '🇯🇲',
@@ -10847,6 +12070,7 @@ const emojis = [
             'flag',
             'jamaica',
         ],
+        name: 'jamaica',
     },
     {
         code: '🇯🇴',
@@ -10854,6 +12078,7 @@ const emojis = [
             'flag',
             'jordan',
         ],
+        name: 'jordan',
     },
     {
         code: '🇯🇵',
@@ -10861,6 +12086,7 @@ const emojis = [
             'flag',
             'japan',
         ],
+        name: 'jp',
     },
     {
         code: '🇰🇪',
@@ -10868,6 +12094,7 @@ const emojis = [
             'flag',
             'kenya',
         ],
+        name: 'kenya',
     },
     {
         code: '🇰🇬',
@@ -10875,6 +12102,7 @@ const emojis = [
             'flag',
             'kyrgyzstan',
         ],
+        name: 'kyrgyzstan',
     },
     {
         code: '🇰🇭',
@@ -10882,6 +12110,7 @@ const emojis = [
             'cambodia',
             'flag',
         ],
+        name: 'cambodia',
     },
     {
         code: '🇰🇮',
@@ -10889,6 +12118,7 @@ const emojis = [
             'flag',
             'kiribati',
         ],
+        name: 'kiribati',
     },
     {
         code: '🇰🇲',
@@ -10896,6 +12126,7 @@ const emojis = [
             'comoros',
             'flag',
         ],
+        name: 'comoros',
     },
     {
         code: '🇰🇳',
@@ -10905,6 +12136,7 @@ const emojis = [
             'nevis',
             'saint',
         ],
+        name: 'st_kitts_nevis',
     },
     {
         code: '🇰🇵',
@@ -10914,6 +12146,7 @@ const emojis = [
             'north',
             'north korea',
         ],
+        name: 'north_korea',
     },
     {
         code: '🇰🇷',
@@ -10923,6 +12156,7 @@ const emojis = [
             'south',
             'south korea',
         ],
+        name: 'kr',
     },
     {
         code: '🇰🇼',
@@ -10930,6 +12164,7 @@ const emojis = [
             'flag',
             'kuwait',
         ],
+        name: 'kuwait',
     },
     {
         code: '🇰🇾',
@@ -10938,6 +12173,7 @@ const emojis = [
             'flag',
             'island',
         ],
+        name: 'cayman_islands',
     },
     {
         code: '🇰🇿',
@@ -10945,6 +12181,7 @@ const emojis = [
             'flag',
             'kazakhstan',
         ],
+        name: 'kazakhstan',
     },
     {
         code: '🇱🇦',
@@ -10952,6 +12189,7 @@ const emojis = [
             'flag',
             'laos',
         ],
+        name: 'laos',
     },
     {
         code: '🇱🇧',
@@ -10959,6 +12197,7 @@ const emojis = [
             'flag',
             'lebanon',
         ],
+        name: 'lebanon',
     },
     {
         code: '🇱🇨',
@@ -10967,6 +12206,7 @@ const emojis = [
             'lucia',
             'saint',
         ],
+        name: 'st_lucia',
     },
     {
         code: '🇱🇮',
@@ -10974,6 +12214,7 @@ const emojis = [
             'flag',
             'liechtenstein',
         ],
+        name: 'liechtenstein',
     },
     {
         code: '🇱🇰',
@@ -10981,6 +12222,7 @@ const emojis = [
             'flag',
             'sri lanka',
         ],
+        name: 'sri_lanka',
     },
     {
         code: '🇱🇷',
@@ -10988,6 +12230,7 @@ const emojis = [
             'flag',
             'liberia',
         ],
+        name: 'liberia',
     },
     {
         code: '🇱🇸',
@@ -10995,6 +12238,7 @@ const emojis = [
             'flag',
             'lesotho',
         ],
+        name: 'lesotho',
     },
     {
         code: '🇱🇹',
@@ -11002,6 +12246,7 @@ const emojis = [
             'flag',
             'lithuania',
         ],
+        name: 'lithuania',
     },
     {
         code: '🇱🇺',
@@ -11009,6 +12254,7 @@ const emojis = [
             'flag',
             'luxembourg',
         ],
+        name: 'luxembourg',
     },
     {
         code: '🇱🇻',
@@ -11016,6 +12262,7 @@ const emojis = [
             'flag',
             'latvia',
         ],
+        name: 'latvia',
     },
     {
         code: '🇱🇾',
@@ -11023,6 +12270,7 @@ const emojis = [
             'flag',
             'libya',
         ],
+        name: 'libya',
     },
     {
         code: '🇲🇦',
@@ -11030,6 +12278,7 @@ const emojis = [
             'flag',
             'morocco',
         ],
+        name: 'morocco',
     },
     {
         code: '🇲🇨',
@@ -11037,6 +12286,7 @@ const emojis = [
             'flag',
             'monaco',
         ],
+        name: 'monaco',
     },
     {
         code: '🇲🇩',
@@ -11044,6 +12294,7 @@ const emojis = [
             'flag',
             'moldova',
         ],
+        name: 'moldova',
     },
     {
         code: '🇲🇪',
@@ -11051,6 +12302,7 @@ const emojis = [
             'flag',
             'montenegro',
         ],
+        name: 'montenegro',
     },
     {
         code: '🇲🇫',
@@ -11060,6 +12312,7 @@ const emojis = [
             'martin',
             'saint',
         ],
+        name: 'st_martin',
     },
     {
         code: '🇲🇬',
@@ -11067,6 +12320,7 @@ const emojis = [
             'flag',
             'madagascar',
         ],
+        name: 'madagascar',
     },
     {
         code: '🇲🇭',
@@ -11075,6 +12329,7 @@ const emojis = [
             'island',
             'marshall',
         ],
+        name: 'marshall_islands',
     },
     {
         code: '🇲🇰',
@@ -11082,6 +12337,7 @@ const emojis = [
             'flag',
             'macedonia',
         ],
+        name: 'macedonia',
     },
     {
         code: '🇲🇱',
@@ -11089,6 +12345,7 @@ const emojis = [
             'flag',
             'mali',
         ],
+        name: 'mali',
     },
     {
         code: '🇲🇲',
@@ -11097,6 +12354,7 @@ const emojis = [
             'flag',
             'myanmar',
         ],
+        name: 'myanmar',
     },
     {
         code: '🇲🇳',
@@ -11104,6 +12362,7 @@ const emojis = [
             'flag',
             'mongolia',
         ],
+        name: 'mongolia',
     },
     {
         code: '🇲🇴',
@@ -11113,6 +12372,7 @@ const emojis = [
             'macao',
             'macau',
         ],
+        name: 'macau',
     },
     {
         code: '🇲🇵',
@@ -11123,6 +12383,7 @@ const emojis = [
             'north',
             'northern mariana',
         ],
+        name: 'northern_mariana_islands',
     },
     {
         code: '🇲🇶',
@@ -11130,6 +12391,7 @@ const emojis = [
             'flag',
             'martinique',
         ],
+        name: 'martinique',
     },
     {
         code: '🇲🇷',
@@ -11137,6 +12399,7 @@ const emojis = [
             'flag',
             'mauritania',
         ],
+        name: 'mauritania',
     },
     {
         code: '🇲🇸',
@@ -11144,6 +12407,7 @@ const emojis = [
             'flag',
             'montserrat',
         ],
+        name: 'montserrat',
     },
     {
         code: '🇲🇹',
@@ -11151,6 +12415,7 @@ const emojis = [
             'flag',
             'malta',
         ],
+        name: 'malta',
     },
     {
         code: '🇲🇺',
@@ -11158,6 +12423,7 @@ const emojis = [
             'flag',
             'mauritius',
         ],
+        name: 'mauritius',
     },
     {
         code: '🇲🇻',
@@ -11165,6 +12431,7 @@ const emojis = [
             'flag',
             'maldives',
         ],
+        name: 'maldives',
     },
     {
         code: '🇲🇼',
@@ -11172,6 +12439,7 @@ const emojis = [
             'flag',
             'malawi',
         ],
+        name: 'malawi',
     },
     {
         code: '🇲🇽',
@@ -11179,6 +12447,7 @@ const emojis = [
             'flag',
             'mexico',
         ],
+        name: 'mexico',
     },
     {
         code: '🇲🇾',
@@ -11186,6 +12455,7 @@ const emojis = [
             'flag',
             'malaysia',
         ],
+        name: 'malaysia',
     },
     {
         code: '🇲🇿',
@@ -11193,6 +12463,7 @@ const emojis = [
             'flag',
             'mozambique',
         ],
+        name: 'mozambique',
     },
     {
         code: '🇳🇦',
@@ -11200,6 +12471,7 @@ const emojis = [
             'flag',
             'namibia',
         ],
+        name: 'namibia',
     },
     {
         code: '🇳🇨',
@@ -11208,6 +12480,7 @@ const emojis = [
             'new',
             'new caledonia',
         ],
+        name: 'new_caledonia',
     },
     {
         code: '🇳🇪',
@@ -11215,6 +12488,7 @@ const emojis = [
             'flag',
             'niger',
         ],
+        name: 'niger',
     },
     {
         code: '🇳🇫',
@@ -11223,6 +12497,7 @@ const emojis = [
             'island',
             'norfolk',
         ],
+        name: 'norfolk_island',
     },
     {
         code: '🇳🇬',
@@ -11230,6 +12505,7 @@ const emojis = [
             'flag',
             'nigeria',
         ],
+        name: 'nigeria',
     },
     {
         code: '🇳🇮',
@@ -11237,6 +12513,7 @@ const emojis = [
             'flag',
             'nicaragua',
         ],
+        name: 'nicaragua',
     },
     {
         code: '🇳🇱',
@@ -11244,6 +12521,7 @@ const emojis = [
             'flag',
             'netherlands',
         ],
+        name: 'netherlands',
     },
     {
         code: '🇳🇴',
@@ -11251,6 +12529,7 @@ const emojis = [
             'flag',
             'norway',
         ],
+        name: 'norway',
     },
     {
         code: '🇳🇵',
@@ -11258,6 +12537,7 @@ const emojis = [
             'flag',
             'nepal',
         ],
+        name: 'nepal',
     },
     {
         code: '🇳🇷',
@@ -11265,6 +12545,7 @@ const emojis = [
             'flag',
             'nauru',
         ],
+        name: 'nauru',
     },
     {
         code: '🇳🇺',
@@ -11272,6 +12553,7 @@ const emojis = [
             'flag',
             'niue',
         ],
+        name: 'niue',
     },
     {
         code: '🇳🇿',
@@ -11280,6 +12562,7 @@ const emojis = [
             'new',
             'new zealand',
         ],
+        name: 'new_zealand',
     },
     {
         code: '🇴🇲',
@@ -11287,6 +12570,7 @@ const emojis = [
             'flag',
             'oman',
         ],
+        name: 'oman',
     },
     {
         code: '🇵🇦',
@@ -11294,6 +12578,7 @@ const emojis = [
             'flag',
             'panama',
         ],
+        name: 'panama',
     },
     {
         code: '🇵🇪',
@@ -11301,6 +12586,7 @@ const emojis = [
             'flag',
             'peru',
         ],
+        name: 'peru',
     },
     {
         code: '🇵🇫',
@@ -11309,6 +12595,7 @@ const emojis = [
             'french',
             'polynesia',
         ],
+        name: 'french_polynesia',
     },
     {
         code: '🇵🇬',
@@ -11318,6 +12605,7 @@ const emojis = [
             'new',
             'papua new guinea',
         ],
+        name: 'papua_new_guinea',
     },
     {
         code: '🇵🇭',
@@ -11325,6 +12613,7 @@ const emojis = [
             'flag',
             'philippines',
         ],
+        name: 'philippines',
     },
     {
         code: '🇵🇰',
@@ -11332,6 +12621,7 @@ const emojis = [
             'flag',
             'pakistan',
         ],
+        name: 'pakistan',
     },
     {
         code: '🇵🇱',
@@ -11339,6 +12629,7 @@ const emojis = [
             'flag',
             'poland',
         ],
+        name: 'poland',
     },
     {
         code: '🇵🇲',
@@ -11348,6 +12639,7 @@ const emojis = [
             'pierre',
             'saint',
         ],
+        name: 'st_pierre_miquelon',
     },
     {
         code: '🇵🇳',
@@ -11356,6 +12648,7 @@ const emojis = [
             'island',
             'pitcairn',
         ],
+        name: 'pitcairn_islands',
     },
     {
         code: '🇵🇷',
@@ -11363,6 +12656,7 @@ const emojis = [
             'flag',
             'puerto rico',
         ],
+        name: 'puerto_rico',
     },
     {
         code: '🇵🇸',
@@ -11370,6 +12664,7 @@ const emojis = [
             'flag',
             'palestine',
         ],
+        name: 'palestinian_territories',
     },
     {
         code: '🇵🇹',
@@ -11377,6 +12672,7 @@ const emojis = [
             'flag',
             'portugal',
         ],
+        name: 'portugal',
     },
     {
         code: '🇵🇼',
@@ -11384,6 +12680,7 @@ const emojis = [
             'flag',
             'palau',
         ],
+        name: 'palau',
     },
     {
         code: '🇵🇾',
@@ -11391,6 +12688,7 @@ const emojis = [
             'flag',
             'paraguay',
         ],
+        name: 'paraguay',
     },
     {
         code: '🇶🇦',
@@ -11398,6 +12696,7 @@ const emojis = [
             'flag',
             'qatar',
         ],
+        name: 'qatar',
     },
     {
         code: '🇷🇪',
@@ -11406,6 +12705,7 @@ const emojis = [
             'reunion',
             'réunion',
         ],
+        name: 'reunion',
     },
     {
         code: '🇷🇴',
@@ -11413,6 +12713,7 @@ const emojis = [
             'flag',
             'romania',
         ],
+        name: 'romania',
     },
     {
         code: '🇷🇸',
@@ -11420,6 +12721,7 @@ const emojis = [
             'flag',
             'serbia',
         ],
+        name: 'serbia',
     },
     {
         code: '🇷🇺',
@@ -11427,6 +12729,7 @@ const emojis = [
             'flag',
             'russia',
         ],
+        name: 'ru',
     },
     {
         code: '🇷🇼',
@@ -11434,6 +12737,7 @@ const emojis = [
             'flag',
             'rwanda',
         ],
+        name: 'rwanda',
     },
     {
         code: '🇸🇦',
@@ -11441,6 +12745,7 @@ const emojis = [
             'flag',
             'saudi arabia',
         ],
+        name: 'saudi_arabia',
     },
     {
         code: '🇸🇧',
@@ -11449,6 +12754,7 @@ const emojis = [
             'island',
             'solomon',
         ],
+        name: 'solomon_islands',
     },
     {
         code: '🇸🇨',
@@ -11456,6 +12762,7 @@ const emojis = [
             'flag',
             'seychelles',
         ],
+        name: 'seychelles',
     },
     {
         code: '🇸🇩',
@@ -11463,6 +12770,7 @@ const emojis = [
             'flag',
             'sudan',
         ],
+        name: 'sudan',
     },
     {
         code: '🇸🇪',
@@ -11470,6 +12778,7 @@ const emojis = [
             'flag',
             'sweden',
         ],
+        name: 'sweden',
     },
     {
         code: '🇸🇬',
@@ -11477,6 +12786,7 @@ const emojis = [
             'flag',
             'singapore',
         ],
+        name: 'singapore',
     },
     {
         code: '🇸🇭',
@@ -11485,6 +12795,7 @@ const emojis = [
             'helena',
             'saint',
         ],
+        name: 'st_helena',
     },
     {
         code: '🇸🇮',
@@ -11492,6 +12803,7 @@ const emojis = [
             'flag',
             'slovenia',
         ],
+        name: 'slovenia',
     },
     {
         code: '🇸🇯',
@@ -11500,6 +12812,7 @@ const emojis = [
             'jan mayen',
             'svalbard',
         ],
+        name: 'svalbard_jan_mayen',
     },
     {
         code: '🇸🇰',
@@ -11507,6 +12820,7 @@ const emojis = [
             'flag',
             'slovakia',
         ],
+        name: 'slovakia',
     },
     {
         code: '🇸🇱',
@@ -11514,6 +12828,7 @@ const emojis = [
             'flag',
             'sierra leone',
         ],
+        name: 'sierra_leone',
     },
     {
         code: '🇸🇲',
@@ -11521,6 +12836,7 @@ const emojis = [
             'flag',
             'san marino',
         ],
+        name: 'san_marino',
     },
     {
         code: '🇸🇳',
@@ -11528,6 +12844,7 @@ const emojis = [
             'flag',
             'senegal',
         ],
+        name: 'senegal',
     },
     {
         code: '🇸🇴',
@@ -11535,6 +12852,7 @@ const emojis = [
             'flag',
             'somalia',
         ],
+        name: 'somalia',
     },
     {
         code: '🇸🇷',
@@ -11542,6 +12860,7 @@ const emojis = [
             'flag',
             'suriname',
         ],
+        name: 'suriname',
     },
     {
         code: '🇸🇸',
@@ -11551,6 +12870,7 @@ const emojis = [
             'south sudan',
             'sudan',
         ],
+        name: 'south_sudan',
     },
     {
         code: '🇸🇹',
@@ -11561,6 +12881,7 @@ const emojis = [
             'sao tome',
             'são tomé',
         ],
+        name: 'sao_tome_principe',
     },
     {
         code: '🇸🇻',
@@ -11568,6 +12889,7 @@ const emojis = [
             'el salvador',
             'flag',
         ],
+        name: 'el_salvador',
     },
     {
         code: '🇸🇽',
@@ -11576,6 +12898,7 @@ const emojis = [
             'maarten',
             'sint',
         ],
+        name: 'sint_maarten',
     },
     {
         code: '🇸🇾',
@@ -11583,6 +12906,7 @@ const emojis = [
             'flag',
             'syria',
         ],
+        name: 'syria',
     },
     {
         code: '🇸🇿',
@@ -11590,6 +12914,7 @@ const emojis = [
             'flag',
             'swaziland',
         ],
+        name: 'swaziland',
     },
     {
         code: '🇹🇦',
@@ -11597,6 +12922,7 @@ const emojis = [
             'flag',
             'tristan da cunha',
         ],
+        name: 'tristan_da_cunha',
     },
     {
         code: '🇹🇨',
@@ -11606,6 +12932,7 @@ const emojis = [
             'island',
             'turks',
         ],
+        name: 'turks_caicos_islands',
     },
     {
         code: '🇹🇩',
@@ -11613,6 +12940,7 @@ const emojis = [
             'chad',
             'flag',
         ],
+        name: 'chad',
     },
     {
         code: '🇹🇫',
@@ -11621,6 +12949,7 @@ const emojis = [
             'flag',
             'french',
         ],
+        name: 'french_southern_territories',
     },
     {
         code: '🇹🇬',
@@ -11628,6 +12957,7 @@ const emojis = [
             'flag',
             'togo',
         ],
+        name: 'togo',
     },
     {
         code: '🇹🇭',
@@ -11635,6 +12965,7 @@ const emojis = [
             'flag',
             'thailand',
         ],
+        name: 'thailand',
     },
     {
         code: '🇹🇯',
@@ -11642,6 +12973,7 @@ const emojis = [
             'flag',
             'tajikistan',
         ],
+        name: 'tajikistan',
     },
     {
         code: '🇹🇰',
@@ -11649,6 +12981,7 @@ const emojis = [
             'flag',
             'tokelau',
         ],
+        name: 'tokelau',
     },
     {
         code: '🇹🇱',
@@ -11658,6 +12991,7 @@ const emojis = [
             'flag',
             'timor-leste',
         ],
+        name: 'timor_leste',
     },
     {
         code: '🇹🇲',
@@ -11665,6 +12999,7 @@ const emojis = [
             'flag',
             'turkmenistan',
         ],
+        name: 'turkmenistan',
     },
     {
         code: '🇹🇳',
@@ -11672,6 +13007,7 @@ const emojis = [
             'flag',
             'tunisia',
         ],
+        name: 'tunisia',
     },
     {
         code: '🇹🇴',
@@ -11679,6 +13015,7 @@ const emojis = [
             'flag',
             'tonga',
         ],
+        name: 'tonga',
     },
     {
         code: '🇹🇷',
@@ -11686,6 +13023,7 @@ const emojis = [
             'flag',
             'turkey',
         ],
+        name: 'tr',
     },
     {
         code: '🇹🇹',
@@ -11694,6 +13032,7 @@ const emojis = [
             'tobago',
             'trinidad',
         ],
+        name: 'trinidad_tobago',
     },
     {
         code: '🇹🇻',
@@ -11701,6 +13040,7 @@ const emojis = [
             'flag',
             'tuvalu',
         ],
+        name: 'tuvalu',
     },
     {
         code: '🇹🇼',
@@ -11709,6 +13049,7 @@ const emojis = [
             'flag',
             'taiwan',
         ],
+        name: 'taiwan',
     },
     {
         code: '🇹🇿',
@@ -11716,6 +13057,7 @@ const emojis = [
             'flag',
             'tanzania',
         ],
+        name: 'tanzania',
     },
     {
         code: '🇺🇦',
@@ -11723,6 +13065,7 @@ const emojis = [
             'flag',
             'ukraine',
         ],
+        name: 'ukraine',
     },
     {
         code: '🇺🇬',
@@ -11730,6 +13073,7 @@ const emojis = [
             'flag',
             'uganda',
         ],
+        name: 'uganda',
     },
     {
         code: '🇺🇲',
@@ -11743,6 +13087,7 @@ const emojis = [
             'us',
             'usa',
         ],
+        name: 'us_outlying_islands',
     },
     {
         code: '🇺🇸',
@@ -11753,6 +13098,7 @@ const emojis = [
             'united',
             'united states',
         ],
+        name: 'us',
     },
     {
         code: '🇺🇾',
@@ -11760,6 +13106,7 @@ const emojis = [
             'flag',
             'uruguay',
         ],
+        name: 'uruguay',
     },
     {
         code: '🇺🇿',
@@ -11767,6 +13114,7 @@ const emojis = [
             'flag',
             'uzbekistan',
         ],
+        name: 'uzbekistan',
     },
     {
         code: '🇻🇦',
@@ -11774,6 +13122,7 @@ const emojis = [
             'flag',
             'vatican',
         ],
+        name: 'vatican_city',
     },
     {
         code: '🇻🇨',
@@ -11783,6 +13132,7 @@ const emojis = [
             'saint',
             'vincent',
         ],
+        name: 'st_vincent_grenadines',
     },
     {
         code: '🇻🇪',
@@ -11790,6 +13140,7 @@ const emojis = [
             'flag',
             'venezuela',
         ],
+        name: 'venezuela',
     },
     {
         code: '🇻🇬',
@@ -11799,6 +13150,7 @@ const emojis = [
             'island',
             'virgin',
         ],
+        name: 'british_virgin_islands',
     },
     {
         code: '🇻🇮',
@@ -11813,6 +13165,7 @@ const emojis = [
             'usa',
             'virgin',
         ],
+        name: 'us_virgin_islands',
     },
     {
         code: '🇻🇳',
@@ -11821,6 +13174,7 @@ const emojis = [
             'viet nam',
             'vietnam',
         ],
+        name: 'vietnam',
     },
     {
         code: '🇻🇺',
@@ -11828,6 +13182,7 @@ const emojis = [
             'flag',
             'vanuatu',
         ],
+        name: 'vanuatu',
     },
     {
         code: '🇼🇫',
@@ -11836,6 +13191,7 @@ const emojis = [
             'futuna',
             'wallis',
         ],
+        name: 'wallis_futuna',
     },
     {
         code: '🇼🇸',
@@ -11843,6 +13199,7 @@ const emojis = [
             'flag',
             'samoa',
         ],
+        name: 'samoa',
     },
     {
         code: '🇽🇰',
@@ -11850,6 +13207,7 @@ const emojis = [
             'flag',
             'kosovo',
         ],
+        name: 'kosovo',
     },
     {
         code: '🇾🇪',
@@ -11857,6 +13215,7 @@ const emojis = [
             'flag',
             'yemen',
         ],
+        name: 'yemen',
     },
     {
         code: '🇾🇹',
@@ -11864,6 +13223,7 @@ const emojis = [
             'flag',
             'mayotte',
         ],
+        name: 'mayotte',
     },
     {
         code: '🇿🇦',
@@ -11872,6 +13232,7 @@ const emojis = [
             'south',
             'south africa',
         ],
+        name: 'south_africa',
     },
     {
         code: '🇿🇲',
@@ -11879,6 +13240,7 @@ const emojis = [
             'flag',
             'zambia',
         ],
+        name: 'zambia',
     },
     {
         code: '🇿🇼',
@@ -11886,6 +13248,7 @@ const emojis = [
             'flag',
             'zimbabwe',
         ],
+        name: 'zimbabwe',
     },
 ];
 
diff --git a/contributingGuides/FORMS.md b/contributingGuides/FORMS.md
index b1dcf2dd675b..78eae93b696c 100644
--- a/contributingGuides/FORMS.md
+++ b/contributingGuides/FORMS.md
@@ -198,6 +198,38 @@ function onSubmit(values) {
 </Form>
 ```
 
+`Form.js` also works with inputs nested in a custom component, e.g. [AddressForm](https://github.com/Expensify/App/blob/86579225ff30b21dea507347735259637a2df461/src/pages/ReimbursementAccount/AddressForm.js). The only exception is that the nested component shouldn't be wrapped around any HoC.
+
+```jsx
+const BankAccountForm = () => (
+    <>
+        <View>
+            <TextInput
+                label="Routing number"
+                inputID="routingNumber"
+                maxLength={8}
+                shouldSaveDraft
+            />
+        </View>
+        <TextInput
+            label="Account number"
+            inputID="accountNumber"
+            containerStyles={[styles.mt4]}
+        />
+    </>
+);
+
+// ...
+<Form
+    formID="testForm"
+    submitButtonText="Submit"
+    validate={this.validate}
+    onSubmit={this.onSubmit}
+>
+    <BankAccountForm />
+</Form>
+```
+
 ### Props provided to Form inputs
 
 The following prop is available to form inputs:
diff --git a/docs/Gemfile b/docs/Gemfile
index 34133513fc9a..7cad729ee45b 100644
--- a/docs/Gemfile
+++ b/docs/Gemfile
@@ -30,3 +30,5 @@ gem "wdm", "~> 0.1.1", :platforms => [:mingw, :x64_mingw, :mswin]
 gem "http_parser.rb", "~> 0.6.0", :platforms => [:jruby]
 
 gem "webrick", "~> 1.7"
+
+gem 'jekyll-seo-tag'
diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock
index 276ffcdc3367..c51a81d0b60d 100644
--- a/docs/Gemfile.lock
+++ b/docs/Gemfile.lock
@@ -260,6 +260,7 @@ DEPENDENCIES
   github-pages
   http_parser.rb (~> 0.6.0)
   jekyll-feed (~> 0.12)
+  jekyll-seo-tag
   tzinfo (~> 1.2)
   tzinfo-data
   wdm (~> 0.1.1)
diff --git a/docs/README.md b/docs/README.md
index c583fd94eb81..47ecfcfb083e 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -53,6 +53,22 @@ Copy the [template](https://github.com/Expensify/App/blob/main/docs/TEMPLATE.md)
 
 The sections of the article will be filled and nested automatically in the LHN, just ensure to use the [heading markdown tags](https://www.markdownguide.org/cheat-sheet/) correctly.
 
+## Add meta-description tags for SEO
+
+At the top of template file we're going to find a few variables that will help us to define the meta-description of the article for SEO:
+
+```
+---
+title: The title of the post, page, or document
+description: A short description of the page's content
+image: (Optional) URL to an image associated with the post, page, or document (e.g., /assets/page-pic.jpg)
+author: (Optional) Page-, post-, or document-specific author information.
+locale: (Optional) Page-, post-, or document-specific locale information. Takes priority over existing front matter attribute lang.
+---
+```
+
+Just update the content for each variable accordingly or remove it if the information is not available. More details [here](https://github.com/jekyll/jekyll-seo-tag/blob/master/docs/usage.md#usage).
+
 ## Add a new entry in the hub page
 
 There are 3 main components in the hub page: 1. Stage title, 2. Row of Card buttons and 3. Card buttons.
diff --git a/docs/TEMPLATE.md b/docs/TEMPLATE.md
index 7532ab74ac2c..4408e56382a2 100644
--- a/docs/TEMPLATE.md
+++ b/docs/TEMPLATE.md
@@ -1,4 +1,6 @@
 ---
+title: The title of the post, page, or document
+description: A short description of the page's content
 ---
 <!-- The lines above are required by Jekyll to process the .md file -->
 
diff --git a/docs/_config.yml b/docs/_config.yml
index 2ea71f94b445..759dc1a12607 100644
--- a/docs/_config.yml
+++ b/docs/_config.yml
@@ -1,7 +1,17 @@
+title: Expensify Help
+tagline: Expensify Help - all your Expensify questions answered in one place.
+description: Got a question about receipts, expenses, corporate cards, or anything else in the spend management universe? Get answers at help.expensify.com.
+url: help.expensify.com
+author: Expensify
+logo: /assets/images/expensify-help.svg
 
 defaults:
   - scope:
       path: "" # an empty string here means all files in the project
     values:
       layout: "default"
+
 exclude: [README.md, TEMPLATE.md]
+
+plugins:
+  - jekyll-seo-tag
diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html
index b062f7b5ca71..e3d5a1bab5ac 100644
--- a/docs/_layouts/default.html
+++ b/docs/_layouts/default.html
@@ -12,6 +12,9 @@
     <script src="https://kit.fontawesome.com/263e5e8608.js" crossorigin="anonymous"></script>
     <script defer src="https://cdnjs.cloudflare.com/ajax/libs/tocbot/4.12.0/tocbot.js"></script>
     <script defer src="/assets/js/main.js"></script>
+
+    <!-- SEO tags -->
+    {% seo %}
 </head>
 
 <body>
diff --git a/docs/_sass/_main.scss b/docs/_sass/_main.scss
index 2dd52ac40375..939142cdebb0 100644
--- a/docs/_sass/_main.scss
+++ b/docs/_sass/_main.scss
@@ -61,7 +61,6 @@ body {
     height: 100%;
     min-height: 100%;
     background: $color-white;
-    overflow: auto;
 }
 
 hr {
@@ -199,27 +198,27 @@ button {
 
     #lhn-content {
         overflow: auto;
-        -ms-overflow-style: none;
-        /* IE and Edge */
-        scrollbar-width: none;
-        /* Firefox */
-        &::-webkit-scrollbar {
-            display: none;
-        }
+        display: none;
+        height: calc(100% - 100px);
+        padding: 0 24px 24px 24px;
 
         .in-this-article {
             padding-top: 40px;
             display: block;
         }
 
-        display: none;
-        height: calc(100% - 100px);
-        padding: 0 24px 24px 24px;
-
         @include breakpoint($breakpoint-tablet) {
             display: block;
             height: calc(100% - 150px);
             padding: 0 44px 44px 44px;
+            -ms-overflow-style: none;
+            /* IE and Edge */
+            scrollbar-width: none;
+            /* Firefox */
+            &::-webkit-scrollbar {
+                display: none;
+            }
+
         }
 
         &.expanded {
@@ -547,3 +546,9 @@ button {
         }
     }
 }
+
+.disable-scrollbar {
+    @media screen and (max-width: $breakpoint-tablet) {
+        overflow: hidden;
+    }
+}
\ No newline at end of file
diff --git a/docs/articles/request-money/SmartScan.md b/docs/articles/request-money/SmartScan.md
index 542704cc62f3..300c014bb983 100644
--- a/docs/articles/request-money/SmartScan.md
+++ b/docs/articles/request-money/SmartScan.md
@@ -1,4 +1,6 @@
 ---
+title: Smart Scan
+description: SmartScan is the time-saving tool that every Expensify user needs. Using SmartScan, you can quickly upload receipts and walk away to take care of more important things.
 ---
 <!-- The lines above are required by Jekyll to process the .md file -->
 # About
diff --git a/docs/articles/send-money/The-Free-Plan.md b/docs/articles/send-money/The-Free-Plan.md
new file mode 100644
index 000000000000..c7fe7780aaec
--- /dev/null
+++ b/docs/articles/send-money/The-Free-Plan.md
@@ -0,0 +1,73 @@
+---
+title: The Free Plan
+description: Everything you need to know about Expensify's Free Plan!
+---
+
+<!-- The lines above are required by Jekyll to process the .md file -->
+
+# What is the Free Plan?
+The free plan is ideal for start-ups and small businesses to manage expenses. With the Free Plan, a workspace admin can set up their team with Expensify Cards, reimburse cash expenses, send invoices, and manage bills, all for free! You will have total visibility and control over all spending associated with your workspace in real time.
+
+# Features Included with the Free Plan
+- Expensify Cards for all employees
+- Invoicing
+- Bill Pay
+- Unlimited receipt scanning for everyone in the company
+- Free next-day ACH reimbursements for cash expenses
+- Up to 1% cash back for card spending over $25,000 per month
+- Free corporate travel booking
+
+# Setting Up the Free Plan
+- Navigate to new.expensify.com, enter your company email address, and set a password
+- Click the **green “+”** button and select **_New workspace_**
+
+<img class="image" width="400" src="/assets/images/new-workspace.png">
+
+Once you’ve created your Workspace, you should receive a message from Concierge encouraging you to chat with your Setup Specialist.
+
+<img class="image" width="800" src="/assets/images/chat-with-concierge-setup.png">
+
+- Click the link sent to you by Concierge, and your designated Setup Specialist will guide you through how to configure your company setup.
+
+<img class="image" width="400" src="/assets/images/chat-with-setup-specialist.png">
+
+Once you’ve completed your company setup, you should have done the following:
+
+- Connected a business bank account (Settings menu > Click **_Connect bank account_** and follow the prompts).
+- Invited members to the workspace
+- Assigned Expensify Cards
+
+# Inviting Members to the Free Plan:
+- Navigate to the Settings Menu and click **_Manage members_** to invite your team. You can invite employees one at a time, or you can invite multiple users by listing out their email addresses separated by a comma
+- To use the Expensify Card, you must invite them to your workspace via your company email address (i.e., admin@companyemail.com and NOT admin@gmail.com).
+
+# Managing the Free Plan
+To access your workspace settings, click your profile icon and then on your workspace name:
+
+<img class="image" width="400" src="/assets/images/profile-settings.png">
+<img class="image" width="400" src="/assets/images/workspace-settings.png">
+
+This menu allows you to manage your workspace members, issue additional Expensify Cards, and utilize this plan’s various bill pay and payment options.
+
+# FAQs
+## Do I need a business bank account to use the Free Plan?
+
+You will need a US business checking account if you want to enable the Expensify Card and set up direct ACH reimbursement.
+You will need to take a few steps to verify your business bank account and connect it to Expensify. You will need to set aside some time and have your ID ready.
+If you're not in the US, you can still use the Free Plan, but the Expensify Card and direct reimbursement will not be available.
+
+## Can my workspace have more than one Admin?
+
+The Expensify Workplace only allows for one admin (the workspace creator).
+
+## Scheduled Submit is set to weekly on the Free Plan. Can I change this?
+
+No, expense reports on the Free Plan submit weekly, and there is no way to customize approval settings.
+
+## With the Free Plan, can I add categories and tags to expenses?
+
+The categories are set as standard categories and cannot be changed on the Free Plan. Custom categories, Tags, and additional coding options from your accounting software integrate with Expensify on a paid plan.
+
+## With the Free Plan, can I export reports using a custom format?
+
+The Free Plan offers standard report export formats. You'll need to upgrade to a paid plan to create a custom export format.
diff --git a/docs/assets/images/chat-with-concierge-setup.png b/docs/assets/images/chat-with-concierge-setup.png
new file mode 100644
index 0000000000000000000000000000000000000000..94e00e2f00e73f22b2089fbd060e92f513f359f4
GIT binary patch
diff --git a/docs/assets/images/chat-with-setup-specialist.png b/docs/assets/images/chat-with-setup-specialist.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad6622d5abf853f301a9b5789a5d27a586174a5d
GIT binary patch
diff --git a/docs/assets/images/new-workspace.png b/docs/assets/images/new-workspace.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a9458df98fa128a5e1f33dacb874ebf6a85bfde
GIT binary patch
diff --git a/docs/assets/images/profile-settings.png b/docs/assets/images/profile-settings.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b1dcc0ca49297fc8cb60f332a13433727b417e2
GIT binary patch
diff --git a/docs/assets/images/workspace-settings.png b/docs/assets/images/workspace-settings.png
new file mode 100644
index 0000000000000000000000000000000000000000..76b96d6f4e80c24eda40f500ba43810fba81771b
GIT binary patch
diff --git a/docs/assets/js/main.js b/docs/assets/js/main.js
index efa68a6b1e7f..97ea32715723 100644
--- a/docs/assets/js/main.js
+++ b/docs/assets/js/main.js
@@ -11,12 +11,14 @@ function toggleHeaderMenu() {
         lhnContent.className = '';
         barsIcon.classList.remove('hide');
         anguleUpIcon.classList.add('hide');
+        document.body.classList.remove('disable-scrollbar');
     } else {
         // Expand the LHN in mobile
         lhn.className = 'expanded';
         lhnContent.className = 'expanded';
         barsIcon.classList.add('hide');
         anguleUpIcon.classList.remove('hide');
+        document.body.classList.add('disable-scrollbar');
     }
 }
 
@@ -59,6 +61,9 @@ window.addEventListener('DOMContentLoaded', () => {
             scrollSmoothOffset: -80,
             scrollSmooth: true,
 
+            // If there is a fixed article scroll container, set to calculate titles' offset
+            scrollContainer: 'content-area',
+
             // onclick function to apply to all links in toc. will be called with
             // the event as the first parameter, and this can be used to stop,
             // propagation, prevent default or perform action
diff --git a/docs/hubs/request-money.html b/docs/hubs/request-money.html
index 6eff0606150b..b330e690821e 100644
--- a/docs/hubs/request-money.html
+++ b/docs/hubs/request-money.html
@@ -1,6 +1,7 @@
 ---
 layout: default
 lhn_content: 'request-money'
+title: Request money
 ---
 
 <h1 class="title">
diff --git a/docs/hubs/send-money.html b/docs/hubs/send-money.html
index 859cdd242fe1..8547602c0ed2 100644
--- a/docs/hubs/send-money.html
+++ b/docs/hubs/send-money.html
@@ -1,6 +1,7 @@
 ---
 layout: default
 lhn_content: 'send-money'
+title: Send money
 ---
 
 <h1 class="title">
diff --git a/docs/main.html b/docs/main.html
index f76f218b4c1e..c4547dd7b111 100644
--- a/docs/main.html
+++ b/docs/main.html
@@ -9,8 +9,7 @@ <h1 class="title">
     </h1>
 
     <p>
-        Find all the answers to all your Expensify questions, as well as support for user and admin questions from the
-        Expensify Community.
+        Find the answers to all of your questions about receipts, expenses, corporate cards, or anything else in the spend management universe.
     </p>
 
     <h2>
diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist
index 173ddbe45ef6..ca5783f01108 100644
--- a/ios/NewExpensify/Info.plist
+++ b/ios/NewExpensify/Info.plist
@@ -17,7 +17,7 @@
 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>1.2.17</string>
+	<string>1.2.19</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleURLTypes</key>
@@ -30,7 +30,7 @@
 		</dict>
 	</array>
 	<key>CFBundleVersion</key>
-	<string>1.2.17.4</string>
+	<string>1.2.19.2</string>
 	<key>ITSAppUsesNonExemptEncryption</key>
 	<false/>
 	<key>LSApplicationQueriesSchemes</key>
diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist
index 225c28d74308..77b30f4573c7 100644
--- a/ios/NewExpensifyTests/Info.plist
+++ b/ios/NewExpensifyTests/Info.plist
@@ -15,10 +15,10 @@
 	<key>CFBundlePackageType</key>
 	<string>BNDL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>1.2.17</string>
+	<string>1.2.19</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>1.2.17.4</string>
+	<string>1.2.19.2</string>
 </dict>
 </plist>
diff --git a/ios/Podfile b/ios/Podfile
index f42d309b7a9e..1698d638257d 100644
--- a/ios/Podfile
+++ b/ios/Podfile
@@ -49,5 +49,13 @@ target 'NewExpensify' do
     installer.pods_project.build_configurations.each do |config|
       config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
     end
+
+    installer.pods_project.targets.each do |target|
+      if target.respond_to?(:product_type) and target.product_type == "com.apple.product-type.bundle"
+        target.build_configurations.each do |config|
+          config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
+        end
+      end
+    end
   end
 end
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index c54a14feeaf9..8932beea5ebd 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -17,14 +17,14 @@ PODS:
   - boost (1.76.0)
   - CocoaAsyncSocket (7.6.5)
   - DoubleConversion (1.1.6)
-  - FBLazyVector (0.70.4)
-  - FBReactNativeSpec (0.70.4):
+  - FBLazyVector (0.70.5)
+  - FBReactNativeSpec (0.70.5):
     - RCT-Folly (= 2021.07.22.00)
-    - RCTRequired (= 0.70.4)
-    - RCTTypeSafety (= 0.70.4)
-    - React-Core (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - ReactCommon/turbomodule/core (= 0.70.4)
+    - RCTRequired (= 0.70.5)
+    - RCTTypeSafety (= 0.70.5)
+    - React-Core (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - ReactCommon/turbomodule/core (= 0.70.5)
   - Firebase/Analytics (8.8.0):
     - Firebase/Core
   - Firebase/Core (8.8.0):
@@ -249,214 +249,214 @@ PODS:
     - fmt (~> 6.2.1)
     - glog
     - libevent
-  - RCTRequired (0.70.4)
-  - RCTTypeSafety (0.70.4):
-    - FBLazyVector (= 0.70.4)
-    - RCTRequired (= 0.70.4)
-    - React-Core (= 0.70.4)
-  - React (0.70.4):
-    - React-Core (= 0.70.4)
-    - React-Core/DevSupport (= 0.70.4)
-    - React-Core/RCTWebSocket (= 0.70.4)
-    - React-RCTActionSheet (= 0.70.4)
-    - React-RCTAnimation (= 0.70.4)
-    - React-RCTBlob (= 0.70.4)
-    - React-RCTImage (= 0.70.4)
-    - React-RCTLinking (= 0.70.4)
-    - React-RCTNetwork (= 0.70.4)
-    - React-RCTSettings (= 0.70.4)
-    - React-RCTText (= 0.70.4)
-    - React-RCTVibration (= 0.70.4)
-  - React-bridging (0.70.4):
+  - RCTRequired (0.70.5)
+  - RCTTypeSafety (0.70.5):
+    - FBLazyVector (= 0.70.5)
+    - RCTRequired (= 0.70.5)
+    - React-Core (= 0.70.5)
+  - React (0.70.5):
+    - React-Core (= 0.70.5)
+    - React-Core/DevSupport (= 0.70.5)
+    - React-Core/RCTWebSocket (= 0.70.5)
+    - React-RCTActionSheet (= 0.70.5)
+    - React-RCTAnimation (= 0.70.5)
+    - React-RCTBlob (= 0.70.5)
+    - React-RCTImage (= 0.70.5)
+    - React-RCTLinking (= 0.70.5)
+    - React-RCTNetwork (= 0.70.5)
+    - React-RCTSettings (= 0.70.5)
+    - React-RCTText (= 0.70.5)
+    - React-RCTVibration (= 0.70.5)
+  - React-bridging (0.70.5):
     - RCT-Folly (= 2021.07.22.00)
-    - React-jsi (= 0.70.4)
-  - React-callinvoker (0.70.4)
-  - React-Codegen (0.70.4):
-    - FBReactNativeSpec (= 0.70.4)
+    - React-jsi (= 0.70.5)
+  - React-callinvoker (0.70.5)
+  - React-Codegen (0.70.5):
+    - FBReactNativeSpec (= 0.70.5)
     - RCT-Folly (= 2021.07.22.00)
-    - RCTRequired (= 0.70.4)
-    - RCTTypeSafety (= 0.70.4)
-    - React-Core (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-jsiexecutor (= 0.70.4)
-    - ReactCommon/turbomodule/core (= 0.70.4)
-  - React-Core (0.70.4):
+    - RCTRequired (= 0.70.5)
+    - RCTTypeSafety (= 0.70.5)
+    - React-Core (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-jsiexecutor (= 0.70.5)
+    - ReactCommon/turbomodule/core (= 0.70.5)
+  - React-Core (0.70.5):
     - glog
     - RCT-Folly (= 2021.07.22.00)
-    - React-Core/Default (= 0.70.4)
-    - React-cxxreact (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-jsiexecutor (= 0.70.4)
-    - React-perflogger (= 0.70.4)
+    - React-Core/Default (= 0.70.5)
+    - React-cxxreact (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-jsiexecutor (= 0.70.5)
+    - React-perflogger (= 0.70.5)
     - Yoga
-  - React-Core/CoreModulesHeaders (0.70.4):
+  - React-Core/CoreModulesHeaders (0.70.5):
     - glog
     - RCT-Folly (= 2021.07.22.00)
     - React-Core/Default
-    - React-cxxreact (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-jsiexecutor (= 0.70.4)
-    - React-perflogger (= 0.70.4)
+    - React-cxxreact (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-jsiexecutor (= 0.70.5)
+    - React-perflogger (= 0.70.5)
     - Yoga
-  - React-Core/Default (0.70.4):
+  - React-Core/Default (0.70.5):
     - glog
     - RCT-Folly (= 2021.07.22.00)
-    - React-cxxreact (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-jsiexecutor (= 0.70.4)
-    - React-perflogger (= 0.70.4)
+    - React-cxxreact (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-jsiexecutor (= 0.70.5)
+    - React-perflogger (= 0.70.5)
     - Yoga
-  - React-Core/DevSupport (0.70.4):
+  - React-Core/DevSupport (0.70.5):
     - glog
     - RCT-Folly (= 2021.07.22.00)
-    - React-Core/Default (= 0.70.4)
-    - React-Core/RCTWebSocket (= 0.70.4)
-    - React-cxxreact (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-jsiexecutor (= 0.70.4)
-    - React-jsinspector (= 0.70.4)
-    - React-perflogger (= 0.70.4)
+    - React-Core/Default (= 0.70.5)
+    - React-Core/RCTWebSocket (= 0.70.5)
+    - React-cxxreact (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-jsiexecutor (= 0.70.5)
+    - React-jsinspector (= 0.70.5)
+    - React-perflogger (= 0.70.5)
     - Yoga
-  - React-Core/RCTActionSheetHeaders (0.70.4):
+  - React-Core/RCTActionSheetHeaders (0.70.5):
     - glog
     - RCT-Folly (= 2021.07.22.00)
     - React-Core/Default
-    - React-cxxreact (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-jsiexecutor (= 0.70.4)
-    - React-perflogger (= 0.70.4)
+    - React-cxxreact (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-jsiexecutor (= 0.70.5)
+    - React-perflogger (= 0.70.5)
     - Yoga
-  - React-Core/RCTAnimationHeaders (0.70.4):
+  - React-Core/RCTAnimationHeaders (0.70.5):
     - glog
     - RCT-Folly (= 2021.07.22.00)
     - React-Core/Default
-    - React-cxxreact (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-jsiexecutor (= 0.70.4)
-    - React-perflogger (= 0.70.4)
+    - React-cxxreact (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-jsiexecutor (= 0.70.5)
+    - React-perflogger (= 0.70.5)
     - Yoga
-  - React-Core/RCTBlobHeaders (0.70.4):
+  - React-Core/RCTBlobHeaders (0.70.5):
     - glog
     - RCT-Folly (= 2021.07.22.00)
     - React-Core/Default
-    - React-cxxreact (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-jsiexecutor (= 0.70.4)
-    - React-perflogger (= 0.70.4)
+    - React-cxxreact (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-jsiexecutor (= 0.70.5)
+    - React-perflogger (= 0.70.5)
     - Yoga
-  - React-Core/RCTImageHeaders (0.70.4):
+  - React-Core/RCTImageHeaders (0.70.5):
     - glog
     - RCT-Folly (= 2021.07.22.00)
     - React-Core/Default
-    - React-cxxreact (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-jsiexecutor (= 0.70.4)
-    - React-perflogger (= 0.70.4)
+    - React-cxxreact (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-jsiexecutor (= 0.70.5)
+    - React-perflogger (= 0.70.5)
     - Yoga
-  - React-Core/RCTLinkingHeaders (0.70.4):
+  - React-Core/RCTLinkingHeaders (0.70.5):
     - glog
     - RCT-Folly (= 2021.07.22.00)
     - React-Core/Default
-    - React-cxxreact (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-jsiexecutor (= 0.70.4)
-    - React-perflogger (= 0.70.4)
+    - React-cxxreact (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-jsiexecutor (= 0.70.5)
+    - React-perflogger (= 0.70.5)
     - Yoga
-  - React-Core/RCTNetworkHeaders (0.70.4):
+  - React-Core/RCTNetworkHeaders (0.70.5):
     - glog
     - RCT-Folly (= 2021.07.22.00)
     - React-Core/Default
-    - React-cxxreact (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-jsiexecutor (= 0.70.4)
-    - React-perflogger (= 0.70.4)
+    - React-cxxreact (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-jsiexecutor (= 0.70.5)
+    - React-perflogger (= 0.70.5)
     - Yoga
-  - React-Core/RCTSettingsHeaders (0.70.4):
+  - React-Core/RCTSettingsHeaders (0.70.5):
     - glog
     - RCT-Folly (= 2021.07.22.00)
     - React-Core/Default
-    - React-cxxreact (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-jsiexecutor (= 0.70.4)
-    - React-perflogger (= 0.70.4)
+    - React-cxxreact (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-jsiexecutor (= 0.70.5)
+    - React-perflogger (= 0.70.5)
     - Yoga
-  - React-Core/RCTTextHeaders (0.70.4):
+  - React-Core/RCTTextHeaders (0.70.5):
     - glog
     - RCT-Folly (= 2021.07.22.00)
     - React-Core/Default
-    - React-cxxreact (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-jsiexecutor (= 0.70.4)
-    - React-perflogger (= 0.70.4)
+    - React-cxxreact (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-jsiexecutor (= 0.70.5)
+    - React-perflogger (= 0.70.5)
     - Yoga
-  - React-Core/RCTVibrationHeaders (0.70.4):
+  - React-Core/RCTVibrationHeaders (0.70.5):
     - glog
     - RCT-Folly (= 2021.07.22.00)
     - React-Core/Default
-    - React-cxxreact (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-jsiexecutor (= 0.70.4)
-    - React-perflogger (= 0.70.4)
+    - React-cxxreact (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-jsiexecutor (= 0.70.5)
+    - React-perflogger (= 0.70.5)
     - Yoga
-  - React-Core/RCTWebSocket (0.70.4):
+  - React-Core/RCTWebSocket (0.70.5):
     - glog
     - RCT-Folly (= 2021.07.22.00)
-    - React-Core/Default (= 0.70.4)
-    - React-cxxreact (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-jsiexecutor (= 0.70.4)
-    - React-perflogger (= 0.70.4)
+    - React-Core/Default (= 0.70.5)
+    - React-cxxreact (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-jsiexecutor (= 0.70.5)
+    - React-perflogger (= 0.70.5)
     - Yoga
-  - React-CoreModules (0.70.4):
+  - React-CoreModules (0.70.5):
     - RCT-Folly (= 2021.07.22.00)
-    - RCTTypeSafety (= 0.70.4)
-    - React-Codegen (= 0.70.4)
-    - React-Core/CoreModulesHeaders (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-RCTImage (= 0.70.4)
-    - ReactCommon/turbomodule/core (= 0.70.4)
-  - React-cxxreact (0.70.4):
+    - RCTTypeSafety (= 0.70.5)
+    - React-Codegen (= 0.70.5)
+    - React-Core/CoreModulesHeaders (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-RCTImage (= 0.70.5)
+    - ReactCommon/turbomodule/core (= 0.70.5)
+  - React-cxxreact (0.70.5):
     - boost (= 1.76.0)
     - DoubleConversion
     - glog
     - RCT-Folly (= 2021.07.22.00)
-    - React-callinvoker (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-jsinspector (= 0.70.4)
-    - React-logger (= 0.70.4)
-    - React-perflogger (= 0.70.4)
-    - React-runtimeexecutor (= 0.70.4)
-  - React-hermes (0.70.4):
+    - React-callinvoker (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-jsinspector (= 0.70.5)
+    - React-logger (= 0.70.5)
+    - React-perflogger (= 0.70.5)
+    - React-runtimeexecutor (= 0.70.5)
+  - React-hermes (0.70.5):
     - DoubleConversion
     - glog
     - hermes-engine
     - RCT-Folly (= 2021.07.22.00)
     - RCT-Folly/Futures (= 2021.07.22.00)
-    - React-cxxreact (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-jsiexecutor (= 0.70.4)
-    - React-jsinspector (= 0.70.4)
-    - React-perflogger (= 0.70.4)
-  - React-jsi (0.70.4):
+    - React-cxxreact (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-jsiexecutor (= 0.70.5)
+    - React-jsinspector (= 0.70.5)
+    - React-perflogger (= 0.70.5)
+  - React-jsi (0.70.5):
     - boost (= 1.76.0)
     - DoubleConversion
     - glog
     - RCT-Folly (= 2021.07.22.00)
-    - React-jsi/Default (= 0.70.4)
-  - React-jsi/Default (0.70.4):
+    - React-jsi/Default (= 0.70.5)
+  - React-jsi/Default (0.70.5):
     - boost (= 1.76.0)
     - DoubleConversion
     - glog
     - RCT-Folly (= 2021.07.22.00)
-  - React-jsiexecutor (0.70.4):
+  - React-jsiexecutor (0.70.5):
     - DoubleConversion
     - glog
     - RCT-Folly (= 2021.07.22.00)
-    - React-cxxreact (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-perflogger (= 0.70.4)
-  - React-jsinspector (0.70.4)
-  - React-logger (0.70.4):
+    - React-cxxreact (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-perflogger (= 0.70.5)
+  - React-jsinspector (0.70.5)
+  - React-logger (0.70.5):
     - glog
   - react-native-blob-util (0.16.2):
     - React-Core
@@ -495,72 +495,72 @@ PODS:
     - ReactCommon/turbomodule/core
   - react-native-webview (11.23.0):
     - React-Core
-  - React-perflogger (0.70.4)
-  - React-RCTActionSheet (0.70.4):
-    - React-Core/RCTActionSheetHeaders (= 0.70.4)
-  - React-RCTAnimation (0.70.4):
+  - React-perflogger (0.70.5)
+  - React-RCTActionSheet (0.70.5):
+    - React-Core/RCTActionSheetHeaders (= 0.70.5)
+  - React-RCTAnimation (0.70.5):
     - RCT-Folly (= 2021.07.22.00)
-    - RCTTypeSafety (= 0.70.4)
-    - React-Codegen (= 0.70.4)
-    - React-Core/RCTAnimationHeaders (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - ReactCommon/turbomodule/core (= 0.70.4)
-  - React-RCTBlob (0.70.4):
+    - RCTTypeSafety (= 0.70.5)
+    - React-Codegen (= 0.70.5)
+    - React-Core/RCTAnimationHeaders (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - ReactCommon/turbomodule/core (= 0.70.5)
+  - React-RCTBlob (0.70.5):
     - RCT-Folly (= 2021.07.22.00)
-    - React-Codegen (= 0.70.4)
-    - React-Core/RCTBlobHeaders (= 0.70.4)
-    - React-Core/RCTWebSocket (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-RCTNetwork (= 0.70.4)
-    - ReactCommon/turbomodule/core (= 0.70.4)
-  - React-RCTImage (0.70.4):
+    - React-Codegen (= 0.70.5)
+    - React-Core/RCTBlobHeaders (= 0.70.5)
+    - React-Core/RCTWebSocket (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-RCTNetwork (= 0.70.5)
+    - ReactCommon/turbomodule/core (= 0.70.5)
+  - React-RCTImage (0.70.5):
     - RCT-Folly (= 2021.07.22.00)
-    - RCTTypeSafety (= 0.70.4)
-    - React-Codegen (= 0.70.4)
-    - React-Core/RCTImageHeaders (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-RCTNetwork (= 0.70.4)
-    - ReactCommon/turbomodule/core (= 0.70.4)
-  - React-RCTLinking (0.70.4):
-    - React-Codegen (= 0.70.4)
-    - React-Core/RCTLinkingHeaders (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - ReactCommon/turbomodule/core (= 0.70.4)
-  - React-RCTNetwork (0.70.4):
+    - RCTTypeSafety (= 0.70.5)
+    - React-Codegen (= 0.70.5)
+    - React-Core/RCTImageHeaders (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-RCTNetwork (= 0.70.5)
+    - ReactCommon/turbomodule/core (= 0.70.5)
+  - React-RCTLinking (0.70.5):
+    - React-Codegen (= 0.70.5)
+    - React-Core/RCTLinkingHeaders (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - ReactCommon/turbomodule/core (= 0.70.5)
+  - React-RCTNetwork (0.70.5):
     - RCT-Folly (= 2021.07.22.00)
-    - RCTTypeSafety (= 0.70.4)
-    - React-Codegen (= 0.70.4)
-    - React-Core/RCTNetworkHeaders (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - ReactCommon/turbomodule/core (= 0.70.4)
-  - React-RCTSettings (0.70.4):
+    - RCTTypeSafety (= 0.70.5)
+    - React-Codegen (= 0.70.5)
+    - React-Core/RCTNetworkHeaders (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - ReactCommon/turbomodule/core (= 0.70.5)
+  - React-RCTSettings (0.70.5):
     - RCT-Folly (= 2021.07.22.00)
-    - RCTTypeSafety (= 0.70.4)
-    - React-Codegen (= 0.70.4)
-    - React-Core/RCTSettingsHeaders (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - ReactCommon/turbomodule/core (= 0.70.4)
-  - React-RCTText (0.70.4):
-    - React-Core/RCTTextHeaders (= 0.70.4)
-  - React-RCTVibration (0.70.4):
+    - RCTTypeSafety (= 0.70.5)
+    - React-Codegen (= 0.70.5)
+    - React-Core/RCTSettingsHeaders (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - ReactCommon/turbomodule/core (= 0.70.5)
+  - React-RCTText (0.70.5):
+    - React-Core/RCTTextHeaders (= 0.70.5)
+  - React-RCTVibration (0.70.5):
     - RCT-Folly (= 2021.07.22.00)
-    - React-Codegen (= 0.70.4)
-    - React-Core/RCTVibrationHeaders (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - ReactCommon/turbomodule/core (= 0.70.4)
-  - React-runtimeexecutor (0.70.4):
-    - React-jsi (= 0.70.4)
-  - ReactCommon/turbomodule/core (0.70.4):
+    - React-Codegen (= 0.70.5)
+    - React-Core/RCTVibrationHeaders (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - ReactCommon/turbomodule/core (= 0.70.5)
+  - React-runtimeexecutor (0.70.5):
+    - React-jsi (= 0.70.5)
+  - ReactCommon/turbomodule/core (0.70.5):
     - DoubleConversion
     - glog
     - RCT-Folly (= 2021.07.22.00)
-    - React-bridging (= 0.70.4)
-    - React-callinvoker (= 0.70.4)
-    - React-Core (= 0.70.4)
-    - React-cxxreact (= 0.70.4)
-    - React-jsi (= 0.70.4)
-    - React-logger (= 0.70.4)
-    - React-perflogger (= 0.70.4)
+    - React-bridging (= 0.70.5)
+    - React-callinvoker (= 0.70.5)
+    - React-Core (= 0.70.5)
+    - React-cxxreact (= 0.70.5)
+    - React-jsi (= 0.70.5)
+    - React-logger (= 0.70.5)
+    - React-perflogger (= 0.70.5)
   - RNCAsyncStorage (1.17.10):
     - React-Core
   - RNCClipboard (1.5.1):
@@ -594,7 +594,7 @@ PODS:
     - React-Core
   - RNReactNativeHapticFeedback (1.14.0):
     - React-Core
-  - RNReanimated (2.10.0):
+  - RNReanimated (3.0.0-rc.3):
     - DoubleConversion
     - FBLazyVector
     - FBReactNativeSpec
@@ -920,9 +920,9 @@ SPEC CHECKSUMS:
   Airship: 4657c3d5118441240e04674d9445cbd6e363c956
   boost: a7c83b31436843459a1961bfd74b96033dc77234
   CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99
-  DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662
-  FBLazyVector: 8a28262f61fbe40c04ce8677b8d835d97c18f1b3
-  FBReactNativeSpec: b475991eb2d8da6a4ec32d09a8df31b0247fa87d
+  DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54
+  FBLazyVector: affa4ba1bfdaac110a789192f4d452b053a86624
+  FBReactNativeSpec: fe8b5f1429cfe83a8d72dc8ed61dc7704cac8745
   Firebase: 629510f1a9ddb235f3a7c5c8ceb23ba887f0f814
   FirebaseABTesting: 10cbce8db9985ae2e3847ea44e9947dd18f94e10
   FirebaseAnalytics: 5506ea8b867d8423485a84b4cd612d279f7b0b8a
@@ -942,7 +942,7 @@ SPEC CHECKSUMS:
   Flipper-RSocket: d9d9ade67cbecf6ac10730304bf5607266dd2541
   FlipperKit: cbdee19bdd4e7f05472a66ce290f1b729ba3cb86
   fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
-  glog: 5337263514dd6f09803962437687240c5dc39aa4
+  glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b
   GoogleAppMeasurement: 5ba1164e3c844ba84272555e916d0a6d3d977e91
   GoogleDataTransport: 1c8145da7117bd68bbbed00cf304edb6a24de00f
   GoogleUtilities: e0913149f6b0625b553d70dae12b49fc62914fd1
@@ -960,20 +960,20 @@ SPEC CHECKSUMS:
   Plaid: 6beadc0828cfd5396c5905931b9503493bbc139a
   PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb
   RCT-Folly: 0080d0a6ebf2577475bda044aa59e2ca1f909cda
-  RCTRequired: 49a2c4d4215580d8b24ed538ae01b6de20b43a76
-  RCTTypeSafety: 55d538399fe8b51e5cd862e2ec2f9b135b07e783
-  React: 413fd7d791365c2c5742b60493d3ab450ca1a210
-  React-bridging: 8e577e404677d57daa0310db63e6a27328a57207
-  React-callinvoker: d0ae2f0ea66bcf29a3e42a895428d2f01473d2ea
-  React-Codegen: 273200ed3b02d35fd1755aebe0eb3319b037d950
-  React-Core: f42a10403076c1114f8c50f063ddafc9eea92fff
-  React-CoreModules: 1ed78c63dad96f40b123d4d4ca455e09ccd8aaed
-  React-cxxreact: 7d30af80adb5fe6a97646a06540c19e61736aa15
-  React-hermes: 185ce251487bcb812c34ce33b1ab6412419b43a3
-  React-jsi: 9b2b4ac1642b72bffcd74550f0caa0926b3f8a4d
-  React-jsiexecutor: 4a893fc8f683b91befcaf56c44ad8be4506b6828
-  React-jsinspector: 1d5a9e84e419a57cabc23249aec3d837d1b03a80
-  React-logger: f8071ad48248781d5afdb8a07f778758529d3019
+  RCTRequired: 21229f84411088e5d8538f21212de49e46cc83e2
+  RCTTypeSafety: 62eed57a32924b09edaaf170a548d1fc96223086
+  React: f0254ccddeeef1defe66c6b1bb9133a4f040792b
+  React-bridging: e46911666b7ec19538a620a221d6396cd293d687
+  React-callinvoker: 66b62e2c34546546b2f21ab0b7670346410a2b53
+  React-Codegen: b6999435966df3bdf82afa3f319ba0d6f9a8532a
+  React-Core: dabbc9d1fe0a11d884e6ee1599789cf8eb1058a5
+  React-CoreModules: 5b6b7668f156f73a56420df9ec68ca2ec8f2e818
+  React-cxxreact: c7ca2baee46db22a30fce9e639277add3c3f6ad1
+  React-hermes: c93e1d759ad5560dfea54d233013d7d2c725c286
+  React-jsi: a565dcb49130ed20877a9bb1105ffeecbb93d02d
+  React-jsiexecutor: 31564fa6912459921568e8b0e49024285a4d584b
+  React-jsinspector: badd81696361249893a80477983e697aab3c1a34
+  React-logger: fdda34dd285bdb0232e059b19d9606fa0ec3bb9c
   react-native-blob-util: c3b0faecd2919db568e9d552084396f3e50b57c7
   react-native-cameraroll: 2957f2bce63ae896a848fbe0d5352c1bd4d20866
   react-native-config: 7cd105e71d903104e8919261480858940a6b9c0e
@@ -989,18 +989,18 @@ SPEC CHECKSUMS:
   react-native-render-html: 96c979fe7452a0a41559685d2f83b12b93edac8c
   react-native-safe-area-context: 99b24a0c5acd0d5dcac2b1a7f18c49ea317be99a
   react-native-webview: e771bc375f789ebfa02a26939a57dbc6fa897336
-  React-perflogger: 5e41b01b35d97cc1b0ea177181eb33b5c77623b6
-  React-RCTActionSheet: 48949f30b24200c82f3dd27847513be34e06a3ae
-  React-RCTAnimation: 96af42c97966fcd53ed9c31bee6f969c770312b6
-  React-RCTBlob: 22aa326a2b34eea3299a2274ce93e102f8383ed9
-  React-RCTImage: 1df0dbdb53609778f68830ccdd07ff3b40812837
-  React-RCTLinking: eef4732d9102a10174115a727588d199711e376c
-  React-RCTNetwork: 18716f00568ec203df2192d35f4a74d1d9b00675
-  React-RCTSettings: 1dc8a5e5272cea1bad2f8d9b4e6bac91b846749b
-  React-RCTText: 17652c6294903677fb3d754b5955ac293347782c
-  React-RCTVibration: 0e247407238d3bd6b29d922d7b5de0404359431b
-  React-runtimeexecutor: 5407e26b5aaafa9b01a08e33653255f8247e7c31
-  ReactCommon: abf3605a56f98b91671d0d1327addc4ffb87af77
+  React-perflogger: e68d3795cf5d247a0379735cbac7309adf2fb931
+  React-RCTActionSheet: 05452c3b281edb27850253db13ecd4c5a65bc247
+  React-RCTAnimation: 578eebac706428e68466118e84aeacf3a282b4da
+  React-RCTBlob: f47a0aa61e7d1fb1a0e13da832b0da934939d71a
+  React-RCTImage: 60f54b66eed65d86b6dffaf4733d09161d44929d
+  React-RCTLinking: 91073205aeec4b29450ca79b709277319368ac9e
+  React-RCTNetwork: ca91f2c9465a7e335c8a5fae731fd7f10572213b
+  React-RCTSettings: 1a9a5d01337d55c18168c1abe0f4a589167d134a
+  React-RCTText: c591e8bd9347a294d8416357ca12d779afec01d5
+  React-RCTVibration: 8e5c8c5d17af641f306d7380d8d0fe9b3c142c48
+  React-runtimeexecutor: 7401c4a40f8728fd89df4a56104541b760876117
+  ReactCommon: c9246996e73bf75a2c6c3ff15f1e16707cdc2da9
   RNCAsyncStorage: 0c357f3156fcb16c8589ede67cc036330b6698ca
   RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495
   RNCPicker: 0b65be85fe7954fbb2062ef079e3d1cde252d888
@@ -1013,16 +1013,16 @@ SPEC CHECKSUMS:
   RNGestureHandler: 920eb17f5b1e15dae6e5ed1904045f8f90e0b11e
   RNPermissions: dcdb7b99796bbeda6975a6e79ad519c41b251b1c
   RNReactNativeHapticFeedback: 1e3efeca9628ff9876ee7cdd9edec1b336913f8c
-  RNReanimated: 60e291d42c77752a0f6d6f358387bdf225a87c6e
+  RNReanimated: 6c980139eb3b043569a08b8cb3d92cdf46bd54fa
   RNScreens: 0df01424e9e0ed7827200d6ed1087ddd06c493f9
   RNSVG: ecd661f380a07ba690c9c5929c475a44f432d674
   SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d
   SDWebImageWebPCoder: 908b83b6adda48effe7667cd2b7f78c897e5111d
   SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608
   urbanairship-react-native: 7e2e9a84c541b1d04798e51f7f390a2d5806eac0
-  Yoga: 1f02ef4ce4469aefc36167138441b27d988282b1
+  Yoga: eca980a5771bf114c41a754098cd85e6e0d90ed7
   YogaKit: f782866e155069a2cca2517aafea43200b01fd5a
 
-PODFILE CHECKSUM: 5745ec909229219e7469609dba23118be023f564
+PODFILE CHECKSUM: 48093a300788c218e76f70cf6d102915cd993f34
 
 COCOAPODS: 1.11.3
diff --git a/jest/setup.js b/jest/setup.js
index 549b02eb2546..c4824a497464 100644
--- a/jest/setup.js
+++ b/jest/setup.js
@@ -3,7 +3,7 @@ import path from 'path';
 import 'react-native-gesture-handler/jestSetup';
 import _ from 'underscore';
 
-require('react-native-reanimated/lib/reanimated2/jestUtils').setUpTests();
+require('react-native-reanimated/src/reanimated2/jestUtils').setUpTests();
 
 jest.mock('react-native-blob-util', () => ({}));
 
diff --git a/package-lock.json b/package-lock.json
index 3dc583b76a9a..395007f0861c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "new.expensify",
-  "version": "1.2.17-4",
+  "version": "1.2.19-2",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "new.expensify",
-      "version": "1.2.17-4",
+      "version": "1.2.19-2",
       "hasInstallScript": true,
       "license": "MIT",
       "dependencies": {
@@ -30,7 +30,7 @@
         "@react-native-firebase/crashlytics": "^12.3.0",
         "@react-native-firebase/perf": "^12.3.0",
         "@react-native-picker/picker": "^2.4.3",
-        "@react-navigation/drawer": "6.5.0",
+        "@react-navigation/drawer": "github:Expensify/react-navigation#react-navigation-drawer-v6.5.0-alpha1-gitpkg",
         "@react-navigation/native": "6.0.13",
         "@react-navigation/stack": "6.3.1",
         "babel-plugin-transform-remove-console": "^6.9.4",
@@ -38,7 +38,7 @@
         "dom-serializer": "^0.2.2",
         "domhandler": "^4.3.0",
         "dotenv": "^8.2.0",
-        "expensify-common": "git+https://github.com/Expensify/expensify-common.git#03a86215c0ae2bc4e7978e1ca9717fbc7fdea11b",
+        "expensify-common": "git+https://github.com/Expensify/expensify-common.git#6010b3c49a16f63ee9cecc0c720f6d10395775ef",
         "fbjs": "^3.0.2",
         "file-loader": "^6.0.0",
         "html-entities": "^1.3.1",
@@ -56,7 +56,7 @@
         "react-collapse": "^5.1.0",
         "react-content-loader": "^6.1.0",
         "react-dom": "18.1.0",
-        "react-native": "npm:@expensify/react-native@0.70.4",
+        "react-native": "npm:@expensify/react-native@0.70.5",
         "react-native-blob-util": "^0.16.2",
         "react-native-collapsible": "^1.6.0",
         "react-native-config": "^1.4.5",
@@ -74,7 +74,7 @@
         "react-native-permissions": "^3.0.1",
         "react-native-picker-select": "git+https://github.com/Expensify/react-native-picker-select.git#7f09b2c15ffae320d769788f75bdf8948714bb10",
         "react-native-plaid-link-sdk": "^7.2.0",
-        "react-native-reanimated": "2.10.0",
+        "react-native-reanimated": "3.0.0-rc.3",
         "react-native-render-html": "6.3.1",
         "react-native-safe-area-context": "4.4.1",
         "react-native-screens": "3.17.0",
@@ -89,8 +89,8 @@
         "urbanairship-react-native": "^14.3.1"
       },
       "devDependencies": {
-        "@actions/core": "^1.2.6",
-        "@actions/github": "5.0.3",
+        "@actions/core": "1.10.0",
+        "@actions/github": "5.1.1",
         "@babel/core": "^7.11.1",
         "@babel/plugin-proposal-class-properties": "^7.12.1",
         "@babel/plugin-proposal-export-namespace-from": "^7.18.9",
@@ -167,9 +167,9 @@
       }
     },
     "node_modules/@actions/core": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.9.1.tgz",
-      "integrity": "sha512-5ad+U2YGrmmiw6du20AQW5XuWo7UKN2052FjSV7MX+Wfjf8sCqcsZe62NfgHys4QI4/Y+vQvLKYL8jWtA1ZBTA==",
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz",
+      "integrity": "sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug==",
       "dev": true,
       "dependencies": {
         "@actions/http-client": "^2.0.1",
@@ -177,9 +177,9 @@
       }
     },
     "node_modules/@actions/github": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/@actions/github/-/github-5.0.3.tgz",
-      "integrity": "sha512-myjA/pdLQfhUGLtRZC/J4L1RXOG4o6aYdiEq+zr5wVVKljzbFld+xv10k1FX6IkIJtNxbAq44BdwSNpQ015P0A==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/@actions/github/-/github-5.1.1.tgz",
+      "integrity": "sha512-Nk59rMDoJaV+mHCOJPXuvB1zIbomlKS0dmSIqPGxd0enAXBnOfn4VWF+CGtRCwXZG9Epa54tZA7VIRlJDS8A6g==",
       "dev": true,
       "dependencies": {
         "@actions/http-client": "^2.0.1",
@@ -6593,9 +6593,9 @@
       }
     },
     "node_modules/@react-navigation/drawer": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/@react-navigation/drawer/-/drawer-6.5.0.tgz",
-      "integrity": "sha512-ma3qPjAfbwF07xd1w1gaWdcvYWmT4F+Z098q2J7XGbHw8yTGQYiNTnD1NMKerXwxM24vui2tMuFHA54F1rIvHQ==",
+      "version": "6.5.0-alpha1",
+      "resolved": "git+ssh://git@github.com/Expensify/react-navigation.git#bee9dc3f6bd03bb24f529efcb9f0d5d5832df6d6",
+      "license": "MIT",
       "dependencies": {
         "@react-navigation/elements": "^1.3.6",
         "color": "^4.2.3",
@@ -6605,8 +6605,8 @@
         "@react-navigation/native": "^6.0.0",
         "react": "*",
         "react-native": "*",
-        "react-native-gesture-handler": ">= 1.0.0",
-        "react-native-reanimated": ">= 1.0.0",
+        "react-native-gesture-handler": ">= 2.0.0",
+        "react-native-reanimated": "*",
         "react-native-safe-area-context": ">= 3.0.0",
         "react-native-screens": ">= 3.0.0"
       }
@@ -23948,8 +23948,8 @@
     },
     "node_modules/expensify-common": {
       "version": "1.0.0",
-      "resolved": "git+ssh://git@github.com/Expensify/expensify-common.git#03a86215c0ae2bc4e7978e1ca9717fbc7fdea11b",
-      "integrity": "sha512-LWMhx7czsv3l6oJ7ILfYHFbllmAcPVzDTZHpXFtzLJh2lP4Wuukc0gB7MQX2EwkZ+VV2QrZj4gPkRMbr95DOKg==",
+      "resolved": "git+ssh://git@github.com/Expensify/expensify-common.git#6010b3c49a16f63ee9cecc0c720f6d10395775ef",
+      "integrity": "sha512-QRKmQUEVzdEwOJEsh1XFhcGdSl+taPdHYTUZt0Bdbb9SyQvBHX4g6/NqMIfQRYiBq6q3eKpAd4nTKmkaHAfKsA==",
       "license": "MIT",
       "dependencies": {
         "classnames": "2.3.1",
@@ -35416,9 +35416,9 @@
     },
     "node_modules/react-native": {
       "name": "@expensify/react-native",
-      "version": "0.70.4",
-      "resolved": "https://registry.npmjs.org/@expensify/react-native/-/react-native-0.70.4.tgz",
-      "integrity": "sha512-j4lyTmvFHv9bDp7hVx8pQrp05eUiVUgnOmYdeaSObtLbFdImYOdnJMhPWejuRKl/E5D5sBz9hOAtYp1/i6GBOA==",
+      "version": "0.70.5",
+      "resolved": "https://registry.npmjs.org/@expensify/react-native/-/react-native-0.70.5.tgz",
+      "integrity": "sha512-C4Y0XVMSW2tmgnENoT31L/aBaPz2CmAsn8NJE0IPjBWE0xkcMaUh0u4Mx2v+relQ6bDvknB96/am0TsqMak1Kg==",
       "dependencies": {
         "@jest/create-cache-key-function": "^27.0.1",
         "@react-native-community/cli": "^9.0.0",
@@ -35741,9 +35741,9 @@
       }
     },
     "node_modules/react-native-reanimated": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-2.10.0.tgz",
-      "integrity": "sha512-jKm3xz5nX7ABtHzzuuLmawP0pFWP77lXNdIC6AWOceBs23OHUaJ29p4prxr/7Sb588GwTbkPsYkDqVFaE3ezNQ==",
+      "version": "3.0.0-rc.3",
+      "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.0.0-rc.3.tgz",
+      "integrity": "sha512-kFkbazXfhq/zb3sQyLIFegLqxzPMJAd36pbz7jtOphZ1mEXDadX0ODp6eD7/PJHnLqYGHtsqSI8WMMLLN6rdjw==",
       "dependencies": {
         "@babel/plugin-transform-object-assign": "^7.16.7",
         "@babel/preset-typescript": "^7.16.7",
@@ -43155,9 +43155,9 @@
   },
   "dependencies": {
     "@actions/core": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.9.1.tgz",
-      "integrity": "sha512-5ad+U2YGrmmiw6du20AQW5XuWo7UKN2052FjSV7MX+Wfjf8sCqcsZe62NfgHys4QI4/Y+vQvLKYL8jWtA1ZBTA==",
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz",
+      "integrity": "sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug==",
       "dev": true,
       "requires": {
         "@actions/http-client": "^2.0.1",
@@ -43165,9 +43165,9 @@
       }
     },
     "@actions/github": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/@actions/github/-/github-5.0.3.tgz",
-      "integrity": "sha512-myjA/pdLQfhUGLtRZC/J4L1RXOG4o6aYdiEq+zr5wVVKljzbFld+xv10k1FX6IkIJtNxbAq44BdwSNpQ015P0A==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/@actions/github/-/github-5.1.1.tgz",
+      "integrity": "sha512-Nk59rMDoJaV+mHCOJPXuvB1zIbomlKS0dmSIqPGxd0enAXBnOfn4VWF+CGtRCwXZG9Epa54tZA7VIRlJDS8A6g==",
       "dev": true,
       "requires": {
         "@actions/http-client": "^2.0.1",
@@ -47984,9 +47984,8 @@
       }
     },
     "@react-navigation/drawer": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/@react-navigation/drawer/-/drawer-6.5.0.tgz",
-      "integrity": "sha512-ma3qPjAfbwF07xd1w1gaWdcvYWmT4F+Z098q2J7XGbHw8yTGQYiNTnD1NMKerXwxM24vui2tMuFHA54F1rIvHQ==",
+      "version": "git+ssh://git@github.com/Expensify/react-navigation.git#bee9dc3f6bd03bb24f529efcb9f0d5d5832df6d6",
+      "from": "@react-navigation/drawer@github:Expensify/react-navigation#react-navigation-drawer-v6.5.0-alpha1-gitpkg",
       "requires": {
         "@react-navigation/elements": "^1.3.6",
         "color": "^4.2.3",
@@ -61330,9 +61329,9 @@
       }
     },
     "expensify-common": {
-      "version": "git+ssh://git@github.com/Expensify/expensify-common.git#03a86215c0ae2bc4e7978e1ca9717fbc7fdea11b",
-      "integrity": "sha512-LWMhx7czsv3l6oJ7ILfYHFbllmAcPVzDTZHpXFtzLJh2lP4Wuukc0gB7MQX2EwkZ+VV2QrZj4gPkRMbr95DOKg==",
-      "from": "expensify-common@git+https://github.com/Expensify/expensify-common.git#03a86215c0ae2bc4e7978e1ca9717fbc7fdea11b",
+      "version": "git+ssh://git@github.com/Expensify/expensify-common.git#6010b3c49a16f63ee9cecc0c720f6d10395775ef",
+      "integrity": "sha512-QRKmQUEVzdEwOJEsh1XFhcGdSl+taPdHYTUZt0Bdbb9SyQvBHX4g6/NqMIfQRYiBq6q3eKpAd4nTKmkaHAfKsA==",
+      "from": "expensify-common@git+https://github.com/Expensify/expensify-common.git#6010b3c49a16f63ee9cecc0c720f6d10395775ef",
       "requires": {
         "classnames": "2.3.1",
         "clipboard": "2.0.4",
@@ -70109,9 +70108,9 @@
       "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
     },
     "react-native": {
-      "version": "npm:@expensify/react-native@0.70.4",
-      "resolved": "https://registry.npmjs.org/@expensify/react-native/-/react-native-0.70.4.tgz",
-      "integrity": "sha512-j4lyTmvFHv9bDp7hVx8pQrp05eUiVUgnOmYdeaSObtLbFdImYOdnJMhPWejuRKl/E5D5sBz9hOAtYp1/i6GBOA==",
+      "version": "npm:@expensify/react-native@0.70.5",
+      "resolved": "https://registry.npmjs.org/@expensify/react-native/-/react-native-0.70.5.tgz",
+      "integrity": "sha512-C4Y0XVMSW2tmgnENoT31L/aBaPz2CmAsn8NJE0IPjBWE0xkcMaUh0u4Mx2v+relQ6bDvknB96/am0TsqMak1Kg==",
       "requires": {
         "@jest/create-cache-key-function": "^27.0.1",
         "@react-native-community/cli": "^9.0.0",
@@ -70451,9 +70450,9 @@
       "requires": {}
     },
     "react-native-reanimated": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-2.10.0.tgz",
-      "integrity": "sha512-jKm3xz5nX7ABtHzzuuLmawP0pFWP77lXNdIC6AWOceBs23OHUaJ29p4prxr/7Sb588GwTbkPsYkDqVFaE3ezNQ==",
+      "version": "3.0.0-rc.3",
+      "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.0.0-rc.3.tgz",
+      "integrity": "sha512-kFkbazXfhq/zb3sQyLIFegLqxzPMJAd36pbz7jtOphZ1mEXDadX0ODp6eD7/PJHnLqYGHtsqSI8WMMLLN6rdjw==",
       "requires": {
         "@babel/plugin-transform-object-assign": "^7.16.7",
         "@babel/preset-typescript": "^7.16.7",
diff --git a/package.json b/package.json
index c9eabc0f0567..e7d69a1672a3 100644
--- a/package.json
+++ b/package.json
@@ -1,13 +1,13 @@
 {
   "name": "new.expensify",
-  "version": "1.2.17-4",
+  "version": "1.2.19-2",
   "author": "Expensify, Inc.",
   "homepage": "https://new.expensify.com",
   "description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.",
   "license": "MIT",
   "private": true,
   "scripts": {
-    "postinstall": "cd desktop && npm install",
+    "postinstall": "npx patch-package && cd desktop && npm install",
     "clean": "npx react-native clean-project-auto",
     "android": "scripts/set-pusher-suffix.sh && npx react-native run-android --port=8083",
     "ios": "scripts/set-pusher-suffix.sh && npx react-native run-ios --port=8082",
@@ -58,7 +58,7 @@
     "@react-native-firebase/crashlytics": "^12.3.0",
     "@react-native-firebase/perf": "^12.3.0",
     "@react-native-picker/picker": "^2.4.3",
-    "@react-navigation/drawer": "6.5.0",
+    "@react-navigation/drawer": "github:Expensify/react-navigation#react-navigation-drawer-v6.5.0-alpha1-gitpkg",
     "@react-navigation/native": "6.0.13",
     "@react-navigation/stack": "6.3.1",
     "babel-plugin-transform-remove-console": "^6.9.4",
@@ -66,7 +66,7 @@
     "dom-serializer": "^0.2.2",
     "domhandler": "^4.3.0",
     "dotenv": "^8.2.0",
-    "expensify-common": "git+https://github.com/Expensify/expensify-common.git#03a86215c0ae2bc4e7978e1ca9717fbc7fdea11b",
+    "expensify-common": "git+https://github.com/Expensify/expensify-common.git#6010b3c49a16f63ee9cecc0c720f6d10395775ef",
     "fbjs": "^3.0.2",
     "file-loader": "^6.0.0",
     "html-entities": "^1.3.1",
@@ -84,7 +84,7 @@
     "react-collapse": "^5.1.0",
     "react-content-loader": "^6.1.0",
     "react-dom": "18.1.0",
-    "react-native": "npm:@expensify/react-native@0.70.4",
+    "react-native": "npm:@expensify/react-native@0.70.5",
     "react-native-blob-util": "^0.16.2",
     "react-native-collapsible": "^1.6.0",
     "react-native-config": "^1.4.5",
@@ -102,7 +102,7 @@
     "react-native-permissions": "^3.0.1",
     "react-native-picker-select": "git+https://github.com/Expensify/react-native-picker-select.git#7f09b2c15ffae320d769788f75bdf8948714bb10",
     "react-native-plaid-link-sdk": "^7.2.0",
-    "react-native-reanimated": "2.10.0",
+    "react-native-reanimated": "3.0.0-rc.3",
     "react-native-render-html": "6.3.1",
     "react-native-safe-area-context": "4.4.1",
     "react-native-screens": "3.17.0",
@@ -117,8 +117,8 @@
     "urbanairship-react-native": "^14.3.1"
   },
   "devDependencies": {
-    "@actions/core": "^1.2.6",
-    "@actions/github": "5.0.3",
+    "@actions/core": "1.10.0",
+    "@actions/github": "5.1.1",
     "@babel/core": "^7.11.1",
     "@babel/plugin-proposal-class-properties": "^7.12.1",
     "@babel/plugin-proposal-export-namespace-from": "^7.18.9",
diff --git a/patches/react-native-reanimated+3.0.0-rc.3.patch b/patches/react-native-reanimated+3.0.0-rc.3.patch
new file mode 100644
index 000000000000..321bcc07419f
--- /dev/null
+++ b/patches/react-native-reanimated+3.0.0-rc.3.patch
@@ -0,0 +1,64 @@
+diff --git a/node_modules/react-native-reanimated/RNReanimated.podspec b/node_modules/react-native-reanimated/RNReanimated.podspec
+index 3205c93..c7f2821 100644
+--- a/node_modules/react-native-reanimated/RNReanimated.podspec
++++ b/node_modules/react-native-reanimated/RNReanimated.podspec
+@@ -49,7 +49,12 @@ rescue
+   end
+ end
+ 
+-reactCommonDir = File.join(nodeModulesDir, "react-native", "ReactCommon")
++
++# From: https://github.com/software-mansion/react-native-reanimated/pull/3701/files
++pods_root = Pod::Config.instance.project_pods_root
++react_native_common_dir_absolute = File.join(nodeModulesDir, 'react-native', 'ReactCommon')
++react_native_common_dir_relative = Pathname.new(react_native_common_dir_absolute).relative_path_from(pods_root).to_s
++reactCommonDir = react_native_common_dir_relative
+ 
+ if isUserApp
+   libInstances = %x[find ../../ -name "package.json" | grep "/react-native-reanimated/package.json" | grep -v "/.yarn/"]
+@@ -111,9 +116,10 @@ Pod::Spec.new do |s|
+     "CLANG_CXX_LANGUAGE_STANDARD" => "c++17",
+   }
+   s.compiler_flags = folly_compiler_flags + ' ' + boost_compiler_flags + ' -DHERMES_ENABLE_DEBUGGER'
+-  s.xcconfig               = {
+-    "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/boost-for-react-native\" \"$(PODS_ROOT)/glog\" \"$(PODS_ROOT)/#{folly_prefix}Folly\" \"$(PODS_ROOT)/RCT-Folly\" \"${PODS_ROOT}/Headers/Public/React-hermes\" \"${PODS_ROOT}/Headers/Public/hermes-engine\" \"#{reactCommonDir}\"",
+-                               "OTHER_CFLAGS" => "$(inherited)" + " " + folly_flags + " " + fabric_flags }
++  s.xcconfig = {
++    "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/boost-for-react-native\" \"$(PODS_ROOT)/glog\" \"$(PODS_ROOT)/#{folly_prefix}Folly\" \"$(PODS_ROOT)/Headers/Public/React-hermes\" \"$(PODS_ROOT)/Headers/Public/hermes-engine\" \"$(PODS_ROOT)/#{reactCommonDir}\"",
++    "OTHER_CFLAGS" => "$(inherited)" + " " + folly_flags + " " + fabric_flags
++  }
+ 
+   s.requires_arc = true
+ 
+diff --git a/node_modules/react-native-reanimated/ios/REAModule.mm b/node_modules/react-native-reanimated/ios/REAModule.mm
+index e1cd2f4..8ba248d 100644
+--- a/node_modules/react-native-reanimated/ios/REAModule.mm
++++ b/node_modules/react-native-reanimated/ios/REAModule.mm
+@@ -52,6 +52,7 @@ @implementation REAModule {
+ #ifdef DEBUG
+   SingleInstanceChecker<REAModule> singleInstanceChecker_;
+ #endif
++  bool hasListeners;
+ }
+ 
+ RCT_EXPORT_MODULE(ReanimatedModule);
+@@ -291,4 +292,19 @@ - (void)eventDispatcherWillDispatchEvent:(id<RCTEvent>)event
+   [_nodesManager dispatchEvent:event];
+ }
+ 
++- (void)startObserving {
++    hasListeners = YES;
++}
++
++- (void)stopObserving {
++    hasListeners = NO;
++}
++
++- (void)sendEventWithName:(NSString *)eventName body:(id)body
++{
++    if (hasListeners) {
++        [super sendEventWithName:eventName body:body];
++    }
++}
++
+ @end
diff --git a/src/CONST.js b/src/CONST.js
index bdb84834ba45..3298d36b7880 100755
--- a/src/CONST.js
+++ b/src/CONST.js
@@ -357,6 +357,7 @@ const CONST = {
         REPORT_ACTION_ITEM_LAYOUT_DEBOUNCE_TIME: 1500,
         TOOLTIP_SENSE: 1000,
         SPINNER_TIMEOUT: 15 * 1000,
+        TRIE_INITIALIZATION: 'trie_initialization',
     },
     PRIORITY_MODE: {
         GSD: 'gsd',
@@ -739,6 +740,8 @@ const CONST = {
         EMOJIS: /(?:\uD83D(?:\uDC41\u200D\uD83D\uDDE8|\uDC68\u200D\uD83D[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uDC69\u200D\uD83D\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|[\ud83c\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c\ude32-\ude3a]|[\ud83c\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/g,
         TAX_ID: /^\d{9}$/,
         NON_NUMERIC: /\D/g,
+        EMOJI_NAME: /:[\w+-]+:/g,
+        EMOJI_SUGGESTIONS: /:[a-zA-Z]{1,20}(\s[a-zA-Z]{0,20})?$/,
     },
 
     PRONOUNS: {
diff --git a/src/ONYXKEYS.js b/src/ONYXKEYS.js
index 0b1f45006fc2..b4d3998db100 100755
--- a/src/ONYXKEYS.js
+++ b/src/ONYXKEYS.js
@@ -155,9 +155,6 @@ export default {
     // Is report data loading?
     IS_LOADING_REPORT_DATA: 'isLoadingReportData',
 
-    // Is policy data loading?
-    IS_LOADING_POLICY_DATA: 'isLoadingPolicyData',
-
     // Is Keyboard shortcuts modal open?
     IS_SHORTCUTS_MODAL_OPEN: 'isShortcutsModalOpen',
 
@@ -175,6 +172,7 @@ export default {
         ADD_DEBIT_CARD_FORM: 'addDebitCardForm',
         REQUEST_CALL_FORM: 'requestCallForm',
         REIMBURSEMENT_ACCOUNT_FORM: 'reimbursementAccount',
+        WORKSPACE_SETTINGS_FORM: 'workspaceSettingsForm',
     },
 
     // Whether we should show the compose input or not
diff --git a/src/components/AttachmentModal.js b/src/components/AttachmentModal.js
index bac249e8715d..4e0f31c53485 100755
--- a/src/components/AttachmentModal.js
+++ b/src/components/AttachmentModal.js
@@ -1,6 +1,6 @@
 import React, {PureComponent} from 'react';
 import PropTypes from 'prop-types';
-import {View, Animated} from 'react-native';
+import {View, Animated, Keyboard} from 'react-native';
 import Str from 'expensify-common/lib/str';
 import lodashGet from 'lodash/get';
 import lodashExtend from 'lodash/extend';
@@ -111,6 +111,17 @@ class AttachmentModal extends PureComponent {
             : CONST.MODAL.MODAL_TYPE.CENTERED;
     }
 
+    /**
+     * @param {String} sourceURL
+     */
+    downloadAttachment(sourceURL) {
+        fileDownload(sourceURL, this.props.originalFileName);
+
+        // At ios, if the keyboard is open while opening the attachment, then after downloading
+        // the attachment keyboard will show up. So, to fix it we need to dismiss the keyboard.
+        Keyboard.dismiss();
+    }
+
     /**
      * Execute the onConfirm callback and close the modal.
      */
@@ -250,7 +261,7 @@ class AttachmentModal extends PureComponent {
                         title={this.props.headerTitle || this.props.translate('common.attachment')}
                         shouldShowBorderBottom
                         shouldShowDownloadButton={this.props.allowDownload}
-                        onDownloadButtonPress={() => fileDownload(sourceURL, this.props.originalFileName)}
+                        onDownloadButtonPress={() => this.downloadAttachment(sourceURL)}
                         onCloseButtonPress={() => this.setState({isModalOpen: false})}
                         subtitle={fileName ? (
                             <TextWithEllipsis
diff --git a/src/components/EmojiPicker/EmojiPickerButton.js b/src/components/EmojiPicker/EmojiPickerButton.js
index 40d012868c3c..32af3ed5979f 100644
--- a/src/components/EmojiPicker/EmojiPickerButton.js
+++ b/src/components/EmojiPicker/EmojiPickerButton.js
@@ -14,11 +14,15 @@ const propTypes = {
     /** Flag to disable the emoji picker button */
     isDisabled: PropTypes.bool,
 
+    /** Id to use for the emoji picker button */
+    nativeID: PropTypes.string,
+
     ...withLocalizePropTypes,
 };
 
 const defaultProps = {
     isDisabled: false,
+    nativeID: '',
 };
 
 const EmojiPickerButton = (props) => {
@@ -32,6 +36,7 @@ const EmojiPickerButton = (props) => {
             ])}
             disabled={props.isDisabled}
             onPress={() => EmojiPickerAction.showEmojiPicker(props.onModalHide, props.onEmojiSelected, emojiPopoverAnchor)}
+            nativeID={props.nativeID}
         >
             {({hovered, pressed}) => (
                 <Tooltip text={props.translate('reportActionCompose.emoji')}>
diff --git a/src/components/ExceededCommentLength.js b/src/components/ExceededCommentLength.js
index 51c6af6d6d9c..33f557c66d99 100644
--- a/src/components/ExceededCommentLength.js
+++ b/src/components/ExceededCommentLength.js
@@ -15,7 +15,7 @@ const ExceededCommentLength = (props) => {
     }
 
     return (
-        <Text style={[styles.textMicro, styles.textDanger, styles.chatItemComposeSecondaryRow, styles.mlAuto]}>
+        <Text style={[styles.textMicro, styles.textDanger, styles.chatItemComposeSecondaryRow, styles.mlAuto, styles.pl2]}>
             {`${props.commentLength}/${CONST.MAX_COMMENT_LENGTH}`}
         </Text>
     );
diff --git a/src/components/Form.js b/src/components/Form.js
index fca7277e1920..b7b5f72edbd5 100644
--- a/src/components/Form.js
+++ b/src/components/Form.js
@@ -1,3 +1,4 @@
+import lodashGet from 'lodash/get';
 import React from 'react';
 import {ScrollView, View} from 'react-native';
 import PropTypes from 'prop-types';
@@ -148,6 +149,19 @@ class Form extends React.Component {
                 });
             }
 
+            // Look for any inputs nested in a custom component, e.g AddressForm or IdentityForm
+            if (_.isFunction(child.type)) {
+                const nestedChildren = new child.type(child.props);
+
+                if (!React.isValidElement(nestedChildren) || !lodashGet(nestedChildren, 'props.children')) {
+                    return child;
+                }
+
+                return React.cloneElement(nestedChildren, {
+                    children: this.childrenWrapperWithProps(lodashGet(nestedChildren, 'props.children')),
+                });
+            }
+
             // We check if the child has the inputID prop.
             // We don't want to pass form props to non form components, e.g. View, Text, etc
             if (!child.props.inputID) {
diff --git a/src/components/FormAlertWithSubmitButton.js b/src/components/FormAlertWithSubmitButton.js
index c3ef4b464c9a..3fbb5ac607b7 100644
--- a/src/components/FormAlertWithSubmitButton.js
+++ b/src/components/FormAlertWithSubmitButton.js
@@ -28,7 +28,7 @@ const propTypes = {
     message: PropTypes.string,
 
     /** Callback fired when the "fix the errors" link is pressed */
-    onFixTheErrorsPressed: PropTypes.func,
+    onFixTheErrorsLinkPressed: PropTypes.func,
 
     /** Submit function */
     onSubmit: PropTypes.func.isRequired,
@@ -43,7 +43,7 @@ const defaultProps = {
     isMessageHtml: false,
     containerStyles: [],
     isLoading: false,
-    onFixTheErrorsPressed: () => {},
+    onFixTheErrorsLinkPressed: () => {},
     enabledWhenOffline: false,
 };
 
@@ -53,7 +53,7 @@ const FormAlertWithSubmitButton = props => (
         isAlertVisible={props.isAlertVisible}
         isMessageHtml={props.isMessageHtml}
         message={props.message}
-        onFixTheErrorsPressed={props.onFixTheErrorsPressed}
+        onFixTheErrorsLinkPressed={props.onFixTheErrorsLinkPressed}
     >
         {isOffline => ((isOffline && !props.enabledWhenOffline) ? (
             <Button
diff --git a/src/components/FormAlertWrapper.js b/src/components/FormAlertWrapper.js
index 4b2c4e484483..921a76c771fc 100644
--- a/src/components/FormAlertWrapper.js
+++ b/src/components/FormAlertWrapper.js
@@ -35,7 +35,7 @@ const propTypes = {
     network: networkPropTypes.isRequired,
 
     /** Callback fired when the "fix the errors" link is pressed */
-    onFixTheErrorsPressed: PropTypes.func,
+    onFixTheErrorsLinkPressed: PropTypes.func,
 
     ...withLocalizePropTypes,
 };
@@ -45,7 +45,7 @@ const defaultProps = {
     isAlertVisible: false,
     isMessageHtml: false,
     message: '',
-    onFixTheErrorsPressed: () => {},
+    onFixTheErrorsLinkPressed: () => {},
 };
 
 // The FormAlertWrapper offers a standardized way of showing error messages and offline functionality.
@@ -69,7 +69,7 @@ const FormAlertWrapper = props => (
                             </Text>
                             <TextLink
                                 style={styles.label}
-                                onPress={props.onFixTheErrorsPressed}
+                                onPress={props.onFixTheErrorsLinkPressed}
                             >
                                 {props.translate('common.fixTheErrors')}
                             </TextLink>
diff --git a/src/components/KeyboardShortcutsModal.js b/src/components/KeyboardShortcutsModal.js
index 0cd8b2a385f3..c45ced82f11b 100644
--- a/src/components/KeyboardShortcutsModal.js
+++ b/src/components/KeyboardShortcutsModal.js
@@ -8,6 +8,7 @@ import Text from './Text';
 import Modal from './Modal';
 import CONST from '../CONST';
 import styles from '../styles/styles';
+import * as StyleUtils from '../styles/StyleUtils';
 import withWindowDimensions, {windowDimensionsPropTypes} from './withWindowDimensions';
 import withLocalize, {withLocalizePropTypes} from './withLocalize';
 import compose from '../libs/compose';
@@ -78,7 +79,7 @@ class KeyboardShortcutsModal extends React.Component {
             <Modal
                 isVisible={this.props.isShortcutsModalOpen}
                 type={modalType}
-                containerStyle={styles.keyboardShortcutModalContainer}
+                containerStyle={{...styles.keyboardShortcutModalContainer, ...StyleUtils.getKeyboardShortcutsModalWidth(this.props.isSmallScreenWidth)}}
                 onClose={KeyboardShortcutsActions.hideKeyboardShortcutModal}
             >
                 <HeaderWithCloseButton title={this.props.translate('keyboardShortcutModal.title')} onCloseButtonPress={KeyboardShortcutsActions.hideKeyboardShortcutModal} />
diff --git a/src/components/LHNOptionsList/OptionRowLHN.js b/src/components/LHNOptionsList/OptionRowLHN.js
index f04f29e5d4a1..fc9ab57bf908 100644
--- a/src/components/LHNOptionsList/OptionRowLHN.js
+++ b/src/components/LHNOptionsList/OptionRowLHN.js
@@ -23,6 +23,7 @@ import variables from '../../styles/variables';
 import themeColors from '../../styles/themes/default';
 import SidebarUtils from '../../libs/SidebarUtils';
 import TextPill from '../TextPill';
+import OfflineWithFeedback from '../OfflineWithFeedback';
 
 const propTypes = {
     /** Style for hovered state */
@@ -97,37 +98,42 @@ const OptionRowLHN = (props) => {
     const avatarTooltips = !optionItem.isChatRoom && !optionItem.isArchivedRoom ? _.pluck(optionItem.displayNamesWithTooltips, 'tooltip') : undefined;
 
     return (
-        <Hoverable>
-            {hovered => (
-                <TouchableOpacity
-                    ref={el => touchableRef = el}
-                    onPress={(e) => {
-                        if (e) {
-                            e.preventDefault();
-                        }
+        <OfflineWithFeedback
+            pendingAction={optionItem.pendingAction}
+            errors={optionItem.allReportErrors}
+            shouldShowErrorMessages={false}
+        >
+            <Hoverable>
+                {hovered => (
+                    <TouchableOpacity
+                        ref={el => touchableRef = el}
+                        onPress={(e) => {
+                            if (e) {
+                                e.preventDefault();
+                            }
 
-                        props.onSelectRow(optionItem, touchableRef);
-                    }}
-                    activeOpacity={0.8}
-                    style={[
-                        styles.flexRow,
-                        styles.alignItemsCenter,
-                        styles.justifyContentBetween,
-                        styles.sidebarLink,
-                        styles.sidebarLinkInner,
-                        StyleUtils.getBackgroundColorStyle(themeColors.sidebar),
-                        props.isFocused ? styles.sidebarLinkActive : null,
-                        hovered && !props.isFocused ? props.hoverStyle : null,
-                    ]}
-                >
-                    <View accessibilityHint="Navigates to a chat" style={sidebarInnerRowStyle}>
-                        <View
-                            style={[
-                                styles.flexRow,
-                                styles.alignItemsCenter,
-                            ]}
-                        >
-                            {
+                            props.onSelectRow(optionItem, touchableRef);
+                        }}
+                        activeOpacity={0.8}
+                        style={[
+                            styles.flexRow,
+                            styles.alignItemsCenter,
+                            styles.justifyContentBetween,
+                            styles.sidebarLink,
+                            styles.sidebarLinkInner,
+                            StyleUtils.getBackgroundColorStyle(themeColors.sidebar),
+                            props.isFocused ? styles.sidebarLinkActive : null,
+                            hovered && !props.isFocused ? props.hoverStyle : null,
+                        ]}
+                    >
+                        <View accessibilityHint="Navigates to a chat" style={sidebarInnerRowStyle}>
+                            <View
+                                style={[
+                                    styles.flexRow,
+                                    styles.alignItemsCenter,
+                                ]}
+                            >
+                                {
                                 !_.isEmpty(optionItem.icons)
                                 && (
                                     optionItem.shouldShowSubscript ? (
@@ -155,73 +161,83 @@ const OptionRowLHN = (props) => {
                                         />
                                     )
                                 )
-                            }
-                            <View style={contentContainerStyles}>
-                                <View style={[styles.flexRow, styles.alignItemsCenter, styles.mw100, styles.overflowHidden]}>
-                                    <DisplayNames
-                                        accessibilityLabel="Chat user display names"
-                                        fullTitle={optionItem.text}
-                                        displayNamesWithTooltips={optionItem.displayNamesWithTooltips}
-                                        tooltipEnabled
-                                        numberOfLines={1}
-                                        textStyles={displayNameStyle}
-                                        shouldUseFullTitle={optionItem.isChatRoom || optionItem.isPolicyExpenseChat}
-                                    />
-                                    {optionItem.isChatRoom && (
-                                        <TextPill
-                                            style={textPillStyle}
-                                            accessibilityLabel="Workspace name"
-                                            text={optionItem.subtitle}
+                                }
+                                <View style={contentContainerStyles}>
+                                    <View style={[styles.flexRow, styles.alignItemsCenter, styles.mw100, styles.overflowHidden]}>
+                                        <DisplayNames
+                                            accessibilityLabel="Chat user display names"
+                                            fullTitle={optionItem.text}
+                                            displayNamesWithTooltips={optionItem.displayNamesWithTooltips}
+                                            tooltipEnabled
+                                            numberOfLines={1}
+                                            textStyles={displayNameStyle}
+                                            shouldUseFullTitle={optionItem.isChatRoom || optionItem.isPolicyExpenseChat}
                                         />
-                                    )}
+                                        {optionItem.isChatRoom && (
+                                            <TextPill
+                                                style={textPillStyle}
+                                                accessibilityLabel="Workspace name"
+                                                text={optionItem.subtitle}
+                                            />
+                                        )}
+                                    </View>
+                                    {optionItem.alternateText ? (
+                                        <Text
+                                            style={alternateTextStyle}
+                                            numberOfLines={1}
+                                            accessibilityLabel="Last chat message preview"
+                                        >
+                                            {optionItem.alternateText}
+                                        </Text>
+                                    ) : null}
                                 </View>
-                                {optionItem.alternateText ? (
-                                    <Text
-                                        style={alternateTextStyle}
-                                        numberOfLines={1}
-                                        accessibilityLabel="Last chat message preview"
-                                    >
-                                        {optionItem.alternateText}
-                                    </Text>
+                                {optionItem.descriptiveText ? (
+                                    <View style={[styles.flexWrap]}>
+                                        <Text style={[styles.textLabel]}>
+                                            {optionItem.descriptiveText}
+                                        </Text>
+                                    </View>
                                 ) : null}
+                                {optionItem.brickRoadIndicator === CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR && (
+                                    <View style={[styles.alignItemsCenter, styles.justifyContentCenter]}>
+                                        <Icon
+                                            src={Expensicons.DotIndicator}
+                                            fill={colors.red}
+                                            height={variables.iconSizeSmall}
+                                            width={variables.iconSizeSmall}
+                                        />
+                                    </View>
+                                )}
                             </View>
-                            {optionItem.descriptiveText ? (
-                                <View style={[styles.flexWrap]}>
-                                    <Text style={[styles.textLabel]}>
-                                        {optionItem.descriptiveText}
-                                    </Text>
-                                </View>
-                            ) : null}
-                            {optionItem.brickRoadIndicator === CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR && (
-                                <View style={[styles.alignItemsCenter, styles.justifyContentCenter]}>
-                                    <Icon
-                                        src={Expensicons.DotIndicator}
-                                        fill={colors.red}
-                                        height={variables.iconSizeSmall}
-                                        width={variables.iconSizeSmall}
-                                    />
-                                </View>
-                            )}
                         </View>
-                    </View>
-                    <View style={[styles.flexRow, styles.alignItemsCenter]}>
-                        {optionItem.hasDraftComment && (
-                            <View style={styles.ml2}>
+                        <View
+                            style={[styles.flexRow, styles.alignItemsCenter]}
+                            accessible={false}
+                        >
+                            {optionItem.hasDraftComment && (
+                            <View
+                                style={styles.ml2}
+                                accessibilityLabel={props.translate('sidebarScreen.draftedMessage')}
+                            >
                                 <Icon src={Expensicons.Pencil} height={16} width={16} />
                             </View>
-                        )}
-                        {optionItem.hasOutstandingIOU && (
+                            )}
+                            {optionItem.hasOutstandingIOU && (
                             <IOUBadge iouReportID={optionItem.iouReportID} />
-                        )}
-                        {optionItem.isPinned && (
-                            <View style={styles.ml2}>
+                            )}
+                            {optionItem.isPinned && (
+                            <View
+                                style={styles.ml2}
+                                accessibilityLabel={props.translate('sidebarScreen.chatPinned')}
+                            >
                                 <Icon src={Expensicons.Pin} height={16} width={16} />
                             </View>
-                        )}
-                    </View>
-                </TouchableOpacity>
-            )}
-        </Hoverable>
+                            )}
+                        </View>
+                    </TouchableOpacity>
+                )}
+            </Hoverable>
+        </OfflineWithFeedback>
     );
 };
 
diff --git a/src/components/MenuItem.js b/src/components/MenuItem.js
index 908fd808e474..0ea32095698f 100644
--- a/src/components/MenuItem.js
+++ b/src/components/MenuItem.js
@@ -55,7 +55,7 @@ const MenuItem = (props) => {
         (props.shouldShowBasicTitle ? undefined : styles.textStrong),
         (props.interactive && props.disabled ? styles.disabledText : undefined),
     ], props.style);
-    const descriptionTextStyle = StyleUtils.combineStyles([styles.textLabelSupporting, styles.ml3, styles.breakAll], props.style);
+    const descriptionTextStyle = StyleUtils.combineStyles([styles.textLabelSupporting, styles.ml3, styles.breakAll, styles.lh16], props.style);
 
     return (
         <Pressable
diff --git a/src/components/OfflineWithFeedback.js b/src/components/OfflineWithFeedback.js
index 54d6bc0ab9be..c02441f61ecd 100644
--- a/src/components/OfflineWithFeedback.js
+++ b/src/components/OfflineWithFeedback.js
@@ -28,6 +28,9 @@ const propTypes = {
     // eslint-disable-next-line react/forbid-prop-types
     errors: PropTypes.object,
 
+    /** Whether we should show the error messages */
+    shouldShowErrorMessages: PropTypes.bool,
+
     /** A function to run when the X button next to the error is clicked */
     onClose: PropTypes.func,
 
@@ -40,6 +43,9 @@ const propTypes = {
     /** Additional styles to add after local styles. Applied to the parent container */
     style: stylePropTypes,
 
+    /** Additional styles to add after local styles. Applied to the children wrapper container */
+    contentContainerStyle: stylePropTypes,
+
     /** Additional style object for the error row */
     errorRowStyles: stylePropTypes,
 
@@ -49,8 +55,10 @@ const propTypes = {
 const defaultProps = {
     pendingAction: null,
     errors: null,
+    shouldShowErrorMessages: true,
     onClose: () => {},
     style: [],
+    contentContainerStyle: [],
     errorRowStyles: [],
 };
 
@@ -89,11 +97,11 @@ const OfflineWithFeedback = (props) => {
     return (
         <View style={props.style}>
             {!hideChildren && (
-                <View style={needsOpacity ? styles.offlineFeedback.pending : {}}>
+                <View style={[needsOpacity ? styles.offlineFeedback.pending : {}, props.contentContainerStyle]}>
                     {children}
                 </View>
             )}
-            {hasErrors && (
+            {(props.shouldShowErrorMessages && hasErrors) && (
                 <View style={StyleUtils.combineStyles(styles.offlineFeedback.error, props.errorRowStyles)}>
                     <DotIndicatorMessage messages={props.errors} type="error" />
                     <Tooltip text={props.translate('common.close')}>
diff --git a/src/components/OptionRow.js b/src/components/OptionRow.js
index 0a6a9f7b7a83..9e0c56a8cb94 100644
--- a/src/components/OptionRow.js
+++ b/src/components/OptionRow.js
@@ -21,6 +21,7 @@ import withLocalize, {withLocalizePropTypes} from './withLocalize';
 import Text from './Text';
 import SelectCircle from './SelectCircle';
 import SubscriptAvatar from './SubscriptAvatar';
+import OfflineWithFeedback from './OfflineWithFeedback';
 import CONST from '../CONST';
 import * as ReportUtils from '../libs/ReportUtils';
 import variables from '../styles/variables';
@@ -131,39 +132,48 @@ const OptionRow = (props) => {
     const avatarTooltips = props.showTitleTooltip && !props.option.isChatRoom && !props.option.isArchivedRoom ? _.pluck(displayNamesWithTooltips, 'tooltip') : undefined;
 
     return (
-        <Hoverable>
-            {hovered => (
-                <TouchableOpacity
-                    ref={el => touchableRef = el}
-                    onPress={(e) => {
-                        if (e) {
-                            e.preventDefault();
-                        }
-
-                        props.onSelectRow(props.option, touchableRef);
-                    }}
-                    disabled={props.isDisabled}
-                    activeOpacity={0.8}
-                    style={[
-                        styles.flexRow,
-                        styles.alignItemsCenter,
-                        styles.justifyContentBetween,
-                        styles.sidebarLink,
-                        styles.sidebarLinkInner,
-                        StyleUtils.getBackgroundColorStyle(props.backgroundColor),
-                        props.optionIsFocused ? styles.sidebarLinkActive : null,
-                        hovered && !props.optionIsFocused ? props.hoverStyle : null,
-                        props.isDisabled && styles.cursorDisabled,
-                    ]}
-                >
-                    <View accessibilityHint={props.accessibilityHint} style={sidebarInnerRowStyle}>
-                        <View
-                            style={[
-                                styles.flexRow,
-                                styles.alignItemsCenter,
-                            ]}
-                        >
-                            {
+        <OfflineWithFeedback
+            pendingAction={props.option.pendingAction}
+            errors={props.option.allReportErrors}
+            shouldShowErrorMessages={false}
+        >
+            <Hoverable
+                containerStyles={[
+                    props.isDisabled ? styles.userSelectNone : null,
+                ]}
+            >
+                {hovered => (
+                    <TouchableOpacity
+                        ref={el => touchableRef = el}
+                        onPress={(e) => {
+                            if (e) {
+                                e.preventDefault();
+                            }
+
+                            props.onSelectRow(props.option, touchableRef);
+                        }}
+                        disabled={props.isDisabled}
+                        activeOpacity={0.8}
+                        style={[
+                            styles.flexRow,
+                            styles.alignItemsCenter,
+                            styles.justifyContentBetween,
+                            styles.sidebarLink,
+                            styles.sidebarLinkInner,
+                            StyleUtils.getBackgroundColorStyle(props.backgroundColor),
+                            props.optionIsFocused ? styles.sidebarLinkActive : null,
+                            hovered && !props.optionIsFocused ? props.hoverStyle : null,
+                            props.isDisabled && styles.cursorDisabled,
+                        ]}
+                    >
+                        <View accessibilityHint={props.accessibilityHint} style={sidebarInnerRowStyle}>
+                            <View
+                                style={[
+                                    styles.flexRow,
+                                    styles.alignItemsCenter,
+                                ]}
+                            >
+                                {
                                 !_.isEmpty(props.option.icons)
                                 && (
                                     props.option.shouldShowSubscript ? (
@@ -191,35 +201,35 @@ const OptionRow = (props) => {
                                         />
                                     )
                                 )
-                            }
-                            <View style={contentContainerStyles}>
-                                <DisplayNames
-                                    accessibilityLabel="Chat user display names"
-                                    fullTitle={props.option.text}
-                                    displayNamesWithTooltips={displayNamesWithTooltips}
-                                    tooltipEnabled={props.showTitleTooltip}
-                                    numberOfLines={1}
-                                    textStyles={displayNameStyle}
-                                    shouldUseFullTitle={props.option.isChatRoom || props.option.isPolicyExpenseChat}
-                                />
-                                {props.option.alternateText ? (
-                                    <Text
-                                        accessibilityLabel={props.alternateTextAccessibilityLabel}
-                                        style={alternateTextStyle}
+                                }
+                                <View style={contentContainerStyles}>
+                                    <DisplayNames
+                                        accessibilityLabel="Chat user display names"
+                                        fullTitle={props.option.text}
+                                        displayNamesWithTooltips={displayNamesWithTooltips}
+                                        tooltipEnabled={props.showTitleTooltip}
                                         numberOfLines={1}
-                                    >
-                                        {props.option.alternateText}
-                                    </Text>
-                                ) : null}
-                            </View>
-                            {props.option.descriptiveText ? (
-                                <View style={[styles.flexWrap]}>
-                                    <Text style={[styles.textLabel]}>
-                                        {props.option.descriptiveText}
-                                    </Text>
+                                        textStyles={displayNameStyle}
+                                        shouldUseFullTitle={props.option.isChatRoom || props.option.isPolicyExpenseChat}
+                                    />
+                                    {props.option.alternateText ? (
+                                        <Text
+                                            accessibilityLabel={props.alternateTextAccessibilityLabel}
+                                            style={alternateTextStyle}
+                                            numberOfLines={1}
+                                        >
+                                            {props.option.alternateText}
+                                        </Text>
+                                    ) : null}
                                 </View>
-                            ) : null}
-                            {props.option.brickRoadIndicator === CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR && (
+                                {props.option.descriptiveText ? (
+                                    <View style={[styles.flexWrap]}>
+                                        <Text style={[styles.textLabel]}>
+                                            {props.option.descriptiveText}
+                                        </Text>
+                                    </View>
+                                ) : null}
+                                {props.option.brickRoadIndicator === CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR && (
                                 <View style={[styles.alignItemsCenter, styles.justifyContentCenter]}>
                                     <Icon
                                         src={Expensicons.DotIndicator}
@@ -228,30 +238,40 @@ const OptionRow = (props) => {
                                         width={variables.iconSizeSmall}
                                     />
                                 </View>
-                            )}
-                            {props.showSelectedState && <SelectCircle isChecked={props.isSelected} />}
-                        </View>
-                    </View>
-                    {!props.hideAdditionalOptionStates && (
-                        <View style={[styles.flexRow, styles.alignItemsCenter]}>
-                            {props.option.hasDraftComment && (
-                                <View style={styles.ml2}>
-                                    <Icon src={Expensicons.Pencil} height={16} width={16} />
-                                </View>
-                            )}
-                            {props.option.hasOutstandingIOU && (
-                                <IOUBadge iouReportID={props.option.iouReportID} />
-                            )}
-                            {props.option.isPinned && (
-                                <View style={styles.ml2}>
-                                    <Icon src={Expensicons.Pin} height={16} width={16} />
-                                </View>
-                            )}
+                                )}
+                                {props.showSelectedState && <SelectCircle isChecked={props.isSelected} />}
+                            </View>
                         </View>
-                    )}
-                </TouchableOpacity>
-            )}
-        </Hoverable>
+                        {!props.hideAdditionalOptionStates && (
+                            <View
+                                style={[styles.flexRow, styles.alignItemsCenter]}
+                                accessible={false}
+                            >
+                                {props.option.hasDraftComment && (
+                                    <View
+                                        style={styles.ml2}
+                                        accessibilityLabel={props.translate('sidebarScreen.draftedMessage')}
+                                    >
+                                        <Icon src={Expensicons.Pencil} height={16} width={16} />
+                                    </View>
+                                )}
+                                {props.option.hasOutstandingIOU && (
+                                    <IOUBadge iouReportID={props.option.iouReportID} />
+                                )}
+                                {props.option.isPinned && (
+                                    <View
+                                        style={styles.ml2}
+                                        accessibilityLabel={props.translate('sidebarScreen.chatPinned')}
+                                    >
+                                        <Icon src={Expensicons.Pin} height={16} width={16} />
+                                    </View>
+                                )}
+                            </View>
+                        )}
+                    </TouchableOpacity>
+                )}
+            </Hoverable>
+        </OfflineWithFeedback>
     );
 };
 
diff --git a/src/components/ReportWelcomeText.js b/src/components/ReportWelcomeText.js
index 0cb559128768..8ee9718ab1d1 100644
--- a/src/components/ReportWelcomeText.js
+++ b/src/components/ReportWelcomeText.js
@@ -108,7 +108,7 @@ const ReportWelcomeText = (props) => {
                         displayName, pronouns, tooltip,
                     }, index) => (
                         <Text key={`${displayName}${pronouns}${index}`}>
-                            <Tooltip text={tooltip}>
+                            <Tooltip text={tooltip} containerStyles={[styles.dInline]}>
                                 <Text style={[styles.textStrong]} onPress={() => Navigation.navigate(ROUTES.getDetailsRoute(participants[index]))}>
                                     {displayName}
                                 </Text>
diff --git a/src/languages/en.js b/src/languages/en.js
index 844f1b090c81..939a60d94665 100755
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -81,7 +81,7 @@ export default {
         error: {
             invalidAmount: 'Invalid amount',
             acceptedTerms: 'You must accept the Terms of Service to continue',
-            phoneNumber: `Please enter a valid phone number, with the country code (e.g. ${CONST.EXAMPLE_PHONE_NUMBER}).`,
+            phoneNumber: `Please enter a valid phone number, with the country code (e.g. ${CONST.EXAMPLE_PHONE_NUMBER})`,
         },
         please: 'Please',
         contactUs: 'contact us',
@@ -235,6 +235,8 @@ export default {
         buttonSearch: 'Search',
         buttonMySettings: 'My settings',
         fabNewChat: 'New chat(Floating Action)',
+        chatPinned: 'Chat pinned',
+        draftedMessage: 'Drafted message',
     },
     iou: {
         amount: 'Amount',
@@ -412,7 +414,7 @@ export default {
             notOwnerOfFund: 'There was an error setting this card as your default payment method.',
             setDefaultFailure: 'Something went wrong. Please chat with Concierge for further assistance.',
         },
-        addBankAccountFailure: 'And unexpected error occurred while trying to add your bank account. Please try again.',
+        addBankAccountFailure: 'An unexpected error occurred while trying to add your bank account. Please try again.',
     },
     transferAmountPage: {
         transfer: ({amount}) => `Transfer${amount ? ` ${amount}` : ''}`,
@@ -953,8 +955,8 @@ export default {
         },
         error: {
             phoneNumberExtension: 'Please enter a valid phone extension number',
-            firstName: 'Please provide your first name so our guides know how to address you!',
-            lastName: 'Please provide your last name so our guides know how to address you!',
+            firstName: 'Please provide your first name',
+            lastName: 'Please provide your last name',
             firstNameLength: 'First name shouldn\'t be longer than 50 characters',
             lastNameLength: 'Last name shouldn\'t be longer than 50 characters',
         },
diff --git a/src/languages/es.js b/src/languages/es.js
index 66d8ceb364c1..31f7161565b9 100644
--- a/src/languages/es.js
+++ b/src/languages/es.js
@@ -81,7 +81,7 @@ export default {
         error: {
             invalidAmount: 'Monto no válido',
             acceptedTerms: 'Debes aceptar los Términos de servicio para continuar',
-            phoneNumber: `Ingresa un teléfono válido, incluyendo el código de país (p. ej. ${CONST.EXAMPLE_PHONE_NUMBER}).`,
+            phoneNumber: `Ingresa un teléfono válido, incluyendo el código de país (p. ej. ${CONST.EXAMPLE_PHONE_NUMBER})`,
         },
         please: 'Por favor',
         contactUs: 'contáctenos',
@@ -210,7 +210,7 @@ export default {
         beginningOfChatHistory: 'Aquí comienza tu historial de conversaciones con ',
         beginningOfChatHistoryPolicyExpenseChatPartOne: '¡La colaboración entre ',
         beginningOfChatHistoryPolicyExpenseChatPartTwo: ' y ',
-        beginningOfChatHistoryPolicyExpenseChatPartThree: ' empieza aquí! :tada: Este es el lugar donde chatear, pedir dinero y pagar.',
+        beginningOfChatHistoryPolicyExpenseChatPartThree: ' empieza aquí! 🎉 Este es el lugar donde chatear, pedir dinero y pagar.',
         chatWithAccountManager: 'Chatea con tu gestor de cuenta aquí',
     },
     newMessages: 'Mensajes nuevos',
@@ -235,6 +235,8 @@ export default {
         buttonSearch: 'Buscar',
         buttonMySettings: 'Mi configuración',
         fabNewChat: 'Nuevo chat',
+        chatPinned: 'Chat fijado',
+        draftedMessage: 'Mensaje borrador',
     },
     iou: {
         amount: 'Importe',
@@ -412,7 +414,7 @@ export default {
             notOwnerOfFund: 'Ha ocurrido un error al establecer esta tarjeta de crédito como tu método de pago predeterminado.',
             setDefaultFailure: 'No se pudo configurar el método de pago.',
         },
-        addBankAccountFailure: 'Y ocurrió un error inesperado al intentar agregar su cuenta bancaria. Inténtalo de nuevo.',
+        addBankAccountFailure: 'Ocurrió un error inesperado al intentar agregar su cuenta bancaria. Inténtalo de nuevo.',
     },
     transferAmountPage: {
         transfer: ({amount}) => `Transferir${amount ? ` ${amount}` : ''}`,
@@ -955,8 +957,8 @@ export default {
         },
         error: {
             phoneNumberExtension: 'Por favor, introduzca una extensión telefónica válida',
-            firstName: 'Por favor ingresa tu nombre!',
-            lastName: 'Por favor ingresa tu apellido!',
+            firstName: 'Por favor ingresa tu nombre',
+            lastName: 'Por favor ingresa tu apellido',
             firstNameLength: 'El nombre no debe tener más de 50 caracteres',
             lastNameLength: 'El apellido no debe tener más de 50 caracteres',
         },
diff --git a/src/libs/EmojiTrie.js b/src/libs/EmojiTrie.js
new file mode 100644
index 000000000000..5d7a15dbf885
--- /dev/null
+++ b/src/libs/EmojiTrie.js
@@ -0,0 +1,35 @@
+import emojis from '../../assets/emojis';
+import Trie from './Trie';
+import Timing from './actions/Timing';
+import CONST from '../CONST';
+
+Timing.start(CONST.TIMING.TRIE_INITIALIZATION);
+
+const emojisTrie = new Trie();
+
+// Inserting all emojis into the Trie object
+for (let i = 0; i < emojis.length; i++) {
+    if (emojis[i].name) {
+        const node = emojisTrie.search(emojis[i].name);
+        if (!node) {
+            emojisTrie.add(emojis[i].name, {code: emojis[i].code, suggestions: []});
+        } else {
+            emojisTrie.update(emojis[i].name, {code: emojis[i].code, suggestions: node.metaData.suggestions});
+        }
+
+        if (emojis[i].keywords) {
+            for (let j = 0; j < emojis[i].keywords.length; j++) {
+                const keywordNode = emojisTrie.search(emojis[i].keywords[j]);
+                if (!keywordNode) {
+                    emojisTrie.add(emojis[i].keywords[j], {suggestions: [{code: emojis[i].code, name: emojis[i].name}]});
+                } else {
+                    emojisTrie.update(emojis[i].keywords[j],
+                        {...keywordNode.metaData, suggestions: [...keywordNode.metaData.suggestions, {code: emojis[i].code, name: emojis[i].name}]});
+                }
+            }
+        }
+    }
+}
+Timing.end(CONST.TIMING.TRIE_INITIALIZATION);
+
+export default emojisTrie;
diff --git a/src/libs/EmojiUtils.js b/src/libs/EmojiUtils.js
index 133e21d1ba18..3c2fe3fb8f2c 100644
--- a/src/libs/EmojiUtils.js
+++ b/src/libs/EmojiUtils.js
@@ -4,6 +4,7 @@ import moment from 'moment';
 import Str from 'expensify-common/lib/str';
 import CONST from '../CONST';
 import * as User from './actions/User';
+import emojisTrie from './EmojiTrie';
 
 /**
  * Get the unicode code of an emoji in base 16.
@@ -199,10 +200,65 @@ function addToFrequentlyUsedEmojis(frequentlyUsedEmojis, newEmoji) {
     User.updateFrequentlyUsedEmojis(frequentEmojiList);
 }
 
+/**
+ * Replace any emoji name in a text with the emoji icon
+ * @param {String} text
+ * @returns {String}
+ */
+function replaceEmojis(text) {
+    let newText = text;
+    const emojiData = text.match(CONST.REGEX.EMOJI_NAME);
+    if (!emojiData || emojiData.length === 0) {
+        return text;
+    }
+    for (let i = 0; i < emojiData.length; i++) {
+        const checkEmoji = emojisTrie.search(emojiData[i].slice(1, -1));
+        if (checkEmoji && checkEmoji.metaData.code) {
+            newText = newText.replace(emojiData[i], checkEmoji.metaData.code);
+        }
+    }
+    return newText;
+}
+
+/**
+ * Suggest emojis when typing emojis prefix after colon
+ * @param {String} text
+ * @param {Number} [limit] - matching emojis limit
+ * @returns {Array}
+ */
+function suggestEmojis(text, limit = 5) {
+    const emojiData = text.match(CONST.REGEX.EMOJI_SUGGESTIONS);
+    if (emojiData) {
+        const matching = [];
+        const nodes = emojisTrie.getAllMatchingWords(emojiData[0].toLowerCase().slice(1));
+        for (let j = 0; j < nodes.length; j++) {
+            if (nodes[j].metaData.code && !_.find(matching, obj => obj.name === nodes[j].name)) {
+                if (matching.length === limit) {
+                    return matching;
+                }
+                matching.unshift({code: nodes[j].metaData.code, name: nodes[j].name});
+            }
+            const suggestions = nodes[j].metaData.suggestions;
+            for (let i = 0; i < suggestions.length; i++) {
+                if (matching.length === limit) {
+                    return matching;
+                }
+                if (!_.find(matching, obj => obj.name === suggestions[i].name)) {
+                    matching.unshift(suggestions[i]);
+                }
+            }
+        }
+        return matching;
+    }
+    return [];
+}
+
 export {
     isSingleEmoji,
     getDynamicHeaderIndices,
     mergeEmojisWithFrequentlyUsedEmojis,
     addToFrequentlyUsedEmojis,
     containsOnlyEmojis,
+    replaceEmojis,
+    suggestEmojis,
 };
diff --git a/src/libs/OptionsListUtils.js b/src/libs/OptionsListUtils.js
index 32065fd99f68..2bc775724007 100644
--- a/src/libs/OptionsListUtils.js
+++ b/src/libs/OptionsListUtils.js
@@ -209,26 +209,37 @@ function getSearchText(report, reportName, personalDetailList, isChatRoomOrPolic
 }
 
 /**
- * If the report or the report actions have errors, return
- * CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR, otherwise an empty string.
- *
+ * Get an object of error messages keyed by microtime by combining all error objects related to the report.
  * @param {Object} report
  * @param {Object} reportActions
- * @returns {String}
+ * @returns {Object}
  */
-function getBrickRoadIndicatorStatusForReport(report, reportActions) {
+function getAllReportErrors(report, reportActions) {
     const reportErrors = report.errors || {};
     const reportErrorFields = report.errorFields || {};
     const reportID = report.reportID;
     const reportsActions = reportActions[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`] || {};
+    const reportActionErrors = _.reduce(
+        reportsActions,
+        (prevReportActionErrors, action) => (_.isEmpty(action.errors) ? prevReportActionErrors : _.extend(prevReportActionErrors, action.errors)),
+        {},
+    );
 
-    const hasReportFieldErrors = _.some(reportErrorFields, fieldErrors => !_.isEmpty(fieldErrors));
-    const hasReportActionErrors = _.some(reportsActions, action => !_.isEmpty(action.errors));
+    // All error objects related to the report. Each object in the sources contains error messages keyed by microtime
+    const errorSources = {
+        reportErrors,
+        ...reportErrorFields,
+        reportActionErrors,
+    };
 
-    if (_.isEmpty(reportErrors) && !hasReportFieldErrors && !hasReportActionErrors) {
-        return '';
-    }
-    return CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR;
+    // Combine all error messages keyed by microtime into one object
+    const allReportErrors = _.reduce(
+        errorSources,
+        (prevReportErrors, errors) => (_.isEmpty(errors) ? prevReportErrors : _.extend(prevReportErrors, errors)),
+        {},
+    );
+
+    return allReportErrors;
 }
 
 /**
@@ -250,6 +261,8 @@ function createOption(logins, personalDetails, report, reportActions = {}, {
     const result = {
         text: null,
         alternateText: null,
+        pendingAction: null,
+        allReportErrors: null,
         brickRoadIndicator: null,
         icons: null,
         tooltipText: null,
@@ -290,7 +303,9 @@ function createOption(logins, personalDetails, report, reportActions = {}, {
         result.isArchivedRoom = ReportUtils.isArchivedRoom(report);
         result.isPolicyExpenseChat = ReportUtils.isPolicyExpenseChat(report);
         result.shouldShowSubscript = result.isPolicyExpenseChat && !report.isOwnPolicyExpenseChat && !result.isArchivedRoom;
-        result.brickRoadIndicator = getBrickRoadIndicatorStatusForReport(report, reportActions);
+        result.allReportErrors = getAllReportErrors(report, reportActions);
+        result.brickRoadIndicator = !_.isEmpty(result.allReportErrors) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : '';
+        result.pendingAction = report.pendingFields ? report.pendingFields.addWorkspaceRoom : null;
         result.ownerEmail = report.ownerEmail;
         result.reportID = report.reportID;
         result.isUnread = ReportUtils.isUnread(report);
@@ -802,5 +817,5 @@ export {
     getIOUConfirmationOptionsFromMyPersonalDetail,
     getIOUConfirmationOptionsFromParticipants,
     getSearchText,
-    getBrickRoadIndicatorStatusForReport,
+    getAllReportErrors,
 };
diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js
index 94bf06fc2d1f..d6847c096def 100644
--- a/src/libs/ReportUtils.js
+++ b/src/libs/ReportUtils.js
@@ -58,6 +58,13 @@ Onyx.connect({
     },
 });
 
+let allReports;
+Onyx.connect({
+    key: ONYXKEYS.COLLECTION.REPORT,
+    waitForCollectionCallback: true,
+    callback: val => allReports = val,
+});
+
 /**
  * Returns the concatenated title for the PrimaryLogins of a report
  *
@@ -940,8 +947,8 @@ function shouldReportBeInOptionList(report, reportIDFromRoute, isInGSDMode, curr
         return true;
     }
 
-    // Include default rooms unless you're on the default room beta
-    if (isDefaultRoom(report) && !Permissions.canUseDefaultRooms(betas)) {
+    // Include default rooms unless you're on the default room beta, unless you have an assigned guide
+    if (isDefaultRoom(report) && !Permissions.canUseDefaultRooms(betas) && !hasExpensifyGuidesEmails(lodashGet(report, ['participants'], []))) {
         return false;
     }
 
@@ -958,6 +965,22 @@ function shouldReportBeInOptionList(report, reportIDFromRoute, isInGSDMode, curr
     return true;
 }
 
+/**
+ * Attempts to find a report in onyx with the provided list of participants
+ * @param {Array} newParticipantList
+ * @returns {Array|undefined}
+ */
+function getChatByParticipants(newParticipantList) {
+    newParticipantList.sort();
+    return _.find(allReports, (report) => {
+        // If the report has been deleted, or there are no participants (like an empty #admins room) then skip it
+        if (!report || !report.participants) {
+            return false;
+        }
+        return _.isEqual(newParticipantList, report.participants.sort());
+    });
+}
+
 export {
     getReportParticipantsTitle,
     isReportMessageAttachment,
@@ -998,4 +1021,5 @@ export {
     buildOptimisticIOUReportAction,
     buildOptimisticReportAction,
     shouldReportBeInOptionList,
+    getChatByParticipants,
 };
diff --git a/src/libs/SelectionScraper/index.js b/src/libs/SelectionScraper/index.js
index 99405259eaea..317b72741f6f 100644
--- a/src/libs/SelectionScraper/index.js
+++ b/src/libs/SelectionScraper/index.js
@@ -133,7 +133,7 @@ const getCurrentSelection = () => {
     const domRepresentation = parseDocument(getHTMLOfSelection());
     domRepresentation.children = _.map(domRepresentation.children, replaceNodes);
 
-    const newHtml = render(domRepresentation);
+    const newHtml = Str.htmlDecode(render(domRepresentation));
     return newHtml || '';
 };
 
diff --git a/src/libs/SidebarUtils.js b/src/libs/SidebarUtils.js
index e46d4d12f56f..2aefa7ed8558 100644
--- a/src/libs/SidebarUtils.js
+++ b/src/libs/SidebarUtils.js
@@ -187,6 +187,8 @@ function getOptionData(reportID) {
     const result = {
         text: null,
         alternateText: null,
+        pendingAction: null,
+        allReportErrors: null,
         brickRoadIndicator: null,
         icons: null,
         tooltipText: null,
@@ -220,7 +222,9 @@ function getOptionData(reportID) {
     result.isArchivedRoom = ReportUtils.isArchivedRoom(report);
     result.isPolicyExpenseChat = ReportUtils.isPolicyExpenseChat(report);
     result.shouldShowSubscript = result.isPolicyExpenseChat && !report.isOwnPolicyExpenseChat && !result.isArchivedRoom;
-    result.brickRoadIndicator = OptionsListUtils.getBrickRoadIndicatorStatusForReport(report, reportActions);
+    result.pendingAction = report.pendingFields ? report.pendingFields.addWorkspaceRoom : null;
+    result.allReportErrors = OptionsListUtils.getAllReportErrors(report, reportActions);
+    result.brickRoadIndicator = !_.isEmpty(result.allReportErrors) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : '';
     result.ownerEmail = report.ownerEmail;
     result.reportID = report.reportID;
     result.isUnread = ReportUtils.isUnread(report);
diff --git a/src/libs/Trie/TrieNode.js b/src/libs/Trie/TrieNode.js
new file mode 100644
index 000000000000..27597f861620
--- /dev/null
+++ b/src/libs/Trie/TrieNode.js
@@ -0,0 +1,9 @@
+class TrieNode {
+    constructor() {
+        this.children = {};
+        this.isEndOfWord = false;
+        this.metaData = {};
+    }
+}
+
+export default TrieNode;
diff --git a/src/libs/Trie/index.js b/src/libs/Trie/index.js
new file mode 100644
index 000000000000..0d6c84415877
--- /dev/null
+++ b/src/libs/Trie/index.js
@@ -0,0 +1,115 @@
+import _ from 'underscore';
+import TrieNode from './TrieNode';
+
+class Trie {
+    constructor() {
+        this.root = new TrieNode();
+    }
+
+    /**
+    * Add a word to the Trie
+    * @param {String} word
+    * @param {Object} [metaData] - attach additional data to the word
+    * @param {TrieNode} [node]
+    * @param {Boolean} [allowEmptyWords] - empty word doesn't have any char, you shouldn't pass a true value for it because we are disallowing adding an empty word
+    */
+    add(word, metaData = {}, node = this.root, allowEmptyWords = false) {
+        const newWord = word.toLowerCase();
+        const newNode = node;
+        if (newWord.length === 0 && !allowEmptyWords) {
+            throw new Error('Cannot insert empty word into Trie');
+        }
+        if (newWord.length === 0) {
+            newNode.isEndOfWord = true;
+            newNode.metaData = metaData;
+            return;
+        }
+        if (!newNode.children[newWord[0]]) {
+            newNode.children[newWord[0]] = new TrieNode();
+            this.add(newWord.substring(1), metaData, newNode.children[newWord[0]], true);
+        }
+        this.add(newWord.substring(1), metaData, newNode.children[newWord[0]], true);
+    }
+
+    /**
+    * Search for a word in the Trie.
+    * @param {String} word
+    * @returns {Object|null} – the node for the word if it's found, or null if it's not found
+    */
+    search(word) {
+        let newWord = word.toLowerCase();
+        let node = this.root;
+        while (newWord.length > 1) {
+            if (!node.children[newWord[0]]) {
+                return null;
+            }
+            node = node.children[newWord[0]];
+
+            newWord = newWord.substring(1);
+        }
+        return node.children[newWord] && node.children[newWord].isEndOfWord ? node.children[newWord] : null;
+    }
+
+    /**
+    * Update a word data in the Trie.
+    * @param {String} word
+    * @param {Object} metaData
+    */
+    update(word, metaData) {
+        let newWord = word.toLowerCase();
+        let node = this.root;
+        while (newWord.length > 1) {
+            if (!node.children[newWord[0]]) {
+                throw new Error('Word does not exist in the Trie');
+            }
+            node = node.children[newWord[0]];
+            newWord = newWord.substring(1);
+        }
+        node.children[newWord].metaData = metaData;
+    }
+
+    /**
+    * Find all leaf nodes starting with a substring.
+    * @param {String} substr
+    * @param {Number} [limit] - matching words limit
+    * @returns {Array}
+    */
+    getAllMatchingWords(substr, limit = 5) {
+        const newSubstr = substr.toLowerCase();
+        let node = this.root;
+        let prefix = '';
+        for (let i = 0; i < newSubstr.length; i++) {
+            prefix += newSubstr[i];
+            if (!node.children[newSubstr[i]]) {
+                return [];
+            }
+            node = node.children[newSubstr[i]];
+        }
+        return this.getChildMatching(node, prefix, limit, []);
+    }
+
+    /**
+    * Find all leaf nodes that are descendants of a given child node.
+    * @param {TrieNode} node
+    * @param {String} prefix
+    * @param {Number} limit
+    * @param {Array} [words]
+    * @returns {Array}
+    */
+    getChildMatching(node, prefix, limit, words = []) {
+        const matching = words;
+        if (matching.length >= limit) {
+            return matching;
+        }
+        if (node.isEndOfWord) {
+            matching.unshift({name: prefix, metaData: node.metaData});
+        }
+        const children = _.keys(node.children);
+        for (let i = 0; i < children.length; i++) {
+            this.getChildMatching(node.children[children[i]], prefix + children[i], limit, matching);
+        }
+        return matching;
+    }
+}
+
+export default Trie;
diff --git a/src/libs/actions/BankAccounts.js b/src/libs/actions/BankAccounts.js
index 53fe6511b5d1..9f6f808e8cbc 100644
--- a/src/libs/actions/BankAccounts.js
+++ b/src/libs/actions/BankAccounts.js
@@ -310,17 +310,31 @@ function connectBankAccountManually(bankAccountID, accountNumber, routingNumber,
     }, getVBBADataForOnyx());
 }
 
+/**
+ * Verify the user's identity via Onfido
+ *
+ * @param {Number} bankAccountID
+ * @param {Object} onfidoData
+ */
+function verifyIdentityForBankAccount(bankAccountID, onfidoData) {
+    API.write('VerifyIdentityForBankAccount', {
+        bankAccountID,
+        onfidoData: JSON.stringify(onfidoData),
+    }, getVBBADataForOnyx());
+}
+
 export {
     addPersonalBankAccount,
     connectBankAccountManually,
-    deletePaymentBankAccount,
     clearPersonalBankAccount,
     clearPlaid,
     clearOnfidoToken,
-    updatePersonalInformationForBankAccount,
-    validateBankAccount,
-    updateCompanyInformationForBankAccount,
-    updateBeneficialOwnersForBankAccount,
     connectBankAccountWithPlaid,
+    deletePaymentBankAccount,
+    updateBeneficialOwnersForBankAccount,
+    updateCompanyInformationForBankAccount,
+    updatePersonalInformationForBankAccount,
     updatePlaidData,
+    validateBankAccount,
+    verifyIdentityForBankAccount,
 };
diff --git a/src/libs/actions/Policy.js b/src/libs/actions/Policy.js
index b51666f0e86f..1df9a904ea20 100644
--- a/src/libs/actions/Policy.js
+++ b/src/libs/actions/Policy.js
@@ -99,26 +99,6 @@ function updateLastAccessedWorkspace(policyID) {
     Onyx.set(ONYXKEYS.LAST_ACCESSED_WORKSPACE_POLICY_ID, policyID);
 }
 
-/**
- * Used to update ALL of the policies at once. If a policy is present locally, but not in the policies object passed here it will be removed.
- * @param {Object} policyCollection - object of policy key and partial policy object
- */
-function updateAllPolicies(policyCollection) {
-    // Clear out locally cached policies that have been deleted (i.e. they exist locally but not in our new policy collection object)
-    _.each(allPolicies, (policy, key) => {
-        if (policyCollection[key]) {
-            return;
-        }
-
-        Onyx.set(key, null);
-    });
-
-    // Set all the policies
-    _.each(policyCollection, (policyData, key) => {
-        Onyx.merge(key, {...policyData, alertMessage: '', errors: null});
-    });
-}
-
 /**
  * Delete the workspace
  *
@@ -168,40 +148,6 @@ function deleteWorkspace(policyID, reports) {
     }
 }
 
-/**
- * Fetches policy list from the API and saves a simplified version in Onyx, optionally creating a new policy first.
- *
- * More specifically, this action will:
- * 1. Optionally create a new policy.
- * 2. Fetch policy summaries.
- * 3. Optionally navigate to the new policy.
- * 4. Then fetch full policies.
- *
- * This way, we ensure that there's no race condition between creating the new policy and fetching existing ones,
- * and we also don't have to wait for full policies to load before navigating to the new policy.
- */
-function getPolicyList() {
-    Onyx.set(ONYXKEYS.IS_LOADING_POLICY_DATA, true);
-    DeprecatedAPI.GetPolicySummaryList()
-        .then((data) => {
-            if (data.jsonCode !== 200) {
-                Onyx.set(ONYXKEYS.IS_LOADING_POLICY_DATA, false);
-                return;
-            }
-
-            const policyCollection = _.reduce(data.policySummaryList, (memo, policy) => ({
-                ...memo,
-                [`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`]: getSimplifiedPolicyObject(policy, false),
-            }), {});
-
-            if (!_.isEmpty(policyCollection)) {
-                updateAllPolicies(policyCollection);
-            }
-
-            Onyx.set(ONYXKEYS.IS_LOADING_POLICY_DATA, false);
-        });
-}
-
 /**
  * @param {String} policyID
  */
@@ -978,7 +924,6 @@ function openWorkspaceInvitePage(policyID, clientMemberEmails) {
 }
 
 export {
-    getPolicyList,
     loadFullPolicy,
     removeMembers,
     addMembersToWorkspace,
diff --git a/src/libs/actions/Report.js b/src/libs/actions/Report.js
index fc9b2e5a8518..2732f24ac3a8 100644
--- a/src/libs/actions/Report.js
+++ b/src/libs/actions/Report.js
@@ -689,39 +689,67 @@ function addComment(reportID, text) {
 
 /**
  * Gets the latest page of report actions and updates the last read message
+ * If a chat with the passed reportID is not found, we will create a chat based on the passed participantList
  *
  * @param {String} reportID
+ * @param {Array} participantList The list of users that are included in a new chat, not including the user creating it
+ * @param {Object} newReportObject The optimistic report object created when making a new chat, saved as optimistic data
  */
-function openReport(reportID) {
+function openReport(reportID, participantList = [], newReportObject = {}) {
+    const onyxData = {
+        optimisticData: [{
+            onyxMethod: CONST.ONYX.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`,
+            value: {
+                isLoadingReportActions: true,
+                lastVisitedTimestamp: Date.now(),
+                lastReadSequenceNumber: getMaxSequenceNumber(reportID),
+            },
+        }],
+        successData: [{
+            onyxMethod: CONST.ONYX.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`,
+            value: {
+                isLoadingReportActions: false,
+                pendingFields: {
+                    createChat: null,
+                },
+                errorFields: {
+                    createChat: null,
+                },
+                isOptimisticReport: false,
+            },
+        }],
+    };
+
+    // If we are creating a new report, we need to add the optimistic report data and a report action
+    if (!_.isEmpty(newReportObject)) {
+        onyxData.optimisticData[0].value = {
+            ...onyxData.optimisticData[0].value,
+            ...newReportObject,
+            pendingFields: {
+                createChat: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
+            },
+            isOptimisticReport: true,
+        };
+
+        // Change the method to set for new reports because it doesn't exist yet, is faster,
+        // and we need the data to be available when we navigate to the chat page
+        onyxData.optimisticData[0].onyxMethod = CONST.ONYX.METHOD.SET;
+
+        // Also create a report action so that the page isn't endlessly loading
+        onyxData.optimisticData[1] = {
+            onyxMethod: CONST.ONYX.METHOD.SET,
+            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`,
+            value: ReportUtils.buildOptimisticCreatedReportAction(newReportObject.ownerEmail),
+        };
+    }
     API.write('OpenReport',
         {
             reportID,
+            emailList: participantList ? participantList.join(',') : '',
         },
-        {
-            optimisticData: [{
-                onyxMethod: CONST.ONYX.METHOD.MERGE,
-                key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`,
-                value: {
-                    isLoadingReportActions: true,
-                    lastVisitedTimestamp: Date.now(),
-                    lastReadSequenceNumber: getMaxSequenceNumber(reportID),
-                },
-            }],
-            successData: [{
-                onyxMethod: CONST.ONYX.METHOD.MERGE,
-                key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`,
-                value: {
-                    isLoadingReportActions: false,
-                },
-            }],
-            failureData: [{
-                onyxMethod: CONST.ONYX.METHOD.MERGE,
-                key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`,
-                value: {
-                    isLoadingReportActions: false,
-                },
-            }],
-        });
+        onyxData);
 }
 
 /**
@@ -1271,7 +1299,7 @@ function addPolicyReport(policy, reportName, visibility) {
 /**
  * @param {String} reportID The reportID of the policy report (workspace room)
  */
-function navigateToConciergeChatAndDeletePolicyReport(reportID) {
+function navigateToConciergeChatAndDeleteReport(reportID) {
     navigateToConciergeChat();
     Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, null);
     Onyx.set(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, null);
@@ -1483,7 +1511,7 @@ export {
     navigateToConciergeChat,
     setReportWithDraft,
     addPolicyReport,
-    navigateToConciergeChatAndDeletePolicyReport,
+    navigateToConciergeChatAndDeleteReport,
     setIsComposerFullSize,
     markCommentAsUnread,
     readNewestAction,
diff --git a/src/libs/actions/Welcome.js b/src/libs/actions/Welcome.js
index 41c559093941..d1130b9450b2 100644
--- a/src/libs/actions/Welcome.js
+++ b/src/libs/actions/Welcome.js
@@ -17,7 +17,6 @@ let isReadyPromise = new Promise((resolve) => {
 
 let isFirstTimeNewExpensifyUser;
 let isLoadingReportData = true;
-let isLoadingPolicyData = true;
 let email = '';
 
 /**
@@ -28,7 +27,7 @@ let email = '';
  * - Whether we have loaded all reports the server knows about
  */
 function checkOnReady() {
-    if (!_.isBoolean(isFirstTimeNewExpensifyUser) || isLoadingPolicyData || isLoadingReportData) {
+    if (!_.isBoolean(isFirstTimeNewExpensifyUser) || isLoadingReportData) {
         return;
     }
 
@@ -53,15 +52,6 @@ Onyx.connect({
     },
 });
 
-Onyx.connect({
-    key: ONYXKEYS.IS_LOADING_POLICY_DATA,
-    initWithStoredValues: false,
-    callback: (val) => {
-        isLoadingPolicyData = val;
-        checkOnReady();
-    },
-});
-
 const allReports = {};
 Onyx.connect({
     key: ONYXKEYS.COLLECTION.REPORT,
@@ -77,7 +67,7 @@ Onyx.connect({
 
 const allPolicies = {};
 Onyx.connect({
-    key: ONYXKEYS.COLLECTION.REPORT,
+    key: ONYXKEYS.COLLECTION.POLICY,
     callback: (val, key) => {
         if (!val || !key) {
             return;
diff --git a/src/pages/AddPersonalBankAccountPage.js b/src/pages/AddPersonalBankAccountPage.js
index f6a747623647..bbd1087893b1 100644
--- a/src/pages/AddPersonalBankAccountPage.js
+++ b/src/pages/AddPersonalBankAccountPage.js
@@ -103,7 +103,7 @@ class AddPersonalBankAccountPage extends React.Component {
             <ScreenWrapper>
                 <HeaderWithCloseButton
                     title={this.props.translate('bankAccount.addBankAccount')}
-                    onCloseButtonPress={Navigation.goBack}
+                    onCloseButtonPress={Navigation.dismissModal}
                     shouldShowBackButton
                     onBackButtonPress={Navigation.goBack}
                 />
diff --git a/src/pages/DetailsPage.js b/src/pages/DetailsPage.js
index 24cb7370a48a..dd94fca3f6ee 100755
--- a/src/pages/DetailsPage.js
+++ b/src/pages/DetailsPage.js
@@ -40,7 +40,7 @@ const propTypes = {
     /* Onyx Props */
 
     /** The personal details of the person who is logged in */
-    personalDetails: personalDetailsPropType.isRequired,
+    personalDetails: personalDetailsPropType,
 
     /** Route params */
     route: matchType.isRequired,
@@ -48,6 +48,11 @@ const propTypes = {
     ...withLocalizePropTypes,
 };
 
+const defaultProps = {
+    // When opening someone else's profile (via deep link) before login, this is empty
+    personalDetails: {},
+};
+
 /**
  * Gets the phone number to display for SMS logins
  *
@@ -77,7 +82,7 @@ class DetailsPage extends React.PureComponent {
     }
 
     render() {
-        const details = this.props.personalDetails[lodashGet(this.props.route.params, 'login')];
+        const details = lodashGet(this.props.personalDetails, lodashGet(this.props.route.params, 'login'));
         if (!details) {
             // Personal details have not loaded yet
             return <FullscreenLoadingIndicator />;
@@ -202,6 +207,7 @@ class DetailsPage extends React.PureComponent {
 }
 
 DetailsPage.propTypes = propTypes;
+DetailsPage.defaultProps = defaultProps;
 
 export default compose(
     withLocalize,
diff --git a/src/pages/EnablePayments/AdditionalDetailsStep.js b/src/pages/EnablePayments/AdditionalDetailsStep.js
index 8c2acb783ec1..6dc289234917 100644
--- a/src/pages/EnablePayments/AdditionalDetailsStep.js
+++ b/src/pages/EnablePayments/AdditionalDetailsStep.js
@@ -92,18 +92,6 @@ class AdditionalDetailsStep extends React.Component {
 
         this.activateWallet = this.activateWallet.bind(this);
 
-        this.requiredFields = [
-            'legalFirstName',
-            'legalLastName',
-            'addressStreet',
-            'addressCity',
-            'addressState',
-            'addressZip',
-            'phoneNumber',
-            'dob',
-            'ssn',
-        ];
-
         this.errorTranslationKeys = {
             legalFirstName: 'bankAccount.error.firstName',
             legalLastName: 'bankAccount.error.lastName',
@@ -130,6 +118,16 @@ class AdditionalDetailsStep extends React.Component {
         });
     }
 
+    getFirstName() {
+        const {firstName} = PersonalDetails.extractFirstAndLastNameFromAvailableDetails(this.props.currentUserPersonalDetails);
+        return this.props.walletAdditionalDetailsDraft.legalFirstName || firstName;
+    }
+
+    getLastName() {
+        const {lastName} = PersonalDetails.extractFirstAndLastNameFromAvailableDetails(this.props.currentUserPersonalDetails);
+        return this.props.walletAdditionalDetailsDraft.legalLastName || lastName;
+    }
+
     /**
      * @returns {Object}
      */
@@ -165,6 +163,14 @@ class AdditionalDetailsStep extends React.Component {
 
         const errors = {};
 
+        if (!this.getFirstName()) {
+            errors.legalFirstName = true;
+        }
+
+        if (!this.getLastName()) {
+            errors.legalLastName = true;
+        }
+
         if (!ValidationUtils.isValidPastDate(this.props.walletAdditionalDetailsDraft.dob)) {
             errors.dob = true;
         }
@@ -177,6 +183,14 @@ class AdditionalDetailsStep extends React.Component {
             errors.addressStreet = true;
         }
 
+        if (_.isEmpty(this.props.walletAdditionalDetailsDraft.addressCity)) {
+            errors.addressCity = true;
+        }
+
+        if (_.isEmpty(this.props.walletAdditionalDetailsDraft.addressState)) {
+            errors.addressState = true;
+        }
+
         if (!ValidationUtils.isValidZipCode(this.props.walletAdditionalDetailsDraft.addressZip)) {
             errors.addressZip = true;
         }
@@ -193,14 +207,6 @@ class AdditionalDetailsStep extends React.Component {
             errors.ssn = true;
         }
 
-        _.each(this.requiredFields, (requiredField) => {
-            if (ValidationUtils.isRequiredFulfilled(this.props.walletAdditionalDetailsDraft[requiredField])) {
-                return;
-            }
-
-            errors[requiredField] = true;
-        });
-
         Wallet.setAdditionalDetailsErrors(errors);
         return _.size(errors) === 0;
     }
@@ -212,6 +218,8 @@ class AdditionalDetailsStep extends React.Component {
         const personalDetails = {
             ...this.props.walletAdditionalDetailsDraft,
             phoneNumber: LoginUtils.getPhoneNumberWithoutUSCountryCodeAndSpecialChars(this.props.walletAdditionalDetailsDraft.phoneNumber),
+            legalFirstName: this.getFirstName(),
+            legalLastName: this.getLastName(),
         };
         Wallet.updatePersonalDetails(personalDetails);
     }
@@ -266,7 +274,6 @@ class AdditionalDetailsStep extends React.Component {
         const errorMessage = ErrorUtils.getLatestErrorMessage(this.props.walletAdditionalDetails) || '';
         const isErrorVisible = _.size(this.getErrors()) > 0 || Boolean(errorMessage);
         const shouldAskForFullSSN = this.props.walletAdditionalDetails.errorCode === CONST.WALLET.ERROR.SSN;
-        const {firstName, lastName} = PersonalDetails.extractFirstAndLastNameFromAvailableDetails(this.props.currentUserPersonalDetails);
 
         return (
             <>
@@ -291,17 +298,18 @@ class AdditionalDetailsStep extends React.Component {
                                     containerStyles={[styles.mt4]}
                                     label={this.props.translate(this.fieldNameTranslationKeys.legalFirstName)}
                                     onChangeText={val => this.clearErrorAndSetValue('legalFirstName', val)}
-                                    value={this.props.walletAdditionalDetailsDraft.legalFirstName || firstName}
+                                    value={this.getFirstName()}
                                     errorText={this.getErrorText('legalFirstName')}
                                 />
                                 <TextInput
                                     containerStyles={[styles.mt4]}
                                     label={this.props.translate(this.fieldNameTranslationKeys.legalLastName)}
                                     onChangeText={val => this.clearErrorAndSetValue('legalLastName', val)}
-                                    value={this.props.walletAdditionalDetailsDraft.legalLastName || lastName}
+                                    value={this.getLastName()}
                                     errorText={this.getErrorText('legalLastName')}
                                 />
                                 <AddressForm
+                                    translate={this.props.translate}
                                     streetTranslationKey={this.fieldNameTranslationKeys.addressStreet}
                                     values={{
                                         street: this.props.walletAdditionalDetailsDraft.addressStreet,
diff --git a/src/pages/NewChatPage.js b/src/pages/NewChatPage.js
index e4cb4d60f153..8096bc697522 100755
--- a/src/pages/NewChatPage.js
+++ b/src/pages/NewChatPage.js
@@ -8,6 +8,7 @@ import * as OptionsListUtils from '../libs/OptionsListUtils';
 import ONYXKEYS from '../ONYXKEYS';
 import styles from '../styles/styles';
 import * as Report from '../libs/actions/Report';
+import * as ReportUtils from '../libs/ReportUtils';
 import CONST from '../CONST';
 import withWindowDimensions, {windowDimensionsPropTypes} from '../components/withWindowDimensions';
 import HeaderWithCloseButton from '../components/HeaderWithCloseButton';
@@ -18,6 +19,7 @@ import withLocalize, {withLocalizePropTypes} from '../components/withLocalize';
 import compose from '../libs/compose';
 import personalDetailsPropType from './personalDetailsPropType';
 import reportPropTypes from './reportPropTypes';
+import ROUTES from '../ROUTES';
 
 const propTypes = {
     /** Whether screen is used to create group chat */
@@ -129,6 +131,23 @@ class NewChatPage extends Component {
         return sections;
     }
 
+    /**
+     * This will find an existing chat, or create a new one if none exists, for the given user or set of users. It will then navigate to this chat.
+     *
+     * @param {Array} userLogins list of user logins.
+     */
+    getOrCreateChatReport(userLogins) {
+        const formattedUserLogins = _.map(userLogins, login => OptionsListUtils.addSMSDomainIfPhoneNumber(login).toLowerCase());
+        let newChat = {};
+        const chat = ReportUtils.getChatByParticipants(formattedUserLogins);
+        if (!chat) {
+            newChat = ReportUtils.buildOptimisticChatReport(formattedUserLogins);
+        }
+        const reportID = chat ? chat.reportID : newChat.reportID;
+        Report.openReport(reportID, newChat.participants, newChat);
+        Navigation.navigate(ROUTES.getReportRoute(reportID));
+    }
+
     /**
      * Removes a selected option from list if already selected. If not already selected add this option to the list.
      * @param {Object} option
@@ -179,10 +198,7 @@ class NewChatPage extends Component {
      * @param {Object} option
      */
     createChat(option) {
-        Report.fetchOrCreateChatReport([
-            this.props.session.email,
-            option.login,
-        ]);
+        this.getOrCreateChatReport([option.login]);
     }
 
     /**
@@ -194,8 +210,7 @@ class NewChatPage extends Component {
         if (userLogins.length < 1) {
             return;
         }
-
-        Report.fetchOrCreateChatReport([this.props.session.email, ...userLogins]);
+        this.getOrCreateChatReport(userLogins);
     }
 
     render() {
diff --git a/src/pages/ReimbursementAccount/AddressForm.js b/src/pages/ReimbursementAccount/AddressForm.js
index 41c8fa40c5eb..9e734a70d403 100644
--- a/src/pages/ReimbursementAccount/AddressForm.js
+++ b/src/pages/ReimbursementAccount/AddressForm.js
@@ -4,7 +4,6 @@ import PropTypes from 'prop-types';
 import TextInput from '../../components/TextInput';
 import AddressSearch from '../../components/AddressSearch';
 import styles from '../../styles/styles';
-import withLocalize, {withLocalizePropTypes} from '../../components/withLocalize';
 import CONST from '../../CONST';
 import StatePicker from '../../components/StatePicker';
 
@@ -14,7 +13,7 @@ const propTypes = {
     streetTranslationKey: PropTypes.string.isRequired,
 
     /** Callback fired when a field changes. Passes args as {[fieldName]: val} */
-    onFieldChange: PropTypes.func.isRequired,
+    onFieldChange: PropTypes.func,
 
     /** Form values */
     values: PropTypes.shape({
@@ -34,32 +33,59 @@ const propTypes = {
     /** Any errors that can arise from form validation */
     errors: PropTypes.objectOf(PropTypes.bool),
 
-    ...withLocalizePropTypes,
+    /** The map for inputID of the inputs */
+    inputKeys: PropTypes.shape({
+        street: PropTypes.string,
+        city: PropTypes.string,
+        state: PropTypes.string,
+        zipCode: PropTypes.string,
+    }),
+
+    /** Saves a draft of the input value when used in a form */
+    shouldSaveDraft: PropTypes.bool,
+
+    /** Returns translated string for given locale and phrase */
+    translate: PropTypes.func.isRequired,
 };
 
 const defaultProps = {
     values: {
+        street: undefined,
+        city: undefined,
+        state: undefined,
+        zipCode: undefined,
+    },
+    errors: {},
+    inputKeys: {
         street: '',
         city: '',
         state: '',
         zipCode: '',
     },
-    errors: {},
+    shouldSaveDraft: false,
+    onFieldChange: () => {},
 };
 
 const AddressForm = props => (
     <>
-        <AddressSearch
-            label={props.translate(props.streetTranslationKey)}
-            containerStyles={[styles.mt4]}
-            value={props.values.street}
-            onInputChange={props.onFieldChange}
-            errorText={props.errors.street ? props.translate('bankAccount.error.addressStreet') : ''}
-            hint={props.translate('common.noPO')}
-        />
+        <View>
+            <AddressSearch
+                inputID={props.inputKeys.street}
+                shouldSaveDraft={props.shouldSaveDraft}
+                label={props.translate(props.streetTranslationKey)}
+                containerStyles={[styles.mt4]}
+                value={props.values.street}
+                onInputChange={props.onFieldChange}
+                errorText={props.errors.street ? props.translate('bankAccount.error.addressStreet') : ''}
+                hint={props.translate('common.noPO')}
+                renamedInputKeys={props.inputKeys}
+            />
+        </View>
         <View style={[styles.flexRow, styles.mt4]}>
             <View style={[styles.flex2, styles.mr2]}>
                 <TextInput
+                    inputID={props.inputKeys.city}
+                    shouldSaveDraft={props.shouldSaveDraft}
                     label={props.translate('common.city')}
                     value={props.values.city}
                     onChangeText={value => props.onFieldChange({city: value})}
@@ -68,6 +94,8 @@ const AddressForm = props => (
             </View>
             <View style={[styles.flex1]}>
                 <StatePicker
+                    inputID={props.inputKeys.state}
+                    shouldSaveDraft={props.shouldSaveDraft}
                     value={props.values.state}
                     onInputChange={value => props.onFieldChange({state: value})}
                     errorText={props.errors.state ? props.translate('bankAccount.error.addressState') : ''}
@@ -75,6 +103,8 @@ const AddressForm = props => (
             </View>
         </View>
         <TextInput
+            inputID={props.inputKeys.zipCode}
+            shouldSaveDraft={props.shouldSaveDraft}
             label={props.translate('common.zip')}
             containerStyles={[styles.mt4]}
             keyboardType={CONST.KEYBOARD_TYPE.NUMBER_PAD}
@@ -89,4 +119,4 @@ const AddressForm = props => (
 AddressForm.propTypes = propTypes;
 AddressForm.defaultProps = defaultProps;
 AddressForm.displayName = 'AddressForm';
-export default withLocalize(AddressForm);
+export default AddressForm;
diff --git a/src/pages/ReimbursementAccount/BankAccountStep.js b/src/pages/ReimbursementAccount/BankAccountStep.js
index 59c94c7688a6..048f38fe3fd0 100644
--- a/src/pages/ReimbursementAccount/BankAccountStep.js
+++ b/src/pages/ReimbursementAccount/BankAccountStep.js
@@ -26,6 +26,7 @@ import CONFIG from '../../CONFIG';
 import ROUTES from '../../ROUTES';
 import Button from '../../components/Button';
 import plaidDataPropTypes from './plaidDataPropTypes';
+import reimbursementAccountPropTypes from './reimbursementAccountPropTypes';
 
 const propTypes = {
     /** Contains plaid data */
@@ -37,6 +38,10 @@ const propTypes = {
     /** During the OAuth flow we need to use the plaidLink token that we initially connected with */
     plaidLinkOAuthToken: PropTypes.string,
 
+    /** The bank account currently in setup */
+    /* eslint-disable-next-line react/no-unused-prop-types */
+    reimbursementAccount: reimbursementAccountPropTypes,
+
     /** Object with various information about the user */
     user: PropTypes.shape({
         /** Is the user account validated? */
@@ -52,6 +57,7 @@ const defaultProps = {
     plaidData: {
         isPlaidDisabled: false,
     },
+    reimbursementAccount: {},
     user: {},
 };
 
diff --git a/src/pages/ReimbursementAccount/CompanyStep.js b/src/pages/ReimbursementAccount/CompanyStep.js
index ec3aef995f6b..281e3f3b9430 100644
--- a/src/pages/ReimbursementAccount/CompanyStep.js
+++ b/src/pages/ReimbursementAccount/CompanyStep.js
@@ -26,8 +26,18 @@ import AddressForm from './AddressForm';
 import ReimbursementAccountForm from './ReimbursementAccountForm';
 import * as ReimbursementAccount from '../../libs/actions/ReimbursementAccount';
 import * as ReimbursementAccountUtils from '../../libs/ReimbursementAccountUtils';
+import reimbursementAccountPropTypes from './reimbursementAccountPropTypes';
+import reimbursementAccountDraftPropTypes from './ReimbursementAccountDraftPropTypes';
 
 const propTypes = {
+    /** The bank account currently in setup */
+    /* eslint-disable-next-line react/no-unused-prop-types */
+    reimbursementAccount: reimbursementAccountPropTypes.isRequired,
+
+    /** The draft values of the bank account being setup */
+    /* eslint-disable-next-line react/no-unused-prop-types */
+    reimbursementAccountDraft: reimbursementAccountDraftPropTypes.isRequired,
+
     ...withLocalizePropTypes,
 };
 
@@ -198,6 +208,7 @@ class CompanyStep extends React.Component {
                         errorText={this.getErrorText('companyName')}
                     />
                     <AddressForm
+                        translate={this.props.translate}
                         streetTranslationKey="common.companyAddress"
                         values={{
                             street: this.state.addressStreet,
diff --git a/src/pages/ReimbursementAccount/IdentityForm.js b/src/pages/ReimbursementAccount/IdentityForm.js
index 9a71eb824ee0..7925133bbf1e 100644
--- a/src/pages/ReimbursementAccount/IdentityForm.js
+++ b/src/pages/ReimbursementAccount/IdentityForm.js
@@ -107,6 +107,7 @@ const IdentityForm = (props) => {
                 maxLength={CONST.BANK_ACCOUNT.MAX_LENGTH.SSN}
             />
             <AddressForm
+                translate={props.translate}
                 streetTranslationKey="common.personalAddress"
                 values={props.values}
                 errors={props.errors}
diff --git a/src/pages/ReimbursementAccount/ReimbursementAccountDraftPropTypes.js b/src/pages/ReimbursementAccount/ReimbursementAccountDraftPropTypes.js
index 2261c0b472d6..98cbd1fdc0da 100644
--- a/src/pages/ReimbursementAccount/ReimbursementAccountDraftPropTypes.js
+++ b/src/pages/ReimbursementAccount/ReimbursementAccountDraftPropTypes.js
@@ -33,7 +33,7 @@ export default PropTypes.shape({
     requestorAddressZipCode: PropTypes.string,
     dob: PropTypes.string,
     ssnLast4: PropTypes.string,
-    isControllingOfficer: PropTypes.string,
+    isControllingOfficer: PropTypes.bool,
     isOnfidoSetupComplete: PropTypes.bool,
 
     /** Props needed for ACHContractStep */
diff --git a/src/pages/ReimbursementAccount/RequestorOnfidoStep.js b/src/pages/ReimbursementAccount/RequestorOnfidoStep.js
new file mode 100644
index 000000000000..656b0da5138e
--- /dev/null
+++ b/src/pages/ReimbursementAccount/RequestorOnfidoStep.js
@@ -0,0 +1,93 @@
+import React from 'react';
+import {ScrollView} from 'react-native';
+import {withOnyx} from 'react-native-onyx';
+import PropTypes from 'prop-types';
+import styles from '../../styles/styles';
+import withLocalize, {withLocalizePropTypes} from '../../components/withLocalize';
+import * as BankAccounts from '../../libs/actions/BankAccounts';
+import Onfido from '../../components/Onfido';
+import compose from '../../libs/compose';
+import ONYXKEYS from '../../ONYXKEYS';
+import * as ReimbursementAccountUtils from '../../libs/ReimbursementAccountUtils';
+import Growl from '../../libs/Growl';
+import reimbursementAccountPropTypes from './reimbursementAccountPropTypes';
+import reimbursementAccountDraftPropTypes from './ReimbursementAccountDraftPropTypes';
+import CONST from '../../CONST';
+import FullPageOfflineBlockingView from '../../components/BlockingViews/FullPageOfflineBlockingView';
+
+const propTypes = {
+    /** Bank account currently in setup */
+    /* eslint-disable-next-line react/no-unused-prop-types */
+    reimbursementAccount: reimbursementAccountPropTypes.isRequired,
+
+    /** The draft values of the bank account being setup */
+    /* eslint-disable-next-line react/no-unused-prop-types */
+    reimbursementAccountDraft: reimbursementAccountDraftPropTypes.isRequired,
+
+    /** The token required to initialize the Onfido SDK */
+    onfidoToken: PropTypes.string.isRequired,
+
+    /** A callback to call once the user completes the Onfido flow */
+    onComplete: PropTypes.func.isRequired,
+
+    ...withLocalizePropTypes,
+};
+
+const defaultProps = {};
+
+class RequestorOnfidoStep extends React.Component {
+    constructor(props) {
+        super(props);
+        this.submit = this.submit.bind(this);
+    }
+
+    submit(onfidoData) {
+        BankAccounts.verifyIdentityForBankAccount(
+            ReimbursementAccountUtils.getDefaultStateForField(this.props, 'bankAccountID', 0),
+            onfidoData,
+        );
+        this.props.onComplete();
+    }
+
+    render() {
+        return (
+            <FullPageOfflineBlockingView>
+                <ScrollView contentContainerStyle={styles.flex1}>
+                    <Onfido
+                        sdkToken={this.props.onfidoToken}
+                        onUserExit={() => {
+                            // We're taking the user back to the company step. They will need to come back to the requestor step to make the Onfido flow appear again.
+                            BankAccounts.goToWithdrawalAccountSetupStep(CONST.BANK_ACCOUNT.STEP.COMPANY);
+                        }}
+                        onError={() => {
+                            // In case of any unexpected error we log it to the server, show a growl, and return the user back to the company step so they can try again.
+                            Growl.error(this.props.translate('onfidoStep.genericError'), 10000);
+                            BankAccounts.goToWithdrawalAccountSetupStep(CONST.BANK_ACCOUNT.STEP.COMPANY);
+                        }}
+                        onSuccess={(onfidoData) => {
+                            this.submit(onfidoData);
+                        }}
+                    />
+                </ScrollView>
+            </FullPageOfflineBlockingView>
+        );
+    }
+}
+
+RequestorOnfidoStep.propTypes = propTypes;
+RequestorOnfidoStep.defaultProps = defaultProps;
+
+export default compose(
+    withLocalize,
+    withOnyx({
+        reimbursementAccount: {
+            key: ONYXKEYS.REIMBURSEMENT_ACCOUNT,
+        },
+        onfidoToken: {
+            key: ONYXKEYS.ONFIDO_TOKEN,
+        },
+        reimbursementAccountDraft: {
+            key: ONYXKEYS.REIMBURSEMENT_ACCOUNT_DRAFT,
+        },
+    }),
+)(RequestorOnfidoStep);
diff --git a/src/pages/ReimbursementAccount/RequestorStep.js b/src/pages/ReimbursementAccount/RequestorStep.js
index 6be190673464..70e00a46b96e 100644
--- a/src/pages/ReimbursementAccount/RequestorStep.js
+++ b/src/pages/ReimbursementAccount/RequestorStep.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import lodashGet from 'lodash/get';
-import {ScrollView, View} from 'react-native';
+import {View} from 'react-native';
 import {withOnyx} from 'react-native-onyx';
 import _ from 'underscore';
 import moment from 'moment';
@@ -16,19 +16,26 @@ import Text from '../../components/Text';
 import * as BankAccounts from '../../libs/actions/BankAccounts';
 import IdentityForm from './IdentityForm';
 import * as ValidationUtils from '../../libs/ValidationUtils';
-import Onfido from '../../components/Onfido';
 import compose from '../../libs/compose';
 import ONYXKEYS from '../../ONYXKEYS';
 import * as ReimbursementAccountUtils from '../../libs/ReimbursementAccountUtils';
-import Growl from '../../libs/Growl';
 import reimbursementAccountPropTypes from './reimbursementAccountPropTypes';
+import reimbursementAccountDraftPropTypes from './ReimbursementAccountDraftPropTypes';
 import ReimbursementAccountForm from './ReimbursementAccountForm';
 import * as Link from '../../libs/actions/Link';
+import RequestorOnfidoStep from './RequestorOnfidoStep';
 
 const propTypes = {
-    /** Bank account currently in setup */
+    /** The bank account currently in setup */
     reimbursementAccount: reimbursementAccountPropTypes.isRequired,
+
+    /** The draft values of the bank account being setup */
+    /* eslint-disable-next-line react/no-unused-prop-types */
+    reimbursementAccountDraft: reimbursementAccountDraftPropTypes.isRequired,
+
+    /** The token required to initialize the Onfido SDK */
     onfidoToken: PropTypes.string,
+
     ...withLocalizePropTypes,
 };
 
@@ -42,6 +49,7 @@ class RequestorStep extends React.Component {
 
         this.submit = this.submit.bind(this);
         this.clearErrorsAndSetValues = this.clearErrorsAndSetValues.bind(this);
+        this.setOnfidoAsComplete = this.setOnfidoAsComplete.bind(this);
 
         this.state = {
             firstName: ReimbursementAccountUtils.getDefaultStateForField(props, 'firstName'),
@@ -53,7 +61,6 @@ class RequestorStep extends React.Component {
             dob: ReimbursementAccountUtils.getDefaultStateForField(props, 'dob'),
             ssnLast4: ReimbursementAccountUtils.getDefaultStateForField(props, 'ssnLast4'),
             isControllingOfficer: ReimbursementAccountUtils.getDefaultStateForField(props, 'isControllingOfficer', false),
-            onfidoData: lodashGet(props, ['reimbursementAccount', 'achData', 'onfidoData'], ''),
             isOnfidoSetupComplete: lodashGet(props, ['achData', 'isOnfidoSetupComplete'], false),
         };
 
@@ -74,6 +81,13 @@ class RequestorStep extends React.Component {
         this.getErrors = () => ReimbursementAccountUtils.getErrors(this.props);
     }
 
+    /**
+     * Update state to indicate that the user has completed the Onfido verification process
+     */
+    setOnfidoAsComplete() {
+        this.setState({isOnfidoSetupComplete: true});
+    }
+
     /**
      * Clear the errors associated to keys in values if found and store the new values in the state.
      *
@@ -147,20 +161,6 @@ class RequestorStep extends React.Component {
         BankAccounts.updatePersonalInformationForBankAccount(payload);
     }
 
-    submitOnfidoVerification() {
-        if (!this.validate()) {
-            return;
-        }
-
-        const payload = {
-            bankAccountID: ReimbursementAccountUtils.getDefaultStateForField(this.props, 'bankAccountID', 0),
-            ...this.state,
-            dob: moment(this.state.dob).format(CONST.DATE.MOMENT_FORMAT_STRING),
-        };
-
-        BankAccounts.setupWithdrawalAccount(payload);
-    }
-
     render() {
         const achData = this.props.reimbursementAccount.achData;
         const shouldShowOnfido = achData.useOnfido && this.props.onfidoToken && !this.state.isOnfidoSetupComplete;
@@ -183,26 +183,9 @@ class RequestorStep extends React.Component {
                     onCloseButtonPress={Navigation.dismissModal}
                 />
                 {shouldShowOnfido ? (
-                    <ScrollView contentContainerStyle={styles.flex1}>
-                        <Onfido
-                            sdkToken={this.props.onfidoToken}
-                            onUserExit={() => {
-                            // We're taking the user back to the company step. They will need to come back to the requestor step to make the Onfido flow appear again.
-                                BankAccounts.goToWithdrawalAccountSetupStep(CONST.BANK_ACCOUNT.STEP.COMPANY);
-                            }}
-                            onError={() => {
-                            // In case of any unexpected error we log it to the server, show a growl, and return the user back to the company step so they can try again.
-                                Growl.error(this.props.translate('onfidoStep.genericError'), 10000);
-                                BankAccounts.goToWithdrawalAccountSetupStep(CONST.BANK_ACCOUNT.STEP.COMPANY);
-                            }}
-                            onSuccess={(onfidoData) => {
-                                this.setState({
-                                    onfidoData,
-                                    isOnfidoSetupComplete: true,
-                                }, this.submitOnfidoVerification);
-                            }}
-                        />
-                    </ScrollView>
+                    <RequestorOnfidoStep
+                        onComplete={this.setOnfidoAsComplete}
+                    />
                 ) : (
                     <ReimbursementAccountForm
                         onSubmit={this.submit}
diff --git a/src/pages/ReportSettingsPage.js b/src/pages/ReportSettingsPage.js
index 52c1ec527e9b..16893895608e 100644
--- a/src/pages/ReportSettingsPage.js
+++ b/src/pages/ReportSettingsPage.js
@@ -196,7 +196,7 @@ class ReportSettingsPage extends Component {
                                             success={!shouldDisableRename}
                                             text={this.props.translate('common.save')}
                                             onPress={this.validateAndUpdatePolicyRoomName}
-                                            style={[styles.ml2, styles.flex1]}
+                                            style={[styles.ml2, styles.mnw25]}
                                             textStyles={[styles.label]}
                                             innerStyles={[styles.ph5]}
                                             isDisabled={shouldDisableRename}
diff --git a/src/pages/RequestCallPage.js b/src/pages/RequestCallPage.js
index 3767f23f3711..86a693c29a5b 100644
--- a/src/pages/RequestCallPage.js
+++ b/src/pages/RequestCallPage.js
@@ -213,11 +213,11 @@ class RequestCallPage extends Component {
     validate(values) {
         const errors = {};
 
-        if (_.isEmpty(values.firstName)) {
+        if (_.isEmpty(values.firstName.trim())) {
             errors.firstName = this.props.translate('requestCallPage.error.firstName');
         }
 
-        if (_.isEmpty(values.lastName)) {
+        if (_.isEmpty(values.lastName.trim())) {
             errors.lastName = this.props.translate('requestCallPage.error.lastName');
         }
 
@@ -270,30 +270,26 @@ class RequestCallPage extends Component {
                                 icon={Illustrations.ConciergeExclamation}
                                 containerStyles={[styles.p0]}
                             >
-                                <Text style={styles.mb4}>
+                                <Text>
                                     {this.props.translate('requestCallPage.description')}
                                 </Text>
                             </Section>
-                            <View style={[styles.flexRow, styles.mb4]}>
-                                <View style={styles.flex1}>
-                                    <TextInput
-                                        inputID="firstName"
-                                        defaultValue={firstName}
-                                        label={this.props.translate('common.firstName')}
-                                        name="fname"
-                                        placeholder={this.props.translate('profilePage.john')}
-                                    />
-                                </View>
-                                <View style={[styles.flex1, styles.ml2]}>
-                                    <TextInput
-                                        inputID="lastName"
-                                        defaultValue={lastName}
-                                        label={this.props.translate('common.lastName')}
-                                        name="lname"
-                                        placeholder={this.props.translate('profilePage.doe')}
-                                    />
-                                </View>
-                            </View>
+                            <TextInput
+                                inputID="firstName"
+                                defaultValue={firstName}
+                                label={this.props.translate('common.firstName')}
+                                name="fname"
+                                placeholder={this.props.translate('profilePage.john')}
+                                containerStyles={[styles.mt4]}
+                            />
+                            <TextInput
+                                inputID="lastName"
+                                defaultValue={lastName}
+                                label={this.props.translate('common.lastName')}
+                                name="lname"
+                                placeholder={this.props.translate('profilePage.doe')}
+                                containerStyles={[styles.mt4]}
+                            />
                             <TextInput
                                 inputID="phoneNumber"
                                 defaultValue={this.getPhoneNumber(this.props.loginList)}
@@ -302,6 +298,7 @@ class RequestCallPage extends Component {
                                 keyboardType={CONST.KEYBOARD_TYPE.PHONE_PAD}
                                 autoCorrect={false}
                                 placeholder="2109400803"
+                                containerStyles={[styles.mt4]}
                             />
                             <TextInput
                                 inputID="phoneNumberExtension"
diff --git a/src/pages/home/ReportScreen.js b/src/pages/home/ReportScreen.js
index 779cf0f29b6f..28b0bd29d3b0 100644
--- a/src/pages/home/ReportScreen.js
+++ b/src/pages/home/ReportScreen.js
@@ -211,9 +211,11 @@ class ReportScreen extends React.Component {
             return null;
         }
 
+        // We are either adding a workspace room, or we're creating a chat, it isn't possible for both of these to be pending, or to have errors for the same report at the same time, so
+        // simply looking up the first truthy value for each case will get the relevant property if it's set.
         const reportID = getReportID(this.props.route);
-        const addWorkspaceRoomPendingAction = lodashGet(this.props.report, 'pendingFields.addWorkspaceRoom');
-        const addWorkspaceRoomErrors = lodashGet(this.props.report, 'errorFields.addWorkspaceRoom');
+        const addWorkspaceRoomOrChatPendingAction = lodashGet(this.props.report, 'pendingFields.addWorkspaceRoom') || lodashGet(this.props.report, 'pendingFields.createChat');
+        const addWorkspaceRoomOrChatErrors = lodashGet(this.props.report, 'errorFields.addWorkspaceRoom') || lodashGet(this.props.report, 'errorFields.createChat');
         const screenWrapperStyle = [styles.appContent, {marginTop: this.state.viewportOffsetTop}];
         return (
             <Freeze
@@ -241,9 +243,9 @@ class ReportScreen extends React.Component {
                         }}
                     >
                         <OfflineWithFeedback
-                            pendingAction={addWorkspaceRoomPendingAction}
-                            errors={addWorkspaceRoomErrors}
-                            errorRowStyles={styles.dNone}
+                            pendingAction={addWorkspaceRoomOrChatPendingAction}
+                            errors={addWorkspaceRoomOrChatErrors}
+                            shouldShowErrorMessages={false}
                         >
                             <HeaderView
                                 reportID={reportID}
@@ -295,8 +297,8 @@ class ReportScreen extends React.Component {
                                             isDrawerOpen={this.props.isDrawerOpen}
                                         />
                                         <ReportFooter
-                                            addWorkspaceRoomErrors={addWorkspaceRoomErrors}
-                                            addWorkspaceRoomPendingAction={addWorkspaceRoomPendingAction}
+                                            errors={addWorkspaceRoomOrChatErrors}
+                                            pendingAction={addWorkspaceRoomOrChatPendingAction}
                                             isOffline={this.props.network.isOffline}
                                             reportActions={this.props.reportActions}
                                             report={this.props.report}
diff --git a/src/pages/home/report/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose.js
index 7a14fd124208..a54f85258aad 100644
--- a/src/pages/home/report/ReportActionCompose.js
+++ b/src/pages/home/report/ReportActionCompose.js
@@ -45,6 +45,7 @@ import toggleReportActionComposeView from '../../../libs/toggleReportActionCompo
 import OfflineIndicator from '../../../components/OfflineIndicator';
 import ExceededCommentLength from '../../../components/ExceededCommentLength';
 import withNavigationFocus from '../../../components/withNavigationFocus';
+import * as EmojiUtils from '../../../libs/EmojiUtils';
 import reportPropTypes from '../../reportPropTypes';
 
 const propTypes = {
@@ -375,10 +376,11 @@ class ReportActionCompose extends React.Component {
     /**
      * Update the value of the comment in Onyx
      *
-     * @param {String} newComment
+     * @param {String} comment
      * @param {Boolean} shouldDebounceSaveComment
      */
-    updateComment(newComment, shouldDebounceSaveComment) {
+    updateComment(comment, shouldDebounceSaveComment) {
+        const newComment = EmojiUtils.replaceEmojis(comment);
         this.setState({
             isCommentEmpty: !!newComment.match(/^(\s|`)*$/),
             value: newComment,
diff --git a/src/pages/home/report/ReportActionItemCreated.js b/src/pages/home/report/ReportActionItemCreated.js
index 96558d6facb8..e62bbb99ea73 100644
--- a/src/pages/home/report/ReportActionItemCreated.js
+++ b/src/pages/home/report/ReportActionItemCreated.js
@@ -40,10 +40,10 @@ const ReportActionItemCreated = (props) => {
     const icons = ReportUtils.getIcons(props.report, props.personalDetails, props.policies);
     return (
         <OfflineWithFeedback
-            pendingAction={lodashGet(props.report, 'pendingFields.addWorkspaceRoom')}
-            errors={lodashGet(props.report, 'errorFields.addWorkspaceRoom')}
+            pendingAction={lodashGet(props.report, 'pendingFields.addWorkspaceRoom') || lodashGet(props.report, 'pendingFields.createChat')}
+            errors={lodashGet(props.report, 'errorFields.addWorkspaceRoom') || lodashGet(props.report, 'errorFields.createChat')}
             errorRowStyles={styles.addWorkspaceRoomErrorRow}
-            onClose={() => Report.navigateToConciergeChatAndDeletePolicyReport(props.report.reportID)}
+            onClose={() => Report.navigateToConciergeChatAndDeleteReport(props.report.reportID)}
         >
             <View
                 accessibilityLabel="Chat welcome message"
diff --git a/src/pages/home/report/ReportActionItemMessageEdit.js b/src/pages/home/report/ReportActionItemMessageEdit.js
index 49a442e9b031..a08a7645da16 100644
--- a/src/pages/home/report/ReportActionItemMessageEdit.js
+++ b/src/pages/home/report/ReportActionItemMessageEdit.js
@@ -18,7 +18,10 @@ import compose from '../../../libs/compose';
 import EmojiPickerButton from '../../../components/EmojiPicker/EmojiPickerButton';
 import * as ReportActionContextMenu from './ContextMenu/ReportActionContextMenu';
 import VirtualKeyboard from '../../../libs/VirtualKeyboard';
+import * as EmojiUtils from '../../../libs/EmojiUtils';
 import reportPropTypes from '../../reportPropTypes';
+import ExceededCommentLength from '../../../components/ExceededCommentLength';
+import CONST from '../../../CONST';
 
 const propTypes = {
     /** All the data of the action */
@@ -68,6 +71,7 @@ class ReportActionItemMessageEdit extends React.Component {
         this.addEmojiToTextBox = this.addEmojiToTextBox.bind(this);
         this.saveButtonID = 'saveButton';
         this.cancelButtonID = 'cancelButton';
+        this.emojiButtonID = 'emojiButton';
 
         const parser = new ExpensiMark();
         const draftMessage = parser.htmlToMarkdown(this.props.draftMessage);
@@ -93,9 +97,10 @@ class ReportActionItemMessageEdit extends React.Component {
     /**
      * Update the value of the draft in Onyx
      *
-     * @param {String} newDraft
+     * @param {String} draft
      */
-    updateDraft(newDraft) {
+    updateDraft(draft) {
+        const newDraft = EmojiUtils.replaceEmojis(draft);
         this.setState({draft: newDraft});
 
         // This component is rendered only when draft is set to a non-empty string. In order to prevent component
@@ -131,6 +136,11 @@ class ReportActionItemMessageEdit extends React.Component {
      * the new content.
      */
     publishDraft() {
+        // Do nothing if draft exceed the character limit
+        if (this.state.draft.length > CONST.MAX_COMMENT_LENGTH) {
+            return;
+        }
+
         // To prevent re-mount after user saves edit before debounce duration (example: within 1 second), we cancel
         // debounce here.
         this.debouncedSaveDraft.cancel();
@@ -186,9 +196,10 @@ class ReportActionItemMessageEdit extends React.Component {
     }
 
     render() {
+        const hasExceededMaxCommentLength = this.state.draft.length > CONST.MAX_COMMENT_LENGTH;
         return (
             <View style={styles.chatItemMessage}>
-                <View style={[styles.chatItemComposeBox, styles.flexRow, styles.chatItemComposeBoxColor]}>
+                <View style={[styles.chatItemComposeBox, styles.flexRow, styles.chatItemComposeBoxColor, hasExceededMaxCommentLength && styles.borderColorDanger]}>
                     <Composer
                         multiline
                         ref={(el) => {
@@ -206,7 +217,7 @@ class ReportActionItemMessageEdit extends React.Component {
                         }}
                         onBlur={(event) => {
                             // Return to prevent re-render when save/cancel button is pressed which cancels the onPress event by re-rendering
-                            if (_.contains([this.saveButtonID, this.cancelButtonID], lodashGet(event, 'nativeEvent.relatedTarget.id'))) {
+                            if (_.contains([this.saveButtonID, this.cancelButtonID, this.emojiButtonID], lodashGet(event, 'nativeEvent.relatedTarget.id'))) {
                                 return;
                             }
 
@@ -220,6 +231,7 @@ class ReportActionItemMessageEdit extends React.Component {
                             isDisabled={this.props.shouldDisableEmojiPicker}
                             onModalHide={() => InteractionManager.runAfterInteractions(() => this.textInput.focus())}
                             onEmojiSelected={this.addEmojiToTextBox}
+                            nativeID={this.emojiButtonID}
                         />
                     </View>
 
@@ -235,11 +247,13 @@ class ReportActionItemMessageEdit extends React.Component {
                     <Button
                         small
                         success
+                        isDisabled={hasExceededMaxCommentLength}
                         nativeID={this.saveButtonID}
                         style={[styles.mr2]}
                         onPress={this.publishDraft}
                         text={this.props.translate('common.saveChanges')}
                     />
+                    <ExceededCommentLength commentLength={this.state.draft.length} />
                 </View>
             </View>
         );
diff --git a/src/pages/home/report/ReportActionsView.js b/src/pages/home/report/ReportActionsView.js
index 06bbce049aac..e87000310a92 100755
--- a/src/pages/home/report/ReportActionsView.js
+++ b/src/pages/home/report/ReportActionsView.js
@@ -85,6 +85,7 @@ class ReportActionsView extends React.Component {
         this.loadMoreChats = this.loadMoreChats.bind(this);
         this.recordTimeToMeasureItemLayout = this.recordTimeToMeasureItemLayout.bind(this);
         this.scrollToBottomAndMarkReportAsRead = this.scrollToBottomAndMarkReportAsRead.bind(this);
+        this.openReportIfNecessary = this.openReportIfNecessary.bind(this);
     }
 
     componentDidMount() {
@@ -95,7 +96,7 @@ class ReportActionsView extends React.Component {
 
             // If the app user becomes active and they have no unread actions we clear the new marker to sync their device
             // e.g. they could have read these messages on another device and only just become active here
-            Report.openReport(this.props.report.reportID);
+            this.openReportIfNecessary();
             this.setState({newMarkerSequenceNumber: 0});
         });
 
@@ -108,7 +109,7 @@ class ReportActionsView extends React.Component {
         });
 
         if (this.getIsReportFullyVisible()) {
-            Report.openReport(this.props.report.reportID);
+            this.openReportIfNecessary();
         }
     }
 
@@ -167,7 +168,7 @@ class ReportActionsView extends React.Component {
         const wasNetworkChangeDetected = lodashGet(prevProps.network, 'isOffline') && !lodashGet(this.props.network, 'isOffline');
         if (wasNetworkChangeDetected) {
             if (isReportFullyVisible) {
-                Report.openReport(this.props.report.reportID);
+                this.openReportIfNecessary();
             } else {
                 Report.reconnect(this.props.report.reportID);
             }
@@ -215,7 +216,7 @@ class ReportActionsView extends React.Component {
                     ? 0
                     : this.props.report.lastReadSequenceNumber + 1,
             });
-            Report.openReport(this.props.report.reportID);
+            this.openReportIfNecessary();
         }
 
         // When the user navigates to the LHN the ReportActionsView doesn't unmount and just remains hidden.
@@ -255,6 +256,15 @@ class ReportActionsView extends React.Component {
         return Visibility.isVisible() && !isSidebarCoveringReportView;
     }
 
+    // If the report is optimistic (AKA not yet created) we don't need to call openReport again
+    openReportIfNecessary() {
+        if (this.props.report.isOptimisticReport) {
+            return;
+        }
+
+        Report.openReport(this.props.report.reportID);
+    }
+
     /**
      * Retrieves the next set of report actions for the chat once we are nearing the end of what we are currently
      * displaying.
diff --git a/src/pages/home/report/ReportFooter.js b/src/pages/home/report/ReportFooter.js
index ac52539d3150..7c3a4191b390 100644
--- a/src/pages/home/report/ReportFooter.js
+++ b/src/pages/home/report/ReportFooter.js
@@ -32,12 +32,12 @@ const propTypes = {
     /** Callback fired when the comment is submitted */
     onSubmitComment: PropTypes.func.isRequired,
 
-    /** Any errors associated with an attempt to create a workspace room */
+    /** Any errors associated with an attempt to create a chat */
     // eslint-disable-next-line react/forbid-prop-types
-    addWorkspaceRoomErrors: PropTypes.object,
+    errors: PropTypes.object,
 
-    /** The pending action when we are adding a workspace room */
-    addWorkspaceRoomPendingAction: PropTypes.string,
+    /** The pending action when we are adding a chat */
+    pendingAction: PropTypes.string,
 
     /** Whether the composer input should be shown */
     shouldShowComposeInput: PropTypes.bool,
@@ -47,8 +47,8 @@ const propTypes = {
 
 const defaultProps = {
     shouldShowComposeInput: true,
-    addWorkspaceRoomErrors: {},
-    addWorkspaceRoomPendingAction: null,
+    errors: {},
+    pendingAction: null,
 };
 
 class ReportFooter extends React.Component {
@@ -65,7 +65,7 @@ class ReportFooter extends React.Component {
         if (isArchivedRoom) {
             reportClosedAction = lodashFindLast(this.props.reportActions, action => action.actionName === CONST.REPORT.ACTIONS.TYPE.CLOSED);
         }
-        const hideComposer = isArchivedRoom || !_.isEmpty(this.props.addWorkspaceRoomErrors);
+        const hideComposer = isArchivedRoom || !_.isEmpty(this.props.errors);
         return (
             <>
                 {(isArchivedRoom || hideComposer) && (
@@ -89,7 +89,9 @@ class ReportFooter extends React.Component {
                     <View style={[this.getChatFooterStyles(), this.props.isComposerFullSize && styles.chatFooterFullCompose]}>
                         <SwipeableView onSwipeDown={Keyboard.dismiss}>
                             <OfflineWithFeedback
-                                pendingAction={this.props.addWorkspaceRoomPendingAction}
+                                pendingAction={this.props.pendingAction}
+                                style={this.props.isComposerFullSize ? styles.chatItemFullComposeRow : {}}
+                                contentContainerStyle={this.props.isComposerFullSize ? styles.flex1 : {}}
                             >
                                 <ReportActionCompose
                                     onSubmit={this.props.onSubmitComment}
diff --git a/src/pages/home/report/ReportTypingIndicator.js b/src/pages/home/report/ReportTypingIndicator.js
index 552e126b9c5c..8c8e39c46c40 100755
--- a/src/pages/home/report/ReportTypingIndicator.js
+++ b/src/pages/home/report/ReportTypingIndicator.js
@@ -67,7 +67,7 @@ class ReportTypingIndicator extends React.Component {
                         leadingText={PersonalDetails.getDisplayName(this.state.usersTyping[0])}
                         trailingText={` ${this.props.translate('reportTypingIndicator.isTyping')}`}
                         textStyle={[styles.chatItemComposeSecondaryRowSubText]}
-                        wrapperStyle={[styles.chatItemComposeSecondaryRow]}
+                        wrapperStyle={[styles.chatItemComposeSecondaryRow, styles.flex1]}
                         leadingTextParentStyle={styles.chatItemComposeSecondaryRowOffset}
                     />
                 );
diff --git a/src/pages/settings/InitialSettingsPage.js b/src/pages/settings/InitialSettingsPage.js
index b70beb2a9e33..564fc2d0b717 100755
--- a/src/pages/settings/InitialSettingsPage.js
+++ b/src/pages/settings/InitialSettingsPage.js
@@ -200,6 +200,7 @@ class InitialSettingsPage extends React.Component {
                 dismissError: () => dismissWorkspaceError(policy.id, policy.pendingAction),
                 disabled: policy.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
             }))
+            .sortBy(policy => policy.title)
             .value();
         menuItems.push(...this.getDefaultMenuItems());
 
diff --git a/src/pages/workspace/WorkspaceMembersPage.js b/src/pages/workspace/WorkspaceMembersPage.js
index 5e00fdce8cea..477dc02f9642 100644
--- a/src/pages/workspace/WorkspaceMembersPage.js
+++ b/src/pages/workspace/WorkspaceMembersPage.js
@@ -31,6 +31,7 @@ import OfflineWithFeedback from '../../components/OfflineWithFeedback';
 import {withNetwork} from '../../components/OnyxProvider';
 import FullPageNotFoundView from '../../components/BlockingViews/FullPageNotFoundView';
 import networkPropTypes from '../../components/networkPropTypes';
+import * as Expensicons from '../../components/Icon/Expensicons';
 
 const propTypes = {
     /** The personal details of the person who is logged in */
@@ -290,7 +291,7 @@ class WorkspaceMembersPage extends React.Component {
             if (email !== this.props.session.email && email !== this.props.policy.owner) {
                 removableMembers.push(email);
             }
-            const details = this.props.personalDetails[email] || {displayName: email, login: email};
+            const details = this.props.personalDetails[email] || {displayName: email, login: email, avatar: Expensicons.FallbackAvatar};
             data.push({
                 ...policyMember,
                 ...details,
diff --git a/src/pages/workspace/WorkspacePageWithSections.js b/src/pages/workspace/WorkspacePageWithSections.js
index e9e3fce75e91..973a414b6ac3 100644
--- a/src/pages/workspace/WorkspacePageWithSections.js
+++ b/src/pages/workspace/WorkspacePageWithSections.js
@@ -56,6 +56,9 @@ const propTypes = {
         name: PropTypes.string,
     }).isRequired,
 
+    /** Option to use the default scroll view  */
+    shouldUseScrollView: PropTypes.bool,
+
     ...withLocalizePropTypes,
 };
 
@@ -65,6 +68,7 @@ const defaultProps = {
     reimbursementAccount: {},
     footer: null,
     guidesCallTaskID: '',
+    shouldUseScrollView: false,
 };
 
 class WorkspacePageWithSections extends React.Component {
@@ -103,16 +107,20 @@ class WorkspacePageWithSections extends React.Component {
                     onBackButtonPress={() => Navigation.navigate(ROUTES.getWorkspaceInitialRoute(policyID))}
                     onCloseButtonPress={() => Navigation.dismissModal()}
                 />
-                <ScrollView
-                    keyboardShouldPersistTaps="handled"
-                    style={[styles.settingsPageBackground, styles.flex1, styles.w100]}
-                >
-                    <View style={[styles.w100, styles.flex1]}>
-
-                        {this.props.children(hasVBA, policyID, isUsingECard)}
-
-                    </View>
-                </ScrollView>
+                {this.props.shouldUseScrollView
+                    ? (
+                        <ScrollView
+                            keyboardShouldPersistTaps="handled"
+                            style={[styles.settingsPageBackground, styles.flex1, styles.w100]}
+                        >
+                            <View style={[styles.w100, styles.flex1]}>
+
+                                {this.props.children(hasVBA, policyID, isUsingECard)}
+
+                            </View>
+                        </ScrollView>
+                    )
+                    : this.props.children(hasVBA, policyID, isUsingECard)}
                 {this.props.footer}
             </ScreenWrapper>
         );
diff --git a/src/pages/workspace/WorkspaceSettingsPage.js b/src/pages/workspace/WorkspaceSettingsPage.js
index 40c370abb92b..e778ecf89339 100644
--- a/src/pages/workspace/WorkspaceSettingsPage.js
+++ b/src/pages/workspace/WorkspaceSettingsPage.js
@@ -1,12 +1,11 @@
 import React from 'react';
-import {View} from 'react-native';
+import {Keyboard, View} from 'react-native';
 import {withOnyx} from 'react-native-onyx';
 import _ from 'underscore';
 import lodashGet from 'lodash/get';
 import ONYXKEYS from '../../ONYXKEYS';
 import withLocalize, {withLocalizePropTypes} from '../../components/withLocalize';
 import styles from '../../styles/styles';
-import Button from '../../components/Button';
 import Text from '../../components/Text';
 import compose from '../../libs/compose';
 import * as Policy from '../../libs/actions/Policy';
@@ -17,12 +16,12 @@ import defaultTheme from '../../styles/themes/default';
 import CONST from '../../CONST';
 import Picker from '../../components/Picker';
 import TextInput from '../../components/TextInput';
-import FixedFooter from '../../components/FixedFooter';
 import WorkspacePageWithSections from './WorkspacePageWithSections';
 import withPolicy, {policyPropTypes, policyDefaultProps} from './withPolicy';
 import {withNetwork} from '../../components/OnyxProvider';
 import OfflineWithFeedback from '../../components/OfflineWithFeedback';
 import FullPageNotFoundView from '../../components/BlockingViews/FullPageNotFoundView';
+import Form from '../../components/Form';
 
 const propTypes = {
     ...policyPropTypes,
@@ -37,11 +36,6 @@ class WorkspaceSettingsPage extends React.Component {
     constructor(props) {
         super(props);
 
-        this.state = {
-            name: props.policy.name,
-            currency: props.policy.outputCurrency,
-        };
-
         this.submit = this.submit.bind(this);
         this.getCurrencyItems = this.getCurrencyItems.bind(this);
         this.validate = this.validate.bind(this);
@@ -58,21 +52,22 @@ class WorkspaceSettingsPage extends React.Component {
         }));
     }
 
-    submit() {
-        if (this.props.policy.isPolicyUpdating || !this.validate()) {
+    submit(values) {
+        if (this.props.policy.isPolicyUpdating) {
             return;
         }
-        const name = this.state.name.trim();
-        const outputCurrency = this.state.currency;
+        const name = values.name.trim();
+        const outputCurrency = values.currency;
         Policy.updateGeneralSettings(this.props.policy.id, name, outputCurrency);
+        Keyboard.dismiss();
     }
 
-    validate() {
+    validate(values) {
         const errors = {};
-        if (!this.state.name.trim().length) {
-            errors.nameError = true;
+        if (!values.name || !values.name.trim().length) {
+            errors.name = this.props.translate('workspace.editor.nameIsRequiredError');
         }
-        return _.size(errors) === 0;
+        return errors;
     }
 
     render() {
@@ -82,25 +77,15 @@ class WorkspaceSettingsPage extends React.Component {
                     headerText={this.props.translate('workspace.common.settings')}
                     route={this.props.route}
                     guidesCallTaskID={CONST.GUIDES_CALL_TASK_IDS.WORKSPACE_SETTINGS}
-                    footer={(
-                        <FixedFooter style={[styles.w100]}>
-                            <OfflineWithFeedback
-                                errors={lodashGet(this.props.policy, 'errorFields.generalSettings')}
-                                onClose={() => Policy.clearWorkspaceGeneralSettingsErrors(this.props.policy.id)}
-                            >
-                                <Button
-                                    success
-                                    isLoading={this.props.policy.isPolicyUpdating}
-                                    text={this.props.translate('workspace.editor.save')}
-                                    onPress={this.submit}
-                                    pressOnEnter
-                                />
-                            </OfflineWithFeedback>
-                        </FixedFooter>
-                    )}
                 >
                     {hasVBA => (
-                        <View style={[styles.pageWrapper, styles.flex1, styles.alignItemsStretch]}>
+                        <Form
+                            formID={ONYXKEYS.FORMS.WORKSPACE_SETTINGS_FORM}
+                            submitButtonText={this.props.translate('workspace.editor.save')}
+                            style={[styles.mh5, styles.mt5, styles.flexGrow1]}
+                            validate={this.validate}
+                            onSubmit={this.submit}
+                        >
                             <OfflineWithFeedback
                                 pendingAction={lodashGet(this.props.policy, 'pendingFields.avatar', null)}
                                 errors={lodashGet(this.props.policy, 'errorFields.avatar', null)}
@@ -130,27 +115,25 @@ class WorkspaceSettingsPage extends React.Component {
                                 pendingAction={lodashGet(this.props.policy, 'pendingFields.generalSettings')}
                             >
                                 <TextInput
+                                    inputID="name"
                                     label={this.props.translate('workspace.editor.nameInputLabel')}
                                     containerStyles={[styles.mt4]}
-                                    onChangeText={name => this.setState({name})}
-                                    value={this.state.name}
-                                    hasError={!this.state.name.trim().length}
-                                    errorText={this.state.name.trim().length ? '' : this.props.translate('workspace.editor.nameIsRequiredError')}
+                                    defaultValue={this.props.policy.name}
                                 />
                                 <View style={[styles.mt4]}>
                                     <Picker
+                                        inputID="currency"
                                         label={this.props.translate('workspace.editor.currencyInputLabel')}
-                                        onInputChange={currency => this.setState({currency})}
                                         items={this.getCurrencyItems()}
-                                        value={this.state.currency}
                                         isDisabled={hasVBA}
+                                        defaultValue={this.props.policy.outputCurrency}
                                     />
                                 </View>
                                 <Text style={[styles.textLabel, styles.colorMuted, styles.mt2]}>
                                     {this.props.translate('workspace.editor.currencyInputHelpText')}
                                 </Text>
                             </OfflineWithFeedback>
-                        </View>
+                        </Form>
                     )}
                 </WorkspacePageWithSections>
             </FullPageNotFoundView>
diff --git a/src/pages/workspace/bills/WorkspaceBillsPage.js b/src/pages/workspace/bills/WorkspaceBillsPage.js
index cb0ae6c7482f..2622c57f26df 100644
--- a/src/pages/workspace/bills/WorkspaceBillsPage.js
+++ b/src/pages/workspace/bills/WorkspaceBillsPage.js
@@ -21,6 +21,7 @@ const propTypes = {
 
 const WorkspaceBillsPage = props => (
     <WorkspacePageWithSections
+        shouldUseScrollView
         headerText={props.translate('workspace.common.bills')}
         route={props.route}
         guidesCallTaskID={CONST.GUIDES_CALL_TASK_IDS.WORKSPACE_BILLS}
diff --git a/src/pages/workspace/card/WorkspaceCardPage.js b/src/pages/workspace/card/WorkspaceCardPage.js
index 5dba60e04a00..2cf5ef28f259 100644
--- a/src/pages/workspace/card/WorkspaceCardPage.js
+++ b/src/pages/workspace/card/WorkspaceCardPage.js
@@ -22,6 +22,7 @@ const propTypes = {
 
 const WorkspaceCardPage = props => (
     <WorkspacePageWithSections
+        shouldUseScrollView
         headerText={props.translate('workspace.common.card')}
         route={props.route}
         guidesCallTaskID={CONST.GUIDES_CALL_TASK_IDS.WORKSPACE_CARD}
diff --git a/src/pages/workspace/invoices/WorkspaceInvoicesPage.js b/src/pages/workspace/invoices/WorkspaceInvoicesPage.js
index 0c00d21f50b9..537054df72a2 100644
--- a/src/pages/workspace/invoices/WorkspaceInvoicesPage.js
+++ b/src/pages/workspace/invoices/WorkspaceInvoicesPage.js
@@ -21,6 +21,7 @@ const propTypes = {
 
 const WorkspaceInvoicesPage = props => (
     <WorkspacePageWithSections
+        shouldUseScrollView
         headerText={props.translate('workspace.common.invoices')}
         route={props.route}
         guidesCallTaskID={CONST.GUIDES_CALL_TASK_IDS.WORKSPACE_INVOICES}
diff --git a/src/pages/workspace/reimburse/WorkspaceReimbursePage.js b/src/pages/workspace/reimburse/WorkspaceReimbursePage.js
index d092235daf15..3a208fcfa9eb 100644
--- a/src/pages/workspace/reimburse/WorkspaceReimbursePage.js
+++ b/src/pages/workspace/reimburse/WorkspaceReimbursePage.js
@@ -23,6 +23,7 @@ const propTypes = {
 
 const WorkspaceReimbursePage = props => (
     <WorkspacePageWithSections
+        shouldUseScrollView
         headerText={props.translate('workspace.common.reimburse')}
         route={props.route}
         guidesCallTaskID={CONST.GUIDES_CALL_TASK_IDS.WORKSPACE_REIMBURSE}
diff --git a/src/pages/workspace/travel/WorkspaceTravelPage.js b/src/pages/workspace/travel/WorkspaceTravelPage.js
index 66cc2d5f8d74..3134b8e08e20 100644
--- a/src/pages/workspace/travel/WorkspaceTravelPage.js
+++ b/src/pages/workspace/travel/WorkspaceTravelPage.js
@@ -21,6 +21,7 @@ const propTypes = {
 
 const WorkspaceTravelPage = props => (
     <WorkspacePageWithSections
+        shouldUseScrollView
         headerText={props.translate('workspace.common.travel')}
         route={props.route}
         guidesCallTaskID={CONST.GUIDES_CALL_TASK_IDS.WORKSPACE_TRAVEL}
diff --git a/src/styles/StyleUtils.js b/src/styles/StyleUtils.js
index f14a50c0b0b9..a2876ed378c1 100644
--- a/src/styles/StyleUtils.js
+++ b/src/styles/StyleUtils.js
@@ -526,6 +526,19 @@ function fade(fadeAnimation) {
     };
 }
 
+/**
+ * Return width for keyboard shortcuts modal.
+ *
+ * @param {Boolean} isSmallScreenWidth
+ * @returns {Object}
+ */
+function getKeyboardShortcutsModalWidth(isSmallScreenWidth) {
+    if (isSmallScreenWidth) {
+        return {maxWidth: '100%'};
+    }
+    return {maxWidth: 600};
+}
+
 export {
     getAvatarSize,
     getAvatarStyle,
@@ -551,6 +564,7 @@ export {
     getLoginPagePromoStyle,
     getReportActionItemStyle,
     getMiniReportActionContextMenuWrapperStyle,
+    getKeyboardShortcutsModalWidth,
     getPaymentMethodMenuWidth,
     parseStyleAsArray,
     combineStyles,
diff --git a/src/styles/styles.js b/src/styles/styles.js
index ecb7e265930e..3fd1bd005214 100644
--- a/src/styles/styles.js
+++ b/src/styles/styles.js
@@ -77,12 +77,10 @@ const webViewStyles = {
 
         ul: {
             maxWidth: '100%',
-            flex: 1,
         },
 
         ol: {
             maxWidth: '100%',
-            flex: 1,
         },
 
         li: {
@@ -1374,7 +1372,6 @@ const styles = {
     },
 
     chatFooter: {
-        marginBottom: 5,
         paddingLeft: 20,
         paddingRight: 20,
         display: 'flex',
@@ -1409,9 +1406,10 @@ const styles = {
     }, 0),
 
     textInputFullCompose: {
-        alignSelf: 'flex-end',
+        alignSelf: 'stretch',
         flex: 1,
         maxHeight: '100%',
+        textAlignVertical: 'top',
     },
 
     editInputComposeSpacing: {
@@ -2576,7 +2574,6 @@ const styles = {
     },
 
     keyboardShortcutModalContainer: {
-        maxWidth: 600,
         maxHeight: '100%',
         flex: '0 0 auto',
     },
@@ -2677,6 +2674,11 @@ const styles = {
         userSelect: 'text',
     },
 
+    userSelectNone: {
+        userSelect: 'none',
+        WebkitUserSelect: 'none',
+    },
+
     screenCenteredContainer: {
         flex: 1,
         justifyContent: 'center',
diff --git a/src/styles/utilities/sizing.js b/src/styles/utilities/sizing.js
index 52d4520a1292..70826444f72d 100644
--- a/src/styles/utilities/sizing.js
+++ b/src/styles/utilities/sizing.js
@@ -20,6 +20,10 @@ export default {
         minWidth: 8,
     },
 
+    mnw25: {
+        minWidth: '25%',
+    },
+
     w50: {
         width: '50%',
     },
diff --git a/src/styles/utilities/spacing.js b/src/styles/utilities/spacing.js
index e90bba723a05..3190bd10083a 100644
--- a/src/styles/utilities/spacing.js
+++ b/src/styles/utilities/spacing.js
@@ -306,6 +306,10 @@ export default {
         paddingLeft: 4,
     },
 
+    pl2: {
+        paddingLeft: 8,
+    },
+
     pl5: {
         paddingLeft: 20,
     },
diff --git a/tests/unit/EmojiCodeTest.js b/tests/unit/EmojiCodeTest.js
new file mode 100644
index 000000000000..6513e68f046f
--- /dev/null
+++ b/tests/unit/EmojiCodeTest.js
@@ -0,0 +1,19 @@
+import * as EmojiUtils from '../../src/libs/EmojiUtils';
+
+describe('EmojiCode', () => {
+    it('Test replacing emoji codes with emojis inside a text', () => {
+        const text = 'Hi :smile:';
+        expect(EmojiUtils.replaceEmojis(text)).toBe('Hi 😄');
+    });
+
+    it('Test suggesting emojis when typing emojis prefix after colon', () => {
+        const text = 'Hi :happy';
+        expect(EmojiUtils.suggestEmojis(text)).toEqual([{code: '🙋', name: 'raising_hand'}]);
+    });
+
+    it('Test suggest a limited number of matching emojis', () => {
+        const text = 'Hi :face';
+        const limit = 7;
+        expect(EmojiUtils.suggestEmojis(text, limit).length).toBe(limit);
+    });
+});
diff --git a/tests/unit/LHNFilterTest.js b/tests/unit/LHNFilterTest.js
index 32c5468a2be9..769e3b8438b3 100644
--- a/tests/unit/LHNFilterTest.js
+++ b/tests/unit/LHNFilterTest.js
@@ -19,6 +19,7 @@ const ONYXKEYS = {
         REPORT_IOUS: 'reportIOUs_',
         POLICY: 'policy_',
     },
+    NETWORK: 'network',
 };
 
 describe('Sidebar', () => {
@@ -27,6 +28,9 @@ describe('Sidebar', () => {
         registerStorageEventListener: () => {},
     }));
 
+    // Initialize the network key for OfflineWithFeedback
+    beforeEach(() => Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false}));
+
     // Cleanup (ie. unmount) all rendered components and clear out Onyx after each test so that each test starts with a clean slate
     afterEach(() => {
         cleanup();
diff --git a/tests/unit/LHNOrderTest.js b/tests/unit/LHNOrderTest.js
index 4a7bcf4f6db6..f2a695c76ee7 100644
--- a/tests/unit/LHNOrderTest.js
+++ b/tests/unit/LHNOrderTest.js
@@ -18,6 +18,7 @@ const ONYXKEYS = {
         REPORT_ACTIONS: 'reportActions_',
         REPORT_IOUS: 'reportIOUs_',
     },
+    NETWORK: 'network',
 };
 
 describe('Sidebar', () => {
@@ -26,6 +27,9 @@ describe('Sidebar', () => {
         registerStorageEventListener: () => {},
     }));
 
+    // Initialize the network key for OfflineWithFeedback
+    beforeEach(() => Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false}));
+
     // Clear out Onyx after each test so that each test starts with a clean slate
     afterEach(() => {
         cleanup();
diff --git a/tests/unit/TrieTest.js b/tests/unit/TrieTest.js
new file mode 100644
index 000000000000..897d5a0e4f0e
--- /dev/null
+++ b/tests/unit/TrieTest.js
@@ -0,0 +1,77 @@
+import Trie from '../../src/libs/Trie';
+
+describe('Trie', () => {
+    it('Test if a node can be found in the Trie', () => {
+        const wordTrie = new Trie();
+        wordTrie.add('grinning', {code: '😀'});
+        wordTrie.add('grin', {code: '😁'});
+        wordTrie.add('joy', {code: '😂'});
+        wordTrie.add('rofl', {code: '🤣'});
+        expect(wordTrie.search('eyes')).toBeNull();
+        expect(wordTrie.search('joy').metaData).toEqual({code: '😂'});
+        expect(wordTrie.search('gRiN').metaData).toEqual({code: '😁'});
+    });
+
+    it('Test finding all leaf nodes starting with a substring', () => {
+        const wordTrie = new Trie();
+        wordTrie.add('John', {code: '👨🏿', suggestions: []});
+        wordTrie.add('Robert', {code: '👨🏾', suggestions: []});
+        wordTrie.add('Robertson', {code: '👨🏽', suggestions: []});
+        wordTrie.add('Rock', {code: '👨🏼', suggestions: []});
+        const expected = [
+            {name: 'rock', metaData: {code: '👨🏼', suggestions: []}},
+            {name: 'robertson', metaData: {code: '👨🏽', suggestions: []}},
+            {name: 'robert', metaData: {code: '👨🏾', suggestions: []}},
+        ];
+        expect(wordTrie.getAllMatchingWords('Ro')).toEqual(expected);
+        expect(wordTrie.getAllMatchingWords('ro')).toEqual(expected);
+    });
+
+    it('Test finding only the first 5 matching words', () => {
+        const wordTrie = new Trie();
+        wordTrie.add('John', {code: '👨🏼', suggestions: []});
+        wordTrie.add('Robert', {code: '👨🏾', suggestions: []});
+        wordTrie.add('Robertson', {code: '👨🏼', suggestions: []});
+        wordTrie.add('Rock', {code: '👨🏽', suggestions: []});
+        wordTrie.add('Rob', {code: '👨🏻', suggestions: []});
+        wordTrie.add('Rocco', {code: '👨🏿', suggestions: []});
+        wordTrie.add('Roger', {code: '👨🏼', suggestions: []});
+        wordTrie.add('Roni', {code: '👨🏻', suggestions: []});
+        expect(wordTrie.getAllMatchingWords('Ro').length).toBe(5);
+    });
+
+    it('Test finding a specific number of matching words', () => {
+        const wordTrie = new Trie();
+        const limit = 7;
+        wordTrie.add('John', {code: '👨🏼', suggestions: []});
+        wordTrie.add('Robert', {code: '👨🏾', suggestions: []});
+        wordTrie.add('Robertson', {code: '👨🏼', suggestions: []});
+        wordTrie.add('Rock', {code: '👨🏽', suggestions: []});
+        wordTrie.add('Rob', {code: '👨🏻', suggestions: []});
+        wordTrie.add('Rocco', {code: '👨🏿', suggestions: []});
+        wordTrie.add('Roger', {code: '👨🏼', suggestions: []});
+        wordTrie.add('Roni', {code: '👨🏻', suggestions: []});
+        expect(wordTrie.getAllMatchingWords('Ro', limit).length).toBe(limit);
+    });
+
+    it('Test throwing an error when try to add an empty word to the Trie.', () => {
+        const wordTrie = new Trie();
+        expect(() => {
+            wordTrie.add('');
+        }).toThrow('Cannot insert empty word into Trie');
+    });
+
+    it('Test updating a Trie node', () => {
+        const wordTrie = new Trie();
+        wordTrie.add('John', {code: '👨🏼'});
+        wordTrie.update('John', {code: '👨🏻'});
+        expect(wordTrie.search('John').metaData).toEqual({code: '👨🏻'});
+    });
+
+    it('Test throwing an error when try to update a word that does not exist in the Trie.', () => {
+        const wordTrie = new Trie();
+        expect(() => {
+            wordTrie.update('smile');
+        }).toThrow('Word does not exist in the Trie');
+    });
+});
diff --git a/tests/utils/LHNTestUtils.js b/tests/utils/LHNTestUtils.js
index 4ac5403e386b..8b703b4b5d72 100644
--- a/tests/utils/LHNTestUtils.js
+++ b/tests/utils/LHNTestUtils.js
@@ -1,5 +1,7 @@
 import React from 'react';
 import {render} from '@testing-library/react-native';
+import ComposeProviders from '../../src/components/ComposeProviders';
+import OnyxProvider from '../../src/components/OnyxProvider';
 import {LocaleContextProvider} from '../../src/components/withLocalize';
 import SidebarLinks from '../../src/pages/home/sidebar/SidebarLinks';
 import CONST from '../../src/CONST';
@@ -138,7 +140,12 @@ function getDefaultRenderedSidebarLinks(reportIDFromRoute = '') {
     // and there are a lot of render warnings. It needs to be done like this because normally in
     // our app (App.js) is when the react application is wrapped in the context providers
     return render((
-        <LocaleContextProvider>
+        <ComposeProviders
+            components={[
+                OnyxProvider,
+                LocaleContextProvider,
+            ]}
+        >
             <ErrorBoundary>
                 <SidebarLinks
                     onLinkClick={() => {}}
@@ -153,7 +160,7 @@ function getDefaultRenderedSidebarLinks(reportIDFromRoute = '') {
                     reportIDFromRoute={reportIDFromRoute}
                 />
             </ErrorBoundary>
-        </LocaleContextProvider>
+        </ComposeProviders>
     ));
 }
 
